@evolu/common 7.4.0 → 8.0.0-next.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 (251) hide show
  1. package/README.md +4 -61
  2. package/dist/src/Array.d.ts +343 -102
  3. package/dist/src/Array.d.ts.map +1 -1
  4. package/dist/src/Array.js +181 -85
  5. package/dist/src/Assert.d.ts +57 -11
  6. package/dist/src/Assert.d.ts.map +1 -1
  7. package/dist/src/Assert.js +47 -11
  8. package/dist/src/BigInt.d.ts +6 -1
  9. package/dist/src/BigInt.d.ts.map +1 -1
  10. package/dist/src/BigInt.js +5 -0
  11. package/dist/src/Brand.d.ts +40 -12
  12. package/dist/src/Brand.d.ts.map +1 -1
  13. package/dist/src/Brand.js +5 -0
  14. package/dist/src/Buffer.d.ts +6 -1
  15. package/dist/src/Buffer.d.ts.map +1 -1
  16. package/dist/src/Buffer.js +7 -2
  17. package/dist/src/Cache.d.ts +10 -2
  18. package/dist/src/Cache.d.ts.map +1 -1
  19. package/dist/src/Cache.js +6 -0
  20. package/dist/src/Callbacks.d.ts +10 -7
  21. package/dist/src/Callbacks.d.ts.map +1 -1
  22. package/dist/src/Callbacks.js +23 -13
  23. package/dist/src/Console.d.ts +361 -69
  24. package/dist/src/Console.d.ts.map +1 -1
  25. package/dist/src/Console.js +217 -117
  26. package/dist/src/Crypto.d.ts +70 -21
  27. package/dist/src/Crypto.d.ts.map +1 -1
  28. package/dist/src/Crypto.js +72 -27
  29. package/dist/src/Eq.d.ts +22 -2
  30. package/dist/src/Eq.d.ts.map +1 -1
  31. package/dist/src/Eq.js +21 -1
  32. package/dist/src/Error.d.ts +23 -12
  33. package/dist/src/Error.d.ts.map +1 -1
  34. package/dist/src/Error.js +27 -11
  35. package/dist/src/Function.d.ts +128 -56
  36. package/dist/src/Function.d.ts.map +1 -1
  37. package/dist/src/Function.js +118 -14
  38. package/dist/src/Identicon.d.ts +5 -0
  39. package/dist/src/Identicon.d.ts.map +1 -1
  40. package/dist/src/Identicon.js +6 -1
  41. package/dist/src/Lookup.d.ts +160 -0
  42. package/dist/src/Lookup.d.ts.map +1 -0
  43. package/dist/src/Lookup.js +192 -0
  44. package/dist/src/Microtask.d.ts +21 -0
  45. package/dist/src/Microtask.d.ts.map +1 -0
  46. package/dist/src/Microtask.js +37 -0
  47. package/dist/src/Number.d.ts +18 -4
  48. package/dist/src/Number.d.ts.map +1 -1
  49. package/dist/src/Number.js +23 -1
  50. package/dist/src/Object.d.ts +110 -5
  51. package/dist/src/Object.d.ts.map +1 -1
  52. package/dist/src/Object.js +108 -5
  53. package/dist/src/Option.d.ts +58 -0
  54. package/dist/src/Option.d.ts.map +1 -0
  55. package/dist/src/Option.js +43 -0
  56. package/dist/src/Order.d.ts +5 -0
  57. package/dist/src/Order.d.ts.map +1 -1
  58. package/dist/src/Order.js +8 -3
  59. package/dist/src/Platform.d.ts +36 -2
  60. package/dist/src/Platform.d.ts.map +1 -1
  61. package/dist/src/Platform.js +10 -6
  62. package/dist/src/Polyfills.d.ts +27 -0
  63. package/dist/src/Polyfills.d.ts.map +1 -0
  64. package/dist/src/Polyfills.js +299 -0
  65. package/dist/src/Random.d.ts +18 -7
  66. package/dist/src/Random.d.ts.map +1 -1
  67. package/dist/src/Random.js +9 -7
  68. package/dist/src/Redacted.d.ts +7 -4
  69. package/dist/src/Redacted.d.ts.map +1 -1
  70. package/dist/src/Redacted.js +5 -0
  71. package/dist/src/Ref.d.ts +31 -16
  72. package/dist/src/Ref.d.ts.map +1 -1
  73. package/dist/src/Ref.js +35 -7
  74. package/dist/src/RefCount.d.ts +62 -0
  75. package/dist/src/RefCount.d.ts.map +1 -0
  76. package/dist/src/RefCount.js +83 -0
  77. package/dist/src/Relation.d.ts +84 -29
  78. package/dist/src/Relation.d.ts.map +1 -1
  79. package/dist/src/Relation.js +83 -105
  80. package/dist/src/Resource.d.ts +263 -0
  81. package/dist/src/Resource.d.ts.map +1 -0
  82. package/dist/src/Resource.js +389 -0
  83. package/dist/src/Result.d.ts +390 -374
  84. package/dist/src/Result.d.ts.map +1 -1
  85. package/dist/src/Result.js +142 -70
  86. package/dist/src/Schedule.d.ts +953 -0
  87. package/dist/src/Schedule.d.ts.map +1 -0
  88. package/dist/src/Schedule.js +1199 -0
  89. package/dist/src/Set.d.ts +181 -0
  90. package/dist/src/Set.d.ts.map +1 -0
  91. package/dist/src/Set.js +137 -0
  92. package/dist/src/Skiplist.d.ts +6 -1
  93. package/dist/src/Skiplist.d.ts.map +1 -1
  94. package/dist/src/Skiplist.js +5 -0
  95. package/dist/src/Sqlite.d.ts +160 -60
  96. package/dist/src/Sqlite.d.ts.map +1 -1
  97. package/dist/src/Sqlite.js +290 -190
  98. package/dist/src/Store.d.ts +36 -28
  99. package/dist/src/Store.d.ts.map +1 -1
  100. package/dist/src/Store.js +55 -15
  101. package/dist/src/String.d.ts +5 -0
  102. package/dist/src/String.d.ts.map +1 -1
  103. package/dist/src/String.js +5 -0
  104. package/dist/src/Task.d.ts +2263 -423
  105. package/dist/src/Task.d.ts.map +1 -1
  106. package/dist/src/Task.js +1488 -348
  107. package/dist/src/Test.d.ts +122 -0
  108. package/dist/src/Test.d.ts.map +1 -0
  109. package/dist/src/Test.js +66 -0
  110. package/dist/src/Time.d.ts +201 -48
  111. package/dist/src/Time.d.ts.map +1 -1
  112. package/dist/src/Time.js +190 -86
  113. package/dist/src/Tracer.d.ts +48 -0
  114. package/dist/src/Tracer.d.ts.map +1 -0
  115. package/dist/src/Tracer.js +6 -0
  116. package/dist/src/Type.d.ts +582 -209
  117. package/dist/src/Type.d.ts.map +1 -1
  118. package/dist/src/Type.js +362 -240
  119. package/dist/src/Types.d.ts +160 -6
  120. package/dist/src/Types.d.ts.map +1 -1
  121. package/dist/src/Types.js +22 -2
  122. package/dist/src/WebSocket.d.ts +113 -58
  123. package/dist/src/WebSocket.d.ts.map +1 -1
  124. package/dist/src/WebSocket.js +210 -118
  125. package/dist/src/Worker.d.ts +245 -60
  126. package/dist/src/Worker.d.ts.map +1 -1
  127. package/dist/src/Worker.js +220 -64
  128. package/dist/src/index.d.ts +25 -3
  129. package/dist/src/index.d.ts.map +1 -1
  130. package/dist/src/index.js +19 -3
  131. package/dist/src/local-first/Db.d.ts +24 -213
  132. package/dist/src/local-first/Db.d.ts.map +1 -1
  133. package/dist/src/local-first/Db.js +622 -293
  134. package/dist/src/local-first/Error.d.ts +12 -0
  135. package/dist/src/local-first/Error.d.ts.map +1 -0
  136. package/dist/src/local-first/Error.js +6 -0
  137. package/dist/src/local-first/Evolu.d.ts +330 -285
  138. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  139. package/dist/src/local-first/Evolu.js +472 -402
  140. package/dist/src/local-first/LocalAuth.d.ts +10 -10
  141. package/dist/src/local-first/LocalAuth.d.ts.map +1 -1
  142. package/dist/src/local-first/LocalAuth.js +6 -1
  143. package/dist/src/local-first/Owner.d.ts +70 -27
  144. package/dist/src/local-first/Owner.d.ts.map +1 -1
  145. package/dist/src/local-first/Owner.js +27 -14
  146. package/dist/src/local-first/Protocol.d.ts +58 -50
  147. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  148. package/dist/src/local-first/Protocol.js +253 -155
  149. package/dist/src/local-first/Query.d.ts +133 -43
  150. package/dist/src/local-first/Query.d.ts.map +1 -1
  151. package/dist/src/local-first/Query.js +139 -90
  152. package/dist/src/local-first/Relay.d.ts +18 -38
  153. package/dist/src/local-first/Relay.d.ts.map +1 -1
  154. package/dist/src/local-first/Relay.js +59 -171
  155. package/dist/src/local-first/Schema.d.ts +139 -144
  156. package/dist/src/local-first/Schema.d.ts.map +1 -1
  157. package/dist/src/local-first/Schema.js +78 -163
  158. package/dist/src/local-first/Shared.d.ts +125 -0
  159. package/dist/src/local-first/Shared.d.ts.map +1 -0
  160. package/dist/src/local-first/Shared.js +569 -0
  161. package/dist/src/local-first/Storage.d.ts +50 -53
  162. package/dist/src/local-first/Storage.d.ts.map +1 -1
  163. package/dist/src/local-first/Storage.js +121 -173
  164. package/dist/src/local-first/Timestamp.d.ts +28 -35
  165. package/dist/src/local-first/Timestamp.d.ts.map +1 -1
  166. package/dist/src/local-first/Timestamp.js +24 -25
  167. package/dist/src/local-first/index.d.ts +2 -15
  168. package/dist/src/local-first/index.d.ts.map +1 -1
  169. package/dist/src/local-first/index.js +2 -15
  170. package/package.json +36 -26
  171. package/src/Array.ts +467 -106
  172. package/src/Assert.ts +87 -12
  173. package/src/BigInt.ts +7 -1
  174. package/src/Brand.ts +41 -12
  175. package/src/Buffer.ts +10 -4
  176. package/src/Cache.ts +11 -2
  177. package/src/Callbacks.ts +33 -23
  178. package/src/Console.ts +567 -178
  179. package/src/Crypto.ts +111 -62
  180. package/src/Eq.ts +30 -3
  181. package/src/Error.ts +50 -34
  182. package/src/Function.ts +140 -68
  183. package/src/Identicon.ts +7 -1
  184. package/src/Lookup.ts +415 -0
  185. package/src/Microtask.ts +58 -0
  186. package/src/Number.ts +40 -7
  187. package/src/Object.ts +155 -16
  188. package/src/Option.ts +74 -0
  189. package/src/Order.ts +11 -3
  190. package/src/Platform.ts +43 -7
  191. package/src/Polyfills.ts +465 -0
  192. package/src/Random.ts +25 -11
  193. package/src/Redacted.ts +8 -4
  194. package/src/Ref.ts +72 -21
  195. package/src/RefCount.ts +170 -0
  196. package/src/Relation.ts +188 -136
  197. package/src/Resource.ts +864 -0
  198. package/src/Result.ts +548 -381
  199. package/src/Schedule.ts +1471 -0
  200. package/src/Set.ts +247 -0
  201. package/src/Skiplist.ts +7 -1
  202. package/src/Sqlite.ts +409 -304
  203. package/src/Store.ts +94 -48
  204. package/src/String.ts +6 -0
  205. package/src/Task.ts +3685 -740
  206. package/src/Test.ts +162 -0
  207. package/src/Time.ts +348 -145
  208. package/src/Tracer.ts +54 -0
  209. package/src/Type.ts +1064 -630
  210. package/src/Types.ts +202 -7
  211. package/src/WebSocket.ts +311 -178
  212. package/src/Worker.ts +527 -147
  213. package/src/index.ts +74 -3
  214. package/src/local-first/Db.ts +871 -597
  215. package/src/local-first/Error.ts +17 -0
  216. package/src/local-first/Evolu.ts +884 -823
  217. package/src/local-first/LocalAuth.ts +10 -10
  218. package/src/local-first/Owner.ts +94 -42
  219. package/src/local-first/Protocol.ts +440 -303
  220. package/src/local-first/Query.ts +243 -194
  221. package/src/local-first/Relay.ts +91 -252
  222. package/src/local-first/Schema.ts +284 -394
  223. package/src/local-first/Shared.ts +932 -0
  224. package/src/local-first/Storage.ts +209 -282
  225. package/src/local-first/Timestamp.ts +38 -45
  226. package/src/local-first/index.ts +2 -16
  227. package/LICENSE +0 -21
  228. package/dist/src/Instances.d.ts +0 -34
  229. package/dist/src/Instances.d.ts.map +0 -1
  230. package/dist/src/Instances.js +0 -44
  231. package/dist/src/Resources.d.ts +0 -118
  232. package/dist/src/Resources.d.ts.map +0 -1
  233. package/dist/src/Resources.js +0 -197
  234. package/dist/src/local-first/Platform.d.ts +0 -25
  235. package/dist/src/local-first/Platform.d.ts.map +0 -1
  236. package/dist/src/local-first/Platform.js +0 -1
  237. package/dist/src/local-first/Public.d.ts +0 -22
  238. package/dist/src/local-first/Public.d.ts.map +0 -1
  239. package/dist/src/local-first/Public.js +0 -15
  240. package/dist/src/local-first/PublicKysely.d.ts +0 -148
  241. package/dist/src/local-first/PublicKysely.d.ts.map +0 -1
  242. package/dist/src/local-first/PublicKysely.js +0 -184
  243. package/dist/src/local-first/Sync.d.ts +0 -112
  244. package/dist/src/local-first/Sync.d.ts.map +0 -1
  245. package/dist/src/local-first/Sync.js +0 -529
  246. package/src/Instances.ts +0 -90
  247. package/src/Resources.ts +0 -367
  248. package/src/local-first/Platform.ts +0 -27
  249. package/src/local-first/Public.ts +0 -42
  250. package/src/local-first/PublicKysely.ts +0 -239
  251. package/src/local-first/Sync.ts +0 -960
