From d218fab1e09cd9f75b0421dfe2cf2ce4fad08f85 Mon Sep 17 00:00:00 2001 From: Shavonn Brown Date: Tue, 13 Jan 2026 20:51:31 -0500 Subject: [PATCH] feat: camel-case feature names in inertia middleware --- README.md | 2 +- src/Middleware/ShareTogglesWithInertia.php | 7 ++- tests/Feature/InertiaMiddlewareTest.php | 51 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 tests/Feature/InertiaMiddlewareTest.php diff --git a/README.md b/README.md index 7cb1f4e..c8e8ba2 100644 --- a/README.md +++ b/README.md @@ -206,7 +206,7 @@ All toggles will be available as the `flags` prop in your frontend: // Vue/React const { flags } = usePage().props -if (flags['new-checkout']) { +if (flags.newCheckout) { // Show new checkout } ``` diff --git a/src/Middleware/ShareTogglesWithInertia.php b/src/Middleware/ShareTogglesWithInertia.php index aef32a7..a320d6f 100644 --- a/src/Middleware/ShareTogglesWithInertia.php +++ b/src/Middleware/ShareTogglesWithInertia.php @@ -5,6 +5,7 @@ namespace OffloadProject\Toggle\Middleware; use Illuminate\Http\Request; +use Illuminate\Support\Str; use Inertia\Middleware; use OffloadProject\Toggle\Facades\Toggle; @@ -15,9 +16,13 @@ class ShareTogglesWithInertia extends Middleware */ public function share(Request $request): array { + $flags = collect(Toggle::all()) + ->mapWithKeys(fn (bool $value, string $key) => [Str::camel($key) => $value]) + ->all(); + return [ ...parent::share($request), - 'flags' => Toggle::all(), + 'flags' => $flags, ]; } } diff --git a/tests/Feature/InertiaMiddlewareTest.php b/tests/Feature/InertiaMiddlewareTest.php new file mode 100644 index 0000000..ad9fbe2 --- /dev/null +++ b/tests/Feature/InertiaMiddlewareTest.php @@ -0,0 +1,51 @@ +share($request); + + expect($shared)->toHaveKey('flags') + ->and($shared['flags'])->toBeArray(); +}); + +it('converts kebab-case toggle names to camelCase', function () { + config()->set('toggle.flags', [ + 'test-flag' => true, + 'another-feature-flag' => false, + 'simple' => true, + ]); + + $middleware = new ShareTogglesWithInertia; + $request = Request::create('/'); + + $shared = $middleware->share($request); + + expect($shared['flags']) + ->toHaveKey('testFlag') + ->toHaveKey('anotherFeatureFlag') + ->toHaveKey('simple') + ->not->toHaveKey('test-flag') + ->not->toHaveKey('another-feature-flag'); +}); + +it('preserves toggle values after key conversion', function () { + config()->set('toggle.flags', [ + 'enabled-flag' => true, + 'disabled-flag' => false, + ]); + + $middleware = new ShareTogglesWithInertia; + $request = Request::create('/'); + + $shared = $middleware->share($request); + + expect($shared['flags']['enabledFlag'])->toBeTrue() + ->and($shared['flags']['disabledFlag'])->toBeFalse(); +});