@parcae/sdk 0.3.3 → 0.4.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/dist/chunk-DAHSIKBD.js +845 -0
- package/dist/chunk-DAHSIKBD.js.map +1 -0
- package/dist/client-0OLcV8PA.d.ts +38 -0
- package/dist/index.d.ts +41 -23
- package/dist/index.js +1 -1
- package/dist/react/index.d.ts +11 -28
- package/dist/react/index.js +103 -85
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-IETH2XOR.js +0 -432
- package/dist/chunk-IETH2XOR.js.map +0 -1
- package/dist/client-uWUdynht.d.ts +0 -63
package/dist/react/index.js
CHANGED
|
@@ -1,14 +1,66 @@
|
|
|
1
|
-
import { createClient } from '../chunk-
|
|
2
|
-
import { createContext, useContext,
|
|
1
|
+
import { createClient, subscribe, snapshot, isChanged, createProxy, affectedToPathList } from '../chunk-DAHSIKBD.js';
|
|
2
|
+
import { createContext, useContext, useMemo, useRef, useEffect, useSyncExternalStore, useState, useCallback, useLayoutEffect, useDebugValue } from 'react';
|
|
3
3
|
import { jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
5
|
+
var useAffectedDebugValue = (state, affected) => {
|
|
6
|
+
const pathList = useRef(void 0);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
pathList.current = affectedToPathList(state, affected, true);
|
|
9
|
+
});
|
|
10
|
+
useDebugValue(pathList.current);
|
|
11
|
+
};
|
|
12
|
+
var condUseAffectedDebugValue = useAffectedDebugValue;
|
|
13
|
+
var targetCache = /* @__PURE__ */ new WeakMap();
|
|
14
|
+
function useSnapshot(proxyObject, options) {
|
|
15
|
+
const notifyInSync = void 0 ;
|
|
16
|
+
const affected = useMemo(
|
|
17
|
+
() => proxyObject && /* @__PURE__ */ new WeakMap(),
|
|
18
|
+
[proxyObject]
|
|
19
|
+
);
|
|
20
|
+
const lastSnapshot = useRef(void 0);
|
|
21
|
+
let inRender = true;
|
|
22
|
+
const currSnapshot = useSyncExternalStore(
|
|
23
|
+
useCallback(
|
|
24
|
+
(callback) => {
|
|
25
|
+
const unsub = subscribe(proxyObject, callback, notifyInSync);
|
|
26
|
+
callback();
|
|
27
|
+
return unsub;
|
|
28
|
+
},
|
|
29
|
+
[proxyObject, notifyInSync]
|
|
30
|
+
),
|
|
31
|
+
() => {
|
|
32
|
+
const nextSnapshot = snapshot(proxyObject);
|
|
33
|
+
try {
|
|
34
|
+
if (!inRender && lastSnapshot.current && !isChanged(
|
|
35
|
+
lastSnapshot.current,
|
|
36
|
+
nextSnapshot,
|
|
37
|
+
affected,
|
|
38
|
+
/* @__PURE__ */ new WeakMap()
|
|
39
|
+
)) {
|
|
40
|
+
return lastSnapshot.current;
|
|
41
|
+
}
|
|
42
|
+
} catch (e) {
|
|
43
|
+
}
|
|
44
|
+
return nextSnapshot;
|
|
45
|
+
},
|
|
46
|
+
() => snapshot(proxyObject)
|
|
47
|
+
);
|
|
48
|
+
inRender = false;
|
|
49
|
+
useLayoutEffect(() => {
|
|
50
|
+
lastSnapshot.current = currSnapshot;
|
|
51
|
+
});
|
|
52
|
+
if ((import.meta.env ? import.meta.env.MODE : void 0) !== "production") {
|
|
53
|
+
condUseAffectedDebugValue(currSnapshot, affected);
|
|
54
|
+
}
|
|
55
|
+
const proxyCache = useMemo(() => /* @__PURE__ */ new WeakMap(), []);
|
|
56
|
+
return createProxy(currSnapshot, affected, proxyCache, targetCache);
|
|
57
|
+
}
|
|
5
58
|
var ParcaeContext = createContext(null);
|
|
6
59
|
function useParcae() {
|
|
7
|
-
const
|
|
8
|
-
if (!
|
|
60
|
+
const client = useContext(ParcaeContext);
|
|
61
|
+
if (!client)
|
|
9
62
|
throw new Error("useParcae must be used within a <ParcaeProvider>");
|
|
10
|
-
|
|
11
|
-
return ctx;
|
|
63
|
+
return client;
|
|
12
64
|
}
|
|
13
65
|
var ParcaeProvider = ({
|
|
14
66
|
client: externalClient,
|
|
@@ -21,43 +73,23 @@ var ParcaeProvider = ({
|
|
|
21
73
|
onReady,
|
|
22
74
|
onError
|
|
23
75
|
}) => {
|
|
24
|
-
const [authState, setAuthState] = useState(
|
|
25
|
-
// If apiKey is undefined, the frontend auth provider is still loading.
|
|
26
|
-
// If apiKey is null, the user is not logged in.
|
|
27
|
-
// If apiKey is a string, we have a token but haven't verified it yet.
|
|
28
|
-
apiKey === void 0 ? "loading" : apiKey === null ? "unauthenticated" : "loading"
|
|
29
|
-
);
|
|
30
|
-
const [authVersion, setAuthVersion] = useState(0);
|
|
31
76
|
const client = useMemo(() => {
|
|
32
77
|
if (externalClient) return externalClient;
|
|
33
78
|
if (!url)
|
|
34
79
|
throw new Error(
|
|
35
|
-
"ParcaeProvider requires either a `client`
|
|
80
|
+
"ParcaeProvider requires either a `client` or `url` prop"
|
|
36
81
|
);
|
|
37
|
-
return createClient({ url, version, transport,
|
|
82
|
+
return createClient({ url, version, transport, token: apiKey });
|
|
38
83
|
}, [externalClient, url, version, transport]);
|
|
39
84
|
const onReadyRef = useRef(onReady);
|
|
40
85
|
onReadyRef.current = onReady;
|
|
41
86
|
const onErrorRef = useRef(onError);
|
|
42
87
|
onErrorRef.current = onError;
|
|
43
88
|
useEffect(() => {
|
|
44
|
-
if (apiKey === void 0)
|
|
45
|
-
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (apiKey === null) {
|
|
49
|
-
setAuthState("unauthenticated");
|
|
50
|
-
setAuthVersion((v) => v + 1);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
setAuthState("loading");
|
|
54
|
-
client.setKey(apiKey).then(() => {
|
|
55
|
-
setAuthState("authenticated");
|
|
56
|
-
setAuthVersion((v) => v + 1);
|
|
89
|
+
if (apiKey === void 0) return;
|
|
90
|
+
client.authenticate(apiKey).then(() => {
|
|
57
91
|
onReadyRef.current?.(client);
|
|
58
92
|
}).catch((err) => {
|
|
59
|
-
setAuthState("unauthenticated");
|
|
60
|
-
setAuthVersion((v) => v + 1);
|
|
61
93
|
onErrorRef.current?.(err);
|
|
62
94
|
});
|
|
63
95
|
}, [apiKey, userId, client]);
|
|
@@ -68,11 +100,7 @@ var ParcaeProvider = ({
|
|
|
68
100
|
client.off("error", onErr);
|
|
69
101
|
};
|
|
70
102
|
}, [client]);
|
|
71
|
-
|
|
72
|
-
() => ({ client, authState, authVersion }),
|
|
73
|
-
[client, authState, authVersion]
|
|
74
|
-
);
|
|
75
|
-
return /* @__PURE__ */ jsx(ParcaeContext.Provider, { value: contextValue, children });
|
|
103
|
+
return /* @__PURE__ */ jsx(ParcaeContext.Provider, { value: client, children });
|
|
76
104
|
};
|
|
77
105
|
var cache = /* @__PURE__ */ new Map();
|
|
78
106
|
var GC_DELAY = 6e4;
|
|
@@ -96,7 +124,7 @@ function getOrCreate(key) {
|
|
|
96
124
|
function notify(e) {
|
|
97
125
|
for (const fn of e.listeners) fn();
|
|
98
126
|
}
|
|
99
|
-
function doFetch(key, entry, chain
|
|
127
|
+
function doFetch(key, entry, chain) {
|
|
100
128
|
entry.loading = true;
|
|
101
129
|
entry.error = null;
|
|
102
130
|
notify(entry);
|
|
@@ -109,45 +137,23 @@ function doFetch(key, entry, chain, client) {
|
|
|
109
137
|
entry.loading = false;
|
|
110
138
|
notify(entry);
|
|
111
139
|
});
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const map = new Map(entry.items.map((i) => [i.id, i]));
|
|
117
|
-
let changed = false;
|
|
118
|
-
for (const op of ops) {
|
|
119
|
-
if (op.op === "add" && !map.has(op.id) && op.data && chain.__modelClass) {
|
|
120
|
-
map.set(op.id, new chain.__modelClass(chain.__adapter, op.data));
|
|
121
|
-
changed = true;
|
|
122
|
-
} else if (op.op === "remove" && map.has(op.id)) {
|
|
123
|
-
map.delete(op.id);
|
|
124
|
-
changed = true;
|
|
125
|
-
} else if (op.op === "update" && map.has(op.id) && op.data) {
|
|
126
|
-
const existing = map.get(op.id);
|
|
127
|
-
for (const [k, v] of Object.entries(op.data))
|
|
128
|
-
existing[k] = v;
|
|
129
|
-
changed = true;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
if (changed) {
|
|
133
|
-
entry.items = [...map.values()];
|
|
134
|
-
notify(entry);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
entry.dispose = () => {
|
|
138
|
-
unsub();
|
|
139
|
-
entry.dispose = null;
|
|
140
|
-
};
|
|
141
|
-
}
|
|
140
|
+
}
|
|
141
|
+
function getAuthGate(client) {
|
|
142
|
+
const transport = client.transport;
|
|
143
|
+
return transport?.auth?.state ?? null;
|
|
142
144
|
}
|
|
143
145
|
function useQuery(chain, options = {}) {
|
|
144
|
-
const
|
|
146
|
+
const client = useParcae();
|
|
145
147
|
const waitForAuth = options.waitForAuth ?? true;
|
|
146
|
-
const
|
|
148
|
+
const authGate = getAuthGate(client);
|
|
149
|
+
const authSnap = authGate ? useSnapshot(authGate) : null;
|
|
150
|
+
const authStatus = authSnap?.status ?? "pending";
|
|
151
|
+
const authVersion = authSnap?.version ?? 0;
|
|
152
|
+
const authReady = !waitForAuth || authStatus !== "pending";
|
|
147
153
|
const key = chain && authReady ? `${chain.__modelType}:${authVersion}:${JSON.stringify(chain.__steps ?? [])}` : null;
|
|
148
154
|
const keyRef = useRef(key);
|
|
149
155
|
keyRef.current = key;
|
|
150
|
-
const
|
|
156
|
+
const subscribe2 = (onChange) => {
|
|
151
157
|
const k = keyRef.current;
|
|
152
158
|
if (!k) return () => {
|
|
153
159
|
};
|
|
@@ -175,7 +181,7 @@ function useQuery(chain, options = {}) {
|
|
|
175
181
|
return cache.get(k)?.items ?? EMPTY;
|
|
176
182
|
};
|
|
177
183
|
const items = useSyncExternalStore(
|
|
178
|
-
|
|
184
|
+
subscribe2,
|
|
179
185
|
getSnapshot,
|
|
180
186
|
getSnapshot
|
|
181
187
|
);
|
|
@@ -183,12 +189,12 @@ function useQuery(chain, options = {}) {
|
|
|
183
189
|
if (!key || !chain) return;
|
|
184
190
|
const entry2 = getOrCreate(key);
|
|
185
191
|
if (entry2.items === EMPTY) {
|
|
186
|
-
doFetch(key, entry2, chain
|
|
192
|
+
doFetch(key, entry2, chain);
|
|
187
193
|
}
|
|
188
194
|
}, [key]);
|
|
189
195
|
const refetch = () => {
|
|
190
196
|
if (!key || !chain) return;
|
|
191
|
-
doFetch(key, getOrCreate(key), chain
|
|
197
|
+
doFetch(key, getOrCreate(key), chain);
|
|
192
198
|
};
|
|
193
199
|
if (!key)
|
|
194
200
|
return {
|
|
@@ -207,7 +213,7 @@ function useQuery(chain, options = {}) {
|
|
|
207
213
|
};
|
|
208
214
|
}
|
|
209
215
|
function useApi() {
|
|
210
|
-
const
|
|
216
|
+
const client = useParcae();
|
|
211
217
|
return useMemo(
|
|
212
218
|
() => ({
|
|
213
219
|
get: client.get.bind(client),
|
|
@@ -220,34 +226,46 @@ function useApi() {
|
|
|
220
226
|
);
|
|
221
227
|
}
|
|
222
228
|
function useSDK() {
|
|
223
|
-
return useParcae()
|
|
229
|
+
return useParcae();
|
|
224
230
|
}
|
|
225
231
|
function useConnectionStatus() {
|
|
226
|
-
const
|
|
232
|
+
const client = useParcae();
|
|
233
|
+
const transport = client.transport;
|
|
234
|
+
const authState = transport?.auth?.state;
|
|
235
|
+
const snap = authState ? useSnapshot(authState) : null;
|
|
227
236
|
return {
|
|
228
237
|
isConnected: client.isConnected,
|
|
229
|
-
|
|
230
|
-
authState
|
|
238
|
+
authStatus: snap?.status ?? "pending"
|
|
231
239
|
};
|
|
232
240
|
}
|
|
233
241
|
function useAuthState() {
|
|
234
|
-
|
|
242
|
+
const client = useParcae();
|
|
243
|
+
const transport = client.transport;
|
|
244
|
+
const authState = transport?.auth?.state;
|
|
245
|
+
const snap = authState ? useSnapshot(authState) : null;
|
|
246
|
+
return {
|
|
247
|
+
status: snap?.status ?? "pending",
|
|
248
|
+
userId: snap?.userId ?? null,
|
|
249
|
+
version: snap?.version ?? 0
|
|
250
|
+
};
|
|
235
251
|
}
|
|
236
252
|
function useSetting(key, defaultValue) {
|
|
237
|
-
const
|
|
253
|
+
const client = useParcae();
|
|
254
|
+
const transport = client.transport;
|
|
255
|
+
const authState = transport?.auth?.state;
|
|
256
|
+
const snap = authState ? useSnapshot(authState) : null;
|
|
257
|
+
const authStatus = snap?.status ?? "pending";
|
|
238
258
|
const [value, setValue] = useState(defaultValue);
|
|
239
259
|
const [isLoading, setIsLoading] = useState(true);
|
|
240
260
|
useEffect(() => {
|
|
241
|
-
if (
|
|
242
|
-
if (
|
|
261
|
+
if (authStatus === "pending") return;
|
|
262
|
+
if (authStatus === "unauthenticated") {
|
|
243
263
|
setIsLoading(false);
|
|
244
264
|
return;
|
|
245
265
|
}
|
|
246
266
|
let cancelled = false;
|
|
247
267
|
client.get(`/settings/${encodeURIComponent(key)}`).then((result) => {
|
|
248
|
-
if (!cancelled && result?.value !== void 0)
|
|
249
|
-
setValue(result.value);
|
|
250
|
-
}
|
|
268
|
+
if (!cancelled && result?.value !== void 0) setValue(result.value);
|
|
251
269
|
}).catch(() => {
|
|
252
270
|
}).finally(() => {
|
|
253
271
|
if (!cancelled) setIsLoading(false);
|
|
@@ -255,7 +273,7 @@ function useSetting(key, defaultValue) {
|
|
|
255
273
|
return () => {
|
|
256
274
|
cancelled = true;
|
|
257
275
|
};
|
|
258
|
-
}, [key, client,
|
|
276
|
+
}, [key, client, authStatus]);
|
|
259
277
|
const update = useCallback(
|
|
260
278
|
async (newValue) => {
|
|
261
279
|
setValue(newValue);
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/context.ts","../../src/react/Provider.tsx","../../src/react/useQuery.ts","../../src/react/useApi.ts","../../src/react/useSetting.ts"],"names":["useRef","useEffect","entry","useMemo","useState","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ParcaeClient } from \"../client\";\n\nexport type AuthState = \"loading\" | \"authenticated\" | \"unauthenticated\";\n\nexport interface ParcaeContextValue {\n client: ParcaeClient;\n authState: AuthState;\n authVersion: number;\n}\n\nexport const ParcaeContext = createContext<ParcaeContextValue | null>(null);\n\nexport function useParcae(): ParcaeContextValue {\n const ctx = useContext(ParcaeContext);\n if (!ctx) {\n throw new Error(\"useParcae must be used within a <ParcaeProvider>\");\n }\n return ctx;\n}\n","\"use client\";\n\nimport React, {\n useEffect,\n useMemo,\n useRef,\n useState,\n useCallback,\n} from \"react\";\nimport { createClient } from \"../client\";\nimport type { ParcaeClient, ClientConfig } from \"../client\";\nimport { ParcaeContext } from \"./context\";\nimport type { ParcaeContextValue, AuthState } from \"./context\";\n\nexport interface ParcaeProviderProps {\n /** Pre-created client instance. If provided, url/key/transport are ignored. */\n client?: ParcaeClient;\n /** API base URL (required if no client provided). */\n url?: string;\n /** Bearer token, null (no session), or undefined (still loading). */\n apiKey?: string | null | undefined;\n /** Stable user ID — triggers re-auth when it changes. */\n userId?: string | null;\n /** API version. Default: \"v1\" */\n version?: string;\n /** Transport type. Default: \"socket\" */\n transport?: ClientConfig[\"transport\"];\n children: React.ReactNode;\n onReady?: (client: ParcaeClient) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ParcaeProvider: React.FC<ParcaeProviderProps> = ({\n client: externalClient,\n url,\n apiKey,\n userId,\n version = \"v1\",\n transport = \"socket\",\n children,\n onReady,\n onError,\n}) => {\n const [authState, setAuthState] = useState<AuthState>(\n // If apiKey is undefined, the frontend auth provider is still loading.\n // If apiKey is null, the user is not logged in.\n // If apiKey is a string, we have a token but haven't verified it yet.\n apiKey === undefined\n ? \"loading\"\n : apiKey === null\n ? \"unauthenticated\"\n : \"loading\",\n );\n const [authVersion, setAuthVersion] = useState(0);\n\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n if (!url)\n throw new Error(\n \"ParcaeProvider requires either a `client` prop or a `url` prop\",\n );\n return createClient({ url, version, transport, key: null });\n }, [externalClient, url, version, transport]);\n\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n // Authenticate when apiKey changes\n useEffect(() => {\n // apiKey is undefined → frontend auth still loading, do nothing\n if (apiKey === undefined) {\n setAuthState(\"loading\");\n return;\n }\n\n // apiKey is null → user is not logged in\n if (apiKey === null) {\n setAuthState(\"unauthenticated\");\n setAuthVersion((v) => v + 1);\n return;\n }\n\n // apiKey is a string → send to backend for verification\n setAuthState(\"loading\");\n client\n .setKey(apiKey)\n .then(() => {\n setAuthState(\"authenticated\");\n setAuthVersion((v) => v + 1);\n onReadyRef.current?.(client);\n })\n .catch((err) => {\n setAuthState(\"unauthenticated\");\n setAuthVersion((v) => v + 1);\n onErrorRef.current?.(err);\n });\n }, [apiKey, userId, client]);\n\n useEffect(() => {\n const onErr = (err: Error) => onErrorRef.current?.(err);\n client.on(\"error\", onErr);\n return () => {\n client.off(\"error\", onErr);\n };\n }, [client]);\n\n const contextValue = useMemo<ParcaeContextValue>(\n () => ({ client, authState, authVersion }),\n [client, authState, authVersion],\n );\n\n return (\n <ParcaeContext.Provider value={contextValue}>\n {children}\n </ParcaeContext.Provider>\n );\n};\n\nexport default ParcaeProvider;\n","\"use client\";\n\n/**\n * useQuery — calls chain.find() via socket RPC, subscribes to diffs automatically.\n *\n * No separate subscribe:query event. The server auto-subscribes when you\n * query a list endpoint. Diffs arrive on the same query key.\n */\n\nimport { useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { useParcae } from \"./context\";\nimport type { ParcaeClient } from \"../client\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ninterface QueryChain<T> {\n find(): Promise<T[]>;\n __steps?: any[];\n __modelType?: string;\n __modelClass?: any;\n __adapter?: any;\n}\n\ninterface UseQueryOptions {\n waitForAuth?: boolean;\n}\n\ninterface UseQueryResult<T> {\n items: T[];\n loading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n// ─── External Cache ──────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n items: any[];\n loading: boolean;\n error: Error | null;\n refs: number;\n listeners: Set<() => void>;\n dispose: (() => void) | null;\n gcTimer: ReturnType<typeof setTimeout> | null;\n}\n\nconst cache = new Map<string, CacheEntry>();\nconst GC_DELAY = 60_000;\nconst EMPTY: any[] = [];\n\nfunction getOrCreate(key: string): CacheEntry {\n let e = cache.get(key);\n if (!e) {\n e = {\n items: EMPTY,\n loading: true,\n error: null,\n refs: 0,\n listeners: new Set(),\n dispose: null,\n gcTimer: null,\n };\n cache.set(key, e);\n }\n return e;\n}\n\nfunction notify(e: CacheEntry): void {\n for (const fn of e.listeners) fn();\n}\n\n// ─── Fetch via chain.find() ──────────────────────────────────────────────────\n\nfunction doFetch(\n key: string,\n entry: CacheEntry,\n chain: QueryChain<any>,\n client: ParcaeClient,\n): void {\n entry.loading = true;\n entry.error = null;\n notify(entry);\n\n chain\n .find()\n .then((result: any[]) => {\n entry.items = result;\n entry.loading = false;\n notify(entry);\n })\n .catch((err: Error) => {\n entry.error = err;\n entry.loading = false;\n notify(entry);\n });\n\n // Listen for realtime diffs (server auto-subscribes on the call)\n if (!entry.dispose && chain.__modelType) {\n const diffEvent = `query:diff:${key}`;\n\n const unsub = client.subscribe(diffEvent, (ops: any[]) => {\n if (!ops?.length) return;\n\n const map = new Map(entry.items.map((i: any) => [i.id, i]));\n let changed = false;\n\n for (const op of ops) {\n if (\n op.op === \"add\" &&\n !map.has(op.id) &&\n op.data &&\n chain.__modelClass\n ) {\n map.set(op.id, new chain.__modelClass(chain.__adapter, op.data));\n changed = true;\n } else if (op.op === \"remove\" && map.has(op.id)) {\n map.delete(op.id);\n changed = true;\n } else if (op.op === \"update\" && map.has(op.id) && op.data) {\n const existing = map.get(op.id);\n for (const [k, v] of Object.entries(op.data))\n (existing as any)[k] = v;\n changed = true;\n }\n }\n\n if (changed) {\n entry.items = [...map.values()];\n notify(entry);\n }\n });\n\n entry.dispose = () => {\n unsub();\n entry.dispose = null;\n };\n }\n}\n\n// ─── useQuery ────────────────────────────────────────────────────────────────\n\nexport function useQuery<T>(\n chain: QueryChain<T> | null | undefined,\n options: UseQueryOptions = {},\n): UseQueryResult<T> {\n const { client, authState, authVersion } = useParcae();\n const waitForAuth = options.waitForAuth ?? true;\n const authReady = !waitForAuth || authState !== \"loading\";\n\n const key =\n chain && authReady\n ? `${chain.__modelType}:${authVersion}:${JSON.stringify(chain.__steps ?? [])}`\n : null;\n\n const keyRef = useRef(key);\n keyRef.current = key;\n\n const subscribe = (onChange: () => void) => {\n const k = keyRef.current;\n if (!k) return () => {};\n const e = getOrCreate(k);\n e.refs++;\n e.listeners.add(onChange);\n if (e.gcTimer) {\n clearTimeout(e.gcTimer);\n e.gcTimer = null;\n }\n return () => {\n e.listeners.delete(onChange);\n e.refs--;\n if (e.refs <= 0) {\n e.gcTimer = setTimeout(() => {\n e.dispose?.();\n cache.delete(k);\n }, GC_DELAY);\n }\n };\n };\n\n const getSnapshot = (): any[] => {\n const k = keyRef.current;\n if (!k) return EMPTY;\n return cache.get(k)?.items ?? EMPTY;\n };\n\n const items = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n ) as T[];\n\n useEffect(() => {\n if (!key || !chain) return;\n const entry = getOrCreate(key);\n if (entry.items === EMPTY) {\n doFetch(key, entry, chain, client);\n }\n }, [key]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const refetch = () => {\n if (!key || !chain) return;\n doFetch(key, getOrCreate(key), chain, client);\n };\n\n if (!key)\n return {\n items: EMPTY as T[],\n loading: !authReady,\n error: null,\n refetch: () => {},\n };\n\n const entry = cache.get(key);\n return {\n items,\n loading: entry?.loading ?? true,\n error: entry?.error ?? null,\n refetch,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useParcae } from \"./context\";\n\nexport function useApi() {\n const { client } = useParcae();\n\n return useMemo(\n () => ({\n get: client.get.bind(client),\n post: client.post.bind(client),\n put: client.put.bind(client),\n patch: client.patch.bind(client),\n delete: client.delete.bind(client),\n }),\n [client],\n );\n}\n\n/**\n * useSDK — raw client instance.\n */\nexport function useSDK() {\n return useParcae().client;\n}\n\n/**\n * useConnectionStatus — connection + auth state.\n */\nexport function useConnectionStatus() {\n const { client, authState } = useParcae();\n return {\n isConnected: client.isConnected,\n isLoading: client.isLoading,\n authState,\n };\n}\n\n/**\n * useAuthState — just the auth state.\n */\nexport function useAuthState() {\n return useParcae().authState;\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useParcae } from \"./context\";\n\nexport function useSetting<T = string>(\n key: string,\n defaultValue: T,\n): [T, (value: T) => Promise<void>, { isLoading: boolean }] {\n const { client, authState } = useParcae();\n const [value, setValue] = useState<T>(defaultValue);\n const [isLoading, setIsLoading] = useState(true);\n\n // Wait for auth before fetching settings (they're user-scoped)\n useEffect(() => {\n if (authState === \"loading\") return;\n if (authState === \"unauthenticated\") {\n setIsLoading(false);\n return;\n }\n\n let cancelled = false;\n\n client\n .get(`/settings/${encodeURIComponent(key)}`)\n .then((result) => {\n if (!cancelled && result?.value !== undefined) {\n setValue(result.value);\n }\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [key, client, authState]);\n\n const update = useCallback(\n async (newValue: T) => {\n setValue(newValue);\n await client.put(`/settings/${encodeURIComponent(key)}`, {\n value: newValue,\n });\n },\n [key, client],\n );\n\n return [value, update, { isLoading }];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/.pnpm/valtio@2.3.1_@types+react@19.2.14_react@19.2.4/node_modules/valtio/esm/react.mjs","../../src/react/context.ts","../../src/react/Provider.tsx","../../src/react/useQuery.ts","../../src/react/useApi.ts","../../src/react/useSetting.ts"],"names":["useMemo","useRef","useEffect","subscribe","useSyncExternalStore","entry","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import { useMemo, useRef, useSyncExternalStore, useCallback, useLayoutEffect, useEffect, useDebugValue } from 'react';\nimport { isChanged, createProxy, affectedToPathList } from 'proxy-compare';\nimport { subscribe, snapshot } from 'valtio/vanilla';\n\nconst useAffectedDebugValue = (state, affected) => {\n const pathList = useRef(void 0);\n useEffect(() => {\n pathList.current = affectedToPathList(state, affected, true);\n });\n useDebugValue(pathList.current);\n};\nconst condUseAffectedDebugValue = useAffectedDebugValue;\nconst targetCache = /* @__PURE__ */ new WeakMap();\nfunction useSnapshot(proxyObject, options) {\n const notifyInSync = options == null ? void 0 : options.sync;\n const affected = useMemo(\n () => proxyObject && /* @__PURE__ */ new WeakMap(),\n [proxyObject]\n );\n const lastSnapshot = useRef(void 0);\n let inRender = true;\n const currSnapshot = useSyncExternalStore(\n useCallback(\n (callback) => {\n const unsub = subscribe(proxyObject, callback, notifyInSync);\n callback();\n return unsub;\n },\n [proxyObject, notifyInSync]\n ),\n () => {\n const nextSnapshot = snapshot(proxyObject);\n try {\n if (!inRender && lastSnapshot.current && !isChanged(\n lastSnapshot.current,\n nextSnapshot,\n affected,\n /* @__PURE__ */ new WeakMap()\n )) {\n return lastSnapshot.current;\n }\n } catch (e) {\n }\n return nextSnapshot;\n },\n () => snapshot(proxyObject)\n );\n inRender = false;\n useLayoutEffect(() => {\n lastSnapshot.current = currSnapshot;\n });\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n condUseAffectedDebugValue(currSnapshot, affected);\n }\n const proxyCache = useMemo(() => /* @__PURE__ */ new WeakMap(), []);\n return createProxy(currSnapshot, affected, proxyCache, targetCache);\n}\n\nexport { useSnapshot };\n","import { createContext, useContext } from \"react\";\nimport type { ParcaeClient } from \"../client\";\n\nexport const ParcaeContext = createContext<ParcaeClient | null>(null);\n\nexport function useParcae(): ParcaeClient {\n const client = useContext(ParcaeContext);\n if (!client)\n throw new Error(\"useParcae must be used within a <ParcaeProvider>\");\n return client;\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport { createClient } from \"../client\";\nimport type { ParcaeClient, ClientConfig } from \"../client\";\nimport { ParcaeContext } from \"./context\";\n\nexport interface ParcaeProviderProps {\n client?: ParcaeClient;\n url?: string;\n /** undefined = auth loading, null = no session, string = token */\n apiKey?: string | null | undefined;\n userId?: string | null;\n version?: string;\n transport?: ClientConfig[\"transport\"];\n children: React.ReactNode;\n onReady?: (client: ParcaeClient) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ParcaeProvider: React.FC<ParcaeProviderProps> = ({\n client: externalClient,\n url,\n apiKey,\n userId,\n version = \"v1\",\n transport = \"socket\",\n children,\n onReady,\n onError,\n}) => {\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n if (!url)\n throw new Error(\n \"ParcaeProvider requires either a `client` or `url` prop\",\n );\n return createClient({ url, version, transport, token: apiKey });\n }, [externalClient, url, version, transport]);\n\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n // When apiKey changes, re-authenticate\n useEffect(() => {\n if (apiKey === undefined) return;\n client\n .authenticate(apiKey)\n .then(() => {\n onReadyRef.current?.(client);\n })\n .catch((err: Error) => {\n onErrorRef.current?.(err);\n });\n }, [apiKey, userId, client]);\n\n useEffect(() => {\n const onErr = (err: Error) => onErrorRef.current?.(err);\n client.on(\"error\", onErr);\n return () => {\n client.off(\"error\", onErr);\n };\n }, [client]);\n\n return (\n <ParcaeContext.Provider value={client}>{children}</ParcaeContext.Provider>\n );\n};\n\nexport default ParcaeProvider;\n","\"use client\";\n\n/**\n * useQuery — reactive data fetching. Auth state from Valtio snapshot.\n */\n\nimport { useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport { useParcae } from \"./context\";\nimport type { ParcaeClient } from \"../client\";\nimport type { AuthState } from \"../auth-gate\";\n\ninterface QueryChain<T> {\n find(): Promise<T[]>;\n __steps?: any[];\n __modelType?: string;\n __modelClass?: any;\n __adapter?: any;\n}\n\ninterface UseQueryOptions {\n waitForAuth?: boolean;\n}\n\ninterface UseQueryResult<T> {\n items: T[];\n loading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n// ── External Cache ───────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n items: any[];\n loading: boolean;\n error: Error | null;\n refs: number;\n listeners: Set<() => void>;\n dispose: (() => void) | null;\n gcTimer: ReturnType<typeof setTimeout> | null;\n}\n\nconst cache = new Map<string, CacheEntry>();\nconst GC_DELAY = 60_000;\nconst EMPTY: any[] = [];\n\nfunction getOrCreate(key: string): CacheEntry {\n let e = cache.get(key);\n if (!e) {\n e = {\n items: EMPTY,\n loading: true,\n error: null,\n refs: 0,\n listeners: new Set(),\n dispose: null,\n gcTimer: null,\n };\n cache.set(key, e);\n }\n return e;\n}\n\nfunction notify(e: CacheEntry): void {\n for (const fn of e.listeners) fn();\n}\n\nfunction doFetch(key: string, entry: CacheEntry, chain: QueryChain<any>): void {\n entry.loading = true;\n entry.error = null;\n notify(entry);\n\n chain\n .find()\n .then((result: any[]) => {\n entry.items = result;\n entry.loading = false;\n notify(entry);\n })\n .catch((err: Error) => {\n entry.error = err;\n entry.loading = false;\n notify(entry);\n });\n}\n\n// ── useQuery ─────────────────────────────────────────────────────────────────\n\nfunction getAuthGate(client: ParcaeClient): AuthState | null {\n const transport = client.transport as any;\n return transport?.auth?.state ?? null;\n}\n\nexport function useQuery<T>(\n chain: QueryChain<T> | null | undefined,\n options: UseQueryOptions = {},\n): UseQueryResult<T> {\n const client = useParcae();\n const waitForAuth = options.waitForAuth ?? true;\n\n // Read auth state reactively via Valtio snapshot\n const authGate = getAuthGate(client);\n const authSnap = authGate ? useSnapshot(authGate as any) : null;\n const authStatus = (authSnap as any)?.status ?? \"pending\";\n const authVersion = (authSnap as any)?.version ?? 0;\n const authReady = !waitForAuth || authStatus !== \"pending\";\n\n const key =\n chain && authReady\n ? `${chain.__modelType}:${authVersion}:${JSON.stringify(chain.__steps ?? [])}`\n : null;\n\n const keyRef = useRef(key);\n keyRef.current = key;\n\n const subscribe = (onChange: () => void) => {\n const k = keyRef.current;\n if (!k) return () => {};\n const e = getOrCreate(k);\n e.refs++;\n e.listeners.add(onChange);\n if (e.gcTimer) {\n clearTimeout(e.gcTimer);\n e.gcTimer = null;\n }\n return () => {\n e.listeners.delete(onChange);\n e.refs--;\n if (e.refs <= 0) {\n e.gcTimer = setTimeout(() => {\n e.dispose?.();\n cache.delete(k);\n }, GC_DELAY);\n }\n };\n };\n\n const getSnapshot = (): any[] => {\n const k = keyRef.current;\n if (!k) return EMPTY;\n return cache.get(k)?.items ?? EMPTY;\n };\n\n const items = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n ) as T[];\n\n useEffect(() => {\n if (!key || !chain) return;\n const entry = getOrCreate(key);\n if (entry.items === EMPTY) {\n doFetch(key, entry, chain);\n }\n }, [key]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const refetch = () => {\n if (!key || !chain) return;\n doFetch(key, getOrCreate(key), chain);\n };\n\n if (!key)\n return {\n items: EMPTY as T[],\n loading: !authReady,\n error: null,\n refetch: () => {},\n };\n const entry = cache.get(key);\n return {\n items,\n loading: entry?.loading ?? true,\n error: entry?.error ?? null,\n refetch,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport { useParcae } from \"./context\";\n\nexport function useApi() {\n const client = useParcae();\n return useMemo(\n () => ({\n get: client.get.bind(client),\n post: client.post.bind(client),\n put: client.put.bind(client),\n patch: client.patch.bind(client),\n delete: client.delete.bind(client),\n }),\n [client],\n );\n}\n\nexport function useSDK() {\n return useParcae();\n}\n\nexport function useConnectionStatus() {\n const client = useParcae();\n const transport = client.transport as any;\n const authState = transport?.auth?.state;\n const snap = authState ? useSnapshot(authState) : null;\n return {\n isConnected: client.isConnected,\n authStatus: (snap as any)?.status ?? \"pending\",\n };\n}\n\nexport function useAuthState() {\n const client = useParcae();\n const transport = client.transport as any;\n const authState = transport?.auth?.state;\n const snap = authState ? useSnapshot(authState) : null;\n return {\n status: (snap as any)?.status ?? \"pending\",\n userId: (snap as any)?.userId ?? null,\n version: (snap as any)?.version ?? 0,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport { useParcae } from \"./context\";\n\nexport function useSetting<T = string>(\n key: string,\n defaultValue: T,\n): [T, (value: T) => Promise<void>, { isLoading: boolean }] {\n const client = useParcae();\n const transport = client.transport as any;\n const authState = transport?.auth?.state;\n const snap = authState ? useSnapshot(authState) : null;\n const authStatus = (snap as any)?.status ?? \"pending\";\n\n const [value, setValue] = useState<T>(defaultValue);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (authStatus === \"pending\") return;\n if (authStatus === \"unauthenticated\") {\n setIsLoading(false);\n return;\n }\n\n let cancelled = false;\n client\n .get(`/settings/${encodeURIComponent(key)}`)\n .then((result: any) => {\n if (!cancelled && result?.value !== undefined) setValue(result.value);\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [key, client, authStatus]);\n\n const update = useCallback(\n async (newValue: T) => {\n setValue(newValue);\n await client.put(`/settings/${encodeURIComponent(key)}`, {\n value: newValue,\n });\n },\n [key, client],\n );\n\n return [value, update, { isLoading }];\n}\n"]}
|