@evolu/common 6.0.1-preview.19 → 6.0.1-preview.20

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 (140) hide show
  1. package/dist/src/Assert.d.ts.map +1 -1
  2. package/dist/src/Assert.js +1 -1
  3. package/dist/src/Buffer.d.ts +1 -1
  4. package/dist/src/Buffer.d.ts.map +1 -1
  5. package/dist/src/Buffer.js +1 -1
  6. package/dist/src/CallbackRegistry.d.ts +53 -0
  7. package/dist/src/CallbackRegistry.d.ts.map +1 -0
  8. package/dist/src/CallbackRegistry.js +25 -0
  9. package/dist/src/Console.d.ts +31 -6
  10. package/dist/src/Console.d.ts.map +1 -1
  11. package/dist/src/Console.js +72 -9
  12. package/dist/src/Crypto.d.ts +48 -37
  13. package/dist/src/Crypto.d.ts.map +1 -1
  14. package/dist/src/Crypto.js +27 -50
  15. package/dist/src/Evolu/Db.d.ts +138 -66
  16. package/dist/src/Evolu/Db.d.ts.map +1 -1
  17. package/dist/src/Evolu/Db.js +248 -645
  18. package/dist/src/Evolu/Diff.d.ts +3 -3
  19. package/dist/src/Evolu/Diff.d.ts.map +1 -1
  20. package/dist/src/Evolu/Diff.js +7 -5
  21. package/dist/src/Evolu/Evolu.d.ts +79 -116
  22. package/dist/src/Evolu/Evolu.d.ts.map +1 -1
  23. package/dist/src/Evolu/Evolu.js +275 -132
  24. package/dist/src/Evolu/Internal.d.ts +0 -2
  25. package/dist/src/Evolu/Internal.d.ts.map +1 -1
  26. package/dist/src/Evolu/Internal.js +0 -2
  27. package/dist/src/Evolu/LocalAuth.d.ts +144 -0
  28. package/dist/src/Evolu/LocalAuth.d.ts.map +1 -0
  29. package/dist/src/Evolu/LocalAuth.js +171 -0
  30. package/dist/src/Evolu/Owner.d.ts +129 -83
  31. package/dist/src/Evolu/Owner.d.ts.map +1 -1
  32. package/dist/src/Evolu/Owner.js +80 -89
  33. package/dist/src/Evolu/Platform.d.ts +9 -7
  34. package/dist/src/Evolu/Platform.d.ts.map +1 -1
  35. package/dist/src/Evolu/Protocol.d.ts +114 -191
  36. package/dist/src/Evolu/Protocol.d.ts.map +1 -1
  37. package/dist/src/Evolu/Protocol.js +409 -416
  38. package/dist/src/Evolu/Public.d.ts +6 -8
  39. package/dist/src/Evolu/Public.d.ts.map +1 -1
  40. package/dist/src/Evolu/Public.js +2 -3
  41. package/dist/src/Evolu/PublicKysely.js +3 -3
  42. package/dist/src/Evolu/Relay.d.ts +1 -2
  43. package/dist/src/Evolu/Relay.d.ts.map +1 -1
  44. package/dist/src/Evolu/Relay.js +11 -9
  45. package/dist/src/Evolu/Schema.d.ts +88 -27
  46. package/dist/src/Evolu/Schema.d.ts.map +1 -1
  47. package/dist/src/Evolu/Schema.js +141 -24
  48. package/dist/src/Evolu/Storage.d.ts +158 -14
  49. package/dist/src/Evolu/Storage.d.ts.map +1 -1
  50. package/dist/src/Evolu/Storage.js +32 -32
  51. package/dist/src/Evolu/Sync.d.ts +77 -13
  52. package/dist/src/Evolu/Sync.d.ts.map +1 -1
  53. package/dist/src/Evolu/Sync.js +453 -20
  54. package/dist/src/Evolu/Timestamp.d.ts +29 -27
  55. package/dist/src/Evolu/Timestamp.d.ts.map +1 -1
  56. package/dist/src/Evolu/Timestamp.js +20 -18
  57. package/dist/src/ManyToManyMap.d.ts +74 -10
  58. package/dist/src/ManyToManyMap.d.ts.map +1 -1
  59. package/dist/src/ManyToManyMap.js +41 -6
  60. package/dist/src/Random.d.ts +3 -2
  61. package/dist/src/Random.d.ts.map +1 -1
  62. package/dist/src/RefCountedResourceManager.d.ts +119 -0
  63. package/dist/src/RefCountedResourceManager.d.ts.map +1 -0
  64. package/dist/src/RefCountedResourceManager.js +197 -0
  65. package/dist/src/Result.d.ts +144 -22
  66. package/dist/src/Result.d.ts.map +1 -1
  67. package/dist/src/Result.js +5 -2
  68. package/dist/src/Sqlite.d.ts +20 -4
  69. package/dist/src/Sqlite.d.ts.map +1 -1
  70. package/dist/src/Sqlite.js +50 -8
  71. package/dist/src/Task.d.ts +511 -0
  72. package/dist/src/Task.d.ts.map +1 -0
  73. package/dist/src/Task.js +410 -0
  74. package/dist/src/Time.d.ts +59 -0
  75. package/dist/src/Time.d.ts.map +1 -1
  76. package/dist/src/Time.js +87 -4
  77. package/dist/src/Type.d.ts +431 -341
  78. package/dist/src/Type.d.ts.map +1 -1
  79. package/dist/src/Type.js +458 -466
  80. package/dist/src/WebSocket.d.ts +5 -2
  81. package/dist/src/WebSocket.d.ts.map +1 -1
  82. package/dist/src/WebSocket.js +12 -13
  83. package/dist/src/Worker.d.ts +39 -11
  84. package/dist/src/Worker.d.ts.map +1 -1
  85. package/dist/src/Worker.js +22 -4
  86. package/dist/src/index.d.ts +2 -3
  87. package/dist/src/index.d.ts.map +1 -1
  88. package/dist/src/index.js +2 -3
  89. package/package.json +7 -7
  90. package/src/Assert.ts +2 -4
  91. package/src/Buffer.ts +1 -1
  92. package/src/CallbackRegistry.ts +84 -0
  93. package/src/Console.ts +91 -11
  94. package/src/Crypto.ts +78 -91
  95. package/src/Evolu/Db.ts +455 -947
  96. package/src/Evolu/Diff.ts +7 -5
  97. package/src/Evolu/Evolu.ts +545 -307
  98. package/src/Evolu/Internal.ts +0 -2
  99. package/src/Evolu/LocalAuth.ts +422 -0
  100. package/src/Evolu/Owner.ts +191 -131
  101. package/src/Evolu/Platform.ts +9 -9
  102. package/src/Evolu/Protocol.ts +536 -653
  103. package/src/Evolu/Public.ts +7 -9
  104. package/src/Evolu/PublicKysely.ts +3 -3
  105. package/src/Evolu/Relay.ts +17 -12
  106. package/src/Evolu/Schema.ts +271 -66
  107. package/src/Evolu/Storage.ts +263 -55
  108. package/src/Evolu/Sync.ts +758 -37
  109. package/src/Evolu/Timestamp.ts +30 -35
  110. package/src/ManyToManyMap.ts +127 -24
  111. package/src/Random.ts +3 -2
  112. package/src/RefCountedResourceManager.ts +368 -0
  113. package/src/Result.ts +149 -23
  114. package/src/Sqlite.ts +59 -24
  115. package/src/Task.ts +779 -0
  116. package/src/Time.ts +168 -4
  117. package/src/Type.ts +657 -695
  118. package/src/WebSocket.ts +23 -17
  119. package/src/Worker.ts +72 -23
  120. package/src/index.ts +2 -3
  121. package/dist/src/Callbacks.d.ts +0 -20
  122. package/dist/src/Callbacks.d.ts.map +0 -1
  123. package/dist/src/Callbacks.js +0 -18
  124. package/dist/src/Evolu/Config.d.ts +0 -82
  125. package/dist/src/Evolu/Config.d.ts.map +0 -1
  126. package/dist/src/Evolu/Config.js +0 -9
  127. package/dist/src/Evolu/Kysely.d.ts +0 -6
  128. package/dist/src/Evolu/Kysely.d.ts.map +0 -1
  129. package/dist/src/Evolu/Kysely.js +0 -21
  130. package/dist/src/NanoId.d.ts +0 -27
  131. package/dist/src/NanoId.d.ts.map +0 -1
  132. package/dist/src/NanoId.js +0 -6
  133. package/dist/src/Promise.d.ts +0 -180
  134. package/dist/src/Promise.d.ts.map +0 -1
  135. package/dist/src/Promise.js +0 -176
  136. package/src/Callbacks.ts +0 -43
  137. package/src/Evolu/Config.ts +0 -97
  138. package/src/Evolu/Kysely.ts +0 -38
  139. package/src/NanoId.ts +0 -39
  140. package/src/Promise.ts +0 -295
