@statezero/core 0.2.37 → 0.2.38

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 (307) hide show
  1. package/dist/adaptors/vue/components/LayoutRenderer.js +166 -0
  2. package/dist/adaptors/vue/components/defaults/AlertElement.js +31 -0
  3. package/dist/adaptors/vue/components/defaults/DisplayElement.js +44 -0
  4. package/dist/adaptors/vue/components/defaults/DividerElement.js +10 -0
  5. package/dist/adaptors/vue/components/defaults/ErrorBlock.js +24 -0
  6. package/dist/adaptors/vue/components/defaults/GroupElement.js +41 -0
  7. package/dist/adaptors/vue/components/defaults/LabelElement.js +21 -0
  8. package/dist/adaptors/vue/components/defaults/TabsElement.js +38 -0
  9. package/package.json +6 -4
  10. package/dist/actions/backend1/django_app/calculate-hash.d.ts +0 -57
  11. package/dist/actions/backend1/django_app/calculate-hash.js +0 -80
  12. package/dist/actions/backend1/django_app/calculate-hash.schema.json +0 -148
  13. package/dist/actions/backend1/django_app/get-current-username.d.ts +0 -29
  14. package/dist/actions/backend1/django_app/get-current-username.js +0 -65
  15. package/dist/actions/backend1/django_app/get-current-username.schema.json +0 -47
  16. package/dist/actions/backend1/django_app/get-server-status.d.ts +0 -38
  17. package/dist/actions/backend1/django_app/get-server-status.js +0 -68
  18. package/dist/actions/backend1/django_app/get-server-status.schema.json +0 -93
  19. package/dist/actions/backend1/django_app/get-user-info.d.ts +0 -44
  20. package/dist/actions/backend1/django_app/get-user-info.js +0 -70
  21. package/dist/actions/backend1/django_app/get-user-info.schema.json +0 -127
  22. package/dist/actions/backend1/django_app/index.d.ts +0 -1
  23. package/dist/actions/backend1/django_app/index.js +0 -6
  24. package/dist/actions/backend1/django_app/process-data.d.ts +0 -51
  25. package/dist/actions/backend1/django_app/process-data.js +0 -78
  26. package/dist/actions/backend1/django_app/process-data.schema.json +0 -117
  27. package/dist/actions/backend1/django_app/send-notification.d.ts +0 -55
  28. package/dist/actions/backend1/django_app/send-notification.js +0 -81
  29. package/dist/actions/backend1/django_app/send-notification.schema.json +0 -175
  30. package/dist/actions/backend1/index.d.ts +0 -1
  31. package/dist/actions/backend1/index.js +0 -1
  32. package/dist/actions/default/django_app/calculate-hash.d.ts +0 -57
  33. package/dist/actions/default/django_app/calculate-hash.js +0 -80
  34. package/dist/actions/default/django_app/calculate-hash.schema.json +0 -148
  35. package/dist/actions/default/django_app/get-current-username.d.ts +0 -29
  36. package/dist/actions/default/django_app/get-current-username.js +0 -65
  37. package/dist/actions/default/django_app/get-current-username.schema.json +0 -47
  38. package/dist/actions/default/django_app/get-server-status.d.ts +0 -38
  39. package/dist/actions/default/django_app/get-server-status.js +0 -68
  40. package/dist/actions/default/django_app/get-server-status.schema.json +0 -93
  41. package/dist/actions/default/django_app/get-user-info.d.ts +0 -44
  42. package/dist/actions/default/django_app/get-user-info.js +0 -70
  43. package/dist/actions/default/django_app/get-user-info.schema.json +0 -127
  44. package/dist/actions/default/django_app/index.d.ts +0 -1
  45. package/dist/actions/default/django_app/index.js +0 -6
  46. package/dist/actions/default/django_app/process-data.d.ts +0 -51
  47. package/dist/actions/default/django_app/process-data.js +0 -78
  48. package/dist/actions/default/django_app/process-data.schema.json +0 -117
  49. package/dist/actions/default/django_app/send-notification.d.ts +0 -55
  50. package/dist/actions/default/django_app/send-notification.js +0 -81
  51. package/dist/actions/default/django_app/send-notification.schema.json +0 -175
  52. package/dist/actions/default/index.d.ts +0 -1
  53. package/dist/actions/default/index.js +0 -1
  54. package/dist/actions/index.d.ts +0 -1
  55. package/dist/actions/index.js +0 -5
  56. package/dist/adaptors/react/composables.d.ts +0 -1
  57. package/dist/adaptors/react/composables.js +0 -4
  58. package/dist/adaptors/react/index.d.ts +0 -1
  59. package/dist/adaptors/react/index.js +0 -1
  60. package/dist/adaptors/vue/components/LayoutRenderer.vue +0 -361
  61. package/dist/adaptors/vue/components/defaults/AlertElement.vue +0 -38
  62. package/dist/adaptors/vue/components/defaults/DisplayElement.vue +0 -57
  63. package/dist/adaptors/vue/components/defaults/DividerElement.vue +0 -13
  64. package/dist/adaptors/vue/components/defaults/ErrorBlock.vue +0 -28
  65. package/dist/adaptors/vue/components/defaults/GroupElement.vue +0 -53
  66. package/dist/adaptors/vue/components/defaults/LabelElement.vue +0 -25
  67. package/dist/adaptors/vue/components/defaults/TabsElement.vue +0 -54
  68. package/dist/adaptors/vue/components/defaults/index.d.ts +0 -7
  69. package/dist/adaptors/vue/components/defaults/index.js +0 -31
  70. package/dist/adaptors/vue/components/index.d.ts +0 -1
  71. package/dist/adaptors/vue/components/index.js +0 -7
  72. package/dist/adaptors/vue/composables.d.ts +0 -2
  73. package/dist/adaptors/vue/composables.js +0 -44
  74. package/dist/adaptors/vue/index.d.ts +0 -3
  75. package/dist/adaptors/vue/index.js +0 -4
  76. package/dist/adaptors/vue/reactivity.d.ts +0 -18
  77. package/dist/adaptors/vue/reactivity.js +0 -132
  78. package/dist/cli/commands/sync.d.ts +0 -6
  79. package/dist/cli/commands/sync.js +0 -30
  80. package/dist/cli/commands/syncActions.d.ts +0 -46
  81. package/dist/cli/commands/syncActions.js +0 -717
  82. package/dist/cli/commands/syncModels.d.ts +0 -132
  83. package/dist/cli/commands/syncModels.js +0 -1120
  84. package/dist/cli/configFileLoader.d.ts +0 -10
  85. package/dist/cli/configFileLoader.js +0 -85
  86. package/dist/cli/index.d.ts +0 -2
  87. package/dist/cli/index.js +0 -22
  88. package/dist/config.d.ts +0 -57
  89. package/dist/config.js +0 -273
  90. package/dist/core/eventReceivers.d.ts +0 -185
  91. package/dist/core/eventReceivers.js +0 -266
  92. package/dist/core/utils.d.ts +0 -8
  93. package/dist/core/utils.js +0 -62
  94. package/dist/errorHandler.d.ts +0 -21
  95. package/dist/errorHandler.js +0 -27
  96. package/dist/filtering/localFiltering.d.ts +0 -110
  97. package/dist/filtering/localFiltering.js +0 -1080
  98. package/dist/flavours/django/dates.d.ts +0 -34
  99. package/dist/flavours/django/dates.js +0 -113
  100. package/dist/flavours/django/errors.d.ts +0 -138
  101. package/dist/flavours/django/errors.js +0 -195
  102. package/dist/flavours/django/f.d.ts +0 -6
  103. package/dist/flavours/django/f.js +0 -91
  104. package/dist/flavours/django/files.d.ts +0 -62
  105. package/dist/flavours/django/files.js +0 -355
  106. package/dist/flavours/django/makeApiCall.d.ts +0 -36
  107. package/dist/flavours/django/makeApiCall.js +0 -169
  108. package/dist/flavours/django/manager.d.ts +0 -204
  109. package/dist/flavours/django/manager.js +0 -222
  110. package/dist/flavours/django/model.d.ts +0 -137
  111. package/dist/flavours/django/model.js +0 -366
  112. package/dist/flavours/django/operationFactory.d.ts +0 -73
  113. package/dist/flavours/django/operationFactory.js +0 -248
  114. package/dist/flavours/django/q.d.ts +0 -70
  115. package/dist/flavours/django/q.js +0 -43
  116. package/dist/flavours/django/queryExecutor.d.ts +0 -149
  117. package/dist/flavours/django/queryExecutor.js +0 -590
  118. package/dist/flavours/django/querySet.d.ts +0 -301
  119. package/dist/flavours/django/querySet.js +0 -736
  120. package/dist/flavours/django/serializers.d.ts +0 -39
  121. package/dist/flavours/django/serializers.js +0 -296
  122. package/dist/flavours/django/tempPk.d.ts +0 -31
  123. package/dist/flavours/django/tempPk.js +0 -92
  124. package/dist/flavours/django/utils.d.ts +0 -19
  125. package/dist/flavours/django/utils.js +0 -29
  126. package/dist/index.d.ts +0 -46
  127. package/dist/index.js +0 -48
  128. package/dist/models/backend1/django_app/comprehensivemodel.d.ts +0 -894
  129. package/dist/models/backend1/django_app/comprehensivemodel.js +0 -71
  130. package/dist/models/backend1/django_app/comprehensivemodel.schema.json +0 -870
  131. package/dist/models/backend1/django_app/custompkmodel.d.ts +0 -92
  132. package/dist/models/backend1/django_app/custompkmodel.js +0 -69
  133. package/dist/models/backend1/django_app/custompkmodel.schema.json +0 -71
  134. package/dist/models/backend1/django_app/dailyrate.d.ts +0 -230
  135. package/dist/models/backend1/django_app/dailyrate.js +0 -71
  136. package/dist/models/backend1/django_app/dailyrate.schema.json +0 -212
  137. package/dist/models/backend1/django_app/deepmodellevel1.d.ts +0 -140
  138. package/dist/models/backend1/django_app/deepmodellevel1.js +0 -72
  139. package/dist/models/backend1/django_app/deepmodellevel1.schema.json +0 -114
  140. package/dist/models/backend1/django_app/deepmodellevel2.d.ts +0 -118
  141. package/dist/models/backend1/django_app/deepmodellevel2.js +0 -71
  142. package/dist/models/backend1/django_app/deepmodellevel2.schema.json +0 -92
  143. package/dist/models/backend1/django_app/deepmodellevel3.d.ts +0 -92
  144. package/dist/models/backend1/django_app/deepmodellevel3.js +0 -69
  145. package/dist/models/backend1/django_app/deepmodellevel3.schema.json +0 -69
  146. package/dist/models/backend1/django_app/dummymodel.d.ts +0 -134
  147. package/dist/models/backend1/django_app/dummymodel.js +0 -71
  148. package/dist/models/backend1/django_app/dummymodel.schema.json +0 -109
  149. package/dist/models/backend1/django_app/dummyrelatedmodel.d.ts +0 -92
  150. package/dist/models/backend1/django_app/dummyrelatedmodel.js +0 -69
  151. package/dist/models/backend1/django_app/dummyrelatedmodel.schema.json +0 -69
  152. package/dist/models/backend1/django_app/filetest.d.ts +0 -140
  153. package/dist/models/backend1/django_app/filetest.js +0 -69
  154. package/dist/models/backend1/django_app/filetest.schema.json +0 -111
  155. package/dist/models/backend1/django_app/index.d.ts +0 -1
  156. package/dist/models/backend1/django_app/index.js +0 -21
  157. package/dist/models/backend1/django_app/m2mdepthtestlevel1.d.ts +0 -118
  158. package/dist/models/backend1/django_app/m2mdepthtestlevel1.js +0 -71
  159. package/dist/models/backend1/django_app/m2mdepthtestlevel1.schema.json +0 -94
  160. package/dist/models/backend1/django_app/m2mdepthtestlevel2.d.ts +0 -118
  161. package/dist/models/backend1/django_app/m2mdepthtestlevel2.js +0 -71
  162. package/dist/models/backend1/django_app/m2mdepthtestlevel2.schema.json +0 -94
  163. package/dist/models/backend1/django_app/m2mdepthtestlevel3.d.ts +0 -134
  164. package/dist/models/backend1/django_app/m2mdepthtestlevel3.js +0 -71
  165. package/dist/models/backend1/django_app/m2mdepthtestlevel3.schema.json +0 -112
  166. package/dist/models/backend1/django_app/modelwithcustompkrelation.d.ts +0 -118
  167. package/dist/models/backend1/django_app/modelwithcustompkrelation.js +0 -71
  168. package/dist/models/backend1/django_app/modelwithcustompkrelation.schema.json +0 -93
  169. package/dist/models/backend1/django_app/modelwithrestrictedfields.d.ts +0 -134
  170. package/dist/models/backend1/django_app/modelwithrestrictedfields.js +0 -71
  171. package/dist/models/backend1/django_app/modelwithrestrictedfields.schema.json +0 -111
  172. package/dist/models/backend1/django_app/namefiltercustompkmodel.d.ts +0 -92
  173. package/dist/models/backend1/django_app/namefiltercustompkmodel.js +0 -69
  174. package/dist/models/backend1/django_app/namefiltercustompkmodel.schema.json +0 -71
  175. package/dist/models/backend1/django_app/order.d.ts +0 -220
  176. package/dist/models/backend1/django_app/order.js +0 -71
  177. package/dist/models/backend1/django_app/order.schema.json +0 -203
  178. package/dist/models/backend1/django_app/orderitem.d.ts +0 -172
  179. package/dist/models/backend1/django_app/orderitem.js +0 -72
  180. package/dist/models/backend1/django_app/orderitem.schema.json +0 -149
  181. package/dist/models/backend1/django_app/product.d.ts +0 -254
  182. package/dist/models/backend1/django_app/product.js +0 -71
  183. package/dist/models/backend1/django_app/product.schema.json +0 -277
  184. package/dist/models/backend1/django_app/productcategory.d.ts +0 -92
  185. package/dist/models/backend1/django_app/productcategory.js +0 -69
  186. package/dist/models/backend1/django_app/productcategory.schema.json +0 -70
  187. package/dist/models/backend1/django_app/rateplan.d.ts +0 -92
  188. package/dist/models/backend1/django_app/rateplan.js +0 -69
  189. package/dist/models/backend1/django_app/rateplan.schema.json +0 -70
  190. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.d.ts +0 -108
  191. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.js +0 -69
  192. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.schema.json +0 -87
  193. package/dist/models/backend1/fileobject.d.ts +0 -4
  194. package/dist/models/backend1/fileobject.js +0 -9
  195. package/dist/models/backend1/index.d.ts +0 -2
  196. package/dist/models/backend1/index.js +0 -2
  197. package/dist/models/default/django_app/comprehensivemodel.d.ts +0 -894
  198. package/dist/models/default/django_app/comprehensivemodel.js +0 -71
  199. package/dist/models/default/django_app/comprehensivemodel.schema.json +0 -870
  200. package/dist/models/default/django_app/custompkmodel.d.ts +0 -92
  201. package/dist/models/default/django_app/custompkmodel.js +0 -69
  202. package/dist/models/default/django_app/custompkmodel.schema.json +0 -71
  203. package/dist/models/default/django_app/dailyrate.d.ts +0 -230
  204. package/dist/models/default/django_app/dailyrate.js +0 -71
  205. package/dist/models/default/django_app/dailyrate.schema.json +0 -212
  206. package/dist/models/default/django_app/deepmodellevel1.d.ts +0 -128
  207. package/dist/models/default/django_app/deepmodellevel1.js +0 -72
  208. package/dist/models/default/django_app/deepmodellevel1.schema.json +0 -102
  209. package/dist/models/default/django_app/deepmodellevel2.d.ts +0 -106
  210. package/dist/models/default/django_app/deepmodellevel2.js +0 -71
  211. package/dist/models/default/django_app/deepmodellevel2.schema.json +0 -80
  212. package/dist/models/default/django_app/deepmodellevel3.d.ts +0 -80
  213. package/dist/models/default/django_app/deepmodellevel3.js +0 -69
  214. package/dist/models/default/django_app/deepmodellevel3.schema.json +0 -57
  215. package/dist/models/default/django_app/dummymodel.d.ts +0 -122
  216. package/dist/models/default/django_app/dummymodel.js +0 -71
  217. package/dist/models/default/django_app/dummymodel.schema.json +0 -97
  218. package/dist/models/default/django_app/dummyrelatedmodel.d.ts +0 -80
  219. package/dist/models/default/django_app/dummyrelatedmodel.js +0 -69
  220. package/dist/models/default/django_app/dummyrelatedmodel.schema.json +0 -57
  221. package/dist/models/default/django_app/filetest.d.ts +0 -128
  222. package/dist/models/default/django_app/filetest.js +0 -69
  223. package/dist/models/default/django_app/filetest.schema.json +0 -99
  224. package/dist/models/default/django_app/index.d.ts +0 -1
  225. package/dist/models/default/django_app/index.js +0 -21
  226. package/dist/models/default/django_app/m2mdepthtestlevel1.d.ts +0 -118
  227. package/dist/models/default/django_app/m2mdepthtestlevel1.js +0 -71
  228. package/dist/models/default/django_app/m2mdepthtestlevel1.schema.json +0 -94
  229. package/dist/models/default/django_app/m2mdepthtestlevel2.d.ts +0 -118
  230. package/dist/models/default/django_app/m2mdepthtestlevel2.js +0 -71
  231. package/dist/models/default/django_app/m2mdepthtestlevel2.schema.json +0 -94
  232. package/dist/models/default/django_app/m2mdepthtestlevel3.d.ts +0 -134
  233. package/dist/models/default/django_app/m2mdepthtestlevel3.js +0 -71
  234. package/dist/models/default/django_app/m2mdepthtestlevel3.schema.json +0 -112
  235. package/dist/models/default/django_app/modelwithcustompkrelation.d.ts +0 -118
  236. package/dist/models/default/django_app/modelwithcustompkrelation.js +0 -71
  237. package/dist/models/default/django_app/modelwithcustompkrelation.schema.json +0 -93
  238. package/dist/models/default/django_app/modelwithrestrictedfields.d.ts +0 -134
  239. package/dist/models/default/django_app/modelwithrestrictedfields.js +0 -71
  240. package/dist/models/default/django_app/modelwithrestrictedfields.schema.json +0 -111
  241. package/dist/models/default/django_app/namefiltercustompkmodel.d.ts +0 -92
  242. package/dist/models/default/django_app/namefiltercustompkmodel.js +0 -69
  243. package/dist/models/default/django_app/namefiltercustompkmodel.schema.json +0 -71
  244. package/dist/models/default/django_app/order.d.ts +0 -220
  245. package/dist/models/default/django_app/order.js +0 -71
  246. package/dist/models/default/django_app/order.schema.json +0 -203
  247. package/dist/models/default/django_app/orderitem.d.ts +0 -172
  248. package/dist/models/default/django_app/orderitem.js +0 -72
  249. package/dist/models/default/django_app/orderitem.schema.json +0 -149
  250. package/dist/models/default/django_app/product.d.ts +0 -254
  251. package/dist/models/default/django_app/product.js +0 -71
  252. package/dist/models/default/django_app/product.schema.json +0 -277
  253. package/dist/models/default/django_app/productcategory.d.ts +0 -92
  254. package/dist/models/default/django_app/productcategory.js +0 -69
  255. package/dist/models/default/django_app/productcategory.schema.json +0 -70
  256. package/dist/models/default/django_app/rateplan.d.ts +0 -92
  257. package/dist/models/default/django_app/rateplan.js +0 -69
  258. package/dist/models/default/django_app/rateplan.schema.json +0 -70
  259. package/dist/models/default/django_app/restrictedfieldrelatedmodel.d.ts +0 -108
  260. package/dist/models/default/django_app/restrictedfieldrelatedmodel.js +0 -69
  261. package/dist/models/default/django_app/restrictedfieldrelatedmodel.schema.json +0 -87
  262. package/dist/models/default/fileobject.d.ts +0 -4
  263. package/dist/models/default/fileobject.js +0 -9
  264. package/dist/models/default/index.d.ts +0 -2
  265. package/dist/models/default/index.js +0 -2
  266. package/dist/models/index.d.ts +0 -1
  267. package/dist/models/index.js +0 -5
  268. package/dist/react-entry.d.ts +0 -2
  269. package/dist/react-entry.js +0 -2
  270. package/dist/reactiveAdaptor.d.ts +0 -24
  271. package/dist/reactiveAdaptor.js +0 -38
  272. package/dist/reset.d.ts +0 -15
  273. package/dist/reset.js +0 -97
  274. package/dist/setup.d.ts +0 -15
  275. package/dist/setup.js +0 -33
  276. package/dist/syncEngine/cache/cache.d.ts +0 -75
  277. package/dist/syncEngine/cache/cache.js +0 -355
  278. package/dist/syncEngine/metrics/metricOptCalcs.d.ts +0 -79
  279. package/dist/syncEngine/metrics/metricOptCalcs.js +0 -284
  280. package/dist/syncEngine/registries/metricRegistry.d.ts +0 -58
  281. package/dist/syncEngine/registries/metricRegistry.js +0 -171
  282. package/dist/syncEngine/registries/modelStoreRegistry.d.ts +0 -11
  283. package/dist/syncEngine/registries/modelStoreRegistry.js +0 -63
  284. package/dist/syncEngine/registries/querysetStoreGraph.d.ts +0 -41
  285. package/dist/syncEngine/registries/querysetStoreGraph.js +0 -174
  286. package/dist/syncEngine/registries/querysetStoreRegistry.d.ts +0 -72
  287. package/dist/syncEngine/registries/querysetStoreRegistry.js +0 -335
  288. package/dist/syncEngine/stores/metricStore.d.ts +0 -55
  289. package/dist/syncEngine/stores/metricStore.js +0 -222
  290. package/dist/syncEngine/stores/modelStore.d.ts +0 -53
  291. package/dist/syncEngine/stores/modelStore.js +0 -565
  292. package/dist/syncEngine/stores/operation.d.ts +0 -139
  293. package/dist/syncEngine/stores/operation.js +0 -291
  294. package/dist/syncEngine/stores/operationEventHandlers.d.ts +0 -8
  295. package/dist/syncEngine/stores/operationEventHandlers.js +0 -322
  296. package/dist/syncEngine/stores/querysetStore.d.ts +0 -60
  297. package/dist/syncEngine/stores/querysetStore.js +0 -294
  298. package/dist/syncEngine/stores/reactivity.d.ts +0 -3
  299. package/dist/syncEngine/stores/reactivity.js +0 -4
  300. package/dist/syncEngine/stores/utils.d.ts +0 -14
  301. package/dist/syncEngine/stores/utils.js +0 -32
  302. package/dist/syncEngine/sync.d.ts +0 -46
  303. package/dist/syncEngine/sync.js +0 -389
  304. package/dist/testing.d.ts +0 -63
  305. package/dist/testing.js +0 -175
  306. package/dist/vue-entry.d.ts +0 -15
  307. package/dist/vue-entry.js +0 -7
