@evolu/common 6.0.1-preview.2 → 6.0.1-preview.21

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 (154) hide show
  1. package/dist/src/Assert.d.ts +6 -3
  2. package/dist/src/Assert.d.ts.map +1 -1
  3. package/dist/src/Assert.js +7 -4
  4. package/dist/src/Brand.d.ts +75 -0
  5. package/dist/src/Brand.d.ts.map +1 -0
  6. package/dist/src/Brand.js +1 -0
  7. package/dist/src/Buffer.d.ts +1 -1
  8. package/dist/src/Buffer.d.ts.map +1 -1
  9. package/dist/src/Buffer.js +1 -1
  10. package/dist/src/CallbackRegistry.d.ts +53 -0
  11. package/dist/src/CallbackRegistry.d.ts.map +1 -0
  12. package/dist/src/CallbackRegistry.js +25 -0
  13. package/dist/src/Console.d.ts +31 -6
  14. package/dist/src/Console.d.ts.map +1 -1
  15. package/dist/src/Console.js +72 -9
  16. package/dist/src/Crypto.d.ts +61 -34
  17. package/dist/src/Crypto.d.ts.map +1 -1
  18. package/dist/src/Crypto.js +29 -42
  19. package/dist/src/Evolu/Db.d.ts +159 -66
  20. package/dist/src/Evolu/Db.d.ts.map +1 -1
  21. package/dist/src/Evolu/Db.js +300 -705
  22. package/dist/src/Evolu/Diff.d.ts +3 -3
  23. package/dist/src/Evolu/Diff.d.ts.map +1 -1
  24. package/dist/src/Evolu/Diff.js +7 -5
  25. package/dist/src/Evolu/Evolu.d.ts +200 -115
  26. package/dist/src/Evolu/Evolu.d.ts.map +1 -1
  27. package/dist/src/Evolu/Evolu.js +287 -157
  28. package/dist/src/Evolu/Internal.d.ts +0 -2
  29. package/dist/src/Evolu/Internal.d.ts.map +1 -1
  30. package/dist/src/Evolu/Internal.js +0 -2
  31. package/dist/src/Evolu/LocalAuth.d.ts +144 -0
  32. package/dist/src/Evolu/LocalAuth.d.ts.map +1 -0
  33. package/dist/src/Evolu/LocalAuth.js +171 -0
  34. package/dist/src/Evolu/Owner.d.ts +209 -124
  35. package/dist/src/Evolu/Owner.d.ts.map +1 -1
  36. package/dist/src/Evolu/Owner.js +118 -104
  37. package/dist/src/Evolu/Platform.d.ts +9 -7
  38. package/dist/src/Evolu/Platform.d.ts.map +1 -1
  39. package/dist/src/Evolu/Protocol.d.ts +256 -211
  40. package/dist/src/Evolu/Protocol.d.ts.map +1 -1
  41. package/dist/src/Evolu/Protocol.js +558 -359
  42. package/dist/src/Evolu/Public.d.ts +6 -8
  43. package/dist/src/Evolu/Public.d.ts.map +1 -1
  44. package/dist/src/Evolu/Public.js +2 -3
  45. package/dist/src/Evolu/PublicKysely.js +3 -3
  46. package/dist/src/Evolu/Query.d.ts +2 -1
  47. package/dist/src/Evolu/Query.d.ts.map +1 -1
  48. package/dist/src/Evolu/Relay.d.ts +72 -4
  49. package/dist/src/Evolu/Relay.d.ts.map +1 -1
  50. package/dist/src/Evolu/Relay.js +124 -13
  51. package/dist/src/Evolu/Schema.d.ts +129 -73
  52. package/dist/src/Evolu/Schema.d.ts.map +1 -1
  53. package/dist/src/Evolu/Schema.js +169 -89
  54. package/dist/src/Evolu/Storage.d.ts +159 -14
  55. package/dist/src/Evolu/Storage.d.ts.map +1 -1
  56. package/dist/src/Evolu/Storage.js +42 -32
  57. package/dist/src/Evolu/Sync.d.ts +68 -13
  58. package/dist/src/Evolu/Sync.d.ts.map +1 -1
  59. package/dist/src/Evolu/Sync.js +414 -20
  60. package/dist/src/Evolu/Timestamp.d.ts +35 -27
  61. package/dist/src/Evolu/Timestamp.d.ts.map +1 -1
  62. package/dist/src/Evolu/Timestamp.js +27 -18
  63. package/dist/src/ManyToManyMap.d.ts +74 -10
  64. package/dist/src/ManyToManyMap.d.ts.map +1 -1
  65. package/dist/src/ManyToManyMap.js +41 -6
  66. package/dist/src/Number.d.ts +2 -1
  67. package/dist/src/Number.d.ts.map +1 -1
  68. package/dist/src/Random.d.ts +3 -2
  69. package/dist/src/Random.d.ts.map +1 -1
  70. package/dist/src/RefCountedResourceManager.d.ts +119 -0
  71. package/dist/src/RefCountedResourceManager.d.ts.map +1 -0
  72. package/dist/src/RefCountedResourceManager.js +197 -0
  73. package/dist/src/Result.d.ts +176 -51
  74. package/dist/src/Result.d.ts.map +1 -1
  75. package/dist/src/Result.js +30 -241
  76. package/dist/src/Sqlite.d.ts +21 -4
  77. package/dist/src/Sqlite.d.ts.map +1 -1
  78. package/dist/src/Sqlite.js +50 -8
  79. package/dist/src/Task.d.ts +511 -0
  80. package/dist/src/Task.d.ts.map +1 -0
  81. package/dist/src/Task.js +410 -0
  82. package/dist/src/Time.d.ts +59 -0
  83. package/dist/src/Time.d.ts.map +1 -1
  84. package/dist/src/Time.js +87 -4
  85. package/dist/src/Type.d.ts +474 -327
  86. package/dist/src/Type.d.ts.map +1 -1
  87. package/dist/src/Type.js +502 -436
  88. package/dist/src/Types.d.ts +0 -74
  89. package/dist/src/Types.d.ts.map +1 -1
  90. package/dist/src/WebSocket.d.ts +5 -2
  91. package/dist/src/WebSocket.d.ts.map +1 -1
  92. package/dist/src/WebSocket.js +12 -13
  93. package/dist/src/Worker.d.ts +39 -11
  94. package/dist/src/Worker.d.ts.map +1 -1
  95. package/dist/src/Worker.js +22 -4
  96. package/dist/src/index.d.ts +3 -3
  97. package/dist/src/index.d.ts.map +1 -1
  98. package/dist/src/index.js +3 -3
  99. package/package.json +14 -13
  100. package/src/Assert.ts +8 -7
  101. package/src/Brand.ts +75 -0
  102. package/src/Buffer.ts +1 -1
  103. package/src/CallbackRegistry.ts +84 -0
  104. package/src/Console.ts +91 -11
  105. package/src/Crypto.ts +94 -79
  106. package/src/Evolu/Db.ts +528 -1027
  107. package/src/Evolu/Diff.ts +7 -5
  108. package/src/Evolu/Evolu.ts +682 -329
  109. package/src/Evolu/Internal.ts +0 -2
  110. package/src/Evolu/LocalAuth.ts +422 -0
  111. package/src/Evolu/Owner.ts +282 -227
  112. package/src/Evolu/Platform.ts +9 -9
  113. package/src/Evolu/Protocol.ts +788 -640
  114. package/src/Evolu/Public.ts +7 -14
  115. package/src/Evolu/PublicKysely.ts +3 -3
  116. package/src/Evolu/Query.ts +2 -1
  117. package/src/Evolu/Relay.ts +238 -18
  118. package/src/Evolu/Schema.ts +391 -191
  119. package/src/Evolu/Storage.ts +275 -55
  120. package/src/Evolu/Sync.ts +708 -37
  121. package/src/Evolu/Timestamp.ts +38 -35
  122. package/src/ManyToManyMap.ts +127 -24
  123. package/src/Number.ts +2 -6
  124. package/src/Random.ts +3 -2
  125. package/src/RefCountedResourceManager.ts +368 -0
  126. package/src/Result.ts +183 -53
  127. package/src/Sqlite.ts +59 -23
  128. package/src/Task.ts +779 -0
  129. package/src/Time.ts +168 -4
  130. package/src/Type.ts +708 -660
  131. package/src/Types.ts +0 -76
  132. package/src/WebSocket.ts +23 -17
  133. package/src/Worker.ts +72 -23
  134. package/src/index.ts +3 -3
  135. package/dist/src/Callbacks.d.ts +0 -20
  136. package/dist/src/Callbacks.d.ts.map +0 -1
  137. package/dist/src/Callbacks.js +0 -18
  138. package/dist/src/Evolu/Config.d.ts +0 -69
  139. package/dist/src/Evolu/Config.d.ts.map +0 -1
  140. package/dist/src/Evolu/Config.js +0 -9
  141. package/dist/src/Evolu/Kysely.d.ts +0 -6
  142. package/dist/src/Evolu/Kysely.d.ts.map +0 -1
  143. package/dist/src/Evolu/Kysely.js +0 -21
  144. package/dist/src/NanoId.d.ts +0 -27
  145. package/dist/src/NanoId.d.ts.map +0 -1
  146. package/dist/src/NanoId.js +0 -6
  147. package/dist/src/Promise.d.ts +0 -180
  148. package/dist/src/Promise.d.ts.map +0 -1
  149. package/dist/src/Promise.js +0 -176
  150. package/src/Callbacks.ts +0 -43
  151. package/src/Evolu/Config.ts +0 -83
  152. package/src/Evolu/Kysely.ts +0 -38
  153. package/src/NanoId.ts +0 -39
  154. package/src/Promise.ts +0 -295
