diff --git a/src/Exceptions/InvalidPureUsageException.php b/src/Exceptions/InvalidPureUsageException.php index fc591c59..05dd93d4 100644 --- a/src/Exceptions/InvalidPureUsageException.php +++ b/src/Exceptions/InvalidPureUsageException.php @@ -100,4 +100,13 @@ public static function forOld(string $componentPath): self ); } + public static function forOnce(string $componentPath): self + { + return new self( + $componentPath, + '@once', + 'Components with @once should not use @pure as @once maintains runtime state' + ); + } + } \ No newline at end of file diff --git a/src/Folder/Folder.php b/src/Folder/Folder.php index e83be8b7..091594a5 100644 --- a/src/Folder/Folder.php +++ b/src/Folder/Folder.php @@ -127,6 +127,7 @@ protected function validatePureComponent(string $source, string $componentPath): { $problematicPatterns = [ '@aware' => 'forAware', + '@once' => 'forOnce', '\\$errors' => 'forErrors', 'session\\(' => 'forSession', '@error\\(' => 'forError', diff --git a/tests/BlazeTest.php b/tests/BlazeTest.php index bc4c7a31..dcdb723d 100644 --- a/tests/BlazeTest.php +++ b/tests/BlazeTest.php @@ -51,7 +51,7 @@ }); it('throws exception for components with invalid pure usage', function () { - expect(fn() => \Illuminate\Support\Facades\Blade::render('Test')) + expect(fn() => \Illuminate\Support\Facades\Blade::render('Test')) ->toThrow(\Livewire\Blaze\Exceptions\InvalidPureUsageException::class); }); @@ -66,4 +66,4 @@ expect($rendered)->not->toContain(''); }); -}); \ No newline at end of file +}); diff --git a/tests/FoldTest.php b/tests/FoldTest.php index cd65cf88..3d541822 100644 --- a/tests/FoldTest.php +++ b/tests/FoldTest.php @@ -117,20 +117,31 @@ function compile(string $input): string { expect(compile($input))->toBe($output); }); - it('throws exception for invalid @pure usage', function () { - // Test the folder validation directly + it('throws exception for invalid pure usage with $pattern', function (string $pattern, string $expectedPattern) { $folder = app('blaze')->folder(); - $componentNode = new \Livewire\Blaze\Nodes\ComponentNode('invalid-pure', 'x', '', [], false); + $componentNode = new \Livewire\Blaze\Nodes\ComponentNode("invalid-pure.{$pattern}", 'x', '', [], false); + + expect(fn() => $folder->fold($componentNode)) + ->toThrow(\Livewire\Blaze\Exceptions\InvalidPureUsageException::class); try { $folder->fold($componentNode); - expect(false)->toBeTrue('Exception should have been thrown'); } catch (\Livewire\Blaze\Exceptions\InvalidPureUsageException $e) { expect($e->getMessage())->toContain('Invalid @pure usage'); - expect($e->getComponentPath())->toContain('invalid-pure.blade.php'); - expect($e->getProblematicPattern())->toBe('\\$errors'); + expect($e->getComponentPath())->toContain("invalid-pure/{$pattern}.blade.php"); + expect($e->getProblematicPattern())->toBe($expectedPattern); } - }); + })->with([ + ['aware', '@aware'], + ['errors', '\\$errors'], + ['session', 'session\\('], + ['error', '@error\\('], + ['csrf', '@csrf'], + ['auth', 'auth\\(\\)'], + ['request', 'request\\(\\)'], + ['old', 'old\\('], + ['once', '@once'], + ]); it('named slots', function () { $input = ' @@ -222,4 +233,5 @@ function compile(string $input): string { expect(compile($input))->toBe($output); }); + }); diff --git a/tests/fixtures/components/invalid-pure/auth.blade.php b/tests/fixtures/components/invalid-pure/auth.blade.php new file mode 100644 index 00000000..1bed37f3 --- /dev/null +++ b/tests/fixtures/components/invalid-pure/auth.blade.php @@ -0,0 +1,5 @@ +@pure + +
+ Welcome, {{ auth()->user()->name }} +
diff --git a/tests/fixtures/components/invalid-pure/aware.blade.php b/tests/fixtures/components/invalid-pure/aware.blade.php new file mode 100644 index 00000000..ea94b2ce --- /dev/null +++ b/tests/fixtures/components/invalid-pure/aware.blade.php @@ -0,0 +1,7 @@ +@pure + +@aware(['variant' => 'default']) + +
+ {{ $slot }} +
diff --git a/tests/fixtures/components/invalid-pure/csrf.blade.php b/tests/fixtures/components/invalid-pure/csrf.blade.php new file mode 100644 index 00000000..7c7c6a5a --- /dev/null +++ b/tests/fixtures/components/invalid-pure/csrf.blade.php @@ -0,0 +1,6 @@ +@pure + +
+ @csrf + {{ $slot }} +
diff --git a/tests/fixtures/components/invalid-pure/error.blade.php b/tests/fixtures/components/invalid-pure/error.blade.php new file mode 100644 index 00000000..2104184b --- /dev/null +++ b/tests/fixtures/components/invalid-pure/error.blade.php @@ -0,0 +1,9 @@ +@pure + +@props(['name']) + +
+ @error($name) + {{ $message }} + @enderror +
diff --git a/tests/fixtures/components/invalid-pure.blade.php b/tests/fixtures/components/invalid-pure/errors.blade.php similarity index 90% rename from tests/fixtures/components/invalid-pure.blade.php rename to tests/fixtures/components/invalid-pure/errors.blade.php index 6d42ae85..70252e29 100644 --- a/tests/fixtures/components/invalid-pure.blade.php +++ b/tests/fixtures/components/invalid-pure/errors.blade.php @@ -1,4 +1,5 @@ @pure +
{{ $slot }} -
\ No newline at end of file + diff --git a/tests/fixtures/components/invalid-pure/old.blade.php b/tests/fixtures/components/invalid-pure/old.blade.php new file mode 100644 index 00000000..33f9be65 --- /dev/null +++ b/tests/fixtures/components/invalid-pure/old.blade.php @@ -0,0 +1,3 @@ +@pure + + diff --git a/tests/fixtures/components/invalid-pure/once.blade.php b/tests/fixtures/components/invalid-pure/once.blade.php new file mode 100644 index 00000000..967d94fc --- /dev/null +++ b/tests/fixtures/components/invalid-pure/once.blade.php @@ -0,0 +1,10 @@ +@pure + +@props(['title']) + +
+

{{ $title }}

+ @once + + @endonce +
diff --git a/tests/fixtures/components/invalid-pure/request.blade.php b/tests/fixtures/components/invalid-pure/request.blade.php new file mode 100644 index 00000000..08c88572 --- /dev/null +++ b/tests/fixtures/components/invalid-pure/request.blade.php @@ -0,0 +1,5 @@ +@pure + +
+ Current URL: {{ request()->url() }} +
diff --git a/tests/fixtures/components/invalid-pure/session.blade.php b/tests/fixtures/components/invalid-pure/session.blade.php new file mode 100644 index 00000000..58d7d1f4 --- /dev/null +++ b/tests/fixtures/components/invalid-pure/session.blade.php @@ -0,0 +1,5 @@ +@pure + +
+ {{ session('message') }} +