@rindle/react 0.1.6 → 0.3.1
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/README.md +28 -7
- package/dist/index.d.ts +72 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +519 -20
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +725 -24
package/README.md
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
React bindings for Rindle stores.
|
|
4
4
|
|
|
5
5
|
```tsx
|
|
6
|
-
import { Rindle,
|
|
6
|
+
import { Rindle, fragmentKey, useFragment, useRoot } from "@rindle/react";
|
|
7
|
+
import { IssueCardFragment, issuesPageQuery, type IssueCardRef } from "./IssueListItem.queries.ts";
|
|
7
8
|
|
|
8
9
|
createRoot(root).render(
|
|
9
10
|
<Rindle store={app.store}>
|
|
@@ -12,12 +13,22 @@ createRoot(root).render(
|
|
|
12
13
|
);
|
|
13
14
|
|
|
14
15
|
function Issues() {
|
|
15
|
-
const issues =
|
|
16
|
-
|
|
16
|
+
const [issues, { status }] = useRoot(issuesPageQuery, { limit: 50 }, IssueCardFragment);
|
|
17
|
+
if (status !== "complete" && issues.length === 0) return <p>Loading...</p>;
|
|
18
|
+
return issues.map((issue) => <IssueRow key={fragmentKey(issue)} issue={issue} />);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function IssueRow({ issue }: { issue: IssueCardRef }) {
|
|
22
|
+
const data = useFragment(IssueCardFragment, issue);
|
|
23
|
+
if (!data) return null;
|
|
24
|
+
return <div>{data.title}</div>;
|
|
17
25
|
}
|
|
18
26
|
```
|
|
19
27
|
|
|
20
|
-
`
|
|
28
|
+
`useRoot(namedQuery, args?, ...ctx?, RootFragment?)` retains the full named root query for sync
|
|
29
|
+
coverage and returns local React-facing data. Passing a root fragment returns opaque refs for the
|
|
30
|
+
root rows; child components read those refs with `useFragment(fragment, ref)`. `useQuery(query)` is
|
|
31
|
+
still available for direct live query reads that do not need fragment-local boundaries.
|
|
21
32
|
|
|
22
33
|
For local-first backends, the React-facing data view is shared by compiled local AST. Each
|
|
23
34
|
mounted hook still retains its own `name`/`args` lease through the Store, so backend-level
|
|
@@ -33,10 +44,20 @@ cannot split local views from remote subscriptions keep the older materialized-v
|
|
|
33
44
|
answered. A pending optimistic mutation no longer moves it — "is a write pending here?" is a
|
|
34
45
|
separate axis on the backend (`backend.pending(qid)` / `onPending`), and `error` is reserved
|
|
35
46
|
and currently unproduced. Shares `useQuery`'s leased view, so reading both is one subscription.
|
|
36
|
-
- `
|
|
37
|
-
|
|
38
|
-
|
|
47
|
+
- `useSyncQuery(query)` — retains a named remote query for normalized/local-first sync coverage
|
|
48
|
+
without subscribing React to the broad result tree; returns only `ResultType`.
|
|
49
|
+
- `useRoot(namedQuery, args?, ...ctx?)` — retains the full root coverage query and returns
|
|
50
|
+
`[data, details]`, where `details.status` distinguishes loading from completed-not-found.
|
|
51
|
+
Without a fragment argument, `data` is the root query's local React-facing data. Fragment child
|
|
52
|
+
relationships are surfaced as `FragmentRef`s, so children can keep owning their own reads.
|
|
53
|
+
Passing a fragment as the final argument switches `data` to root-ref mode:
|
|
54
|
+
`useRoot(namedQuery, args, RootFragment)`.
|
|
55
|
+
- `useFragment(fragment, ref)` — reads an opaque local fragment ref. It opens a narrow local-only
|
|
56
|
+
query for that fragment and returns `null` until the local row is available. Child relationships
|
|
57
|
+
composed as `sub(alias, rel, ChildFragment)` are refs; inline child builders remain inline data.
|
|
58
|
+
- `fragmentKey(ref)` — stable key for opaque fragment refs, useful for React list keys.
|
|
39
59
|
- `useRindleStore()` — the `Store` from context, for imperative writes/reads inside components.
|
|
60
|
+
- `SyncQueryCache` — the per-provider cache that dedupes sync-only coverage retains.
|
|
40
61
|
- `QueryCache` — the per-provider cache that dedupes a query's materialized view across hooks.
|
|
41
62
|
- `queryCacheKey(query)` — the stable string key (`@rindle/client`'s `stableKey(ast)`) under which
|
|
42
63
|
the cache stores that view. Same AST → same key → one shared entry, and it matches the SSR seed
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
|
-
import type { ColsMap, Fragment, FragmentRef,
|
|
3
|
-
type
|
|
2
|
+
import type { AnyQuery, ColsMap, Fragment, FragmentData, FragmentRef, NamedQuery, QueryLocalData, ResultType, Store } from "@rindle/client";
|
|
3
|
+
type AnyFragment = Fragment<any, any, any, any>;
|
|
4
4
|
export type QueryData<Q extends AnyQuery> = ReturnType<Q["materialize"]>["data"];
|
|
5
|
+
export type RootData<Q extends AnyQuery> = QueryLocalData<Q>;
|
|
6
|
+
export type RootRefData<Q extends AnyQuery, F extends Fragment<any, any, any, any>> = QueryData<Q> extends readonly unknown[] ? readonly FragmentRef<F>[] : FragmentRef<F> | null;
|
|
7
|
+
export interface RootDetails {
|
|
8
|
+
readonly status: ResultType;
|
|
9
|
+
}
|
|
10
|
+
export type RootResult<Q extends AnyQuery> = readonly [data: RootData<Q>, details: RootDetails];
|
|
11
|
+
export type RootRefResult<Q extends AnyQuery, F extends Fragment<any, any, any, any>> = readonly [data: RootRefData<Q, F>, details: RootDetails];
|
|
5
12
|
export type { ResultType } from "@rindle/client";
|
|
6
|
-
export type { Fragment, FragmentRef } from "@rindle/client";
|
|
13
|
+
export type { Fragment, FragmentData, FragmentRef } from "@rindle/client";
|
|
14
|
+
export { fragmentKey } from "@rindle/client";
|
|
7
15
|
export interface RindleProps<S extends ColsMap = ColsMap> {
|
|
8
16
|
store: Store<S>;
|
|
9
17
|
children?: ReactNode;
|
|
@@ -12,9 +20,17 @@ interface QueryLease {
|
|
|
12
20
|
id: number;
|
|
13
21
|
viewKey: string;
|
|
14
22
|
}
|
|
23
|
+
interface SyncLease {
|
|
24
|
+
id: number;
|
|
25
|
+
coverageKey: string;
|
|
26
|
+
}
|
|
27
|
+
interface QueryCacheOptions {
|
|
28
|
+
releaseDelayMs?: number;
|
|
29
|
+
}
|
|
15
30
|
declare class RindleContextValue {
|
|
16
31
|
readonly store: Store<ColsMap>;
|
|
17
32
|
readonly cache: QueryCache;
|
|
33
|
+
readonly syncCache: SyncQueryCache;
|
|
18
34
|
constructor(store: Store<ColsMap>);
|
|
19
35
|
}
|
|
20
36
|
export declare function Rindle<S extends ColsMap>({ store, children }: RindleProps<S>): import("react").FunctionComponentElement<import("react").ProviderProps<RindleContextValue | null>>;
|
|
@@ -28,27 +44,65 @@ export declare function useQuery<Q extends AnyQuery>(query: Q): QueryData<Q>;
|
|
|
28
44
|
* as {@link useQuery} (so reading both for one query is one subscription), and re-renders only when
|
|
29
45
|
* the status changes. */
|
|
30
46
|
export declare function useQueryStatus(query: AnyQuery): ResultType;
|
|
47
|
+
/** Retain a named server query for normalized/local-first sync coverage without subscribing React
|
|
48
|
+
* to that query's broad result tree. The returned value is lifecycle state only; it is `unknown`
|
|
49
|
+
* until the backend reports that the retained coverage has hydrated. */
|
|
50
|
+
export declare function useSyncQuery(query: AnyQuery): ResultType;
|
|
51
|
+
/** Run a named root query and expose its local React-facing data. Fragment child relationships are
|
|
52
|
+
* refs, so child components can keep owning their own local reads. Passing a root fragment as the
|
|
53
|
+
* final argument switches the result to opaque root refs for that fragment. */
|
|
54
|
+
export declare function useRoot<Q extends AnyQuery>(query: Q): RootResult<Q>;
|
|
55
|
+
export declare function useRoot<Q extends AnyQuery, F extends AnyFragment>(query: Q, fragment: F): RootRefResult<Q, F>;
|
|
56
|
+
export declare function useRoot<Q extends AnyQuery>(query: NamedQuery<void, [], Q>): RootResult<Q>;
|
|
57
|
+
export declare function useRoot<Q extends AnyQuery, F extends AnyFragment>(query: NamedQuery<void, [], Q>, fragment: F): RootRefResult<Q, F>;
|
|
58
|
+
export declare function useRoot<Args, Ctx extends readonly unknown[], Q extends AnyQuery>(query: NamedQuery<Args, Ctx, Q>, args: Args, ...ctx: Ctx): RootResult<Q>;
|
|
59
|
+
export declare function useRoot<Args, Ctx extends readonly unknown[], Q extends AnyQuery, F extends AnyFragment>(query: NamedQuery<Args, Ctx, Q>, args: Args, ...ctxAndFragment: [...ctx: Ctx, fragment: F]): RootRefResult<Q, F>;
|
|
31
60
|
/**
|
|
32
|
-
* Read a {@link Fragment}'s
|
|
61
|
+
* Read a {@link Fragment}'s local data from an opaque ref.
|
|
33
62
|
*
|
|
34
|
-
* The
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* a descendant that opens its own `useQuery` reintroduces the waterfall at that boundary.
|
|
63
|
+
* The query boundary calls {@link useRoot} with a fragment argument to retain the full named
|
|
64
|
+
* coverage query and receive root refs. Descendants call `useFragment` with those refs (or child
|
|
65
|
+
* refs returned by a parent fragment read) to open narrow local-only reads for the fields their
|
|
66
|
+
* fragment owns.
|
|
39
67
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
|
|
44
|
-
|
|
68
|
+
* `ref` is an opaque token created by {@link useRoot} or returned from another local fragment read.
|
|
69
|
+
* The hook opens a narrow local-only query for this exact fragment and keeps the root coverage
|
|
70
|
+
* lease retained while mounted. Passing a legacy projected data object is unsupported.
|
|
71
|
+
*/
|
|
72
|
+
export declare function useFragment<F extends Fragment<any, any, any, any>>(fragment: F, ref: FragmentRef<F> | null | undefined): FragmentData<F> | null;
|
|
73
|
+
/**
|
|
74
|
+
* Render-prop sugar over {@link useFragment}: does the `null` check once. `from` is a fragment ref
|
|
75
|
+
* (or null/undefined — an absent to-one relationship, an emptied `.one()`, or a row deleted out from
|
|
76
|
+
* under a live read); when the row is present `children(data)` renders, otherwise `fallback` (default
|
|
77
|
+
* nothing). Keeps the per-row subscription isolation — a child-only edit re-renders just this read.
|
|
45
78
|
*/
|
|
46
|
-
export declare function
|
|
79
|
+
export declare function Frag<F extends AnyFragment>({ of, from, fallback, children }: {
|
|
80
|
+
of: F;
|
|
81
|
+
from: FragmentRef<F> | null | undefined;
|
|
82
|
+
fallback?: ReactNode;
|
|
83
|
+
children: (data: FragmentData<F>) => ReactNode;
|
|
84
|
+
}): ReactNode;
|
|
85
|
+
export declare class SyncQueryCache {
|
|
86
|
+
private readonly entries;
|
|
87
|
+
private nextLeaseId;
|
|
88
|
+
private readonly store;
|
|
89
|
+
private readonly releaseDelayMs;
|
|
90
|
+
constructor(store: Store<ColsMap>, opts?: QueryCacheOptions);
|
|
91
|
+
retain(coverageKey: string, query: AnyQuery): SyncLease;
|
|
92
|
+
release(lease: SyncLease): void;
|
|
93
|
+
subscribe(coverageKey: string, listener: () => void): () => void;
|
|
94
|
+
resultType(coverageKey: string): ResultType;
|
|
95
|
+
size(): number;
|
|
96
|
+
private createHandle;
|
|
97
|
+
private scheduleRelease;
|
|
98
|
+
private finalizeRelease;
|
|
99
|
+
}
|
|
47
100
|
export declare class QueryCache {
|
|
48
101
|
private readonly entries;
|
|
49
102
|
private nextLeaseId;
|
|
50
103
|
private readonly store;
|
|
51
|
-
|
|
104
|
+
private readonly releaseDelayMs;
|
|
105
|
+
constructor(store: Store<ColsMap>, opts?: QueryCacheOptions);
|
|
52
106
|
retain<Q extends AnyQuery>(viewKey: string, query: Q): QueryLease;
|
|
53
107
|
release(lease: QueryLease): void;
|
|
54
108
|
subscribe(viewKey: string, listener: () => void): () => void;
|
|
@@ -69,6 +123,8 @@ export declare class QueryCache {
|
|
|
69
123
|
private createMaterializedLease;
|
|
70
124
|
private chooseCanonical;
|
|
71
125
|
private setCanonical;
|
|
126
|
+
private scheduleSplitRelease;
|
|
127
|
+
private finalizeSplitRelease;
|
|
72
128
|
}
|
|
73
129
|
export declare function queryCacheKey(query: AnyQuery): string;
|
|
74
130
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|