reactive/data-client
Async State Management without the Management. REST, GraphQL, SSE, Websockets
๐ Patch Changes
- [#3960](https://github.com/reactive/data-client/pull/3960) [`dfa657e`](https://github.com/reactive/data-client/commit/dfa657eb419641845bc7c39abe52189905773190) - Endpoints that resolve to falsy values (`''`, `0`, `false`, or `null`) no longer trigger infinite refetches.
- Updated dependencies [[`dfa657e`](https://github.com/reactive/data-client/commit/dfa657eb419641845bc7c39abe52189905773190)]:
- @data-client/core@0.18.1
๐ Patch Changes
- [`adb82f1`](https://github.com/reactive/data-client/commit/adb82f15c1959ecfc09565a519d2672a2d63178c) - RestEndpoint.remove.name is 'partialUpdate' since it uses 'PATCH'
๐ Patch Changes
- [#3960](https://github.com/reactive/data-client/pull/3960) [`dfa657e`](https://github.com/reactive/data-client/commit/dfa657eb419641845bc7c39abe52189905773190) - Endpoints that resolve to falsy values (`''`, `0`, `false`, or `null`) no longer trigger infinite refetches.
- Updated dependencies [[`dfa657e`](https://github.com/reactive/data-client/commit/dfa657eb419641845bc7c39abe52189905773190)]:
- @data-client/core@0.18.1
๐ Patch Changes
- [#3960](https://github.com/reactive/data-client/pull/3960) [`dfa657e`](https://github.com/reactive/data-client/commit/dfa657eb419641845bc7c39abe52189905773190) - Endpoints that resolve to falsy values (`''`, `0`, `false`, or `null`) no longer trigger infinite refetches.
๐ Patch Changes
- [#3960](https://github.com/reactive/data-client/pull/3960) [`dfa657e`](https://github.com/reactive/data-client/commit/dfa657eb419641845bc7c39abe52189905773190) - Endpoints that resolve to falsy values (`''`, `0`, `false`, or `null`) no longer trigger infinite refetches.
- Updated dependencies [[`dfa657e`](https://github.com/reactive/data-client/commit/dfa657eb419641845bc7c39abe52189905773190)]:
- @data-client/normalizr@0.18.1
๐ Minor Changes
- [#3931](https://github.com/reactive/data-client/pull/3931) [`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb) - Allow one `Collection` schema to be used both top-level and nested.
- Before:
- ```ts
- const getTodos = new Collection([Todo], { argsKey });
- const userTodos = new Collection([Todo], { nestKey });
- ```
- After:
- ```ts
- + 91 more
๐ Patch Changes
- Updated dependencies [[`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb), [`84078d7`](https://github.com/reactive/data-client/commit/84078d7d36bf5cf0fd16a479ce16c48c5d804f32), [`6e8e499`](https://github.com/reactive/data-client/commit/6e8e499441741b58ad35127b517e8d83fc7a58fd), [`84078d7`](https://github.com/reactive/data-client/commit/84078d7d36bf5cf0fd16a479ce16c48c5d804f32)]:
- @data-client/core@0.18.0
๐ Patch Changes
- [`89e06d3`](https://github.com/reactive/data-client/commit/89e06d38ab839f12f468283a6ff416983f95d65a) - Bump `@data-client/react` peer dependency range to include `^0.18.0`.
๐ Minor Changes
- [#3931](https://github.com/reactive/data-client/pull/3931) [`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb) - Allow one `Collection` schema to be used both top-level and nested.
- Before:
- ```ts
- const getTodos = new Collection([Todo], { argsKey });
- const userTodos = new Collection([Todo], { nestKey });
- ```
- After:
- ```ts
- + 91 more
๐ Patch Changes
- [#3925](https://github.com/reactive/data-client/pull/3925) [`6e8e499`](https://github.com/reactive/data-client/commit/6e8e499441741b58ad35127b517e8d83fc7a58fd) - Fix cached journey being mutated on repeated result-cache hits.
- `GlobalCache.getResults` called `paths.shift()` on a cache hit, mutating
- the `journey` array stored by reference on the `WeakDependencyMap` `Link`
- node. After the first hit stripped the placeholder input slot, every
- subsequent hit on the same cached entry would shift off a real
- `EntityPath`, progressively losing subscription entries. This could cause
- missed `countRef` tracking (premature GC of still-referenced entities)
- and incorrect `entityExpiresAt` calculations. The hit path now returns a
- + 3 more
๐ Minor Changes
- [#3931](https://github.com/reactive/data-client/pull/3931) [`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb) - Allow one `Collection` schema to be used both top-level and nested.
- Before:
- ```ts
- const getTodos = new Collection([Todo], { argsKey });
- const userTodos = new Collection([Todo], { nestKey });
- ```
- After:
- ```ts
- + 91 more
๐ Patch Changes
- [#3925](https://github.com/reactive/data-client/pull/3925) [`6e8e499`](https://github.com/reactive/data-client/commit/6e8e499441741b58ad35127b517e8d83fc7a58fd) - Fix cached journey being mutated on repeated result-cache hits.
- `GlobalCache.getResults` called `paths.shift()` on a cache hit, mutating
- the `journey` array stored by reference on the `WeakDependencyMap` `Link`
- node. After the first hit stripped the placeholder input slot, every
- subsequent hit on the same cached entry would shift off a real
- `EntityPath`, progressively losing subscription entries. This could cause
- missed `countRef` tracking (premature GC of still-referenced entities)
- and incorrect `entityExpiresAt` calculations. The hit path now returns a
- + 3 more
๐ Minor Changes
- [#3931](https://github.com/reactive/data-client/pull/3931) [`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb) - Allow one `Collection` schema to be used both top-level and nested.
- Before:
- ```ts
- const getTodos = new Collection([Todo], { argsKey });
- const userTodos = new Collection([Todo], { nestKey });
- ```
- After:
- ```ts
- + 117 more
๐ Patch Changes
- [#3925](https://github.com/reactive/data-client/pull/3925) [`6e8e499`](https://github.com/reactive/data-client/commit/6e8e499441741b58ad35127b517e8d83fc7a58fd) - Fix cached journey being mutated on repeated result-cache hits.
- `GlobalCache.getResults` called `paths.shift()` on a cache hit, mutating
- the `journey` array stored by reference on the `WeakDependencyMap` `Link`
- node. After the first hit stripped the placeholder input slot, every
- subsequent hit on the same cached entry would shift off a real
- `EntityPath`, progressively losing subscription entries. This could cause
- missed `countRef` tracking (premature GC of still-referenced entities)
- and incorrect `entityExpiresAt` calculations. The hit path now returns a
- + 1 more
๐ Patch Changes
- [`89e06d3`](https://github.com/reactive/data-client/commit/89e06d38ab839f12f468283a6ff416983f95d65a) - Bump `@data-client/react` peer dependency range to include `^0.18.0`.
- Updated dependencies [[`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb), [`84078d7`](https://github.com/reactive/data-client/commit/84078d7d36bf5cf0fd16a479ce16c48c5d804f32), [`6e8e499`](https://github.com/reactive/data-client/commit/6e8e499441741b58ad35127b517e8d83fc7a58fd), [`396d163`](https://github.com/reactive/data-client/commit/396d163e6f4991818519ec33d903a85437483dfd), [`84078d7`](https://github.com/reactive/data-client/commit/84078d7d36bf5cf0fd16a479ce16c48c5d804f32)]:
- @data-client/endpoint@0.18.0
๐ Minor Changes
- [#3931](https://github.com/reactive/data-client/pull/3931) [`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb) - Allow one `Collection` schema to be used both top-level and nested.
- Before:
- ```ts
- const getTodos = new Collection([Todo], { argsKey });
- const userTodos = new Collection([Todo], { nestKey });
- ```
- After:
- ```ts
- + 91 more
๐ Patch Changes
- [#3925](https://github.com/reactive/data-client/pull/3925) [`6e8e499`](https://github.com/reactive/data-client/commit/6e8e499441741b58ad35127b517e8d83fc7a58fd) - Fix cached journey being mutated on repeated result-cache hits.
- `GlobalCache.getResults` called `paths.shift()` on a cache hit, mutating
- the `journey` array stored by reference on the `WeakDependencyMap` `Link`
- node. After the first hit stripped the placeholder input slot, every
- subsequent hit on the same cached entry would shift off a real
- `EntityPath`, progressively losing subscription entries. This could cause
- missed `countRef` tracking (premature GC of still-referenced entities)
- and incorrect `entityExpiresAt` calculations. The hit path now returns a
- + 3 more
๐ Minor Changes
- [#3931](https://github.com/reactive/data-client/pull/3931) [`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb) - Allow one `Collection` schema to be used both top-level and nested.
- Before:
- ```ts
- const getTodos = new Collection([Todo], { argsKey });
- const userTodos = new Collection([Todo], { nestKey });
- ```
- After:
- ```ts
- + 117 more
๐ Patch Changes
- [#3925](https://github.com/reactive/data-client/pull/3925) [`6e8e499`](https://github.com/reactive/data-client/commit/6e8e499441741b58ad35127b517e8d83fc7a58fd) - Fix cached journey being mutated on repeated result-cache hits.
- `GlobalCache.getResults` called `paths.shift()` on a cache hit, mutating
- the `journey` array stored by reference on the `WeakDependencyMap` `Link`
- node. After the first hit stripped the placeholder input slot, every
- subsequent hit on the same cached entry would shift off a real
- `EntityPath`, progressively losing subscription entries. This could cause
- missed `countRef` tracking (premature GC of still-referenced entities)
- and incorrect `entityExpiresAt` calculations. The hit path now returns a
- + 1 more
๐ Minor Changes
- [#3931](https://github.com/reactive/data-client/pull/3931) [`959465a`](https://github.com/reactive/data-client/commit/959465a064db687176e483932987b083f19718eb) - Allow one `Collection` schema to be used both top-level and nested.
- Before:
- ```ts
- const getTodos = new Collection([Todo], { argsKey });
- const userTodos = new Collection([Todo], { nestKey });
- ```
- After:
- ```ts
- + 91 more
๐ Patch Changes
- [#3925](https://github.com/reactive/data-client/pull/3925) [`6e8e499`](https://github.com/reactive/data-client/commit/6e8e499441741b58ad35127b517e8d83fc7a58fd) - Fix cached journey being mutated on repeated result-cache hits.
- `GlobalCache.getResults` called `paths.shift()` on a cache hit, mutating
- the `journey` array stored by reference on the `WeakDependencyMap` `Link`
- node. After the first hit stripped the placeholder input slot, every
- subsequent hit on the same cached entry would shift off a real
- `EntityPath`, progressively losing subscription entries. This could cause
- missed `countRef` tracking (premature GC of still-referenced entities)
- and incorrect `entityExpiresAt` calculations. The hit path now returns a
- + 3 more
๐ Patch Changes
- [`fd64b41`](https://github.com/reactive/data-client/commit/fd64b41a9de266af51708622ea8991060fd788a5) - Include `@data-client/normalizr@0.16.6` performance improvements:
- [#3875](https://github.com/reactive/data-client/pull/3875) [`467a5f6`](https://github.com/reactive/data-client/commit/467a5f6f9d4cdaf0927fa7e22520c5d2c1462ff5) - Fix deepClone to only copy own properties
- `deepClone` in the immutable store path now uses `Object.keys()` instead of `for...in`, preventing inherited properties from being copied into cloned state.
- [#3877](https://github.com/reactive/data-client/pull/3877) [`e9e96f1`](https://github.com/reactive/data-client/commit/e9e96f1751895c17e046461a1c38bb4bb093c141) - Replace megamorphic computed dispatch in getDependency with switch
- [#3876](https://github.com/reactive/data-client/pull/3876) [`7d28629`](https://github.com/reactive/data-client/commit/7d28629d07f6cade43e36f3cf1956f175f98d84f) - Improve denormalization performance by pre-allocating the dependency tracking slot
- Replace `Array.prototype.unshift()` in `GlobalCache.getResults()` with a pre-allocated slot at index 0, avoiding O(n) element shifting on every cache-miss denormalization.
- [#3884](https://github.com/reactive/data-client/pull/3884) [`7df6a49`](https://github.com/reactive/data-client/commit/7df6a49ee9fcdac10f9f24ec48c4df0931efa0b0) - Move entity table POJO clone from getNewEntities to setEntity
- [#3878](https://github.com/reactive/data-client/pull/3878) [`98a7831`](https://github.com/reactive/data-client/commit/98a78318770feaa8433708693bec90b81cbcb1b2) - Avoid hidden class mutation in normalize() return object
- + 2 more
๐ Minor Changes
- [#3914](https://github.com/reactive/data-client/pull/3914) [`930c8ed`](https://github.com/reactive/data-client/commit/930c8ed04b6f9fcb2d131f39cc706a5eeb0edc4d) - resource() accepts [nonFilterArgumentKeys](https://dataclient.io/rest/api/Collection#nonfilterargumentkeys)
- ```ts
- const PostResource = resource({
- path: '/:group/posts/:id',
- searchParams: {} as { orderBy?: string; author?: string },
- schema: Post,
- nonFilterArgumentKeys: ['orderBy'],
- });
- + 1 more
๐ Patch Changes
- [`fd64b41`](https://github.com/reactive/data-client/commit/fd64b41a9de266af51708622ea8991060fd788a5) - Include `@data-client/normalizr@0.16.6` performance improvements:
- [#3875](https://github.com/reactive/data-client/pull/3875) [`467a5f6`](https://github.com/reactive/data-client/commit/467a5f6f9d4cdaf0927fa7e22520c5d2c1462ff5) - Fix deepClone to only copy own properties
- `deepClone` in the immutable store path now uses `Object.keys()` instead of `for...in`, preventing inherited properties from being copied into cloned state.
- [#3877](https://github.com/reactive/data-client/pull/3877) [`e9e96f1`](https://github.com/reactive/data-client/commit/e9e96f1751895c17e046461a1c38bb4bb093c141) - Replace megamorphic computed dispatch in getDependency with switch
- [#3876](https://github.com/reactive/data-client/pull/3876) [`7d28629`](https://github.com/reactive/data-client/commit/7d28629d07f6cade43e36f3cf1956f175f98d84f) - Improve denormalization performance by pre-allocating the dependency tracking slot
- Replace `Array.prototype.unshift()` in `GlobalCache.getResults()` with a pre-allocated slot at index 0, avoiding O(n) element shifting on every cache-miss denormalization.
- [#3884](https://github.com/reactive/data-client/pull/3884) [`7df6a49`](https://github.com/reactive/data-client/commit/7df6a49ee9fcdac10f9f24ec48c4df0931efa0b0) - Move entity table POJO clone from getNewEntities to setEntity
- [#3878](https://github.com/reactive/data-client/pull/3878) [`98a7831`](https://github.com/reactive/data-client/commit/98a78318770feaa8433708693bec90b81cbcb1b2) - Avoid hidden class mutation in normalize() return object
- + 2 more
๐ Patch Changes
- [`fd64b41`](https://github.com/reactive/data-client/commit/fd64b41a9de266af51708622ea8991060fd788a5) - Include `@data-client/normalizr@0.16.6` performance improvements:
- [#3875](https://github.com/reactive/data-client/pull/3875) [`467a5f6`](https://github.com/reactive/data-client/commit/467a5f6f9d4cdaf0927fa7e22520c5d2c1462ff5) - Fix deepClone to only copy own properties
- `deepClone` in the immutable store path now uses `Object.keys()` instead of `for...in`, preventing inherited properties from being copied into cloned state.
- [#3877](https://github.com/reactive/data-client/pull/3877) [`e9e96f1`](https://github.com/reactive/data-client/commit/e9e96f1751895c17e046461a1c38bb4bb093c141) - Replace megamorphic computed dispatch in getDependency with switch
- [#3876](https://github.com/reactive/data-client/pull/3876) [`7d28629`](https://github.com/reactive/data-client/commit/7d28629d07f6cade43e36f3cf1956f175f98d84f) - Improve denormalization performance by pre-allocating the dependency tracking slot
- Replace `Array.prototype.unshift()` in `GlobalCache.getResults()` with a pre-allocated slot at index 0, avoiding O(n) element shifting on every cache-miss denormalization.
- [#3884](https://github.com/reactive/data-client/pull/3884) [`7df6a49`](https://github.com/reactive/data-client/commit/7df6a49ee9fcdac10f9f24ec48c4df0931efa0b0) - Move entity table POJO clone from getNewEntities to setEntity
- [#3878](https://github.com/reactive/data-client/pull/3878) [`98a7831`](https://github.com/reactive/data-client/commit/98a78318770feaa8433708693bec90b81cbcb1b2) - Avoid hidden class mutation in normalize() return object
๐ Patch Changes
- [#3868](https://github.com/reactive/data-client/pull/3868) [`8a7c8d9`](https://github.com/reactive/data-client/commit/8a7c8d9cc4228a6281849f56121699f237af4b0f) - Add `content` property to RestEndpoint for typed response parsing
- Set `content` to control how the response body is parsed, with automatic return type inference:
- ```ts
- const downloadFile = new RestEndpoint({
- path: '/files/:id/download',
- content: 'blob',
- dataExpiryLength: 0,
- });
- + 28 more
๐ Patch Changes
- [#3875](https://github.com/reactive/data-client/pull/3875) [`467a5f6`](https://github.com/reactive/data-client/commit/467a5f6f9d4cdaf0927fa7e22520c5d2c1462ff5) - Fix deepClone to only copy own properties
- `deepClone` in the immutable store path now uses `Object.keys()` instead of `for...in`, preventing inherited properties from being copied into cloned state.
- [#3877](https://github.com/reactive/data-client/pull/3877) [`e9e96f1`](https://github.com/reactive/data-client/commit/e9e96f1751895c17e046461a1c38bb4bb093c141) - Replace megamorphic computed dispatch in getDependency with switch
- [#3876](https://github.com/reactive/data-client/pull/3876) [`7d28629`](https://github.com/reactive/data-client/commit/7d28629d07f6cade43e36f3cf1956f175f98d84f) - Improve denormalization performance by pre-allocating the dependency tracking slot
- Replace `Array.prototype.unshift()` in `GlobalCache.getResults()` with a pre-allocated slot at index 0, avoiding O(n) element shifting on every cache-miss denormalization.
- [#3884](https://github.com/reactive/data-client/pull/3884) [`7df6a49`](https://github.com/reactive/data-client/commit/7df6a49ee9fcdac10f9f24ec48c4df0931efa0b0) - Move entity table POJO clone from getNewEntities to setEntity
- [#3878](https://github.com/reactive/data-client/pull/3878) [`98a7831`](https://github.com/reactive/data-client/commit/98a78318770feaa8433708693bec90b81cbcb1b2) - Avoid hidden class mutation in normalize() return object
๐ Patch Changes
- [#3904](https://github.com/reactive/data-client/pull/3904) [`8af3d5e`](https://github.com/reactive/data-client/commit/8af3d5ee3dbbb637805e99cbd01801d3587bedbd) - Export `CollectionOptions` from the public `@data-client/endpoint` and `@data-client/rest` entrypoints.
๐ Patch Changes
- [#3866](https://github.com/reactive/data-client/pull/3866) [`16f5d92`](https://github.com/reactive/data-client/commit/16f5d92598de05e92b88af98a9d63eecf27ab819) - Bundle `path-to-regexp` as tree-shaken ESM
- Bundle only the functions we use (`compile`, `parse`, `pathToRegexp`) from
- `path-to-regexp` into the ESM/browser build via rollup. This eliminates
- the CJS/ESM boundary that broke StackBlitz WebContainers and reduces bundle
- size by tree-shaking unused exports (`match`, `stringify`, and the `ID` regex).
๐ Patch Changes
- [#3862](https://github.com/reactive/data-client/pull/3862) [`a214720`](https://github.com/reactive/data-client/commit/a214720fd12e1360d00e194b389aa82aff6b91fd) - Fix StackBlitz WebContainers compatibility with path-to-regexp
- Use namespace import (`import *`) instead of named imports for the CJS
- `path-to-regexp` dependency. Named imports trigger webpack's per-export
- presence validation, which fails in StackBlitz's WebContainers environment.
- Namespace imports defer property access to runtime, bypassing the check
- with no tree-shaking loss.
๐ Patch Changes
- [#3858](https://github.com/reactive/data-client/pull/3858) [`c83a81d`](https://github.com/reactive/data-client/commit/c83a81d4183b4b0f7c3a41f5b49fdba890406a6b) - Fix `maxEntityDepth` missing from Entity types on TypeScript 4.0
- `maxEntityDepth` was not included in the TS 4.0 legacy type definitions,
- so TypeScript 4.0 users could not set or reference this property on Entity classes.
- [#3860](https://github.com/reactive/data-client/pull/3860) [`886f2cf`](https://github.com/reactive/data-client/commit/886f2cf9032d5bb929b4bab63d61dc34398ca539) - Fix compatibility with StackBlitz WebContainers
- Consolidate `path-to-regexp` imports into a single module to avoid
- CJS/ESM interop failures in StackBlitz's WebContainers environment,
- where webpack could not resolve the `pathToRegexp` named export from
- the CJS `path-to-regexp` package.
- + 3 more
๐ Patch Changes
- [#3847](https://github.com/reactive/data-client/pull/3847) [`e93e820`](https://github.com/reactive/data-client/commit/e93e820a112683badd4020c7c04c2284a0f6d8bf) - Fix TypeScript for `RestEndpoint` subclasses when the path is inferred as `string`
- The same problem could show up when you set `searchParams: undefined` explicitly next to a `body` and a widened path. Both cases now type-check as you would expect.
- ```typescript
- import { Entity } from '@data-client/endpoint';
- import { RestEndpoint, RestGenerics } from '@data-client/rest';
- class Item extends Entity {
- readonly id = '';
- }
- + 21 more
๐ Patch Changes
- [#3858](https://github.com/reactive/data-client/pull/3858) [`c83a81d`](https://github.com/reactive/data-client/commit/c83a81d4183b4b0f7c3a41f5b49fdba890406a6b) - Fix `maxEntityDepth` missing from Entity types on TypeScript 4.0
- `maxEntityDepth` was not included in the TS 4.0 legacy type definitions,
- so TypeScript 4.0 users could not set or reference this property on Entity classes.
- Updated dependencies [[`c83a81d`](https://github.com/reactive/data-client/commit/c83a81d4183b4b0f7c3a41f5b49fdba890406a6b)]:
- @data-client/endpoint@0.16.3
๐ Patch Changes
- [#3858](https://github.com/reactive/data-client/pull/3858) [`c83a81d`](https://github.com/reactive/data-client/commit/c83a81d4183b4b0f7c3a41f5b49fdba890406a6b) - Fix `maxEntityDepth` missing from Entity types on TypeScript 4.0
- `maxEntityDepth` was not included in the TS 4.0 legacy type definitions,
- so TypeScript 4.0 users could not set or reference this property on Entity classes.
๐ Patch Changes
- [#3845](https://github.com/reactive/data-client/pull/3845) [`14095fe`](https://github.com/reactive/data-client/commit/14095fe768625cf11ce3d80d3493571029cf5b67) - Fix type errors when using concrete body types with subclassed RestEndpoint
- Subclassing RestEndpoint (the standard pattern for adding auth headers, custom
- serialization, etc.) could produce type errors when specifying concrete body types.
- ```ts
- // Before: type error on body โ
- class AuthdEndpoint<O extends RestGenerics = any> extends RestEndpoint<O> {}
- new AuthdEndpoint({
- method: 'PUT',
- + 5 more
๐ Minor Changes
- [#3752](https://github.com/reactive/data-client/pull/3752) [`3c3bfe8`](https://github.com/reactive/data-client/commit/3c3bfe81ff0c3a786d6804a61f9e7a4362947dcb) - BREAKING CHANGE: [useFetch()](/docs/api/useFetch) always returns a stable promise with a `.resolved` property, even when data is already cached.
- ```tsx
- const promise = useFetch(MyResource.get, { id });
- if (promise) {
- // fetch was triggered
- }
- ```
- ```tsx
- + 6 more
๐ Patch Changes
- [#3753](https://github.com/reactive/data-client/pull/3753) [`e54c9b6`](https://github.com/reactive/data-client/commit/e54c9b6e6a48939263f41496a90387ee614d35f5) - Add `globalThis.__DC_CONTROLLERS__` Map in dev mode for programmatic store access from browser DevTools MCP, React Native debuggers, and other development tooling.
- Each [DataProvider](/docs/api/DataProvider) registers its [Controller](/docs/api/Controller) keyed by the devtools connection name, supporting multiple providers on the same page.
- [#3823](https://github.com/reactive/data-client/pull/3823) [`869f28f`](https://github.com/reactive/data-client/commit/869f28fc651ca5e8b0f935089fc0b8d8ce8585cb) - Fix stack overflow during denormalization of large bidirectional entity graphs.
- Add entity depth limit (64) to prevent `RangeError: Maximum call stack size exceeded`
- when denormalizing cross-type chains with thousands of unique entities
- (e.g., Department โ Building โ Department โ ...). Entities beyond the depth limit
- are returned with unresolved ids instead of fully denormalized nested objects.
- The limit can be configured per-Entity with [`static maxEntityDepth`](/rest/api/Entity#maxEntityDepth):
- + 7 more
๐ Patch Changes
- [`d5f8680`](https://github.com/reactive/data-client/commit/d5f86807874616cd687a301d8126220600b515c7) - Support 0.16
- [#3774](https://github.com/reactive/data-client/pull/3774) [`0e0ff1a`](https://github.com/reactive/data-client/commit/0e0ff1ab49b1a58477b07dba3dfc73df6d4af3f5) - Add automatic cleanup after each test
- ```ts
- // Before: โ
- afterEach(() => {
- renderDataHook.cleanup();
- });
- // After: โ (no afterEach needed โ cleanup is automatic)
- + 11 more
