2024-02-21 12:48:33 +00:00
< ? php
namespace App\Console\Command ;
2024-02-22 21:04:40 +00:00
use App\Action\DetermineProjectLanguage ;
2024-02-21 23:32:59 +00:00
use App\Enum\ProjectLanguage ;
2024-02-21 12:48:33 +00:00
use App\Process\Process ;
use Symfony\Component\Console\Command\Command ;
use Symfony\Component\Console\Input\InputInterface ;
use Symfony\Component\Console\Output\OutputInterface ;
2024-02-21 23:32:59 +00:00
use Symfony\Component\Filesystem\Filesystem ;
2024-02-21 12:48:33 +00:00
final class InstallCommand extends AbstractCommand
{
public function execute ( InputInterface $input , OutputInterface $output ) : int
{
2024-02-21 13:22:17 +00:00
$extraArgs = $input -> getOption ( 'extra-args' );
$workingDir = $input -> getOption ( 'working-dir' );
2024-02-21 12:48:33 +00:00
2024-02-22 21:04:40 +00:00
$language = $input -> getOption ( 'language' ) ? ? ( new DetermineProjectLanguage (
filesystem : $this -> filesystem ,
workingDir : $workingDir ,
)) -> getLanguage ();
2024-02-21 23:32:59 +00:00
2024-02-22 00:31:29 +00:00
$filesystem = new Filesystem ();
2024-02-21 12:48:33 +00:00
// TODO: Composer in Docker Compose?
$process = Process :: create (
2024-02-21 23:32:59 +00:00
command : $this -> getCommand (
2024-02-22 00:31:29 +00:00
filesystem : $filesystem ,
2024-02-22 21:04:40 +00:00
language : $language ,
2024-02-21 23:32:59 +00:00
workingDir : $workingDir ,
),
2024-02-23 16:15:41 +00:00
extraArgs : explode ( separator : ' ' , string : strval ( $extraArgs )),
2024-02-21 13:22:17 +00:00
workingDir : $workingDir ,
2024-02-21 12:48:33 +00:00
);
2024-02-21 13:20:41 +00:00
$process -> setTimeout ( null );
2024-02-21 12:48:33 +00:00
$process -> run ();
return Command :: SUCCESS ;
}
2024-02-21 23:32:59 +00:00
/**
2024-02-22 00:31:29 +00:00
* @ param Filesystem $filesystem
2024-02-21 23:32:59 +00:00
* @ param non - empty - string $language
* @ param non - empty - string $workingDir
* @ return non - empty - array < int , non - empty - string >
*/
2024-02-22 00:31:29 +00:00
private function getCommand ( Filesystem $filesystem , string $language , string $workingDir ) : array
2024-02-21 23:32:59 +00:00
{
if ( $language === ProjectLanguage :: JavaScript -> value ) {
if ( $filesystem -> exists ( $workingDir . '/yarn.lock' )) {
return [ 'yarn' ];
} elseif ( $filesystem -> exists ( $workingDir . '/pnpm-lock.yaml' )) {
return [ 'pnpm' , 'install' ];
} else {
return [ 'npm' , 'install' ];
}
}
return [ 'composer' , 'install' ];
}
2024-02-21 12:48:33 +00:00
}