Test Failed
Push — main ( aff981...c1a66a )
by Guillaume
02:46
created

VueManager::addGlobalDirective()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 2
b 0
f 0
nc 1
nop 3
dl 0
loc 2
ccs 0
cts 0
cp 0
crap 2
rs 10
1
<?php
2
namespace PHPMV;
3
4
use PHPMV\js\JavascriptUtils;
5
use PHPMV\utils\JsUtils;
6
7
class VueManager{
8
9
    private static ?VueManager $instance = null;
10
    protected array $imports;
11
    protected array $vues;
12
13
    protected function __construct() {
14
        $this->imports = [];
15
        $this->vues = [];
16
    }
17
18
    public static function getInstance():?VueManager {
19
        if (!isset(self::$instance)) {
20
            self::$instance = new VueManager();
21
        }
22
        return self::$instance;
23
    }
24
25
    public static function deleteInstance():void {
26
        VueManager::$instance = null;
27
    }
28
29
    public function addImport($import):void {
30
        $this->imports[] = $import;
31
    }
32
33
    protected function importComponentObject(VueJSComponent $component):void {
34
        $this->addImport(JsUtils::declareVariable('const', $component->getVarName(), $component->generateObject(), false));
35
    }
36
37
    public function importComponent(VueJSComponent $component):void {
38
        $this->importComponentObject($component);
39
    }
40
41
    public function importMixin(VueJSComponent $mixin):void {
42
        $this->importComponentObject($mixin);
43
    }
44
45
    public function importExtend(VueJSComponent $extend):void {
46
        $this->importComponentObject($extend);
47
    }
48
49
    protected function addGlobal(string $type, string $name, string $body):void {
50
        $this->addImport("Vue.".$type."('".$name."',".$body.");");
51
    }
52
53
    protected function addDirective(string $name, array $hookFunction, string $type, array $configuration = []){
54
        foreach($configuration as $key => $value){
55
            $configuration[$key] = $value;
56
        }
57
        foreach ($hookFunction as $key => $value){
58
            $hookFunction[$key] = JsUtils::generateFunction($value,['el', 'binding', 'vnode', 'oldVnode'],false);
59
        }
60
        $this->addGlobal($type, $name, JavascriptUtils::arrayToJsObject($configuration + $hookFunction));
61
    }
62
63
    public function addGlobalDirective(string $name, array $hookFunction, array $configuration = []):void {
64
        $this->addDirective($name, $hookFunction, 'directive', $configuration);
65
    }
66
67
    public function addGlobalElementDirective(string $name, array $hookFunction, array $configuration = []):void {
68
        $this->addDirective($name, $hookFunction, 'elementDirective', $configuration);
69
    }
70
71
    public function addGlobalFilter(string $name,string $body, array $params = []):void {
72
        $this->addGlobal('filter', $name, JsUtils::generateFunction($body,$params,false));
73
    }
74
75
    public function addGlobalExtend(VueJSComponent $extend):void {
76
        $this->addGlobal('extend', $extend->getName(), $extend->generateObject());
77
    }
78
79
    public function addGlobalMixin(VueJSComponent $mixin):void {
80
        $this->addGlobal('mixin',$mixin->getName(), $mixin->generateObject());
81
    }
82
83
    public function addGlobalObservable(string $varName, array $object):void {
84
        $this->addImport(JsUtils::declareVariable('const',$varName,"Vue.observable(". JavascriptUtils::arrayToJsObject($object) .")", false));
85
    }
86
87
    public function addGlobalComponent(VueJSComponent $component):void {
88
        $this->addImport($component->generateGlobalScript());
89
    }
90
91
    public function addVue(VueJS $vue):void {
92
        $this->vues[] = $vue;
93
    }
94
95
    public function __toString():string {
96
        $script = implode("\n",$this->imports);
97
        $script .= implode("\n",$this->vues);
98
        return JavascriptUtils::wrapScript($script);
99
    }
100
101
    public function getImports():array {
102
        return $this->imports;
103
    }
104
}