Skip to content

Commit

Permalink
fixed situation where lazy functions were always being evaluated
Browse files Browse the repository at this point in the history
  • Loading branch information
joetannenbaum committed Nov 20, 2024
1 parent a836013 commit 7c604c7
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 12 deletions.
38 changes: 26 additions & 12 deletions src/Response.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,27 +133,41 @@ public function toResponse($request)
*/
public function resolveProperties(Request $request, array $props): array
{
$isPartial = $this->isPartial($request);
$props = $this->resolvePartialProperties($props, $request);
$props = $this->resolveArrayableProperties($props, $request);
$props = $this->resolveAlways($props);
$props = $this->resolvePropertyInstances($props, $request);

return $props;
}

if (! $isPartial) {
$props = array_filter($this->props, static function ($prop) {
/**
* Resolve the `only` and `except` partial request props.
*/
public function resolvePartialProperties(array $props, Request $request): array
{
if (! $this->isPartial($request)) {
return array_filter($this->props, static function ($prop) {
return ! ($prop instanceof IgnoreFirstLoad);
});
}

$props = $this->resolveArrayableProperties($props, $request);
$only = array_filter(explode(',', $request->header(Header::PARTIAL_ONLY, '')));
$except = array_filter(explode(',', $request->header(Header::PARTIAL_EXCEPT, '')));

if ($isPartial && $request->hasHeader(Header::PARTIAL_ONLY)) {
$props = $this->resolveOnly($request, $props);
}
if (count($only)) {
$newProps = [];

if ($isPartial && $request->hasHeader(Header::PARTIAL_EXCEPT)) {
$props = $this->resolveExcept($request, $props);
}
foreach ($only as $key) {
Arr::set($newProps, $key, Arr::get($props, $key));
}

$props = $this->resolveAlways($props);
$props = $newProps;
}

$props = $this->resolvePropertyInstances($props, $request);
if ($except) {
Arr::forget($props, $except);
}

return $props;
}
Expand Down
48 changes: 48 additions & 0 deletions tests/ResponseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,54 @@ public function test_resource_response(): void
$this->assertSame('123', $page->version);
}

public function test_lazy_callable_resource_response(): void
{
$request = Request::create('/users', 'GET');
$request->headers->add(['X-Inertia' => 'true']);

$response = new Response('User/Index', [
'users' => fn () => [['name' => 'Jonathan']],
'organizations' => fn () => [['name' => 'Inertia']],
], 'app', '123');
$response = $response->toResponse($request);
$page = $response->getData();

$this->assertInstanceOf(JsonResponse::class, $response);
$this->assertSame('User/Index', $page->component);
$this->assertSame('/users', $page->url);
$this->assertSame('123', $page->version);
tap($page->props->users, function ($users) {
$this->assertSame(json_encode([['name' => 'Jonathan']]), json_encode($users));
});
tap($page->props->organizations, function ($organizations) {
$this->assertSame(json_encode([['name' => 'Inertia']]), json_encode($organizations));
});
}

public function test_lazy_callable_resource_partial_response(): void
{
$request = Request::create('/users', 'GET');
$request->headers->add(['X-Inertia' => 'true']);
$request->headers->add(['X-Inertia-Partial-Data' => 'users']);
$request->headers->add(['X-Inertia-Partial-Component' => 'User/Index']);

$response = new Response('User/Index', [
'users' => fn () => [['name' => 'Jonathan']],
'organizations' => fn () => [['name' => 'Inertia']],
], 'app', '123');
$response = $response->toResponse($request);
$page = $response->getData();

$this->assertInstanceOf(JsonResponse::class, $response);
$this->assertSame('User/Index', $page->component);
$this->assertSame('/users', $page->url);
$this->assertSame('123', $page->version);
$this->assertFalse(property_exists($page->props, 'organizations'));
tap($page->props->users, function ($users) {
$this->assertSame(json_encode([['name' => 'Jonathan']]), json_encode($users));
});
}

public function test_lazy_resource_response(): void
{
$request = Request::create('/users', 'GET', ['page' => 1]);
Expand Down

0 comments on commit 7c604c7

Please sign in to comment.