@evolu/common 8.0.0-next.4 → 8.0.0

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 (237) hide show
  1. package/dist/src/Array.d.ts +279 -173
  2. package/dist/src/Array.d.ts.map +1 -1
  3. package/dist/src/Array.js +105 -101
  4. package/dist/src/Assert.d.ts +44 -44
  5. package/dist/src/Assert.d.ts.map +1 -1
  6. package/dist/src/Assert.js +44 -32
  7. package/dist/src/BigInt.d.ts +6 -3
  8. package/dist/src/BigInt.d.ts.map +1 -1
  9. package/dist/src/BigInt.js +5 -2
  10. package/dist/src/Brand.d.ts +27 -40
  11. package/dist/src/Brand.d.ts.map +1 -1
  12. package/dist/src/Buffer.d.ts +27 -11
  13. package/dist/src/Buffer.d.ts.map +1 -1
  14. package/dist/src/Cache.d.ts +9 -4
  15. package/dist/src/Cache.d.ts.map +1 -1
  16. package/dist/src/Cache.js +8 -3
  17. package/dist/src/Callbacks.d.ts +30 -19
  18. package/dist/src/Callbacks.d.ts.map +1 -1
  19. package/dist/src/Console.d.ts +145 -66
  20. package/dist/src/Console.d.ts.map +1 -1
  21. package/dist/src/Console.js +91 -43
  22. package/dist/src/Crypto.d.ts +85 -42
  23. package/dist/src/Crypto.d.ts.map +1 -1
  24. package/dist/src/Crypto.js +44 -20
  25. package/dist/src/Eq.d.ts +87 -21
  26. package/dist/src/Eq.d.ts.map +1 -1
  27. package/dist/src/Eq.js +67 -19
  28. package/dist/src/Error.d.ts +5 -3
  29. package/dist/src/Error.d.ts.map +1 -1
  30. package/dist/src/Error.js +16 -0
  31. package/dist/src/Function.d.ts +119 -58
  32. package/dist/src/Function.d.ts.map +1 -1
  33. package/dist/src/Function.js +86 -43
  34. package/dist/src/Http.d.ts +394 -0
  35. package/dist/src/Http.d.ts.map +1 -0
  36. package/dist/src/Http.js +102 -0
  37. package/dist/src/Identicon.d.ts +16 -7
  38. package/dist/src/Identicon.d.ts.map +1 -1
  39. package/dist/src/Identicon.js +14 -5
  40. package/dist/src/LeakDetector.d.ts +88 -0
  41. package/dist/src/LeakDetector.d.ts.map +1 -0
  42. package/dist/src/LeakDetector.js +86 -0
  43. package/dist/src/LockManager.d.ts +18 -9
  44. package/dist/src/LockManager.d.ts.map +1 -1
  45. package/dist/src/LockManager.js +7 -8
  46. package/dist/src/Lookup.d.ts +43 -13
  47. package/dist/src/Lookup.d.ts.map +1 -1
  48. package/dist/src/Lookup.js +28 -8
  49. package/dist/src/Microtask.d.ts +1 -1
  50. package/dist/src/Microtask.d.ts.map +1 -1
  51. package/dist/src/Microtask.js +3 -7
  52. package/dist/src/Number.d.ts +49 -13
  53. package/dist/src/Number.d.ts.map +1 -1
  54. package/dist/src/Number.js +34 -5
  55. package/dist/src/Object.d.ts +160 -40
  56. package/dist/src/Object.d.ts.map +1 -1
  57. package/dist/src/Object.js +92 -46
  58. package/dist/src/Option.d.ts +10 -7
  59. package/dist/src/Option.d.ts.map +1 -1
  60. package/dist/src/Option.js +9 -6
  61. package/dist/src/Order.d.ts +21 -21
  62. package/dist/src/Order.d.ts.map +1 -1
  63. package/dist/src/Order.js +18 -21
  64. package/dist/src/Platform.d.ts +31 -0
  65. package/dist/src/Platform.d.ts.map +1 -1
  66. package/dist/src/Platform.js +98 -0
  67. package/dist/src/Random.d.ts +32 -17
  68. package/dist/src/Random.d.ts.map +1 -1
  69. package/dist/src/Random.js +12 -8
  70. package/dist/src/Redacted.d.ts +43 -29
  71. package/dist/src/Redacted.d.ts.map +1 -1
  72. package/dist/src/Redacted.js +14 -3
  73. package/dist/src/Ref.d.ts +11 -3
  74. package/dist/src/Ref.d.ts.map +1 -1
  75. package/dist/src/Ref.js +2 -2
  76. package/dist/src/RefCount.d.ts +2 -6
  77. package/dist/src/RefCount.d.ts.map +1 -1
  78. package/dist/src/RefCount.js +33 -90
  79. package/dist/src/Relation.d.ts +70 -5
  80. package/dist/src/Relation.d.ts.map +1 -1
  81. package/dist/src/Relation.js +77 -2
  82. package/dist/src/Resource.d.ts +590 -155
  83. package/dist/src/Resource.d.ts.map +1 -1
  84. package/dist/src/Resource.js +592 -343
  85. package/dist/src/Result.d.ts +838 -191
  86. package/dist/src/Result.d.ts.map +1 -1
  87. package/dist/src/Result.js +163 -102
  88. package/dist/src/Schedule.d.ts +684 -231
  89. package/dist/src/Schedule.d.ts.map +1 -1
  90. package/dist/src/Schedule.js +766 -295
  91. package/dist/src/Set.d.ts +89 -40
  92. package/dist/src/Set.d.ts.map +1 -1
  93. package/dist/src/Set.js +50 -29
  94. package/dist/src/Sqlite.d.ts +29 -72
  95. package/dist/src/Sqlite.d.ts.map +1 -1
  96. package/dist/src/Sqlite.js +41 -46
  97. package/dist/src/StackTrace.d.ts +40 -0
  98. package/dist/src/StackTrace.d.ts.map +1 -0
  99. package/dist/src/StackTrace.js +140 -0
  100. package/dist/src/Store.d.ts +5 -4
  101. package/dist/src/Store.d.ts.map +1 -1
  102. package/dist/src/Store.js +5 -4
  103. package/dist/src/String.d.ts +7 -1
  104. package/dist/src/String.d.ts.map +1 -1
  105. package/dist/src/String.js +20 -7
  106. package/dist/src/Task.d.ts +3572 -1770
  107. package/dist/src/Task.d.ts.map +1 -1
  108. package/dist/src/Task.js +1879 -1274
  109. package/dist/src/Test.d.ts +17 -125
  110. package/dist/src/Test.d.ts.map +1 -1
  111. package/dist/src/Test.js +17 -68
  112. package/dist/src/Time.d.ts +108 -49
  113. package/dist/src/Time.d.ts.map +1 -1
  114. package/dist/src/Time.js +172 -73
  115. package/dist/src/Type.d.ts +3542 -1926
  116. package/dist/src/Type.d.ts.map +1 -1
  117. package/dist/src/Type.js +3070 -1784
  118. package/dist/src/Types.d.ts +200 -108
  119. package/dist/src/Types.d.ts.map +1 -1
  120. package/dist/src/Types.js +39 -8
  121. package/dist/src/WebSocket.d.ts +48 -23
  122. package/dist/src/WebSocket.d.ts.map +1 -1
  123. package/dist/src/WebSocket.js +15 -6
  124. package/dist/src/Worker.d.ts +94 -36
  125. package/dist/src/Worker.d.ts.map +1 -1
  126. package/dist/src/Worker.js +58 -24
  127. package/dist/src/index.d.ts +55 -52
  128. package/dist/src/index.d.ts.map +1 -1
  129. package/dist/src/index.js +3 -1
  130. package/dist/src/intl/cs.d.ts +94 -0
  131. package/dist/src/intl/cs.d.ts.map +1 -0
  132. package/dist/src/intl/cs.js +220 -0
  133. package/dist/src/intl/index.d.ts +7 -0
  134. package/dist/src/intl/index.d.ts.map +1 -0
  135. package/dist/src/intl/index.js +6 -0
  136. package/dist/src/local-first/Db.d.ts +12 -8
  137. package/dist/src/local-first/Db.d.ts.map +1 -1
  138. package/dist/src/local-first/Db.js +109 -132
  139. package/dist/src/local-first/Error.d.ts +4 -4
  140. package/dist/src/local-first/Evolu.d.ts +338 -92
  141. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  142. package/dist/src/local-first/Evolu.js +47 -55
  143. package/dist/src/local-first/LocalAuth.d.ts +4 -4
  144. package/dist/src/local-first/LocalAuth.d.ts.map +1 -1
  145. package/dist/src/local-first/Owner.d.ts +61 -24
  146. package/dist/src/local-first/Owner.d.ts.map +1 -1
  147. package/dist/src/local-first/Owner.js +45 -8
  148. package/dist/src/local-first/Protocol.d.ts +44 -31
  149. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  150. package/dist/src/local-first/Protocol.js +36 -13
  151. package/dist/src/local-first/Query.d.ts +147 -62
  152. package/dist/src/local-first/Query.d.ts.map +1 -1
  153. package/dist/src/local-first/Query.js +112 -58
  154. package/dist/src/local-first/Relay.d.ts +44 -14
  155. package/dist/src/local-first/Relay.d.ts.map +1 -1
  156. package/dist/src/local-first/Schema.d.ts +92 -41
  157. package/dist/src/local-first/Schema.d.ts.map +1 -1
  158. package/dist/src/local-first/Schema.js +25 -8
  159. package/dist/src/local-first/Shared.d.ts +23 -21
  160. package/dist/src/local-first/Shared.d.ts.map +1 -1
  161. package/dist/src/local-first/Shared.js +100 -57
  162. package/dist/src/local-first/Storage.d.ts +53 -32
  163. package/dist/src/local-first/Storage.d.ts.map +1 -1
  164. package/dist/src/local-first/Storage.js +194 -234
  165. package/dist/src/local-first/Timestamp.d.ts +21 -21
  166. package/dist/src/local-first/Timestamp.d.ts.map +1 -1
  167. package/dist/src/local-first/Timestamp.js +2 -2
  168. package/dist/src/local-first/index.d.ts +11 -11
  169. package/package.json +14 -13
  170. package/src/Array.ts +306 -205
  171. package/src/Assert.ts +54 -69
  172. package/src/BigInt.ts +6 -3
  173. package/src/Brand.ts +27 -40
  174. package/src/Buffer.ts +28 -12
  175. package/src/Cache.ts +9 -4
  176. package/src/Callbacks.ts +30 -19
  177. package/src/Console.ts +156 -84
  178. package/src/Crypto.ts +83 -41
  179. package/src/Eq.ts +95 -22
  180. package/src/Error.ts +8 -4
  181. package/src/Function.ts +167 -59
  182. package/src/Http.ts +549 -0
  183. package/src/Identicon.ts +16 -7
  184. package/src/LeakDetector.ts +182 -0
  185. package/src/LockManager.ts +43 -39
  186. package/src/Lookup.ts +62 -28
  187. package/src/Microtask.ts +19 -23
  188. package/src/Number.ts +64 -12
  189. package/src/Object.ts +173 -49
  190. package/src/Option.ts +10 -7
  191. package/src/Order.ts +23 -21
  192. package/src/Platform.ts +136 -0
  193. package/src/Polyfills.ts +6 -12
  194. package/src/Random.ts +32 -19
  195. package/src/Redacted.ts +44 -30
  196. package/src/Ref.ts +14 -6
  197. package/src/RefCount.ts +38 -80
  198. package/src/Relation.ts +202 -10
  199. package/src/Resource.ts +1199 -591
  200. package/src/Result.ts +930 -271
  201. package/src/Schedule.ts +859 -343
  202. package/src/Set.ts +89 -40
  203. package/src/Sqlite.ts +144 -138
  204. package/src/StackTrace.ts +230 -0
  205. package/src/Store.ts +8 -7
  206. package/src/String.ts +22 -5
  207. package/src/Task.ts +5101 -2832
  208. package/src/Test.ts +20 -168
  209. package/src/Time.ts +293 -90
  210. package/src/Type.ts +10034 -4117
  211. package/src/Types.ts +227 -110
  212. package/src/WebSocket.ts +64 -36
  213. package/src/Worker.ts +180 -72
  214. package/src/index.ts +55 -52
  215. package/src/intl/cs.ts +388 -0
  216. package/src/intl/index.ts +7 -0
  217. package/src/local-first/Db.ts +152 -179
  218. package/src/local-first/Error.ts +4 -4
  219. package/src/local-first/Evolu.ts +495 -250
  220. package/src/local-first/LocalAuth.ts +6 -12
  221. package/src/local-first/Owner.ts +58 -21
  222. package/src/local-first/Protocol.ts +49 -31
  223. package/src/local-first/Query.ts +146 -61
  224. package/src/local-first/Relay.ts +51 -21
  225. package/src/local-first/Schema.ts +109 -51
  226. package/src/local-first/Shared.ts +266 -226
  227. package/src/local-first/Storage.ts +266 -264
  228. package/src/local-first/Timestamp.ts +25 -18
  229. package/src/local-first/index.ts +11 -11
  230. package/dist/src/Skiplist.d.ts +0 -28
  231. package/dist/src/Skiplist.d.ts.map +0 -1
  232. package/dist/src/Skiplist.js +0 -64
  233. package/dist/src/Tracer.d.ts +0 -48
  234. package/dist/src/Tracer.d.ts.map +0 -1
  235. package/dist/src/Tracer.js +0 -6
  236. package/src/Skiplist.ts +0 -108
  237. package/src/Tracer.ts +0 -54
