Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Foundation/Console/DevListCommand.php
Строк: 276
<?php

namespace IlluminateFoundationConsole;

use 
IlluminateConsoleCommand;
use 
IlluminateFoundationDevCommand;
use 
IlluminateFoundationDevCommands;
use 
IlluminateSupportStringable;
use 
LaravelPromptsPrompt;
use 
SymfonyComponentConsoleAttributeAsCommand;
use 
SymfonyComponentConsoleInputInputOption;

#[AsCommand(name: 'dev:list')]
class DevListCommand extends Command
{
    
/**
     * The console command name.
     *
     * @var string
     */
    
protected $name = 'dev:list';

    
/**
     * The console command description.
     *
     * @var string
     */
    
protected $description = 'List the registered dev processes';

    
/**
     * Execute the console command.
     *
     * @return int
     *
     * @throws Exception
     */
    
public function handle()
    {
        
$devCommands = array_map(fn ($command) => array_merge($command, [
            
'source' => $this->formatSource($command['source']),
        ]), 
$this->filterCommands(DevCommands::commands()));

        if (
$this->option('json') || ! $this->input->isInteractive()) {
            
$this->output->writeln(json_encode($devCommands));

            return empty(
$devCommands) && $this->isFiltering() ? self::FAILURE : self::SUCCESS;
        }

        
$this->newLine();

        if (empty(
$devCommands)) {
            if (
$this->isFiltering()) {
                
$this->components->error("Your application doesn't have any dev processes matching the given criteria.");

                return 
self::FAILURE;
            }

            
$this->components->warn("Your application doesn't have any dev processes.");

            return 
self::SUCCESS;
        }

        
$names = array_column($devCommands, 'name');
        
$longestName = max(array_map(strlen(...), $names));

        
$columns = Prompt::terminal()->cols();

        foreach (
$devCommands as $devCommand) {
            
$label = str_pad($devCommand['name'], $longestName);
            
$command = $devCommand['command'];
            
$source = ' '.$devCommand['source'];
            
$textWidth = mb_strwidth($label) + mb_strwidth($command) + mb_strwidth($source);
            
$spaceBuffer = 6;

            
$dots = str_repeat('.', max(0, $columns - $textWidth - $spaceBuffer));

            
// Truncate source if it doesn't fit, but ensure command is always fully visible.
            
if ($textWidth + $spaceBuffer > $columns) {
                
$availableSourceWidth = max(
                    
0,
                    
$columns - mb_strwidth($label) - mb_strwidth($command) - mb_strwidth($dots) - $spaceBuffer
                
);

                
$source = (new Stringable($source))->limit($availableSourceWidth - 1, '…')->value();
            }

            
$this->line(
                
sprintf(
                    
'  <fg=%s>%s</> %s <fg=#6C7280>%s%s</>',
                    
$devCommand['color'],
                    
$label,
                    
$command,
                    
$dots,
                    
$source,
                ),
            );
        }

        
$countText = 'Showing ['.count($devCommands).'] dev '.(count($devCommands) === 1 ? 'command' : 'commands').' ';

        
$countSpaces = max(0, $columns - mb_strwidth($countText) - 1);
        
$spaces = str_repeat(' ', $countSpaces);

        
$this->newLine();
        
$this->line($spaces.'<fg=blue;options=bold>'.$countText.'</>');
        
$this->newLine();

        return 
self::SUCCESS;
    }

    
/**
     * Determine if the given command is registered by a vendor package.
     *
     * @param  array  $command
     * @return bool
     */
    
protected function isVendorCommand(array $command): bool
    
{
        return 
$command['priority'] === DevCommand::PRIORITY_VENDOR;
    }

    
/**
     * Determine if any filtering options are active.
     *
     * @return bool
     */
    
protected function isFiltering(): bool
    
{
        return 
$this->option('filter') || $this->option('except-vendor') || $this->option('only-vendor');
    }

    
/**
     * Filter the given commands based on the provided options.
     *
     * @param  array  $commands
     * @return array
     */
    
protected function filterCommands(array $commands): array
    {
        if (
$this->option('filter')) {
            
$commands = array_filter(
                
$commands,
                
fn ($command) => str_contains($command['name'], $this->option('filter')) || str_contains($command['command'], $this->option('filter')),
            );
        }

        if (
$this->option('except-vendor')) {
            
$commands = array_filter(
                
$commands,
                
fn ($command) => ! $this->isVendorCommand($command),
            );
        }

        if (
$this->option('only-vendor')) {
            
$commands = array_filter(
                
$commands,
                
$this->isVendorCommand(...),
            );
        }

        return 
array_values($commands);
    }

    
/**
     * Format the source information for display.
     *
     * @param  array{'file': string, 'line': int, 'class'?: string, 'function'?: string}  $source
     * @return string
     */
    
protected function formatSource($source): string
    
{
        
$file = $source['file'] ?? null;
        
$line = $source['line'] ?? null;
        
$class = $source['class'] ?? null;
        
$function = $source['function'] ?? null;

        if (
$class) {
            return 
"{$class}@{$function}";
        }

        return 
implode(':', array_filter([$file, $line]));
    }

    
/**
     * Get the console command options.
     *
     * @return array
     */
    
protected function getOptions()
    {
        return [
            [
'json', null, InputOption::VALUE_NONE, 'Output the dev process list as JSON'],
            [
'filter', null, InputOption::VALUE_REQUIRED, 'Filter the dev processes by name or command'],
            [
'except-vendor', null, InputOption::VALUE_NONE, 'Do not display dev processes registered by vendor packages'],
            [
'only-vendor', null, InputOption::VALUE_NONE, 'Only display dev processes registered by vendor packages'],
        ];
    }
}
Онлайн: 2
Реклама