@fireproof/core-test 0.0.0-smoke-1b31059-1752074105

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 (162) hide show
  1. package/LICENSE.md +232 -0
  2. package/blockstore/fp-envelope.test.ts-off +65 -0
  3. package/blockstore/fragment-gateway.test.ts-off +106 -0
  4. package/blockstore/interceptor-gateway.test.d.ts +19 -0
  5. package/blockstore/interceptor-gateway.test.js +217 -0
  6. package/blockstore/interceptor-gateway.test.js.map +1 -0
  7. package/blockstore/interceptor-gateway.test.ts +259 -0
  8. package/blockstore/keyed-crypto-indexeddb-file.test.d.ts +1 -0
  9. package/blockstore/keyed-crypto-indexeddb-file.test.js +114 -0
  10. package/blockstore/keyed-crypto-indexeddb-file.test.js.map +1 -0
  11. package/blockstore/keyed-crypto-indexeddb-file.test.ts +134 -0
  12. package/blockstore/keyed-crypto.test.d.ts +1 -0
  13. package/blockstore/keyed-crypto.test.js +310 -0
  14. package/blockstore/keyed-crypto.test.js.map +1 -0
  15. package/blockstore/keyed-crypto.test.ts +382 -0
  16. package/blockstore/loader.test.d.ts +1 -0
  17. package/blockstore/loader.test.js +241 -0
  18. package/blockstore/loader.test.js.map +1 -0
  19. package/blockstore/loader.test.ts +313 -0
  20. package/blockstore/standalone.test.d.ts +1 -0
  21. package/blockstore/standalone.test.js +112 -0
  22. package/blockstore/standalone.test.js.map +1 -0
  23. package/blockstore/standalone.test.ts +156 -0
  24. package/blockstore/store.test.d.ts +1 -0
  25. package/blockstore/store.test.js +152 -0
  26. package/blockstore/store.test.js.map +1 -0
  27. package/blockstore/store.test.ts +199 -0
  28. package/blockstore/transaction.test.d.ts +1 -0
  29. package/blockstore/transaction.test.js +109 -0
  30. package/blockstore/transaction.test.js.map +1 -0
  31. package/blockstore/transaction.test.ts +132 -0
  32. package/fireproof/all-gateway.test.d.ts +1 -0
  33. package/fireproof/all-gateway.test.js +333 -0
  34. package/fireproof/all-gateway.test.js.map +1 -0
  35. package/fireproof/all-gateway.test.ts +477 -0
  36. package/fireproof/attachable.test.d.ts +1 -0
  37. package/fireproof/attachable.test.js +438 -0
  38. package/fireproof/attachable.test.js.map +1 -0
  39. package/fireproof/attachable.test.ts +677 -0
  40. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
  41. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.d.ts +4 -0
  42. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js +325 -0
  43. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js.map +1 -0
  44. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -0
  45. package/fireproof/charwise-boolean.test.d.ts +1 -0
  46. package/fireproof/charwise-boolean.test.js +43 -0
  47. package/fireproof/charwise-boolean.test.js.map +1 -0
  48. package/fireproof/charwise-boolean.test.ts +68 -0
  49. package/fireproof/crdt.test.d.ts +1 -0
  50. package/fireproof/crdt.test.js +509 -0
  51. package/fireproof/crdt.test.js.map +1 -0
  52. package/fireproof/crdt.test.ts +572 -0
  53. package/fireproof/database.test.d.ts +1 -0
  54. package/fireproof/database.test.js +658 -0
  55. package/fireproof/database.test.js.map +1 -0
  56. package/fireproof/database.test.ts +772 -0
  57. package/fireproof/deleted-docs-handling.test.d.ts +1 -0
  58. package/fireproof/deleted-docs-handling.test.js +69 -0
  59. package/fireproof/deleted-docs-handling.test.js.map +1 -0
  60. package/fireproof/deleted-docs-handling.test.ts +112 -0
  61. package/fireproof/fireproof.test.d.ts +3 -0
  62. package/fireproof/fireproof.test.fixture.d.ts +15 -0
  63. package/fireproof/fireproof.test.fixture.js +134 -0
  64. package/fireproof/fireproof.test.fixture.js.map +1 -0
  65. package/fireproof/fireproof.test.fixture.ts +133 -0
  66. package/fireproof/fireproof.test.js +574 -0
  67. package/fireproof/fireproof.test.js.map +1 -0
  68. package/fireproof/fireproof.test.ts +767 -0
  69. package/fireproof/hello.test.d.ts +1 -0
  70. package/fireproof/hello.test.js +67 -0
  71. package/fireproof/hello.test.js.map +1 -0
  72. package/fireproof/hello.test.ts +75 -0
  73. package/fireproof/indexer.test.d.ts +1 -0
  74. package/fireproof/indexer.test.js +408 -0
  75. package/fireproof/indexer.test.js.map +1 -0
  76. package/fireproof/indexer.test.ts +459 -0
  77. package/fireproof/multiple-ledger.test.d.ts +1 -0
  78. package/fireproof/multiple-ledger.test.js +51 -0
  79. package/fireproof/multiple-ledger.test.js.map +1 -0
  80. package/fireproof/multiple-ledger.test.ts +67 -0
  81. package/fireproof/query-docs.test.d.ts +1 -0
  82. package/fireproof/query-docs.test.js +69 -0
  83. package/fireproof/query-docs.test.js.map +1 -0
  84. package/fireproof/query-docs.test.ts +117 -0
  85. package/fireproof/query-limit-issue.test.d.ts +1 -0
  86. package/fireproof/query-limit-issue.test.js +89 -0
  87. package/fireproof/query-limit-issue.test.js.map +1 -0
  88. package/fireproof/query-limit-issue.test.ts +147 -0
  89. package/fireproof/query-property-inconsistency.test.d.ts +1 -0
  90. package/fireproof/query-property-inconsistency.test.js +52 -0
  91. package/fireproof/query-property-inconsistency.test.js.map +1 -0
  92. package/fireproof/query-property-inconsistency.test.ts +90 -0
  93. package/fireproof/query-result-properties.test.d.ts +1 -0
  94. package/fireproof/query-result-properties.test.js +25 -0
  95. package/fireproof/query-result-properties.test.js.map +1 -0
  96. package/fireproof/query-result-properties.test.ts +43 -0
  97. package/fireproof/stable-cid.test.d.ts +1 -0
  98. package/fireproof/stable-cid.test.js +52 -0
  99. package/fireproof/stable-cid.test.js.map +1 -0
  100. package/fireproof/stable-cid.test.ts +72 -0
  101. package/fireproof/utils.test.d.ts +1 -0
  102. package/fireproof/utils.test.js +124 -0
  103. package/fireproof/utils.test.js.map +1 -0
  104. package/fireproof/utils.test.ts +137 -0
  105. package/gateway/file/loader-config.test.d.ts +1 -0
  106. package/gateway/file/loader-config.test.js +255 -0
  107. package/gateway/file/loader-config.test.js.map +1 -0
  108. package/gateway/file/loader-config.test.ts +309 -0
  109. package/gateway/indexeddb/loader-config.test.d.ts +1 -0
  110. package/gateway/indexeddb/loader-config.test.js +77 -0
  111. package/gateway/indexeddb/loader-config.test.js.map +1 -0
  112. package/gateway/indexeddb/loader-config.test.ts +80 -0
  113. package/global-setup.d.ts +2 -0
  114. package/global-setup.js +9 -0
  115. package/global-setup.js.map +1 -0
  116. package/global-setup.ts +11 -0
  117. package/helpers.d.ts +31 -0
  118. package/helpers.js +140 -0
  119. package/helpers.js.map +1 -0
  120. package/helpers.ts +177 -0
  121. package/package.json +75 -0
  122. package/protocols/cloud/msger.test.d.ts +1 -0
  123. package/protocols/cloud/msger.test.js +464 -0
  124. package/protocols/cloud/msger.test.js.map +1 -0
  125. package/protocols/cloud/msger.test.ts +559 -0
  126. package/runtime/fp-envelope-serialize.test.d.ts +1 -0
  127. package/runtime/fp-envelope-serialize.test.js +223 -0
  128. package/runtime/fp-envelope-serialize.test.js.map +1 -0
  129. package/runtime/fp-envelope-serialize.test.ts +266 -0
  130. package/runtime/meta-key-hack.test.d.ts +1 -0
  131. package/runtime/meta-key-hack.test.js +85 -0
  132. package/runtime/meta-key-hack.test.js.map +1 -0
  133. package/runtime/meta-key-hack.test.ts +103 -0
  134. package/setup.file.d.ts +1 -0
  135. package/setup.file.js +3 -0
  136. package/setup.file.js.map +1 -0
  137. package/setup.file.ts +1 -0
  138. package/setup.indexeddb.d.ts +1 -0
  139. package/setup.indexeddb.js +2 -0
  140. package/setup.indexeddb.js.map +1 -0
  141. package/setup.indexeddb.ts +0 -0
  142. package/setup.memory.d.ts +1 -0
  143. package/setup.memory.js +4 -0
  144. package/setup.memory.js.map +1 -0
  145. package/setup.memory.ts +2 -0
  146. package/tsconfig.json +18 -0
  147. package/vitest.config.d.ts +2 -0
  148. package/vitest.config.js +8 -0
  149. package/vitest.config.js.map +1 -0
  150. package/vitest.config.ts +8 -0
  151. package/vitest.file.config.d.ts +2 -0
  152. package/vitest.file.config.js +11 -0
  153. package/vitest.file.config.js.map +1 -0
  154. package/vitest.file.config.ts +11 -0
  155. package/vitest.indexeddb.config.d.ts +2 -0
  156. package/vitest.indexeddb.config.js +21 -0
  157. package/vitest.indexeddb.config.js.map +1 -0
  158. package/vitest.indexeddb.config.ts +34 -0
  159. package/vitest.memory.config.d.ts +2 -0
  160. package/vitest.memory.config.js +24 -0
  161. package/vitest.memory.config.js.map +1 -0
  162. package/vitest.memory.config.ts +24 -0
