diff --git a/src/Compiler/Compiler.php b/src/Compiler/Compiler.php index f5251162..cb291e55 100644 --- a/src/Compiler/Compiler.php +++ b/src/Compiler/Compiler.php @@ -63,7 +63,7 @@ public function compile(Node $node): Node protected function shouldCompile(ComponentSource $source): bool { if ($source->directives->blaze()) { - return true; + return $source->directives->blaze('compile') ?? true; } return $this->config->shouldCompile($source->path) diff --git a/src/Support/Utils.php b/src/Support/Utils.php index db7c20f3..266eab92 100644 --- a/src/Support/Utils.php +++ b/src/Support/Utils.php @@ -15,7 +15,17 @@ class Utils */ public static function parseBlazeDirective(string $expression): array { - return BlazeDirective::parseParameters($expression); + $params = BlazeDirective::parseParameters($expression); + + if (data_get($params, 'compile', true) === false && data_get($params, 'memo', false) === true) { + throw new \InvalidArgumentException('Cannot set `memo: true` with `compile: false` in @blaze directive.'); + } + + if (data_get($params, 'compile', true) === false && data_get($params, 'fold', false) === true) { + throw new \InvalidArgumentException('Cannot set `fold: true` with `compile: false` in @blaze directive.'); + } + + return $params; } /** diff --git a/tests/Compiler/CompilerTest.php b/tests/Compiler/CompilerTest.php index 8d340960..3119e1bd 100644 --- a/tests/Compiler/CompilerTest.php +++ b/tests/Compiler/CompilerTest.php @@ -2,6 +2,8 @@ use Livewire\Blaze\Parser\Parser; use Livewire\Blaze\Compiler\Compiler; +use Livewire\Blaze\Config; +use Livewire\Blaze\Parser\Nodes\ComponentNode; use Livewire\Blaze\Support\Utils; test('compiles self-closing components', function () { @@ -76,4 +78,15 @@ 'popData(); ?> ', '', ])); -}); \ No newline at end of file +}); + +test('does not compile components with blaze directive override set to false', function () { + $input = ''; + + app(Config::class)->add(fixture_path('views/components')); + + $node = app(Parser::class)->parse($input)[0]; + $compiled = app(Compiler::class)->compile($node); + + expect($compiled)->toBeInstanceOf(ComponentNode::class); +}); diff --git a/tests/Folder/FolderTest.php b/tests/Folder/FolderTest.php index 4bb96d57..d2f7079f 100644 --- a/tests/Folder/FolderTest.php +++ b/tests/Folder/FolderTest.php @@ -247,6 +247,18 @@ expect($folded)->toBeInstanceOf(ComponentNode::class); }); +test('does not fold components with blaze directive override set to false', function () { + $input = ''; + + app(Config::class)->add(fixture_path('views/components/foldable'), fold: true); + + $node = app(Parser::class)->parse($input)[0]; + $compiled = app(Folder::class)->fold($node); + + expect($compiled)->toBeInstanceOf(ComponentNode::class); +}); + + test('folds components with no blaze directive if enabled in config', function () { $input = ''; diff --git a/tests/Memoizer/MemoizerTest.php b/tests/Memoizer/MemoizerTest.php index 3fcdff5e..67a13964 100644 --- a/tests/Memoizer/MemoizerTest.php +++ b/tests/Memoizer/MemoizerTest.php @@ -64,4 +64,15 @@ $memoized = app(Memoizer::class)->memoize($node); expect($memoized)->toBeInstanceOf(TextNode::class); +}); + +test('does not memoize components with blaze directive override set to false', function () { + $input = ''; + + app(Config::class)->add(fixture_path('views/components/memoizable'), memo: true); + + $node = app(Parser::class)->parse($input)[0]; + $compiled = app(Memoizer::class)->memoize($node); + + expect($compiled)->toBeInstanceOf(ComponentNode::class); }); \ No newline at end of file diff --git a/tests/fixtures/views/components/compile-false.blade.php b/tests/fixtures/views/components/compile-false.blade.php new file mode 100644 index 00000000..7cded334 --- /dev/null +++ b/tests/fixtures/views/components/compile-false.blade.php @@ -0,0 +1,3 @@ +@blaze(compile: false) + +
\ No newline at end of file diff --git a/tests/fixtures/views/components/foldable/fold-false.blade.php b/tests/fixtures/views/components/foldable/fold-false.blade.php new file mode 100644 index 00000000..dcd2fbbb --- /dev/null +++ b/tests/fixtures/views/components/foldable/fold-false.blade.php @@ -0,0 +1,3 @@ +@blaze(fold: false) + +
\ No newline at end of file diff --git a/tests/fixtures/views/components/memoizable/memo-false.blade.php b/tests/fixtures/views/components/memoizable/memo-false.blade.php new file mode 100644 index 00000000..2660be18 --- /dev/null +++ b/tests/fixtures/views/components/memoizable/memo-false.blade.php @@ -0,0 +1,3 @@ +@blaze(memo: false) + +
\ No newline at end of file