@fireproof/core 0.19.121-dev → 0.20.0-dev-preview-05

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 (103) hide show
  1. package/README.md +13 -12
  2. package/deno/index.d.ts +7 -0
  3. package/deno/index.js +66 -0
  4. package/deno/index.js.map +1 -0
  5. package/deno/metafile-esm.json +1 -0
  6. package/deno.json +3 -4
  7. package/index.cjs +1797 -1431
  8. package/index.cjs.map +1 -1
  9. package/index.d.cts +760 -381
  10. package/index.d.ts +760 -381
  11. package/index.js +1976 -913
  12. package/index.js.map +1 -1
  13. package/metafile-cjs.json +1 -1
  14. package/metafile-esm.json +1 -1
  15. package/node/{node-filesystem.cjs → index.cjs} +17 -6
  16. package/node/index.cjs.map +1 -0
  17. package/node/index.d.cts +7 -0
  18. package/node/index.d.ts +7 -0
  19. package/node/{node-filesystem.js → index.js} +25 -5
  20. package/node/index.js.map +1 -0
  21. package/node/metafile-cjs.json +1 -1
  22. package/node/metafile-esm.json +1 -1
  23. package/package.json +27 -17
  24. package/react/index.cjs +22 -22
  25. package/react/index.cjs.map +1 -1
  26. package/react/index.d.cts +7 -7
  27. package/react/index.d.ts +7 -7
  28. package/react/index.js +22 -22
  29. package/react/index.js.map +1 -1
  30. package/react/metafile-cjs.json +1 -1
  31. package/react/metafile-esm.json +1 -1
  32. package/tests/blockstore/fp-envelope.test.ts-off +65 -0
  33. package/tests/blockstore/interceptor-gateway.test.ts +122 -0
  34. package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +130 -0
  35. package/tests/blockstore/keyed-crypto.test.ts +75 -118
  36. package/tests/blockstore/loader.test.ts +18 -9
  37. package/tests/blockstore/store.test.ts +40 -31
  38. package/tests/blockstore/transaction.test.ts +14 -13
  39. package/tests/fireproof/all-gateway.test.ts +286 -216
  40. package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -316
  41. package/tests/fireproof/crdt.test.ts +78 -19
  42. package/tests/fireproof/fireproof.test.ts +111 -92
  43. package/tests/fireproof/hello.test.ts +21 -17
  44. package/tests/fireproof/indexer.test.ts +74 -50
  45. package/tests/fireproof/{database.test.ts → ledger.test.ts} +241 -45
  46. package/tests/fireproof/multiple-ledger.test.ts +2 -2
  47. package/tests/fireproof/utils.test.ts +47 -6
  48. package/tests/gateway/file/loader-config.test.ts +307 -0
  49. package/tests/gateway/fp-envelope-serialize.test.ts +256 -0
  50. package/tests/gateway/indexdb/loader-config.test.ts +79 -0
  51. package/tests/helpers.ts +44 -17
  52. package/tests/react/useFireproof.test.tsx +2 -2
  53. package/tests/www/gallery.html +2 -2
  54. package/tests/www/todo-aws.html +1 -1
  55. package/tests/www/todo-ipfs.html +1 -1
  56. package/tests/www/todo-local.html +1 -1
  57. package/tests/www/todo.html +25 -4
  58. package/web/index.cjs +218 -0
  59. package/web/index.cjs.map +1 -0
  60. package/web/index.d.cts +30 -0
  61. package/web/index.d.ts +30 -0
  62. package/web/index.js +195 -0
  63. package/web/index.js.map +1 -0
  64. package/web/metafile-cjs.json +1 -1
  65. package/web/metafile-esm.json +1 -1
  66. package/chunk-7EWIAXTM.js +0 -7
  67. package/chunk-7EWIAXTM.js.map +0 -1
  68. package/chunk-F4FC6B2T.js +0 -63
  69. package/chunk-F4FC6B2T.js.map +0 -1
  70. package/chunk-PZ5AY32C.js +0 -10
  71. package/chunk-PZ5AY32C.js.map +0 -1
  72. package/chunk-RXC4JGJT.js +0 -301
  73. package/chunk-RXC4JGJT.js.map +0 -1
  74. package/gateway-C62S56GY.js +0 -66
  75. package/gateway-C62S56GY.js.map +0 -1
  76. package/gateway-VVS4QWDA.js +0 -145
  77. package/gateway-VVS4QWDA.js.map +0 -1
  78. package/key-bag-file-PWZ3QE7B.js +0 -55
  79. package/key-bag-file-PWZ3QE7B.js.map +0 -1
  80. package/key-bag-indexdb-SYG3YD4D.js +0 -51
  81. package/key-bag-indexdb-SYG3YD4D.js.map +0 -1
  82. package/node/chunk-4A4RAVNS.js +0 -17
  83. package/node/chunk-4A4RAVNS.js.map +0 -1
  84. package/node/mem-filesystem.cjs +0 -72
  85. package/node/mem-filesystem.cjs.map +0 -1
  86. package/node/mem-filesystem.d.cts +0 -25
  87. package/node/mem-filesystem.d.ts +0 -25
  88. package/node/mem-filesystem.js +0 -40
  89. package/node/mem-filesystem.js.map +0 -1
  90. package/node/node-filesystem.cjs.map +0 -1
  91. package/node/node-filesystem.d.cts +0 -35
  92. package/node/node-filesystem.d.ts +0 -35
  93. package/node/node-filesystem.js.map +0 -1
  94. package/tests/fireproof/config.test.ts +0 -172
  95. package/utils-ZVVGAXFE.js +0 -13
  96. package/utils-ZVVGAXFE.js.map +0 -1
  97. package/web/gateway-impl.cjs +0 -183
  98. package/web/gateway-impl.cjs.map +0 -1
  99. package/web/gateway-impl.d.cts +0 -31
  100. package/web/gateway-impl.d.ts +0 -31
  101. package/web/gateway-impl.js +0 -162
  102. package/web/gateway-impl.js.map +0 -1
  103. /package/tests/blockstore/{fragment-gateway.test.ts → fragment-gateway.test.ts-off} +0 -0