package/src/Time.ts CHANGED
@@ -4,9 +4,12 @@
4
4
  * @module
5
5
  */
6
6
 
7
+ import { DateIso, NonNegativeInt } from "./Type.js";
8
+
7
9
  /** Retrieves the current time in milliseconds, similar to `Date.now()`. */
8
10
  export interface Time {
9
11
  readonly now: () => number;
12
+ readonly nowIso: () => DateIso;
10
13
  }
11
14
 
12
15
  export interface TimeDep {
@@ -14,9 +17,16 @@ export interface TimeDep {
14
17
  }
15
18
 
16
19
  /** Creates a {@link Time} using Date.now(). */
17
- export const createTime = (): Time => ({
18
- now: () => Date.now(),
19
- });
20
+ export const createTime = (): Time => {
21
+ const time: Time = {
22
+ now: () => {
23
+ const iso = time.nowIso();
24
+ return new globalThis.Date(iso).getTime();
25
+ },
26
+ nowIso: () => DateIso.orThrow(new globalThis.Date().toISOString()),
27
+ };
28
+ return time;
29
+ };
20
30
 
21
31
  /**
22
32
  * Creates a {@link Time} that returns a monotonically increasing number based on
@@ -24,7 +34,7 @@ export const createTime = (): Time => ({
24
34
  */
25
35
  export const createTestTime = (): Time => {
26
36
  let now = 0;
27
- return {
37
+ const time: Time = {
28
38
  now: () => {
29
39
  const current = now;
30
40
  queueMicrotask(() => {
@@ -32,5 +42,159 @@ export const createTestTime = (): Time => {
32
42
  });
33
43
  return current;
34
44
  },
45
+ nowIso: () =>
46
+ DateIso.orThrow(new globalThis.Date(time.now()).toISOString()),
35
47
  };
48
+ return time;
49
+ };
50
+
51
+ /** Single digit 0-9. Used internally for {@link DurationString} validation. */
52
+ export type D = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
53
+
54
+ /**
55
+ * Minutes and seconds 1-59. Used internally for {@link DurationString}
56
+ * validation. Uses single digits for 1-9, full numbers for 10-59.
57
+ */
58
+ export type MmSs =
59
+ | Exclude<D, "0"> // 1..9 (single digit)
60
+ | `1${D}` // 10..19
61
+ | `2${D}` // 20..29
62
+ | `3${D}` // 30..39
63
+ | `4${D}` // 40..49
64
+ | `5${D}`; // 50..59
65
+
66
+ /** Hours 1-23. Used internally for {@link DurationString} validation. */
67
+ export type Hours =
68
+ | Exclude<D, "0"> // 1-9
69
+ | `1${D}` // 10-19
70
+ | `2${"0" | "1" | "2" | "3"}`; // 20-23
71
+
72
+ /** Days 1-99. Used internally for {@link DurationString} validation. */
73
+ export type Days = Exclude<D, "0"> | `${Exclude<D, "0">}${D}`;
74
+
75
+ /**
76
+ * Template literal type for compile-time validated duration strings.
77
+ *
78
+ * Allowed patterns: basic units (ms, s, m, h, d) and logical combinations
79
+ * (s+ms, m+s, h+m, d+h).
80
+ *
81
+ * Supported formats:
82
+ *
83
+ * - Milliseconds: `0ms`, `1ms`, `500ms`, `999ms`
84
+ * - Seconds: `5s`, `30s` (1-59, single digit for 1-9)
85
+ * - Minutes: `5m`, `30m` (1-59, single digit for 1-9)
86
+ * - Hours: `1h`, `12h`, `23h` (1-23)
87
+ * - Days: `1d`, `30d`, `99d` (1-99)
88
+ * - Combinations: `1s 250ms`, `30m 15s`, `2h 45m`, `7d 12h`
89
+ *
90
+ * Note: Duration strings are for developer experience only - they provide
91
+ * readable, compile-time validated expressions but should never be persisted or
92
+ * parsed from users as they are not localized. Always convert to NonNegativeInt
93
+ * (milliseconds) for storage and APIs.
94
+ */
95
+ export type DurationString =
96
+ | `${D}ms`
97
+ | `${D}${D}ms`
98
+ | `${D}${D}${D}ms`
99
+ | `${MmSs}s`
100
+ | `${MmSs}m`
101
+ | `${Hours}h`
102
+ | `${Days}d`
103
+ | `${MmSs}s ${D}ms`
104
+ | `${MmSs}s ${D}${D}ms`
105
+ | `${MmSs}s ${D}${D}${D}ms`
106
+ | `${MmSs}m ${MmSs}s`
107
+ | `${Hours}h ${MmSs}m`
108
+ | `${Days}d ${Hours}h`;
109
+
110
+ /**
111
+ * Duration can be either a {@link DurationString} or milliseconds as
112
+ * {@link NonNegativeInt}.
113
+ */
114
+ export type Duration = DurationString | NonNegativeInt;
115
+
116
+ /**
117
+ * Converts a duration to milliseconds.
118
+ *
119
+ * Accepts either a {@link DurationString} (e.g., "5m", "1h 30m") or milliseconds
120
+ * as {@link NonNegativeInt}.
121
+ *
122
+ * ### Example
123
+ *
124
+ * ```ts
125
+ * durationToNonNegativeInt("0ms"); // 0 ✅
126
+ * durationToNonNegativeInt("500ms"); // 500 ✅
127
+ * durationToNonNegativeInt("30s"); // 30000 ✅
128
+ * durationToNonNegativeInt("5m"); // 300000 ✅
129
+ * durationToNonNegativeInt("12h"); // 43200000 ✅
130
+ * durationToNonNegativeInt("7d"); // 604800000 ✅
131
+ * durationToNonNegativeInt("2h 45m"); // 9900000 ✅
132
+ * durationToNonNegativeInt(5000); // 5000 ✅ (already milliseconds)
133
+ * ```
134
+ */
135
+ export const durationToNonNegativeInt = (
136
+ duration: Duration,
137
+ ): NonNegativeInt => {
138
+ // If it's already a NonNegativeInt (milliseconds), return as-is
139
+ if (typeof duration === "number") {
140
+ return duration;
141
+ }
142
+
143
+ // Parse duration string without regex to avoid ReDoS vulnerabilities
144
+ const units = {
145
+ ms: 1,
146
+ s: 1000,
147
+ m: 60000,
148
+ h: 3600000,
149
+ d: 86400000, // 24 * 60 * 60 * 1000
150
+ } as const;
151
+
152
+ let total = 0;
153
+ let i = 0;
154
+
155
+ while (i < duration.length) {
156
+ // Skip whitespace
157
+ while (i < duration.length && duration[i] === " ") {
158
+ i++;
159
+ }
160
+
161
+ if (i >= duration.length) break;
162
+
163
+ // Parse number
164
+ let numStr = "";
165
+ while (i < duration.length && duration[i] >= "0" && duration[i] <= "9") {
166
+ numStr += duration[i];
167
+ i++;
168
+ }
169
+
170
+ if (numStr === "") break;
171
+
172
+ // Parse unit (ms or single char s/m/h/d)
173
+ let unit = "";
174
+ if (i < duration.length) {
175
+ if (
176
+ duration[i] === "m" &&
177
+ i + 1 < duration.length &&
178
+ duration[i + 1] === "s"
179
+ ) {
180
+ unit = "ms";
181
+ i += 2;
182
+ } else if (
183
+ duration[i] === "s" ||
184
+ duration[i] === "m" ||
185
+ duration[i] === "h" ||
186
+ duration[i] === "d"
187
+ ) {
188
+ unit = duration[i];
189
+ i++;
190
+ }
191
+ }
192
+
193
+ if (unit === "") break;
194
+
195
+ const value = parseInt(numStr, 10);
196
+ total += value * units[unit as keyof typeof units];
197
+ }
198
+
199
+ return total as NonNegativeInt;
36
200
  };