entity-repository 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.d.ts CHANGED
@@ -11,6 +11,6 @@ export declare function createRepositoryContext<Definitions extends EntityDefini
11
11
  useRepository: () => Repository<Definitions, Config>;
12
12
  useRepositoryQuery: <Table extends keyof Definitions>(table: Table, id: EntityIdTuple<Definitions, Config, Table>, fetcher: (id: EntityIdTuple<Definitions, Config, Table>) => Promise<Definitions[Table]>) => RepositoryQuery<Definitions[Table]>;
13
13
  useRepositoryListQuery: <Table extends keyof Definitions, Param>(table: Table, param: Param, options: ListQueryOptions<Definitions[Table]>, fetcher: (param: Param) => Promise<Definitions[Table][]>) => ListQueryState<Definitions[Table]>;
14
- useSubscribedState: <Value>(observable: Observable<Value>, initialValue: Value) => Value;
14
+ useSubscribedState: <Value>(observable: Observable<Value>, getSnapshot: () => Value) => Value;
15
15
  };
16
16
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAA4C,MAAM,OAAO,CAAC;AAE3F,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,uBAAuB,CACrC,WAAW,SAAS,iBAAiB,EACrC,MAAM,SAAS,YAAY,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC;oDAOjE;QACD,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC5C,QAAQ,EAAE,SAAS,CAAC;KACrB;;yBAoC2B,KAAK,SAAS,MAAM,WAAW,SAClD,KAAK,MACR,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,WACpC,CAAC,EAAE,EAAE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KACtF,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;6BAiBN,KAAK,SAAS,MAAM,WAAW,EAAE,KAAK,SAC7D,KAAK,SACL,KAAK,WACH,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,WACpC,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,KACvD,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;yBA9CT,KAAK,cAAc,UAAU,CAAC,KAAK,CAAC,gBAAgB,KAAK;EA2EtF"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAA6E,MAAM,OAAO,CAAC;AAE5H,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,uBAAuB,CACrC,WAAW,SAAS,iBAAiB,EACrC,MAAM,SAAS,YAAY,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC;oDAOjE;QACD,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC5C,QAAQ,EAAE,SAAS,CAAC;KACrB;;yBAyC2B,KAAK,SAAS,MAAM,WAAW,SAClD,KAAK,MACR,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,WACpC,CAAC,EAAE,EAAE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KACtF,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;6BAiBN,KAAK,SAAS,MAAM,WAAW,EAAE,KAAK,SAC7D,KAAK,SACL,KAAK,WACH,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,WACpC,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,KACvD,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;yBAnDT,KAAK,cAAc,UAAU,CAAC,KAAK,CAAC,eAAe,MAAM,KAAK;EAgF3F"}
package/dist/react.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { createContext, useContext, useEffect, useMemo, useState } from "react";
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useSyncExternalStore } from "react";
3
3
  import { combineLatest, map } from "rxjs";
4
4
  export function createRepositoryContext() {
5
5
  const RepositoryReactContext = createContext(null);
@@ -13,15 +13,17 @@ export function createRepositoryContext() {
13
13
  }
14
14
  return context;
15
15
  }
16
- function useSubscribedState(observable, initialValue) {
17
- const [state, setState] = useState(initialValue);
18
- useEffect(() => {
16
+ function useSubscribedState(observable, getSnapshot) {
17
+ const snapshotRef = useRef(getSnapshot());
18
+ const subscribe = useCallback((callback) => {
19
19
  const subscription = observable.subscribe((value) => {
20
- setState(value);
20
+ snapshotRef.current = value;
21
+ callback();
21
22
  });
22
23
  return () => subscription.unsubscribe();
23
24
  }, [observable]);
24
- return state;
25
+ const getSnapshotStable = useCallback(() => snapshotRef.current, []);
26
+ return useSyncExternalStore(subscribe, getSnapshotStable);
25
27
  }
26
28
  /**
27
29
  * Subscribes to a single-record query keyed only by `id`.
@@ -33,7 +35,7 @@ export function createRepositoryContext() {
33
35
  const repository = useRepository();
34
36
  // eslint-disable-next-line react-hooks/exhaustive-deps -- table/fetcher intentionally ignored
35
37
  const recordQuery = useMemo(() => repository.recordQuery(table, id, fetcher), [repository, JSON.stringify(id)]);
36
- return useSubscribedState(recordQuery.$state, recordQuery.$state.value);
38
+ return useSubscribedState(recordQuery.$state, () => recordQuery.$state.value);
37
39
  }
38
40
  /**
39
41
  * Subscribes to a list query keyed only by `param`.
@@ -49,7 +51,7 @@ export function createRepositoryContext() {
49
51
  return () => listQuery.dispose();
50
52
  }, [listQuery]);
51
53
  const $state = useMemo(() => combineLatest([listQuery.$records, listQuery.$status]).pipe(map(([records, status]) => ({ records, ...status }))), [listQuery]);
52
- return useSubscribedState($state, { records: listQuery.$records.value, ...listQuery.$status.value });
54
+ return useSubscribedState($state, () => ({ records: listQuery.$records.value, ...listQuery.$status.value }));
53
55
  }
54
56
  return {
55
57
  RepositoryProvider,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "entity-repository",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Type-safe entity caching and state management with RxJS and React",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",