From 90a16a10888eee37d8a61cdbfad070e002a3cfdf Mon Sep 17 00:00:00 2001 From: cexbrayat Date: Wed, 19 Feb 2025 23:23:36 +0100 Subject: [PATCH] fix(common): support equality function in httpResource (#60026) The `equal` option was not passed to the underlying resource. PR Close #60026 --- packages/common/http/src/resource.ts | 5 ++++- packages/common/http/test/resource_spec.ts | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/common/http/src/resource.ts b/packages/common/http/src/resource.ts index e7f37021d70..4abcd15abd4 100644 --- a/packages/common/http/src/resource.ts +++ b/packages/common/http/src/resource.ts @@ -19,6 +19,7 @@ import { Resource, WritableSignal, ResourceStreamItem, + type ValueEqualityFn, } from '@angular/core'; import {Subscription} from 'rxjs'; @@ -240,6 +241,7 @@ function makeHttpResourceFn(responseType: 'arraybuffer' | 'blob' | 'json' () => normalizeRequest(request, responseType), options?.defaultValue, options?.parse as (value: unknown) => TResult, + options?.equal as ValueEqualityFn, ) as HttpResourceRef; }; } @@ -313,6 +315,7 @@ class HttpResourceImpl request: () => HttpRequest | undefined, defaultValue: T, parse?: (value: unknown) => T, + equal?: ValueEqualityFn, ) { super( request, @@ -364,7 +367,7 @@ class HttpResourceImpl return promise; }, defaultValue, - undefined, + equal, injector, ); this.client = injector.get(HttpClient); diff --git a/packages/common/http/test/resource_spec.ts b/packages/common/http/test/resource_spec.ts index 4e7d629cd5a..73dc97a82cc 100644 --- a/packages/common/http/test/resource_spec.ts +++ b/packages/common/http/test/resource_spec.ts @@ -165,6 +165,23 @@ describe('httpResource', () => { expect(res.value()).toEqual('[1,2,3]'); }); + it('should allow defining an equality function', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource('/data', { + injector: TestBed.inject(Injector), + equal: (_a, _b) => true, + }); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush(1); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual(1); + + res.value.set(5); + expect(res.value()).toBe(1); // equality blocked writes + }); + it('should support text responses', async () => { const backend = TestBed.inject(HttpTestingController); const res = httpResource.text(