@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
package/src/doctype.ts ADDED
@@ -0,0 +1,828 @@
1
+ /**
2
+ * DocType metadata hooks for @multiplatform.one/frappe
3
+ *
4
+ * Provides hooks for fetching and caching DocType schemas, searching linked
5
+ * documents, and searching across DocTypes for navigation (Awesomebar).
6
+ */
7
+
8
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
9
+ import { HttpClient } from "./core/http";
10
+ import type { AuthConfig } from "./core/types";
11
+ import type { FrappeConnectionConfig } from "./pacer";
12
+
13
+ // ---------------------------------------------------------------------------
14
+ // Type Definitions
15
+ // ---------------------------------------------------------------------------
16
+
17
+ /** All Frappe field type strings */
18
+ export type FrappeFieldType =
19
+ | "Autocomplete"
20
+ | "Attach"
21
+ | "Attach Image"
22
+ | "Barcode"
23
+ | "Check"
24
+ | "Code"
25
+ | "Color"
26
+ | "Column Break"
27
+ | "Currency"
28
+ | "Data"
29
+ | "Date"
30
+ | "Datetime"
31
+ | "Duration"
32
+ | "Dynamic Link"
33
+ | "Float"
34
+ | "Geolocation"
35
+ | "HTML"
36
+ | "HTML Editor"
37
+ | "Heading"
38
+ | "Icon"
39
+ | "Image"
40
+ | "Int"
41
+ | "JSON"
42
+ | "Link"
43
+ | "Long Text"
44
+ | "Markdown Editor"
45
+ | "Password"
46
+ | "Percent"
47
+ | "Phone"
48
+ | "Rating"
49
+ | "Read Only"
50
+ | "Section Break"
51
+ | "Select"
52
+ | "Signature"
53
+ | "Small Text"
54
+ | "Tab Break"
55
+ | "Table"
56
+ | "Table MultiSelect"
57
+ | "Text"
58
+ | "Text Editor"
59
+ | "Time";
60
+
61
+ /** Normalized DocType field descriptor */
62
+ export interface DocTypeField {
63
+ fieldname: string;
64
+ fieldtype: FrappeFieldType;
65
+ label?: string;
66
+ /** Link target DocType, Select options, or Table child DocType */
67
+ options?: string;
68
+ reqd?: boolean;
69
+ unique?: boolean;
70
+ default?: string;
71
+ /** Conditional visibility expression (e.g. `eval:doc.status=="Active"`) */
72
+ depends_on?: string;
73
+ read_only?: boolean;
74
+ hidden?: boolean;
75
+ in_list_view?: boolean;
76
+ in_standard_filter?: boolean;
77
+ description?: string;
78
+ length?: number;
79
+ precision?: number;
80
+ /** For Link fields: comma-separated search fields */
81
+ search_fields?: string;
82
+ /** For Section Break fields: whether the section is collapsible */
83
+ collapsible?: boolean;
84
+ }
85
+
86
+ /** DocType permission entry */
87
+ export interface DocTypePermission {
88
+ role: string;
89
+ read?: boolean;
90
+ write?: boolean;
91
+ create?: boolean;
92
+ delete?: boolean;
93
+ submit?: boolean;
94
+ cancel?: boolean;
95
+ amend?: boolean;
96
+ }
97
+
98
+ /** A column in a form section, containing an ordered list of fields */
99
+ export interface FormColumn {
100
+ fields: DocTypeField[];
101
+ }
102
+
103
+ /** A section in the form layout, containing one or more columns */
104
+ export interface FormSection {
105
+ label?: string;
106
+ collapsible?: boolean;
107
+ /** Whether this section represents a Tab Break */
108
+ tab?: boolean;
109
+ columns: FormColumn[];
110
+ }
111
+
112
+ /** Normalized DocType metadata */
113
+ export interface DocTypeMeta {
114
+ name: string;
115
+ module: string;
116
+ title_field?: string;
117
+ image_field?: string;
118
+ is_tree?: boolean;
119
+ sort_field: string;
120
+ sort_order: string;
121
+ /** Flat list of all fields (ordered by field_order or position) */
122
+ fields: DocTypeField[];
123
+ /** Parsed layout tree from Section Break / Column Break / Tab Break fields */
124
+ sections: FormSection[];
125
+ permissions: DocTypePermission[];
126
+ }
127
+
128
+ /** A search result for a Link field */
129
+ export interface LinkSearchResult {
130
+ /** The document name (ID) */
131
+ value: string;
132
+ /** The display label (title_field value, or name) */
133
+ label: string;
134
+ /** Optional description from additional search fields */
135
+ description?: string;
136
+ }
137
+
138
+ /** Options for the `useLinkSearch` hook */
139
+ export interface LinkSearchOptions {
140
+ /** Search query text */
141
+ query?: string;
142
+ /** Fields to search across (defaults to title_field + "name") */
143
+ searchFields?: string[];
144
+ /** Additional Frappe filters */
145
+ filters?: Record<string, unknown> | Array<[string, string, unknown]>;
146
+ /** Maximum results (default 20) */
147
+ limit?: number;
148
+ }
149
+
150
+ /** A navigation suggestion from DocType search */
151
+ export interface DocTypeSearchResult {
152
+ /** Display label (e.g. "Pokemon List", "New Pokemon") */
153
+ label: string;
154
+ /** The DocType name */
155
+ doctype: string;
156
+ /** Suggestion type */
157
+ type: "list" | "report" | "new";
158
+ }
159
+
160
+ // ---------------------------------------------------------------------------
161
+ // Module-level caches
162
+ // ---------------------------------------------------------------------------
163
+
164
+ /** Cache for parsed DocType metadata, keyed by "{baseURL}:{doctype}" */
165
+ const metaCache = new Map<string, DocTypeMeta>();
166
+
167
+ /** Cache for the full list of DocTypes, keyed by baseURL */
168
+ const docTypeListCache = new Map<string, DocTypeListItem[]>();
169
+
170
+ interface DocTypeListItem {
171
+ name: string;
172
+ module: string;
173
+ title?: string;
174
+ }
175
+
176
+ // ---------------------------------------------------------------------------
177
+ // Raw API response types (internal)
178
+ // ---------------------------------------------------------------------------
179
+
180
+ interface RawDocTypeResponse {
181
+ name: string;
182
+ module: string;
183
+ title_field?: string;
184
+ image_field?: string;
185
+ is_tree?: number;
186
+ sort_field?: string;
187
+ sort_order?: string;
188
+ field_order?: string[] | string;
189
+ fields: RawFieldResponse[];
190
+ permissions?: RawPermissionResponse[];
191
+ }
192
+
193
+ interface RawFieldResponse {
194
+ fieldname: string;
195
+ fieldtype: string;
196
+ label?: string;
197
+ options?: string;
198
+ reqd?: number;
199
+ unique?: number;
200
+ default?: string;
201
+ depends_on?: string;
202
+ read_only?: number;
203
+ hidden?: number;
204
+ in_list_view?: number;
205
+ in_standard_filter?: number;
206
+ description?: string;
207
+ length?: number;
208
+ precision?: number;
209
+ search_fields?: string;
210
+ collapsible?: number;
211
+ }
212
+
213
+ interface RawPermissionResponse {
214
+ role: string;
215
+ read?: number;
216
+ write?: number;
217
+ create?: number;
218
+ delete?: number;
219
+ submit?: number;
220
+ cancel?: number;
221
+ amend?: number;
222
+ }
223
+
224
+ // ---------------------------------------------------------------------------
225
+ // Utility: parseDependsOn
226
+ // ---------------------------------------------------------------------------
227
+
228
+ /**
229
+ * Parse a Frappe `depends_on` expression into an evaluable function.
230
+ *
231
+ * Handles expressions like:
232
+ * - `eval:doc.status=="Active"` — JS expression with `doc` bound
233
+ * - `doc.field_name` — truthy check on a field value
234
+ * - `eval:doc.field1 && doc.field2` — compound boolean
235
+ *
236
+ * @param expression - The depends_on expression string, or undefined
237
+ * @returns A function that evaluates the expression given a document object
238
+ */
239
+ export function parseDependsOn(expression?: string): (doc: Record<string, unknown>) => boolean {
240
+ if (!expression) return () => true;
241
+
242
+ const trimmed = expression.trim();
243
+
244
+ if (trimmed.startsWith("eval:")) {
245
+ const code = trimmed.slice(5).trim();
246
+ try {
247
+ const fn = new Function("doc", `return !!(${code})`) as (
248
+ doc: Record<string, unknown>,
249
+ ) => boolean;
250
+ return (doc: Record<string, unknown>) => {
251
+ try {
252
+ return fn(doc);
253
+ } catch {
254
+ return false;
255
+ }
256
+ };
257
+ } catch {
258
+ return () => false;
259
+ }
260
+ }
261
+
262
+ // Expression containing "doc." — evaluate as JS (e.g. "doc.status")
263
+ if (trimmed.includes("doc.")) {
264
+ try {
265
+ const fn = new Function("doc", `return !!(${trimmed})`) as (
266
+ doc: Record<string, unknown>,
267
+ ) => boolean;
268
+ return (doc: Record<string, unknown>) => {
269
+ try {
270
+ return fn(doc);
271
+ } catch {
272
+ return false;
273
+ }
274
+ };
275
+ } catch {
276
+ return () => false;
277
+ }
278
+ }
279
+
280
+ // Bare field reference (e.g. "enabled") — truthy check on doc[fieldname]
281
+ return (doc) => !!doc[trimmed];
282
+ }
283
+
284
+ // ---------------------------------------------------------------------------
285
+ // Utility: parseFormLayout
286
+ // ---------------------------------------------------------------------------
287
+
288
+ /**
289
+ * Parse a flat array of DocType fields into a structured `FormSection[]` layout.
290
+ *
291
+ * Algorithm:
292
+ * 1. Start with an implicit first section (no label) containing one column.
293
+ * 2. `Section Break` → start a new section.
294
+ * 3. `Column Break` → start a new column within the current section.
295
+ * 4. `Tab Break` → start a new section with `tab: true`.
296
+ * 5. All other fields → add to the current column (skip hidden fields).
297
+ *
298
+ * @param fields - Flat list of DocType fields, ordered by field_order or position
299
+ * @returns Structured layout tree of sections and columns
300
+ */
301
+ export function parseFormLayout(fields: DocTypeField[]): FormSection[] {
302
+ const sections: FormSection[] = [];
303
+ let currentSection: FormSection = { columns: [{ fields: [] }] };
304
+ sections.push(currentSection);
305
+
306
+ for (const field of fields) {
307
+ switch (field.fieldtype) {
308
+ case "Section Break":
309
+ currentSection = {
310
+ label: field.label,
311
+ collapsible: field.collapsible,
312
+ columns: [{ fields: [] }],
313
+ };
314
+ sections.push(currentSection);
315
+ break;
316
+
317
+ case "Column Break":
318
+ currentSection.columns.push({ fields: [] });
319
+ break;
320
+
321
+ case "Tab Break":
322
+ currentSection = {
323
+ label: field.label,
324
+ tab: true,
325
+ columns: [{ fields: [] }],
326
+ };
327
+ sections.push(currentSection);
328
+ break;
329
+
330
+ default:
331
+ if (!field.hidden) {
332
+ const lastColumn = currentSection.columns[currentSection.columns.length - 1];
333
+ lastColumn.fields.push(field);
334
+ }
335
+ break;
336
+ }
337
+ }
338
+
339
+ return sections;
340
+ }
341
+
342
+ // ---------------------------------------------------------------------------
343
+ // Internal helpers
344
+ // ---------------------------------------------------------------------------
345
+
346
+ function createHttpClient(config: FrappeConnectionConfig): HttpClient {
347
+ const authConfig: AuthConfig | undefined = config.auth
348
+ ? {
349
+ useToken: config.auth.useToken,
350
+ token: config.auth.token,
351
+ type: config.auth.type as AuthConfig["type"],
352
+ }
353
+ : undefined;
354
+ return new HttpClient(config.baseURL, authConfig);
355
+ }
356
+
357
+ function parseRawField(raw: RawFieldResponse): DocTypeField {
358
+ return {
359
+ fieldname: raw.fieldname,
360
+ fieldtype: raw.fieldtype as FrappeFieldType,
361
+ label: raw.label,
362
+ options: raw.options,
363
+ reqd: !!raw.reqd,
364
+ unique: !!raw.unique,
365
+ default: raw.default,
366
+ depends_on: raw.depends_on,
367
+ read_only: !!raw.read_only,
368
+ hidden: !!raw.hidden,
369
+ in_list_view: !!raw.in_list_view,
370
+ in_standard_filter: !!raw.in_standard_filter,
371
+ description: raw.description,
372
+ length: raw.length,
373
+ precision: raw.precision,
374
+ search_fields: raw.search_fields,
375
+ collapsible: !!raw.collapsible,
376
+ };
377
+ }
378
+
379
+ function parseRawPermission(raw: RawPermissionResponse): DocTypePermission {
380
+ return {
381
+ role: raw.role,
382
+ read: !!raw.read,
383
+ write: !!raw.write,
384
+ create: !!raw.create,
385
+ delete: !!raw.delete,
386
+ submit: !!raw.submit,
387
+ cancel: !!raw.cancel,
388
+ amend: !!raw.amend,
389
+ };
390
+ }
391
+
392
+ function orderFields(fields: DocTypeField[], fieldOrder: string[]): DocTypeField[] {
393
+ const fieldMap = new Map(fields.map((f) => [f.fieldname, f]));
394
+ const ordered: DocTypeField[] = [];
395
+ const seen = new Set<string>();
396
+
397
+ for (const name of fieldOrder) {
398
+ const field = fieldMap.get(name);
399
+ if (field) {
400
+ ordered.push(field);
401
+ seen.add(name);
402
+ }
403
+ }
404
+
405
+ // Append any fields not listed in field_order
406
+ for (const field of fields) {
407
+ if (!seen.has(field.fieldname)) {
408
+ ordered.push(field);
409
+ }
410
+ }
411
+
412
+ return ordered;
413
+ }
414
+
415
+ function parseRawDocTypeMeta(raw: RawDocTypeResponse): DocTypeMeta {
416
+ const fields = raw.fields.map(parseRawField);
417
+
418
+ // field_order may be a JSON string or an already-parsed array
419
+ let fieldOrder: string[] | undefined;
420
+ if (typeof raw.field_order === "string") {
421
+ try {
422
+ fieldOrder = JSON.parse(raw.field_order);
423
+ } catch {
424
+ fieldOrder = undefined;
425
+ }
426
+ } else if (Array.isArray(raw.field_order)) {
427
+ fieldOrder = raw.field_order;
428
+ }
429
+
430
+ const orderedFields = fieldOrder ? orderFields(fields, fieldOrder) : fields;
431
+ const permissions = (raw.permissions ?? []).map(parseRawPermission);
432
+ const sections = parseFormLayout(orderedFields);
433
+
434
+ return {
435
+ name: raw.name,
436
+ module: raw.module,
437
+ title_field: raw.title_field,
438
+ image_field: raw.image_field,
439
+ is_tree: !!raw.is_tree,
440
+ sort_field: raw.sort_field || "modified",
441
+ sort_order: raw.sort_order || "DESC",
442
+ fields: orderedFields,
443
+ sections,
444
+ permissions,
445
+ };
446
+ }
447
+
448
+ /**
449
+ * Setup pattern for a stable HttpClient ref, following the same pattern
450
+ * used in `useDebouncedSearch` for DbModule.
451
+ */
452
+ function useHttpClientRef(
453
+ config: FrappeConnectionConfig | undefined,
454
+ ): React.RefObject<HttpClient | undefined> {
455
+ const httpRef = useRef<HttpClient | undefined>(undefined);
456
+ const configKeyRef = useRef("");
457
+ const configKey = config ? `${config.baseURL}:${config.auth?.token ?? ""}` : "";
458
+
459
+ if (config && configKey !== configKeyRef.current) {
460
+ httpRef.current = createHttpClient(config);
461
+ configKeyRef.current = configKey;
462
+ }
463
+ if (!config) {
464
+ httpRef.current = undefined;
465
+ configKeyRef.current = "";
466
+ }
467
+
468
+ return httpRef;
469
+ }
470
+
471
+ // ---------------------------------------------------------------------------
472
+ // Hook: useDocTypeMeta
473
+ // ---------------------------------------------------------------------------
474
+
475
+ /**
476
+ * Fetch and cache DocType metadata (schema, fields, layout, permissions).
477
+ *
478
+ * Responses are cached per-session in memory keyed by `{baseURL}:{doctype}`.
479
+ * The `refetch` function clears the cache entry and forces a fresh fetch.
480
+ *
481
+ * @param config - Frappe connection config, or undefined to disable
482
+ * @param doctype - The DocType name to fetch metadata for
483
+ * @returns `{ meta, isLoading, error, refetch }`
484
+ *
485
+ * @example
486
+ * ```tsx
487
+ * function PokemonForm() {
488
+ * const { meta, isLoading } = useDocTypeMeta(config, "Pokemon");
489
+ * if (isLoading) return <Spinner />;
490
+ * return meta?.sections.map(section => (
491
+ * <FormSection key={section.label} section={section} />
492
+ * ));
493
+ * }
494
+ * ```
495
+ */
496
+ export function useDocTypeMeta(
497
+ config: FrappeConnectionConfig | undefined,
498
+ doctype: string,
499
+ ): {
500
+ meta: DocTypeMeta | undefined;
501
+ isLoading: boolean;
502
+ error: Error | null;
503
+ refetch: () => void;
504
+ } {
505
+ const cacheKey = config ? `${config.baseURL}:${doctype}` : "";
506
+
507
+ const [meta, setMeta] = useState<DocTypeMeta | undefined>(() =>
508
+ cacheKey ? metaCache.get(cacheKey) : undefined,
509
+ );
510
+ const [isLoading, setIsLoading] = useState(
511
+ () => !!config && !!doctype && !(cacheKey && metaCache.has(cacheKey)),
512
+ );
513
+ const [error, setError] = useState<Error | null>(null);
514
+ const [version, setVersion] = useState(0);
515
+
516
+ // Synchronize state when cache key changes (doctype or baseURL changed)
517
+ const prevCacheKeyRef = useRef(cacheKey);
518
+ if (cacheKey !== prevCacheKeyRef.current) {
519
+ prevCacheKeyRef.current = cacheKey;
520
+ const cached = cacheKey ? metaCache.get(cacheKey) : undefined;
521
+ if (cached) {
522
+ setMeta(cached);
523
+ setIsLoading(false);
524
+ } else {
525
+ setMeta(undefined);
526
+ setIsLoading(!!config && !!doctype);
527
+ }
528
+ setError(null);
529
+ }
530
+
531
+ const httpRef = useHttpClientRef(config);
532
+
533
+ useEffect(() => {
534
+ if (!config || !doctype) {
535
+ return;
536
+ }
537
+
538
+ const key = `${config.baseURL}:${doctype}`;
539
+ // Already have cached data (synchronized during render)
540
+ if (metaCache.has(key)) return;
541
+
542
+ const http = httpRef.current;
543
+ if (!http) return;
544
+
545
+ let cancelled = false;
546
+ setIsLoading(true);
547
+ setError(null);
548
+
549
+ (async () => {
550
+ try {
551
+ const response = await http.get<{ data: RawDocTypeResponse }>(
552
+ `/api/resource/DocType/${encodeURIComponent(doctype)}`,
553
+ );
554
+
555
+ if (cancelled) return;
556
+
557
+ const raw = response.payload?.data;
558
+ if (!raw) {
559
+ throw new Error(`No data returned for DocType "${doctype}"`);
560
+ }
561
+
562
+ const parsed = parseRawDocTypeMeta(raw);
563
+ metaCache.set(key, parsed);
564
+ setMeta(parsed);
565
+ } catch (err) {
566
+ if (cancelled) return;
567
+ setError(err instanceof Error ? err : new Error(String(err)));
568
+ setMeta(undefined);
569
+ } finally {
570
+ if (!cancelled) setIsLoading(false);
571
+ }
572
+ })();
573
+
574
+ return () => {
575
+ cancelled = true;
576
+ };
577
+ // Depend on the stable string `cacheKey` (baseURL + doctype), NOT the
578
+ // `config` object — callers frequently pass a freshly-allocated config
579
+ // object every render. Keying on the object identity would re-run this
580
+ // effect on every render and, when the request fails (e.g. a Guest hitting
581
+ // the permission-gated DocType meta endpoint → 403, which never populates
582
+ // `metaCache`), spin into an infinite refetch loop.
583
+ }, [cacheKey, version]);
584
+
585
+ const refetch = useCallback(() => {
586
+ if (cacheKey) metaCache.delete(cacheKey);
587
+ setVersion((v) => v + 1);
588
+ }, [cacheKey]);
589
+
590
+ return { meta, isLoading, error, refetch };
591
+ }
592
+
593
+ // ---------------------------------------------------------------------------
594
+ // Hook: useLinkSearch
595
+ // ---------------------------------------------------------------------------
596
+
597
+ /**
598
+ * Debounced search for Link field suggestions.
599
+ *
600
+ * Auto-configures the `title_field` from DocType metadata when `searchFields`
601
+ * is not explicitly provided. Calls `GET /api/method/frappe.client.get_list`
602
+ * with a 300ms debounce.
603
+ *
604
+ * @param config - Frappe connection config, or undefined to disable
605
+ * @param doctype - The target DocType to search within
606
+ * @param options - Search options (query, searchFields, filters, limit)
607
+ * @returns `{ results, isLoading, error }`
608
+ *
609
+ * @example
610
+ * ```tsx
611
+ * function SpeciesLink() {
612
+ * const [text, setText] = useState("");
613
+ * const { results, isLoading } = useLinkSearch(config, "Poke Species", {
614
+ * query: text,
615
+ * limit: 10,
616
+ * });
617
+ * return (
618
+ * <div>
619
+ * <input value={text} onChange={e => setText(e.target.value)} />
620
+ * {isLoading && <span>Searching...</span>}
621
+ * {results.map(r => <div key={r.value}>{r.label}</div>)}
622
+ * </div>
623
+ * );
624
+ * }
625
+ * ```
626
+ */
627
+ export function useLinkSearch(
628
+ config: FrappeConnectionConfig | undefined,
629
+ doctype: string,
630
+ options?: LinkSearchOptions,
631
+ ): {
632
+ results: LinkSearchResult[];
633
+ isLoading: boolean;
634
+ error: Error | null;
635
+ } {
636
+ const query = options?.query ?? "";
637
+ const searchFields = options?.searchFields;
638
+ const filters = options?.filters;
639
+ const limit = options?.limit ?? 20;
640
+
641
+ const [results, setResults] = useState<LinkSearchResult[]>([]);
642
+ const [isLoading, setIsLoading] = useState(false);
643
+ const [error, setError] = useState<Error | null>(null);
644
+
645
+ // Get meta for auto-configuring title_field
646
+ const { meta } = useDocTypeMeta(config, doctype);
647
+
648
+ const httpRef = useHttpClientRef(config);
649
+
650
+ useEffect(() => {
651
+ const http = httpRef.current;
652
+ if (!http || !query) {
653
+ setResults([]);
654
+ setIsLoading(false);
655
+ setError(null);
656
+ return;
657
+ }
658
+
659
+ let cancelled = false;
660
+ setIsLoading(true);
661
+ setError(null);
662
+
663
+ const timer = setTimeout(async () => {
664
+ try {
665
+ const titleField = meta?.title_field || "name";
666
+ const effectiveSearchFields =
667
+ searchFields ?? (titleField !== "name" ? [titleField, "name"] : ["name"]);
668
+
669
+ // Build or_filters for searching across multiple fields
670
+ const orFilters = effectiveSearchFields.map((f) => [f, "like", `%${query}%`]);
671
+ const requestFields = [...new Set(["name", titleField, ...effectiveSearchFields])];
672
+
673
+ const params: Record<string, unknown> = {
674
+ doctype,
675
+ fields: requestFields,
676
+ or_filters: orFilters,
677
+ limit_page_length: limit,
678
+ };
679
+ if (filters) params.filters = filters;
680
+
681
+ const response = await http.get<{
682
+ message?: Record<string, unknown>[];
683
+ }>("/api/method/frappe.client.get_list", params);
684
+
685
+ if (cancelled) return;
686
+
687
+ const docs = response.payload?.message ?? [];
688
+ setResults(
689
+ docs.map((doc) => ({
690
+ value: String(doc.name ?? ""),
691
+ label: String(doc[titleField] ?? doc.name ?? ""),
692
+ description: undefined,
693
+ })),
694
+ );
695
+ } catch (err) {
696
+ if (cancelled) return;
697
+ setError(err instanceof Error ? err : new Error(String(err)));
698
+ setResults([]);
699
+ } finally {
700
+ if (!cancelled) setIsLoading(false);
701
+ }
702
+ }, 300);
703
+
704
+ return () => {
705
+ cancelled = true;
706
+ clearTimeout(timer);
707
+ };
708
+ }, [query, doctype, meta?.title_field, searchFields, filters, limit]);
709
+
710
+ return { results, isLoading, error };
711
+ }
712
+
713
+ // ---------------------------------------------------------------------------
714
+ // Hook: useDocTypeSearch
715
+ // ---------------------------------------------------------------------------
716
+
717
+ /**
718
+ * Search across all DocType names for Awesomebar navigation.
719
+ *
720
+ * Fetches and caches the full list of DocTypes, then filters locally
721
+ * for instant results. Returns navigation suggestions in the format:
722
+ * "{name} List", "{name} Report", "New {name}".
723
+ *
724
+ * @param config - Frappe connection config, or undefined to disable
725
+ * @param query - Search query string
726
+ * @returns `{ results, isLoading, error }`
727
+ *
728
+ * @example
729
+ * ```tsx
730
+ * function Awesomebar() {
731
+ * const [text, setText] = useState("");
732
+ * const { results } = useDocTypeSearch(config, text);
733
+ * return (
734
+ * <div>
735
+ * <input value={text} onChange={e => setText(e.target.value)} />
736
+ * {results.map(r => <div key={r.label}>{r.label}</div>)}
737
+ * </div>
738
+ * );
739
+ * }
740
+ * ```
741
+ */
742
+ export function useDocTypeSearch(
743
+ config: FrappeConnectionConfig | undefined,
744
+ query: string,
745
+ ): {
746
+ results: DocTypeSearchResult[];
747
+ isLoading: boolean;
748
+ error: Error | null;
749
+ } {
750
+ const [allDocTypes, setAllDocTypes] = useState<DocTypeListItem[]>([]);
751
+ const [isLoading, setIsLoading] = useState(false);
752
+ const [error, setError] = useState<Error | null>(null);
753
+
754
+ const httpRef = useHttpClientRef(config);
755
+
756
+ useEffect(() => {
757
+ if (!config) {
758
+ setAllDocTypes([]);
759
+ setIsLoading(false);
760
+ return;
761
+ }
762
+
763
+ const key = config.baseURL;
764
+ const cached = docTypeListCache.get(key);
765
+ if (cached) {
766
+ setAllDocTypes(cached);
767
+ return;
768
+ }
769
+
770
+ const http = httpRef.current;
771
+ if (!http) return;
772
+
773
+ let cancelled = false;
774
+ setIsLoading(true);
775
+ setError(null);
776
+
777
+ (async () => {
778
+ try {
779
+ const response = await http.get<{
780
+ data?: DocTypeListItem[];
781
+ }>("/api/resource/DocType", {
782
+ limit_page_length: 0,
783
+ fields: ["name", "module", "title"],
784
+ });
785
+
786
+ if (cancelled) return;
787
+
788
+ const list = response.payload?.data ?? [];
789
+ docTypeListCache.set(key, list);
790
+ setAllDocTypes(list);
791
+ } catch (err) {
792
+ if (cancelled) return;
793
+ setError(err instanceof Error ? err : new Error(String(err)));
794
+ } finally {
795
+ if (!cancelled) setIsLoading(false);
796
+ }
797
+ })();
798
+
799
+ return () => {
800
+ cancelled = true;
801
+ };
802
+ }, [config]);
803
+
804
+ // Filter locally for instant results
805
+ const results = useMemo<DocTypeSearchResult[]>(() => {
806
+ if (!query || allDocTypes.length === 0) return [];
807
+
808
+ const lowerQuery = query.toLowerCase();
809
+ const matching = allDocTypes.filter(
810
+ (dt) =>
811
+ dt.name.toLowerCase().includes(lowerQuery) ||
812
+ dt.module.toLowerCase().includes(lowerQuery) ||
813
+ dt.title?.toLowerCase().includes(lowerQuery),
814
+ );
815
+
816
+ return matching.flatMap((dt) => [
817
+ { label: `${dt.name} List`, doctype: dt.name, type: "list" as const },
818
+ {
819
+ label: `${dt.name} Report`,
820
+ doctype: dt.name,
821
+ type: "report" as const,
822
+ },
823
+ { label: `New ${dt.name}`, doctype: dt.name, type: "new" as const },
824
+ ]);
825
+ }, [query, allDocTypes]);
826
+
827
+ return { results, isLoading, error };
828
+ }