@multiplatform.one/frappe 6.0.4 → 6.3.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 (792) hide show
  1. package/README.md +38 -12
  2. package/dist/cjs/auth.cjs +1 -1
  3. package/dist/cjs/auth.native.js.map +1 -1
  4. package/dist/cjs/call.cjs +1 -1
  5. package/dist/cjs/call.native.js.map +1 -1
  6. package/dist/cjs/collection.cjs +18 -4
  7. package/dist/cjs/collection.native.js +18 -4
  8. package/dist/cjs/collection.native.js.map +1 -1
  9. package/dist/cjs/core/http.cjs +92 -9
  10. package/dist/cjs/core/http.native.js +96 -7
  11. package/dist/cjs/core/http.native.js.map +1 -1
  12. package/dist/cjs/db.cjs +7 -7
  13. package/dist/cjs/db.native.js +4 -4
  14. package/dist/cjs/db.native.js.map +1 -1
  15. package/dist/cjs/doctype.cjs +97 -39
  16. package/dist/cjs/doctype.native.js +116 -46
  17. package/dist/cjs/doctype.native.js.map +1 -1
  18. package/dist/cjs/file.cjs +1 -1
  19. package/dist/cjs/file.native.js.map +1 -1
  20. package/dist/cjs/fixtureDb.cjs +3 -2
  21. package/dist/cjs/fixtureDb.native.js +2 -1
  22. package/dist/cjs/fixtureDb.native.js.map +1 -1
  23. package/dist/cjs/frappeApp.cjs +15 -14
  24. package/dist/cjs/frappeApp.native.js +16 -14
  25. package/dist/cjs/frappeApp.native.js.map +1 -1
  26. package/dist/cjs/frappeReact.cjs +198 -18
  27. package/dist/cjs/frappeReact.native.js +241 -18
  28. package/dist/cjs/frappeReact.native.js.map +1 -1
  29. package/dist/cjs/index.cjs +9 -4
  30. package/dist/cjs/index.native.js +9 -4
  31. package/dist/cjs/index.native.js.map +1 -1
  32. package/dist/cjs/pacer.cjs +2 -2
  33. package/dist/cjs/pacer.native.js +2 -2
  34. package/dist/cjs/pacer.native.js.map +1 -1
  35. package/dist/cjs/realtime.cjs +186 -46
  36. package/dist/cjs/realtime.native.js +268 -48
  37. package/dist/cjs/realtime.native.js.map +1 -1
  38. package/dist/cjs/sync/backfill.cjs +32 -27
  39. package/dist/cjs/sync/backfill.native.js +49 -43
  40. package/dist/cjs/sync/backfill.native.js.map +1 -1
  41. package/dist/cjs/sync/index.cjs +90 -24
  42. package/dist/cjs/sync/index.native.js +112 -10
  43. package/dist/cjs/sync/index.native.js.map +1 -1
  44. package/dist/cjs/sync/merge.cjs +0 -3
  45. package/dist/cjs/sync/merge.native.js +0 -3
  46. package/dist/cjs/sync/merge.native.js.map +1 -1
  47. package/dist/cjs/sync/mutationEngine.cjs +25 -19
  48. package/dist/cjs/sync/mutationEngine.native.js +16 -13
  49. package/dist/cjs/sync/mutationEngine.native.js.map +1 -1
  50. package/dist/cjs/sync/mutationJournal.cjs +9 -4
  51. package/dist/cjs/sync/mutationJournal.native.js +7 -4
  52. package/dist/cjs/sync/mutationJournal.native.js.map +1 -1
  53. package/dist/cjs/sync/normalizedCache.cjs +7 -3
  54. package/dist/cjs/sync/normalizedCache.native.js +7 -2
  55. package/dist/cjs/sync/normalizedCache.native.js.map +1 -1
  56. package/dist/cjs/sync/persistence.cjs +63 -31
  57. package/dist/cjs/sync/persistence.native.js +120 -63
  58. package/dist/cjs/sync/persistence.native.js.map +1 -1
  59. package/dist/cjs/sync/realtime.cjs +124 -13
  60. package/dist/cjs/sync/realtime.native.js +163 -20
  61. package/dist/cjs/sync/realtime.native.js.map +1 -1
  62. package/dist/cjs/sync/rehydration.cjs +16 -10
  63. package/dist/cjs/sync/rehydration.native.js +16 -14
  64. package/dist/cjs/sync/rehydration.native.js.map +1 -1
  65. package/dist/cjs/sync/storage.cjs +3 -3
  66. package/dist/cjs/sync/storage.native.js +1 -1
  67. package/dist/cjs/sync/storage.native.js.map +1 -1
  68. package/dist/cjs/sync/subscriptionManager.cjs +255 -65
  69. package/dist/cjs/sync/subscriptionManager.native.js +330 -93
  70. package/dist/cjs/sync/subscriptionManager.native.js.map +1 -1
  71. package/dist/cjs/sync/types.cjs +2 -0
  72. package/dist/cjs/sync/types.native.js +2 -0
  73. package/dist/cjs/sync/types.native.js.map +1 -1
  74. package/dist/cjs/sync/virtualPageManager.cjs +9 -9
  75. package/dist/cjs/sync/virtualPageManager.native.js +5 -9
  76. package/dist/cjs/sync/virtualPageManager.native.js.map +1 -1
  77. package/dist/cjs/useLiveQuery.cjs +52 -0
  78. package/dist/cjs/useLiveQuery.native.js +59 -0
  79. package/dist/cjs/useLiveQuery.native.js.map +1 -0
  80. package/dist/cjs/util.cjs +11 -2
  81. package/dist/cjs/util.native.js +16 -2
  82. package/dist/cjs/util.native.js.map +1 -1
  83. package/dist/esm/auth.mjs +1 -1
  84. package/dist/esm/auth.mjs.map +1 -1
  85. package/dist/esm/auth.native.js.map +1 -1
  86. package/dist/esm/call.mjs +1 -1
  87. package/dist/esm/call.mjs.map +1 -1
  88. package/dist/esm/call.native.js.map +1 -1
  89. package/dist/esm/collection.mjs +18 -4
  90. package/dist/esm/collection.mjs.map +1 -1
  91. package/dist/esm/collection.native.js +18 -4
  92. package/dist/esm/collection.native.js.map +1 -1
  93. package/dist/esm/core/http.mjs +93 -10
  94. package/dist/esm/core/http.mjs.map +1 -1
  95. package/dist/esm/core/http.native.js +97 -8
  96. package/dist/esm/core/http.native.js.map +1 -1
  97. package/dist/esm/db.mjs +7 -7
  98. package/dist/esm/db.mjs.map +1 -1
  99. package/dist/esm/db.native.js +4 -4
  100. package/dist/esm/db.native.js.map +1 -1
  101. package/dist/esm/doctype.mjs +96 -39
  102. package/dist/esm/doctype.mjs.map +1 -1
  103. package/dist/esm/doctype.native.js +115 -46
  104. package/dist/esm/doctype.native.js.map +1 -1
  105. package/dist/esm/file.mjs +1 -1
  106. package/dist/esm/file.mjs.map +1 -1
  107. package/dist/esm/file.native.js.map +1 -1
  108. package/dist/esm/fixtureDb.mjs +3 -2
  109. package/dist/esm/fixtureDb.mjs.map +1 -1
  110. package/dist/esm/fixtureDb.native.js +2 -1
  111. package/dist/esm/fixtureDb.native.js.map +1 -1
  112. package/dist/esm/frappeApp.mjs +15 -14
  113. package/dist/esm/frappeApp.mjs.map +1 -1
  114. package/dist/esm/frappeApp.native.js +16 -14
  115. package/dist/esm/frappeApp.native.js.map +1 -1
  116. package/dist/esm/frappeReact.mjs +197 -19
  117. package/dist/esm/frappeReact.mjs.map +1 -1
  118. package/dist/esm/frappeReact.native.js +240 -19
  119. package/dist/esm/frappeReact.native.js.map +1 -1
  120. package/dist/esm/index.mjs +5 -4
  121. package/dist/esm/index.mjs.map +1 -1
  122. package/dist/esm/index.native.js +5 -4
  123. package/dist/esm/index.native.js.map +1 -1
  124. package/dist/esm/pacer.mjs +1 -1
  125. package/dist/esm/pacer.native.js +1 -1
  126. package/dist/esm/realtime.mjs +187 -47
  127. package/dist/esm/realtime.mjs.map +1 -1
  128. package/dist/esm/realtime.native.js +269 -49
  129. package/dist/esm/realtime.native.js.map +1 -1
  130. package/dist/esm/sync/backfill.mjs +32 -27
  131. package/dist/esm/sync/backfill.mjs.map +1 -1
  132. package/dist/esm/sync/backfill.native.js +49 -43
  133. package/dist/esm/sync/backfill.native.js.map +1 -1
  134. package/dist/esm/sync/index.mjs +90 -24
  135. package/dist/esm/sync/index.mjs.map +1 -1
  136. package/dist/esm/sync/index.native.js +112 -10
  137. package/dist/esm/sync/index.native.js.map +1 -1
  138. package/dist/esm/sync/merge.mjs +1 -1
  139. package/dist/esm/sync/merge.mjs.map +1 -1
  140. package/dist/esm/sync/merge.native.js +1 -1
  141. package/dist/esm/sync/merge.native.js.map +1 -1
  142. package/dist/esm/sync/mutationEngine.mjs +25 -19
  143. package/dist/esm/sync/mutationEngine.mjs.map +1 -1
  144. package/dist/esm/sync/mutationEngine.native.js +16 -13
  145. package/dist/esm/sync/mutationEngine.native.js.map +1 -1
  146. package/dist/esm/sync/mutationJournal.mjs +9 -4
  147. package/dist/esm/sync/mutationJournal.mjs.map +1 -1
  148. package/dist/esm/sync/mutationJournal.native.js +7 -4
  149. package/dist/esm/sync/mutationJournal.native.js.map +1 -1
  150. package/dist/esm/sync/normalizedCache.mjs +7 -3
  151. package/dist/esm/sync/normalizedCache.mjs.map +1 -1
  152. package/dist/esm/sync/normalizedCache.native.js +7 -2
  153. package/dist/esm/sync/normalizedCache.native.js.map +1 -1
  154. package/dist/esm/sync/persistence.mjs +64 -32
  155. package/dist/esm/sync/persistence.mjs.map +1 -1
  156. package/dist/esm/sync/persistence.native.js +121 -64
  157. package/dist/esm/sync/persistence.native.js.map +1 -1
  158. package/dist/esm/sync/realtime.mjs +124 -13
  159. package/dist/esm/sync/realtime.mjs.map +1 -1
  160. package/dist/esm/sync/realtime.native.js +163 -20
  161. package/dist/esm/sync/realtime.native.js.map +1 -1
  162. package/dist/esm/sync/rehydration.mjs +16 -10
  163. package/dist/esm/sync/rehydration.mjs.map +1 -1
  164. package/dist/esm/sync/rehydration.native.js +16 -14
  165. package/dist/esm/sync/rehydration.native.js.map +1 -1
  166. package/dist/esm/sync/storage.mjs +3 -3
  167. package/dist/esm/sync/storage.mjs.map +1 -1
  168. package/dist/esm/sync/storage.native.js +1 -1
  169. package/dist/esm/sync/storage.native.js.map +1 -1
  170. package/dist/esm/sync/subscriptionManager.mjs +255 -65
  171. package/dist/esm/sync/subscriptionManager.mjs.map +1 -1
  172. package/dist/esm/sync/subscriptionManager.native.js +330 -93
  173. package/dist/esm/sync/subscriptionManager.native.js.map +1 -1
  174. package/dist/esm/sync/types.mjs +2 -0
  175. package/dist/esm/sync/types.mjs.map +1 -1
  176. package/dist/esm/sync/types.native.js +2 -0
  177. package/dist/esm/sync/types.native.js.map +1 -1
  178. package/dist/esm/sync/virtualPageManager.mjs +9 -9
  179. package/dist/esm/sync/virtualPageManager.mjs.map +1 -1
  180. package/dist/esm/sync/virtualPageManager.native.js +5 -9
  181. package/dist/esm/sync/virtualPageManager.native.js.map +1 -1
  182. package/dist/esm/useLiveQuery.mjs +26 -0
  183. package/dist/esm/useLiveQuery.mjs.map +1 -0
  184. package/dist/esm/useLiveQuery.native.js +30 -0
  185. package/dist/esm/useLiveQuery.native.js.map +1 -0
  186. package/dist/esm/util.mjs +11 -3
  187. package/dist/esm/util.mjs.map +1 -1
  188. package/dist/esm/util.native.js +16 -3
  189. package/dist/esm/util.native.js.map +1 -1
  190. package/dist/jsx/auth.mjs +1 -1
  191. package/dist/jsx/auth.mjs.map +1 -1
  192. package/dist/jsx/auth.native.js.map +1 -1
  193. package/dist/jsx/call.mjs +1 -1
  194. package/dist/jsx/call.mjs.map +1 -1
  195. package/dist/jsx/call.native.js.map +1 -1
  196. package/dist/jsx/collection.mjs +18 -4
  197. package/dist/jsx/collection.mjs.map +1 -1
  198. package/dist/jsx/collection.native.js +18 -4
  199. package/dist/jsx/collection.native.js.map +1 -1
  200. package/dist/jsx/core/http.mjs +93 -10
  201. package/dist/jsx/core/http.mjs.map +1 -1
  202. package/dist/jsx/core/http.native.js +96 -7
  203. package/dist/jsx/core/http.native.js.map +1 -1
  204. package/dist/jsx/db.mjs +7 -7
  205. package/dist/jsx/db.mjs.map +1 -1
  206. package/dist/jsx/db.native.js +4 -4
  207. package/dist/jsx/db.native.js.map +1 -1
  208. package/dist/jsx/doctype.mjs +96 -39
  209. package/dist/jsx/doctype.mjs.map +1 -1
  210. package/dist/jsx/doctype.native.js +116 -46
  211. package/dist/jsx/doctype.native.js.map +1 -1
  212. package/dist/jsx/file.mjs +1 -1
  213. package/dist/jsx/file.mjs.map +1 -1
  214. package/dist/jsx/file.native.js.map +1 -1
  215. package/dist/jsx/fixtureDb.mjs +3 -2
  216. package/dist/jsx/fixtureDb.mjs.map +1 -1
  217. package/dist/jsx/fixtureDb.native.js +2 -1
  218. package/dist/jsx/fixtureDb.native.js.map +1 -1
  219. package/dist/jsx/frappeApp.mjs +15 -14
  220. package/dist/jsx/frappeApp.mjs.map +1 -1
  221. package/dist/jsx/frappeApp.native.js +16 -14
  222. package/dist/jsx/frappeApp.native.js.map +1 -1
  223. package/dist/jsx/frappeReact.mjs +197 -19
  224. package/dist/jsx/frappeReact.mjs.map +1 -1
  225. package/dist/jsx/frappeReact.native.js +241 -18
  226. package/dist/jsx/frappeReact.native.js.map +1 -1
  227. package/dist/jsx/index.js +5 -4
  228. package/dist/jsx/index.js.map +1 -1
  229. package/dist/jsx/index.mjs +5 -4
  230. package/dist/jsx/index.mjs.map +1 -1
  231. package/dist/jsx/index.native.js +9 -4
  232. package/dist/jsx/index.native.js.map +1 -1
  233. package/dist/jsx/pacer.mjs +1 -1
  234. package/dist/jsx/pacer.native.js +2 -2
  235. package/dist/jsx/pacer.native.js.map +1 -1
  236. package/dist/jsx/realtime.mjs +187 -47
  237. package/dist/jsx/realtime.mjs.map +1 -1
  238. package/dist/jsx/realtime.native.js +268 -48
  239. package/dist/jsx/realtime.native.js.map +1 -1
  240. package/dist/jsx/sync/backfill.mjs +32 -27
  241. package/dist/jsx/sync/backfill.mjs.map +1 -1
  242. package/dist/jsx/sync/backfill.native.js +49 -43
  243. package/dist/jsx/sync/backfill.native.js.map +1 -1
  244. package/dist/jsx/sync/index.mjs +90 -24
  245. package/dist/jsx/sync/index.mjs.map +1 -1
  246. package/dist/jsx/sync/index.native.js +112 -10
  247. package/dist/jsx/sync/index.native.js.map +1 -1
  248. package/dist/jsx/sync/merge.mjs +1 -1
  249. package/dist/jsx/sync/merge.mjs.map +1 -1
  250. package/dist/jsx/sync/merge.native.js +0 -3
  251. package/dist/jsx/sync/merge.native.js.map +1 -1
  252. package/dist/jsx/sync/mutationEngine.mjs +25 -19
  253. package/dist/jsx/sync/mutationEngine.mjs.map +1 -1
  254. package/dist/jsx/sync/mutationEngine.native.js +16 -13
  255. package/dist/jsx/sync/mutationEngine.native.js.map +1 -1
  256. package/dist/jsx/sync/mutationJournal.mjs +9 -4
  257. package/dist/jsx/sync/mutationJournal.mjs.map +1 -1
  258. package/dist/jsx/sync/mutationJournal.native.js +7 -4
  259. package/dist/jsx/sync/mutationJournal.native.js.map +1 -1
  260. package/dist/jsx/sync/normalizedCache.mjs +7 -3
  261. package/dist/jsx/sync/normalizedCache.mjs.map +1 -1
  262. package/dist/jsx/sync/normalizedCache.native.js +7 -2
  263. package/dist/jsx/sync/normalizedCache.native.js.map +1 -1
  264. package/dist/jsx/sync/persistence.mjs +64 -32
  265. package/dist/jsx/sync/persistence.mjs.map +1 -1
  266. package/dist/jsx/sync/persistence.native.js +120 -63
  267. package/dist/jsx/sync/persistence.native.js.map +1 -1
  268. package/dist/jsx/sync/realtime.mjs +124 -13
  269. package/dist/jsx/sync/realtime.mjs.map +1 -1
  270. package/dist/jsx/sync/realtime.native.js +163 -20
  271. package/dist/jsx/sync/realtime.native.js.map +1 -1
  272. package/dist/jsx/sync/rehydration.mjs +16 -10
  273. package/dist/jsx/sync/rehydration.mjs.map +1 -1
  274. package/dist/jsx/sync/rehydration.native.js +16 -14
  275. package/dist/jsx/sync/rehydration.native.js.map +1 -1
  276. package/dist/jsx/sync/storage.mjs +3 -3
  277. package/dist/jsx/sync/storage.mjs.map +1 -1
  278. package/dist/jsx/sync/storage.native.js +1 -1
  279. package/dist/jsx/sync/storage.native.js.map +1 -1
  280. package/dist/jsx/sync/subscriptionManager.mjs +255 -65
  281. package/dist/jsx/sync/subscriptionManager.mjs.map +1 -1
  282. package/dist/jsx/sync/subscriptionManager.native.js +330 -93
  283. package/dist/jsx/sync/subscriptionManager.native.js.map +1 -1
  284. package/dist/jsx/sync/types.mjs +2 -0
  285. package/dist/jsx/sync/types.mjs.map +1 -1
  286. package/dist/jsx/sync/types.native.js +2 -0
  287. package/dist/jsx/sync/types.native.js.map +1 -1
  288. package/dist/jsx/sync/virtualPageManager.mjs +9 -9
  289. package/dist/jsx/sync/virtualPageManager.mjs.map +1 -1
  290. package/dist/jsx/sync/virtualPageManager.native.js +5 -9
  291. package/dist/jsx/sync/virtualPageManager.native.js.map +1 -1
  292. package/dist/jsx/useLiveQuery.mjs +26 -0
  293. package/dist/jsx/useLiveQuery.mjs.map +1 -0
  294. package/dist/jsx/useLiveQuery.native.js +59 -0
  295. package/dist/jsx/useLiveQuery.native.js.map +1 -0
  296. package/dist/jsx/util.mjs +11 -3
  297. package/dist/jsx/util.mjs.map +1 -1
  298. package/dist/jsx/util.native.js +16 -2
  299. package/dist/jsx/util.native.js.map +1 -1
  300. package/package.json +20 -17
  301. package/src/auth.ts +5 -1
  302. package/src/call.ts +5 -1
  303. package/src/collection.spec.ts +55 -0
  304. package/src/collection.ts +33 -4
  305. package/src/core/http.spec.ts +66 -0
  306. package/src/core/http.ts +115 -9
  307. package/src/core/httpNative.spec.ts +234 -0
  308. package/src/core/types.ts +2 -0
  309. package/src/db.spec.ts +91 -51
  310. package/src/db.ts +27 -8
  311. package/src/doctype.spec.ts +247 -39
  312. package/src/doctype.ts +203 -53
  313. package/src/file.ts +5 -1
  314. package/src/fixtureDb.ts +13 -2
  315. package/src/frappeApp.ts +18 -19
  316. package/src/frappeReact.spec.ts +565 -1
  317. package/src/frappeReact.ts +446 -38
  318. package/src/frappeReactLiveQueryGc.spec.ts +320 -0
  319. package/src/frappeReactNative.spec.ts +65 -0
  320. package/src/index.ts +10 -9
  321. package/src/pacer.ts +2 -2
  322. package/src/realtime.spec.ts +464 -20
  323. package/src/realtime.ts +284 -46
  324. package/src/sync/backfill.spec.ts +43 -0
  325. package/src/sync/backfill.ts +59 -39
  326. package/src/sync/debug.spec.ts +36 -0
  327. package/src/sync/filterValidation.spec.ts +197 -0
  328. package/src/sync/index.ts +98 -7
  329. package/src/sync/merge.ts +3 -3
  330. package/src/sync/mutationEngine.spec.ts +36 -4
  331. package/src/sync/mutationEngine.ts +30 -11
  332. package/src/sync/mutationJournal.ts +18 -4
  333. package/src/sync/normalizedCache.spec.ts +102 -0
  334. package/src/sync/normalizedCache.ts +19 -3
  335. package/src/sync/offlineRestore.spec.ts +423 -0
  336. package/src/sync/persistence.spec.ts +39 -7
  337. package/src/sync/persistence.ts +90 -18
  338. package/src/sync/persistenceGjs.spec.ts +143 -0
  339. package/src/sync/persistenceNative.spec.ts +139 -0
  340. package/src/sync/realtime.spec.ts +18 -1
  341. package/src/sync/realtime.ts +161 -13
  342. package/src/sync/rehydration.ts +23 -5
  343. package/src/sync/storage.ts +5 -4
  344. package/src/sync/subscriptionManager.spec.ts +94 -0
  345. package/src/sync/subscriptionManager.ts +304 -82
  346. package/src/sync/syncModule.spec.ts +137 -0
  347. package/src/sync/types.ts +39 -0
  348. package/src/sync/virtualPageManager.ts +8 -4
  349. package/src/useLiveQuery.ts +58 -0
  350. package/src/util.spec.ts +35 -4
  351. package/src/util.ts +37 -2
  352. package/types/auth.d.ts +13 -0
  353. package/types/auth.d.ts.map +1 -0
  354. package/types/call.d.ts +10 -0
  355. package/types/call.d.ts.map +1 -0
  356. package/types/collection.d.ts +127 -0
  357. package/types/collection.d.ts.map +1 -0
  358. package/types/common/types.d.ts +35 -0
  359. package/types/common/types.d.ts.map +1 -0
  360. package/types/core/http.d.ts +86 -0
  361. package/types/core/http.d.ts.map +1 -0
  362. package/types/core/types.d.ts +74 -0
  363. package/types/core/types.d.ts.map +1 -0
  364. package/types/core/wire.d.ts +405 -0
  365. package/types/core/wire.d.ts.map +1 -0
  366. package/types/db.d.ts +244 -0
  367. package/types/db.d.ts.map +1 -0
  368. package/types/devtools/FrappeDevtoolsPanel.d.ts +7 -0
  369. package/types/devtools/FrappeDevtoolsPanel.d.ts.map +1 -0
  370. package/types/devtools/index.d.ts +4 -0
  371. package/types/devtools/index.d.ts.map +1 -0
  372. package/types/devtools/plugin.d.ts +9 -0
  373. package/types/devtools/plugin.d.ts.map +1 -0
  374. package/types/devtools/theme.d.ts +15 -0
  375. package/types/devtools/theme.d.ts.map +1 -0
  376. package/types/doctype.d.ts +256 -0
  377. package/types/doctype.d.ts.map +1 -0
  378. package/types/file.d.ts +15 -0
  379. package/types/file.d.ts.map +1 -0
  380. package/types/fixtureDb.d.ts +76 -0
  381. package/types/fixtureDb.d.ts.map +1 -0
  382. package/types/fixtures.d.ts +55 -0
  383. package/types/fixtures.d.ts.map +1 -0
  384. package/types/frappeApp.d.ts +45 -0
  385. package/types/frappeApp.d.ts.map +1 -0
  386. package/types/frappeReact.d.ts +270 -0
  387. package/types/frappeReact.d.ts.map +1 -0
  388. package/types/index.d.ts +44 -0
  389. package/types/index.d.ts.map +1 -0
  390. package/types/optimistic.d.ts +38 -0
  391. package/types/optimistic.d.ts.map +1 -0
  392. package/types/pacer.d.ts +193 -0
  393. package/types/pacer.d.ts.map +1 -0
  394. package/types/plugin/index.d.ts +11 -0
  395. package/types/plugin/index.d.ts.map +1 -0
  396. package/types/realtime.d.ts +121 -0
  397. package/types/realtime.d.ts.map +1 -0
  398. package/types/sync/backfill.d.ts +60 -0
  399. package/types/sync/backfill.d.ts.map +1 -0
  400. package/types/sync/filters.d.ts +101 -0
  401. package/types/sync/filters.d.ts.map +1 -0
  402. package/types/sync/index.d.ts +181 -0
  403. package/types/sync/index.d.ts.map +1 -0
  404. package/types/sync/merge.d.ts +59 -0
  405. package/types/sync/merge.d.ts.map +1 -0
  406. package/types/sync/mutationEngine.d.ts +117 -0
  407. package/types/sync/mutationEngine.d.ts.map +1 -0
  408. package/types/sync/mutationJournal.d.ts +60 -0
  409. package/types/sync/mutationJournal.d.ts.map +1 -0
  410. package/types/sync/normalizedCache.d.ts +59 -0
  411. package/types/sync/normalizedCache.d.ts.map +1 -0
  412. package/types/sync/persistence.d.ts +185 -0
  413. package/types/sync/persistence.d.ts.map +1 -0
  414. package/types/sync/realtime.d.ts +121 -0
  415. package/types/sync/realtime.d.ts.map +1 -0
  416. package/types/sync/rehydration.d.ts +109 -0
  417. package/types/sync/rehydration.d.ts.map +1 -0
  418. package/types/sync/storage.d.ts +65 -0
  419. package/types/sync/storage.d.ts.map +1 -0
  420. package/types/sync/subscriptionManager.d.ts +161 -0
  421. package/types/sync/subscriptionManager.d.ts.map +1 -0
  422. package/types/sync/types.d.ts +435 -0
  423. package/types/sync/types.d.ts.map +1 -0
  424. package/types/sync/virtualPageManager.d.ts +190 -0
  425. package/types/sync/virtualPageManager.d.ts.map +1 -0
  426. package/types/useLiveQuery.d.ts +16 -0
  427. package/types/useLiveQuery.d.ts.map +1 -0
  428. package/types/util.d.ts +24 -0
  429. package/types/util.d.ts.map +1 -0
  430. package/dist/cjs/auth.spec.cjs +0 -322
  431. package/dist/cjs/auth.spec.native.js +0 -329
  432. package/dist/cjs/auth.spec.native.js.map +0 -1
  433. package/dist/cjs/call.spec.cjs +0 -427
  434. package/dist/cjs/call.spec.native.js +0 -430
  435. package/dist/cjs/call.spec.native.js.map +0 -1
  436. package/dist/cjs/collection.spec.cjs +0 -186
  437. package/dist/cjs/collection.spec.native.js +0 -216
  438. package/dist/cjs/collection.spec.native.js.map +0 -1
  439. package/dist/cjs/common/types.spec.cjs +0 -266
  440. package/dist/cjs/common/types.spec.native.js +0 -271
  441. package/dist/cjs/common/types.spec.native.js.map +0 -1
  442. package/dist/cjs/core/http.spec.cjs +0 -1259
  443. package/dist/cjs/core/http.spec.native.js +0 -1401
  444. package/dist/cjs/core/http.spec.native.js.map +0 -1
  445. package/dist/cjs/core/wire.spec.cjs +0 -478
  446. package/dist/cjs/core/wire.spec.native.js +0 -482
  447. package/dist/cjs/core/wire.spec.native.js.map +0 -1
  448. package/dist/cjs/db.spec.cjs +0 -862
  449. package/dist/cjs/db.spec.native.js +0 -865
  450. package/dist/cjs/db.spec.native.js.map +0 -1
  451. package/dist/cjs/doctype.spec.cjs +0 -460
  452. package/dist/cjs/doctype.spec.native.js +0 -538
  453. package/dist/cjs/doctype.spec.native.js.map +0 -1
  454. package/dist/cjs/file.spec.cjs +0 -315
  455. package/dist/cjs/file.spec.native.js +0 -342
  456. package/dist/cjs/file.spec.native.js.map +0 -1
  457. package/dist/cjs/frappeApp.spec.cjs +0 -306
  458. package/dist/cjs/frappeApp.spec.native.js +0 -308
  459. package/dist/cjs/frappeApp.spec.native.js.map +0 -1
  460. package/dist/cjs/frappeReact.spec.cjs +0 -531
  461. package/dist/cjs/frappeReact.spec.native.js +0 -670
  462. package/dist/cjs/frappeReact.spec.native.js.map +0 -1
  463. package/dist/cjs/optimistic.spec.cjs +0 -11
  464. package/dist/cjs/optimistic.spec.native.js +0 -19
  465. package/dist/cjs/optimistic.spec.native.js.map +0 -1
  466. package/dist/cjs/pacer.spec.cjs +0 -470
  467. package/dist/cjs/pacer.spec.native.js +0 -537
  468. package/dist/cjs/pacer.spec.native.js.map +0 -1
  469. package/dist/cjs/realtime.spec.cjs +0 -326
  470. package/dist/cjs/realtime.spec.native.js +0 -392
  471. package/dist/cjs/realtime.spec.native.js.map +0 -1
  472. package/dist/cjs/sync/backfill.spec.cjs +0 -586
  473. package/dist/cjs/sync/backfill.spec.native.js +0 -712
  474. package/dist/cjs/sync/backfill.spec.native.js.map +0 -1
  475. package/dist/cjs/sync/debug.spec.cjs +0 -125
  476. package/dist/cjs/sync/debug.spec.native.js +0 -133
  477. package/dist/cjs/sync/debug.spec.native.js.map +0 -1
  478. package/dist/cjs/sync/filters.spec.cjs +0 -168
  479. package/dist/cjs/sync/filters.spec.native.js +0 -173
  480. package/dist/cjs/sync/filters.spec.native.js.map +0 -1
  481. package/dist/cjs/sync/merge.spec.cjs +0 -908
  482. package/dist/cjs/sync/merge.spec.native.js +0 -937
  483. package/dist/cjs/sync/merge.spec.native.js.map +0 -1
  484. package/dist/cjs/sync/multiOrderBy.spec.cjs +0 -165
  485. package/dist/cjs/sync/multiOrderBy.spec.native.js +0 -229
  486. package/dist/cjs/sync/multiOrderBy.spec.native.js.map +0 -1
  487. package/dist/cjs/sync/mutationEngine.spec.cjs +0 -1158
  488. package/dist/cjs/sync/mutationEngine.spec.native.js +0 -1173
  489. package/dist/cjs/sync/mutationEngine.spec.native.js.map +0 -1
  490. package/dist/cjs/sync/mutationJournal.spec.cjs +0 -330
  491. package/dist/cjs/sync/mutationJournal.spec.native.js +0 -333
  492. package/dist/cjs/sync/mutationJournal.spec.native.js.map +0 -1
  493. package/dist/cjs/sync/mutations.spec.cjs +0 -327
  494. package/dist/cjs/sync/mutations.spec.native.js +0 -330
  495. package/dist/cjs/sync/mutations.spec.native.js.map +0 -1
  496. package/dist/cjs/sync/normalizedCache.spec.cjs +0 -302
  497. package/dist/cjs/sync/normalizedCache.spec.native.js +0 -311
  498. package/dist/cjs/sync/normalizedCache.spec.native.js.map +0 -1
  499. package/dist/cjs/sync/persistence.spec.cjs +0 -562
  500. package/dist/cjs/sync/persistence.spec.native.js +0 -572
  501. package/dist/cjs/sync/persistence.spec.native.js.map +0 -1
  502. package/dist/cjs/sync/realtime.spec.cjs +0 -499
  503. package/dist/cjs/sync/realtime.spec.native.js +0 -512
  504. package/dist/cjs/sync/realtime.spec.native.js.map +0 -1
  505. package/dist/cjs/sync/rehydration.spec.cjs +0 -731
  506. package/dist/cjs/sync/rehydration.spec.native.js +0 -736
  507. package/dist/cjs/sync/rehydration.spec.native.js.map +0 -1
  508. package/dist/cjs/sync/storage.spec.cjs +0 -446
  509. package/dist/cjs/sync/storage.spec.native.js +0 -470
  510. package/dist/cjs/sync/storage.spec.native.js.map +0 -1
  511. package/dist/cjs/sync/subscriptionManager.spec.cjs +0 -1102
  512. package/dist/cjs/sync/subscriptionManager.spec.native.js +0 -1136
  513. package/dist/cjs/sync/subscriptionManager.spec.native.js.map +0 -1
  514. package/dist/cjs/sync/subscriptions.spec.cjs +0 -937
  515. package/dist/cjs/sync/subscriptions.spec.native.js +0 -969
  516. package/dist/cjs/sync/subscriptions.spec.native.js.map +0 -1
  517. package/dist/cjs/sync/syncModule.spec.cjs +0 -206
  518. package/dist/cjs/sync/syncModule.spec.native.js +0 -222
  519. package/dist/cjs/sync/syncModule.spec.native.js.map +0 -1
  520. package/dist/cjs/sync/types.spec.cjs +0 -246
  521. package/dist/cjs/sync/types.spec.native.js +0 -256
  522. package/dist/cjs/sync/types.spec.native.js.map +0 -1
  523. package/dist/cjs/sync/virtualPageManager.spec.cjs +0 -801
  524. package/dist/cjs/sync/virtualPageManager.spec.native.js +0 -873
  525. package/dist/cjs/sync/virtualPageManager.spec.native.js.map +0 -1
  526. package/dist/cjs/util.spec.cjs +0 -43
  527. package/dist/cjs/util.spec.native.js +0 -48
  528. package/dist/cjs/util.spec.native.js.map +0 -1
  529. package/dist/esm/auth.spec.mjs +0 -323
  530. package/dist/esm/auth.spec.mjs.map +0 -1
  531. package/dist/esm/auth.spec.native.js +0 -327
  532. package/dist/esm/auth.spec.native.js.map +0 -1
  533. package/dist/esm/call.spec.mjs +0 -428
  534. package/dist/esm/call.spec.mjs.map +0 -1
  535. package/dist/esm/call.spec.native.js +0 -428
  536. package/dist/esm/call.spec.native.js.map +0 -1
  537. package/dist/esm/collection.spec.mjs +0 -187
  538. package/dist/esm/collection.spec.mjs.map +0 -1
  539. package/dist/esm/collection.spec.native.js +0 -214
  540. package/dist/esm/collection.spec.native.js.map +0 -1
  541. package/dist/esm/common/types.spec.mjs +0 -267
  542. package/dist/esm/common/types.spec.mjs.map +0 -1
  543. package/dist/esm/common/types.spec.native.js +0 -269
  544. package/dist/esm/common/types.spec.native.js.map +0 -1
  545. package/dist/esm/core/http.spec.mjs +0 -1260
  546. package/dist/esm/core/http.spec.mjs.map +0 -1
  547. package/dist/esm/core/http.spec.native.js +0 -1399
  548. package/dist/esm/core/http.spec.native.js.map +0 -1
  549. package/dist/esm/core/wire.spec.mjs +0 -479
  550. package/dist/esm/core/wire.spec.mjs.map +0 -1
  551. package/dist/esm/core/wire.spec.native.js +0 -480
  552. package/dist/esm/core/wire.spec.native.js.map +0 -1
  553. package/dist/esm/db.spec.mjs +0 -863
  554. package/dist/esm/db.spec.mjs.map +0 -1
  555. package/dist/esm/db.spec.native.js +0 -863
  556. package/dist/esm/db.spec.native.js.map +0 -1
  557. package/dist/esm/doctype.spec.mjs +0 -461
  558. package/dist/esm/doctype.spec.mjs.map +0 -1
  559. package/dist/esm/doctype.spec.native.js +0 -536
  560. package/dist/esm/doctype.spec.native.js.map +0 -1
  561. package/dist/esm/file.spec.mjs +0 -316
  562. package/dist/esm/file.spec.mjs.map +0 -1
  563. package/dist/esm/file.spec.native.js +0 -340
  564. package/dist/esm/file.spec.native.js.map +0 -1
  565. package/dist/esm/frappeApp.spec.mjs +0 -307
  566. package/dist/esm/frappeApp.spec.mjs.map +0 -1
  567. package/dist/esm/frappeApp.spec.native.js +0 -306
  568. package/dist/esm/frappeApp.spec.native.js.map +0 -1
  569. package/dist/esm/frappeReact.spec.mjs +0 -532
  570. package/dist/esm/frappeReact.spec.mjs.map +0 -1
  571. package/dist/esm/frappeReact.spec.native.js +0 -668
  572. package/dist/esm/frappeReact.spec.native.js.map +0 -1
  573. package/dist/esm/optimistic.spec.mjs +0 -12
  574. package/dist/esm/optimistic.spec.mjs.map +0 -1
  575. package/dist/esm/optimistic.spec.native.js +0 -17
  576. package/dist/esm/optimistic.spec.native.js.map +0 -1
  577. package/dist/esm/pacer.spec.mjs +0 -447
  578. package/dist/esm/pacer.spec.mjs.map +0 -1
  579. package/dist/esm/pacer.spec.native.js +0 -511
  580. package/dist/esm/pacer.spec.native.js.map +0 -1
  581. package/dist/esm/realtime.spec.mjs +0 -327
  582. package/dist/esm/realtime.spec.mjs.map +0 -1
  583. package/dist/esm/realtime.spec.native.js +0 -390
  584. package/dist/esm/realtime.spec.native.js.map +0 -1
  585. package/dist/esm/sync/backfill.spec.mjs +0 -563
  586. package/dist/esm/sync/backfill.spec.mjs.map +0 -1
  587. package/dist/esm/sync/backfill.spec.native.js +0 -686
  588. package/dist/esm/sync/backfill.spec.native.js.map +0 -1
  589. package/dist/esm/sync/debug.spec.mjs +0 -102
  590. package/dist/esm/sync/debug.spec.mjs.map +0 -1
  591. package/dist/esm/sync/debug.spec.native.js +0 -107
  592. package/dist/esm/sync/debug.spec.native.js.map +0 -1
  593. package/dist/esm/sync/filters.spec.mjs +0 -169
  594. package/dist/esm/sync/filters.spec.mjs.map +0 -1
  595. package/dist/esm/sync/filters.spec.native.js +0 -171
  596. package/dist/esm/sync/filters.spec.native.js.map +0 -1
  597. package/dist/esm/sync/merge.spec.mjs +0 -909
  598. package/dist/esm/sync/merge.spec.mjs.map +0 -1
  599. package/dist/esm/sync/merge.spec.native.js +0 -935
  600. package/dist/esm/sync/merge.spec.native.js.map +0 -1
  601. package/dist/esm/sync/multiOrderBy.spec.mjs +0 -166
  602. package/dist/esm/sync/multiOrderBy.spec.mjs.map +0 -1
  603. package/dist/esm/sync/multiOrderBy.spec.native.js +0 -227
  604. package/dist/esm/sync/multiOrderBy.spec.native.js.map +0 -1
  605. package/dist/esm/sync/mutationEngine.spec.mjs +0 -1159
  606. package/dist/esm/sync/mutationEngine.spec.mjs.map +0 -1
  607. package/dist/esm/sync/mutationEngine.spec.native.js +0 -1171
  608. package/dist/esm/sync/mutationEngine.spec.native.js.map +0 -1
  609. package/dist/esm/sync/mutationJournal.spec.mjs +0 -331
  610. package/dist/esm/sync/mutationJournal.spec.mjs.map +0 -1
  611. package/dist/esm/sync/mutationJournal.spec.native.js +0 -331
  612. package/dist/esm/sync/mutationJournal.spec.native.js.map +0 -1
  613. package/dist/esm/sync/mutations.spec.mjs +0 -328
  614. package/dist/esm/sync/mutations.spec.mjs.map +0 -1
  615. package/dist/esm/sync/mutations.spec.native.js +0 -328
  616. package/dist/esm/sync/mutations.spec.native.js.map +0 -1
  617. package/dist/esm/sync/normalizedCache.spec.mjs +0 -303
  618. package/dist/esm/sync/normalizedCache.spec.mjs.map +0 -1
  619. package/dist/esm/sync/normalizedCache.spec.native.js +0 -309
  620. package/dist/esm/sync/normalizedCache.spec.native.js.map +0 -1
  621. package/dist/esm/sync/persistence.spec.mjs +0 -563
  622. package/dist/esm/sync/persistence.spec.mjs.map +0 -1
  623. package/dist/esm/sync/persistence.spec.native.js +0 -570
  624. package/dist/esm/sync/persistence.spec.native.js.map +0 -1
  625. package/dist/esm/sync/realtime.spec.mjs +0 -500
  626. package/dist/esm/sync/realtime.spec.mjs.map +0 -1
  627. package/dist/esm/sync/realtime.spec.native.js +0 -510
  628. package/dist/esm/sync/realtime.spec.native.js.map +0 -1
  629. package/dist/esm/sync/rehydration.spec.mjs +0 -732
  630. package/dist/esm/sync/rehydration.spec.mjs.map +0 -1
  631. package/dist/esm/sync/rehydration.spec.native.js +0 -734
  632. package/dist/esm/sync/rehydration.spec.native.js.map +0 -1
  633. package/dist/esm/sync/storage.spec.mjs +0 -423
  634. package/dist/esm/sync/storage.spec.mjs.map +0 -1
  635. package/dist/esm/sync/storage.spec.native.js +0 -444
  636. package/dist/esm/sync/storage.spec.native.js.map +0 -1
  637. package/dist/esm/sync/subscriptionManager.spec.mjs +0 -1079
  638. package/dist/esm/sync/subscriptionManager.spec.mjs.map +0 -1
  639. package/dist/esm/sync/subscriptionManager.spec.native.js +0 -1110
  640. package/dist/esm/sync/subscriptionManager.spec.native.js.map +0 -1
  641. package/dist/esm/sync/subscriptions.spec.mjs +0 -914
  642. package/dist/esm/sync/subscriptions.spec.mjs.map +0 -1
  643. package/dist/esm/sync/subscriptions.spec.native.js +0 -943
  644. package/dist/esm/sync/subscriptions.spec.native.js.map +0 -1
  645. package/dist/esm/sync/syncModule.spec.mjs +0 -207
  646. package/dist/esm/sync/syncModule.spec.mjs.map +0 -1
  647. package/dist/esm/sync/syncModule.spec.native.js +0 -220
  648. package/dist/esm/sync/syncModule.spec.native.js.map +0 -1
  649. package/dist/esm/sync/types.spec.mjs +0 -247
  650. package/dist/esm/sync/types.spec.mjs.map +0 -1
  651. package/dist/esm/sync/types.spec.native.js +0 -254
  652. package/dist/esm/sync/types.spec.native.js.map +0 -1
  653. package/dist/esm/sync/virtualPageManager.spec.mjs +0 -802
  654. package/dist/esm/sync/virtualPageManager.spec.mjs.map +0 -1
  655. package/dist/esm/sync/virtualPageManager.spec.native.js +0 -871
  656. package/dist/esm/sync/virtualPageManager.spec.native.js.map +0 -1
  657. package/dist/esm/util.spec.mjs +0 -20
  658. package/dist/esm/util.spec.mjs.map +0 -1
  659. package/dist/esm/util.spec.native.js +0 -22
  660. package/dist/esm/util.spec.native.js.map +0 -1
  661. package/dist/jsx/auth.spec.mjs +0 -323
  662. package/dist/jsx/auth.spec.mjs.map +0 -1
  663. package/dist/jsx/auth.spec.native.js +0 -329
  664. package/dist/jsx/auth.spec.native.js.map +0 -1
  665. package/dist/jsx/call.spec.mjs +0 -428
  666. package/dist/jsx/call.spec.mjs.map +0 -1
  667. package/dist/jsx/call.spec.native.js +0 -430
  668. package/dist/jsx/call.spec.native.js.map +0 -1
  669. package/dist/jsx/collection.spec.mjs +0 -187
  670. package/dist/jsx/collection.spec.mjs.map +0 -1
  671. package/dist/jsx/collection.spec.native.js +0 -216
  672. package/dist/jsx/collection.spec.native.js.map +0 -1
  673. package/dist/jsx/common/types.spec.mjs +0 -267
  674. package/dist/jsx/common/types.spec.mjs.map +0 -1
  675. package/dist/jsx/common/types.spec.native.js +0 -271
  676. package/dist/jsx/common/types.spec.native.js.map +0 -1
  677. package/dist/jsx/core/http.spec.mjs +0 -1260
  678. package/dist/jsx/core/http.spec.mjs.map +0 -1
  679. package/dist/jsx/core/http.spec.native.js +0 -1401
  680. package/dist/jsx/core/http.spec.native.js.map +0 -1
  681. package/dist/jsx/core/wire.spec.mjs +0 -479
  682. package/dist/jsx/core/wire.spec.mjs.map +0 -1
  683. package/dist/jsx/core/wire.spec.native.js +0 -482
  684. package/dist/jsx/core/wire.spec.native.js.map +0 -1
  685. package/dist/jsx/db.spec.mjs +0 -863
  686. package/dist/jsx/db.spec.mjs.map +0 -1
  687. package/dist/jsx/db.spec.native.js +0 -865
  688. package/dist/jsx/db.spec.native.js.map +0 -1
  689. package/dist/jsx/doctype.spec.mjs +0 -461
  690. package/dist/jsx/doctype.spec.mjs.map +0 -1
  691. package/dist/jsx/doctype.spec.native.js +0 -538
  692. package/dist/jsx/doctype.spec.native.js.map +0 -1
  693. package/dist/jsx/file.spec.mjs +0 -316
  694. package/dist/jsx/file.spec.mjs.map +0 -1
  695. package/dist/jsx/file.spec.native.js +0 -342
  696. package/dist/jsx/file.spec.native.js.map +0 -1
  697. package/dist/jsx/frappeApp.spec.mjs +0 -307
  698. package/dist/jsx/frappeApp.spec.mjs.map +0 -1
  699. package/dist/jsx/frappeApp.spec.native.js +0 -308
  700. package/dist/jsx/frappeApp.spec.native.js.map +0 -1
  701. package/dist/jsx/frappeReact.spec.mjs +0 -532
  702. package/dist/jsx/frappeReact.spec.mjs.map +0 -1
  703. package/dist/jsx/frappeReact.spec.native.js +0 -670
  704. package/dist/jsx/frappeReact.spec.native.js.map +0 -1
  705. package/dist/jsx/optimistic.spec.mjs +0 -12
  706. package/dist/jsx/optimistic.spec.mjs.map +0 -1
  707. package/dist/jsx/optimistic.spec.native.js +0 -19
  708. package/dist/jsx/optimistic.spec.native.js.map +0 -1
  709. package/dist/jsx/pacer.spec.mjs +0 -447
  710. package/dist/jsx/pacer.spec.mjs.map +0 -1
  711. package/dist/jsx/pacer.spec.native.js +0 -537
  712. package/dist/jsx/pacer.spec.native.js.map +0 -1
  713. package/dist/jsx/realtime.spec.mjs +0 -327
  714. package/dist/jsx/realtime.spec.mjs.map +0 -1
  715. package/dist/jsx/realtime.spec.native.js +0 -392
  716. package/dist/jsx/realtime.spec.native.js.map +0 -1
  717. package/dist/jsx/sync/backfill.spec.mjs +0 -563
  718. package/dist/jsx/sync/backfill.spec.mjs.map +0 -1
  719. package/dist/jsx/sync/backfill.spec.native.js +0 -712
  720. package/dist/jsx/sync/backfill.spec.native.js.map +0 -1
  721. package/dist/jsx/sync/debug.spec.mjs +0 -102
  722. package/dist/jsx/sync/debug.spec.mjs.map +0 -1
  723. package/dist/jsx/sync/debug.spec.native.js +0 -133
  724. package/dist/jsx/sync/debug.spec.native.js.map +0 -1
  725. package/dist/jsx/sync/filters.spec.mjs +0 -169
  726. package/dist/jsx/sync/filters.spec.mjs.map +0 -1
  727. package/dist/jsx/sync/filters.spec.native.js +0 -173
  728. package/dist/jsx/sync/filters.spec.native.js.map +0 -1
  729. package/dist/jsx/sync/merge.spec.mjs +0 -909
  730. package/dist/jsx/sync/merge.spec.mjs.map +0 -1
  731. package/dist/jsx/sync/merge.spec.native.js +0 -937
  732. package/dist/jsx/sync/merge.spec.native.js.map +0 -1
  733. package/dist/jsx/sync/multiOrderBy.spec.mjs +0 -166
  734. package/dist/jsx/sync/multiOrderBy.spec.mjs.map +0 -1
  735. package/dist/jsx/sync/multiOrderBy.spec.native.js +0 -229
  736. package/dist/jsx/sync/multiOrderBy.spec.native.js.map +0 -1
  737. package/dist/jsx/sync/mutationEngine.spec.mjs +0 -1159
  738. package/dist/jsx/sync/mutationEngine.spec.mjs.map +0 -1
  739. package/dist/jsx/sync/mutationEngine.spec.native.js +0 -1173
  740. package/dist/jsx/sync/mutationEngine.spec.native.js.map +0 -1
  741. package/dist/jsx/sync/mutationJournal.spec.mjs +0 -331
  742. package/dist/jsx/sync/mutationJournal.spec.mjs.map +0 -1
  743. package/dist/jsx/sync/mutationJournal.spec.native.js +0 -333
  744. package/dist/jsx/sync/mutationJournal.spec.native.js.map +0 -1
  745. package/dist/jsx/sync/mutations.spec.mjs +0 -328
  746. package/dist/jsx/sync/mutations.spec.mjs.map +0 -1
  747. package/dist/jsx/sync/mutations.spec.native.js +0 -330
  748. package/dist/jsx/sync/mutations.spec.native.js.map +0 -1
  749. package/dist/jsx/sync/normalizedCache.spec.mjs +0 -303
  750. package/dist/jsx/sync/normalizedCache.spec.mjs.map +0 -1
  751. package/dist/jsx/sync/normalizedCache.spec.native.js +0 -311
  752. package/dist/jsx/sync/normalizedCache.spec.native.js.map +0 -1
  753. package/dist/jsx/sync/persistence.spec.mjs +0 -563
  754. package/dist/jsx/sync/persistence.spec.mjs.map +0 -1
  755. package/dist/jsx/sync/persistence.spec.native.js +0 -572
  756. package/dist/jsx/sync/persistence.spec.native.js.map +0 -1
  757. package/dist/jsx/sync/realtime.spec.mjs +0 -500
  758. package/dist/jsx/sync/realtime.spec.mjs.map +0 -1
  759. package/dist/jsx/sync/realtime.spec.native.js +0 -512
  760. package/dist/jsx/sync/realtime.spec.native.js.map +0 -1
  761. package/dist/jsx/sync/rehydration.spec.mjs +0 -732
  762. package/dist/jsx/sync/rehydration.spec.mjs.map +0 -1
  763. package/dist/jsx/sync/rehydration.spec.native.js +0 -736
  764. package/dist/jsx/sync/rehydration.spec.native.js.map +0 -1
  765. package/dist/jsx/sync/storage.spec.mjs +0 -423
  766. package/dist/jsx/sync/storage.spec.mjs.map +0 -1
  767. package/dist/jsx/sync/storage.spec.native.js +0 -470
  768. package/dist/jsx/sync/storage.spec.native.js.map +0 -1
  769. package/dist/jsx/sync/subscriptionManager.spec.mjs +0 -1079
  770. package/dist/jsx/sync/subscriptionManager.spec.mjs.map +0 -1
  771. package/dist/jsx/sync/subscriptionManager.spec.native.js +0 -1136
  772. package/dist/jsx/sync/subscriptionManager.spec.native.js.map +0 -1
  773. package/dist/jsx/sync/subscriptions.spec.mjs +0 -914
  774. package/dist/jsx/sync/subscriptions.spec.mjs.map +0 -1
  775. package/dist/jsx/sync/subscriptions.spec.native.js +0 -969
  776. package/dist/jsx/sync/subscriptions.spec.native.js.map +0 -1
  777. package/dist/jsx/sync/syncModule.spec.mjs +0 -207
  778. package/dist/jsx/sync/syncModule.spec.mjs.map +0 -1
  779. package/dist/jsx/sync/syncModule.spec.native.js +0 -222
  780. package/dist/jsx/sync/syncModule.spec.native.js.map +0 -1
  781. package/dist/jsx/sync/types.spec.mjs +0 -247
  782. package/dist/jsx/sync/types.spec.mjs.map +0 -1
  783. package/dist/jsx/sync/types.spec.native.js +0 -256
  784. package/dist/jsx/sync/types.spec.native.js.map +0 -1
  785. package/dist/jsx/sync/virtualPageManager.spec.mjs +0 -802
  786. package/dist/jsx/sync/virtualPageManager.spec.mjs.map +0 -1
  787. package/dist/jsx/sync/virtualPageManager.spec.native.js +0 -873
  788. package/dist/jsx/sync/virtualPageManager.spec.native.js.map +0 -1
  789. package/dist/jsx/util.spec.mjs +0 -20
  790. package/dist/jsx/util.spec.mjs.map +0 -1
  791. package/dist/jsx/util.spec.native.js +0 -48
  792. package/dist/jsx/util.spec.native.js.map +0 -1
