@multiplatform.one/frappe 6.0.0

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