package/src/Sqlite.ts CHANGED
@@ -1,18 +1,10 @@
1
+ import { Brand } from "./Brand.js";
1
2
  import { ConsoleDep } from "./Console.js";
3
+ import { EncryptionKey } from "./Crypto.js";
2
4
  import { createTransferableError, TransferableError } from "./Error.js";
3
5
  import { err, ok, Result, tryAsync, trySync } from "./Result.js";
4
- import {
5
- Boolean,
6
- Null,
7
- Number,
8
- SimpleName,
9
- String,
10
- transform,
11
- Uint8Array,
12
- union,
13
- } from "./Type.js";
14
- import { Predicate, IntentionalNever } from "./Types.js";
15
- import { Brand } from "./Brand.js";
6
+ import { Null, Number, SimpleName, String, Uint8Array, union } from "./Type.js";
7
+ import { IntentionalNever, Predicate } from "./Types.js";
16
8
 
17
9
  /**
18
10
  * SQLite driver interface. This is the minimal interface that platform-specific
@@ -34,6 +26,7 @@ export interface CreateSqliteDriverDep {
34
26
 
35
27
  export interface SqliteDriverOptions {
36
28
  memory?: boolean;
29
+ encryptionKey?: EncryptionKey | undefined;
37
30
  }
38
31
 
39
32
  /**
@@ -149,13 +142,13 @@ export const createSqlite =
149
142
  exec: (query) =>
150
143
  trySync(
151
144
  () => {
152
- deps.console?.log("[sql]", query);
145
+ deps.console?.log("[sql]", { query });
153
146
 
154
147
  const result = maybeLogSqliteQueryExecutionTime(query, () =>
155
148
  driver.exec(query, isSqlMutation(query.sql)),
156
149
  );
157
150
 
158
- deps.console?.log("[sql]", result);
151
+ deps.console?.log("[sql]", { result });
159
152
 
160
153
  return result as IntentionalNever;
161
154
  },
@@ -367,8 +360,38 @@ const isSqlMutationRegEx = new RegExp(
367
360
  "i",
368
361
  );
369
362
 
363
+ /**
364
+ * Removes SQL line comments (--) from a SQL string without using regex to avoid
365
+ * ReDoS vulnerabilities.
366
+ */
367
+ const removeSqlComments = (sql: string): string => {
368
+ let result = "";
369
+ let i = 0;
370
+
371
+ while (i < sql.length) {
372
+ // Check for comment start
373
+ if (i < sql.length - 1 && sql[i] === "-" && sql[i + 1] === "-") {
374
+ // Skip until end of line or end of string
375
+ i += 2;
376
+ while (i < sql.length && sql[i] !== "\n") {
377
+ i++;
378
+ }
379
+ // Keep the newline if present
380
+ if (i < sql.length && sql[i] === "\n") {
381
+ result += "\n";
382
+ i++;
383
+ }
384
+ } else {
385
+ result += sql[i];
386
+ i++;
387
+ }
388
+ }
389
+
390
+ return result;
391
+ };
392
+
370
393
  export const isSqlMutation: Predicate<string> = (sql) =>