@@ -1,14 +0,0 @@
1
- /**
2
- * Guarantees an array of operations, is an array of operations. Handles
3
- * the basic failure case of a single operation.
4
- */
5
- export function validateOperationsArray(operationsArray: any): any;
6
- /**
7
- * Extract the minimal signature we're using for “direct‐match” comparison.
8
- */
9
- export function getFingerprint(qs: any): {
10
- nodes: any;
11
- initialQueryset: any;
12
- offset: any;
13
- limit: any;
14
- };
@@ -1,32 +0,0 @@
1
- import { isNil, isEqual } from 'lodash-es';
2
- import { filter } from '../../filtering/localFiltering.js';
3
- /**
4
- * Guarantees an array of operations, is an array of operations. Handles
5
- * the basic failure case of a single operation.
6
- */
7
- export function validateOperationsArray(operationsArray) {
8
- // verify the operations list
9
- if (Array.isArray(operationsArray)) {
10
- if (operationsArray.length > 0) {
11
- if (!(operationsArray[0] instanceof Operation)) {
12
- throw new Error(`operationsArray must be Operations not ${typeof (operationsArray[0])}`);
13
- }
14
- }
15
- }
16
- else if (!isNil(operationsArray)) {
17
- if (!(operationsArray instanceof Operation)) {
18
- throw new Error(`operationsArray must be Operations not ${typeof (operationsArray)}`);
19
- }
20
- operationsArray = [operationsArray]; // coerce it to be an array
21
- }
22
- return operationsArray;
23
- }
24
- /**
25
- * Extract the minimal signature we're using for “direct‐match” comparison.
26
- */
27
- export function getFingerprint(qs) {
28
- const { nodes } = qs;
29
- const initialQueryset = qs._initialQueryset;
30
- const { offset = null, limit = null } = qs._serializerOptions || {};
31
- return { nodes, initialQueryset, offset, limit };
32
- }
@@ -1,46 +0,0 @@
1
- export class EventPayload {
2
- constructor(data: any);
3
- event: any;
4
- model: any;
5
- operation_id: any;
6
- pk_field_name: any;
7
- configKey: any;
8
- instances: any;
9
- _cachedInstances: any;
10
- get modelClass(): Function | null;
11
- getFullInstances(): Promise<any>;
12
- }
13
- export class SyncManager {
14
- registries: Map<any, any>;
15
- followedModels: Map<any, any>;
16
- followAllQuerysets: boolean;
17
- followedQuerysets: Map<any, any>;
18
- periodicSyncTimer: NodeJS.Timeout | null;
19
- eventBatch: Map<any, any>;
20
- debounceTimer: NodeJS.Timeout | null;
21
- maxWaitTimer: NodeJS.Timeout | null;
22
- debounceMs: number;
23
- maxWaitMs: number;
24
- batchStartTime: number | null;
25
- withTimeout(promise: any, ms: any): Promise<any>;
26
- /**
27
- * Initialize event handlers for all event receivers
28
- */
29
- initialize(): void;
30
- startPeriodicSync(): void;
31
- syncStaleQuerysets(): Promise<void>;
32
- pruneUnreferencedModels(): void;
33
- isStoreFollowed(registry: any, semanticKey: any): boolean;
34
- cleanup(): void;
35
- followModel(registry: any, modelClass: any): void;
36
- unfollowModel(registry: any, modelClass: any): void;
37
- manageRegistry(registry: any): void;
38
- removeRegistry(registry: any): void;
39
- handleEvent: (event: any) => void;
40
- processBatch(reason?: string): void;
41
- isQuerysetFollowed(queryset: any): boolean;
42
- processQuerysetsBatch(representativeEvent: any, allEvents: any): void;
43
- processMetrics(event: any): void;
44
- processModels(event: any): void;
45
- }
46
- export const syncManager: SyncManager;
@@ -1,389 +0,0 @@
1
- import { getAllEventReceivers } from "../core/eventReceivers.js";
2
- import { operationRegistry } from "./stores/operation.js";
3
- import { initializeAllEventReceivers } from "../config.js";
4
- import { getEventReceiver } from "../core/eventReceivers.js";
5
- import { querysetStoreRegistry, QuerysetStoreRegistry, } from "./registries/querysetStoreRegistry.js";
6
- import { modelStoreRegistry, ModelStoreRegistry, } from "./registries/modelStoreRegistry.js";
7
- import { metricRegistry, MetricRegistry } from "./registries/metricRegistry.js";
8
- import { getModelClass, getConfig } from "../config.js";
9
- import { isNil } from "lodash-es";
10
- import { QuerysetStore } from "./stores/querysetStore.js";
11
- import { v7 as uuidv7 } from "uuid";
12
- export class EventPayload {
13
- constructor(data) {
14
- this.event = data.event;
15
- this.model = data.model;
16
- this.operation_id = data.operation_id;
17
- this.pk_field_name = data.pk_field_name;
18
- this.configKey = data.configKey;
19
- // Parse PK fields to numbers in instances
20
- this.instances = data.instances?.map(instance => {
21
- if (instance && this.pk_field_name && instance[this.pk_field_name] != null) {
22
- return {
23
- ...instance,
24
- [this.pk_field_name]: Number(instance[this.pk_field_name])
25
- };
26
- }
27
- return instance;
28
- }) || data.instances;
29
- this._cachedInstances = null;
30
- }
31
- get modelClass() {
32
- return getModelClass(this.model, this.configKey);
33
- }
34
- async getFullInstances() {
35
- if (this.event === "delete") {
36
- throw new Error("Cannot fetch full instances for delete operation bozo...");
37
- }
38
- if (isNil(this._cachedInstances)) {
39
- this._cachedInstances = await this.modelClass.objects
40
- .filter({
41
- [`${this.modelClass.primaryKeyField}__in`]: this.instances.map((instance) => instance[this.modelClass.primaryKeyField]),
42
- })
43
- .fetch();
44
- }
45
- return this._cachedInstances;
46
- }
47
- }
48
- export class SyncManager {
49
- constructor() {
50
- this.handleEvent = (event) => {
51
- let payload = new EventPayload(event);
52
- let isLocalOperation = operationRegistry.has(payload.operation_id);
53
- // Always process metrics immediately (they're lightweight)
54
- if (this.registries.has(MetricRegistry)) {
55
- this.processMetrics(payload);
56
- }
57
- if (isLocalOperation) {
58
- return;
59
- }
60
- // Add to batch for queryset/model processing
61
- const key = `${event.model}::${event.configKey}`;
62
- const now = Date.now();
63
- // If this is the first event in the batch, start max wait timer
64
- if (this.eventBatch.size === 0) {
65
- this.batchStartTime = now;
66
- this.maxWaitTimer = setTimeout(() => {
67
- this.processBatch("maxWait");
68
- }, this.maxWaitMs);
69
- }
70
- this.eventBatch.set(key, {
71
- event: payload,
72
- firstSeen: this.eventBatch.has(key)
73
- ? this.eventBatch.get(key).firstSeen
74
- : now,
75
- });
76
- // Reset debounce timer
77
- if (this.debounceTimer) {
78
- clearTimeout(this.debounceTimer);
79
- }
80
- this.debounceTimer = setTimeout(() => {
81
- this.processBatch("debounce");
82
- }, this.debounceMs);
83
- };
84
- this.registries = new Map();
85
- // Map of registries to model sets
86
- this.followedModels = new Map();
87
- // Map of querysets to keep synced
88
- this.followAllQuerysets = true;
89
- this.followedQuerysets = new Map();
90
- this.periodicSyncTimer = null;
91
- // Batching for event processing
92
- this.eventBatch = new Map(); // model::configKey -> { event, firstSeen }
93
- this.debounceTimer = null;
94
- this.maxWaitTimer = null;
95
- this.debounceMs = 100; // Wait for rapid events to settle
96
- this.maxWaitMs = 2000; // Maximum time to hold events
97
- this.batchStartTime = null;
98
- }
99
- withTimeout(promise, ms) {
100
- // If no timeout specified, use 2x the periodic sync interval, or 30s as fallback
101
- if (!ms) {
102
- try {
103
- const config = getConfig();
104
- const intervalSeconds = config.periodicSyncIntervalSeconds;
105
- ms = intervalSeconds ? intervalSeconds * 2000 : 30000; // 2x interval in ms, or 30s default
106
- }
107
- catch {
108
- ms = 30000; // 30s fallback if no config
109
- }
110
- }
111
- return Promise.race([
112
- promise,
113
- new Promise((_, reject) => setTimeout(() => reject(new Error(`Sync timeout after ${ms}ms`)), ms)),
114
- ]);
115
- }
116
- /**
117
- * Initialize event handlers for all event receivers
118
- */
119
- initialize() {
120
- // Initialize all event receivers
121
- initializeAllEventReceivers();
122
- // Get all registered event receivers
123
- const eventReceivers = getAllEventReceivers();
124
- // Register the event handlers with each receiver
125
- eventReceivers.forEach((receiver, configKey) => {
126
- if (receiver) {
127
- // Model events go to handleEvent
128
- receiver.addModelEventHandler(this.handleEvent.bind(this));
129
- }
130
- });
131
- this.startPeriodicSync();
132
- }
133
- startPeriodicSync() {
134
- if (this.periodicSyncTimer)
135
- return;
136
- try {
137
- const config = getConfig();
138
- const intervalSeconds = config.periodicSyncIntervalSeconds;
139
- // If null or undefined, don't start periodic sync
140
- if (!intervalSeconds) {
141
- console.log("[SyncManager] Periodic sync disabled (set to null)");
142
- return;
143
- }
144
- const intervalMs = intervalSeconds * 1000;
145
- this.periodicSyncTimer = setInterval(() => {
146
- this.syncStaleQuerysets();
147
- }, intervalMs);
148
- console.log(`[SyncManager] Periodic sync started: ${intervalSeconds}s intervals`);
149
- }
150
- catch (error) {
151
- // If no config, don't start periodic sync by default
152
- console.log("[SyncManager] No config found, periodic sync disabled by default");
153
- }
154
- }
155
- async syncStaleQuerysets() {
156
- const querysetRegistry = this.registries.get(QuerysetStoreRegistry);
157
- if (!querysetRegistry)
158
- return;
159
- // Generate operationId for this sync batch - querysets in same chain will coordinate
160
- const operationId = `periodic-sync-${uuidv7()}`;
161
- // Get dbSynced keys (followed querysets)
162
- const dbSyncedKeys = new Set([...this.followedQuerysets].map(qs => qs.semanticKey));
163
- // Collect all stores to sync
164
- const storesToSync = [];
165
- for (const [semanticKey, store] of querysetRegistry._stores.entries()) {
166
- const isFollowed = this.isStoreFollowed(querysetRegistry, semanticKey);
167
- if (this.followAllQuerysets || isFollowed) {
168
- storesToSync.push(store);
169
- }
170
- }
171
- if (storesToSync.length > 0) {
172
- console.log(`[SyncManager] Periodic sync: syncing ${storesToSync.length} stores`);
173
- // Run all groupSync calls in parallel - they coordinate via shared promise cache
174
- await Promise.all(storesToSync.map(store => querysetRegistry.groupSync(store.queryset, operationId, dbSyncedKeys)));
175
- }
176
- // Prune unreferenced model instances
177
- this.pruneUnreferencedModels();
178
- }
179
- pruneUnreferencedModels() {
180
- const modelRegistry = this.registries.get(ModelStoreRegistry);
181
- const querysetRegistry = this.registries.get(QuerysetStoreRegistry);
182
- if (!modelRegistry || !querysetRegistry)
183
- return;
184
- // Prune each model store
185
- for (const [modelClass, store] of modelRegistry._stores.entries()) {
186
- store.pruneUnreferencedInstances(querysetRegistry);
187
- }
188
- }
189
- isStoreFollowed(registry, semanticKey) {
190
- const followingQuerysets = registry.followingQuerysets.get(semanticKey);
191
- if (!followingQuerysets)
192
- return false;
193
- return [...followingQuerysets].some((queryset) => {
194
- return this.isQuerysetFollowed(queryset);
195
- });
196
- }
197
- cleanup() {
198
- if (this.periodicSyncTimer) {
199
- clearInterval(this.periodicSyncTimer);
200
- this.periodicSyncTimer = null;
201
- }
202
- // Clean up batch timers
203
- if (this.debounceTimer) {
204
- clearTimeout(this.debounceTimer);
205
- this.debounceTimer = null;
206
- }
207
- if (this.maxWaitTimer) {
208
- clearTimeout(this.maxWaitTimer);
209
- this.maxWaitTimer = null;
210
- }
211
- }
212
- followModel(registry, modelClass) {
213
- const models = this.followedModels.get(registry) || new Set();
214
- this.followedModels.set(registry, models);
215
- if (models.has(modelClass))
216
- return;
217
- const alreadyFollowed = [...this.followedModels.values()].some((set) => set.has(modelClass));
218
- models.add(modelClass);
219
- if (!alreadyFollowed) {
220
- getEventReceiver(modelClass.configKey)?.subscribe(modelClass.modelName, this.handleEvent);
221
- }
222
- }
223
- unfollowModel(registry, modelClass) {
224
- const models = this.followedModels.get(registry);
225
- if (!models)
226
- return;
227
- models.delete(modelClass);
228
- const stillFollowed = [...this.followedModels.values()].some((set) => set.has(modelClass));
229
- if (!stillFollowed) {
230
- getEventReceiver(modelClass.configKey)?.unsubscribe(modelClass.modelName, this.handleEvent);
231
- }
232
- }
233
- manageRegistry(registry) {
234
- this.registries.set(registry.constructor, registry);
235
- registry.setSyncManager(this);
236
- }
237
- removeRegistry(registry) {
238
- this.registries.delete(registry.constructor);
239
- }
240
- processBatch(reason = "unknown") {
241
- if (this.eventBatch.size === 0)
242
- return;
243
- // Clear timers
244
- if (this.debounceTimer) {
245
- clearTimeout(this.debounceTimer);
246
- this.debounceTimer = null;
247
- }
248
- if (this.maxWaitTimer) {
249
- clearTimeout(this.maxWaitTimer);
250
- this.maxWaitTimer = null;
251
- }
252
- const events = Array.from(this.eventBatch.values()).map((item) => item.event);
253
- const waitTime = Date.now() - this.batchStartTime;
254
- this.eventBatch.clear();
255
- this.batchStartTime = null;
256
- console.log(`[SyncManager] Processing batch of ${events.length} events (reason: ${reason}, waited: ${waitTime}ms)`);
257
- // Group events by model for efficient processing
258
- const eventsByModel = new Map();
259
- events.forEach((event) => {
260
- const key = `${event.model}::${event.configKey}`;
261
- if (!eventsByModel.has(key)) {
262
- eventsByModel.set(key, []);
263
- }
264
- eventsByModel.get(key).push(event);
265
- });
266
- // Process each model's events as a batch
267
- eventsByModel.forEach((modelEvents, modelKey) => {
268
- const event = modelEvents[0]; // Use first event as representative
269
- if (this.registries.has(QuerysetStoreRegistry)) {
270
- this.processQuerysetsBatch(event, modelEvents);
271
- }
272
- if (this.registries.has(ModelStoreRegistry)) {
273
- this.processModels(event);
274
- }
275
- });
276
- }
277
- isQuerysetFollowed(queryset) {
278
- const activeSemanticKeys = new Set([...this.followedQuerysets].map((qs) => qs.semanticKey));
279
- let current = queryset;
280
- while (current) {
281
- if (activeSemanticKeys.has(current.semanticKey)) {
282
- return true;
283
- }
284
- current = current.__parent;
285
- }
286
- return false;
287
- }
288
- processQuerysetsBatch(representativeEvent, allEvents) {
289
- const registry = this.registries.get(QuerysetStoreRegistry);
290
- // Collect all stores that need syncing for this model
291
- const storesToSync = [];
292
- for (const [semanticKey, store] of registry._stores.entries()) {
293
- if (store.modelClass.modelName === representativeEvent.model &&
294
- store.modelClass.configKey === representativeEvent.configKey) {
295
- if (this.followAllQuerysets) {
296
- storesToSync.push(store);
297
- continue;
298
- }
299
- const followingQuerysets = registry.followingQuerysets.get(semanticKey);
300
- if (followingQuerysets) {
301
- const shouldSync = [...followingQuerysets].some((queryset) => {
302
- return this.isQuerysetFollowed(queryset);
303
- });
304
- if (shouldSync) {
305
- storesToSync.push(store);
306
- }
307
- }
308
- }
309
- }
310
- if (storesToSync.length === 0)
311
- return;
312
- // Sync all relevant stores for this model
313
- console.log(`[SyncManager] Syncing ${storesToSync.length} queryset stores for ${representativeEvent.model}`);
314
- // Generate operationId for this batch - querysets in same chain will coordinate
315
- const operationId = `remote-event-${uuidv7()}`;
316
- // Get dbSynced keys (followed querysets)
317
- const dbSyncedKeys = new Set([...this.followedQuerysets].map(qs => qs.semanticKey));
318
- // Run all groupSync calls in parallel - they coordinate via shared promise cache
319
- Promise.all(storesToSync.map(store => registry.groupSync(store.queryset, operationId, dbSyncedKeys)));
320
- }
321
- processMetrics(event) {
322
- const registry = this.registries.get(MetricRegistry);
323
- for (const [key, entry] of registry._stores.entries()) {
324
- // Check if the store has a queryset with the model class AND correct backend
325
- if (entry.queryset &&
326
- entry.queryset.modelClass.modelName === event.model &&
327
- entry.queryset.modelClass.configKey === event.configKey) {
328
- if (this.followAllQuerysets) {
329
- entry.store.sync();
330
- continue;
331
- }
332
- // Check if this queryset (or any parent) is being followed
333
- if (this.isQuerysetFollowed(entry.queryset)) {
334
- console.log(`syncing metric store for key: ${key}`);
335
- entry.store.sync();
336
- }
337
- }
338
- }
339
- }
340
- processModels(event) {
341
- const registry = this.registries.get(ModelStoreRegistry);
342
- if (!registry)
343
- return;
344
- const modelStore = registry.getStore(event.modelClass);
345
- if (!modelStore)
346
- return;
347
- // Get PKs from the event
348
- const eventPks = new Set((event.instances || [])
349
- .filter(inst => inst && inst[event.pk_field_name] != null)
350
- .map(inst => inst[event.pk_field_name]));
351
- if (eventPks.size === 0)
352
- return;
353
- // Get PKs that are already in the model store's ground truth
354
- const groundTruthPks = new Set(modelStore.groundTruthPks);
355
- // Get PKs that are top-level in ANY queryset for this model (not just followed ones)
356
- const querysetRegistry = this.registries.get(QuerysetStoreRegistry);
357
- const topLevelQuerysetPks = new Set();
358
- if (querysetRegistry) {
359
- for (const [semanticKey, store] of querysetRegistry._stores.entries()) {
360
- // Check ALL querysets for this model (permanent and temporary)
361
- if (store.modelClass.modelName === event.model &&
362
- store.modelClass.configKey === event.configKey) {
363
- // Get this queryset's ground truth PKs (top-level instances)
364
- // Don't use render() as it applies operations - we just want ground truth
365
- store.groundTruthPks.forEach(pk => topLevelQuerysetPks.add(pk));
366
- }
367
- }
368
- }
369
- // Find PKs that are:
370
- // 1. In the event
371
- // 2. Already in ground truth (we're tracking them)
372
- // 3. NOT top-level in any queryset (they're only nested/included)
373
- const pksToSync = [];
374
- eventPks.forEach(pk => {
375
- if (groundTruthPks.has(pk) && !topLevelQuerysetPks.has(pk)) {
376
- pksToSync.push(pk);
377
- }
378
- });
379
- if (pksToSync.length > 0) {
380
- console.log(`[SyncManager] Syncing ${pksToSync.length} nested-only PKs for ${event.model}: ${pksToSync}`);
381
- modelStore.sync(pksToSync);
382
- }
383
- }
384
- }
385
- const syncManager = new SyncManager();
386
- syncManager.manageRegistry(querysetStoreRegistry);
387
- syncManager.manageRegistry(modelStoreRegistry);
388
- syncManager.manageRegistry(metricRegistry);
389
- export { syncManager };
package/dist/testing.d.ts DELETED
@@ -1,63 +0,0 @@
1
- export function createTestConfig({ apiUrl, backendKey, generatedTypesDir, generatedActionsDir, getAuthHeaders, testAuthUserId, testAuthHeaders, testAuthHeaderName, eventsType, fileRootURL, fileUploadMode, }: {
2
- apiUrl: any;
3
- backendKey?: string | undefined;
4
- generatedTypesDir?: string | undefined;
5
- generatedActionsDir: any;
6
- getAuthHeaders: any;
7
- testAuthUserId: any;
8
- testAuthHeaders: any;
9
- testAuthHeaderName?: string | undefined;
10
- eventsType?: string | undefined;
11
- fileRootURL: any;
12
- fileUploadMode: any;
13
- }): {
14
- config: {
15
- backendConfigs: {
16
- [backendKey]: {
17
- API_URL: any;
18
- GENERATED_TYPES_DIR: string;
19
- getAuthHeaders: () => any;
20
- events: {
21
- type: string;
22
- };
23
- };
24
- };
25
- };
26
- testHeaders: {
27
- setSeeding(enabled: any): void;
28
- setReset(enabled: any): void;
29
- setAuthUserId(userId: any): void;
30
- withSeeding(fn: any): any;
31
- withReset(fn: any): any;
32
- withAuthUserId(userId: any, fn: any): any;
33
- };
34
- };
35
- export function setupTestStateZero({ apiUrl, backendKey, generatedTypesDir, generatedActionsDir, getAuthHeaders, testAuthUserId, testAuthHeaders, testAuthHeaderName, eventsType, fileRootURL, fileUploadMode, getModelClass, adapters, }: {
36
- apiUrl: any;
37
- backendKey?: string | undefined;
38
- generatedTypesDir?: string | undefined;
39
- generatedActionsDir: any;
40
- getAuthHeaders: any;
41
- testAuthUserId: any;
42
- testAuthHeaders: any;
43
- testAuthHeaderName: any;
44
- eventsType?: string | undefined;
45
- fileRootURL: any;
46
- fileUploadMode: any;
47
- getModelClass: any;
48
- adapters: any;
49
- }): {
50
- setSeeding(enabled: any): void;
51
- setReset(enabled: any): void;
52
- setAuthUserId(userId: any): void;
53
- withSeeding(fn: any): any;
54
- withReset(fn: any): any;
55
- withAuthUserId(userId: any, fn: any): any;
56
- };
57
- export function createActionMocker(actionRegistry: any): {
58
- mock(actionName: any, handler: any, backendKey?: string): void;
59
- restore(actionName: any, backendKey?: string): void;
60
- restoreAll(): void;
61
- };
62
- export function seedRemote(testHeaders: any, seedFn: any): Promise<any>;
63
- export function resetRemote(testHeaders: any, resetFn: any): Promise<any>;