@@ -1 +1 @@
1
- {"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAiB,MAAM,SAAS,CAAC;AAC5C,OAAO,EAA2B,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAW,MAAM,EAAqB,MAAM,aAAa,CAAC;AACjE,OAAO,EAIL,UAAU,EAIX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAoB,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,KAAK,gBAAgB,CAAC;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,UAAU,CAAC;CACnC;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,mBAAmB,KAC1B,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CACpD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,MAAO,SAAQ,UAAU;IACxC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAC7C,KAAK,EAAE,WAAW,KACf,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAE9C;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EACzB,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,KACvC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;IAEhC,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC;CACvC;AAED,kDAAkD;AAClD,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,wlBAA0C,CAAC;AACnE,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAC;AAElD,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,WAAW,CAQzC,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEzC;;;;;;OAMG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAEvC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC/D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC;CAC5C;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,YAAY,GACtB,MAAM,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,MAEhD,MAAM,UAAU,EAChB,UAAU,mBAAmB,KAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA+Ff,CAAC;AAyB1B,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,UAAU;IACvD,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,aAAa,CAAC,EAAE,CAAC,KACd,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;CACpC;AAED,eAAO,MAAM,6BAA6B,GAAI,CAAC,EAC7C,SAAS,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,EAC5B,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,IAAI,KAChC,kBAAkB,CAAC,CAAC,CAuBtB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,GAAG;cACL,oBAAoB,iBACd,KAAK,CAAC,gBAAgB,CAAC,GACrC,WAAW;2BAoBgB,MAAM,GAAG,aAAa;aAcpC,MAAM,GAAG,MAAM;sBAGpB,oBAAoB,iBACd,KAAK,CAAC,gBAAgB,CAAC,GACrC,WAAW;CArBb,CAAC;AA0BF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,CAAC,MAAM,CAa3C,CAAC;AAyDF,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,sBAAsB,GAChC,MAAM,SAAS,MACf,OAAO,WAAW,KAAG,MAAM,CAAC,IAAI,EAAE,WAAW,CAiB7C,CAAC;AAoBJ;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,yGAAc,CAAC;AACzC,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B;;;;GAIG;AACH,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,aACtB,CAAC;AAEnC;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,aAAa,KAAG,OACxC,CAAC"}
1
+ {"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
@@ -1,112 +1,231 @@
1
- import { createLruCache } from "./Cache.js";
2
- import { eqArrayNumber } from "./Eq.js";
3
- import { createTransferableError } from "./Error.js";
4
- import { err, ok, tryAsync, trySync } from "./Result.js";
5
- import { Null, Number, PositiveInt, String, Uint8Array, union, } from "./Type.js";
6
1
  /**
7
- * A value that can be stored in Sqlite.
2
+ * SQLite database abstraction and query execution.
3
+ *
4
+ * @module
5
+ */
6
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
7
+ if (value !== null && value !== void 0) {
8
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
9
+ var dispose, inner;
10
+ if (async) {
11
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
12
+ dispose = value[Symbol.asyncDispose];
13
+ }
14
+ if (dispose === void 0) {
15
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
16
+ dispose = value[Symbol.dispose];
17
+ if (async) inner = dispose;
18
+ }
19
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
20
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
21
+ env.stack.push({ value: value, dispose: dispose, async: async });
22
+ }
23
+ else if (async) {
24
+ env.stack.push({ async: true });
25
+ }
26
+ return value;
27
+ };
28
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
29
+ return function (env) {
30
+ function fail(e) {
31
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
32
+ env.hasError = true;
33
+ }
34
+ var r, s = 0;
35
+ function next() {
36
+ while (r = env.stack.pop()) {
37
+ try {
38
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
39
+ if (r.dispose) {
40
+ var result = r.dispose.call(r.value);
41
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
42
+ }
43
+ else s |= 1;
44
+ }
45
+ catch (e) {
46
+ fail(e);
47
+ }
48
+ }
49
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
50
+ if (env.hasError) throw env.error;
51
+ }
52
+ return next();
53
+ };
54
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
55
+ var e = new Error(message);
56
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
57
+ });
58
+ import { assertNotDisposed } from "./Assert.js";
59
+ import { bytesToHex, hexToBytes } from "./Buffer.js";
60
+ import { createEqObject, eqArrayNumber, eqString } from "./Eq.js";
61
+ import { createRecord, objectToEntries } from "./Object.js";
62
+ import { ok } from "./Result.js";
63
+ import { testCreateRun } from "./Test.js";
64
+ import { array, Null, Number, object, record, set, String, testName, Uint8Array, union, } from "./Type.js";
65
+ /**
66
+ * A value that can be stored in {@link Sqlite}.
8
67
  *
9
68
  * Note that Evolu can't support Int64 because expo-sqlite (and some others) do
10
69
  * not support it.
11
70
  */