371
- isSqlMutationRegEx.test(sql.replace(/--.*$/gm, ""));
394
+ isSqlMutationRegEx.test(removeSqlComments(sql));
372
395
 
373
396
  export interface SqliteQueryPlanRow {
374
397
  id: number;
@@ -386,13 +409,14 @@ export const explainSqliteQueryPlan =
386
409
  if (!result.ok) return result;
387
410
 
388
411
  // eslint-disable-next-line no-console
389
- console.log("ExplainQueryPlan", query);
412
+ console.log("[explainSqliteQueryPlan]", query);
390
413
  // eslint-disable-next-line no-console
391
414
  console.log(
392
415
  drawSqliteQueryPlan(
393
416
  result.value.rows as unknown as Array<SqliteQueryPlanRow>,
394
417
  ),
395
418
  );
419
+
396
420
  return ok();
397
421
  };
398
422
 
@@ -416,15 +440,26 @@ const drawSqliteQueryPlan = (rows: Array<SqliteQueryPlanRow>): string =>
416
440
 
417
441
  /**
418
442
  * SQLite represents boolean values using `0` (false) and `1` (true) instead of
419
- * a dedicated boolean type. This transform Type ensures that values conform to
420
- * SQLite's boolean representation.
443
+ * a dedicated boolean type.
444
+ *
445
+ * Use {@link sqliteTrue} and {@link sqliteFalse} constants for better
446
+ * readability.
421
447
  *
422
448
  * See: https://www.sqlite.org/quirks.html#no_separate_boolean_datatype
423
449
  */
424
- export const SqliteBoolean = transform(
425
- Boolean,
426
- union(0, 1),
427
- (value) => ok(value ? (1 as const) : (0 as const)),
428
- (value) => value === 1,
429
- );
450
+ export const SqliteBoolean = union(0, 1);
430
451
  export type SqliteBoolean = typeof SqliteBoolean.Type;
452
+
453
+ /**
454
+ * Represents the {@link SqliteBoolean} value for `true`.
455
+ *
456
+ * See {@link SqliteBoolean}.
457
+ */
458
+ export const sqliteTrue = 1;
459
+
460
+ /**
461
+ * Represents the {@link SqliteBoolean} value for `false`.
462
+ *
463
+ * See {@link SqliteBoolean}.
464
+ */
465
+ export const sqliteFalse = 0;