From a7765c2c9f92ae470209b4d8ba43e800ab42772e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raimondas=20Rimkevi=C4=8Dius=20=28aka=20MekDrop=29?= Date: Fri, 6 Nov 2020 02:06:26 +0200 Subject: [PATCH] Adds possibility to define config not only in project extras but also in dependencies --- src/Config.php | 37 ++++++++++++++++++++++++++++++++++--- src/NodeComposerPlugin.php | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/src/Config.php b/src/Config.php index c6f00b5..84b677d 100644 --- a/src/Config.php +++ b/src/Config.php @@ -40,12 +40,43 @@ public static function fromArray(array $conf) $self->nodeDownloadUrl = isset($conf['node-download-url']) ? $conf['node-download-url'] : null; $self->yarnVersion = isset($conf['yarn-version']) ? $conf['yarn-version'] : null; - if ($self->nodeVersion === null) { - throw new NodeComposerConfigException('You must specify a node-version'); + return $self; + } + + /** + * Selects best config from configs list + * + * @param Config[] $configs + * @return Config + */ + public static function selectBest(array $configs) { + $maxNodeVersion = null; + $maxYarnVersion = null; + $nodeDownloadUrl = null; + foreach ($configs as $config) { + if ($maxNodeVersion === null) { + $maxNodeVersion = $config->nodeVersion; + } elseif (version_compare($config->nodeVersion, $maxNodeVersion, '>')) { + $maxNodeVersion = $config->nodeVersion; + } + if ($maxYarnVersion === null) { + $maxYarnVersion = $config->yarnVersion; + } elseif (version_compare($config->yarnVersion, $maxYarnVersion, '>')) { + $maxYarnVersion = $config->yarnVersion; + } + if ($nodeDownloadUrl === null) { + $nodeDownloadUrl = $config->nodeDownloadUrl; + } elseif ($nodeDownloadUrl !== $config->nodeDownloadUrl) { + throw new NodeComposerConfigException('Defined different nodejs download urls are unsupported right now'); + } } + $ret = new self(); + $ret->nodeDownloadUrl = $nodeDownloadUrl; + $ret->yarnVersion = $maxYarnVersion; + $ret->nodeVersion = $maxNodeVersion; - return $self; + return $ret; } /** diff --git a/src/NodeComposerPlugin.php b/src/NodeComposerPlugin.php index 9a14e9e..cd38d0b 100644 --- a/src/NodeComposerPlugin.php +++ b/src/NodeComposerPlugin.php @@ -6,6 +6,7 @@ use Composer\Composer; use Composer\EventDispatcher\EventSubscriberInterface; use Composer\IO\IOInterface; +use Composer\Package\CompletePackage; use Composer\Plugin\PluginInterface; use Composer\Script\Event; use Composer\Script\ScriptEvents; @@ -36,14 +37,15 @@ public function activate(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; + $this->config = $this->findBestConfig(); - $extraConfig = $this->composer->getPackage()->getExtra(); - - if (!isset($extraConfig['mariusbuescher']['node-composer'])) { + if ($this->config === null) { throw new NodeComposerConfigException('You must configure the node composer plugin'); } - $this->config = Config::fromArray($extraConfig['mariusbuescher']['node-composer']); + if ($this->config->getNodeVersion() === null) { + throw new NodeComposerConfigException('You must specify a node-version'); + } } public static function getSubscribedEvents() @@ -143,4 +145,32 @@ public function deactivate(Composer $composer, IOInterface $io) public function uninstall(Composer $composer, IOInterface $io) { } + + /** + * Find best node config to use from all package tree + * + * @return Config|null + */ + protected function findBestConfig() { + $extraConfig = $this->composer->getPackage()->getExtra(); + + if (isset($extraConfig['mariusbuescher']['node-composer'])) { + return Config::fromArray($extraConfig['mariusbuescher']['node-composer']); + } + + $configs = []; + /** + * @var CompletePackage $package + */ + foreach ($this->composer->getRepositoryManager()->getLocalRepository()->getPackages() as $package) { + $extraConfig = $package->getExtra(); + if (isset($extraConfig['mariusbuescher']['node-composer'])) { + $config[] = Config::fromArray($extraConfig['mariusbuescher']['node-composer']); + } + } + if (empty($configs)) { + return null; + } + return Config::selectBest($configs); + } }