@vennbase/react 0.1.8

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.
@@ -0,0 +1,383 @@
1
+ import { createAdaptivePoller, subscribeToBrowserActivity } from "./polling";
2
+ const browserActivitySubscriber = (notify) => {
3
+ return subscribeToBrowserActivity(notify) ?? undefined;
4
+ };
5
+ function composeActivitySubscribers(...subscribers) {
6
+ const activeSubscribers = subscribers.filter((subscriber) => !!subscriber);
7
+ if (activeSubscribers.length === 0) {
8
+ return undefined;
9
+ }
10
+ return (notify) => {
11
+ const unsubscribers = activeSubscribers
12
+ .map((subscriber) => subscriber(notify))
13
+ .filter((unsubscribe) => typeof unsubscribe === "function");
14
+ return () => {
15
+ for (const unsubscribe of unsubscribers) {
16
+ unsubscribe();
17
+ }
18
+ };
19
+ };
20
+ }
21
+ const idleSnapshot = {
22
+ data: undefined,
23
+ error: undefined,
24
+ refreshError: undefined,
25
+ isRefreshing: false,
26
+ status: "idle",
27
+ };
28
+ function stableJsonStringify(value) {
29
+ if (value === null || typeof value !== "object") {
30
+ return JSON.stringify(value);
31
+ }
32
+ if (Array.isArray(value)) {
33
+ return `[${value.map(stableJsonStringify).join(",")}]`;
34
+ }
35
+ const record = value;
36
+ const entries = Object.keys(record)
37
+ .sort()
38
+ .map((key) => `${JSON.stringify(key)}:${stableJsonStringify(record[key])}`);
39
+ return `{${entries.join(",")}}`;
40
+ }
41
+ function snapshotValue(value) {
42
+ return stableJsonStringify(canonicalizeKeyPart(value));
43
+ }
44
+ function isRowRefLike(value) {
45
+ if (!value || typeof value !== "object") {
46
+ return false;
47
+ }
48
+ const record = value;
49
+ return (typeof record.id === "string"
50
+ && typeof record.collection === "string"
51
+ && typeof record.baseUrl === "string");
52
+ }
53
+ function isRowInputLike(value) {
54
+ if (isRowRefLike(value)) {
55
+ return true;
56
+ }
57
+ if (!value || typeof value !== "object") {
58
+ return false;
59
+ }
60
+ const record = value;
61
+ return isRowRefLike(record.ref);
62
+ }
63
+ function resolveRowInput(value) {
64
+ return isRowRefLike(value) ? value : value.ref;
65
+ }
66
+ function canonicalizeRowRef(value) {
67
+ return {
68
+ id: value.id,
69
+ collection: value.collection,
70
+ baseUrl: value.baseUrl,
71
+ };
72
+ }
73
+ function canonicalizeKeyPart(value, seen = new WeakSet()) {
74
+ if (value === null || typeof value !== "object") {
75
+ return value;
76
+ }
77
+ if (isRowInputLike(value)) {
78
+ return canonicalizeRowRef(resolveRowInput(value));
79
+ }
80
+ if (seen.has(value)) {
81
+ return "[Circular]";
82
+ }
83
+ seen.add(value);
84
+ if (Array.isArray(value)) {
85
+ return value.map((entry) => canonicalizeKeyPart(entry, seen));
86
+ }
87
+ const record = value;
88
+ const canonical = {};
89
+ for (const key of Object.keys(record)) {
90
+ const entry = record[key];
91
+ if (typeof entry === "function" || typeof entry === "symbol" || typeof entry === "undefined") {
92
+ continue;
93
+ }
94
+ canonical[key] = canonicalizeKeyPart(entry, seen);
95
+ }
96
+ return canonical;
97
+ }
98
+ function snapshotRowHandle(row) {
99
+ return stableJsonStringify({
100
+ id: row.id,
101
+ collection: row.collection,
102
+ owner: row.owner,
103
+ ref: row.ref,
104
+ fields: row.fields,
105
+ });
106
+ }
107
+ function snapshotRowRefArray(value) {
108
+ return stableJsonStringify(value.map((row) => ({
109
+ id: row.id,
110
+ collection: row.collection,
111
+ baseUrl: row.baseUrl,
112
+ })));
113
+ }
114
+ function snapshotMembers(value) {
115
+ return stableJsonStringify(value);
116
+ }
117
+ function snapshotEffectiveMembers(value) {
118
+ return stableJsonStringify(value);
119
+ }
120
+ function snapshotStrings(value) {
121
+ return stableJsonStringify(value);
122
+ }
123
+ function snapshotCurrentUser(value) {
124
+ return stableJsonStringify(value);
125
+ }
126
+ function snapshotSession(value) {
127
+ return stableJsonStringify(value);
128
+ }
129
+ function snapshotQueryRows(value) {
130
+ return stableJsonStringify(value.map((row) => ({
131
+ id: row.id,
132
+ collection: row.collection,
133
+ owner: row.owner,
134
+ ref: row.ref,
135
+ fields: row.fields,
136
+ })));
137
+ }
138
+ class Resource {
139
+ live;
140
+ options;
141
+ onEmpty;
142
+ subscribeToActivity;
143
+ snapshot = idleSnapshot;
144
+ listeners = new Set();
145
+ lastValueSnapshot = null;
146
+ inFlight = null;
147
+ poller = null;
148
+ constructor(live, options, onEmpty, subscribeToActivity) {
149
+ this.live = live;
150
+ this.options = options;
151
+ this.onEmpty = onEmpty;
152
+ this.subscribeToActivity = subscribeToActivity;
153
+ }
154
+ getSnapshot = () => {
155
+ return this.snapshot;
156
+ };
157
+ subscribe = (listener) => {
158
+ this.listeners.add(listener);
159
+ if (this.listeners.size === 1) {
160
+ this.start();
161
+ }
162
+ return () => {
163
+ this.listeners.delete(listener);
164
+ if (this.listeners.size === 0) {
165
+ this.stop();
166
+ this.onEmpty();
167
+ }
168
+ };
169
+ };
170
+ refresh = async () => {
171
+ if (this.poller) {
172
+ await this.poller.refresh();
173
+ return;
174
+ }
175
+ await this.runLoad({ markActivity: false, isRefresh: true });
176
+ };
177
+ start() {
178
+ if (this.options.live) {
179
+ this.poller = createAdaptivePoller({
180
+ subscribeToActivity: this.subscribeToActivity,
181
+ onError: (error) => {
182
+ this.fail(error);
183
+ },
184
+ run: async ({ markActivity }) => {
185
+ await this.runLoad({ markActivity, isRefresh: false });
186
+ },
187
+ });
188
+ return;
189
+ }
190
+ if (this.snapshot.status === "idle") {
191
+ void this.runLoad({ markActivity: false, isRefresh: false });
192
+ }
193
+ }
194
+ stop() {
195
+ this.poller?.disconnect();
196
+ this.poller = null;
197
+ }
198
+ async runLoad(options) {
199
+ if (this.inFlight) {
200
+ return this.inFlight;
201
+ }
202
+ if (this.snapshot.status === "success") {
203
+ this.setSnapshot({
204
+ data: this.snapshot.data,
205
+ error: undefined,
206
+ refreshError: undefined,
207
+ isRefreshing: true,
208
+ status: "success",
209
+ });
210
+ }
211
+ else if (this.snapshot.status === "idle"
212
+ || (this.snapshot.data === undefined && this.snapshot.status !== "loading")) {
213
+ this.setSnapshot({
214
+ data: this.snapshot.data,
215
+ error: undefined,
216
+ refreshError: undefined,
217
+ isRefreshing: false,
218
+ status: "loading",
219
+ });
220
+ }
221
+ this.inFlight = (async () => {
222
+ try {
223
+ const data = await this.options.load();
224
+ const nextValueSnapshot = this.options.snapshotOf?.(data) ?? snapshotValue(data);
225
+ const changed = this.lastValueSnapshot !== nextValueSnapshot;
226
+ this.lastValueSnapshot = nextValueSnapshot;
227
+ if (changed) {
228
+ this.setSnapshot({
229
+ data,
230
+ error: undefined,
231
+ refreshError: undefined,
232
+ isRefreshing: false,
233
+ status: "success",
234
+ });
235
+ if (typeof options.markActivity === "function") {
236
+ options.markActivity();
237
+ }
238
+ return;
239
+ }
240
+ if (this.snapshot.status !== "success"
241
+ || this.snapshot.error !== undefined
242
+ || this.snapshot.refreshError !== undefined
243
+ || this.snapshot.isRefreshing) {
244
+ this.setSnapshot({
245
+ data: this.snapshot.data,
246
+ error: undefined,
247
+ refreshError: undefined,
248
+ isRefreshing: false,
249
+ status: "success",
250
+ });
251
+ }
252
+ }
253
+ catch (error) {
254
+ this.fail(error);
255
+ }
256
+ finally {
257
+ this.inFlight = null;
258
+ }
259
+ })();
260
+ return this.inFlight;
261
+ }
262
+ fail(error) {
263
+ if (this.snapshot.status === "success") {
264
+ this.setSnapshot({
265
+ data: this.snapshot.data,
266
+ error: undefined,
267
+ refreshError: error,
268
+ isRefreshing: false,
269
+ status: "success",
270
+ });
271
+ return;
272
+ }
273
+ this.setSnapshot({
274
+ data: this.snapshot.data,
275
+ error,
276
+ refreshError: undefined,
277
+ isRefreshing: false,
278
+ status: "error",
279
+ });
280
+ }
281
+ setSnapshot(next) {
282
+ if (this.snapshot.status === next.status &&
283
+ this.snapshot.error === next.error &&
284
+ this.snapshot.refreshError === next.refreshError &&
285
+ this.snapshot.isRefreshing === next.isRefreshing &&
286
+ this.snapshot.data === next.data) {
287
+ return;
288
+ }
289
+ this.snapshot = next;
290
+ for (const listener of this.listeners) {
291
+ listener();
292
+ }
293
+ }
294
+ }
295
+ export class VennbaseReactRuntime {
296
+ client;
297
+ resources = new Map();
298
+ externalSubscribeToActivity;
299
+ subscribeToActivity;
300
+ constructor(client, subscribeToActivity) {
301
+ this.client = client;
302
+ this.externalSubscribeToActivity = subscribeToActivity;
303
+ this.subscribeToActivity = composeActivitySubscribers(browserActivitySubscriber, subscribeToActivity, this.subscribeToCoreMutations());
304
+ }
305
+ getLoadOnce(key, load, snapshotOf) {
306
+ return this.getResource(key, { live: false, load, snapshotOf });
307
+ }
308
+ getLive(key, load, snapshotOf) {
309
+ return this.getResource(key, { live: true, load, snapshotOf });
310
+ }
311
+ async refreshLiveResources() {
312
+ const refreshes = Array.from(this.resources.values())
313
+ .filter((resource) => resource.live)
314
+ .map((resource) => resource.refresh());
315
+ await Promise.all(refreshes);
316
+ }
317
+ getResource(key, options) {
318
+ const existing = this.resources.get(key);
319
+ if (existing) {
320
+ return existing;
321
+ }
322
+ const resource = new Resource(options.live, options, () => {
323
+ this.resources.delete(key);
324
+ }, this.subscribeToActivity);
325
+ this.resources.set(key, resource);
326
+ return resource;
327
+ }
328
+ subscribeToCoreMutations() {
329
+ const client = this.client;
330
+ if (typeof client.subscribeToLocalMutations !== "function") {
331
+ return undefined;
332
+ }
333
+ return (notify) => client.subscribeToLocalMutations?.(() => {
334
+ notify();
335
+ void this.refreshLiveResources();
336
+ });
337
+ }
338
+ }
339
+ const defaultRuntimes = new WeakMap();
340
+ export function getDefaultRuntime(client) {
341
+ const existing = defaultRuntimes.get(client);
342
+ if (existing) {
343
+ return existing;
344
+ }
345
+ const runtime = new VennbaseReactRuntime(client);
346
+ defaultRuntimes.set(client, runtime);
347
+ return runtime;
348
+ }
349
+ export function getIdleSnapshot() {
350
+ return idleSnapshot;
351
+ }
352
+ export function makeQueryKey(collection, options) {
353
+ return `query:${collection}:${stableJsonStringify(canonicalizeKeyPart(options))}`;
354
+ }
355
+ export function makeRowKey(collection, row) {
356
+ return `row:${collection}:${stableJsonStringify(canonicalizeKeyPart(row))}`;
357
+ }
358
+ export function makeParentsKey(row) {
359
+ return `parents:${stableJsonStringify(canonicalizeKeyPart(row))}`;
360
+ }
361
+ export function makeMembersKey(kind, row) {
362
+ return `${kind}:${stableJsonStringify(canonicalizeKeyPart(row))}`;
363
+ }
364
+ export function makeShareLinkKey(row) {
365
+ return `share-link:${stableJsonStringify(canonicalizeKeyPart(row))}`;
366
+ }
367
+ export function makeIncomingInviteKey(inviteInput) {
368
+ return `incoming-invite:${inviteInput}`;
369
+ }
370
+ export function makeSavedRowKey(username, rowKey, inviteInput) {
371
+ return `saved-row:${username}:${rowKey}:${inviteInput ?? ""}`;
372
+ }
373
+ export const snapshots = {
374
+ queryRows: snapshotQueryRows,
375
+ row: snapshotRowHandle,
376
+ rowRefs: snapshotRowRefArray,
377
+ memberUsernames: snapshotStrings,
378
+ directMembers: snapshotMembers,
379
+ effectiveMembers: snapshotEffectiveMembers,
380
+ currentUser: snapshotCurrentUser,
381
+ session: snapshotSession,
382
+ };
383
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ import { collection, defineSchema, field, index, } from "@vennbase/core";
2
+ import { useShareLink, useRow } from "./index";
3
+ const schema = defineSchema({
4
+ dogs: collection({
5
+ fields: {
6
+ name: field.string(),
7
+ },
8
+ }),
9
+ tags: collection({
10
+ in: ["dogs"],
11
+ fields: {
12
+ label: field.string(),
13
+ createdAt: field.number(),
14
+ },
15
+ indexes: {
16
+ byCreatedAt: index("createdAt"),
17
+ },
18
+ }),
19
+ });
20
+ const maybeAnyRowHandle = dogResult.data;
21
+ const maybeDogHandle = dogResult.data;
22
+ const maybeTagHandle = tagRows[0];
23
+ const dogName = dogHandle.fields.name;
24
+ void maybeAnyRowHandle;
25
+ void maybeDogHandle;
26
+ void maybeTagHandle;
27
+ void dogName;
28
+ if (dogResult.data) {
29
+ // @ts-expect-error parentless rows should not accept parent refs
30
+ void dogResult.data.in.add(tagRef);
31
+ }
32
+ if (anyRowHandle.collection === "dogs") {
33
+ const narrowedDogHandle = anyRowHandle;
34
+ const narrowedDogName = narrowedDogHandle.fields.name;
35
+ void narrowedDogName;
36
+ }
37
+ if (tagRows[0]) {
38
+ void tagRows[0].in.add({
39
+ id: "dog_1",
40
+ collection: "dogs",
41
+ baseUrl: "https://worker.example",
42
+ });
43
+ const createdAt = tagRows[0].fields.createdAt;
44
+ void createdAt;
45
+ // @ts-expect-error tags can only be parented by dogs
46
+ void tagRows[0].in.add(tagRef);
47
+ void useRow(anyClient, tagRows[0]);
48
+ void useShareLink(anyClient, tagRows[0]);
49
+ }
50
+ //# sourceMappingURL=type-assertions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-assertions.js","sourceRoot":"","sources":["../src/type-assertions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,EACL,KAAK,GAIN,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAY,MAAM,EAAE,MAAM,SAAS,CAAC;AAEzD,MAAM,MAAM,GAAG,YAAY,CAAC;IAC1B,IAAI,EAAE,UAAU,CAAC;QACf,MAAM,EAAE;YACN,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE;SACrB;KACF,CAAC;IACF,IAAI,EAAE,UAAU,CAAC;QACf,EAAE,EAAE,CAAC,MAAM,CAAC;QACZ,MAAM,EAAE;YACN,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;YACrB,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE;SAC1B;QACD,OAAO,EAAE;YACP,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC;SAChC;KACF,CAAC;CACH,CAAC,CAAC;AAgBH,MAAM,iBAAiB,GAAyC,SAAS,CAAC,IAAI,CAAC;AAC/E,MAAM,cAAc,GAA0B,SAAS,CAAC,IAAI,CAAC;AAC7D,MAAM,cAAc,GAA0B,OAAO,CAAC,CAAC,CAAC,CAAC;AACzD,MAAM,OAAO,GAAW,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;AAC9C,KAAK,iBAAiB,CAAC;AACvB,KAAK,cAAc,CAAC;AACpB,KAAK,cAAc,CAAC;AACpB,KAAK,OAAO,CAAC;AAEb,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;IACnB,iEAAiE;IACjE,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,IAAI,YAAY,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;IACvC,MAAM,iBAAiB,GAAc,YAAY,CAAC;IAClD,MAAM,eAAe,GAAW,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9D,KAAK,eAAe,CAAC;AACvB,CAAC;AAED,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACf,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;QACrB,EAAE,EAAE,OAAO;QACX,UAAU,EAAE,MAAM;QAClB,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAC;IACH,MAAM,SAAS,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IACtD,KAAK,SAAS,CAAC;IAEf,qDAAqD;IACrD,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE/B,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,KAAK,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@vennbase/react",
3
+ "version": "0.1.8",
4
+ "description": "React hooks for Vennbase — a multi-user database for apps that have no backend.",
5
+ "license": "Apache-2.0",
6
+ "keywords": [
7
+ "database",
8
+ "puter",
9
+ "backend-free",
10
+ "collaborative",
11
+ "realtime",
12
+ "react",
13
+ "hooks"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/alexdavies74/vennbase.git",
18
+ "directory": "packages/vennbase-react"
19
+ },
20
+ "homepage": "https://github.com/alexdavies74/vennbase/tree/main/packages/vennbase-react#readme",
21
+ "type": "module",
22
+ "main": "dist/index.js",
23
+ "types": "dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "import": "./dist/index.js",
27
+ "types": "./dist/index.d.ts"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "dependencies": {
38
+ "@heyputer/puter.js": "^2.2.11",
39
+ "@vennbase/core": "0.1.8"
40
+ },
41
+ "peerDependencies": {
42
+ "react": "^18.0.0 || ^19.0.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/react": "^19.1.13",
46
+ "@types/react-dom": "^19.1.9",
47
+ "jsdom": "^26.1.0",
48
+ "react": "^19.1.1",
49
+ "react-dom": "^19.1.1"
50
+ },
51
+ "scripts": {
52
+ "build": "tsc -p tsconfig.json",
53
+ "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput",
54
+ "typecheck": "tsc -p tsconfig.json --noEmit",
55
+ "lint": "tsc -p tsconfig.json --noEmit",
56
+ "test": "vitest run"
57
+ }
58
+ }