12
- export const SqliteValue = union(Null, String, Number, Uint8Array);
13
- export const eqSqliteValue = (x, y) => {
14
- if (x instanceof globalThis.Uint8Array &&
15
- y instanceof globalThis.Uint8Array) {
16
- return eqArrayNumber(x, y);
17
- }
18
- return x === y;
71
+ export const SqliteValue = /*#__PURE__*/ union(Null, String, Number, Uint8Array);
72
+ /** Equality comparison for {@link SqliteValue}. */
73
+ export const eqSqliteValue = (x, y) => Uint8Array.is(x) && Uint8Array.is(y) ? eqArrayNumber(x, y) : x === y;
74
+ /** Converts a {@link SqliteQuery} into a stable {@link SqliteQueryString}. */
75
+ export const sqliteQueryToSqliteQueryString = (query) => {
76
+ const params = query.parameters.map((value) => value instanceof globalThis.Uint8Array
77
+ ? ["b", bytesToHex(value)]
78
+ : ["j", value]);
79
+ const options = query.options
80
+ ? objectToEntries(query.options).toSorted(([a], [b]) => a.localeCompare(b))
81
+ : [];
82
+ return JSON.stringify([query.sql, params, options]);
83
+ };
84
+ /** Converts a {@link SqliteQueryString} back into a {@link SqliteQuery}. */
85
+ export const sqliteQueryStringToSqliteQuery = (query) => {
86
+ const [sql, paramsArr, optionsArr] = JSON.parse(query);
87
+ const parameters = paramsArr.map(([type, value]) => type === "b" ? hexToBytes(value) : value);
88
+ const options = optionsArr.length
89
+ ? Object.fromEntries(optionsArr)
90
+ : undefined;
91
+ return {
92
+ sql,
93
+ parameters,
94
+ ...(options !== undefined && { options }),
95
+ };
19
96
  };
20
97
  /**
21
- * Creates a fully featured {@link Sqlite} instance from a {@link SqliteDriver}
22
- * implementation.
98
+ * Creates a {@link Sqlite} instance backed by a platform-specific driver.
99
+ *
100
+ * The driver is created via {@link CreateSqliteDriver} and wrapped with logging,
101
+ * error handling, and transaction helpers.
23
102
  */
24
- export const createSqlite = (deps) => async (name, options) => tryAsync(async () => {
25
- const driver = await deps.createSqliteDriver(name, options);
26
- let isDisposed = false;
27
- const doRollback = () => trySync(() => {
28
- deps.console?.log("[sql] rollback");
29
- driver.exec(sql `rollback;`, true);
30
- }, createSqliteError);
31
- const sqlite = {
32
- exec: (query) => trySync(() => {
33
- deps.console?.log("[sql]", { query });
34
- const result = maybeLogSqliteQueryExecutionTime(query, () => driver.exec(query, isSqlMutation(query.sql)));
35
- deps.console?.log("[sql]", { result });
36
- return result;
37
- }, (error) => ({
38
- type: "SqliteError",
39
- error: createTransferableError(error),
40
- })),
41
- transaction: (callback) => {
42
- const transactionResult = trySync(() => {
43
- deps.console?.log("[sql] begin");
44
- driver.exec(sql `begin;`, true);
45
- const result = callback();
46
- if (!result.ok)
47
- return result;
48
- deps.console?.log("[sql] commit");
49
- driver.exec(sql `commit;`, true);
50
- return result;
51
- }, createSqliteError);
52
- // There was an SqliteError during begin, callback, or commit
53
- if (!transactionResult.ok) {
54
- const rollback = doRollback();
55
- if (!rollback.ok) {
56
- deps.console?.log("[sql] rollback failed", rollback.error);
57
- return err({
58
- type: "SqliteError",
59
- error: transactionResult.error.error,
60
- rollbackError: rollback.error.error,
103
+ export const createSqlite = (name, options) => async (run) => {
104
+ const env_1 = { stack: [], error: void 0, hasError: false };
105
+ try {
106
+ const { createSqliteDriver } = run.deps;
107
+ const console = run.deps.console.child("sql");
108
+ const stack = __addDisposableResource(env_1, new AsyncDisposableStack(), true);
109
+ const driverResult = await run(createSqliteDriver(name, options));
110
+ if (!driverResult.ok)
111
+ return driverResult;
112
+ const driver = stack.use(driverResult.value);
113
+ console.debug("SQLite driver created");
114
+ const moved = stack.move();
115
+ const sqlite = {
116
+ exec: (query) => {
117
+ assertNotDisposed(moved);
118
+ console.debug({ query });
119
+ const label = query.options?.logQueryExecutionTime &&
120
+ `SqliteQueryExecutionTime ${query.sql}`;
121
+ if (label)
122
+ console.time(label);
123
+ const result = driver.exec(query);
124
+ if (label)
125
+ console.timeEnd(label);
126
+ if (query.options?.logExplainQueryPlan) {
127
+ const result = driver.exec({
128
+ ...query,
129
+ sql: `EXPLAIN QUERY PLAN ${query.sql}`,
61
130
  });
131
+ console.log("[logExplainQueryPlan]", query);
132
+ console.log(drawSqliteQueryPlan(result.rows));
62
133
  }
63
- return transactionResult;
64
- }
65
- // Callback returned an error
66
- if (!transactionResult.value.ok) {
67
- const rollback = doRollback();
68
- if (!rollback.ok) {
69
- deps.console?.log("[sql] rollback failed", rollback.error);
70
- return err({
71
- type: "SqliteError",
72
- error: createTransferableError(transactionResult.value.error),
73
- rollbackError: rollback.error.error,
74
- });
134
+ console.debug({ result });
135
+ return result;
136
+ },
137
+ transaction: ((callback) => {
138
+ const env_2 = { stack: [], error: void 0, hasError: false };
139
+ try {
140
+ assertNotDisposed(moved);
141
+ console.debug("begin");
142
+ driver.exec(sql `begin;`);
143
+ let shouldRollback = true;
144
+ const _rollback = __addDisposableResource(env_2, {
145
+ [Symbol.dispose]: () => {
146
+ if (!shouldRollback)
147
+ return;
148
+ console.debug("rollback");
149
+ driver.exec(sql `rollback;`);
150
+ },
151
+ }, false);
152
+ const result = callback();
153
+ if (result != null && !result.ok)
154
+ return result;
155
+ console.debug("commit");
156
+ driver.exec(sql `commit;`);
157
+ shouldRollback = false;
158
+ return result;
75
159
  }
76
- return transactionResult.value;
77
- }
78
- return ok(transactionResult.value.value);
79
- },
80
- export: () => trySync(() => {
81
- return driver.export();
82
- }, (error) => ({
83
- type: "SqliteError",
84
- error: createTransferableError(error),
85
- })),
86
- [Symbol.dispose]: () => {
87
- if (isDisposed)
88
- return;
89
- isDisposed = true;
90
- driver[Symbol.dispose]();
91
- },
92
- };
93
- return sqlite;
94
- }, createSqliteError);
95
- const createSqliteError = (error) => ({
96
- type: "SqliteError",
97
- error: createTransferableError(error),
98
- });
99
- const maybeLogSqliteQueryExecutionTime = (query, callback) => {
100
- if (!query.options?.logQueryExecutionTime) {
101
- return callback();
160
+ catch (e_2) {
161
+ env_2.error = e_2;
162
+ env_2.hasError = true;
163
+ }
164
+ finally {
165
+ __disposeResources(env_2);
166
+ }
167
+ }),
168
+ export: () => {
169
+ assertNotDisposed(moved);
170
+ return driver.export();
171
+ },
172
+ [Symbol.asyncDispose]: () => moved.disposeAsync(),
173
+ };
174
+ return ok(sqlite);
175
+ }
176
+ catch (e_1) {
177
+ env_1.error = e_1;
178
+ env_1.hasError = true;
179
+ }
180
+ finally {
181
+ const result_1 = __disposeResources(env_1);
182
+ if (result_1)
183
+ await result_1;
184
+ }
185
+ };
186
+ /** Creates a test setup with a in-memory {@link Sqlite}. */
187
+ export const testSetupSqlite = async (deps) => {
188
+ const env_3 = { stack: [], error: void 0, hasError: false };
189
+ try {
190
+ const stack = __addDisposableResource(env_3, new AsyncDisposableStack(), true);
191
+ const run = stack.use(testCreateRun(deps));
192
+ const sqlite = stack.use(await run.orThrow(createSqlite(testName, { mode: "memory" })));
193
+ const moved = stack.move();
194
+ return {
195
+ run: run.addDeps({ sqlite }),
196
+ sqlite,
197
+ [Symbol.asyncDispose]: () => moved.disposeAsync(),
198
+ };
199
+ }
200
+ catch (e_3) {
201
+ env_3.error = e_3;
202
+ env_3.hasError = true;
203
+ }
204
+ finally {
205
+ const result_2 = __disposeResources(env_3);
206
+ if (result_2)
207
+ await result_2;
102
208
  }
103
- const start = performance.now();
104
- const result = callback();
105
- const elapsed = performance.now() - start;
106
- // eslint-disable-next-line no-console
107
- console.log(`SqliteQueryExecutionTime: ${elapsed.toString()}ms`, query);
108
- return result;
109
209
  };
210
+ const drawSqliteQueryPlan = (rows) => rows
211
+ .map((row) => {
212
+ let parentId = row.parent;
213
+ let indent = 0;
214
+ do {
215
+ const parent = rows.find((r) => r.id === parentId);
216
+ if (!parent)
217
+ break;
218
+ parentId = parent.parent;
219
+ indent++;
220
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition
221
+ } while (true);
222
+ return `${" ".repeat(indent)}${row.detail}`;
223
+ })
224
+ .join("\n");
225
+ /**
226
+ * Creates a {@link PreparedStatements} cache backed by the given factory and
227
+ * dispose function.
228
+ */
110
229
  export const createPreparedStatementsCache = (factory, disposeFn) => {
111
230
  let isDisposed = false;
112
231
  const cache = new Map();
@@ -162,7 +281,7 @@ export const createPreparedStatementsCache = (factory, disposeFn) => {
162
281
  * sqlite.exec(sql`select * from users order by ${sql.raw(orderBy)};`);
163
282
  * ```
164
283
  *
165
- * ### TIP
284
+ * ## TIP
166
285
  *
167
286
  * Use `prettier-plugin-sql-cst` for SQL formatting. Like Prettier for
168
287
  * JavaScript, this plugin formats SQL expressions differently depending on
@@ -184,7 +303,7 @@ export const sql = (strings, ...parameters) => {
184
303
  }
185
304
  }
186
305
  }
187
- return { sql: sql, parameters: values };
306
+ return { sql: sql.trim(), parameters: values };
188
307
  };
189
308
  sql.identifier = (identifier) => ({
190
309
  type: "SqlIdentifier",
@@ -192,124 +311,105 @@ sql.identifier = (identifier) => ({
192
311
  sql: `"${identifier.replace(/"/g, '""')}"`,
193
312
  });
194
313
  /**
195
- * Insert any string.
314
+ * Insert any string verbatim.
196
315
  *
197
- * Sql.raw sometimes breaks auto-formatting because the parser does not consider
198
- * it valid SQL. A workaround is to remove it, format it, and put it back.
199
- *
200
- * **Warning**: This is not escaped.
316
+ * **Warning**: This is not escaped. Use only with trusted, constant SQL
317
+ * fragments to avoid SQL injection.
201
318
  */
202
319
  sql.raw = (raw) => ({ type: "RawSql", sql: raw });
320
+ /** Tagged template that creates a {@link SqliteQuery} with `prepare: true`. */
203
321
  sql.prepared = (strings, ...parameters) => {
204
322
  const query = sql(strings, ...parameters);
205
323
  return { ...query, options: { prepare: true } };
206
324
  };
325
+ /** Index metadata stored in `sqlite_master` for a {@link Sqlite} database. */
326
+ export const SqliteIndex = /*#__PURE__*/ object({ name: String, sql: String });
327
+ /** {@link Eq} instance for {@link SqliteIndex}. */
328
+ export const eqSqliteIndex = /*#__PURE__*/ createEqObject({
329
+ name: eqString,
330
+ sql: eqString,
331
+ });
207
332
  /**
208
- * Checks if a SQL string contains mutation keywords (insert, update, delete,
209
- * etc.). Results are cached for performance.
333
+ * Full schema metadata for a {@link Sqlite} database.
334
+ *
335
+ * Includes table-column mappings and user-visible indexes.
210
336
  */
211
- export const isSqlMutation = (sql) => {
212
- /**
213
- * Without cache, "insert 1_000_000" Storage test dropped from 57742
214
- * inserts/sec to 34k. Regex we used was fast, but CodeQL flagged it as a
215
- * potential ReDoS vulnerability, so manual comment removal was the only
216
- * option. LRU cache restores performance.
217
- */
218
- const cached = isSqlMutationCache.get(sql);
219
- if (cached !== undefined)
220
- return cached;
221
- const result = isSqlMutationRegEx.test(removeSqlComments(sql));
222
- isSqlMutationCache.set(sql, result);
223
- return result;
337
+ export const SqliteSchema = /*#__PURE__*/ object({
338
+ tables: /*#__PURE__*/ record(String, /*#__PURE__*/ set(String)),
339
+ indexes: /*#__PURE__*/ array(SqliteIndex),
340
+ });
341
+ /** Get the current SQLite schema by reading SQLite metadata. */
342
+ export const getSqliteSchema = (deps) => ({ excludeIndexNamePrefix, } = {}) => {
343
+ const tables = createRecord();
344
+ const tableAndColumnInfoRows = deps.sqlite.exec(sql `
345
+ select
346
+ sqlite_master.name as tableName,
347
+ table_info.name as columnName
348
+ from
349
+ sqlite_master
350
+ join pragma_table_info(sqlite_master.name) as table_info;
351
+ `);
352
+ tableAndColumnInfoRows.rows.forEach(({ tableName, columnName }) => {
353
+ (tables[tableName] ??= new Set()).add(columnName);
354
+ });
355
+ const indexNamePrefixFilter = excludeIndexNamePrefix != null
356
+ ? ` and name not like '${excludeIndexNamePrefix.replaceAll("'", "''")}%'`
357
+ : "";
358
+ const indexesRows = deps.sqlite.exec(sql `
359
+ select name, sql
360
+ from sqlite_master
361
+ where
362
+ type = 'index'
363
+ and name not like 'sqlite_%'
364
+ ${sql.raw(indexNamePrefixFilter)};
365
+ `);
366
+ const indexes = indexesRows.rows.map((row) => ({
367
+ name: row.name,
368
+ /**
369
+ * SQLite returns "CREATE INDEX" for "create index" for some reason.
370
+ * Other keywords remain unchanged. We have to normalize the casing for
371
+ * schema comparison manually.
372
+ */
373
+ sql: row.sql
374
+ .replace("CREATE INDEX", "create index")
375
+ .replace("CREATE UNIQUE INDEX", "create unique index"),
376
+ }));
377
+ return { tables, indexes };
224
378
  };
225
- const isSqlMutationCache = createLruCache(PositiveInt.orThrow(10_000));
226
- const isSqlMutationRegEx = new RegExp(`\\b(${[
227
- "alter",
228
- "create",
229
- "delete",
230
- "drop",
231
- "insert",
232
- "replace",
233
- "update",
234
- "begin",
235
- "commit",
236
- "rollback",
237
- "pragma",
238
- "vacuum",
239
- ].join("|")})\\b`, "i");
240
379
  /**
241
- * Removes SQL line comments (--) from a SQL string without using regex to avoid
242
- * ReDoS vulnerabilities.
380
+ * Captures a full {@link SqliteSnapshot} for testing and diagnostics.
381
+ *
382
+ * The snapshot includes current {@link SqliteSchema} and all rows from every
383
+ * discovered table. Table order follows `schema.tables` iteration order.
243
384
  */
244
- const removeSqlComments = (sql) => {
245
- // Fast path: if there are no comments, return the original string
246
- if (!sql.includes("--"))
247
- return sql;
248
- let result = "";
249
- let i = 0;
250
- while (i < sql.length) {
251
- // Check for comment start
252
- if (i < sql.length - 1 && sql[i] === "-" && sql[i + 1] === "-") {
253
- // Skip until end of line or end of string
254
- i += 2;
255
- while (i < sql.length && sql[i] !== "\n") {
256
- i++;
257
- }
258
- // Keep the newline if present
259
- if (i < sql.length && sql[i] === "\n") {
260
- result += "\n";
261
- i++;
262
- }
263
- }
264
- else {
265
- result += sql[i];
266
- i++;
267
- }
385
+ export const getSqliteSnapshot = (deps) => {
386
+ const schema = getSqliteSchema(deps)();
387
+ const tables = [];
388
+ for (const tableName in schema.tables) {
389
+ const result = deps.sqlite.exec(sql `
390
+ select * from ${sql.identifier(tableName)};
391
+ `);
392
+ tables.push({
393
+ name: tableName,
394
+ rows: result.rows,
395
+ });
268
396
  }
269
- return result;
397
+ return { schema, tables };
270
398
  };
271
- export const explainSqliteQueryPlan = (deps) => (query) => {
272
- const result = deps.sqlite.exec({
273
- ...query,
274
- sql: `EXPLAIN QUERY PLAN ${query.sql}`,
275
- });
276
- if (!result.ok)
277
- return result;
278
- // eslint-disable-next-line no-console
279
- console.log("[explainSqliteQueryPlan]", query);
280
- // eslint-disable-next-line no-console
281
- console.log(drawSqliteQueryPlan(result.value.rows));
282
- return ok();
283
- };
284
- const drawSqliteQueryPlan = (rows) => rows
285
- .map((row) => {
286
- let parentId = row.parent;
287
- let indent = 0;
288
- do {
289
- const parent = rows.find((r) => r.id === parentId);
290
- if (!parent)
291
- break;
292
- parentId = parent.parent;
293
- indent++;
294
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition
295
- } while (true);
296
- return `${" ".repeat(indent)}${row.detail}`;
297
- })
298
- .join("\n");
299
399
  /**
300
400
  * SQLite represents boolean values using `0` (false) and `1` (true) instead of
301
401
  * a dedicated boolean type.
302
402
  *
303
403
  * See: https://www.sqlite.org/quirks.html#no_separate_boolean_datatype
304
404
  *
305
- * ### Tips
405
+ * ## Tips
306
406
  *
307
407
  * - Use {@link sqliteTrue} and {@link sqliteFalse} constants for better
308
408
  * readability.
309
409
  * - Use {@link booleanToSqliteBoolean} and {@link sqliteBooleanToBoolean} for
310
410
  * converting between JavaScript booleans and SQLite boolean values.
311
411
  */
312
- export const SqliteBoolean = union(0, 1);
412
+ export const SqliteBoolean = /*#__PURE__*/ union(0, 1);
313
413
  /**
314
414
  * Represents the {@link SqliteBoolean} value for `true`.
315
415
  *
@@ -1,42 +1,50 @@
1
- import { Eq } from "./Eq.js";
2
- import { Ref } from "./Ref.js";
3
1
  /**
4
- * A store for managing state with change notifications. Extends {@link Ref} with
5
- * subscriptions. Provides methods to get, set, and modify state, and to notify
6
- * listeners when the state changes.
2
+ * Observable state container with change notifications.
3
+ *
4
+ * @module
7
5
  */
8
- export interface Store<T> extends Ref<T> {
9
- /**
10
- * Registers a listener to be called on state changes and returns a function
11
- * to unsubscribe.
12
- */
13
- readonly subscribe: StoreSubscribe;
6
+ import type { Eq } from "./Eq.js";
7
+ import type { Ref } from "./Ref.js";
8
+ /**
9
+ * A store for managing state with change notifications. Like a {@link Ref} with
10
+ * subscriptions.
11
+ *
12
+ * Store is a valid dependency in Evolu's [Dependency
13
+ * Injection](https://evolu.dev/docs/dependency-injection) pattern—use it when
14
+ * functions need shared mutable state with subscriptions.
15
+ */
16
+ export interface Store<T> extends ReadonlyStore<T>, Ref<T> {
17
+ }
18
+ /**
19
+ * A read-only view of a {@link Store} that provides state access and change
20
+ * notifications without allowing modifications.
21
+ *
22
+ * Use {@link ReadonlyStore} in public APIs where consumers should observe state
23
+ * but not modify it directly.
24
+ */
25
+ export interface ReadonlyStore<T> extends Disposable {
14
26
  /** Returns the current state of the store. */
15
27
  readonly get: () => T;
16
28
  /**
17
- * Updates the store's state and notifies all subscribed listeners if the new
18
- * state differs from the current one.
19
- */
20
- readonly set: (state: T) => void;
21
- /**
22
- * Modifies the store's state by applying a callback function to the current
23
- * state and notifies listeners if the state changes.
29
+ * Registers a listener to be called on state changes and returns a function
30
+ * to unsubscribe.
24
31
  */
25
- readonly modify: (updater: (current: T) => T) => void;
32
+ readonly subscribe: (listener: Listener) => Unsubscribe;
26
33
  }
27
- /** Registers a listener for state changes, returning an unsubscribe function. */
28
- export type StoreSubscribe = (listener: StoreListener) => StoreUnsubscribe;
29
- /** A callback invoked whenever the store's state updates. */
30
- export type StoreListener = () => void;
31
- /** A function to remove a previously added listener. */
32
- export type StoreUnsubscribe = () => void;
34
+ /** Callback used by {@link ReadonlyStore.subscribe} to observe changes. */
35
+ export type Listener = () => void;
36
+ /**
37
+ * Function returned by {@link ReadonlyStore.subscribe} to stop observing
38
+ * changes.
39
+ */
40
+ export type Unsubscribe = () => void;
33
41
  /**
34
42
  * Creates a store with the given initial state. The store encapsulates its
35
- * state, which can be read with `get` and updated with `set` or `modify`. All
43
+ * state, which can be read with `get` and updated with `set` or `update`. All
36
44
  * changes are broadcast to subscribers.
37
45
  *
38
- * By default, state changes are detected using `===` (shallow equality). You
39
- * can provide a custom equality function as the second argument.
46
+ * By default, state changes are detected using strict equality (`===`). You can
47
+ * provide a custom equality function as the second argument.
40
48
  */
41
49
  export declare const createStore: <T>(initialState: T, eq?: Eq<T>) => Store<T>;
42
50
  //# sourceMappingURL=Store.d.ts.map