package/src/Test.ts CHANGED
@@ -1,172 +1,21 @@
1
1
  /**
2
- * Test utilities for deterministic testing.
2
+ * Cross-module test utilities for deterministic testing.
3
+ *
4
+ * Test helpers are usually colocated with the code they test. Helpers that
5
+ * cannot be colocated because they would create dependency cycles belong here.
3
6
  *
4
7
  * @module
5
8
  */
6
9
 
7
- import type { Brand } from "./Brand.js";
8
- import {
9
- testCreateConsole,
10
- type TestConsole,
11
- type TestConsoleDep,
12
- } from "./Console.js";
13
- import { testCreateRandomBytes, type RandomBytes } from "./Crypto.js";
14
- import {
15
- testCreateRandom,
16
- testCreateRandomLib,
17
- type Random,
18
- type RandomLibDep,
19
- } from "./Random.js";
20
- import { createRun, type Run, type RunDeps } from "./Task.js";
21
- import {
22
- minMillis,
23
- setTimeout,
24
- testCreateTime,
25
- type Duration,
26
- type TestTime,
27
- type TestTimeDep,
28
- } from "./Time.js";
29
- import { createId, type Id } from "./Type.js";
10
+ import type { Brand } from "./Brand.ts";
11
+ import { testCreateRandomBytes } from "./Crypto.ts";
12
+ import { testCreateRandomLib } from "./Random.ts";
13
+ import { createId, type Id } from "./Type.ts";
30
14
 