@@ -0,0 +1,72 @@
1
+ import { sha256 } from "multiformats/hashes/sha2";
2
+ import { base58btc } from "multiformats/bases/base58";
3
+ import { URI, toCryptoRuntime } from "@adviser/cement";
4
+ import * as cborg from "cborg";
5
+ import { asyncBlockDecode, asyncBlockEncode, ensureSuperThis, keyedCryptoFactory } from "@fireproof/core-runtime";
6
+ import { describe, beforeEach, it, expect } from "vitest";
7
+ import { getKeyBag } from "@fireproof/core-keybag";
8
+ import { CryptoAction, IvKeyIdData } from "@fireproof/core-types-blockstore";
9
+
10
+ const sthis = ensureSuperThis();
11
+ describe.each([
12
+ async () => {
13
+ const kb = await getKeyBag(sthis, {});
14
+ const keyStr = base58btc.encode(toCryptoRuntime().randomBytes(kb.rt.keyLength));
15
+ return await keyedCryptoFactory(URI.from(`test://bla?storekey=${keyStr}`), kb, sthis);
16
+ },
17
+ async () => {
18
+ const kb = await getKeyBag(sthis, {});
19
+ return await keyedCryptoFactory(URI.from(`test://bla?storekey=insecure`), kb, sthis);
20
+ },
21
+ ])("regression of stable cid encoding", (factory) => {
22
+ let kycr: CryptoAction;
23
+ beforeEach(async () => {
24
+ // let url: URI;
25
+ // if (runtimeFn().isBrowser) {
26
+ // url = URI.from("indexeddb://fp-keybag");
27
+ // } else {
28
+ // url = URI.merge(`file://./dist/tests/key.bag`, sthis.env.get("FP_KEYBAG_URL"));
29
+ // }
30
+ kycr = await factory();
31
+ });
32
+
33
+ it("should encode and decode a stable cid", async () => {
34
+ const x1 = await asyncBlockEncode({
35
+ value: cborg.encode({ hello: "world" }),
36
+ // hashBytes: {
37
+ // as: (x: Uint8Array<ArrayBufferLike>): Promise<ByteView<Uint8Array>> => Promise.resolve(x),
38
+ // },
39
+ hasher: sha256,
40
+ codec: kycr.codec(toCryptoRuntime().randomBytes(12)),
41
+ });
42
+ const x2 = await asyncBlockEncode({
43
+ value: cborg.encode({ hello: "world" }),
44
+ // hashBytes: {
45
+ // as: (x: Uint8Array<ArrayBufferLike>): Promise<ByteView<Uint8Array>> => Promise.resolve(x),
46
+ // },
47
+ hasher: sha256,
48
+ codec: kycr.codec(toCryptoRuntime().randomBytes(12)),
49
+ });
50
+ expect(x1.cid).toEqual(x2.cid);
51
+ });
52
+ it("decode stable cid", async () => {
53
+ const x1 = await asyncBlockEncode({
54
+ value: cborg.encode({ hello: "world" }),
55
+ // hashBytes: {
56
+ // as: (x: Uint8Array<ArrayBufferLike>): Promise<ByteView<Uint8Array>> => Promise.resolve(x),
57
+ // },
58
+ hasher: sha256,
59
+ codec: kycr.codec(),
60
+ });
61
+ const x = await asyncBlockDecode<IvKeyIdData, 24, 18>({
62
+ bytes: x1.bytes,
63
+ // hashBytes: {
64
+ // get: (x: IvKeyIdData): Promise<ByteView<Uint8Array>> => Promise.resolve(x.data as ByteView<Uint8Array<ArrayBufferLike>>),
65
+ // },
66
+ codec: kycr.codec(),
67
+ hasher: sha256,
68
+ });
69
+ expect(x.cid.toString()).toEqual(x1.cid.toString());
70
+ expect(cborg.decode(x.value.data)).toEqual({ hello: "world" });
71
+ }, 1000000);
72
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,124 @@
1
+ import { runtimeFn, URI } from "@adviser/cement";
2
+ import { getFileName } from "@fireproof/core-gateways-base";
3
+ import { ensureSuperThis, ensureSuperLog, getStore, inplaceFilter } from "@fireproof/core-runtime";
4
+ import { UUID } from "uuidv7";
5
+ import { describe, beforeAll, it, expect, assert } from "vitest";
6
+ describe("utils", () => {
7
+ const sthis = ensureSuperThis();
8
+ const logger = ensureSuperLog(sthis, "getfilename");
9
+ beforeAll(async () => {
10
+ await sthis.start();
11
+ });
12
+ it("sorts search params", () => {
13
+ const url = URI.from("http://example.com?z=1&y=2&x=3");
14
+ expect(url.toString()).toEqual("http://example.com/?x=3&y=2&z=1");
15
+ });
16
+ const storeOpts = [
17
+ {
18
+ type: "car",
19
+ pathPart: "data",
20
+ suffix: ".car",
21
+ },
22
+ {
23
+ type: "file",
24
+ pathPart: "data",
25
+ suffix: "",
26
+ },
27
+ {
28
+ type: "wal",
29
+ pathPart: "wal",
30
+ suffix: ".json",
31
+ },
32
+ {
33
+ type: "meta",
34
+ pathPart: "meta",
35
+ suffix: ".json",
36
+ },
37
+ ];
38
+ it("getfilename plain", () => {
39
+ for (const store of storeOpts) {
40
+ const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`);
41
+ expect(getFileName(url, logger)).toEqual(`${store.pathPart}/key${store.suffix}`);
42
+ }
43
+ });
44
+ it("getfilename index", () => {
45
+ for (const store of storeOpts) {
46
+ const url = URI.from(`file://./x/path?index=idx&store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`);
47
+ expect(getFileName(url, logger)).toEqual(`idx-${store.pathPart}/key${store.suffix}`);
48
+ }
49
+ });
50
+ it("getstore", () => {
51
+ for (const store of storeOpts) {
52
+ const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version`);
53
+ expect(getStore(url, logger, (...toJoin) => toJoin.join("+"))).toEqual({
54
+ fromUrl: store.type,
55
+ name: store.pathPart,
56
+ pathPart: store.pathPart,
57
+ });
58
+ }
59
+ });
60
+ it("getstore idx", () => {
61
+ for (const store of storeOpts) {
62
+ const url = URI.from(`file://./x/path?index=ix&store=${store.type}&name=name&key=key&version=version`);
63
+ expect(getStore(url, logger, (...toJoin) => toJoin.join("+"))).toEqual({
64
+ fromUrl: store.type,
65
+ pathPart: store.pathPart,
66
+ name: `ix+${store.pathPart}`,
67
+ });
68
+ }
69
+ });
70
+ it("order timeorderednextid", () => {
71
+ let last = sthis.timeOrderedNextId().str;
72
+ for (let i = 0; i < 10; i++) {
73
+ const id = sthis.timeOrderedNextId().str;
74
+ const x = UUID.parse(id);
75
+ expect(x.getVariant()).toBe("VAR_10");
76
+ assert(id !== last, "id should be greater than last");
77
+ assert(id.slice(0, 13) >= last.slice(0, 13), `id should be greater than last ${id.slice(0, 13)} ${last.slice(0, 13)}`);
78
+ last = id;
79
+ }
80
+ });
81
+ it("timeorderednextid is uuidv7", () => {
82
+ const id = sthis.timeOrderedNextId(0xcafebabebeef).str;
83
+ expect(id.slice(0, 15)).toBe("cafebabe-beef-7");
84
+ });
85
+ it("inplaceFilter empty", () => {
86
+ const s = [];
87
+ expect(inplaceFilter(s, () => false)).toEqual([]);
88
+ expect(inplaceFilter(s, () => true)).toEqual([]);
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
+ it("inplaceFilter sized mod 7", () => {
100
+ const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
101
+ const ref = [...s];
102
+ for (let i = 99; i >= 0; i--) {
103
+ if (!(i % 7)) {
104
+ ref.splice(i, 1);
105
+ }
106
+ }
107
+ expect(inplaceFilter(s, (_, j) => !!(j % 7))).toEqual(ref);
108
+ expect(s.length).toBe(85);
109
+ });
110
+ });
111
+ describe("runtime", () => {
112
+ it("runtime", () => {
113
+ const isDeno = !!(typeof process === "object" && process.versions?.deno);
114
+ const isNode = !isDeno && !!(typeof process === "object" && process.versions?.node);
115
+ expect(runtimeFn()).toEqual({
116
+ isBrowser: !(isNode || isDeno),
117
+ isCFWorker: false,
118
+ isDeno: isDeno,
119
+ isNodeIsh: isNode,
120
+ isReactNative: false,
121
+ });
122
+ });
123
+ });
124
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { runtimeFn, URI } from "@adviser/cement";
2
+ import { getFileName } from "@fireproof/core-gateways-base";
3
+ import { ensureSuperThis, ensureSuperLog, getStore, inplaceFilter } from "@fireproof/core-runtime";
4
+ import { UUID } from "uuidv7";
5
+ import { describe, beforeAll, it, expect, assert } from "vitest";
6
+
7
+ describe("utils", () => {
8
+ const sthis = ensureSuperThis();
9
+ const logger = ensureSuperLog(sthis, "getfilename");
10
+
11
+ beforeAll(async () => {
12
+ await sthis.start();
13
+ });
14
+
15
+ it("sorts search params", () => {
16
+ const url = URI.from("http://example.com?z=1&y=2&x=3");
17
+ expect(url.toString()).toEqual("http://example.com/?x=3&y=2&z=1");
18
+ });
19
+
20
+ const storeOpts = [
21
+ {
22
+ type: "car",
23
+ pathPart: "data",
24
+ suffix: ".car",
25
+ },
26
+ {
27
+ type: "file",
28
+ pathPart: "data",
29
+ suffix: "",
30
+ },
31
+ {
32
+ type: "wal",
33
+ pathPart: "wal",
34
+ suffix: ".json",
35
+ },
36
+ {
37
+ type: "meta",
38
+ pathPart: "meta",
39
+ suffix: ".json",
40
+ },
41
+ ];
42
+ it("getfilename plain", () => {
43
+ for (const store of storeOpts) {
44
+ const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`);
45
+ expect(getFileName(url, logger)).toEqual(`${store.pathPart}/key${store.suffix}`);
46
+ }
47
+ });
48
+
49
+ it("getfilename index", () => {
50
+ for (const store of storeOpts) {
51
+ const url = URI.from(
52
+ `file://./x/path?index=idx&store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`,
53
+ );
54
+ expect(getFileName(url, logger)).toEqual(`idx-${store.pathPart}/key${store.suffix}`);
55
+ }
56
+ });
57
+
58
+ it("getstore", () => {
59
+ for (const store of storeOpts) {
60
+ const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version`);
61
+ expect(getStore(url, logger, (...toJoin) => toJoin.join("+"))).toEqual({
62
+ fromUrl: store.type,
63
+ name: store.pathPart,
64
+ pathPart: store.pathPart,
65
+ });
66
+ }
67
+ });
68
+
69
+ it("getstore idx", () => {
70
+ for (const store of storeOpts) {
71
+ const url = URI.from(`file://./x/path?index=ix&store=${store.type}&name=name&key=key&version=version`);
72
+ expect(getStore(url, logger, (...toJoin) => toJoin.join("+"))).toEqual({
73
+ fromUrl: store.type,
74
+ pathPart: store.pathPart,
75
+ name: `ix+${store.pathPart}`,
76
+ });
77
+ }
78
+ });
79
+
80
+ it("order timeorderednextid", () => {
81
+ let last = sthis.timeOrderedNextId().str;
82
+ for (let i = 0; i < 10; i++) {
83
+ const id = sthis.timeOrderedNextId().str;
84
+ const x = UUID.parse(id);
85
+ expect(x.getVariant()).toBe("VAR_10");
86
+ assert(id !== last, "id should be greater than last");
87
+ assert(id.slice(0, 13) >= last.slice(0, 13), `id should be greater than last ${id.slice(0, 13)} ${last.slice(0, 13)}`);
88
+ last = id;
89
+ }
90
+ });
91
+ it("timeorderednextid is uuidv7", () => {
92
+ const id = sthis.timeOrderedNextId(0xcafebabebeef).str;
93
+ expect(id.slice(0, 15)).toBe("cafebabe-beef-7");
94
+ });
95
+
96
+ it("inplaceFilter empty", () => {
97
+ const s: string[] = [];
98
+ expect(inplaceFilter(s, () => false)).toEqual([]);
99
+ expect(inplaceFilter(s, () => true)).toEqual([]);
100
+ });
101
+
102
+ it("inplaceFilter sized filtered", () => {
103
+ const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
104
+ expect(inplaceFilter(s, () => false)).toEqual([]);
105
+ });
106
+ it("inplaceFilter sized unfiltered", () => {
107
+ const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
108
+ const ref = [...s];
109
+ expect(inplaceFilter(s, () => true)).toEqual(ref);
110
+ });
111
+
112
+ it("inplaceFilter sized mod 7", () => {
113
+ const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
114
+ const ref = [...s];
115
+ for (let i = 99; i >= 0; i--) {
116
+ if (!(i % 7)) {
117
+ ref.splice(i, 1);
118
+ }
119
+ }
120
+ expect(inplaceFilter(s, (_, j) => !!(j % 7))).toEqual(ref);
121
+ expect(s.length).toBe(85);
122
+ });
123
+ });
124
+
125
+ describe("runtime", () => {
126
+ it("runtime", () => {
127
+ const isDeno = !!(typeof process === "object" && process.versions?.deno);
128
+ const isNode = !isDeno && !!(typeof process === "object" && process.versions?.node);
129
+ expect(runtimeFn()).toEqual({
130
+ isBrowser: !(isNode || isDeno),
131
+ isCFWorker: false,
132
+ isDeno: isDeno,
133
+ isNodeIsh: isNode,
134
+ isReactNative: false,
135
+ });
136
+ });
137
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,255 @@
1
+ import { BuildURI, runtimeFn, URI } from "@adviser/cement";
2
+ import { fireproof, PARAM } from "@fireproof/core";
3
+ import { mockSuperThis } from "../../helpers.js";
4
+ import { describe, beforeAll, it, expect } from "vitest";
5
+ import { FILESTORE_VERSION, sysFileSystemFactory } from "@fireproof/core-gateways-file";
6
+ function dataDir(sthis, name, base) {
7
+ if (!base) {
8
+ const home = sthis.env.get("HOME") || "./";
9
+ base =
10
+ sthis.env.get("FP_STORAGE_URL") ||
11
+ `file://${sthis.pathOps.join(home, ".fireproof", FILESTORE_VERSION.replace(/-.*$/, ""))}?${PARAM.URL_GEN}=default`;
12
+ }
13
+ return URI.from(base.toString())
14
+ .build()
15
+ .setParam(PARAM.NAME, name || "")
16
+ .URI();
17
+ }
18
+ const _my_app = "my-app";
19
+ function my_app() {
20
+ return _my_app;
21
+ }
22
+ describe("config file gateway", () => {
23
+ const sthis = mockSuperThis();
24
+ beforeAll(async () => {
25
+ await sthis.start();
26
+ });
27
+ it("loader", async () => {
28
+ const db = fireproof(my_app());
29
+ await db.put({ name: "my-app" });
30
+ expect(db.ledger.name).toBe(my_app());
31
+ const fileStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.file;
32
+ expect(fileStore?.url().asObj()).toEqual({
33
+ pathname: "./dist/fp-dir-file",
34
+ protocol: "file:",
35
+ searchParams: {
36
+ name: "my-app",
37
+ store: "file",
38
+ storekey: "@my-app-data@",
39
+ urlGen: "fromEnv",
40
+ version: "v0.19-file",
41
+ },
42
+ style: "path",
43
+ });
44
+ const dataStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.car;
45
+ expect(dataStore?.url().asObj()).toEqual({
46
+ pathname: "./dist/fp-dir-file",
47
+ protocol: "file:",
48
+ searchParams: {
49
+ name: "my-app",
50
+ store: "car",
51
+ suffix: ".car",
52
+ storekey: "@my-app-data@",
53
+ urlGen: "fromEnv",
54
+ version: "v0.19-file",
55
+ },
56
+ style: "path",
57
+ });
58
+ const metaStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.meta;
59
+ expect(metaStore?.url().asObj()).toEqual({
60
+ pathname: "./dist/fp-dir-file",
61
+ protocol: "file:",
62
+ searchParams: {
63
+ name: "my-app",
64
+ store: "meta",
65
+ storekey: "@my-app-meta@",
66
+ urlGen: "fromEnv",
67
+ version: "v0.19-file",
68
+ },
69
+ style: "path",
70
+ });
71
+ const WALStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.wal;
72
+ expect(WALStore?.url().asObj()).toEqual({
73
+ pathname: "./dist/fp-dir-file",
74
+ protocol: "file:",
75
+ searchParams: {
76
+ name: "my-app",
77
+ store: "wal",
78
+ storekey: "@my-app-wal@",
79
+ urlGen: "fromEnv",
80
+ version: "v0.19-file",
81
+ },
82
+ style: "path",
83
+ });
84
+ await db.close();
85
+ });
86
+ it("file path", async () => {
87
+ let baseDir = "./dist/data".replace(/\?.*$/, "").replace(/^file:\/\//, "");
88
+ baseDir = sthis.pathOps.join(baseDir, my_app());
89
+ const base = BuildURI.from("./dist/data");
90
+ const sysfs = await sysFileSystemFactory(base.URI());
91
+ await sysfs.rm(baseDir, { recursive: true }).catch(() => {
92
+ });
93
+ const db = fireproof(my_app(), { storeUrls: { base } });
94
+ await db.put({ name: "my-app" });
95
+ expect(db.ledger.name).toBe(my_app());
96
+ const carStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.car;
97
+ expect(carStore?.url().asObj()).toEqual({
98
+ pathname: "./dist/data",
99
+ protocol: "file:",
100
+ searchParams: {
101
+ name: "my-app",
102
+ store: "car",
103
+ storekey: "@my-app-data@",
104
+ suffix: ".car",
105
+ version: "v0.19-file",
106
+ },
107
+ style: "path",
108
+ });
109
+ const fileStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.file;
110
+ expect(fileStore?.url().asObj()).toEqual({
111
+ pathname: "./dist/data",
112
+ protocol: "file:",
113
+ searchParams: {
114
+ name: "my-app",
115
+ store: "file",
116
+ storekey: "@my-app-data@",
117
+ version: "v0.19-file",
118
+ },
119
+ style: "path",
120
+ });
121
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "data"))).isDirectory()).toBeTruthy();
122
+ const metaStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.meta;
123
+ expect(metaStore?.url().asObj()).toEqual({
124
+ pathname: "./dist/data",
125
+ protocol: "file:",
126
+ searchParams: {
127
+ name: "my-app",
128
+ store: "meta",
129
+ storekey: "@my-app-meta@",
130
+ version: "v0.19-file",
131
+ },
132
+ style: "path",
133
+ });
134
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "meta"))).isDirectory()).toBeTruthy();
135
+ await db.close();
136
+ });
137
+ it("homedir default", async () => {
138
+ const old = sthis.env.get("FP_STORAGE_URL");
139
+ sthis.env.delete("FP_STORAGE_URL");
140
+ let baseDir = dataDir(sthis, my_app()).pathname;
141
+ baseDir = sthis.pathOps.join(baseDir, my_app());
142
+ const base = BuildURI.from(baseDir);
143
+ const sysfs = await sysFileSystemFactory(base.URI());
144
+ await sysfs.rm(baseDir, { recursive: true }).catch(() => {
145
+ });
146
+ expect(baseDir).toMatch(new RegExp(`/\\.fireproof/${FILESTORE_VERSION.replace(/-file/, "")}/${my_app()}`));
147
+ const db = fireproof(my_app());
148
+ await db.put({ name: "my-app" });
149
+ expect(db.ledger.name).toBe(my_app());
150
+ const carStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.car;
151
+ expect(carStore?.url().asObj()).toEqual({
152
+ pathname: `${sthis.env.get("HOME")}/.fireproof/v0.19`,
153
+ protocol: "file:",
154
+ style: "path",
155
+ searchParams: {
156
+ suffix: ".car",
157
+ runtime: runtimeFn().isDeno ? "deno" : "node",
158
+ urlGen: "default",
159
+ store: "car",
160
+ name: my_app(),
161
+ storekey: `@${my_app()}-data@`,
162
+ version: FILESTORE_VERSION,
163
+ },
164
+ });
165
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "data"))).isDirectory()).toBeTruthy();
166
+ const fileStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.file;
167
+ expect(fileStore?.url().asObj()).toEqual({
168
+ pathname: `${sthis.env.get("HOME")}/.fireproof/v0.19`,
169
+ protocol: "file:",
170
+ style: "path",
171
+ searchParams: {
172
+ runtime: runtimeFn().isDeno ? "deno" : "node",
173
+ urlGen: "default",
174
+ store: "file",
175
+ name: my_app(),
176
+ storekey: `@${my_app()}-data@`,
177
+ version: FILESTORE_VERSION,
178
+ },
179
+ });
180
+ const metaStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.meta;
181
+ expect(metaStore?.url().asObj()).toEqual({
182
+ pathname: `${sthis.env.get("HOME")}/.fireproof/v0.19`,
183
+ protocol: "file:",
184
+ style: "path",
185
+ searchParams: {
186
+ runtime: runtimeFn().isDeno ? "deno" : "node",
187
+ urlGen: "default",
188
+ store: "meta",
189
+ name: my_app(),
190
+ storekey: `@${my_app()}-meta@`,
191
+ version: FILESTORE_VERSION,
192
+ },
193
+ });
194
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "meta"))).isDirectory()).toBeTruthy();
195
+ sthis.env.set("FP_STORAGE_URL", old);
196
+ await db.close();
197
+ });
198
+ it("set by env", async () => {
199
+ const old = sthis.env.get("FP_STORAGE_URL");
200
+ const testUrl = BuildURI.from(old);
201
+ let baseDir = dataDir(sthis, my_app()).pathname;
202
+ baseDir = sthis.pathOps.join(baseDir, my_app());
203
+ const sysfs = await sysFileSystemFactory(testUrl.URI());
204
+ await sysfs.rm(baseDir, { recursive: true }).catch(() => {
205
+ });
206
+ const db = fireproof(my_app());
207
+ await db.put({ name: "my-app" });
208
+ expect(db.ledger.name).toBe(my_app());
209
+ const carStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.car;
210
+ expect(carStore?.url().asObj()).toEqual({
211
+ pathname: "./dist/fp-dir-file",
212
+ protocol: "file:",
213
+ style: "path",
214
+ searchParams: {
215
+ urlGen: "fromEnv",
216
+ store: "car",
217
+ suffix: ".car",
218
+ name: my_app(),
219
+ storekey: `@${my_app()}-data@`,
220
+ version: FILESTORE_VERSION,
221
+ },
222
+ });
223
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "data"))).isDirectory()).toBeTruthy();
224
+ const fileStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.file;
225
+ expect(fileStore?.url().asObj()).toEqual({
226
+ pathname: `./dist/fp-dir-file`,
227
+ protocol: "file:",
228
+ style: "path",
229
+ searchParams: {
230
+ urlGen: "fromEnv",
231
+ store: "file",
232
+ name: my_app(),
233
+ storekey: `@${my_app()}-data@`,
234
+ version: FILESTORE_VERSION,
235
+ },
236
+ });
237
+ const metaStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.meta;
238
+ expect(metaStore?.url().asObj()).toEqual({
239
+ pathname: `./dist/fp-dir-file`,
240
+ protocol: "file:",
241
+ style: "path",
242
+ searchParams: {
243
+ urlGen: "fromEnv",
244
+ store: "meta",
245
+ name: my_app(),
246
+ storekey: `@${my_app()}-meta@`,
247
+ version: FILESTORE_VERSION,
248
+ },
249
+ });
250
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "meta"))).isDirectory()).toBeTruthy();
251
+ await db.close();
252
+ sthis.env.set("FP_STORAGE_URL", old);
253
+ });
254
+ });
255
+ //# sourceMappingURL=loader-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-config.test.js","sourceRoot":"","sources":["loader-config.test.ts"],"names":[],"mappings":"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"}