Passed
Pull Request — master (#23)
by Dmitrij
02:57
created

CreateScriptCommand::configure()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 0
1
<?php
2
3
namespace HotRodCli\Commands\Frontend;
4
5
use HotRodCli\Commands\BaseCommand;
6
use HotRodCli\Jobs\Filesystem\CopyFile;
7
use HotRodCli\Jobs\Js\AddJs;
8
use HotRodCli\Jobs\Module\IsModuleExists;
9
use HotRodCli\Processors\ProcessRequireJs;
10
use Symfony\Component\Console\Input\InputArgument;
11
use Symfony\Component\Console\Input\InputInterface;
12
use Symfony\Component\Console\Output\OutputInterface;
13
use Symfony\Component\Filesystem\Filesystem;
14
15
class CreateScriptCommand extends BaseCommand
16
{
17
    protected $jobs = [
18
        CopyFile::class => null,
19
        IsModuleExists::class => null,
20
        AddJs::class => null
21
    ];
22
23
    protected $processors = [
24
        ProcessRequireJs::class => null
25
    ];
26
27
    protected $configs = [
28
        'arguments' => [
29
            [
30
                'name' => 'namespace',
31
                'mode' => InputArgument::REQUIRED,
32
                'description' => 'What is the namespace on the module'
33
            ],
34
            [
35
                'name' => 'script-name',
36
                'mode' => InputArgument::REQUIRED,
37
                'description' => 'What is the filename of the script'
38
            ]
39
        ],
40
        'options' => [
41
            [
42
                'name' => 'admin',
43
                'shortcut' => null,
44
                'mode' => InputArgument::OPTIONAL,
45
                'description' => 'Do You want to generate the JS in admin scope?'
46
            ]
47
        ],
48
        'description' => 'Creates a new script',
49
        'name' => 'create:js-script',
50
        'help' => 'creates a new Java Script in a given namespace',
51
        'info' => ''
52
    ];
53
54
    protected function configure()
55
    {
56
        $this->config();
57
    }
58
59
    protected function execute(InputInterface $input, OutputInterface $output)
60
    {
61
        $this->setJobs();
62
        $this->setProcessors();
63
64
        try {
65
            $this->jobs[IsModuleExists::class]->handle($input->getArgument('namespace'), $output);
66
67
            $this->processRequirejs($input, $output);
68
            $this->processScriptFile($input, $output);
69
        } catch (\Throwable $e) {
70
            $output->writeln('<error>' . $e->getMessage() . '</error>');
71
        }
72
    }
73
74
    protected function processScriptFile(InputInterface $input, OutputInterface $output)
75
    {
76
        $namespace = explode('_', $input->getArgument('namespace'));
77
        $app = $this->appContainer;
78
        $scope = $input->getOption('admin') ? 'adminhtml' : 'frontend';
79
80
        $this->jobs[AddJs::class]->handle(
81
            $app->get('app_dir') . '/app/code/' . $namespace[0] . '/' . $namespace[1] . '/view/' . $scope . '/requirejs-config.js',
82
            $input->getArgument('script-name'),
83
            $input->getArgument('namespace') . '/js/' . $input->getArgument('script-name')
84
        );
85
86
        $this->jobs[CopyFile::class]->handle(
87
            $this->appContainer->get('resource_dir') . '/frontend/simple-js.js',
88
            $this->appContainer->get('app_dir') . '/app/code/' . $namespace[0] . '/'
89
                . $namespace[1] . '/view/' . $scope . '/web/js/' . $input->getArgument('script-name') . '.js'
90
        );
91
92
        $output->writeln('<info>' . '/app/code/' . $namespace[0] . '/'
93
            . $namespace[1] . '/view/' . $scope . '/web/js/' . $input->getArgument('script-name') . '.js successfully generated</info>');
94
    }
95
96
    protected function processRequirejs(InputInterface $input, OutputInterface $output)
97
    {
98
        $namespace = explode('_', $input->getArgument('namespace'));
99
        $app = $this->appContainer;
100
        $filesystem = $app->resolve(Filesystem::class);
101
        $scope = $input->getOption('admin') ? 'adminhtml' : 'frontend';
102
103
        if (!$filesystem->exists($app->get('app_dir') . '/app/code/' . $namespace[0] . '/' . $namespace[1] . '/view/' . $scope . '/requirejs-config.js')) {
104
            $this->processors[ProcessRequireJs::class]($input, $output);
105
        }
106
    }
107
}
108