@@ -1,1079 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- import { SubscriptionManager } from "./subscriptionManager.mjs";
3
- import { BackfillScope } from "./types.mjs";
4
- import { Order } from "./types.mjs";
5
- import * as filters from "./filters.mjs";
6
- describe("SubscriptionManager", () => {
7
- let subscriptionManager;
8
- let mockDb;
9
- let mockNormalizedCache;
10
- const mockDoc = {
11
- name: "test-doc",
12
- doctype: "TestDoc",
13
- title: "Test Document",
14
- modified: "2024-01-01T10:00:00",
15
- creation: "2024-01-01T09:00:00",
16
- owner: "test-user",
17
- modified_by: "test-user"
18
- };
19
- const mockDocs = [{
20
- name: "doc1",
21
- doctype: "TestDoc",
22
- modified: "2024-01-01T09:00:00",
23
- title: "Document 1"
24
- }, {
25
- name: "doc2",
26
- doctype: "TestDoc",
27
- modified: "2024-01-01T10:00:00",
28
- title: "Document 2"
29
- }, {
30
- name: "doc3",
31
- doctype: "TestDoc",
32
- modified: "2024-01-01T11:00:00",
33
- title: "Document 3"
34
- }];
35
- let uuidCount = 0;
36
- beforeEach(() => {
37
- uuidCount = 0;
38
- vi.spyOn(filters, "matchesFilters").mockReturnValue(true);
39
- vi.spyOn(filters, "extractSingleName").mockReturnValue(void 0);
40
- mockDb = {
41
- getDoc: vi.fn().mockResolvedValue(mockDoc),
42
- getDocList: vi.fn().mockResolvedValue(mockDocs),
43
- backfill: vi.fn().mockResolvedValue({
44
- rows: [],
45
- checkpoint: "2024-01-01T12:00:00"
46
- })
47
- };
48
- mockNormalizedCache = {
49
- upsert: vi.fn(),
50
- get: vi.fn().mockImplementation(({
51
- name
52
- }) => {
53
- return mockDocs.find(doc => doc.name === name) || mockDoc;
54
- }),
55
- remove: vi.fn()
56
- };
57
- Object.defineProperty(global, "crypto", {
58
- value: {
59
- randomUUID: vi.fn().mockImplementation(() => `uuid-${++uuidCount}`)
60
- },
61
- writable: true
62
- });
63
- });
64
- afterEach(() => {
65
- vi.restoreAllMocks();
66
- });
67
- describe("constructor", () => {
68
- it("should initialize with default options", () => {
69
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
70
- expect(subscriptionManager).toBeDefined();
71
- });
72
- it("should initialize with custom options", () => {
73
- const options = {
74
- pageSize: 50,
75
- useCursorPagination: true,
76
- onBackfill: vi.fn()
77
- };
78
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache, options);
79
- expect(subscriptionManager).toBeDefined();
80
- });
81
- });
82
- describe("subscribe", () => {
83
- beforeEach(() => {
84
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
85
- });
86
- it("should create a subscription successfully", async () => {
87
- const query = {
88
- doctype: "TestDoc",
89
- fields: ["title", "description"],
90
- filters: {
91
- status: "Active"
92
- },
93
- orderBy: {
94
- field: "modified",
95
- order: Order.Desc
96
- },
97
- limit: 20
98
- };
99
- const result = await subscriptionManager.subscribe(query);
100
- expect(result.subscriptionId).toBe("uuid-1");
101
- expect(result.rows).toEqual(mockDocs);
102
- expect(result.checkpoint).toBe("2024-01-01T11:00:00");
103
- expect(mockDb.getDocList).toHaveBeenCalledWith("TestDoc", {
104
- fields: ["title", "description", "modified", "name"],
105
- filters: {
106
- status: "Active"
107
- },
108
- orderBy: {
109
- field: "modified",
110
- order: Order.Desc
111
- }
112
- });
113
- });
114
- it("should handle single document queries", async () => {
115
- filters.extractSingleName.mockReturnValue("specific-doc");
116
- const query = {
117
- doctype: "TestDoc",
118
- fields: ["*"],
119
- filters: {
120
- name: "specific-doc"
121
- }
122
- };
123
- const result = await subscriptionManager.subscribe(query);
124
- expect(mockDb.getDoc).toHaveBeenCalledWith("TestDoc", "specific-doc");
125
- expect(result.rows).toEqual([mockDoc]);
126
- });
127
- it("should handle single document query errors", async () => {
128
- filters.extractSingleName.mockReturnValue("non-existent-doc");
129
- mockDb.getDoc.mockRejectedValue(Object.assign(new Error("Document not found"), {
130
- status: 404
131
- }));
132
- const query = {
133
- doctype: "TestDoc",
134
- fields: ["*"],
135
- filters: {
136
- name: "non-existent-doc"
137
- }
138
- };
139
- const result = await subscriptionManager.subscribe(query);
140
- expect(result.rows).toEqual([]);
141
- });
142
- it("should handle cursor pagination", async () => {
143
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache, {
144
- useCursorPagination: true
145
- });
146
- mockDb.getDocList.mockResolvedValue({
147
- data: mockDocs,
148
- cursor: "cursor-123"
149
- });
150
- const query = {
151
- doctype: "TestDoc",
152
- fields: ["*"],
153
- limit: 20
154
- };
155
- const result = await subscriptionManager.subscribe(query);
156
- expect(mockDb.getDocList).toHaveBeenCalledWith("TestDoc", {
157
- fields: ["*", "modified", "name"],
158
- cursor: void 0
159
- });
160
- expect(result.rows).toEqual(mockDocs);
161
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
162
- expect(subscription?.cursor).toBe("cursor-123");
163
- });
164
- it("should seed normalized cache with returned documents", async () => {
165
- const query = {
166
- doctype: "TestDoc",
167
- fields: ["*"]
168
- };
169
- await subscriptionManager.subscribe(query);
170
- expect(mockNormalizedCache.upsert).toHaveBeenCalledTimes(3);
171
- for (const doc of mockDocs) {
172
- expect(mockNormalizedCache.upsert).toHaveBeenCalledWith(doc);
173
- }
174
- });
175
- it("should compute checkpoint as max modified time", async () => {
176
- const query = {
177
- doctype: "TestDoc",
178
- fields: ["*"]
179
- };
180
- const result = await subscriptionManager.subscribe(query);
181
- expect(result.checkpoint).toBe("2024-01-01T11:00:00");
182
- });
183
- it("should set page boundaries", async () => {
184
- const query = {
185
- doctype: "TestDoc",
186
- fields: ["*"],
187
- limitStart: 10,
188
- limit: 15
189
- };
190
- const result = await subscriptionManager.subscribe(query);
191
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
192
- expect(subscription?.boundaries).toEqual({
193
- firstItem: mockDocs[0],
194
- lastItem: mockDocs[2],
195
- offset: 10,
196
- pageSize: 15
197
- });
198
- });
199
- it("should initialize metadata", async () => {
200
- const query = {
201
- doctype: "TestDoc",
202
- fields: ["*"]
203
- };
204
- const result = await subscriptionManager.subscribe(query);
205
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
206
- expect(subscription?.metadata).toEqual({
207
- itemsBeforePage: 0,
208
- itemsAfterPage: 0
209
- });
210
- });
211
- it("should handle empty results", async () => {
212
- mockDb.getDocList.mockResolvedValue([]);
213
- const query = {
214
- doctype: "TestDoc",
215
- fields: ["*"]
216
- };
217
- const result = await subscriptionManager.subscribe(query);
218
- expect(result.rows).toEqual([]);
219
- expect(result.checkpoint).toBeUndefined();
220
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
221
- expect(subscription?.boundaries).toBeUndefined();
222
- });
223
- });
224
- describe("unsubscribe", () => {
225
- beforeEach(() => {
226
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
227
- });
228
- it("should remove subscription", async () => {
229
- const query = {
230
- doctype: "TestDoc",
231
- fields: ["*"]
232
- };
233
- const result = await subscriptionManager.subscribe(query);
234
- expect(subscriptionManager.getSubscription(result.subscriptionId)).toBeDefined();
235
- subscriptionManager.unsubscribe(result.subscriptionId);
236
- expect(subscriptionManager.getSubscription(result.subscriptionId)).toBeUndefined();
237
- });
238
- it("should handle non-existent subscription", () => {
239
- expect(() => {
240
- subscriptionManager.unsubscribe("non-existent");
241
- }).not.toThrow();
242
- });
243
- });
244
- describe("getDocsForSubscription", () => {
245
- beforeEach(() => {
246
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
247
- });
248
- it("should return documents from virtual page system when available", async () => {
249
- const virtualPageManager = subscriptionManager.virtualPageManager;
250
- vi.spyOn(virtualPageManager, "getSubscription").mockReturnValue({
251
- query: {
252
- doctype: "TestDoc"
253
- },
254
- getProgressiveCache: () => ({
255
- docIds: ["doc1", "doc2"]
256
- })
257
- });
258
- const query = {
259
- doctype: "TestDoc",
260
- fields: ["*"]
261
- };
262
- const result = await subscriptionManager.subscribe(query);
263
- const docs = subscriptionManager.getDocsForSubscription(result.subscriptionId);
264
- expect(docs).toHaveLength(2);
265
- });
266
- it("should resolve documents from the standard subscription map when virtual pages are absent", async () => {
267
- const query = {
268
- doctype: "TestDoc",
269
- fields: ["*"]
270
- };
271
- const result = await subscriptionManager.subscribe(query);
272
- const docs = subscriptionManager.getDocsForSubscription(result.subscriptionId);
273
- expect(docs).toHaveLength(3);
274
- });
275
- it("should return empty array for non-existent subscription", () => {
276
- const docs = subscriptionManager.getDocsForSubscription("non-existent");
277
- expect(docs).toEqual([]);
278
- });
279
- it("should handle missing documents in cache", async () => {
280
- mockNormalizedCache.get.mockReturnValue(void 0);
281
- const query = {
282
- doctype: "TestDoc",
283
- fields: ["*"]
284
- };
285
- const result = await subscriptionManager.subscribe(query);
286
- const docs = subscriptionManager.getDocsForSubscription(result.subscriptionId);
287
- expect(docs).toEqual([]);
288
- });
289
- });
290
- describe("virtual pagination methods", () => {
291
- beforeEach(() => {
292
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
293
- });
294
- it("should delegate getPage to virtual page system", async () => {
295
- const virtualPageManager = subscriptionManager.virtualPageManager;
296
- const mockPageData = [mockDoc];
297
- vi.spyOn(virtualPageManager, "getPage").mockResolvedValue(mockPageData);
298
- const result = await subscriptionManager.getPage("sub1", 2);
299
- expect(virtualPageManager.getPage).toHaveBeenCalledWith("sub1", 2);
300
- expect(result).toEqual(mockPageData);
301
- });
302
- it("should delegate getNextBatch to virtual page system", async () => {
303
- const virtualPageManager = subscriptionManager.virtualPageManager;
304
- const mockAfterData = [mockDoc];
305
- vi.spyOn(virtualPageManager, "getNextBatch").mockResolvedValue(mockAfterData);
306
- const result = await subscriptionManager.getNextBatch("sub1", "cursor-doc", 10);
307
- expect(virtualPageManager.getNextBatch).toHaveBeenCalledWith("sub1", "cursor-doc", 10);
308
- expect(result).toEqual(mockAfterData);
309
- });
310
- it("should delegate getPageInfo to virtual page system", () => {
311
- const virtualPageManager = subscriptionManager.virtualPageManager;
312
- const mockPageInfo = {
313
- currentPage: 2,
314
- pageSize: 20,
315
- totalPages: 5,
316
- hasMore: true,
317
- itemsInCache: 100
318
- };
319
- vi.spyOn(virtualPageManager, "getPageInfo").mockReturnValue(mockPageInfo);
320
- const result = subscriptionManager.getPageInfo("sub1");
321
- expect(virtualPageManager.getPageInfo).toHaveBeenCalledWith("sub1");
322
- expect(result).toEqual(mockPageInfo);
323
- });
324
- });
325
- describe("backfill", () => {
326
- beforeEach(() => {
327
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache, {
328
- pageSize: 100,
329
- onBackfill: vi.fn()
330
- });
331
- });
332
- it("should backfill all subscriptions", async () => {
333
- const query1 = {
334
- doctype: "TestDoc",
335
- fields: ["*"]
336
- };
337
- const query2 = {
338
- doctype: "OtherDoc",
339
- fields: ["*"]
340
- };
341
- await subscriptionManager.subscribe(query1);
342
- await subscriptionManager.subscribe(query2);
343
- const backfillSpy = vi.spyOn(subscriptionManager, "backfillSub");
344
- await subscriptionManager.backfill({
345
- scope: BackfillScope.All
346
- });
347
- expect(backfillSpy).toHaveBeenCalledTimes(2);
348
- });
349
- it("should backfill specific subscriptions", async () => {
350
- const result1 = await subscriptionManager.subscribe({
351
- doctype: "TestDoc",
352
- fields: ["*"]
353
- });
354
- const _result2 = await subscriptionManager.subscribe({
355
- doctype: "OtherDoc",
356
- fields: ["*"]
357
- });
358
- const backfillSpy = vi.spyOn(subscriptionManager, "backfillSub");
359
- await subscriptionManager.backfill({
360
- scope: BackfillScope.Subscriptions,
361
- subscriptions: [result1.subscriptionId]
362
- });
363
- expect(backfillSpy).toHaveBeenCalledTimes(1);
364
- });
365
- it("should backfill by doctypes", async () => {
366
- await subscriptionManager.subscribe({
367
- doctype: "TestDoc",
368
- fields: ["*"]
369
- });
370
- await subscriptionManager.subscribe({
371
- doctype: "OtherDoc",
372
- fields: ["*"]
373
- });
374
- const backfillSpy = vi.spyOn(subscriptionManager, "backfillSub");
375
- await subscriptionManager.backfill({
376
- scope: BackfillScope.Doctypes,
377
- doctypes: ["TestDoc"]
378
- });
379
- expect(backfillSpy).toHaveBeenCalledTimes(1);
380
- });
381
- it("should backfill specific documents", async () => {
382
- const docTargets = [{
383
- doctype: "TestDoc",
384
- name: "doc1"
385
- }, {
386
- doctype: "TestDoc",
387
- name: "doc2"
388
- }];
389
- await subscriptionManager.backfill({
390
- scope: BackfillScope.Docs,
391
- docs: docTargets
392
- });
393
- expect(mockDb.getDoc).toHaveBeenCalledWith("TestDoc", "doc1");
394
- expect(mockDb.getDoc).toHaveBeenCalledWith("TestDoc", "doc2");
395
- expect(mockNormalizedCache.upsert).toHaveBeenCalledTimes(2);
396
- });
397
- });
398
- describe("backfillSub", () => {
399
- beforeEach(() => {
400
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache, {
401
- onBackfill: vi.fn()
402
- });
403
- });
404
- it("should perform CDC backfill for subscription", async () => {
405
- const result = await subscriptionManager.subscribe({
406
- doctype: "TestDoc",
407
- fields: ["*"],
408
- filters: {
409
- status: "Active"
410
- }
411
- });
412
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
413
- const backfillResponse = {
414
- rows: [{
415
- name: "doc4",
416
- doctype: "TestDoc",
417
- modified: "2024-01-02T10:00:00"
418
- }],
419
- checkpoint: "2024-01-02T10:00:00"
420
- };
421
- mockDb.backfill.mockResolvedValue(backfillResponse);
422
- await subscriptionManager.backfillSub(subscription);
423
- expect(mockDb.backfill).toHaveBeenCalledWith({
424
- doctype: "TestDoc",
425
- fields: ["*"],
426
- filters: {
427
- status: "Active"
428
- },
429
- modifiedAfter: "2024-01-01T11:00:00",
430
- limit: 200
431
- // Default pageSize
432
- });
433
- expect(subscription.checkpoint).toBe("2024-01-02T10:00:00");
434
- });
435
- it("should handle tombstones (deleted documents)", async () => {
436
- const result = await subscriptionManager.subscribe({
437
- doctype: "TestDoc",
438
- fields: ["*"]
439
- });
440
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
441
- const backfillResponse = {
442
- rows: [],
443
- deleted: [{
444
- doctype: "TestDoc",
445
- name: "doc2"
446
- }],
447
- checkpoint: "2024-01-02T10:00:00"
448
- };
449
- mockDb.backfill.mockResolvedValue(backfillResponse);
450
- await subscriptionManager.backfillSub(subscription);
451
- expect(mockNormalizedCache.remove).toHaveBeenCalledWith({
452
- doctype: "TestDoc",
453
- name: "doc2"
454
- });
455
- expect(subscription.docIds).not.toContain("doc2");
456
- expect(subscription.tombstones?.has("doc2")).toBe(true);
457
- });
458
- it("should reconcile membership with filters", async () => {
459
- const result = await subscriptionManager.subscribe({
460
- doctype: "TestDoc",
461
- fields: ["*"],
462
- filters: {
463
- status: "Active"
464
- }
465
- });
466
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
467
- const newDoc = {
468
- name: "doc4",
469
- doctype: "TestDoc",
470
- status: "Active",
471
- modified: "2024-01-02T10:00:00"
472
- };
473
- const backfillResponse = {
474
- rows: [newDoc],
475
- checkpoint: "2024-01-02T10:00:00"
476
- };
477
- mockDb.backfill.mockResolvedValue(backfillResponse);
478
- filters.matchesFilters.mockReturnValue(true);
479
- await subscriptionManager.backfillSub(subscription);
480
- expect(subscription.docIds).toContain("doc4");
481
- });
482
- it("should remove documents that no longer match filters", async () => {
483
- const result = await subscriptionManager.subscribe({
484
- doctype: "TestDoc",
485
- fields: ["*"],
486
- filters: {
487
- status: "Active"
488
- }
489
- });
490
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
491
- const updatedDoc = {
492
- name: "doc1",
493
- doctype: "TestDoc",
494
- status: "Inactive",
495
- modified: "2024-01-02T10:00:00"
496
- };
497
- const backfillResponse = {
498
- rows: [updatedDoc],
499
- checkpoint: "2024-01-02T10:00:00"
500
- };
501
- mockDb.backfill.mockResolvedValue(backfillResponse);
502
- filters.matchesFilters.mockReturnValue(false);
503
- await subscriptionManager.backfillSub(subscription);
504
- expect(subscription.docIds).not.toContain("doc1");
505
- });
506
- it("should update page boundaries after backfill", async () => {
507
- const result = await subscriptionManager.subscribe({
508
- doctype: "TestDoc",
509
- fields: ["*"]
510
- });
511
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
512
- await subscriptionManager.backfillSub(subscription);
513
- expect(subscription.boundaries).toBeDefined();
514
- });
515
- it("should call onBackfill callback", async () => {
516
- const onBackfill = vi.fn();
517
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache, {
518
- onBackfill
519
- });
520
- const result = await subscriptionManager.subscribe({
521
- doctype: "TestDoc",
522
- fields: ["*"]
523
- });
524
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
525
- await subscriptionManager.backfillSub(subscription);
526
- expect(onBackfill).toHaveBeenCalledWith({
527
- doctype: "TestDoc",
528
- fetched: 0,
529
- checkpoint: "2024-01-01T12:00:00"
530
- });
531
- });
532
- it("should handle queries without filters", async () => {
533
- const result = await subscriptionManager.subscribe({
534
- doctype: "TestDoc",
535
- fields: ["*"]
536
- });
537
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
538
- const backfillResponse = {
539
- rows: [{
540
- name: "doc4",
541
- doctype: "TestDoc"
542
- }, {
543
- name: "doc5",
544
- doctype: "TestDoc"
545
- }],
546
- checkpoint: "2024-01-02T10:00:00"
547
- };
548
- mockDb.backfill.mockResolvedValue(backfillResponse);
549
- await subscriptionManager.backfillSub(subscription);
550
- expect(subscription.docIds).toEqual(["doc4", "doc5"]);
551
- });
552
- });
553
- describe("resortSubscriptionDocIds", () => {
554
- beforeEach(() => {
555
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
556
- });
557
- it("should sort by orderBy field ascending", async () => {
558
- const result = await subscriptionManager.subscribe({
559
- doctype: "TestDoc",
560
- fields: ["*"],
561
- orderBy: {
562
- field: "modified",
563
- order: Order.Asc
564
- }
565
- });
566
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
567
- subscriptionManager.resortSubscriptionDocIds(subscription);
568
- expect(subscription.docIds).toEqual(["doc1", "doc2", "doc3"]);
569
- });
570
- it("should sort by orderBy field descending", async () => {
571
- const result = await subscriptionManager.subscribe({
572
- doctype: "TestDoc",
573
- fields: ["*"],
574
- orderBy: {
575
- field: "modified",
576
- order: Order.Desc
577
- }
578
- });
579
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
580
- subscriptionManager.resortSubscriptionDocIds(subscription);
581
- expect(subscription.docIds).toEqual(["doc3", "doc2", "doc1"]);
582
- });
583
- it("should handle documents with null values", async () => {
584
- const docWithNull = {
585
- name: "doc4",
586
- doctype: "TestDoc",
587
- modified: null
588
- };
589
- mockNormalizedCache.get.mockImplementation(({
590
- name
591
- }) => {
592
- if (name === "doc4") return docWithNull;
593
- return mockDocs.find(doc => doc.name === name);
594
- });
595
- const result = await subscriptionManager.subscribe({
596
- doctype: "TestDoc",
597
- fields: ["*"],
598
- orderBy: {
599
- field: "modified",
600
- order: Order.Asc
601
- }
602
- });
603
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
604
- subscription.docIds = ["doc1", "doc4", "doc2"];
605
- subscriptionManager.resortSubscriptionDocIds(subscription);
606
- expect(subscription.docIds[0]).toBe("doc4");
607
- });
608
- it("should use name as tiebreaker", async () => {
609
- const docsWithSameModified = [{
610
- name: "doc-b",
611
- doctype: "TestDoc",
612
- modified: "2024-01-01T10:00:00"
613
- }, {
614
- name: "doc-a",
615
- doctype: "TestDoc",
616
- modified: "2024-01-01T10:00:00"
617
- }, {
618
- name: "doc-c",
619
- doctype: "TestDoc",
620
- modified: "2024-01-01T10:00:00"
621
- }];
622
- mockNormalizedCache.get.mockImplementation(({
623
- name
624
- }) => {
625
- return docsWithSameModified.find(doc => doc.name === name);
626
- });
627
- const result = await subscriptionManager.subscribe({
628
- doctype: "TestDoc",
629
- fields: ["*"],
630
- orderBy: {
631
- field: "modified",
632
- order: Order.Asc
633
- }
634
- });
635
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
636
- subscription.docIds = ["doc-b", "doc-a", "doc-c"];
637
- subscriptionManager.resortSubscriptionDocIds(subscription);
638
- expect(subscription.docIds).toEqual(["doc-a", "doc-b", "doc-c"]);
639
- });
640
- it("should skip sorting when no orderBy", async () => {
641
- const result = await subscriptionManager.subscribe({
642
- doctype: "TestDoc",
643
- fields: ["*"]
644
- });
645
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
646
- const originalOrder = [...subscription.docIds];
647
- subscriptionManager.resortSubscriptionDocIds(subscription);
648
- expect(subscription.docIds).toEqual(originalOrder);
649
- });
650
- });
651
- describe("updateSubscriptionMembership", () => {
652
- beforeEach(() => {
653
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
654
- });
655
- it("should return subscriptions needing rehydration for new documents", async () => {
656
- const result = await subscriptionManager.subscribe({
657
- doctype: "TestDoc",
658
- fields: ["*"],
659
- filters: {
660
- status: "Active"
661
- }
662
- });
663
- const newDoc = {
664
- name: "new-doc",
665
- doctype: "TestDoc",
666
- status: "Active"
667
- };
668
- filters.matchesFilters.mockReturnValue(true);
669
- const needsRehydration = subscriptionManager.updateSubscriptionMembership(newDoc);
670
- expect(needsRehydration).toHaveLength(1);
671
- expect(needsRehydration[0]).toBe(subscriptionManager.getSubscription(result.subscriptionId));
672
- });
673
- it("should remove documents that no longer match filters", async () => {
674
- const result = await subscriptionManager.subscribe({
675
- doctype: "TestDoc",
676
- fields: ["*"],
677
- filters: {
678
- status: "Active"
679
- }
680
- });
681
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
682
- const updatedDoc = {
683
- name: "doc1",
684
- doctype: "TestDoc",
685
- status: "Inactive"
686
- };
687
- filters.matchesFilters.mockReturnValue(false);
688
- subscriptionManager.updateSubscriptionMembership(updatedDoc);
689
- expect(subscription.docIds).not.toContain("doc1");
690
- });
691
- it("should resort existing documents", async () => {
692
- const result = await subscriptionManager.subscribe({
693
- doctype: "TestDoc",
694
- fields: ["*"],
695
- orderBy: {
696
- field: "modified",
697
- order: Order.Desc
698
- }
699
- });
700
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
701
- const resortSpy = vi.spyOn(subscriptionManager, "resortSubscriptionDocIds");
702
- const existingDoc = {
703
- name: "doc2",
704
- doctype: "TestDoc",
705
- modified: "2024-01-02T10:00:00"
706
- // Updated time
707
- };
708
- filters.matchesFilters.mockReturnValue(true);
709
- subscriptionManager.updateSubscriptionMembership(existingDoc);
710
- expect(resortSpy).toHaveBeenCalledWith(subscription);
711
- });
712
- it("should skip subscriptions with different doctypes", async () => {
713
- await subscriptionManager.subscribe({
714
- doctype: "TestDoc",
715
- fields: ["*"]
716
- });
717
- const needsRehydration = subscriptionManager.updateSubscriptionMembership({
718
- name: "other-doc",
719
- doctype: "OtherDoc"
720
- });
721
- expect(needsRehydration).toEqual([]);
722
- });
723
- });
724
- describe("removeFromAllSubscriptions", () => {
725
- beforeEach(() => {
726
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
727
- });
728
- it("should remove document from all matching subscriptions", async () => {
729
- const result1 = await subscriptionManager.subscribe({
730
- doctype: "TestDoc",
731
- fields: ["*"]
732
- });
733
- const result2 = await subscriptionManager.subscribe({
734
- doctype: "TestDoc",
735
- fields: ["title"]
736
- });
737
- const affectedSubs = subscriptionManager.removeFromAllSubscriptions("TestDoc", "doc2");
738
- expect(affectedSubs).toHaveLength(2);
739
- const sub1 = subscriptionManager.getSubscription(result1.subscriptionId);
740
- const sub2 = subscriptionManager.getSubscription(result2.subscriptionId);
741
- expect(sub1.docIds).not.toContain("doc2");
742
- expect(sub2.docIds).not.toContain("doc2");
743
- });
744
- it("should return empty array when document not in any subscription", async () => {
745
- await subscriptionManager.subscribe({
746
- doctype: "TestDoc",
747
- fields: ["*"]
748
- });
749
- const affectedSubs = subscriptionManager.removeFromAllSubscriptions("TestDoc", "non-existent");
750
- expect(affectedSubs).toEqual([]);
751
- });
752
- it("should skip subscriptions with different doctypes", async () => {
753
- await subscriptionManager.subscribe({
754
- doctype: "OtherDoc",
755
- fields: ["*"]
756
- });
757
- const affectedSubs = subscriptionManager.removeFromAllSubscriptions("TestDoc", "doc1");
758
- expect(affectedSubs).toEqual([]);
759
- });
760
- });
761
- describe("utility methods", () => {
762
- beforeEach(() => {
763
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
764
- });
765
- it("should get all subscriptions", async () => {
766
- await subscriptionManager.subscribe({
767
- doctype: "TestDoc",
768
- fields: ["*"]
769
- });
770
- await subscriptionManager.subscribe({
771
- doctype: "OtherDoc",
772
- fields: ["*"]
773
- });
774
- const allSubs = subscriptionManager.getAllSubscriptions();
775
- expect(allSubs.size).toBe(2);
776
- });
777
- it("should clear all subscriptions", async () => {
778
- await subscriptionManager.subscribe({
779
- doctype: "TestDoc",
780
- fields: ["*"]
781
- });
782
- await subscriptionManager.subscribe({
783
- doctype: "OtherDoc",
784
- fields: ["*"]
785
- });
786
- subscriptionManager.clear();
787
- expect(subscriptionManager.getAllSubscriptions().size).toBe(0);
788
- });
789
- });
790
- describe("crypto ID generation", () => {
791
- it("should use crypto.randomUUID when available", async () => {
792
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
793
- const result = await subscriptionManager.subscribe({
794
- doctype: "TestDoc",
795
- fields: ["*"]
796
- });
797
- expect(result.subscriptionId).toBe("uuid-1");
798
- expect(crypto.randomUUID).toHaveBeenCalled();
799
- });
800
- it("should fallback to Math.random when crypto not available", async () => {
801
- global.crypto = void 0;
802
- vi.spyOn(Math, "random").mockReturnValue(0.123456789);
803
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
804
- const result = await subscriptionManager.subscribe({
805
- doctype: "TestDoc",
806
- fields: ["*"]
807
- });
808
- expect(result.subscriptionId).toBe("4fzzzxjylrx");
809
- expect(Math.random).toHaveBeenCalled();
810
- });
811
- });
812
- describe("edge cases and error handling", () => {
813
- beforeEach(() => {
814
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
815
- });
816
- it("should handle backfill response without checkpoint", async () => {
817
- const result = await subscriptionManager.subscribe({
818
- doctype: "TestDoc",
819
- fields: ["*"]
820
- });
821
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
822
- const originalCheckpoint = subscription.checkpoint;
823
- mockDb.backfill.mockResolvedValue({
824
- rows: []
825
- // No checkpoint field
826
- });
827
- await subscriptionManager.backfillSub(subscription);
828
- expect(subscription.checkpoint).toBe(originalCheckpoint);
829
- });
830
- it("should handle documents without modified field", async () => {
831
- const docsWithoutModified = [{
832
- name: "doc1",
833
- doctype: "TestDoc",
834
- title: "Doc 1"
835
- }, {
836
- name: "doc2",
837
- doctype: "TestDoc",
838
- title: "Doc 2"
839
- }];
840
- mockDb.getDocList.mockResolvedValue(docsWithoutModified);
841
- const result = await subscriptionManager.subscribe({
842
- doctype: "TestDoc",
843
- fields: ["*"]
844
- });
845
- expect(result.checkpoint).toBeUndefined();
846
- });
847
- it("should handle missing documents during membership update", () => {
848
- mockNormalizedCache.get.mockReturnValue(void 0);
849
- const result = subscriptionManager.updateSubscriptionMembership({
850
- name: "missing-doc",
851
- doctype: "TestDoc"
852
- });
853
- expect(result).toEqual([]);
854
- });
855
- it("should handle tombstones with invalid data", async () => {
856
- const result = await subscriptionManager.subscribe({
857
- doctype: "TestDoc",
858
- fields: ["*"]
859
- });
860
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
861
- const backfillResponse = {
862
- rows: [],
863
- deleted: [null,
864
- // Invalid tombstone
865
- {
866
- doctype: "TestDoc"
867
- },
868
- // Missing name
869
- {
870
- name: "doc2"
871
- },
872
- // Missing doctype
873
- {
874
- doctype: "TestDoc",
875
- name: "doc2"
876
- }
877
- // Valid
878
- ],
879
- checkpoint: "2024-01-02T10:00:00"
880
- };
881
- mockDb.backfill.mockResolvedValue(backfillResponse);
882
- await subscriptionManager.backfillSub(subscription);
883
- expect(subscription.tombstones?.has("doc2")).toBe(true);
884
- expect(subscription.tombstones?.size).toBe(1);
885
- });
886
- it("should handle backfill rows without names", async () => {
887
- const result = await subscriptionManager.subscribe({
888
- doctype: "TestDoc",
889
- fields: ["*"]
890
- });
891
- const subscription = subscriptionManager.getSubscription(result.subscriptionId);
892
- const backfillResponse = {
893
- rows: [{
894
- doctype: "TestDoc",
895
- title: "No name"
896
- },
897
- // Missing name
898
- {
899
- name: "doc4",
900
- doctype: "TestDoc"
901
- }
902
- // Valid
903
- ],
904
- checkpoint: "2024-01-02T10:00:00"
905
- };
906
- mockDb.backfill.mockResolvedValue(backfillResponse);
907
- await subscriptionManager.backfillSub(subscription);
908
- expect(subscription.docIds).toContain("doc4");
909
- });
910
- });
911
- describe("subscription deduplication", () => {
912
- beforeEach(() => {
913
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
914
- });
915
- it("should return the same subscriptionId for identical queries", async () => {
916
- const query = {
917
- doctype: "TestDoc",
918
- fields: ["title"],
919
- filters: {
920
- status: "Active"
921
- }
922
- };
923
- const first = await subscriptionManager.subscribe(query);
924
- const second = await subscriptionManager.subscribe(query);
925
- expect(second.subscriptionId).toBe(first.subscriptionId);
926
- expect(mockDb.getDocList).toHaveBeenCalledTimes(1);
927
- });
928
- it("should create separate subscriptions for different queries", async () => {
929
- const query1 = {
930
- doctype: "TestDoc",
931
- filters: {
932
- status: "Active"
933
- }
934
- };
935
- const query2 = {
936
- doctype: "TestDoc",
937
- filters: {
938
- status: "Draft"
939
- }
940
- };
941
- const first = await subscriptionManager.subscribe(query1);
942
- const second = await subscriptionManager.subscribe(query2);
943
- expect(second.subscriptionId).not.toBe(first.subscriptionId);
944
- expect(mockDb.getDocList).toHaveBeenCalledTimes(2);
945
- });
946
- it("should return cached docs on dedup hit", async () => {
947
- const query = {
948
- doctype: "TestDoc"
949
- };
950
- const first = await subscriptionManager.subscribe(query);
951
- const second = await subscriptionManager.subscribe(query);
952
- expect(second.rows).toBeDefined();
953
- expect(second.checkpoint).toBe(first.checkpoint);
954
- });
955
- it("should keep subscription alive when one consumer unsubscribes but another remains", async () => {
956
- const query = {
957
- doctype: "TestDoc"
958
- };
959
- const first = await subscriptionManager.subscribe(query);
960
- await subscriptionManager.subscribe(query);
961
- subscriptionManager.unsubscribe(first.subscriptionId);
962
- const sub = subscriptionManager.getSubscription(first.subscriptionId);
963
- expect(sub).toBeDefined();
964
- });
965
- it("should remove subscription when last consumer unsubscribes", async () => {
966
- const query = {
967
- doctype: "TestDoc"
968
- };
969
- const result = await subscriptionManager.subscribe(query);
970
- await subscriptionManager.subscribe(query);
971
- subscriptionManager.unsubscribe(result.subscriptionId);
972
- subscriptionManager.unsubscribe(result.subscriptionId);
973
- const sub = subscriptionManager.getSubscription(result.subscriptionId);
974
- expect(sub).toBeUndefined();
975
- });
976
- it("should allow re-subscribing after all consumers unsubscribe", async () => {
977
- const query = {
978
- doctype: "TestDoc"
979
- };
980
- const first = await subscriptionManager.subscribe(query);
981
- subscriptionManager.unsubscribe(first.subscriptionId);
982
- const second = await subscriptionManager.subscribe(query);
983
- expect(second.subscriptionId).not.toBe(first.subscriptionId);
984
- expect(mockDb.getDocList).toHaveBeenCalledTimes(2);
985
- });
986
- it("should clear dedup maps on clear()", async () => {
987
- const query = {
988
- doctype: "TestDoc"
989
- };
990
- await subscriptionManager.subscribe(query);
991
- subscriptionManager.clear();
992
- const result = await subscriptionManager.subscribe(query);
993
- expect(mockDb.getDocList).toHaveBeenCalledTimes(2);
994
- expect(result.subscriptionId).toBeDefined();
995
- });
996
- });
997
- describe("progressive VPM registration", () => {
998
- beforeEach(() => {
999
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache);
1000
- });
1001
- it("should register with VPM when progressive is true", async () => {
1002
- const query = {
1003
- doctype: "TestDoc",
1004
- progressive: true,
1005
- limit: 20
1006
- };
1007
- const result = await subscriptionManager.subscribe(query);
1008
- const vpm = subscriptionManager.getVirtualPageManager();
1009
- const virtualSub = vpm.getSubscription(result.subscriptionId);
1010
- expect(virtualSub).toBeDefined();
1011
- expect(virtualSub.getProgressiveCache().docIds).toHaveLength(mockDocs.length);
1012
- });
1013
- it("should not register with VPM when progressive is false/undefined", async () => {
1014
- const query = {
1015
- doctype: "TestDoc"
1016
- };
1017
- const result = await subscriptionManager.subscribe(query);
1018
- const vpm = subscriptionManager.getVirtualPageManager();
1019
- const virtualSub = vpm.getSubscription(result.subscriptionId);
1020
- expect(virtualSub).toBeUndefined();
1021
- });
1022
- it("should prefer VPM docs when subscription is progressive", async () => {
1023
- const query = {
1024
- doctype: "TestDoc",
1025
- progressive: true,
1026
- limit: 20
1027
- };
1028
- const result = await subscriptionManager.subscribe(query);
1029
- const docs = subscriptionManager.getDocsForSubscription(result.subscriptionId);
1030
- expect(docs.length).toBeGreaterThan(0);
1031
- });
1032
- });
1033
- describe("tombstone cleanup", () => {
1034
- beforeEach(() => {
1035
- subscriptionManager = new SubscriptionManager(mockDb, mockNormalizedCache, {
1036
- tombstoneMaxAge: 1e3,
1037
- tombstoneMaxCount: 3
1038
- });
1039
- });
1040
- it("should remove tombstones older than maxAge", async () => {
1041
- const query = {
1042
- doctype: "TestDoc"
1043
- };
1044
- const result = await subscriptionManager.subscribe(query);
1045
- const sub = subscriptionManager.getSubscription(result.subscriptionId);
1046
- sub.tombstones.set("old-doc", Date.now() - 2e3);
1047
- sub.tombstones.set("recent-doc", Date.now());
1048
- subscriptionManager.cleanupTombstones(result.subscriptionId);
1049
- expect(sub.tombstones.has("old-doc")).toBe(false);
1050
- expect(sub.tombstones.has("recent-doc")).toBe(true);
1051
- });
1052
- it("should trim tombstones exceeding maxCount (oldest first)", async () => {
1053
- const now = Date.now();
1054
- const query = {
1055
- doctype: "TestDoc"
1056
- };
1057
- const result = await subscriptionManager.subscribe(query);
1058
- const sub = subscriptionManager.getSubscription(result.subscriptionId);
1059
- sub.tombstones.set("doc-1", now - 100);
1060
- sub.tombstones.set("doc-2", now - 50);
1061
- sub.tombstones.set("doc-3", now - 25);
1062
- sub.tombstones.set("doc-4", now);
1063
- subscriptionManager.cleanupTombstones(result.subscriptionId);
1064
- expect(sub.tombstones.size).toBe(3);
1065
- expect(sub.tombstones.has("doc-1")).toBe(false);
1066
- expect(sub.tombstones.has("doc-4")).toBe(true);
1067
- });
1068
- it("should handle subscriptions without tombstones", async () => {
1069
- const query = {
1070
- doctype: "TestDoc"
1071
- };
1072
- const result = await subscriptionManager.subscribe(query);
1073
- const sub = subscriptionManager.getSubscription(result.subscriptionId);
1074
- sub.tombstones = void 0;
1075
- expect(() => subscriptionManager.cleanupTombstones(result.subscriptionId)).not.toThrow();
1076
- });
1077
- });
1078
- });
1079
- //# sourceMappingURL=subscriptionManager.spec.mjs.map