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

Sign up to get free protection for your applications and to get access to all the features.
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
  });