<?php 
declare(strict_types=1); 
namespace Airship\Barge\Commands; 
 
/** 
 * Class Cabin 
 * 
 * Create a new Cabin (website) 
 * 
 * @package Airship\Barge\Commands 
 */ 
class Cabin extends Proto\Init 
{ 
    /** 
     * @var bool 
     */ 
    public $essential = true; 
 
    /** 
     * @var string 
     */ 
    public $name = 'Cabin'; 
 
    /** 
     * @var string 
     */ 
    public $description = 'Create a new Airship Cabin project.'; 
 
    /** 
     * @var int 
     */ 
    public $display = 3; 
 
    /** 
     * Create a skeleton for a new Airship cabin. 
     * 
     * @param string $supplier 
     * @param string $project_name 
     * @param string $basePath 
     * @param string $description 
     * @param array  $extra 
     * @return bool 
     */ 
    protected function createSkeleton( 
        string $supplier, 
        string $project_name, 
        string $basePath, 
        string $description, 
        array  $extra = [] 
    ): bool { 
        // Create the basic structure 
        if (!\is_dir($basePath)) { 
            \mkdir($basePath, 0775); 
        } 
        // For lazy autoloading... 
        $mainDir = $this->makeNamespace($supplier, $project_name); 
        $ns = \implode('\\', [ 
            'Airship', 
            'Cabin', 
            $mainDir 
        ]); 
         
        \mkdir($basePath.'/'.$mainDir, 0775); 
        \mkdir($basePath.'/'.$mainDir.'/dist/', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/', 0775); 
 
        \mkdir($basePath.'/'.$mainDir.'/src/Blueprint', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/config', 0777); 
        \mkdir($basePath.'/'.$mainDir.'/src/config/editor_templates', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/config/templates', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/Exceptions', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/Gadgets', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/Landing', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/Lens', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/Queries', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/public', 0775); 
        \mkdir($basePath.'/'.$mainDir.'/src/Updates', 0775); 
 
        // Basic cabin.json 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/cabin.json', 
            \json_encode( 
                [ 
                    'airship_major_version' => 
                        0, 
                    'name' => 
                        $project_name, 
                    'namespace' => 
                        $ns, 
                    'bundled-gadgets' => 
                        [], 
                    'bundled-motifs' => 
                        [], 
                    'route_fallback' => 
                        null, 
                    'description' => 
                        $description, 
                    'routes' => 
                        [], 
                    'supplier' => 
                        $supplier, 
                    'version' => 
                        '0.0.1' 
                ], 
                JSON_PRETTY_PRINT 
            ) 
        ); 
 
        // Basic composer.json 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/composer.json', 
            \json_encode( 
                [ 
                    'name' => $supplier.'/'.$project_name, 
                    'description' => $description, 
                    'require' => [ 
                        'php' => '^7.0.0' 
                    ] 
                ], 
                JSON_PRETTY_PRINT 
            ) 
        ); 
 
        // Configuration templates 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/config/editor_templates/cabin_config.twig', 
            '{# This affects the Cabin configuration screen on Bridge. #}' 
        ); 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/config/templates/config.twig', 
            '{# This is used to update config/'.$mainDir.'/cabin.json #}' 
        ); 
 
        // Some example scripts 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/Blueprint/init_gear.php', 
            '<?php'."\n". 
            'namespace '.$ns.'\\Blueprint;'."\n\n". 
            'use \\Airship\\Engine\\Gears;'."\n\n". 
            'if (!\\class_exists(\'BlueprintGear\')) {'."\n". 
            '    Gears::extract(\'Blueprint\', \'BlueprintGear\', __NAMESPACE__);'."\n". 
            '}'."\n\n" 
        ); 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/Blueprint/Example.php', 
            '<?php'."\n". 
            'namespace '.$ns.'\\Blueprint;'."\n\n". 
            'require_once __DIR__."/init_gear.php";'."\n\n". 
            'class Example extends BlueprintGear'."\n". 
            '{'."\n". 
            '    public function getData()'."\n". 
            '    {'."\n". 
            '        return $this->db->run("SELECT * FROM table");'."\n". 
            '    }'."\n". 
            '}'."\n\n" 
        ); 
        // Some example scripts 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/Landing/init_gear.php', 
            '<?php'."\n". 
            'namespace '.$ns.'\\Landing;'."\n\n". 
            'use \\Airship\\Engine\\Gears;'."\n\n". 
            'if (!\\class_exists(\'LandingGear\')) {'."\n". 
            '    Gears::extract(\'Landing\', \'LandingGear\', __NAMESPACE__);'."\n". 
            '}'."\n\n" 
        ); 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/Landing/Example.php', 
            '<?php'."\n". 
            'namespace '.$ns.'\\Landing;'."\n\n". 
            'require_once __DIR__."/init_gear.php";'."\n\n". 
            'class Example extends LandingGear'."\n". 
            '{'."\n". 
            '    public function index()'."\n". 
            '    {'."\n". 
            '        $this->lens("example", ["test" => "Hello world!"]);'."\n". 
            '    }'."\n". 
            '}'."\n\n" 
        ); 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/Lens/example.twig', 
            '{{ test }}' 
        ); 
 
        // Example code for an automatic update trigger. 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/Updates/release-0-0-1.php', 
            '<?php' . "\n" . 
            'declare(strict_types=1);' . "\n\n" . 
            '$db = \Airship\get_database();' . "\n" . 
            '$db->insert("my_table", ['. "\n" . 
            '    "column" => "value"' . "\n" . 
            ']);' . "\n\n" 
        ); 
 
        // Auto-update trigger 
        \file_put_contents( 
            $basePath.'/'.$mainDir.'/src/update_trigger.php', 
            '<?php' . "\n" . 
            '$metadata = \Airship\loadJSON(\dirname(__DIR__) . "/cabin.json");'."\n". 
            'if (\\Airship\\expand_version($previous_metadata[\'version\']) <= \\Airship\\expand_version(\'0.0.1\')) {'."\n". 
            '    require_once __DIR__."/Updates/release-0-0-1.php";'."\n". 
            '}'."\n\n" 
        ); 
        return true; 
    } 
 
    /** 
     * @return array 
     */ 
    protected function getExtraData(): array 
    { 
        return []; 
    } 
 
    /** 
     * Domain-specific variant of PHP's native ucfirst() 
     * 
     * @param string $string 
     * @return string 
     */ 
    protected function upperFirst(string $string = '') 
    { 
        return \trim(parent::upperFirst($string), '_'); 
    } 
 
    /** 
     * some-test-user/cabin--for-the-win => 
     * Some_Test_User__Cabin_For_The_Win 
     * 
     * @param string $supplier 
     * @param string $cabin 
     * @return string 
     */ 
    protected function makeNamespace(string $supplier, string $cabin): string 
    { 
        $supplier = \preg_replace('/[^A-Za-z0-9_]/', '_', $supplier); 
        $exp = \explode('_', $supplier); 
        $supplier = \implode('_', \array_map('ucfirst', $exp)); 
        $supplier = \preg_replace('/_{2,}/', '_', $supplier); 
 
        $cabin = \preg_replace('/[^A-Za-z0-9_]/', '_', $cabin); 
        $exp = \explode('_', $cabin); 
        $cabin = \implode('_', \array_map('ucfirst', $exp)); 
        $cabin = \preg_replace('/_{2,}/', '_', $cabin); 
 
        return \implode('__', 
            [ 
                \trim($supplier, '_'), 
                \trim($cabin, '_') 
            ] 
        ); 
    } 
} 
 
 |