31
15
  export type TestCreateId = <B extends string = never>() => [B] extends [never]
32
16
  ? Id
33
17
  : Id & Brand<B>;
34
18
 
35
- /**
36
- * Cheap deterministic baseline deps for tests.
37
- *
38
- * `TestDeps` includes test-friendly replacements for {@link RunDeps}, such as
39
- * {@link TestConsole} and {@link TestTime}, plus extra helpers commonly useful in
40
- * tests and fixtures, such as `randomLib` (only that for now).
41
- *
42
- * Use it directly for synchronous test setup, fixtures, and helpers. It is also
43
- * intentionally the base deps used by {@link testCreateRun}.
44
- */
45
- export type TestDeps = Omit<RunDeps, "console" | "time"> &
46
- TestConsoleDep &
47
- TestTimeDep &
48
- RandomLibDep;
49
-
50
- /**
51
- * Creates deterministic {@link TestDeps}.
52
- *
53
- * Each call creates fresh instances, so tests don't share state.
54
- *
55
- * Includes these deps:
56
- *
57
- * - `console`: {@link TestConsole}
58
- * - `random`: {@link Random}
59
- * - `randomLib`: seeded `random` package instance
60
- * - `randomBytes`: {@link RandomBytes}
61
- * - `time`: {@link TestTime}
62
- *
63
- * Use this for synchronous code that accepts deps directly. For tests that run
64
- * Tasks, use {@link testCreateRun}.
65
- *
66
- * ### Example
67
- *
68
- * ```ts
69
- * test("Callbacks with no argument", () => {
70
- * const deps = testCreateDeps();
71
- * const callbacks = createCallbacks(deps);
72
- *
73
- * let called = false;
74
- * const id = callbacks.register(() => {
75
- * called = true;
76
- * });
77
- *
78
- * callbacks.execute(id);
79
- * expect(called).toBe(true);
80
- * });
81
- * ```
82
- */
83
- export const testCreateDeps = (options?: {
84
- readonly seed?: string;
85
- }): TestDeps => {
86
- const seed = options?.seed ?? "evolu";
87
- const console = testCreateConsole();
88
- const random = testCreateRandom(seed);
89
- const randomLib = testCreateRandomLib(seed);
90
- const randomBytes = testCreateRandomBytes({ randomLib });
91
- const time = testCreateTime();
92
- return { console, randomBytes, random, randomLib, time };
93
- };
94
-
95
- /**
96
- * Creates a test {@link Run} with deterministic default deps or optional custom
97
- * deps.
98
- *
99
- * Use this as the default composition root in tests. Each call creates fresh
100
- * {@link TestDeps} via {@link testCreateDeps}, then merges any provided custom
101
- * deps.
102
- *
103
- * ### Example
104
- *
105
- * ```ts
106
- * // Built-in TestTime
107
- * await using run = testCreateRun();
108
- * const fiber = run(sleep("1s"));
109
- * run.deps.time.advance("1s");
110
- * await fiber;
111
- *
112
- * // For a single test, create the dependency using the Run.
113
- * await using run = testCreateRun();
114
- * await using foo = await run.orThrow(createFoo());
115
- * const runWithFoo = run.addDeps({ foo });
116
- *
117
- * expect(runWithFoo.deps.foo).toBe(foo);
118
- *
119
- * // If multiple tests need the same setup, create a disposable helper.
120
- * // Then `await using setup` disposes everything the helper owns.
121
- * const setupFoo = async () => {
122
- * await using disposer = new AsyncDisposableStack();
123
- * const run = disposer.use(testCreateRun());
124
- * const foo = disposer.use(await run.orThrow(createFoo()));
125
- * const disposables = disposer.move();
126
- *
127
- * // Return whatever the tests need: a Run with the dependency,
128
- * // the dependency itself, or both.
129
- * return {
130
- * run: run.addDeps({ foo }),
131
- * foo,
132
- * [Symbol.asyncDispose]: () => moved.disposeAsync(),
133
- * };
134
- * };
135
- *
136
- * await using setup = await setupFoo();
137
- * const { run, foo } = setup;
138
- * expect(run.deps.foo).toBe(foo);
139
- * ```
140
- *
141
- * Name reusable setup helpers after what they set up:
142
- *
143
- * - `setupFoo` for reusable test setup for `Foo`
144
- * - `testSetupFoo` when a library module exports the helper as part of its public
145
- * test API, e.g. `testSetupSqlite`.
146
- */
147
- export function testCreateRun(): Run<TestDeps>;
148
-
149
- /** With custom dependencies merged into {@link TestDeps}. */
150
- export function testCreateRun<D>(deps: D): Run<TestDeps & D>;
151
-
152
- export function testCreateRun<D>(deps?: D): Run<TestDeps & D> {
153
- const defaults = testCreateDeps();
154
- return createRun<TestDeps & D>({ ...defaults, ...deps } as TestDeps & D);
155
- }
156
-
157
- /**
158
- * Returns a Promise that resolves after a macrotask delay.
159
- *
160
- * Use this to model a real async boundary in a test double, for example an
161
- * async disposer that should not complete in the same turn.
162
- *
163
- * Avoid using it to coordinate assertions. Waiting for a macrotask tends to
164
- * make tests indirect and brittle.
165
- */
166
- export const testWaitForMacrotask = (
167
- duration: Duration = minMillis,
168
- ): Promise<void> => setTimeout(duration);
169
-
170
19
  /**
171
20
  * Creates a deterministic `createId` helper.
172
21
  *
@@ -182,13 +31,18 @@ export const testWaitForMacrotask = (
182
31
  * ### Example
183
32
  *
184
33
  * ```ts
185
- * test("creates stable ids", () => {
186
- * const createId = testCreateId();
34
+ * import { testCreateId, type Brand, type Id } from "@evolu/common";
35
+ *
36
+ * const createId = testCreateId();
37
+ *
38
+ * const callbackId = createId();
39
+ * const secondCallbackId = createId();
40
+ * const todoId = createId<"Todo">();
41
+ * expect(new Set([callbackId, secondCallbackId, todoId]).size).toBe(3);
187
42
  *
188
- * const callbackId = createId();
189
- * const secondCallbackId = createId();
190
- * const todoId = createId<"Todo">();
191
- * });
43
+ * const replayCreateId = testCreateId();
44
+ * expect(replayCreateId()).toBe(callbackId);
45
+ * expectTypeOf(todoId).toEqualTypeOf<Id & Brand<"Todo">>();
192
46
  * ```
193
47
  */
194
48
  export const testCreateId = (): TestCreateId => {
@@ -196,7 +50,5 @@ export const testCreateId = (): TestCreateId => {
196
50
  randomLib: testCreateRandomLib(),
197
51
  });
198
52
 
199
- return <B extends string = never>(): [B] extends [never]
200
- ? Id
201
- : Id & Brand<B> => createId<B>({ randomBytes });
53
+ return (() => createId<never>({ randomBytes })) as TestCreateId;
202
54
  };