@fireproof/core 0.19.121-dev → 0.19.122

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.
Files changed (70) hide show
  1. package/deno.json +3 -3
  2. package/index.cjs +600 -1004
  3. package/index.cjs.map +1 -1
  4. package/index.d.cts +26 -60
  5. package/index.d.ts +26 -60
  6. package/index.js +392 -97
  7. package/index.js.map +1 -1
  8. package/metafile-cjs.json +1 -1
  9. package/metafile-esm.json +1 -1
  10. package/node/index.cjs +374 -0
  11. package/node/index.cjs.map +1 -0
  12. package/node/index.d.cts +43 -0
  13. package/node/index.d.ts +43 -0
  14. package/node/index.js +279 -0
  15. package/node/index.js.map +1 -0
  16. package/node/{mem-filesystem.js → mem-filesystem-LPPT7QV5.js} +1 -1
  17. package/node/metafile-cjs.json +1 -1
  18. package/node/metafile-esm.json +1 -1
  19. package/package.json +17 -15
  20. package/react/index.cjs +91 -26
  21. package/react/index.cjs.map +1 -1
  22. package/react/index.d.cts +16 -1
  23. package/react/index.d.ts +16 -1
  24. package/react/index.js +92 -27
  25. package/react/index.js.map +1 -1
  26. package/react/metafile-cjs.json +1 -1
  27. package/react/metafile-esm.json +1 -1
  28. package/tests/blockstore/keyed-crypto.test.ts +4 -2
  29. package/tests/fireproof/config.test.ts +133 -142
  30. package/web/{gateway-impl.cjs → index.cjs} +58 -9
  31. package/web/index.cjs.map +1 -0
  32. package/web/index.d.cts +44 -0
  33. package/web/index.d.ts +44 -0
  34. package/web/{gateway-impl.js → index.js} +52 -5
  35. package/web/index.js.map +1 -0
  36. package/web/metafile-cjs.json +1 -1
  37. package/web/metafile-esm.json +1 -1
  38. package/chunk-7EWIAXTM.js +0 -7
  39. package/chunk-7EWIAXTM.js.map +0 -1
  40. package/chunk-F4FC6B2T.js +0 -63
  41. package/chunk-F4FC6B2T.js.map +0 -1
  42. package/chunk-PZ5AY32C.js +0 -10
  43. package/chunk-PZ5AY32C.js.map +0 -1
  44. package/chunk-RXC4JGJT.js +0 -301
  45. package/chunk-RXC4JGJT.js.map +0 -1
  46. package/gateway-C62S56GY.js +0 -66
  47. package/gateway-C62S56GY.js.map +0 -1
  48. package/gateway-VVS4QWDA.js +0 -145
  49. package/gateway-VVS4QWDA.js.map +0 -1
  50. package/key-bag-file-PWZ3QE7B.js +0 -55
  51. package/key-bag-file-PWZ3QE7B.js.map +0 -1
  52. package/key-bag-indexdb-SYG3YD4D.js +0 -51
  53. package/key-bag-indexdb-SYG3YD4D.js.map +0 -1
  54. package/node/mem-filesystem.cjs +0 -72
  55. package/node/mem-filesystem.cjs.map +0 -1
  56. package/node/mem-filesystem.d.cts +0 -25
  57. package/node/mem-filesystem.d.ts +0 -25
  58. package/node/node-filesystem.cjs +0 -86
  59. package/node/node-filesystem.cjs.map +0 -1
  60. package/node/node-filesystem.d.cts +0 -35
  61. package/node/node-filesystem.d.ts +0 -35
  62. package/node/node-filesystem.js +0 -44
  63. package/node/node-filesystem.js.map +0 -1
  64. package/utils-ZVVGAXFE.js +0 -13
  65. package/utils-ZVVGAXFE.js.map +0 -1
  66. package/web/gateway-impl.cjs.map +0 -1
  67. package/web/gateway-impl.d.cts +0 -31
  68. package/web/gateway-impl.d.ts +0 -31
  69. package/web/gateway-impl.js.map +0 -1
  70. /package/node/{mem-filesystem.js.map → mem-filesystem-LPPT7QV5.js.map} +0 -0
