Skip to content

Commit ebbe108

Browse files
committed
[FIX] extras for publish nested packages
1 parent cb6d115 commit ebbe108

1 file changed

Lines changed: 78 additions & 3 deletions

File tree

core/src/Console/Packages/ExtrasCommand.php

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -648,30 +648,105 @@ protected function runPostInstallSteps($packageName)
648648
return;
649649
}
650650
$providers = $this->getPackageProviders($packageName);
651-
foreach ($providers as $provider) {
651+
$dependencyProviders = $this->getDependencyProviders($packageName);
652+
$allProviders = array_values(array_unique(array_merge($providers, $dependencyProviders)));
653+
foreach ($allProviders as $provider) {
652654
$this->runArtisanCommand(['vendor:publish', '--provider=' . $provider]);
653655
}
654656
$this->runArtisanCommand(['migrate', '--force']);
655657
}
656658

657659
protected function getPackageProviders($packageName)
660+
{
661+
$composer = $this->getPackageComposer($packageName);
662+
if (!$composer) {
663+
return [];
664+
}
665+
return $this->extractProviders($composer);
666+
}
667+
668+
protected function getDependencyProviders($packageName)
669+
{
670+
$composer = $this->getPackageComposer($packageName);
671+
if (!$composer) {
672+
return [];
673+
}
674+
675+
$requires = $composer['require'] ?? [];
676+
if (!is_array($requires) || $requires === []) {
677+
return [];
678+
}
679+
680+
$providers = [];
681+
foreach (array_keys($requires) as $dependency) {
682+
if (!is_string($dependency)) {
683+
continue;
684+
}
685+
$dependency = trim($dependency);
686+
if (!$this->isComposerDependencyName($dependency)) {
687+
continue;
688+
}
689+
if ($dependency === $packageName) {
690+
continue;
691+
}
692+
693+
$depComposer = $this->getPackageComposer($dependency);
694+
if (!$depComposer) {
695+
continue;
696+
}
697+
if (!$this->isEvoPackageType($depComposer['type'] ?? null)) {
698+
continue;
699+
}
700+
701+
$providers = array_merge($providers, $this->extractProviders($depComposer));
702+
}
703+
704+
$providers = array_filter($providers, 'is_string');
705+
return array_values(array_unique($providers));
706+
}
707+
708+
protected function getPackageComposer($packageName)
658709
{
659710
$composerPath = $this->getPackageComposerPath($packageName);
660711
if ($composerPath === '' || !file_exists($composerPath)) {
661-
return [];
712+
return null;
662713
}
663714
$raw = file_get_contents($composerPath);
664715
$composer = json_decode($raw, true);
665716
if (!is_array($composer)) {
666-
return [];
717+
return null;
667718
}
719+
return $composer;
720+
}
721+
722+
protected function extractProviders(array $composer): array
723+
{
668724
$laravelProviders = $composer['extra']['laravel']['providers'] ?? [];
669725
$evolutionProviders = $composer['extra']['evolution']['providers'] ?? [];
670726
$providers = array_merge((array) $laravelProviders, (array) $evolutionProviders);
671727
$providers = array_filter($providers, 'is_string');
672728
return array_values(array_unique($providers));
673729
}
674730

731+
protected function isEvoPackageType($type): bool
732+
{
733+
if (!is_string($type) || $type === '') {
734+
return false;
735+
}
736+
return str_starts_with($type, 'evolutioncms-') || str_starts_with($type, 'evolution-cms-');
737+
}
738+
739+
protected function isComposerDependencyName(string $name): bool
740+
{
741+
if ($name === '' || $name === 'php' || $name === 'composer-plugin-api') {
742+
return false;
743+
}
744+
if (str_starts_with($name, 'ext-') || str_starts_with($name, 'lib-')) {
745+
return false;
746+
}
747+
return true;
748+
}
749+
675750
protected function getPackageComposerPath($packageName)
676751
{
677752
if (class_exists('\\Composer\\InstalledVersions')) {

0 commit comments

Comments
 (0)