<?php declare(strict_types=1); namespace Laminas\ComponentInstaller\PackageProvider; use Composer\Composer; use Composer\Installer\PackageEvent; use Composer\IO\NullIO; use Composer\Plugin\PluginInterface; use Composer\Repository\CompositeRepository; use Composer\Repository\InstalledArrayRepository; use Composer\Repository\InstalledRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; use Composer\Repository\RepositoryInterface as ComposerRepositoryInterface; use Composer\Repository\RootPackageRepository; use function version_compare; final class PackageProviderDetectionFactory { /** @var Composer */ private $composer; /** @var null|RootPackageRepository */ private $packageRepository; public function __construct(Composer $composer) { $this->composer = $composer; if (false === self::isComposerV1()) { $this->packageRepository = new RootPackageRepository($composer->getPackage()); } } public static function create(Composer $composer): self { return new self($composer); } public static function isComposerV1(): bool { return version_compare(PluginInterface::PLUGIN_API_VERSION, '2.0.0', '<') === true; } public function detect(PackageEvent $event, string $packageName): PackageProviderDetectionInterface { if (self::isComposerV1()) { return new ComposerV1($event->getPool()); } $installedRepo = new InstalledRepository($this->prepareRepositoriesForInstalledRepository()); $defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos(new NullIO())); if ( ($match = $defaultRepos->findPackage($packageName, '*')) && false === $installedRepo->hasPackage($match) ) { $installedRepo->addRepository(new InstalledArrayRepository([clone $match])); } return new ComposerV2($installedRepo); } /** @psalm-return ComposerRepositoryInterface[] */ private function prepareRepositoriesForInstalledRepository(): array { $platformOverrides = $this->composer->getConfig()->get('platform') ?? []; if (null === $this->packageRepository) { return [ $this->composer->getRepositoryManager()->getLocalRepository(), new PlatformRepository([], $platformOverrides), ]; } return [ $this->packageRepository, $this->composer->getRepositoryManager()->getLocalRepository(), new PlatformRepository([], $platformOverrides), ]; } }