package/node/index.js ADDED
@@ -0,0 +1,279 @@
1
+ import {
2
+ toArrayBuffer
3
+ } from "./chunk-4A4RAVNS.js";
4
+
5
+ // src/runtime/gateways/file/node/key-bag-file.ts
6
+ import { isNotFoundError } from "@fireproof/core";
7
+
8
+ // src/runtime/gateways/file/node/get-file-system.ts
9
+ import { KeyedResolvOnce } from "@adviser/cement";
10
+
11
+ // src/runtime/gateways/file/node/node-filesystem.ts
12
+ import { runtimeFn } from "@adviser/cement";
13
+ var NodeFileSystem = class {
14
+ async start() {
15
+ this.fs = await import("node:fs/promises");
16
+ return this;
17
+ }
18
+ async mkdir(path, options) {
19
+ return this.fs?.mkdir(path, options);
20
+ }
21
+ async readdir(path, options) {
22
+ return this.fs?.readdir(path, options);
23
+ }
24
+ async rm(path, options) {
25
+ return this.fs?.rm(path, options);
26
+ }
27
+ async copyFile(source, destination) {
28
+ return this.fs?.copyFile(source, destination);
29
+ }
30
+ async readfile(path, options) {
31
+ const ret = await this.fs?.readFile(path, options);
32
+ return toArrayBuffer(ret);
33
+ }
34
+ stat(path) {
35
+ return this.fs?.stat(path);
36
+ }
37
+ async unlink(path) {
38
+ return this.fs?.unlink(path);
39
+ }
40
+ async writefile(path, data) {
41
+ if (runtimeFn().isDeno) {
42
+ return this.fs?.writeFile(path, data);
43
+ }
44
+ return this.fs?.writeFile(path, Buffer.from(data));
45
+ }
46
+ };
47
+
48
+ // src/runtime/gateways/file/node/get-file-system.ts
49
+ var externalLoaders = new KeyedResolvOnce();
50
+ async function getFileSystem(url) {
51
+ const name = url.getParam("fs", "node");
52
+ let fs;
53
+ switch (name) {
54
+ case "mem":
55
+ fs = await externalLoaders.get(name).once(async () => {
56
+ const { MemFileSystem } = await import("./mem-filesystem-LPPT7QV5.js");
57
+ return new MemFileSystem();
58
+ });
59
+ break;
60
+ // case 'deno': {
61
+ // const { DenoFileSystem } = await import("./deno-filesystem.js");
62
+ // fs = new DenoFileSystem();
63
+ // break;
64
+ // }
65
+ default:
66
+ fs = await externalLoaders.get(name).once(async () => {
67
+ return new NodeFileSystem();
68
+ });
69
+ }
70
+ return fs.start();
71
+ }
72
+
73
+ // src/runtime/gateways/file/node/key-bag-file.ts
74
+ var KeyBagProviderFile = class {
75
+ async _prepare(id) {
76
+ await this.sthis.start();
77
+ let sysFS;
78
+ switch (this.url.protocol) {
79
+ case "file:": {
80
+ sysFS = await getFileSystem(this.url);
81
+ break;
82
+ }
83
+ default:
84
+ throw this.logger.Error().Url(this.url).Msg("unsupported protocol").AsError();
85
+ }
86
+ const dirName = this.url.pathname;
87
+ await sysFS.mkdir(dirName, { recursive: true });
88
+ return {
89
+ dirName,
90
+ sysFS,
91
+ fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, "_")}.json`)
92
+ };
93
+ }
94
+ constructor(url, sthis) {
95
+ this.url = url;
96
+ this.sthis = sthis;
97
+ this.logger = sthis.logger;
98
+ }
99
+ async get(id) {
100
+ const ctx = await this._prepare(id);
101
+ try {
102
+ const p = await ctx.sysFS.readfile(ctx.fName);
103
+ const ki = JSON.parse(this.sthis.txt.decode(p));
104
+ return ki;
105
+ } catch (e) {
106
+ if (isNotFoundError(e)) {
107
+ return void 0;
108
+ }
109
+ throw this.logger.Error().Err(e).Str("file", ctx.dirName).Msg("read bag failed").AsError();
110
+ }
111
+ }
112
+ async set(id, item) {
113
+ const ctx = await this._prepare(id);
114
+ const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));
115
+ await ctx.sysFS.writefile(ctx.fName, p);
116
+ }
117
+ };
118
+
119
+ // src/runtime/gateways/file/version.ts
120
+ var FILESTORE_VERSION = "v0.19-file";
121
+
122
+ // src/runtime/gateways/file/node/gateway-impl.ts
123
+ import { exception2Result, KeyedResolvOnce as KeyedResolvOnce2, Result } from "@adviser/cement";
124
+ import { ensureLogger, exceptionWrapper, isNotFoundError as isNotFoundError2, NotFoundError } from "@fireproof/core";
125
+
126
+ // src/runtime/gateways/file/node/utils.ts
127
+ import { getStore } from "@fireproof/core";
128
+ function getPath(url, sthis) {
129
+ const basePath = url.pathname;
130
+ const name = url.getParam("name");
131
+ if (name) {
132
+ const version = url.getParam("version");
133
+ if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();
134
+ return sthis.pathOps.join(basePath, version, name);
135
+ }
136
+ return sthis.pathOps.join(basePath);
137
+ }
138
+ function getFileName(url, sthis) {
139
+ const key = url.getParam("key");
140
+ if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();
141
+ const res = getStore(url, sthis, (...a) => a.join("-"));
142
+ switch (res.store) {
143
+ case "data":
144
+ return sthis.pathOps.join(res.name, key + ".car");
145
+ case "wal":
146
+ case "meta":
147
+ return sthis.pathOps.join(res.name, key + ".json");
148
+ default:
149
+ throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();
150
+ }
151
+ }
152
+
153
+ // src/runtime/gateways/file/node/gateway-impl.ts
154
+ var versionFiles = new KeyedResolvOnce2();
155
+ var FileGateway = class {
156
+ constructor(sthis) {
157
+ this.sthis = sthis;
158
+ this.logger = sthis.logger;
159
+ }
160
+ async getVersionFromFile(fs, path, logger) {
161
+ return versionFiles.get(path).once(async () => {
162
+ await fs.mkdir(path, { recursive: true });
163
+ const vFile = this.sthis.pathOps.join(path, "version");
164
+ const vFileStat = await fs.stat(vFile).catch(() => void 0);
165
+ if (!vFileStat) {
166
+ await fs.writefile(this.sthis.pathOps.join(path, "version"), FILESTORE_VERSION);
167
+ return FILESTORE_VERSION;
168
+ } else if (!vFileStat.isFile()) {
169
+ throw logger.Error().Str("file", vFile).Msg(`version file is a directory`).AsError();
170
+ }
171
+ const v = await fs.readfile(vFile);
172
+ const vStr = this.sthis.txt.decode(v);
173
+ if (vStr !== FILESTORE_VERSION) {
174
+ logger.Warn().Str("file", vFile).Str("from", vStr).Str("expected", FILESTORE_VERSION).Msg(`version mismatch`);
175
+ }
176
+ return vStr;
177
+ });
178
+ }
179
+ start(baseURL) {
180
+ return exception2Result(async () => {
181
+ const fs = await getFileSystem(baseURL);
182
+ const url = baseURL.build();
183
+ url.defParam("version", FILESTORE_VERSION);
184
+ const dbUrl = await this.buildUrl(url.URI(), "dummy");
185
+ const dbdirFile = this.getFilePath(dbUrl.Ok());
186
+ await fs.mkdir(this.sthis.pathOps.dirname(dbdirFile), { recursive: true });
187
+ const dbroot = this.sthis.pathOps.dirname(dbdirFile);
188
+ this.logger.Debug().Url(url.URI()).Str("dbroot", dbroot).Msg("start");
189
+ url.setParam("version", await this.getVersionFromFile(fs, dbroot, this.logger));
190
+ return url.URI();
191
+ });
192
+ }
193
+ async buildUrl(baseUrl, key) {
194
+ return Result.Ok(baseUrl.build().setParam("key", key).URI());
195
+ }
196
+ async close() {
197
+ return Result.Ok(void 0);
198
+ }
199
+ // abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;
200
+ getFilePath(url) {
201
+ const key = url.getParam("key");
202
+ if (!key) throw this.logger.Error().Url(url).Msg(`key not found`).AsError();
203
+ return this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
204
+ }
205
+ async put(url, body) {
206
+ return exception2Result(async () => {
207
+ const file = await this.getFilePath(url);
208
+ this.logger.Debug().Str("url", url.toString()).Str("file", file).Msg("put");
209
+ await getFileSystem(url).then((fs) => fs.writefile(file, body));
210
+ });
211
+ }
212
+ async get(url) {
213
+ return exceptionWrapper(async () => {
214
+ const file = this.getFilePath(url);
215
+ try {
216
+ const res = await getFileSystem(url).then((fs) => fs.readfile(file));
217
+ this.logger.Debug().Url(url.asURL()).Str("file", file).Msg("get");
218
+ return Result.Ok(new Uint8Array(res));
219
+ } catch (e) {
220
+ if (isNotFoundError2(e)) {
221
+ return Result.Err(new NotFoundError(`file not found: ${file}`));
222
+ }
223
+ return Result.Err(e);
224
+ }
225
+ });
226
+ }
227
+ async delete(url) {
228
+ return exception2Result(async () => {
229
+ await getFileSystem(url).then((fs) => fs.unlink(this.getFilePath(url)));
230
+ });
231
+ }
232
+ async destroy(baseURL) {
233
+ const url = await this.buildUrl(baseURL, "x");
234
+ if (url.isErr()) return url;
235
+ const filepath = this.sthis.pathOps.dirname(this.getFilePath(url.Ok()));
236
+ const fs = await getFileSystem(baseURL);
237
+ let files = [];
238
+ try {
239
+ files = await fs.readdir(filepath);
240
+ } catch (e) {
241
+ if (!isNotFoundError2(e)) {
242
+ throw this.logger.Error().Err(e).Str("dir", filepath).Msg("destroy:readdir").AsError();
243
+ }
244
+ }
245
+ for (const file of files) {
246
+ const pathed = this.sthis.pathOps.join(filepath, file);
247
+ try {
248
+ await fs.unlink(pathed);
249
+ } catch (e) {
250
+ if (!isNotFoundError2(e)) {
251
+ throw this.logger.Error().Err(e).Str("file", pathed).Msg("destroy:unlink").AsError();
252
+ }
253
+ }
254
+ }
255
+ return Result.Ok(void 0);
256
+ }
257
+ };
258
+ var FileTestGateway = class {
259
+ constructor(sthis) {
260
+ this.logger = ensureLogger(sthis, "FileTestStore");
261
+ this.sthis = sthis;
262
+ }
263
+ async get(iurl, key) {
264
+ const url = iurl.build().setParam("key", key).URI();
265
+ const dbFile = this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
266
+ this.logger.Debug().Url(url).Str("dbFile", dbFile).Msg("get");
267
+ const buffer = await (await getFileSystem(url)).readfile(dbFile);
268
+ this.logger.Debug().Url(url).Str("dbFile", dbFile).Len(buffer).Msg("got");
269
+ return buffer;
270
+ }
271
+ };
272
+ export {
273
+ FileGateway as GatewayImpl,
274
+ FileTestGateway as GatewayTestImpl,
275
+ KeyBagProviderFile,
276
+ KeyBagProviderFile as KeyBagProviderImpl,
277
+ getFileSystem
278
+ };
279
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/runtime/gateways/file/node/key-bag-file.ts","../../../src/runtime/gateways/file/node/get-file-system.ts","../../../src/runtime/gateways/file/node/node-filesystem.ts","../../../src/runtime/gateways/file/version.ts","../../../src/runtime/gateways/file/node/gateway-impl.ts","../../../src/runtime/gateways/file/node/utils.ts"],"sourcesContent":["import { URI } from \"@adviser/cement\";\nimport { isNotFoundError, Logger } from \"@fireproof/core\";\nimport type { rt, SuperThis, SysFileSystem } from \"@fireproof/core\";\nimport { getFileSystem } from \"./get-file-system.js\";\n\ninterface KeyBagCtx {\n readonly dirName: string;\n readonly sysFS: SysFileSystem;\n readonly fName: string;\n}\n\nexport class KeyBagProviderFile implements rt.kb.KeyBagProvider {\n async _prepare(id: string): Promise<KeyBagCtx> {\n await this.sthis.start();\n let sysFS: SysFileSystem;\n switch (this.url.protocol) {\n case \"file:\": {\n sysFS = await getFileSystem(this.url);\n break;\n }\n default:\n throw this.logger.Error().Url(this.url).Msg(\"unsupported protocol\").AsError();\n }\n const dirName = this.url.pathname;\n await sysFS.mkdir(dirName, { recursive: true });\n return {\n dirName,\n sysFS,\n fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`),\n };\n }\n\n private readonly url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.url = url;\n this.sthis = sthis;\n this.logger = sthis.logger;\n }\n\n async get(id: string): Promise<rt.kb.KeyItem | undefined> {\n const ctx = await this._prepare(id);\n try {\n const p = await ctx.sysFS.readfile(ctx.fName);\n const ki = JSON.parse(this.sthis.txt.decode(p)) as rt.kb.KeyItem;\n return ki;\n } catch (e) {\n if (isNotFoundError(e)) {\n return undefined;\n }\n throw this.logger.Error().Err(e).Str(\"file\", ctx.dirName).Msg(\"read bag failed\").AsError();\n }\n }\n\n async set(id: string, item: rt.kb.KeyItem): Promise<void> {\n const ctx = await this._prepare(id);\n const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));\n await ctx.sysFS.writefile(ctx.fName, p);\n }\n}\n","import { KeyedResolvOnce, type URI } from \"@adviser/cement\";\nimport type { SysFileSystem } from \"@fireproof/core\";\nimport { NodeFileSystem } from \"./node-filesystem.js\";\n\nconst externalLoaders = new KeyedResolvOnce<SysFileSystem>();\nexport async function getFileSystem(url: URI): Promise<SysFileSystem> {\n const name = url.getParam(\"fs\", \"node\");\n let fs: SysFileSystem;\n switch (name) {\n case \"mem\":\n fs = await externalLoaders.get(name).once(async () => {\n const { MemFileSystem } = await import(\"./mem-filesystem.js\");\n return new MemFileSystem();\n });\n break;\n // case 'deno': {\n // const { DenoFileSystem } = await import(\"./deno-filesystem.js\");\n // fs = new DenoFileSystem();\n // break;\n // }\n default:\n fs = await externalLoaders.get(name).once(async () => {\n return new NodeFileSystem();\n });\n }\n return fs.start();\n}\n","import type { PathLike, MakeDirectoryOptions, Stats, ObjectEncodingOptions } from \"node:fs\";\nimport type { mkdir, readdir, rm, copyFile, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { toArrayBuffer } from \"./to-array-buffer.js\";\nimport type { SysFileSystem } from \"@fireproof/core\";\nimport { runtimeFn } from \"@adviser/cement\";\n\nexport class NodeFileSystem implements SysFileSystem {\n fs?: {\n mkdir: typeof mkdir;\n readdir: typeof readdir;\n rm: typeof rm;\n copyFile: typeof copyFile;\n readFile: typeof readFile;\n stat: typeof stat;\n unlink: typeof unlink;\n writeFile: typeof writeFile;\n };\n\n async start(): Promise<SysFileSystem> {\n this.fs = await import(\"node:fs/promises\");\n return this;\n }\n async mkdir(path: PathLike, options?: { recursive: boolean }): Promise<string | undefined> {\n return this.fs?.mkdir(path, options);\n }\n async readdir(path: PathLike, options?: ObjectEncodingOptions): Promise<string[]> {\n return this.fs?.readdir(path, options) as Promise<string[]>;\n }\n async rm(path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }): Promise<void> {\n return this.fs?.rm(path, options);\n }\n async copyFile(source: PathLike, destination: PathLike): Promise<void> {\n return this.fs?.copyFile(source, destination);\n }\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }): Promise<Uint8Array> {\n const ret = (await this.fs?.readFile(path, options)) as Buffer;\n return toArrayBuffer(ret);\n }\n stat(path: PathLike): Promise<Stats> {\n return this.fs?.stat(path) as Promise<Stats>;\n }\n async unlink(path: PathLike): Promise<void> {\n return this.fs?.unlink(path);\n }\n async writefile(path: PathLike, data: Uint8Array | string): Promise<void> {\n if (runtimeFn().isDeno) {\n return this.fs?.writeFile(path, data);\n }\n return this.fs?.writeFile(path, Buffer.from(data));\n }\n}\n\n// import { type NodeMap, join } from \"../../sys-container.js\";\n// import type { ObjectEncodingOptions, PathLike } from \"fs\";\n// import * as fs from \"fs/promises\";\n// import * as path from \"path\";\n// import * as os from \"os\";\n// import * as url from \"url\";\n// import { toArrayBuffer } from \"./utils.js\";\n\n// export async function createNodeSysContainer(): Promise<NodeMap> {\n// // const nodePath = \"node:path\";\n// // const nodeOS = \"node:os\";\n// // const nodeURL = \"node:url\";\n// // const nodeFS = \"node:fs\";\n// // const fs = (await import(\"node:fs\")).promises;\n// // const assert = \"assert\";\n// // const path = await import(\"node:path\");\n// return {\n// state: \"node\",\n// ...path,\n// // ...(await import(\"node:os\")),\n// // ...(await import(\"node:url\")),\n// ...os,\n// ...url,\n// ...fs,\n// join,\n// stat: fs.stat as NodeMap[\"stat\"],\n// readdir: fs.readdir as NodeMap[\"readdir\"],\n// readfile: async (path: PathLike, options?: ObjectEncodingOptions): Promise<Uint8Array> => {\n// const rs = await fs.readFile(path, options);\n// return toArrayBuffer(rs);\n// },\n// writefile: fs.writeFile as NodeMap[\"writefile\"],\n// };\n// }\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","import { FILESTORE_VERSION } from \"../version.js\";\nimport { exception2Result, KeyedResolvOnce, Logger, Result, URI } from \"@adviser/cement\";\nimport { ensureLogger, exceptionWrapper, isNotFoundError, NotFoundError, bs } from \"@fireproof/core\";\nimport { getFileName, getPath } from \"./utils.js\";\nimport type { SuperThis, SysFileSystem } from \"@fireproof/core\";\nimport { getFileSystem } from \"./get-file-system.js\";\n\nconst versionFiles = new KeyedResolvOnce<string>();\n\nexport class FileGateway implements bs.Gateway {\n // abstract readonly storeType: StoreType;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n\n constructor(sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = sthis.logger;\n }\n\n async getVersionFromFile(fs: SysFileSystem, path: string, logger: Logger): Promise<string> {\n return versionFiles.get(path).once(async () => {\n await fs.mkdir(path, { recursive: true });\n const vFile = this.sthis.pathOps.join(path, \"version\");\n const vFileStat = await fs.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await fs.writefile(this.sthis.pathOps.join(path, \"version\"), FILESTORE_VERSION);\n return FILESTORE_VERSION;\n } else if (!vFileStat.isFile()) {\n throw logger.Error().Str(\"file\", vFile).Msg(`version file is a directory`).AsError();\n }\n const v = await fs.readfile(vFile);\n const vStr = this.sthis.txt.decode(v);\n if (vStr !== FILESTORE_VERSION) {\n logger.Warn().Str(\"file\", vFile).Str(\"from\", vStr).Str(\"expected\", FILESTORE_VERSION).Msg(`version mismatch`);\n }\n return vStr;\n });\n }\n\n start(baseURL: URI): Promise<Result<URI>> {\n return exception2Result(async () => {\n const fs = await getFileSystem(baseURL);\n const url = baseURL.build();\n url.defParam(\"version\", FILESTORE_VERSION);\n // url.defParam(\"store\", this.storeType);\n const dbUrl = await this.buildUrl(url.URI(), \"dummy\");\n const dbdirFile = this.getFilePath(dbUrl.Ok());\n await fs.mkdir(this.sthis.pathOps.dirname(dbdirFile), { recursive: true });\n const dbroot = this.sthis.pathOps.dirname(dbdirFile);\n this.logger.Debug().Url(url.URI()).Str(\"dbroot\", dbroot).Msg(\"start\");\n url.setParam(\"version\", await this.getVersionFromFile(fs, dbroot, this.logger));\n return url.URI();\n });\n }\n\n async buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Result.Ok(baseUrl.build().setParam(\"key\", key).URI());\n }\n\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n // abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n\n getFilePath(url: URI): string {\n const key = url.getParam(\"key\");\n if (!key) throw this.logger.Error().Url(url).Msg(`key not found`).AsError();\n return this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));\n }\n\n async put(url: URI, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const file = await this.getFilePath(url);\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"file\", file).Msg(\"put\");\n await getFileSystem(url).then((fs) => fs.writefile(file, body));\n });\n }\n\n async get(url: URI): Promise<bs.GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url);\n try {\n const res = await getFileSystem(url).then((fs) => fs.readfile(file));\n this.logger.Debug().Url(url.asURL()).Str(\"file\", file).Msg(\"get\");\n return Result.Ok(new Uint8Array(res));\n } catch (e: unknown) {\n // this.logger.Error().Err(e).Str(\"file\", file).Msg(\"get\");\n if (isNotFoundError(e)) {\n return Result.Err(new NotFoundError(`file not found: ${file}`));\n }\n return Result.Err(e as Error);\n }\n });\n }\n\n async delete(url: URI): Promise<Result<void>> {\n return exception2Result(async () => {\n await getFileSystem(url).then((fs) => fs.unlink(this.getFilePath(url)));\n });\n }\n\n async destroy(baseURL: URI): Promise<Result<void>> {\n const url = await this.buildUrl(baseURL, \"x\");\n if (url.isErr()) return url;\n const filepath = this.sthis.pathOps.dirname(this.getFilePath(url.Ok()));\n const fs = await getFileSystem(baseURL);\n let files: string[] = [];\n try {\n files = await fs.readdir(filepath);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"dir\", filepath).Msg(\"destroy:readdir\").AsError();\n }\n }\n for (const file of files) {\n const pathed = this.sthis.pathOps.join(filepath, file);\n try {\n await fs.unlink(pathed);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"file\", pathed).Msg(\"destroy:unlink\").AsError();\n }\n }\n }\n return Result.Ok(undefined);\n }\n}\n\nexport class FileTestGateway implements bs.TestGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"FileTestStore\");\n this.sthis = sthis;\n }\n\n async get(iurl: URI, key: string) {\n const url = iurl.build().setParam(\"key\", key).URI();\n const dbFile = this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));\n this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await (await getFileSystem(url)).readfile(dbFile);\n this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return buffer;\n }\n}\n","import type { URI } from \"@adviser/cement\";\nimport { getStore } from \"@fireproof/core\";\nimport type { SuperThis } from \"@fireproof/core\";\n\nexport function getPath(url: URI, sthis: SuperThis): string {\n const basePath = url.pathname;\n // .toString()\n // .replace(new RegExp(`^${url.protocol}//`), \"\")\n // .replace(/\\?.*$/, \"\");\n const name = url.getParam(\"name\");\n if (name) {\n const version = url.getParam(\"version\");\n if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();\n return sthis.pathOps.join(basePath, version, name);\n }\n return sthis.pathOps.join(basePath);\n}\n\nexport function getFileName(url: URI, sthis: SuperThis): string {\n const key = url.getParam(\"key\");\n if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();\n const res = getStore(url, sthis, (...a: string[]) => a.join(\"-\"));\n switch (res.store) {\n case \"data\":\n return sthis.pathOps.join(res.name, key + \".car\");\n case \"wal\":\n case \"meta\":\n return sthis.pathOps.join(res.name, key + \".json\");\n default:\n throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();\n }\n}\n"],"mappings":"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","names":["KeyedResolvOnce","isNotFoundError","KeyedResolvOnce","isNotFoundError"]}
@@ -37,4 +37,4 @@ var MemFileSystem = class {
37
37
  export {
38
38
  MemFileSystem
39
39
  };
40
- //# sourceMappingURL=mem-filesystem.js.map
40
+ //# sourceMappingURL=mem-filesystem-LPPT7QV5.js.map
@@ -1 +1 @@
1
- {"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytes":313,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/mem-filesystem.ts":{"bytes":1461,"imports":[{"path":"memfs","kind":"import-statement","external":true},{"path":"memfs/lib/node/types/options.js","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"}],"format":"esm"},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytes":3138,"imports":[{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"fs/promises","kind":"dynamic-import","external":true}],"format":"esm"}},"outputs":{"dist/fireproof-core/node/mem-filesystem.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":3066},"dist/fireproof-core/node/mem-filesystem.cjs":{"imports":[{"path":"memfs","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/runtime/gateways/file/node/mem-filesystem.ts","inputs":{"src/runtime/gateways/file/node/mem-filesystem.ts":{"bytesInOutput":1016},"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytesInOutput":277}},"bytes":2252},"dist/fireproof-core/node/node-filesystem.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":4974},"dist/fireproof-core/node/node-filesystem.cjs":{"imports":[{"path":"@adviser/cement","kind":"require-call","external":true},{"path":"fs/promises","kind":"dynamic-import","external":true}],"exports":[],"entryPoint":"src/runtime/gateways/file/node/node-filesystem.ts","inputs":{"src/runtime/gateways/file/node/node-filesystem.ts":{"bytesInOutput":1084},"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytesInOutput":277}},"bytes":2919}}}
1
+ {"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytes":313,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytes":3138,"imports":[{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"fs/promises","kind":"dynamic-import","external":true}],"format":"esm"},"src/runtime/gateways/file/node/mem-filesystem.ts":{"bytes":1461,"imports":[{"path":"memfs","kind":"import-statement","external":true},{"path":"memfs/lib/node/types/options.js","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"}],"format":"esm"},"src/runtime/gateways/file/node/get-file-system.ts":{"bytes":905,"imports":[{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/node-filesystem.ts","kind":"import-statement","original":"./node-filesystem.js"},{"path":"src/runtime/gateways/file/node/mem-filesystem.ts","kind":"dynamic-import","original":"./mem-filesystem.js"}],"format":"esm"},"src/runtime/gateways/file/node/key-bag-file.ts":{"bytes":1860,"imports":[{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/get-file-system.ts","kind":"import-statement","original":"./get-file-system.js"}],"format":"esm"},"src/runtime/gateways/file/version.ts":{"bytes":47,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/utils.ts":{"bytes":1159,"imports":[{"path":"@fireproof/core","kind":"import-statement","external":true}],"format":"esm"},"src/runtime/gateways/file/node/gateway-impl.ts":{"bytes":5551,"imports":[{"path":"src/runtime/gateways/file/version.ts","kind":"import-statement","original":"../version.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/utils.ts","kind":"import-statement","original":"./utils.js"},{"path":"src/runtime/gateways/file/node/get-file-system.ts","kind":"import-statement","original":"./get-file-system.js"}],"format":"esm"},"src/runtime/gateways/file/node/index.ts":{"bytes":346,"imports":[{"path":"src/runtime/gateways/file/node/key-bag-file.ts","kind":"import-statement","original":"./key-bag-file.js"},{"path":"src/runtime/gateways/file/node/get-file-system.ts","kind":"import-statement","original":"./get-file-system.js"},{"path":"src/runtime/gateways/file/node/key-bag-file.ts","kind":"import-statement","original":"./key-bag-file.js"},{"path":"src/runtime/gateways/file/node/gateway-impl.ts","kind":"import-statement","original":"./gateway-impl.js"}],"format":"esm"}},"outputs":{"dist/fireproof-core/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":24401},"dist/fireproof-core/node/index.cjs":{"imports":[{"path":"memfs","kind":"require-call","external":true},{"path":"@fireproof/core","kind":"require-call","external":true},{"path":"@adviser/cement","kind":"require-call","external":true},{"path":"@adviser/cement","kind":"require-call","external":true},{"path":"fs/promises","kind":"dynamic-import","external":true},{"path":"@adviser/cement","kind":"require-call","external":true},{"path":"@fireproof/core","kind":"require-call","external":true},{"path":"@fireproof/core","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/runtime/gateways/file/node/index.ts","inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytesInOutput":396},"src/runtime/gateways/file/node/mem-filesystem.ts":{"bytesInOutput":1255},"src/runtime/gateways/file/node/index.ts":{"bytesInOutput":309},"src/runtime/gateways/file/node/key-bag-file.ts":{"bytesInOutput":1307},"src/runtime/gateways/file/node/get-file-system.ts":{"bytesInOutput":799},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytesInOutput":939},"src/runtime/gateways/file/version.ts":{"bytesInOutput":38},"src/runtime/gateways/file/node/gateway-impl.ts":{"bytesInOutput":4814},"src/runtime/gateways/file/node/utils.ts":{"bytesInOutput":915}},"bytes":12889}}}
@@ -1 +1 @@
1
- {"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytes":313,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/mem-filesystem.ts":{"bytes":1461,"imports":[{"path":"memfs","kind":"import-statement","external":true},{"path":"memfs/lib/node/types/options.js","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"}],"format":"esm"},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytes":3138,"imports":[{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"dynamic-import","external":true}],"format":"esm"}},"outputs":{"dist/fireproof-core/node/mem-filesystem.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":2372},"dist/fireproof-core/node/mem-filesystem.js":{"imports":[{"path":"dist/fireproof-core/node/chunk-4A4RAVNS.js","kind":"import-statement"},{"path":"memfs","kind":"import-statement","external":true}],"exports":["MemFileSystem"],"entryPoint":"src/runtime/gateways/file/node/mem-filesystem.ts","inputs":{"src/runtime/gateways/file/node/mem-filesystem.ts":{"bytesInOutput":739}},"bytes":875},"dist/fireproof-core/node/node-filesystem.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":4280},"dist/fireproof-core/node/node-filesystem.js":{"imports":[{"path":"dist/fireproof-core/node/chunk-4A4RAVNS.js","kind":"import-statement"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"dynamic-import","external":true}],"exports":["NodeFileSystem"],"entryPoint":"src/runtime/gateways/file/node/node-filesystem.ts","inputs":{"src/runtime/gateways/file/node/node-filesystem.ts":{"bytesInOutput":898}},"bytes":1036},"dist/fireproof-core/node/chunk-4A4RAVNS.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":735},"dist/fireproof-core/node/chunk-4A4RAVNS.js":{"imports":[],"exports":["toArrayBuffer"],"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytesInOutput":277}},"bytes":359}}}
1
+ {"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytes":313,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytes":3138,"imports":[{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"dynamic-import","external":true}],"format":"esm"},"src/runtime/gateways/file/node/mem-filesystem.ts":{"bytes":1461,"imports":[{"path":"memfs","kind":"import-statement","external":true},{"path":"memfs/lib/node/types/options.js","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/to-array-buffer.ts","kind":"import-statement","original":"./to-array-buffer.js"}],"format":"esm"},"src/runtime/gateways/file/node/get-file-system.ts":{"bytes":905,"imports":[{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/node-filesystem.ts","kind":"import-statement","original":"./node-filesystem.js"},{"path":"src/runtime/gateways/file/node/mem-filesystem.ts","kind":"dynamic-import","original":"./mem-filesystem.js"}],"format":"esm"},"src/runtime/gateways/file/node/key-bag-file.ts":{"bytes":1860,"imports":[{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/get-file-system.ts","kind":"import-statement","original":"./get-file-system.js"}],"format":"esm"},"src/runtime/gateways/file/version.ts":{"bytes":47,"imports":[],"format":"esm"},"src/runtime/gateways/file/node/utils.ts":{"bytes":1159,"imports":[{"path":"@fireproof/core","kind":"import-statement","external":true}],"format":"esm"},"src/runtime/gateways/file/node/gateway-impl.ts":{"bytes":5551,"imports":[{"path":"src/runtime/gateways/file/version.ts","kind":"import-statement","original":"../version.js"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"src/runtime/gateways/file/node/utils.ts","kind":"import-statement","original":"./utils.js"},{"path":"src/runtime/gateways/file/node/get-file-system.ts","kind":"import-statement","original":"./get-file-system.js"}],"format":"esm"},"src/runtime/gateways/file/node/index.ts":{"bytes":346,"imports":[{"path":"src/runtime/gateways/file/node/key-bag-file.ts","kind":"import-statement","original":"./key-bag-file.js"},{"path":"src/runtime/gateways/file/node/get-file-system.ts","kind":"import-statement","original":"./get-file-system.js"},{"path":"src/runtime/gateways/file/node/key-bag-file.ts","kind":"import-statement","original":"./key-bag-file.js"},{"path":"src/runtime/gateways/file/node/gateway-impl.ts","kind":"import-statement","original":"./gateway-impl.js"}],"format":"esm"}},"outputs":{"dist/fireproof-core/node/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":20876},"dist/fireproof-core/node/index.js":{"imports":[{"path":"dist/fireproof-core/node/chunk-4A4RAVNS.js","kind":"import-statement"},{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"dynamic-import","external":true},{"path":"dist/fireproof-core/node/mem-filesystem-LPPT7QV5.js","kind":"dynamic-import"},{"path":"@adviser/cement","kind":"import-statement","external":true},{"path":"@fireproof/core","kind":"import-statement","external":true},{"path":"@fireproof/core","kind":"import-statement","external":true}],"exports":["GatewayImpl","GatewayTestImpl","KeyBagProviderFile","KeyBagProviderImpl","getFileSystem"],"entryPoint":"src/runtime/gateways/file/node/index.ts","inputs":{"src/runtime/gateways/file/node/key-bag-file.ts":{"bytesInOutput":1295},"src/runtime/gateways/file/node/get-file-system.ts":{"bytesInOutput":726},"src/runtime/gateways/file/node/node-filesystem.ts":{"bytesInOutput":898},"src/runtime/gateways/file/node/index.ts":{"bytesInOutput":0},"src/runtime/gateways/file/version.ts":{"bytesInOutput":38},"src/runtime/gateways/file/node/gateway-impl.ts":{"bytesInOutput":4652},"src/runtime/gateways/file/node/utils.ts":{"bytesInOutput":894}},"bytes":9171},"dist/fireproof-core/node/mem-filesystem-LPPT7QV5.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":2372},"dist/fireproof-core/node/mem-filesystem-LPPT7QV5.js":{"imports":[{"path":"dist/fireproof-core/node/chunk-4A4RAVNS.js","kind":"import-statement"},{"path":"memfs","kind":"import-statement","external":true}],"exports":["MemFileSystem"],"entryPoint":"src/runtime/gateways/file/node/mem-filesystem.ts","inputs":{"src/runtime/gateways/file/node/mem-filesystem.ts":{"bytesInOutput":739}},"bytes":875},"dist/fireproof-core/node/chunk-4A4RAVNS.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":735},"dist/fireproof-core/node/chunk-4A4RAVNS.js":{"imports":[],"exports":["toArrayBuffer"],"inputs":{"src/runtime/gateways/file/node/to-array-buffer.ts":{"bytesInOutput":277}},"bytes":359}}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fireproof/core",
3
- "version": "0.19.121-dev",
3
+ "version": "0.19.122",
4
4
  "description": "Live database for the web.",
5
5
  "type": "module",
6
6
  "module": "./index.js",
@@ -9,26 +9,28 @@
9
9
  "exports": {
10
10
  ".": {
11
11
  "import": "./index.js",
12
+ "browser": "./index.js",
12
13
  "require": "./index.cjs",
13
14
  "types": "./index.d.ts"
14
15
  },
15
16
  "./node": {
16
- "import": "./node/node-filesystem.js",
17
- "require": "./node/node-filesystem.cjs",
18
- "types": "./node/node-filesystem.d.ts"
19
- },
20
- "./mem": {
21
- "import": "./node/mem-filesystem.js",
22
- "require": "./node/mem-filesystem.cjs",
23
- "types": "./node/mem-filesystem.d.ts"
17
+ "import": {
18
+ "browser": "./web/index.js",
19
+ "default": "./node/index.js"
20
+ },
21
+ "browser": "./web/index.js",
22
+ "require": "./node/index.cjs",
23
+ "types": "./node/index.d.ts"
24
24
  },
25
25
  "./web": {
26
- "import": "./web/gateway-impl.js",
27
- "require": "./web/gateway-impl.cjs",
28
- "types": "./web/gateway-impl.d.ts"
26
+ "import": "./web/index.js",
27
+ "browser": "./web/index.js",
28
+ "require": "./web/index.cjs",
29
+ "types": "./web/index.d.ts"
29
30
  },
30
31
  "./react": {
31
32
  "import": "./react/index.js",
33
+ "browser": "./react/index.js",
32
34
  "require": "./react/index.cjs",
33
35
  "types": "./react/index.d.ts"
34
36
  }
@@ -64,14 +66,14 @@
64
66
  "react": "^18.3.1"
65
67
  },
66
68
  "dependencies": {
67
- "@adviser/cement": "^0.3.3",
68
- "@fireproof/vendor": "^1.0.3",
69
+ "@adviser/cement": "^0.3.5",
70
+ "@fireproof/vendor": "^1.0.4",
69
71
  "@ipld/unixfs": "^3.0.0",
70
72
  "multiformats": "^13.3.1",
71
73
  "charwise": "^3.0.1",
72
74
  "prolly-trees": "^1.0.4",
73
75
  "idb": "^8.0.1",
74
- "memfs": "^4.15.1",
76
+ "memfs": "^4.17.0",
75
77
  "p-limit": "^6.2.0",
76
78
  "p-map": "^7.0.3",
77
79
  "p-retry": "^6.2.1"
package/react/index.cjs CHANGED
@@ -33,70 +33,135 @@ module.exports = __toCommonJS(index_exports);
33
33
  var import_core = require("@fireproof/core");
34
34
  var import_react = require("react");
35
35
  var FireproofCtx = {};
36
+ function deepClone(value) {
37
+ if (typeof structuredClone !== "undefined") {
38
+ return structuredClone(value);
39
+ } else {
40
+ return JSON.parse(JSON.stringify(value));
41
+ }
42
+ }
36
43
  function useFireproof(name = "useFireproof", config = {}) {
37
44
  const database = typeof name === "string" ? (0, import_core.fireproof)(name, config) : name;
45
+ const updateHappenedRef = (0, import_react.useRef)(false);
38
46
  function useDocument2(initialDocOrFn) {
39
47
  let initialDoc;
40
48
  if (typeof initialDocOrFn === "function") {
41
49
  initialDoc = initialDocOrFn();
42
50
  } else {
43
- initialDoc = initialDocOrFn;
51
+ initialDoc = initialDocOrFn ?? {};
44
52
  }
45
- const docId = initialDoc._id ?? "";
53
+ const originalInitialDoc = (0, import_react.useMemo)(() => deepClone({ ...initialDoc }), []);
46
54
  const [doc, setDoc] = (0, import_react.useState)(initialDoc);
47
55
  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)(
56
+ const gotDoc = doc._id ? await database.get(doc._id).catch(() => initialDoc) : initialDoc;
57
+ setDoc(gotDoc);
58
+ }, [doc._id]);
59
+ const save = (0, import_react.useCallback)(
52
60
  async (existingDoc) => {
53
- const res = await database.put(existingDoc ?? doc);
54
- if (!existingDoc && !doc._id) setDoc((d) => ({ ...d, _id: res.id }));
61
+ updateHappenedRef.current = false;
62
+ const toSave = existingDoc ?? doc;
63
+ const res = await database.put(toSave);
64
+ if (!updateHappenedRef.current && !doc._id && !existingDoc) {
65
+ setDoc((d) => ({ ...d, _id: res.id }));
66
+ }
55
67
  return res;
56
68
  },
57
69
  [doc]
58
70
  );
59
- const deleteDoc = (0, import_react.useCallback)(
71
+ const remove = (0, import_react.useCallback)(
60
72
  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();
73
+ const id = existingDoc?._id ?? doc._id;
74
+ if (!id) throw database.logger.Error().Msg(`Document must have an _id to be removed`).AsError();
75
+ const gotDoc = await database.get(id).catch(() => void 0);
76
+ if (!gotDoc) throw database.logger.Error().Str("id", id).Msg(`Document not found`).AsError();
64
77
  const res = await database.del(id);
65
78
  setDoc(initialDoc);
66
79
  return res;
67
80
  },
68
- [docId, initialDoc]
81
+ [doc, initialDoc]
69
82
  );
83
+ const merge = (0, import_react.useCallback)((newDoc) => {
84
+ updateHappenedRef.current = true;
85
+ setDoc((prev) => ({ ...prev, ...newDoc }));
86
+ }, []);
87
+ const replace = (0, import_react.useCallback)((newDoc) => {
88
+ updateHappenedRef.current = true;
89
+ setDoc(newDoc);
90
+ }, []);
91
+ const reset = (0, import_react.useCallback)(() => {
92
+ updateHappenedRef.current = true;
93
+ setDoc({ ...originalInitialDoc });
94
+ }, [originalInitialDoc]);
70
95
  const updateDoc = (0, import_react.useCallback)(
71
96
  (newDoc, opts = { replace: false, reset: false }) => {
72
- if (!newDoc) return void (opts.reset ? setDoc(initialDoc) : refreshDoc());
73
- setDoc((d) => opts.replace ? newDoc : { ...d, ...newDoc });
97
+ if (!newDoc) {
98
+ return opts.reset ? reset() : refreshDoc();
99
+ }
100
+ return opts.replace ? replace(newDoc) : merge(newDoc);
74
101
  },
75
- [refreshDoc, initialDoc]
102
+ [refreshDoc, reset, replace, merge]
76
103
  );
77
104
  (0, import_react.useEffect)(() => {
78
- if (!docId) return;
105
+ if (!doc._id) return;
79
106
  return database.subscribe((changes) => {
80
- if (changes.find((c) => c._id === docId)) {
107
+ if (updateHappenedRef.current) {
108
+ return;
109
+ }
110
+ if (changes.find((c) => c._id === doc._id)) {
81
111
  void refreshDoc();
82
112
  }
83
- });
84
- }, [docId, refreshDoc]);
113
+ }, true);
114
+ }, [doc._id, refreshDoc]);
85
115
  (0, import_react.useEffect)(() => {
86
116
  void refreshDoc();
87
117
  }, [refreshDoc]);
88
- return [{ _id: docId, ...doc }, updateDoc, saveDoc, deleteDoc];
118
+ const refresh = (0, import_react.useCallback)(() => void refreshDoc(), [refreshDoc]);
119
+ const apiObject = {
120
+ doc: { ...doc },
121
+ merge,
122
+ replace,
123
+ reset,
124
+ refresh,
125
+ save,
126
+ remove
127
+ };
128
+ const tuple = [{ ...doc }, updateDoc, save, remove, reset, refresh];
129
+ Object.assign(apiObject, tuple);
130
+ Object.defineProperty(apiObject, Symbol.iterator, {
131
+ enumerable: false,
132
+ value: function* () {
133
+ yield* tuple;
134
+ }
135
+ });
136
+ return apiObject;
89
137
  }
