@fireproof/core 0.19.112-dev-dyn → 0.19.112
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/{gateway-SK2ERWD3.js → gateway-G4CPXEQF.js} +3 -7
- package/gateway-G4CPXEQF.js.map +1 -0
- package/index.cjs +26 -23
- package/index.cjs.map +1 -1
- package/index.d.cts +3 -1
- package/index.d.ts +3 -1
- package/index.global.js +36 -23
- package/index.global.js.map +1 -1
- package/index.js +24 -17
- package/index.js.map +1 -1
- package/{key-bag-indexdb-N5GQ5GSH.js → key-bag-indexdb-VOVNNCXQ.js} +1 -1
- package/key-bag-indexdb-VOVNNCXQ.js.map +1 -0
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/metafile-iife.json +1 -1
- package/package.json +10 -2
- package/react/index.cjs +171 -0
- package/react/index.cjs.map +1 -0
- package/react/index.d.cts +90 -0
- package/react/index.d.ts +90 -0
- package/react/index.js +148 -0
- package/react/index.js.map +1 -0
- package/react/metafile-cjs.json +1 -0
- package/react/metafile-esm.json +1 -0
- package/web/gateway-impl.cjs +1 -1
- package/web/gateway-impl.cjs.map +1 -1
- package/web/gateway-impl.js +1 -1
- package/web/gateway-impl.js.map +1 -1
- package/web/metafile-cjs.json +1 -1
- package/web/metafile-esm.json +1 -1
- package/gateway-SK2ERWD3.js.map +0 -1
- package/key-bag-indexdb-N5GQ5GSH.js.map +0 -1
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@fireproof/core",
|
3
|
-
"version": "0.19.112
|
3
|
+
"version": "0.19.112",
|
4
4
|
"description": "Live database for the web.",
|
5
5
|
"type": "module",
|
6
6
|
"module": "./index.js",
|
@@ -25,6 +25,12 @@
|
|
25
25
|
"require": "./web/index.cjs",
|
26
26
|
"script": "./web/index.global.js",
|
27
27
|
"types": "./web/index.d.ts"
|
28
|
+
},
|
29
|
+
"./react": {
|
30
|
+
"import": "./react/index.js",
|
31
|
+
"require": "./react/index.cjs",
|
32
|
+
"script": "./react/index.global.js",
|
33
|
+
"types": "./react/index.d.ts"
|
28
34
|
}
|
29
35
|
},
|
30
36
|
"keywords": [
|
@@ -54,7 +60,9 @@
|
|
54
60
|
"url": "https://github.com/fireproof-storage/fireproof/issues"
|
55
61
|
},
|
56
62
|
"devDependencies": {},
|
57
|
-
"peerDependencies": {
|
63
|
+
"peerDependencies": {
|
64
|
+
"react": "^18.3.1"
|
65
|
+
},
|
58
66
|
"dependencies": {
|
59
67
|
"@adviser/cement": "^0.2.36",
|
60
68
|
"multiformats": "^13.3.0",
|
package/react/index.cjs
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
|
20
|
+
// src/react/index.ts
|
21
|
+
var react_exports = {};
|
22
|
+
__export(react_exports, {
|
23
|
+
FireproofCtx: () => FireproofCtx,
|
24
|
+
useAllDocs: () => useAllDocs,
|
25
|
+
useChanges: () => useChanges,
|
26
|
+
useDocument: () => useDocument,
|
27
|
+
useFireproof: () => useFireproof,
|
28
|
+
useLiveQuery: () => useLiveQuery
|
29
|
+
});
|
30
|
+
module.exports = __toCommonJS(react_exports);
|
31
|
+
|
32
|
+
// src/react/useFireproof.ts
|
33
|
+
var import_core = require("@fireproof/core");
|
34
|
+
var import_react = require("react");
|
35
|
+
var FireproofCtx = {};
|
36
|
+
function useFireproof(name = "useFireproof", config = {}) {
|
37
|
+
const database = typeof name === "string" ? (0, import_core.fireproof)(name, config) : name;
|
38
|
+
function useDocument2(initialDocOrFn) {
|
39
|
+
let initialDoc;
|
40
|
+
if (typeof initialDocOrFn === "function") {
|
41
|
+
initialDoc = initialDocOrFn();
|
42
|
+
} else {
|
43
|
+
initialDoc = initialDocOrFn;
|
44
|
+
}
|
45
|
+
const docId = initialDoc._id ?? "";
|
46
|
+
const [doc, setDoc] = (0, import_react.useState)(initialDoc);
|
47
|
+
const refreshDoc = (0, import_react.useCallback)(async () => {
|
48
|
+
const doc2 = docId ? await database.get(docId).catch(() => initialDoc) : initialDoc;
|
49
|
+
setDoc(doc2);
|
50
|
+
}, [docId]);
|
51
|
+
const saveDoc = (0, import_react.useCallback)(
|
52
|
+
async (existingDoc) => {
|
53
|
+
const res = await database.put(existingDoc ?? doc);
|
54
|
+
if (!existingDoc && !doc._id) setDoc((d) => ({ ...d, _id: res.id }));
|
55
|
+
return res;
|
56
|
+
},
|
57
|
+
[doc]
|
58
|
+
);
|
59
|
+
const deleteDoc = (0, import_react.useCallback)(
|
60
|
+
async (existingDoc) => {
|
61
|
+
const id = existingDoc?._id ?? docId;
|
62
|
+
const doc2 = await database.get(id).catch(() => void 0);
|
63
|
+
if (!doc2) throw database.logger.Error().Str("id", id).Msg(`Document not found`).AsError();
|
64
|
+
const res = await database.del(id);
|
65
|
+
setDoc(initialDoc);
|
66
|
+
return res;
|
67
|
+
},
|
68
|
+
[docId, initialDoc]
|
69
|
+
);
|
70
|
+
const updateDoc = (0, import_react.useCallback)(
|
71
|
+
(newDoc, opts = { replace: false, reset: false }) => {
|
72
|
+
if (!newDoc) return void (opts.reset ? setDoc(initialDoc) : refreshDoc());
|
73
|
+
setDoc((d) => opts.replace ? newDoc : { ...d, ...newDoc });
|
74
|
+
},
|
75
|
+
[refreshDoc, initialDoc]
|
76
|
+
);
|
77
|
+
(0, import_react.useEffect)(() => {
|
78
|
+
if (!docId) return;
|
79
|
+
return database.subscribe((changes) => {
|
80
|
+
if (changes.find((c) => c._id === docId)) {
|
81
|
+
void refreshDoc();
|
82
|
+
}
|
83
|
+
});
|
84
|
+
}, [docId, refreshDoc]);
|
85
|
+
(0, import_react.useEffect)(() => {
|
86
|
+
void refreshDoc();
|
87
|
+
}, [refreshDoc]);
|
88
|
+
return [{ _id: docId, ...doc }, updateDoc, saveDoc, deleteDoc];
|
89
|
+
}
|
90
|
+
function useLiveQuery2(mapFn, query = {}, initialRows = []) {
|
91
|
+
const [result, setResult] = (0, import_react.useState)(() => ({
|
92
|
+
rows: initialRows,
|
93
|
+
docs: initialRows.map((r) => r.doc).filter((r) => !!r)
|
94
|
+
}));
|
95
|
+
const queryString = (0, import_react.useMemo)(() => JSON.stringify(query), [query]);
|
96
|
+
const mapFnString = (0, import_react.useMemo)(() => mapFn.toString(), [mapFn]);
|
97
|
+
const refreshRows = (0, import_react.useCallback)(async () => {
|
98
|
+
const res = await database.query(mapFn, query);
|
99
|
+
setResult({ ...res, docs: res.rows.map((r) => r.doc) });
|
100
|
+
}, [mapFnString, queryString]);
|
101
|
+
(0, import_react.useEffect)(() => {
|
102
|
+
refreshRows();
|
103
|
+
return database.subscribe(refreshRows);
|
104
|
+
}, [refreshRows]);
|
105
|
+
return result;
|
106
|
+
}
|
107
|
+
function useAllDocs2(query = {}) {
|
108
|
+
const [result, setResult] = (0, import_react.useState)({
|
109
|
+
docs: []
|
110
|
+
});
|
111
|
+
const queryString = (0, import_react.useMemo)(() => JSON.stringify(query), [query]);
|
112
|
+
const refreshRows = (0, import_react.useCallback)(async () => {
|
113
|
+
const res = await database.allDocs(query);
|
114
|
+
setResult({ ...res, docs: res.rows.map((r) => r.value) });
|
115
|
+
}, [queryString]);
|
116
|
+
(0, import_react.useEffect)(() => {
|
117
|
+
refreshRows();
|
118
|
+
return database.subscribe(refreshRows);
|
119
|
+
}, [refreshRows]);
|
120
|
+
return result;
|
121
|
+
}
|
122
|
+
function useChanges2(since = [], opts = {}) {
|
123
|
+
const [result, setResult] = (0, import_react.useState)({
|
124
|
+
docs: []
|
125
|
+
});
|
126
|
+
const queryString = (0, import_react.useMemo)(() => JSON.stringify(opts), [opts]);
|
127
|
+
const refreshRows = (0, import_react.useCallback)(async () => {
|
128
|
+
const res = await database.changes(since, opts);
|
129
|
+
setResult({ ...res, docs: res.rows.map((r) => r.value) });
|
130
|
+
}, [since, queryString]);
|
131
|
+
(0, import_react.useEffect)(() => {
|
132
|
+
refreshRows();
|
133
|
+
return database.subscribe(refreshRows);
|
134
|
+
}, [refreshRows]);
|
135
|
+
return result;
|
136
|
+
}
|
137
|
+
return { database, useLiveQuery: useLiveQuery2, useDocument: useDocument2, useAllDocs: useAllDocs2, useChanges: useChanges2 };
|
138
|
+
}
|
139
|
+
|
140
|
+
// src/react/useDocument.ts
|
141
|
+
function topLevelUseDocument(...args) {
|
142
|
+
const { useDocument: useDocument2, database } = useFireproof();
|
143
|
+
topLevelUseDocument.database = database;
|
144
|
+
return useDocument2(...args);
|
145
|
+
}
|
146
|
+
var useDocument = topLevelUseDocument;
|
147
|
+
|
148
|
+
// src/react/useLiveQuery.ts
|
149
|
+
function topLevelUseLiveQuery(...args) {
|
150
|
+
const { useLiveQuery: useLiveQuery2, database } = useFireproof();
|
151
|
+
topLevelUseLiveQuery.database = database;
|
152
|
+
return useLiveQuery2(...args);
|
153
|
+
}
|
154
|
+
var useLiveQuery = topLevelUseLiveQuery;
|
155
|
+
|
156
|
+
// src/react/useAllDocs.ts
|
157
|
+
function topLevelUseAllDocs(...args) {
|
158
|
+
const { useAllDocs: useAllDocs2, database } = useFireproof();
|
159
|
+
topLevelUseAllDocs.database = database;
|
160
|
+
return useAllDocs2(...args);
|
161
|
+
}
|
162
|
+
var useAllDocs = topLevelUseAllDocs;
|
163
|
+
|
164
|
+
// src/react/useChanges.ts
|
165
|
+
function topLevelUseChanges(...args) {
|
166
|
+
const { useChanges: useChanges2, database } = useFireproof();
|
167
|
+
topLevelUseChanges.database = database;
|
168
|
+
return useChanges2(...args);
|
169
|
+
}
|
170
|
+
var useChanges = topLevelUseChanges;
|
171
|
+
//# sourceMappingURL=index.cjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../../src/react/index.ts","../../../src/react/useFireproof.ts","../../../src/react/useDocument.ts","../../../src/react/useLiveQuery.ts","../../../src/react/useAllDocs.ts","../../../src/react/useChanges.ts"],"sourcesContent":["export { type TLUseDocument, useDocument } from \"./useDocument\";\nexport { FireproofCtx, type UseFireproof, useFireproof } from \"./useFireproof\";\nexport { type TLUseLiveQuery, useLiveQuery } from \"./useLiveQuery\";\nexport { type TLUseAllDocs, useAllDocs } from \"./useAllDocs\";\nexport { type TLUseChanges, useChanges } from \"./useChanges\";\n// why is this there is should be a package system\n// export * from \"@fireproof/core\";\n","import type {\n ConfigOpts,\n Database,\n DocFragment,\n DocResponse,\n DocSet,\n DocTypes,\n DocWithId,\n IndexKeyType,\n IndexRow,\n MapFn,\n QueryOpts,\n} from \"@fireproof/core\";\nimport { fireproof } from \"@fireproof/core\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { AllDocsQueryOpts, ChangesOptions, ClockHead } from \"../types\";\n\nexport interface LiveQueryResult<T extends DocTypes, K extends IndexKeyType, R extends DocFragment = T> {\n readonly docs: DocWithId<T>[];\n readonly rows: IndexRow<K, T, R>[];\n}\n\nexport type UseLiveQuery = <T extends DocTypes, K extends IndexKeyType = string, R extends DocFragment = T>(\n mapFn: string | MapFn<T>,\n query?: QueryOpts<K>,\n initialRows?: IndexRow<K, T, R>[],\n) => LiveQueryResult<T, K, R>;\n\nexport interface AllDocsResult<T extends DocTypes> {\n readonly docs: DocWithId<T>[];\n}\n\nexport interface ChangesResult<T extends DocTypes> {\n readonly docs: DocWithId<T>[];\n}\n\nexport type UseAllDocs = <T extends DocTypes>(query?: AllDocsQueryOpts) => AllDocsResult<T>;\n\nexport type UseChanges = <T extends DocTypes>(since: ClockHead, opts: ChangesOptions) => ChangesResult<T>;\n\ninterface UpdateDocFnOptions {\n readonly replace?: boolean;\n readonly reset?: boolean;\n}\n\ntype UpdateDocFn<T extends DocTypes> = (newDoc?: DocSet<T>, options?: UpdateDocFnOptions) => void;\n\ntype StoreDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;\n\ntype DeleteDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;\n\nexport type UseDocumentResult<T extends DocTypes> = [DocWithId<T>, UpdateDocFn<T>, StoreDocFn<T>, DeleteDocFn<T>];\n\nexport type UseDocumentInitialDocOrFn<T extends DocTypes> = DocSet<T> | (() => DocSet<T>);\nexport type UseDocument = <T extends DocTypes>(initialDocOrFn: UseDocumentInitialDocOrFn<T>) => UseDocumentResult<T>;\n\nexport interface UseFireproof {\n readonly database: Database;\n /**\n * ## Summary\n *\n * React hook that provides the ability to create/update/save new Fireproof documents into your custom Fireproof database.\n * The creation occurs when you do not pass in an `_id` as part of your initial document -- the database will assign a new\n * one when you call the provided `save` handler. The hook also provides generics support so you can inline your custom type into\n * the invocation to receive type-safety and auto-complete support in your IDE.\n *\n * ## Usage\n *\n * ```tsx\n * const [todo, setTodo, saveTodo] = useDocument<Todo>({\n * text: '',\n * date: Date.now(),\n * completed: false\n * })\n *\n * const [doc, setDoc, saveDoc] = useDocument<Customer>({\n * _id: `${props.customerId}-profile`, // you can imagine `customerId` as a prop passed in\n * name: \"\",\n * company: \"\",\n * startedAt: Date.now()\n * })\n * ```\n *\n * ## Overview\n *\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useLiveQuery` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\n readonly useDocument: UseDocument;\n /**\n * ## Summary\n * React hook that provides access to live query results, enabling real-time updates in your app.\n *\n * ## Usage\n * ```tsx\n * const result = useLiveQuery(\"date\"); // using string key\n * const result = useLiveQuery('date', { limit: 10, descending: true }) // key + options\n * const result = useLiveQuery<CustomType>(\"date\"); // using generics\n * const result = useLiveQuery((doc) => doc.date)); // using map function\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useLiveQuery` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\n readonly useLiveQuery: UseLiveQuery;\n /**\n * ## Summary\n * React hook that provides access to all documents in the database, sorted by `_id`.\n *\n * ## Usage\n * ```tsx\n * const result = useAllDocs({ limit: 10, descending: true }); // with options\n * const result = useAllDocs(); // without options\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useAllDocs` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\n readonly useAllDocs: UseAllDocs;\n /**\n * ## Summary\n * React hook that provides access to all new documents in the database added since the last time the changes was called\n *\n * ## Usage\n * ```tsx\n * const result = useChanges(prevresult.clock,{limit:10}); // with options\n * const result = useChanges(); // without options\n * const database = useChanges.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useAllDocs`, `useChanges` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\n readonly useChanges: UseChanges;\n}\n\n/**\n * @deprecated Use the `useFireproof` hook instead\n */\nexport const FireproofCtx = {} as UseFireproof;\n\n/**\n *\n * ## Summary\n *\n * React hook to create a custom-named Fireproof database and provides the utility hooks to query against it.\n *\n * ## Usage\n * ```tsx\n * const { database, useLiveQuery, useDocument } = useFireproof(\"dbname\");\n * const { database, useLiveQuery, useDocument } = useFireproof(\"dbname\", { ...options });\n * ```\n *\n * ## Overview\n *\n * TL;DR: Only use this hook if you need to configure a database name other than the default `useFireproof`.\n *\n * For most applications, using the `useLiveQuery` or `useDocument` hooks exported from `use-fireproof` should\n * suffice for the majority of use-cases. Under the hood, they act against a database named `useFireproof` instantiated with\n * default configurations. However, if you need to do a custom database setup or configure a database name more to your liking\n * than the default `useFireproof`, then use `useFireproof` as it exists for that purpose. It will provide you with the\n * custom database accessor and *lexically scoped* versions of `useLiveQuery` and `useDocument` that act against said\n * custom database.\n *\n */\nexport function useFireproof(name: string | Database = \"useFireproof\", config: ConfigOpts = {}): UseFireproof {\n const database = typeof name === \"string\" ? fireproof(name, config) : name;\n\n function useDocument<T extends DocTypes>(initialDocOrFn: UseDocumentInitialDocOrFn<T>): UseDocumentResult<T> {\n let initialDoc: DocSet<T>;\n if (typeof initialDocOrFn === \"function\") {\n initialDoc = initialDocOrFn();\n } else {\n initialDoc = initialDocOrFn;\n }\n\n // We purposely refetch the docId everytime to check if it has changed\n const docId = initialDoc._id ?? \"\";\n\n // We do not want to force consumers to memoize their initial document so we do it for them.\n // We use the stringified generator function to ensure that the memoization is stable across renders.\n // const initialDoc = useMemo(initialDocFn, [initialDocFn.toString()]);\n const [doc, setDoc] = useState(initialDoc);\n\n const refreshDoc = useCallback(async () => {\n // todo add option for mvcc checks\n const doc = docId ? await database.get<T>(docId).catch(() => initialDoc) : initialDoc;\n setDoc(doc);\n }, [docId]);\n\n const saveDoc: StoreDocFn<T> = useCallback(\n async (existingDoc) => {\n const res = await database.put(existingDoc ?? doc);\n // If the document was created, then we need to update the local state with the new `_id`\n if (!existingDoc && !doc._id) setDoc((d) => ({ ...d, _id: res.id }));\n return res;\n },\n [doc],\n );\n\n const deleteDoc: DeleteDocFn<T> = useCallback(\n async (existingDoc) => {\n const id = existingDoc?._id ?? docId;\n const doc = await database.get<T>(id).catch(() => undefined);\n if (!doc) throw database.logger.Error().Str(\"id\", id).Msg(`Document not found`).AsError();\n const res = await database.del(id);\n setDoc(initialDoc);\n return res;\n },\n [docId, initialDoc],\n );\n\n const updateDoc: UpdateDocFn<T> = useCallback(\n (newDoc, opts = { replace: false, reset: false }) => {\n if (!newDoc) return void (opts.reset ? setDoc(initialDoc) : refreshDoc());\n setDoc((d) => (opts.replace ? (newDoc as DocWithId<T>) : { ...d, ...newDoc }));\n },\n [refreshDoc, initialDoc],\n );\n\n useEffect(() => {\n if (!docId) return;\n return database.subscribe((changes) => {\n if (changes.find((c) => c._id === docId)) {\n void refreshDoc(); // todo use change.value\n }\n });\n }, [docId, refreshDoc]);\n\n useEffect(() => {\n void refreshDoc();\n }, [refreshDoc]);\n\n return [{ _id: docId, ...doc }, updateDoc, saveDoc, deleteDoc];\n }\n\n function useLiveQuery<T extends DocTypes, K extends IndexKeyType = string, R extends DocFragment = T>(\n mapFn: MapFn<T> | string,\n query = {},\n initialRows: IndexRow<K, T, R>[] = [],\n ): LiveQueryResult<T, K, R> {\n const [result, setResult] = useState<LiveQueryResult<T, K, R>>(() => ({\n rows: initialRows,\n docs: initialRows.map((r) => r.doc).filter((r): r is DocWithId<T> => !!r),\n }));\n\n const queryString = useMemo(() => JSON.stringify(query), [query]);\n const mapFnString = useMemo(() => mapFn.toString(), [mapFn]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.query<K, T, R>(mapFn, query);\n setResult({ ...res, docs: res.rows.map((r) => r.doc as DocWithId<T>) });\n }, [mapFnString, queryString]);\n\n useEffect(() => {\n refreshRows(); // Initial data fetch\n return database.subscribe(refreshRows);\n }, [refreshRows]);\n\n return result;\n }\n\n function useAllDocs<T extends DocTypes>(query: AllDocsQueryOpts = {}): AllDocsResult<T> {\n const [result, setResult] = useState<AllDocsResult<T>>({\n docs: [],\n });\n\n const queryString = useMemo(() => JSON.stringify(query), [query]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.allDocs<T>(query);\n setResult({ ...res, docs: res.rows.map((r) => r.value as DocWithId<T>) });\n }, [queryString]);\n\n useEffect(() => {\n refreshRows(); // Initial data fetch\n return database.subscribe(refreshRows);\n }, [refreshRows]);\n\n return result;\n }\n\n function useChanges<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): ChangesResult<T> {\n const [result, setResult] = useState<ChangesResult<T>>({\n docs: [],\n });\n\n const queryString = useMemo(() => JSON.stringify(opts), [opts]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.changes<T>(since, opts);\n setResult({ ...res, docs: res.rows.map((r) => r.value as DocWithId<T>) });\n }, [since, queryString]);\n\n useEffect(() => {\n refreshRows(); // Initial data fetch\n return database.subscribe(refreshRows);\n }, [refreshRows]);\n\n return result;\n }\n\n return { database, useLiveQuery, useDocument, useAllDocs, useChanges };\n}\n","import { Database, DocTypes, DocWithId } from \"@fireproof/core\";\n\nimport { UseDocument, UseDocumentResult, useFireproof } from \"./useFireproof\";\n\nexport interface TLUseDocument {\n <T extends DocTypes>(initialDoc: DocWithId<T>): UseDocumentResult<T>;\n database: Database;\n}\n\nfunction topLevelUseDocument(...args: Parameters<UseDocument>) {\n const { useDocument, database } = useFireproof();\n (topLevelUseDocument as TLUseDocument).database = database;\n return useDocument(...args);\n}\n\n/**\n * ## Summary\n *\n * React hook that provides the ability to create new Fireproof documents. The creation occurs when\n * you do not pass in an `_id` as part of your initial document -- the database will assign a new one when\n * you call the provided `save` handler This uses the default database named `useFireproof` under the hood which you can also\n * access via the `database` accessor.\n *\n * ## Usage\n *\n * ```tsx\n * const [todo, setTodo, saveTodo] = useDocument(() => ({\n * text: '',\n * date: Date.now(),\n * completed: false\n * }))\n *\n * const [doc, setDoc, saveDoc] = useDocument(() => ({\n * _id: `${props.customerId}-profile`, // you can imagine `customerId` as a prop passed in\n * name: \"\",\n * company: \"\",\n * startedAt: Date.now()\n * }))\n *\n * const database = useDocument.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useLiveQuery` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\nexport const useDocument = topLevelUseDocument as TLUseDocument;\n","import { Database, DocFragment, DocTypes, IndexKeyType } from \"@fireproof/core\";\n\nimport { LiveQueryResult, useFireproof, UseLiveQuery } from \"./useFireproof\";\n\nexport interface TLUseLiveQuery {\n <T extends DocTypes, K extends IndexKeyType, R extends DocFragment = T>(\n ...args: Parameters<UseLiveQuery>\n ): LiveQueryResult<T, K, R>;\n database: Database;\n}\n\nfunction topLevelUseLiveQuery(...args: Parameters<UseLiveQuery>) {\n const { useLiveQuery, database } = useFireproof();\n (topLevelUseLiveQuery as TLUseLiveQuery).database = database;\n return useLiveQuery(...args);\n}\n\n/**\n * ## Summary\n * React hook that provides access to live query results, enabling real-time updates in your app. This uses\n * the default database named \"useFireproof\" under the hood which you can also access via the `database` accessor.\n *\n * ## Usage\n * ```tsx\n * const results = useLiveQuery(\"date\"); // using string\n * const results = useLiveQuery((doc) => doc.date)); // using map function\n * const database = useLiveQuery.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useLiveQuery` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\nexport const useLiveQuery = topLevelUseLiveQuery as TLUseLiveQuery;\n","import { Database, DocTypes } from \"@fireproof/core\";\n\nimport { AllDocsResult, useFireproof, UseAllDocs } from \"./useFireproof\";\n\nexport interface TLUseAllDocs {\n <T extends DocTypes>(...args: Parameters<UseAllDocs>): AllDocsResult<T>;\n database: Database;\n}\n\nfunction topLevelUseAllDocs(...args: Parameters<UseAllDocs>) {\n const { useAllDocs, database } = useFireproof();\n (topLevelUseAllDocs as TLUseAllDocs).database = database;\n return useAllDocs(...args);\n}\n\n/**\n * ## Summary\n * React hook that provides access to all documents in the database, sorted by `_id`.\n *\n * ## Usage\n * ```tsx\n * const result = useAllDocs({ limit: 10, descending: true }); // with options\n * const result = useAllDocs(); // without options\n * const database = useAllDocs.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useAllDocs` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\nexport const useAllDocs = topLevelUseAllDocs as TLUseAllDocs;\n","import { Database, DocTypes } from \"@fireproof/core\";\n\nimport { ChangesResult, useFireproof, UseChanges } from \"./useFireproof\";\n\nexport interface TLUseChanges {\n <T extends DocTypes>(...args: Parameters<UseChanges>): ChangesResult<T>;\n database: Database;\n}\n\nfunction topLevelUseChanges(...args: Parameters<UseChanges>) {\n const { useChanges, database } = useFireproof();\n (topLevelUseChanges as TLUseChanges).database = database;\n return useChanges(...args);\n}\n\n/**\n * ## Summary\n * React hook that provides access to all new documents in the database added since the last time the changes was called\n *\n * ## Usage\n * ```tsx\n * const result = useChanges(prevresult.clock,{limit:10}); // with options\n * const result = useChanges(); // without options\n * const database = useChanges.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useAllDocs`, `useChanges` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\nexport const useChanges = topLevelUseChanges as TLUseChanges;\n"],"mappings":"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","names":["useDocument","doc","useLiveQuery","useAllDocs","useChanges","useDocument","useLiveQuery","useAllDocs","useChanges"]}
|
@@ -0,0 +1,90 @@
|
|
1
|
+
import { Database, ConfigOpts, DocTypes, IndexKeyType as IndexKeyType$1, DocFragment as DocFragment$1, DocWithId, IndexRow, MapFn, QueryOpts as QueryOpts$1, DocSet, DocResponse } from '@fireproof/core';
|
2
|
+
import { EventLink } from '@web3-storage/pail/clock/api';
|
3
|
+
import { Operation } from '@web3-storage/pail/crdt/api';
|
4
|
+
import { Link, Version } from 'multiformats';
|
5
|
+
|
6
|
+
type AnyLink = Link<unknown, number, number, Version>;
|
7
|
+
|
8
|
+
type ClockLink = EventLink<Operation>;
|
9
|
+
type ClockHead = ClockLink[];
|
10
|
+
type DocFragment = Uint8Array | string | number | boolean | null | AnyLink | DocFragment[] | object;
|
11
|
+
type KeyLiteral = string | number | boolean;
|
12
|
+
type IndexKeyType = KeyLiteral | KeyLiteral[];
|
13
|
+
interface QueryOpts<K extends IndexKeyType> {
|
14
|
+
readonly descending?: boolean;
|
15
|
+
readonly limit?: number;
|
16
|
+
includeDocs?: boolean;
|
17
|
+
readonly range?: [IndexKeyType, IndexKeyType];
|
18
|
+
readonly key?: DocFragment;
|
19
|
+
readonly keys?: DocFragment[];
|
20
|
+
prefix?: IndexKeyType;
|
21
|
+
}
|
22
|
+
interface AllDocsQueryOpts extends QueryOpts<string> {
|
23
|
+
readonly key?: string;
|
24
|
+
readonly keys?: string[];
|
25
|
+
prefix?: string;
|
26
|
+
}
|
27
|
+
interface ChangesOptions {
|
28
|
+
readonly dirty?: boolean;
|
29
|
+
readonly limit?: number;
|
30
|
+
}
|
31
|
+
|
32
|
+
interface LiveQueryResult<T extends DocTypes, K extends IndexKeyType$1, R extends DocFragment$1 = T> {
|
33
|
+
readonly docs: DocWithId<T>[];
|
34
|
+
readonly rows: IndexRow<K, T, R>[];
|
35
|
+
}
|
36
|
+
type UseLiveQuery = <T extends DocTypes, K extends IndexKeyType$1 = string, R extends DocFragment$1 = T>(mapFn: string | MapFn<T>, query?: QueryOpts$1<K>, initialRows?: IndexRow<K, T, R>[]) => LiveQueryResult<T, K, R>;
|
37
|
+
interface AllDocsResult<T extends DocTypes> {
|
38
|
+
readonly docs: DocWithId<T>[];
|
39
|
+
}
|
40
|
+
interface ChangesResult<T extends DocTypes> {
|
41
|
+
readonly docs: DocWithId<T>[];
|
42
|
+
}
|
43
|
+
type UseAllDocs = <T extends DocTypes>(query?: AllDocsQueryOpts) => AllDocsResult<T>;
|
44
|
+
type UseChanges = <T extends DocTypes>(since: ClockHead, opts: ChangesOptions) => ChangesResult<T>;
|
45
|
+
interface UpdateDocFnOptions {
|
46
|
+
readonly replace?: boolean;
|
47
|
+
readonly reset?: boolean;
|
48
|
+
}
|
49
|
+
type UpdateDocFn<T extends DocTypes> = (newDoc?: DocSet<T>, options?: UpdateDocFnOptions) => void;
|
50
|
+
type StoreDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;
|
51
|
+
type DeleteDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;
|
52
|
+
type UseDocumentResult<T extends DocTypes> = [DocWithId<T>, UpdateDocFn<T>, StoreDocFn<T>, DeleteDocFn<T>];
|
53
|
+
type UseDocumentInitialDocOrFn<T extends DocTypes> = DocSet<T> | (() => DocSet<T>);
|
54
|
+
type UseDocument = <T extends DocTypes>(initialDocOrFn: UseDocumentInitialDocOrFn<T>) => UseDocumentResult<T>;
|
55
|
+
interface UseFireproof {
|
56
|
+
readonly database: Database;
|
57
|
+
readonly useDocument: UseDocument;
|
58
|
+
readonly useLiveQuery: UseLiveQuery;
|
59
|
+
readonly useAllDocs: UseAllDocs;
|
60
|
+
readonly useChanges: UseChanges;
|
61
|
+
}
|
62
|
+
declare const FireproofCtx: UseFireproof;
|
63
|
+
declare function useFireproof(name?: string | Database, config?: ConfigOpts): UseFireproof;
|
64
|
+
|
65
|
+
interface TLUseDocument {
|
66
|
+
<T extends DocTypes>(initialDoc: DocWithId<T>): UseDocumentResult<T>;
|
67
|
+
database: Database;
|
68
|
+
}
|
69
|
+
declare const useDocument: TLUseDocument;
|
70
|
+
|
71
|
+
interface TLUseLiveQuery {
|
72
|
+
<T extends DocTypes, K extends IndexKeyType$1, R extends DocFragment$1 = T>(...args: Parameters<UseLiveQuery>): LiveQueryResult<T, K, R>;
|
73
|
+
database: Database;
|
74
|
+
}
|
75
|
+
declare const useLiveQuery: TLUseLiveQuery;
|
76
|
+
|
77
|
+
interface TLUseAllDocs {
|
78
|
+
<T extends DocTypes>(...args: Parameters<UseAllDocs>): AllDocsResult<T>;
|
79
|
+
database: Database;
|
80
|
+
}
|
81
|
+
declare const useAllDocs: TLUseAllDocs;
|
82
|
+
|
83
|
+
interface TLUseChanges {
|
84
|
+
<T extends DocTypes>(...args: Parameters<UseChanges>): ChangesResult<T>;
|
85
|
+
database: Database;
|
86
|
+
}
|
87
|
+
declare const useChanges: TLUseChanges;
|
88
|
+
|
89
|
+
export { FireproofCtx, type TLUseAllDocs, type TLUseChanges, type TLUseDocument, type TLUseLiveQuery, type UseFireproof, useAllDocs, useChanges, useDocument, useFireproof, useLiveQuery };
|
90
|
+
declare module '@fireproof/core/web'
|
package/react/index.d.ts
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
import { Database, ConfigOpts, DocTypes, IndexKeyType as IndexKeyType$1, DocFragment as DocFragment$1, DocWithId, IndexRow, MapFn, QueryOpts as QueryOpts$1, DocSet, DocResponse } from '@fireproof/core';
|
2
|
+
import { EventLink } from '@web3-storage/pail/clock/api';
|
3
|
+
import { Operation } from '@web3-storage/pail/crdt/api';
|
4
|
+
import { Link, Version } from 'multiformats';
|
5
|
+
|
6
|
+
type AnyLink = Link<unknown, number, number, Version>;
|
7
|
+
|
8
|
+
type ClockLink = EventLink<Operation>;
|
9
|
+
type ClockHead = ClockLink[];
|
10
|
+
type DocFragment = Uint8Array | string | number | boolean | null | AnyLink | DocFragment[] | object;
|
11
|
+
type KeyLiteral = string | number | boolean;
|
12
|
+
type IndexKeyType = KeyLiteral | KeyLiteral[];
|
13
|
+
interface QueryOpts<K extends IndexKeyType> {
|
14
|
+
readonly descending?: boolean;
|
15
|
+
readonly limit?: number;
|
16
|
+
includeDocs?: boolean;
|
17
|
+
readonly range?: [IndexKeyType, IndexKeyType];
|
18
|
+
readonly key?: DocFragment;
|
19
|
+
readonly keys?: DocFragment[];
|
20
|
+
prefix?: IndexKeyType;
|
21
|
+
}
|
22
|
+
interface AllDocsQueryOpts extends QueryOpts<string> {
|
23
|
+
readonly key?: string;
|
24
|
+
readonly keys?: string[];
|
25
|
+
prefix?: string;
|
26
|
+
}
|
27
|
+
interface ChangesOptions {
|
28
|
+
readonly dirty?: boolean;
|
29
|
+
readonly limit?: number;
|
30
|
+
}
|
31
|
+
|
32
|
+
interface LiveQueryResult<T extends DocTypes, K extends IndexKeyType$1, R extends DocFragment$1 = T> {
|
33
|
+
readonly docs: DocWithId<T>[];
|
34
|
+
readonly rows: IndexRow<K, T, R>[];
|
35
|
+
}
|
36
|
+
type UseLiveQuery = <T extends DocTypes, K extends IndexKeyType$1 = string, R extends DocFragment$1 = T>(mapFn: string | MapFn<T>, query?: QueryOpts$1<K>, initialRows?: IndexRow<K, T, R>[]) => LiveQueryResult<T, K, R>;
|
37
|
+
interface AllDocsResult<T extends DocTypes> {
|
38
|
+
readonly docs: DocWithId<T>[];
|
39
|
+
}
|
40
|
+
interface ChangesResult<T extends DocTypes> {
|
41
|
+
readonly docs: DocWithId<T>[];
|
42
|
+
}
|
43
|
+
type UseAllDocs = <T extends DocTypes>(query?: AllDocsQueryOpts) => AllDocsResult<T>;
|
44
|
+
type UseChanges = <T extends DocTypes>(since: ClockHead, opts: ChangesOptions) => ChangesResult<T>;
|
45
|
+
interface UpdateDocFnOptions {
|
46
|
+
readonly replace?: boolean;
|
47
|
+
readonly reset?: boolean;
|
48
|
+
}
|
49
|
+
type UpdateDocFn<T extends DocTypes> = (newDoc?: DocSet<T>, options?: UpdateDocFnOptions) => void;
|
50
|
+
type StoreDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;
|
51
|
+
type DeleteDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;
|
52
|
+
type UseDocumentResult<T extends DocTypes> = [DocWithId<T>, UpdateDocFn<T>, StoreDocFn<T>, DeleteDocFn<T>];
|
53
|
+
type UseDocumentInitialDocOrFn<T extends DocTypes> = DocSet<T> | (() => DocSet<T>);
|
54
|
+
type UseDocument = <T extends DocTypes>(initialDocOrFn: UseDocumentInitialDocOrFn<T>) => UseDocumentResult<T>;
|
55
|
+
interface UseFireproof {
|
56
|
+
readonly database: Database;
|
57
|
+
readonly useDocument: UseDocument;
|
58
|
+
readonly useLiveQuery: UseLiveQuery;
|
59
|
+
readonly useAllDocs: UseAllDocs;
|
60
|
+
readonly useChanges: UseChanges;
|
61
|
+
}
|
62
|
+
declare const FireproofCtx: UseFireproof;
|
63
|
+
declare function useFireproof(name?: string | Database, config?: ConfigOpts): UseFireproof;
|
64
|
+
|
65
|
+
interface TLUseDocument {
|
66
|
+
<T extends DocTypes>(initialDoc: DocWithId<T>): UseDocumentResult<T>;
|
67
|
+
database: Database;
|
68
|
+
}
|
69
|
+
declare const useDocument: TLUseDocument;
|
70
|
+
|
71
|
+
interface TLUseLiveQuery {
|
72
|
+
<T extends DocTypes, K extends IndexKeyType$1, R extends DocFragment$1 = T>(...args: Parameters<UseLiveQuery>): LiveQueryResult<T, K, R>;
|
73
|
+
database: Database;
|
74
|
+
}
|
75
|
+
declare const useLiveQuery: TLUseLiveQuery;
|
76
|
+
|
77
|
+
interface TLUseAllDocs {
|
78
|
+
<T extends DocTypes>(...args: Parameters<UseAllDocs>): AllDocsResult<T>;
|
79
|
+
database: Database;
|
80
|
+
}
|
81
|
+
declare const useAllDocs: TLUseAllDocs;
|
82
|
+
|
83
|
+
interface TLUseChanges {
|
84
|
+
<T extends DocTypes>(...args: Parameters<UseChanges>): ChangesResult<T>;
|
85
|
+
database: Database;
|
86
|
+
}
|
87
|
+
declare const useChanges: TLUseChanges;
|
88
|
+
|
89
|
+
export { FireproofCtx, type TLUseAllDocs, type TLUseChanges, type TLUseDocument, type TLUseLiveQuery, type UseFireproof, useAllDocs, useChanges, useDocument, useFireproof, useLiveQuery };
|
90
|
+
declare module '@fireproof/core/web'
|
package/react/index.js
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
// src/react/useFireproof.ts
|
2
|
+
import { fireproof } from "@fireproof/core";
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
4
|
+
var FireproofCtx = {};
|
5
|
+
function useFireproof(name = "useFireproof", config = {}) {
|
6
|
+
const database = typeof name === "string" ? fireproof(name, config) : name;
|
7
|
+
function useDocument2(initialDocOrFn) {
|
8
|
+
let initialDoc;
|
9
|
+
if (typeof initialDocOrFn === "function") {
|
10
|
+
initialDoc = initialDocOrFn();
|
11
|
+
} else {
|
12
|
+
initialDoc = initialDocOrFn;
|
13
|
+
}
|
14
|
+
const docId = initialDoc._id ?? "";
|
15
|
+
const [doc, setDoc] = useState(initialDoc);
|
16
|
+
const refreshDoc = useCallback(async () => {
|
17
|
+
const doc2 = docId ? await database.get(docId).catch(() => initialDoc) : initialDoc;
|
18
|
+
setDoc(doc2);
|
19
|
+
}, [docId]);
|
20
|
+
const saveDoc = useCallback(
|
21
|
+
async (existingDoc) => {
|
22
|
+
const res = await database.put(existingDoc ?? doc);
|
23
|
+
if (!existingDoc && !doc._id) setDoc((d) => ({ ...d, _id: res.id }));
|
24
|
+
return res;
|
25
|
+
},
|
26
|
+
[doc]
|
27
|
+
);
|
28
|
+
const deleteDoc = useCallback(
|
29
|
+
async (existingDoc) => {
|
30
|
+
const id = existingDoc?._id ?? docId;
|
31
|
+
const doc2 = await database.get(id).catch(() => void 0);
|
32
|
+
if (!doc2) throw database.logger.Error().Str("id", id).Msg(`Document not found`).AsError();
|
33
|
+
const res = await database.del(id);
|
34
|
+
setDoc(initialDoc);
|
35
|
+
return res;
|
36
|
+
},
|
37
|
+
[docId, initialDoc]
|
38
|
+
);
|
39
|
+
const updateDoc = useCallback(
|
40
|
+
(newDoc, opts = { replace: false, reset: false }) => {
|
41
|
+
if (!newDoc) return void (opts.reset ? setDoc(initialDoc) : refreshDoc());
|
42
|
+
setDoc((d) => opts.replace ? newDoc : { ...d, ...newDoc });
|
43
|
+
},
|
44
|
+
[refreshDoc, initialDoc]
|
45
|
+
);
|
46
|
+
useEffect(() => {
|
47
|
+
if (!docId) return;
|
48
|
+
return database.subscribe((changes) => {
|
49
|
+
if (changes.find((c) => c._id === docId)) {
|
50
|
+
void refreshDoc();
|
51
|
+
}
|
52
|
+
});
|
53
|
+
}, [docId, refreshDoc]);
|
54
|
+
useEffect(() => {
|
55
|
+
void refreshDoc();
|
56
|
+
}, [refreshDoc]);
|
57
|
+
return [{ _id: docId, ...doc }, updateDoc, saveDoc, deleteDoc];
|
58
|
+
}
|
59
|
+
function useLiveQuery2(mapFn, query = {}, initialRows = []) {
|
60
|
+
const [result, setResult] = useState(() => ({
|
61
|
+
rows: initialRows,
|
62
|
+
docs: initialRows.map((r) => r.doc).filter((r) => !!r)
|
63
|
+
}));
|
64
|
+
const queryString = useMemo(() => JSON.stringify(query), [query]);
|
65
|
+
const mapFnString = useMemo(() => mapFn.toString(), [mapFn]);
|
66
|
+
const refreshRows = useCallback(async () => {
|
67
|
+
const res = await database.query(mapFn, query);
|
68
|
+
setResult({ ...res, docs: res.rows.map((r) => r.doc) });
|
69
|
+
}, [mapFnString, queryString]);
|
70
|
+
useEffect(() => {
|
71
|
+
refreshRows();
|
72
|
+
return database.subscribe(refreshRows);
|
73
|
+
}, [refreshRows]);
|
74
|
+
return result;
|
75
|
+
}
|
76
|
+
function useAllDocs2(query = {}) {
|
77
|
+
const [result, setResult] = useState({
|
78
|
+
docs: []
|
79
|
+
});
|
80
|
+
const queryString = useMemo(() => JSON.stringify(query), [query]);
|
81
|
+
const refreshRows = useCallback(async () => {
|
82
|
+
const res = await database.allDocs(query);
|
83
|
+
setResult({ ...res, docs: res.rows.map((r) => r.value) });
|
84
|
+
}, [queryString]);
|
85
|
+
useEffect(() => {
|
86
|
+
refreshRows();
|
87
|
+
return database.subscribe(refreshRows);
|
88
|
+
}, [refreshRows]);
|
89
|
+
return result;
|
90
|
+
}
|
91
|
+
function useChanges2(since = [], opts = {}) {
|
92
|
+
const [result, setResult] = useState({
|
93
|
+
docs: []
|
94
|
+
});
|
95
|
+
const queryString = useMemo(() => JSON.stringify(opts), [opts]);
|
96
|
+
const refreshRows = useCallback(async () => {
|
97
|
+
const res = await database.changes(since, opts);
|
98
|
+
setResult({ ...res, docs: res.rows.map((r) => r.value) });
|
99
|
+
}, [since, queryString]);
|
100
|
+
useEffect(() => {
|
101
|
+
refreshRows();
|
102
|
+
return database.subscribe(refreshRows);
|
103
|
+
}, [refreshRows]);
|
104
|
+
return result;
|
105
|
+
}
|
106
|
+
return { database, useLiveQuery: useLiveQuery2, useDocument: useDocument2, useAllDocs: useAllDocs2, useChanges: useChanges2 };
|
107
|
+
}
|
108
|
+
|
109
|
+
// src/react/useDocument.ts
|
110
|
+
function topLevelUseDocument(...args) {
|
111
|
+
const { useDocument: useDocument2, database } = useFireproof();
|
112
|
+
topLevelUseDocument.database = database;
|
113
|
+
return useDocument2(...args);
|
114
|
+
}
|
115
|
+
var useDocument = topLevelUseDocument;
|
116
|
+
|
117
|
+
// src/react/useLiveQuery.ts
|
118
|
+
function topLevelUseLiveQuery(...args) {
|
119
|
+
const { useLiveQuery: useLiveQuery2, database } = useFireproof();
|
120
|
+
topLevelUseLiveQuery.database = database;
|
121
|
+
return useLiveQuery2(...args);
|
122
|
+
}
|
123
|
+
var useLiveQuery = topLevelUseLiveQuery;
|
124
|
+
|
125
|
+
// src/react/useAllDocs.ts
|
126
|
+
function topLevelUseAllDocs(...args) {
|
127
|
+
const { useAllDocs: useAllDocs2, database } = useFireproof();
|
128
|
+
topLevelUseAllDocs.database = database;
|
129
|
+
return useAllDocs2(...args);
|
130
|
+
}
|
131
|
+
var useAllDocs = topLevelUseAllDocs;
|
132
|
+
|
133
|
+
// src/react/useChanges.ts
|
134
|
+
function topLevelUseChanges(...args) {
|
135
|
+
const { useChanges: useChanges2, database } = useFireproof();
|
136
|
+
topLevelUseChanges.database = database;
|
137
|
+
return useChanges2(...args);
|
138
|
+
}
|
139
|
+
var useChanges = topLevelUseChanges;
|
140
|
+
export {
|
141
|
+
FireproofCtx,
|
142
|
+
useAllDocs,
|
143
|
+
useChanges,
|
144
|
+
useDocument,
|
145
|
+
useFireproof,
|
146
|
+
useLiveQuery
|
147
|
+
};
|
148
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../../src/react/useFireproof.ts","../../../src/react/useDocument.ts","../../../src/react/useLiveQuery.ts","../../../src/react/useAllDocs.ts","../../../src/react/useChanges.ts"],"sourcesContent":["import type {\n ConfigOpts,\n Database,\n DocFragment,\n DocResponse,\n DocSet,\n DocTypes,\n DocWithId,\n IndexKeyType,\n IndexRow,\n MapFn,\n QueryOpts,\n} from \"@fireproof/core\";\nimport { fireproof } from \"@fireproof/core\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { AllDocsQueryOpts, ChangesOptions, ClockHead } from \"../types\";\n\nexport interface LiveQueryResult<T extends DocTypes, K extends IndexKeyType, R extends DocFragment = T> {\n readonly docs: DocWithId<T>[];\n readonly rows: IndexRow<K, T, R>[];\n}\n\nexport type UseLiveQuery = <T extends DocTypes, K extends IndexKeyType = string, R extends DocFragment = T>(\n mapFn: string | MapFn<T>,\n query?: QueryOpts<K>,\n initialRows?: IndexRow<K, T, R>[],\n) => LiveQueryResult<T, K, R>;\n\nexport interface AllDocsResult<T extends DocTypes> {\n readonly docs: DocWithId<T>[];\n}\n\nexport interface ChangesResult<T extends DocTypes> {\n readonly docs: DocWithId<T>[];\n}\n\nexport type UseAllDocs = <T extends DocTypes>(query?: AllDocsQueryOpts) => AllDocsResult<T>;\n\nexport type UseChanges = <T extends DocTypes>(since: ClockHead, opts: ChangesOptions) => ChangesResult<T>;\n\ninterface UpdateDocFnOptions {\n readonly replace?: boolean;\n readonly reset?: boolean;\n}\n\ntype UpdateDocFn<T extends DocTypes> = (newDoc?: DocSet<T>, options?: UpdateDocFnOptions) => void;\n\ntype StoreDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;\n\ntype DeleteDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;\n\nexport type UseDocumentResult<T extends DocTypes> = [DocWithId<T>, UpdateDocFn<T>, StoreDocFn<T>, DeleteDocFn<T>];\n\nexport type UseDocumentInitialDocOrFn<T extends DocTypes> = DocSet<T> | (() => DocSet<T>);\nexport type UseDocument = <T extends DocTypes>(initialDocOrFn: UseDocumentInitialDocOrFn<T>) => UseDocumentResult<T>;\n\nexport interface UseFireproof {\n readonly database: Database;\n /**\n * ## Summary\n *\n * React hook that provides the ability to create/update/save new Fireproof documents into your custom Fireproof database.\n * The creation occurs when you do not pass in an `_id` as part of your initial document -- the database will assign a new\n * one when you call the provided `save` handler. The hook also provides generics support so you can inline your custom type into\n * the invocation to receive type-safety and auto-complete support in your IDE.\n *\n * ## Usage\n *\n * ```tsx\n * const [todo, setTodo, saveTodo] = useDocument<Todo>({\n * text: '',\n * date: Date.now(),\n * completed: false\n * })\n *\n * const [doc, setDoc, saveDoc] = useDocument<Customer>({\n * _id: `${props.customerId}-profile`, // you can imagine `customerId` as a prop passed in\n * name: \"\",\n * company: \"\",\n * startedAt: Date.now()\n * })\n * ```\n *\n * ## Overview\n *\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useLiveQuery` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\n readonly useDocument: UseDocument;\n /**\n * ## Summary\n * React hook that provides access to live query results, enabling real-time updates in your app.\n *\n * ## Usage\n * ```tsx\n * const result = useLiveQuery(\"date\"); // using string key\n * const result = useLiveQuery('date', { limit: 10, descending: true }) // key + options\n * const result = useLiveQuery<CustomType>(\"date\"); // using generics\n * const result = useLiveQuery((doc) => doc.date)); // using map function\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useLiveQuery` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\n readonly useLiveQuery: UseLiveQuery;\n /**\n * ## Summary\n * React hook that provides access to all documents in the database, sorted by `_id`.\n *\n * ## Usage\n * ```tsx\n * const result = useAllDocs({ limit: 10, descending: true }); // with options\n * const result = useAllDocs(); // without options\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useAllDocs` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\n readonly useAllDocs: UseAllDocs;\n /**\n * ## Summary\n * React hook that provides access to all new documents in the database added since the last time the changes was called\n *\n * ## Usage\n * ```tsx\n * const result = useChanges(prevresult.clock,{limit:10}); // with options\n * const result = useChanges(); // without options\n * const database = useChanges.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useAllDocs`, `useChanges` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\n readonly useChanges: UseChanges;\n}\n\n/**\n * @deprecated Use the `useFireproof` hook instead\n */\nexport const FireproofCtx = {} as UseFireproof;\n\n/**\n *\n * ## Summary\n *\n * React hook to create a custom-named Fireproof database and provides the utility hooks to query against it.\n *\n * ## Usage\n * ```tsx\n * const { database, useLiveQuery, useDocument } = useFireproof(\"dbname\");\n * const { database, useLiveQuery, useDocument } = useFireproof(\"dbname\", { ...options });\n * ```\n *\n * ## Overview\n *\n * TL;DR: Only use this hook if you need to configure a database name other than the default `useFireproof`.\n *\n * For most applications, using the `useLiveQuery` or `useDocument` hooks exported from `use-fireproof` should\n * suffice for the majority of use-cases. Under the hood, they act against a database named `useFireproof` instantiated with\n * default configurations. However, if you need to do a custom database setup or configure a database name more to your liking\n * than the default `useFireproof`, then use `useFireproof` as it exists for that purpose. It will provide you with the\n * custom database accessor and *lexically scoped* versions of `useLiveQuery` and `useDocument` that act against said\n * custom database.\n *\n */\nexport function useFireproof(name: string | Database = \"useFireproof\", config: ConfigOpts = {}): UseFireproof {\n const database = typeof name === \"string\" ? fireproof(name, config) : name;\n\n function useDocument<T extends DocTypes>(initialDocOrFn: UseDocumentInitialDocOrFn<T>): UseDocumentResult<T> {\n let initialDoc: DocSet<T>;\n if (typeof initialDocOrFn === \"function\") {\n initialDoc = initialDocOrFn();\n } else {\n initialDoc = initialDocOrFn;\n }\n\n // We purposely refetch the docId everytime to check if it has changed\n const docId = initialDoc._id ?? \"\";\n\n // We do not want to force consumers to memoize their initial document so we do it for them.\n // We use the stringified generator function to ensure that the memoization is stable across renders.\n // const initialDoc = useMemo(initialDocFn, [initialDocFn.toString()]);\n const [doc, setDoc] = useState(initialDoc);\n\n const refreshDoc = useCallback(async () => {\n // todo add option for mvcc checks\n const doc = docId ? await database.get<T>(docId).catch(() => initialDoc) : initialDoc;\n setDoc(doc);\n }, [docId]);\n\n const saveDoc: StoreDocFn<T> = useCallback(\n async (existingDoc) => {\n const res = await database.put(existingDoc ?? doc);\n // If the document was created, then we need to update the local state with the new `_id`\n if (!existingDoc && !doc._id) setDoc((d) => ({ ...d, _id: res.id }));\n return res;\n },\n [doc],\n );\n\n const deleteDoc: DeleteDocFn<T> = useCallback(\n async (existingDoc) => {\n const id = existingDoc?._id ?? docId;\n const doc = await database.get<T>(id).catch(() => undefined);\n if (!doc) throw database.logger.Error().Str(\"id\", id).Msg(`Document not found`).AsError();\n const res = await database.del(id);\n setDoc(initialDoc);\n return res;\n },\n [docId, initialDoc],\n );\n\n const updateDoc: UpdateDocFn<T> = useCallback(\n (newDoc, opts = { replace: false, reset: false }) => {\n if (!newDoc) return void (opts.reset ? setDoc(initialDoc) : refreshDoc());\n setDoc((d) => (opts.replace ? (newDoc as DocWithId<T>) : { ...d, ...newDoc }));\n },\n [refreshDoc, initialDoc],\n );\n\n useEffect(() => {\n if (!docId) return;\n return database.subscribe((changes) => {\n if (changes.find((c) => c._id === docId)) {\n void refreshDoc(); // todo use change.value\n }\n });\n }, [docId, refreshDoc]);\n\n useEffect(() => {\n void refreshDoc();\n }, [refreshDoc]);\n\n return [{ _id: docId, ...doc }, updateDoc, saveDoc, deleteDoc];\n }\n\n function useLiveQuery<T extends DocTypes, K extends IndexKeyType = string, R extends DocFragment = T>(\n mapFn: MapFn<T> | string,\n query = {},\n initialRows: IndexRow<K, T, R>[] = [],\n ): LiveQueryResult<T, K, R> {\n const [result, setResult] = useState<LiveQueryResult<T, K, R>>(() => ({\n rows: initialRows,\n docs: initialRows.map((r) => r.doc).filter((r): r is DocWithId<T> => !!r),\n }));\n\n const queryString = useMemo(() => JSON.stringify(query), [query]);\n const mapFnString = useMemo(() => mapFn.toString(), [mapFn]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.query<K, T, R>(mapFn, query);\n setResult({ ...res, docs: res.rows.map((r) => r.doc as DocWithId<T>) });\n }, [mapFnString, queryString]);\n\n useEffect(() => {\n refreshRows(); // Initial data fetch\n return database.subscribe(refreshRows);\n }, [refreshRows]);\n\n return result;\n }\n\n function useAllDocs<T extends DocTypes>(query: AllDocsQueryOpts = {}): AllDocsResult<T> {\n const [result, setResult] = useState<AllDocsResult<T>>({\n docs: [],\n });\n\n const queryString = useMemo(() => JSON.stringify(query), [query]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.allDocs<T>(query);\n setResult({ ...res, docs: res.rows.map((r) => r.value as DocWithId<T>) });\n }, [queryString]);\n\n useEffect(() => {\n refreshRows(); // Initial data fetch\n return database.subscribe(refreshRows);\n }, [refreshRows]);\n\n return result;\n }\n\n function useChanges<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): ChangesResult<T> {\n const [result, setResult] = useState<ChangesResult<T>>({\n docs: [],\n });\n\n const queryString = useMemo(() => JSON.stringify(opts), [opts]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.changes<T>(since, opts);\n setResult({ ...res, docs: res.rows.map((r) => r.value as DocWithId<T>) });\n }, [since, queryString]);\n\n useEffect(() => {\n refreshRows(); // Initial data fetch\n return database.subscribe(refreshRows);\n }, [refreshRows]);\n\n return result;\n }\n\n return { database, useLiveQuery, useDocument, useAllDocs, useChanges };\n}\n","import { Database, DocTypes, DocWithId } from \"@fireproof/core\";\n\nimport { UseDocument, UseDocumentResult, useFireproof } from \"./useFireproof\";\n\nexport interface TLUseDocument {\n <T extends DocTypes>(initialDoc: DocWithId<T>): UseDocumentResult<T>;\n database: Database;\n}\n\nfunction topLevelUseDocument(...args: Parameters<UseDocument>) {\n const { useDocument, database } = useFireproof();\n (topLevelUseDocument as TLUseDocument).database = database;\n return useDocument(...args);\n}\n\n/**\n * ## Summary\n *\n * React hook that provides the ability to create new Fireproof documents. The creation occurs when\n * you do not pass in an `_id` as part of your initial document -- the database will assign a new one when\n * you call the provided `save` handler This uses the default database named `useFireproof` under the hood which you can also\n * access via the `database` accessor.\n *\n * ## Usage\n *\n * ```tsx\n * const [todo, setTodo, saveTodo] = useDocument(() => ({\n * text: '',\n * date: Date.now(),\n * completed: false\n * }))\n *\n * const [doc, setDoc, saveDoc] = useDocument(() => ({\n * _id: `${props.customerId}-profile`, // you can imagine `customerId` as a prop passed in\n * name: \"\",\n * company: \"\",\n * startedAt: Date.now()\n * }))\n *\n * const database = useDocument.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useLiveQuery` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\nexport const useDocument = topLevelUseDocument as TLUseDocument;\n","import { Database, DocFragment, DocTypes, IndexKeyType } from \"@fireproof/core\";\n\nimport { LiveQueryResult, useFireproof, UseLiveQuery } from \"./useFireproof\";\n\nexport interface TLUseLiveQuery {\n <T extends DocTypes, K extends IndexKeyType, R extends DocFragment = T>(\n ...args: Parameters<UseLiveQuery>\n ): LiveQueryResult<T, K, R>;\n database: Database;\n}\n\nfunction topLevelUseLiveQuery(...args: Parameters<UseLiveQuery>) {\n const { useLiveQuery, database } = useFireproof();\n (topLevelUseLiveQuery as TLUseLiveQuery).database = database;\n return useLiveQuery(...args);\n}\n\n/**\n * ## Summary\n * React hook that provides access to live query results, enabling real-time updates in your app. This uses\n * the default database named \"useFireproof\" under the hood which you can also access via the `database` accessor.\n *\n * ## Usage\n * ```tsx\n * const results = useLiveQuery(\"date\"); // using string\n * const results = useLiveQuery((doc) => doc.date)); // using map function\n * const database = useLiveQuery.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useLiveQuery` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\nexport const useLiveQuery = topLevelUseLiveQuery as TLUseLiveQuery;\n","import { Database, DocTypes } from \"@fireproof/core\";\n\nimport { AllDocsResult, useFireproof, UseAllDocs } from \"./useFireproof\";\n\nexport interface TLUseAllDocs {\n <T extends DocTypes>(...args: Parameters<UseAllDocs>): AllDocsResult<T>;\n database: Database;\n}\n\nfunction topLevelUseAllDocs(...args: Parameters<UseAllDocs>) {\n const { useAllDocs, database } = useFireproof();\n (topLevelUseAllDocs as TLUseAllDocs).database = database;\n return useAllDocs(...args);\n}\n\n/**\n * ## Summary\n * React hook that provides access to all documents in the database, sorted by `_id`.\n *\n * ## Usage\n * ```tsx\n * const result = useAllDocs({ limit: 10, descending: true }); // with options\n * const result = useAllDocs(); // without options\n * const database = useAllDocs.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useAllDocs` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\nexport const useAllDocs = topLevelUseAllDocs as TLUseAllDocs;\n","import { Database, DocTypes } from \"@fireproof/core\";\n\nimport { ChangesResult, useFireproof, UseChanges } from \"./useFireproof\";\n\nexport interface TLUseChanges {\n <T extends DocTypes>(...args: Parameters<UseChanges>): ChangesResult<T>;\n database: Database;\n}\n\nfunction topLevelUseChanges(...args: Parameters<UseChanges>) {\n const { useChanges, database } = useFireproof();\n (topLevelUseChanges as TLUseChanges).database = database;\n return useChanges(...args);\n}\n\n/**\n * ## Summary\n * React hook that provides access to all new documents in the database added since the last time the changes was called\n *\n * ## Usage\n * ```tsx\n * const result = useChanges(prevresult.clock,{limit:10}); // with options\n * const result = useChanges(); // without options\n * const database = useChanges.database; // underlying \"useFireproof\" database accessor\n * ```\n *\n * ## Overview\n * Changes made via remote sync peers, or other members of your cloud replica group will appear automatically\n * when you use the `useAllDocs`, `useChanges` and `useDocument` APIs. By default, Fireproof stores data in the browser's\n * local storage.\n */\nexport const useChanges = topLevelUseChanges as TLUseChanges;\n"],"mappings":";AAaA,SAAS,iBAAiB;AAC1B,SAAS,aAAa,WAAW,SAAS,gBAAgB;AAoInD,IAAM,eAAe,CAAC;AA0BtB,SAAS,aAAa,OAA0B,gBAAgB,SAAqB,CAAC,GAAiB;AAC5G,QAAM,WAAW,OAAO,SAAS,WAAW,UAAU,MAAM,MAAM,IAAI;AAEtE,WAASA,aAAgC,gBAAoE;AAC3G,QAAI;AACJ,QAAI,OAAO,mBAAmB,YAAY;AACxC,mBAAa,eAAe;AAAA,IAC9B,OAAO;AACL,mBAAa;AAAA,IACf;AAGA,UAAM,QAAQ,WAAW,OAAO;AAKhC,UAAM,CAAC,KAAK,MAAM,IAAI,SAAS,UAAU;AAEzC,UAAM,aAAa,YAAY,YAAY;AAEzC,YAAMC,OAAM,QAAQ,MAAM,SAAS,IAAO,KAAK,EAAE,MAAM,MAAM,UAAU,IAAI;AAC3E,aAAOA,IAAG;AAAA,IACZ,GAAG,CAAC,KAAK,CAAC;AAEV,UAAM,UAAyB;AAAA,MAC7B,OAAO,gBAAgB;AACrB,cAAM,MAAM,MAAM,SAAS,IAAI,eAAe,GAAG;AAEjD,YAAI,CAAC,eAAe,CAAC,IAAI,IAAK,QAAO,CAAC,OAAO,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,EAAE;AACnE,eAAO;AAAA,MACT;AAAA,MACA,CAAC,GAAG;AAAA,IACN;AAEA,UAAM,YAA4B;AAAA,MAChC,OAAO,gBAAgB;AACrB,cAAM,KAAK,aAAa,OAAO;AAC/B,cAAMA,OAAM,MAAM,SAAS,IAAO,EAAE,EAAE,MAAM,MAAM,MAAS;AAC3D,YAAI,CAACA,KAAK,OAAM,SAAS,OAAO,MAAM,EAAE,IAAI,MAAM,EAAE,EAAE,IAAI,oBAAoB,EAAE,QAAQ;AACxF,cAAM,MAAM,MAAM,SAAS,IAAI,EAAE;AACjC,eAAO,UAAU;AACjB,eAAO;AAAA,MACT;AAAA,MACA,CAAC,OAAO,UAAU;AAAA,IACpB;AAEA,UAAM,YAA4B;AAAA,MAChC,CAAC,QAAQ,OAAO,EAAE,SAAS,OAAO,OAAO,MAAM,MAAM;AACnD,YAAI,CAAC,OAAQ,QAAO,MAAM,KAAK,QAAQ,OAAO,UAAU,IAAI,WAAW;AACvE,eAAO,CAAC,MAAO,KAAK,UAAW,SAA0B,EAAE,GAAG,GAAG,GAAG,OAAO,CAAE;AAAA,MAC/E;AAAA,MACA,CAAC,YAAY,UAAU;AAAA,IACzB;AAEA,cAAU,MAAM;AACd,UAAI,CAAC,MAAO;AACZ,aAAO,SAAS,UAAU,CAAC,YAAY;AACrC,YAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,GAAG;AACxC,eAAK,WAAW;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH,GAAG,CAAC,OAAO,UAAU,CAAC;AAEtB,cAAU,MAAM;AACd,WAAK,WAAW;AAAA,IAClB,GAAG,CAAC,UAAU,CAAC;AAEf,WAAO,CAAC,EAAE,KAAK,OAAO,GAAG,IAAI,GAAG,WAAW,SAAS,SAAS;AAAA,EAC/D;AAEA,WAASC,cACP,OACA,QAAQ,CAAC,GACT,cAAmC,CAAC,GACV;AAC1B,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAmC,OAAO;AAAA,MACpE,MAAM;AAAA,MACN,MAAM,YAAY,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAyB,CAAC,CAAC,CAAC;AAAA,IAC1E,EAAE;AAEF,UAAM,cAAc,QAAQ,MAAM,KAAK,UAAU,KAAK,GAAG,CAAC,KAAK,CAAC;AAChE,UAAM,cAAc,QAAQ,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC;AAE3D,UAAM,cAAc,YAAY,YAAY;AAC1C,YAAM,MAAM,MAAM,SAAS,MAAe,OAAO,KAAK;AACtD,gBAAU,EAAE,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,GAAmB,EAAE,CAAC;AAAA,IACxE,GAAG,CAAC,aAAa,WAAW,CAAC;AAE7B,cAAU,MAAM;AACd,kBAAY;AACZ,aAAO,SAAS,UAAU,WAAW;AAAA,IACvC,GAAG,CAAC,WAAW,CAAC;AAEhB,WAAO;AAAA,EACT;AAEA,WAASC,YAA+B,QAA0B,CAAC,GAAqB;AACtF,UAAM,CAAC,QAAQ,SAAS,IAAI,SAA2B;AAAA,MACrD,MAAM,CAAC;AAAA,IACT,CAAC;AAED,UAAM,cAAc,QAAQ,MAAM,KAAK,UAAU,KAAK,GAAG,CAAC,KAAK,CAAC;AAEhE,UAAM,cAAc,YAAY,YAAY;AAC1C,YAAM,MAAM,MAAM,SAAS,QAAW,KAAK;AAC3C,gBAAU,EAAE,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,KAAqB,EAAE,CAAC;AAAA,IAC1E,GAAG,CAAC,WAAW,CAAC;AAEhB,cAAU,MAAM;AACd,kBAAY;AACZ,aAAO,SAAS,UAAU,WAAW;AAAA,IACvC,GAAG,CAAC,WAAW,CAAC;AAEhB,WAAO;AAAA,EACT;AAEA,WAASC,YAA+B,QAAmB,CAAC,GAAG,OAAuB,CAAC,GAAqB;AAC1G,UAAM,CAAC,QAAQ,SAAS,IAAI,SAA2B;AAAA,MACrD,MAAM,CAAC;AAAA,IACT,CAAC;AAED,UAAM,cAAc,QAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,CAAC;AAE9D,UAAM,cAAc,YAAY,YAAY;AAC1C,YAAM,MAAM,MAAM,SAAS,QAAW,OAAO,IAAI;AACjD,gBAAU,EAAE,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,KAAqB,EAAE,CAAC;AAAA,IAC1E,GAAG,CAAC,OAAO,WAAW,CAAC;AAEvB,cAAU,MAAM;AACd,kBAAY;AACZ,aAAO,SAAS,UAAU,WAAW;AAAA,IACvC,GAAG,CAAC,WAAW,CAAC;AAEhB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,UAAU,cAAAF,eAAc,aAAAF,cAAa,YAAAG,aAAY,YAAAC,YAAW;AACvE;;;AC7SA,SAAS,uBAAuB,MAA+B;AAC7D,QAAM,EAAE,aAAAC,cAAa,SAAS,IAAI,aAAa;AAC/C,EAAC,oBAAsC,WAAW;AAClD,SAAOA,aAAY,GAAG,IAAI;AAC5B;AAkCO,IAAM,cAAc;;;ACpC3B,SAAS,wBAAwB,MAAgC;AAC/D,QAAM,EAAE,cAAAC,eAAc,SAAS,IAAI,aAAa;AAChD,EAAC,qBAAwC,WAAW;AACpD,SAAOA,cAAa,GAAG,IAAI;AAC7B;AAmBO,IAAM,eAAe;;;ACzB5B,SAAS,sBAAsB,MAA8B;AAC3D,QAAM,EAAE,YAAAC,aAAY,SAAS,IAAI,aAAa;AAC9C,EAAC,mBAAoC,WAAW;AAChD,SAAOA,YAAW,GAAG,IAAI;AAC3B;AAkBO,IAAM,aAAa;;;ACtB1B,SAAS,sBAAsB,MAA8B;AAC3D,QAAM,EAAE,YAAAC,aAAY,SAAS,IAAI,aAAa;AAC9C,EAAC,mBAAoC,WAAW;AAChD,SAAOA,YAAW,GAAG,IAAI;AAC3B;AAkBO,IAAM,aAAa;","names":["useDocument","doc","useLiveQuery","useAllDocs","useChanges","useDocument","useLiveQuery","useAllDocs","useChanges"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"inputs":{"src/react/useFireproof.ts":{"bytes":11378,"imports":[{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"../types","kind":"import-statement","external":true}],"format":"esm"},"src/react/useDocument.ts":{"bytes":1677,"imports":[{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"src/react/useFireproof.ts","kind":"import-statement","original":"./useFireproof"}],"format":"esm"},"src/react/useLiveQuery.ts":{"bytes":1406,"imports":[{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"src/react/useFireproof.ts","kind":"import-statement","original":"./useFireproof"}],"format":"esm"},"src/react/useAllDocs.ts":{"bytes":1143,"imports":[{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"src/react/useFireproof.ts","kind":"import-statement","original":"./useFireproof"}],"format":"esm"},"src/react/useChanges.ts":{"bytes":1188,"imports":[{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"src/react/useFireproof.ts","kind":"import-statement","original":"./useFireproof"}],"format":"esm"},"src/react/index.ts":{"bytes":424,"imports":[{"path":"src/react/useDocument.ts","kind":"import-statement","original":"./useDocument"},{"path":"src/react/useFireproof.ts","kind":"import-statement","original":"./useFireproof"},{"path":"src/react/useLiveQuery.ts","kind":"import-statement","original":"./useLiveQuery"},{"path":"src/react/useAllDocs.ts","kind":"import-statement","original":"./useAllDocs"},{"path":"src/react/useChanges.ts","kind":"import-statement","original":"./useChanges"}],"format":"esm"}},"outputs":{"dist/fireproof-core/react/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":22038},"dist/fireproof-core/react/index.cjs":{"imports":[{"path":"@fireproof/core","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/react/index.ts","inputs":{"src/react/index.ts":{"bytesInOutput":305},"src/react/useFireproof.ts":{"bytesInOutput":4237},"src/react/useDocument.ts":{"bytesInOutput":222},"src/react/useLiveQuery.ts":{"bytesInOutput":229},"src/react/useAllDocs.ts":{"bytesInOutput":215},"src/react/useChanges.ts":{"bytesInOutput":215}},"bytes":6390}}}
|