|
| 1 | +<?php |
| 2 | + |
| 3 | +declare(strict_types=1); |
| 4 | + |
| 5 | +require_once __DIR__.'/vendor/autoload.php'; |
| 6 | + |
| 7 | +use Laravel\Boost\Install\GuidelineComposer; |
| 8 | +use Laravel\Boost\Install\GuidelineConfig; |
| 9 | +use Laravel\Boost\Install\Herd; |
| 10 | +use Laravel\Roster\Roster; |
| 11 | +use Orchestra\Testbench\Concerns\CreatesApplication; |
| 12 | + |
| 13 | +// Create a simple class that uses Orchestra Testbench to bootstrap Laravel |
| 14 | +$testbench = new class |
| 15 | +{ |
| 16 | + use CreatesApplication; |
| 17 | + |
| 18 | + protected function getPackageProviders($app) |
| 19 | + { |
| 20 | + // No need to register Laravel Boost since we're just using Blade |
| 21 | + return []; |
| 22 | + } |
| 23 | + |
| 24 | + protected function defineEnvironment($app) |
| 25 | + { |
| 26 | + // Set a .test URL to enable Herd guidelines if needed |
| 27 | + $app['config']->set('app.url', 'http://localhost.test'); |
| 28 | + } |
| 29 | + |
| 30 | + public function bootstrap() |
| 31 | + { |
| 32 | + $app = $this->createApplication(); |
| 33 | + |
| 34 | + return $app; |
| 35 | + } |
| 36 | +}; |
| 37 | + |
| 38 | +// Bootstrap the Laravel application |
| 39 | +$app = $testbench->bootstrap(); |
| 40 | + |
| 41 | +// Create a mock Roster that returns ALL packages from .ai/ directory |
| 42 | +$mockRoster = new class extends Roster |
| 43 | +{ |
| 44 | + public function packages(): \Laravel\Roster\PackageCollection |
| 45 | + { |
| 46 | + $packages = []; |
| 47 | + |
| 48 | + // Find all package directories in .ai/ |
| 49 | + $directories = glob(__DIR__.'/.ai/*', GLOB_ONLYDIR); |
| 50 | + |
| 51 | + foreach ($directories as $dir) { |
| 52 | + $packageName = basename($dir); |
| 53 | + |
| 54 | + // Skip special directories handled elsewhere in GuidelineComposer |
| 55 | + if (in_array($packageName, ['boost', 'herd'])) { |
| 56 | + continue; |
| 57 | + } |
| 58 | + |
| 59 | + // Map directory names to Roster enum values where they exist |
| 60 | + $enumMapping = [ |
| 61 | + 'php' => \Laravel\Roster\Enums\Packages::LARAVEL, // Use Laravel as placeholder for php |
| 62 | + 'laravel' => \Laravel\Roster\Enums\Packages::LARAVEL, |
| 63 | + 'fluxui-free' => \Laravel\Roster\Enums\Packages::FLUXUI_FREE, |
| 64 | + 'fluxui-pro' => \Laravel\Roster\Enums\Packages::FLUXUI_PRO, |
| 65 | + 'inertia-laravel' => \Laravel\Roster\Enums\Packages::INERTIA_LARAVEL, |
| 66 | + 'inertia-react' => \Laravel\Roster\Enums\Packages::INERTIA_REACT, |
| 67 | + 'inertia-vue' => \Laravel\Roster\Enums\Packages::INERTIA_VUE, |
| 68 | + 'livewire' => \Laravel\Roster\Enums\Packages::LIVEWIRE, |
| 69 | + 'pest' => \Laravel\Roster\Enums\Packages::PEST, |
| 70 | + 'phpunit' => \Laravel\Roster\Enums\Packages::PHPUNIT, |
| 71 | + 'pint' => \Laravel\Roster\Enums\Packages::PINT, |
| 72 | + 'volt' => \Laravel\Roster\Enums\Packages::VOLT, |
| 73 | + 'folio' => \Laravel\Roster\Enums\Packages::FOLIO, |
| 74 | + 'pennant' => \Laravel\Roster\Enums\Packages::PENNANT, |
| 75 | + 'tailwindcss' => \Laravel\Roster\Enums\Packages::TAILWINDCSS, |
| 76 | + ]; |
| 77 | + |
| 78 | + if (isset($enumMapping[$packageName])) { |
| 79 | + // Find ALL version directories and create a package for each |
| 80 | + $versionDirs = glob(__DIR__."/.ai/{$packageName}/*", GLOB_ONLYDIR); |
| 81 | + if (! empty($versionDirs)) { |
| 82 | + $versions = array_map('basename', $versionDirs); |
| 83 | + sort($versions, SORT_NUMERIC); |
| 84 | + |
| 85 | + // Create a package instance for each version found |
| 86 | + foreach ($versions as $versionNumber) { |
| 87 | + $packages[] = new \Laravel\Roster\Package( |
| 88 | + $enumMapping[$packageName], |
| 89 | + $packageName, |
| 90 | + $versionNumber.'.0.0', |
| 91 | + false |
| 92 | + ); |
| 93 | + } |
| 94 | + } else { |
| 95 | + // No version directories, just add the core package |
| 96 | + $packages[] = new \Laravel\Roster\Package( |
| 97 | + $enumMapping[$packageName], |
| 98 | + $packageName, |
| 99 | + '1.0.0', |
| 100 | + false |
| 101 | + ); |
| 102 | + } |
| 103 | + } |
| 104 | + } |
| 105 | + |
| 106 | + return new \Laravel\Roster\PackageCollection($packages); |
| 107 | + } |
| 108 | +}; |
| 109 | + |
| 110 | +$herd = new Herd(); |
| 111 | + |
| 112 | +// Create GuidelineComposer with all config options enabled to get ALL guidelines |
| 113 | +$config = new GuidelineConfig(); |
| 114 | +$config->laravelStyle = true; |
| 115 | +$config->hasAnApi = true; |
| 116 | +$config->caresAboutLocalization = true; |
| 117 | +$config->enforceTests = true; |
| 118 | + |
| 119 | +// Use the real GuidelineComposer with our mock Roster - this will use the exact same ordering logic |
| 120 | +$composer = new GuidelineComposer($mockRoster, $herd); |
| 121 | +$composer->config($config); |
| 122 | + |
| 123 | +// Get the guidelines that GuidelineComposer would normally find |
| 124 | +$guidelines = $composer->guidelines(); |
| 125 | + |
| 126 | +// Add missing PHP versions (since GuidelineComposer only adds current PHP version) |
| 127 | +$reflection = new ReflectionClass($composer); |
| 128 | +$guidelineDirMethod = $reflection->getMethod('guidelinesDir'); |
| 129 | +$guidelineDirMethod->setAccessible(true); |
| 130 | + |
| 131 | +$phpVersions = ['8.1', '8.2', '8.3', '8.4']; |
| 132 | +$currentPhp = PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION; |
| 133 | + |
| 134 | +foreach ($phpVersions as $phpVersion) { |
| 135 | + if ($phpVersion !== $currentPhp) { |
| 136 | + $content = $guidelineDirMethod->invoke($composer, "php/{$phpVersion}"); |
| 137 | + if (! empty($content)) { |
| 138 | + $guidelines->put("php/v{$phpVersion}", $content); |
| 139 | + } |
| 140 | + } |
| 141 | +} |
| 142 | + |
| 143 | +// Now compose ALL guidelines (original + missing PHP versions) |
| 144 | +echo GuidelineComposer::composeGuidelines($guidelines); |
0 commit comments