90
138
  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
- }));
139
+ const [result, setResult] = (0, import_react.useState)(() => {
140
+ const docs = initialRows.map((r) => r.doc).filter((r) => !!r);
141
+ return {
142
+ rows: initialRows,
143
+ docs,
144
+ length: docs.length,
145
+ map: (fn) => docs.map(fn),
146
+ filter: (fn) => docs.filter(fn),
147
+ forEach: (fn) => docs.forEach(fn),
148
+ [Symbol.iterator]: () => docs[Symbol.iterator]()
149
+ };
150
+ });
95
151
  const queryString = (0, import_react.useMemo)(() => JSON.stringify(query), [query]);
96
152
  const mapFnString = (0, import_react.useMemo)(() => mapFn.toString(), [mapFn]);
97
153
  const refreshRows = (0, import_react.useCallback)(async () => {
98
154
  const res = await database.query(mapFn, query);
99
- setResult({ ...res, docs: res.rows.map((r) => r.doc) });
155
+ const docs = res.rows.map((r) => r.doc).filter((r) => !!r);
156
+ setResult({
157
+ ...res,
158
+ docs,
159
+ length: docs.length,
160
+ map: (fn) => docs.map(fn),
161
+ filter: (fn) => docs.filter(fn),
162
+ forEach: (fn) => docs.forEach(fn),
163
+ [Symbol.iterator]: () => docs[Symbol.iterator]()
164
+ });
100
165
  }, [mapFnString, queryString]);
101
166
  (0, import_react.useEffect)(() => {
102
167
  refreshRows();