@@ -1,16 +1,31 @@
1
- import { buildBlobFiles, FileWithCid } from "../helpers.js";
2
- import { bs, Database, DocResponse, DocFileMeta, DocWithId, DocFiles, ensureSuperThis } from "@fireproof/core";
3
-
4
- describe("basic Database", () => {
5
- let db: Database;
6
- const sthis = ensureSuperThis();
1
+ import { URI } from "@adviser/cement";
2
+ import { buildBlobFiles, FileWithCid, mockSuperThis } from "../helpers.js";
3
+ import {
4
+ bs,
5
+ Ledger,
6
+ DocResponse,
7
+ DocFileMeta,
8
+ DocWithId,
9
+ DocFiles,
10
+ toStoreURIRuntime,
11
+ keyConfigOpts,
12
+ LedgerFactory,
13
+ LedgerShell,
14
+ ensureSuperThis,
15
+ } from "@fireproof/core";
16
+
17
+ describe("basic Ledger", () => {
18
+ let db: Ledger;
19
+ const sthis = mockSuperThis();
7
20
  afterEach(async () => {
8
21
  await db.close();
9
22
  await db.destroy();
10
23
  });
11
24
  beforeEach(async () => {
12
25
  await sthis.start();
13
- db = new Database();
26
+ db = LedgerFactory(undefined, {
27
+ logger: sthis.logger,
28
+ });
14
29
  });
15
30
  it("should put", async () => {
16
31
  /** @type {Doc} */
@@ -34,11 +49,11 @@ describe("basic Database", () => {
34
49
  });
35
50
  });
36
51
 
37
- describe("basic Database with record", function () {
52
+ describe("basic Ledger with record", function () {
38
53
  interface Doc {
39
54
  readonly value: string;
40
55
  }
41
- let db: Database;
56
+ let db: LedgerShell;
42
57
  const sthis = ensureSuperThis();
43
58
  afterEach(async () => {
44
59
  await db.close();
@@ -46,7 +61,7 @@ describe("basic Database with record", function () {
46
61
  });
47
62
  beforeEach(async function () {
48
63
  await sthis.start();
49
- db = new Database();
64
+ db = LedgerFactory("factory-name") as LedgerShell;
50
65
  const ok = await db.put<Doc>({ _id: "hello", value: "world" });
51
66
  expect(ok.id).toBe("hello");
52
67
  });
@@ -78,21 +93,21 @@ describe("basic Database with record", function () {
78
93
  expect(rows[0].value._id).toBe("hello");
79
94
  });
80
95
  it("is not persisted", async function () {
81
- const db2 = new Database();
96
+ const db2 = LedgerFactory("factory-name") as LedgerShell;
82
97
  const { rows } = await db2.changes([]);
83
- expect(rows.length).toBe(0);
84
- const doc = await db2.get("hello").catch((e) => e);
85
- expect(doc.message).toBeTruthy();
98
+ expect(rows.length).toBe(1);
99
+ expect(db2.ref).toBe(db.ref);
100
+ const doc = await db2.get<Doc>("hello").catch((e) => e);
101
+ expect(doc.value).toBe("world");
86
102
  await db2.close();
87
- await db2.destroy();
88
103
  });
89
104
  });
90
105
 
91
- describe("named Database with record", function () {
106
+ describe("named Ledger with record", function () {
92
107
  interface Doc {
93
108
  readonly value: string;
94
109
  }
95
- let db: Database;
110
+ let db: Ledger;
96
111
  const sthis = ensureSuperThis();
97
112
  afterEach(async () => {
98
113
  await db.close();
@@ -100,7 +115,7 @@ describe("named Database with record", function () {
100
115
  });
101
116
  beforeEach(async function () {
102
117
  await sthis.start();
103
- db = new Database("test-db-name");
118
+ db = LedgerFactory("test-db-name");
104
119
  /** @type {Doc} */
105
120
  const doc = { _id: "hello", value: "world" };
106
121
  const ok = await db.put(doc);
@@ -136,7 +151,7 @@ describe("named Database with record", function () {
136
151
  it("should have a key", async function () {
137
152
  const { rows } = await db.changes([]);
138
153
  expect(rows.length).toBe(1);
139
- const blocks = db._crdt.blockstore as bs.EncryptedBlockstore;
154
+ const blocks = db.crdt.blockstore as bs.EncryptedBlockstore;
140
155
  const loader = blocks.loader;
141
156
  expect(loader).toBeTruthy();
142
157
  await loader.ready();
@@ -202,13 +217,13 @@ describe("named Database with record", function () {
202
217
  });
203
218
  });
204
219
 
205
- // describe('basic Database parallel writes / public', function () {
206
- // /** @type {Database} */
220
+ // describe('basic Ledger parallel writes / public', function () {
221
+ // /** @type {Ledger} */
207
222
  // let db
208
223
  // const writes = []
209
224
  // beforeEach(async function () {
210
225
  // await resetDirectory(dataDir, 'test-parallel-writes')
211
- // db = new Database('test-parallel-writes', { public: true })
226
+ // db = new Ledger('test-parallel-writes', { public: true })
212
227
  // /** @type {Doc} */
213
228
  // for (let i = 0; i < 10; i++) {
214
229
  // const doc = { _id: `id-${i}`, hello: 'world' }
@@ -217,28 +232,64 @@ describe("named Database with record", function () {
217
232
  // await Promise.all(writes)
218
233
  // })
219
234
 
220
- describe("basic Database parallel writes / public", function () {
221
- let db: Database;
235
+ describe("basic Ledger parallel writes / public ordered", () => {
236
+ let db: Ledger;
237
+ const writes: Promise<DocResponse>[] = [];
238
+ const sthis = mockSuperThis();
239
+ afterEach(async () => {
240
+ await db.close();
241
+ await db.destroy();
242
+ });
243
+ beforeEach(async () => {
244
+ await sthis.start();
245
+ db = LedgerFactory("test-parallel-writes-ordered", { writeQueue: { chunkSize: 1 } });
246
+ for (let i = 0; i < 10; i++) {
247
+ const doc = { _id: `id-${i}`, hello: "world" };
248
+ writes.push(db.put(doc));
249
+ }
250
+ await Promise.all(writes);
251
+ });
252
+
253
+ it("should have one head", () => {
254
+ const crdt = db.crdt;
255
+ expect(crdt.clock.head.length).toBe(1);
256
+ });
257
+
258
+ it("has changes ordered", async function () {
259
+ const { rows, clock } = await db.changes([]);
260
+ expect(clock[0]).toBe(db.crdt.clock.head[0]);
261
+ expect(rows.length).toBe(10);
262
+ for (let i = 0; i < 10; i++) {
263
+ expect(rows[i].key).toBe("id-" + i);
264
+ expect(rows[i].clock).toBeTruthy();
265
+ }
266
+ });
267
+ });
268
+
269
+ describe("basic Ledger parallel writes / public", () => {
270
+ let db: Ledger;
222
271
  const writes: Promise<DocResponse>[] = [];
223
272
  const sthis = ensureSuperThis();
224
273
  afterEach(async () => {
225
274
  await db.close();
226
275
  await db.destroy();
227
276
  });
228
- beforeEach(async function () {
277
+ beforeEach(async () => {
229
278
  await sthis.start();
230
- db = new Database("test-parallel-writes", { public: true });
279
+ db = LedgerFactory("test-parallel-writes", { writeQueue: { chunkSize: 32 } });
231
280
  for (let i = 0; i < 10; i++) {
232
281
  const doc = { _id: `id-${i}`, hello: "world" };
233
282
  writes.push(db.put(doc));
234
283
  }
235
284
  await Promise.all(writes);
236
285
  });
237
- it("should have one head", function () {
238
- const crdt = db._crdt;
286
+ it("should resolve to one head", async () => {
287
+ const crdt = db.crdt;
288
+ expect(crdt.clock.head.length).toBe(9);
289
+ await db.put({ _id: "id-10", hello: "world" });
239
290
  expect(crdt.clock.head.length).toBe(1);
240
291
  });
241
- it("should write all", async function () {
292
+ it("should write all", async () => {
242
293
  for (let i = 0; i < 10; i++) {
243
294
  const id = `id-${i}`;
244
295
  const doc = await db.get<{ hello: string }>(id);
@@ -270,11 +321,12 @@ describe("basic Database parallel writes / public", function () {
270
321
  expect(e.message).toMatch(/Not found/);
271
322
  }
272
323
  });
273
- it("has changes", async function () {
324
+ it("has changes not ordered", async function () {
274
325
  const { rows, clock } = await db.changes([]);
275
- expect(clock[0]).toBe(db._crdt.clock.head[0]);
326
+ expect(clock[0]).toBe(db.crdt.clock.head[0]);
276
327
  expect(rows.length).toBe(10);
277
- // rows.sort((a, b) => a.key.localeCompare(b.key));
328
+ rows.sort((a, b) => a.key.localeCompare(b.key));
329
+ // console.log(rows);
278
330
  for (let i = 0; i < 10; i++) {
279
331
  expect(rows[i].key).toBe("id-" + i);
280
332
  expect(rows[i].clock).toBeTruthy();
@@ -283,9 +335,9 @@ describe("basic Database parallel writes / public", function () {
283
335
  it("should not have a key", async function () {
284
336
  const { rows } = await db.changes([]);
285
337
  expect(rows.length).toBe(10);
286
- expect(db.opts.public).toBeTruthy();
287
- expect(db._crdt.opts.public).toBeTruthy();
288
- const blocks = db._crdt.blockstore as bs.EncryptedBlockstore;
338
+ // expect(db.opts.public).toBeTruthy();
339
+ // expect(db._crdt.opts.public).toBeTruthy();
340
+ const blocks = db.crdt.blockstore as bs.EncryptedBlockstore;
289
341
  const loader = blocks.loader;
290
342
  expect(loader).toBeTruthy();
291
343
  await loader.ready();
@@ -294,8 +346,8 @@ describe("basic Database parallel writes / public", function () {
294
346
  });
295
347
  });
296
348
 
297
- describe("basic Database with subscription", function () {
298
- let db: Database;
349
+ describe("basic Ledger with subscription", function () {
350
+ let db: Ledger;
299
351
  let didRun: number;
300
352
  let unsubscribe: () => void;
301
353
  let lastDoc: DocWithId<NonNullable<unknown>>;
@@ -307,7 +359,7 @@ describe("basic Database with subscription", function () {
307
359
  });
308
360
  beforeEach(async function () {
309
361
  await sthis.start();
310
- db = new Database();
362
+ db = LedgerFactory("factory-name");
311
363
  didRun = 0;
312
364
  waitForSub = new Promise((resolve) => {
313
365
  unsubscribe = db.subscribe((docs) => {
@@ -340,8 +392,8 @@ describe("basic Database with subscription", function () {
340
392
  });
341
393
  });
342
394
 
343
- describe("basic Database with no update subscription", function () {
344
- let db: Database;
395
+ describe("basic Ledger with no update subscription", function () {
396
+ let db: Ledger;
345
397
  let didRun: number;
346
398
  let unsubscribe: () => void;
347
399
  const sthis = ensureSuperThis();
@@ -351,9 +403,8 @@ describe("basic Database with no update subscription", function () {
351
403
  });
352
404
  beforeEach(async function () {
353
405
  await sthis.start();
354
- db = new Database();
406
+ db = LedgerFactory("factory-name");
355
407
  didRun = 0;
356
-
357
408
  unsubscribe = db.subscribe(() => {
358
409
  didRun++;
359
410
  });
@@ -377,8 +428,8 @@ describe("basic Database with no update subscription", function () {
377
428
  });
378
429
  });
379
430
 
380
- describe("database with files input", () => {
381
- let db: Database;
431
+ describe("ledger with files input", () => {
432
+ let db: Ledger;
382
433
  let imagefiles: FileWithCid[] = [];
383
434
  let result: DocResponse;
384
435
  const sthis = ensureSuperThis();
@@ -390,7 +441,7 @@ describe("database with files input", () => {
390
441
  beforeEach(async function () {
391
442
  await sthis.start();
392
443
  imagefiles = await buildBlobFiles();
393
- db = new Database("fireproof-with-images");
444
+ db = LedgerFactory("fireproof-with-images");
394
445
  const doc = {
395
446
  _id: "images-main",
396
447
  type: "files",
@@ -472,3 +523,148 @@ describe("database with files input", () => {
472
523
  expect(file.size).toBe(imagefiles[0].file.size);
473
524
  });
474
525
  });
526
+
527
+ describe("StoreURIRuntime", () => {
528
+ const sthis = mockSuperThis();
529
+ let safeEnv: string | undefined;
530
+ let unreg: () => void;
531
+ beforeEach(async () => {
532
+ await sthis.start();
533
+ safeEnv = sthis.env.get("FP_STORAGE_URL");
534
+ sthis.env.set("FP_STORAGE_URL", "my://bla/storage");
535
+ unreg = bs.registerStoreProtocol({
536
+ protocol: "murks",
537
+ isDefault: true,
538
+ defaultURI: function (): URI {
539
+ return URI.from("murks://fp");
540
+ },
541
+ gateway: function (): Promise<bs.Gateway> {
542
+ throw new Error("Function not implemented.");
543
+ },
544
+ });
545
+ });
546
+ afterEach(() => {
547
+ sthis.env.set("FP_STORAGE_URL", safeEnv);
548
+ unreg();
549
+ });
550
+ it("default toStoreURIRuntime", () => {
551
+ expect(JSON.parse(JSON.stringify(toStoreURIRuntime(sthis, "test")))).toEqual({
552
+ data: {
553
+ data: "my://bla/storage?name=test&store=data&storekey=%40test-data%40&suffix=.car&urlGen=fromEnv",
554
+ file: "my://bla/storage?name=test&store=data&storekey=%40test-data%40&urlGen=fromEnv",
555
+ meta: "my://bla/storage?name=test&store=meta&storekey=%40test-meta%40&urlGen=fromEnv",
556
+ wal: "my://bla/storage?name=test&store=wal&storekey=%40test-wal%40&urlGen=fromEnv",
557
+ },
558
+ idx: {
559
+ data: "my://bla/storage?index=idx&name=test&store=data&storekey=%40test-data-idx%40&suffix=.car&urlGen=fromEnv",
560
+ file: "my://bla/storage?index=idx&name=test&store=data&storekey=%40test-data-idx%40&urlGen=fromEnv",
561
+ meta: "my://bla/storage?index=idx&name=test&store=meta&storekey=%40test-meta-idx%40&urlGen=fromEnv",
562
+ wal: "my://bla/storage?index=idx&name=test&store=wal&storekey=%40test-wal-idx%40&urlGen=fromEnv",
563
+ },
564
+ });
565
+ // keyConfigOpts(sthis: SuperThis, name: string, opts?: ConfigOpts): string {
566
+ });
567
+ it("no name toStoreURIRuntime", () => {
568
+ expect(JSON.parse(JSON.stringify(toStoreURIRuntime(sthis)))).toEqual({
569
+ data: {
570
+ data: "my://bla/storage?name=storage&store=data&storekey=%40storage-data%40&suffix=.car&urlGen=fromEnv",
571
+ file: "my://bla/storage?name=storage&store=data&storekey=%40storage-data%40&urlGen=fromEnv",
572
+ meta: "my://bla/storage?name=storage&store=meta&storekey=%40storage-meta%40&urlGen=fromEnv",
573
+ wal: "my://bla/storage?name=storage&store=wal&storekey=%40storage-wal%40&urlGen=fromEnv",
574
+ },
575
+ idx: {
576
+ data: "my://bla/storage?index=idx&name=storage&store=data&storekey=%40storage-data-idx%40&suffix=.car&urlGen=fromEnv",
577
+ file: "my://bla/storage?index=idx&name=storage&store=data&storekey=%40storage-data-idx%40&urlGen=fromEnv",
578
+ meta: "my://bla/storage?index=idx&name=storage&store=meta&storekey=%40storage-meta-idx%40&urlGen=fromEnv",
579
+ wal: "my://bla/storage?index=idx&name=storage&store=wal&storekey=%40storage-wal-idx%40&urlGen=fromEnv",
580
+ },
581
+ });
582
+ });
583
+
584
+ it("set toStoreURIRuntime", () => {
585
+ expect(
586
+ JSON.parse(
587
+ JSON.stringify(
588
+ toStoreURIRuntime(sthis, "xxx", {
589
+ base: "my://storage-base",
590
+ data: {
591
+ data: "my://storage-data?name=yyy",
592
+ meta: "my://storage-meta",
593
+ },
594
+ idx: {
595
+ data: "my://storage-idx-data?name=yyy&index=bla",
596
+ meta: "my://storage-idx-meta",
597
+ },
598
+ }),
599
+ ),
600
+ ),
601
+ ).toEqual({
602
+ data: {
603
+ data: "my://storage-data?name=yyy&store=data&storekey=%40yyy-data%40&suffix=.car",
604
+ file: "my://storage-data?name=yyy&store=data&storekey=%40yyy-data%40",
605
+ meta: "my://storage-meta?name=storage-meta&store=meta&storekey=%40storage-meta-meta%40",
606
+ wal: "my://storage-base?name=xxx&store=wal&storekey=%40xxx-wal%40",
607
+ },
608
+ idx: {
609
+ data: "my://storage-idx-data?index=bla&name=yyy&store=data&storekey=%40yyy-data-idx%40&suffix=.car",
610
+ file: "my://storage-idx-data?index=bla&name=yyy&store=data&storekey=%40yyy-data-idx%40",
611
+ meta: "my://storage-idx-meta?index=idx&name=storage-idx-meta&store=meta&storekey=%40storage-idx-meta-meta-idx%40",
612
+ wal: "my://storage-base?index=idx&name=xxx&store=wal&storekey=%40xxx-wal-idx%40",
613
+ },
614
+ });
615
+ });
616
+
617
+ it("default-reg toStoreURIRuntime", () => {
618
+ sthis.env.delete("FP_STORAGE_URL");
619
+ expect(JSON.parse(JSON.stringify(toStoreURIRuntime(sthis, "maxi")))).toEqual({
620
+ data: {
621
+ data: "murks://fp?name=maxi&store=data&storekey=%40maxi-data%40&suffix=.car&urlGen=default",
622
+ file: "murks://fp?name=maxi&store=data&storekey=%40maxi-data%40&urlGen=default",
623
+ meta: "murks://fp?name=maxi&store=meta&storekey=%40maxi-meta%40&urlGen=default",
624
+ wal: "murks://fp?name=maxi&store=wal&storekey=%40maxi-wal%40&urlGen=default",
625
+ },
626
+ idx: {
627
+ data: "murks://fp?index=idx&name=maxi&store=data&storekey=%40maxi-data-idx%40&suffix=.car&urlGen=default",
628
+ file: "murks://fp?index=idx&name=maxi&store=data&storekey=%40maxi-data-idx%40&urlGen=default",
629
+ meta: "murks://fp?index=idx&name=maxi&store=meta&storekey=%40maxi-meta-idx%40&urlGen=default",
630
+ wal: "murks://fp?index=idx&name=maxi&store=wal&storekey=%40maxi-wal-idx%40&urlGen=default",
631
+ },
632
+ });
633
+ });
634
+
635
+ it("keyConfigOpts", () => {
636
+ expect(JSON.parse(keyConfigOpts(sthis, "test"))).toEqual([
637
+ {
638
+ name: "test",
639
+ },
640
+ {
641
+ stores: [
642
+ {
643
+ data: {
644
+ data: "my://bla/storage?name=test&store=data&storekey=%40test-data%40&suffix=.car&urlGen=fromEnv",
645
+ file: "my://bla/storage?name=test&store=data&storekey=%40test-data%40&urlGen=fromEnv",
646
+ meta: "my://bla/storage?name=test&store=meta&storekey=%40test-meta%40&urlGen=fromEnv",
647
+ wal: "my://bla/storage?name=test&store=wal&storekey=%40test-wal%40&urlGen=fromEnv",
648
+ },
649
+ },
650
+ {
651
+ idx: {
652
+ data: "my://bla/storage?index=idx&name=test&store=data&storekey=%40test-data-idx%40&suffix=.car&urlGen=fromEnv",
653
+ file: "my://bla/storage?index=idx&name=test&store=data&storekey=%40test-data-idx%40&urlGen=fromEnv",
654
+ meta: "my://bla/storage?index=idx&name=test&store=meta&storekey=%40test-meta-idx%40&urlGen=fromEnv",
655
+ wal: "my://bla/storage?index=idx&name=test&store=wal&storekey=%40test-wal-idx%40&urlGen=fromEnv",
656
+ },
657
+ },
658
+ ],
659
+ },
660
+ ]);
661
+ });
662
+
663
+ it("check file protocol defaultURI", () => {
664
+ const gw = bs.defaultGatewayFactoryItem();
665
+ expect(gw.defaultURI(sthis).toString()).toBe(
666
+ "murks://fp",
667
+ // `file://${sthis.env.get("HOME")}/.fireproof/${FILESTORE_VERSION.replace(/-.*$/, "")}`,
668
+ );
669
+ });
670
+ });
@@ -1,7 +1,7 @@
1
- import { Database, ensureSuperThis, fireproof } from "@fireproof/core";
1
+ import { Ledger, ensureSuperThis, fireproof } from "@fireproof/core";
2
2
 
3
3
  interface DBItem {
4
- readonly db: Database;
4
+ readonly db: Ledger;
5
5
  readonly name: string;
6
6
  }
7
7
 
@@ -1,7 +1,5 @@
1
- import { URI } from "@adviser/cement";
2
- import { rt, getStore, ensureSuperLog, ensureSuperThis } from "@fireproof/core";
3
-
4
- // only for test
1
+ import { runtimeFn, URI } from "@adviser/cement";
2
+ import { rt, getStore, inplaceFilter, ensureSuperThis, ensureSuperLog } from "@fireproof/core";
5
3
  import { UUID } from "uuidv7";
6
4
 
7
5
  describe("utils", () => {
@@ -33,14 +31,16 @@ describe("utils", () => {
33
31
  ];
34
32
  it("getfilename plain", () => {
35
33
  for (const store of storeOpts) {
36
- const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version`);
34
+ const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`);
37
35
  expect(rt.getFileName(url, logger)).toEqual(`${store.type}/key${store.suffix}`);
38
36
  }
39
37
  });
40
38
 
41
39
  it("getfilename index", () => {
42
40
  for (const store of storeOpts) {
43
- const url = URI.from(`file://./x/path?index=idx&store=${store.type}&name=name&key=key&version=version`);
41
+ const url = URI.from(
42
+ `file://./x/path?index=idx&store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`,
43
+ );
44
44
  expect(rt.getFileName(url, logger)).toEqual(`idx-${store.type}/key${store.suffix}`);
45
45
  }
46
46
  });
@@ -80,4 +80,45 @@ describe("utils", () => {
80
80
  const id = sthis.timeOrderedNextId(0xcafebabebeef).str;
81
81
  expect(id.slice(0, 15)).toBe("cafebabe-beef-7");
82
82
  });
83
+
84
+ it("inplaceFilter empty", () => {
85
+ const s: string[] = [];
86
+ expect(inplaceFilter(s, () => false)).toEqual([]);
87
+ expect(inplaceFilter(s, () => true)).toEqual([]);
88
+ });
89
+
90
+ it("inplaceFilter sized filtered", () => {
91
+ const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
92
+ expect(inplaceFilter(s, () => false)).toEqual([]);
93
+ });
94
+ it("inplaceFilter sized unfiltered", () => {
95
+ const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
96
+ const ref = [...s];
97
+ expect(inplaceFilter(s, () => true)).toEqual(ref);
98
+ });
99
+
100
+ it("inplaceFilter sized mod 7", () => {
101
+ const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
102
+ const ref = [...s];
103
+ for (let i = 99; i >= 0; i--) {
104
+ if (!(i % 7)) {
105
+ ref.splice(i, 1);
106
+ }
107
+ }
108
+ expect(inplaceFilter(s, (_, j) => !!(j % 7))).toEqual(ref);
109
+ expect(s.length).toBe(85);
110
+ });
111
+ });
112
+
113
+ describe("runtime", () => {
114
+ it("runtime", () => {
115
+ const isNode = !!(typeof process === "object" && process.versions?.node);
116
+ expect(runtimeFn()).toEqual({
117
+ isBrowser: !isNode,
118
+ isCFWorker: false,
119
+ isDeno: false,
120
+ isNodeIsh: isNode,
121
+ isReactNative: false,
122
+ });
123
+ });
83
124
  });