@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,355 +0,0 @@
1
- import axios from "axios";
2
- import { configInstance } from "../../config.js";
3
- import PQueue from "p-queue";
4
- /**
5
- * FileObject - A file wrapper that handles uploads to StateZero backend
6
- */
7
- export class FileObject {
8
- // Simple changes to FileObject constructor
9
- constructor(file, options = {}) {
10
- // Handle stored file data (from API)
11
- if (file &&
12
- typeof file === "object" &&
13
- file.file_path &&
14
- !(file instanceof File)) {
15
- // This is stored file data from the backend
16
- this.name = file.file_name;
17
- this.size = file.size;
18
- this.type = file.mime_type; // Now coming from backend
19
- this.lastModified = null;
20
- // Mark as already uploaded
21
- this.uploaded = true;
22
- this.uploading = false;
23
- this.uploadResult = file; // Store the entire response
24
- this.uploadError = null;
25
- this.fileData = null;
26
- // No upload properties needed
27
- this.uploadType = null;
28
- this.uploadId = null;
29
- this.totalChunks = 0;
30
- this.completedChunks = 0;
31
- this.chunkSize = null;
32
- this.maxConcurrency = null;
33
- this.uploadPromise = Promise.resolve(this.uploadResult);
34
- return;
35
- }
36
- // Handle File objects (for upload) - existing code
37
- if (!file || !(file instanceof File)) {
38
- throw new Error("FileObject requires a File object or stored file data");
39
- }
40
- // Store file metadata directly
41
- this.name = file.name;
42
- this.size = file.size;
43
- this.type = file.type;
44
- this.lastModified = file.lastModified;
45
- // Initialize state properties
46
- this.uploaded = false;
47
- this.uploading = false;
48
- this.uploadResult = null;
49
- this.uploadError = null;
50
- this.fileData = null;
51
- // Multipart upload properties
52
- this.uploadType = null; // 'single' or 'multipart'
53
- this.uploadId = null;
54
- this.totalChunks = 0;
55
- this.completedChunks = 0;
56
- this.chunkSize = options.chunkSize || 5 * 1024 * 1024; // 5MB default
57
- if (this.chunkSize < this.constructor.MIN_CHUNK_SIZE) {
58
- throw new Error(`Chunk size must be at least ${this.constructor.MIN_CHUNK_SIZE / (1024 * 1024)}MB for multipart uploads. ` +
59
- `Provided: ${this.chunkSize / (1024 * 1024)}MB`);
60
- }
61
- this.maxConcurrency = options.maxConcurrency || 3;
62
- this.uploadPromise = this._initializeAndStartUpload(file, options);
63
- }
64
- get isStoredFile() {
65
- return this.uploaded && !this.fileData && this.uploadResult?.file_path;
66
- }
67
- get status() {
68
- if (this.uploadError)
69
- return "failed";
70
- if (this.uploading)
71
- return "uploading";
72
- if (this.uploaded)
73
- return "uploaded";
74
- return "pending";
75
- }
76
- get filePath() {
77
- return this.uploadResult?.file_path;
78
- }
79
- get fileUrl() {
80
- if (!this.uploadResult?.file_url) {
81
- return null;
82
- }
83
- return configInstance.buildFileUrl(this.uploadResult.file_url, this.constructor.configKey);
84
- }
85
- async _initializeAndStartUpload(file, options) {
86
- const config = configInstance.getConfig();
87
- const backend = config.backendConfigs?.[this.constructor.configKey];
88
- if (!backend) {
89
- throw new Error(`No backend configuration found for key: ${this.constructor.configKey}`);
90
- }
91
- // Check if fast uploads are enabled
92
- if (backend.fileUploadMode === "s3") {
93
- return this._fastUpload(file, options);
94
- }
95
- else {
96
- // Read file data for direct upload
97
- await this._readFileData(file);
98
- return this._directUpload(options);
99
- }
100
- }
101
- /**
102
- * Fast upload using S3 presigned URLs with multipart support
103
- */
104
- async _fastUpload(file, options = {}) {
105
- if (this.uploading)
106
- return this.uploadPromise;
107
- if (this.uploaded)
108
- return Promise.resolve(this.uploadResult);
109
- this.uploading = true;
110
- this.uploadError = null;
111
- try {
112
- const config = configInstance.getConfig();
113
- const backend = config.backendConfigs[this.constructor.configKey];
114
- const baseUrl = backend.API_URL.replace(/\/+$/, "");
115
- const headers = backend.getAuthHeaders ? backend.getAuthHeaders() : {};
116
- // Determine if we need multipart upload
117
- const needsMultipart = this.size > this.chunkSize;
118
- const numChunks = needsMultipart
119
- ? Math.ceil(this.size / this.chunkSize)
120
- : 1;
121
- this.totalChunks = numChunks;
122
- this.uploadType = needsMultipart ? "multipart" : "single";
123
- // Step 1: Initiate fast upload
124
- const initiateResponse = await axios.post(`${baseUrl}/files/fast-upload/`, {
125
- action: "initiate",
126
- filename: this.name,
127
- content_type: this.type,
128
- file_size: this.size,
129
- num_chunks: numChunks,
130
- }, { headers });
131
- const uploadData = initiateResponse.data;
132
- if (uploadData.upload_type === "single") {
133
- // Single file upload
134
- return await this._singleUpload(file, uploadData, options);
135
- }
136
- else {
137
- // Multipart upload
138
- this.uploadId = uploadData.upload_id;
139
- return await this._multipartUpload(file, uploadData, options);
140
- }
141
- }
142
- catch (error) {
143
- this.uploading = false;
144
- this.uploadError =
145
- error.response?.data?.error || error.message || "Fast upload failed";
146
- const uploadFailedError = new Error(`Fast upload failed: ${this.uploadError}`);
147
- uploadFailedError.originalError = error;
148
- throw uploadFailedError;
149
- }
150
- }
151
- /**
152
- * Handle single file upload
153
- */
154
- async _singleUpload(file, uploadData, options) {
155
- const { upload_url, content_type, file_path } = uploadData;
156
- // Upload directly to S3 using PUT with raw file
157
- await axios.put(upload_url, file, {
158
- headers: {
159
- "Content-Type": content_type,
160
- },
161
- ...(options.onProgress && {
162
- onUploadProgress: (progressEvent) => {
163
- const total = progressEvent.total > 0 ? progressEvent.total : 0;
164
- const percentage = total > 0 ? Math.round((progressEvent.loaded / total) * 100) : 0;
165
- if (options.onProgress) {
166
- options.onProgress(percentage);
167
- }
168
- },
169
- }),
170
- });
171
- // Complete the upload
172
- return await this._completeUpload(file_path, this.name);
173
- }
174
- /**
175
- * Handle multipart upload with concurrency using p-queue
176
- */
177
- async _multipartUpload(file, uploadData, options) {
178
- const { upload_urls, file_path } = uploadData;
179
- const parts = [];
180
- const chunks = this._createFileChunks(file);
181
- // Create p-queue instance with concurrency control
182
- const queue = new PQueue({
183
- concurrency: this.maxConcurrency,
184
- });
185
- // Create upload tasks for each chunk
186
- const uploadTasks = chunks.map((chunk, index) => {
187
- const partNumber = index + 1;
188
- const uploadUrl = upload_urls[partNumber];
189
- return queue.add(async () => {
190
- try {
191
- const response = await axios.put(uploadUrl, chunk, {
192
- headers: {
193
- "Content-Type": "application/octet-stream",
194
- },
195
- });
196
- const etag = response.headers.etag?.replace(/"/g, "");
197
- parts[index] = {
198
- PartNumber: partNumber,
199
- ETag: etag,
200
- };
201
- this.completedChunks++;
202
- // Report progress
203
- if (options.onProgress) {
204
- const progress = Math.round((this.completedChunks / this.totalChunks) * 100);
205
- options.onProgress(progress);
206
- }
207
- return parts[index];
208
- }
209
- catch (error) {
210
- console.error(`Failed to upload chunk ${partNumber}:`, error);
211
- throw error;
212
- }
213
- });
214
- });
215
- // Wait for all uploads to complete
216
- await Promise.all(uploadTasks);
217
- // Complete multipart upload
218
- return await this._completeUpload(file_path, this.name, this.uploadId, parts);
219
- }
220
- /**
221
- * Create file chunks for multipart upload
222
- */
223
- _createFileChunks(file) {
224
- const chunks = [];
225
- let offset = 0;
226
- while (offset < file.size) {
227
- const chunkSize = Math.min(this.chunkSize, file.size - offset);
228
- const chunk = file.slice(offset, offset + chunkSize);
229
- chunks.push(chunk);
230
- offset += chunkSize;
231
- }
232
- return chunks;
233
- }
234
- /**
235
- * Complete the upload (both single and multipart)
236
- */
237
- async _completeUpload(filePath, originalName, uploadId = null, parts = null) {
238
- const config = configInstance.getConfig();
239
- const backend = config.backendConfigs[this.constructor.configKey];
240
- const baseUrl = backend.API_URL.replace(/\/+$/, "");
241
- const headers = backend.getAuthHeaders ? backend.getAuthHeaders() : {};
242
- const completeData = {
243
- action: "complete",
244
- file_path: filePath,
245
- original_name: originalName,
246
- };
247
- if (uploadId && parts) {
248
- completeData.upload_id = uploadId;
249
- completeData.parts = parts;
250
- }
251
- const completeResponse = await axios.post(`${baseUrl}/files/fast-upload/`, completeData, { headers });
252
- this.uploadResult = {
253
- ...completeResponse.data,
254
- uploadedAt: new Date(),
255
- };
256
- this.uploaded = true;
257
- this.uploading = false;
258
- return this.uploadResult;
259
- }
260
- /**
261
- * Direct upload to Django backend (original method)
262
- */
263
- async _directUpload(options = {}) {
264
- if (this.uploading)
265
- return this.uploadPromise;
266
- if (this.uploaded)
267
- return Promise.resolve(this.uploadResult);
268
- if (this.uploadError && !this.uploading && !this.uploaded) {
269
- return Promise.reject(new Error(`Cannot upload: file processing failed earlier - ${this.uploadError}`));
270
- }
271
- this.uploading = true;
272
- this.uploadError = null;
273
- try {
274
- if (!this.fileData) {
275
- throw new Error("File data is not available. Upload cannot proceed.");
276
- }
277
- const config = configInstance.getConfig();
278
- const backend = config.backendConfigs[this.constructor.configKey];
279
- if (!backend.API_URL) {
280
- throw new Error(`API_URL is not defined in backend configuration for key: ${this.constructor.configKey}`);
281
- }
282
- const formData = new FormData();
283
- const fileBlob = this.getBlob();
284
- const reconstructedFile = new File([fileBlob], this.name, {
285
- type: this.type,
286
- lastModified: this.lastModified,
287
- });
288
- formData.append("file", reconstructedFile);
289
- if (options.additionalFields) {
290
- Object.entries(options.additionalFields).forEach(([key, value]) => {
291
- formData.append(key, value);
292
- });
293
- }
294
- const baseUrl = backend.API_URL.replace(/\/+$/, "");
295
- const uploadUrl = `${baseUrl}/files/upload/`;
296
- const headers = backend.getAuthHeaders ? backend.getAuthHeaders() : {};
297
- const response = await axios.post(uploadUrl, formData, {
298
- headers: {
299
- ...headers,
300
- "Content-Type": "multipart/form-data",
301
- },
302
- ...(options.onProgress && {
303
- onUploadProgress: (progressEvent) => {
304
- const total = progressEvent.total > 0 ? progressEvent.total : 0;
305
- const percentage = total > 0 ? Math.round((progressEvent.loaded / total) * 100) : 0;
306
- if (options.onProgress) {
307
- options.onProgress(percentage);
308
- }
309
- },
310
- }),
311
- });
312
- this.uploadResult = {
313
- ...response.data,
314
- uploadedAt: new Date(),
315
- };
316
- this.uploaded = true;
317
- this.uploading = false;
318
- return this.uploadResult;
319
- }
320
- catch (error) {
321
- this.uploading = false;
322
- this.uploadError =
323
- error.response?.data?.error || error.message || "Unknown upload error";
324
- const uploadFailedError = new Error(`Upload failed: ${this.uploadError}`);
325
- uploadFailedError.originalError = error;
326
- throw uploadFailedError;
327
- }
328
- }
329
- /**
330
- * Reads the file content into an ArrayBuffer (for direct uploads only)
331
- */
332
- async _readFileData(file) {
333
- try {
334
- this.fileData = await file.arrayBuffer();
335
- }
336
- catch (error) {
337
- console.error("Failed to read file data:", error);
338
- throw new Error(`Failed to read file data: ${error.message}`);
339
- }
340
- }
341
- /**
342
- * Gets the file data as a Blob (for direct uploads only)
343
- */
344
- getBlob() {
345
- if (!this.fileData) {
346
- throw new Error("File data not yet loaded or failed to load.");
347
- }
348
- return new Blob([this.fileData], { type: this.type });
349
- }
350
- async waitForUpload() {
351
- return this.uploadPromise;
352
- }
353
- }
354
- FileObject.configKey = "default";
355
- FileObject.MIN_CHUNK_SIZE = 5 * 1024 * 1024; // 5MB minimum for S3 multipart
@@ -1,36 +0,0 @@
1
- /**
2
- * Wraps a promise with a timeout.
3
- * @param {Promise} promise - The promise to wrap
4
- * @param {number} ms - Timeout in milliseconds (default: 30000)
5
- * @returns {Promise} - Resolves with promise result or rejects on timeout
6
- */
7
- export function withTimeout(promise: Promise<any>, ms?: number): Promise<any>;
8
- /**
9
- * Process included entities from a response and register them in the model store.
10
- * Uses the model registry to find the appropriate model class for each entity type.
11
- *
12
- * @param {ModelStoreRegistry} modelStoreRegistry - The model store registry to use
13
- * @param {Object} included - The included entities object from the response
14
- * @param {Function} ModelClass - The base model class to get the configKey from
15
- * @param {QuerySet} [queryset] - Optional queryset to track which PKs came from this fetch
16
- */
17
- export function processIncludedEntities(modelStoreRegistry: ModelStoreRegistry, included: Object, ModelClass: Function, queryset?: QuerySet): void;
18
- /**
19
- * Makes an API call to the backend with the given QuerySet.
20
- * Automatically handles FileObject replacement with file paths for write operations.
21
- *
22
- * @param {QuerySet} querySet - The QuerySet to execute.
23
- * @param {string} operationType - The type of operation to perform.
24
- * @param {Object} args - Additional arguments for the operation.
25
- * @param {string} operationId - A unique id for the operation
26
- * @param {Function} beforeExit - Optional callback before returning
27
- * @param {string} canonicalId - Optional canonical_id for cache sharing
28
- * @param {Object} options - Additional options
29
- * @param {string} options.namespace - Queue namespace ('default' for app ops, 'sync' for background sync)
30
- * @param {number} options.timeout - Timeout in ms (default: no timeout)
31
- * @returns {Promise<Object>} The API response.
32
- */
33
- export function makeApiCall(querySet: QuerySet, operationType: string, args: Object | undefined, operationId: string, beforeExit?: Function, canonicalId?: string, options?: {
34
- namespace: string;
35
- timeout: number;
36
- }): Promise<Object>;
@@ -1,169 +0,0 @@
1
- import PQueue from 'p-queue';
2
- import axios from 'axios';
3
- import { configInstance } from '../../config.js';
4
- import { replaceTempPks } from './tempPk.js';
5
- import { parseStateZeroError, MultipleObjectsReturned, DoesNotExist } from './errors.js';
6
- import { FileObject } from './files.js';
7
- import { querysetStoreRegistry } from '../../syncEngine/registries/querysetStoreRegistry.js';
8
- // Namespace-based queues: separate queues for different operation types
9
- // This prevents sync operations from blocking user-initiated app operations
10
- const queues = new Map();
11
- function getQueue(namespace = 'default') {
12
- if (!queues.has(namespace)) {
13
- queues.set(namespace, new PQueue({ concurrency: 1 }));
14
- }
15
- return queues.get(namespace);
16
- }
17
- /**
18
- * Wraps a promise with a timeout.
19
- * @param {Promise} promise - The promise to wrap
20
- * @param {number} ms - Timeout in milliseconds (default: 30000)
21
- * @returns {Promise} - Resolves with promise result or rejects on timeout
22
- */
23
- export function withTimeout(promise, ms = 30000) {
24
- return Promise.race([
25
- promise,
26
- new Promise((_, reject) => setTimeout(() => reject(new Error(`Request timeout after ${ms}ms`)), ms)),
27
- ]);
28
- }
29
- /**
30
- * Process included entities from a response and register them in the model store.
31
- * Uses the model registry to find the appropriate model class for each entity type.
32
- *
33
- * @param {ModelStoreRegistry} modelStoreRegistry - The model store registry to use
34
- * @param {Object} included - The included entities object from the response
35
- * @param {Function} ModelClass - The base model class to get the configKey from
36
- * @param {QuerySet} [queryset] - Optional queryset to track which PKs came from this fetch
37
- */
38
- export function processIncludedEntities(modelStoreRegistry, included, ModelClass, queryset = null) {
39
- if (!included)
40
- return;
41
- const configKey = ModelClass.configKey;
42
- // Get the queryset store if a queryset is provided
43
- let querysetStore = null;
44
- if (queryset) {
45
- querysetStore = querysetStoreRegistry.getStore(queryset);
46
- }
47
- try {
48
- // Process each model type
49
- for (const [modelName, entityMap] of Object.entries(included)) {
50
- // Get the appropriate model class for this model name
51
- const EntityClass = configInstance.getModelClass(modelName, configKey);
52
- if (!EntityClass) {
53
- console.error(`Model class not found for ${modelName} in config ${configKey}`);
54
- throw new Error(`Model class not found for ${modelName}`);
55
- }
56
- // Track which PKs are included if a queryset store is available
57
- if (querysetStore) {
58
- if (!querysetStore.includedPks.has(modelName)) {
59
- querysetStore.includedPks.set(modelName, new Set());
60
- }
61
- const pksSet = querysetStore.includedPks.get(modelName);
62
- // Add all PKs from this model to the set
63
- for (const pk of Object.keys(entityMap)) {
64
- pksSet.add(Number(pk));
65
- }
66
- }
67
- // Register all entities in the model store in a single batch call
68
- const entities = Object.values(entityMap);
69
- modelStoreRegistry.setEntities(EntityClass, entities);
70
- }
71
- }
72
- catch (error) {
73
- console.error("Error processing included entities with model registry:", error);
74
- throw new Error(`Failed to process included entities: ${error.message}`);
75
- }
76
- }
77
- /**
78
- * Makes an API call to the backend with the given QuerySet.
79
- * Automatically handles FileObject replacement with file paths for write operations.
80
- *
81
- * @param {QuerySet} querySet - The QuerySet to execute.
82
- * @param {string} operationType - The type of operation to perform.
83
- * @param {Object} args - Additional arguments for the operation.
84
- * @param {string} operationId - A unique id for the operation
85
- * @param {Function} beforeExit - Optional callback before returning
86
- * @param {string} canonicalId - Optional canonical_id for cache sharing
87
- * @param {Object} options - Additional options
88
- * @param {string} options.namespace - Queue namespace ('default' for app ops, 'sync' for background sync)
89
- * @param {number} options.timeout - Timeout in ms (default: no timeout)
90
- * @returns {Promise<Object>} The API response.
91
- */
92
- export async function makeApiCall(querySet, operationType, args = {}, operationId, beforeExit = null, canonicalId = null, options = {}) {
93
- const { namespace = 'default', timeout } = options;
94
- const ModelClass = querySet.ModelClass;
95
- const config = configInstance.getConfig();
96
- const backend = config.backendConfigs[ModelClass.configKey];
97
- if (!backend) {
98
- throw new Error(`No backend configuration found for key: ${ModelClass.configKey}`);
99
- }
100
- // Build the base query
101
- let query = {
102
- ...querySet.build(),
103
- type: operationType,
104
- };
105
- // Add args to the query if provided
106
- if (args && Object.keys(args).length > 0) {
107
- query = {
108
- ...query,
109
- ...args,
110
- };
111
- }
112
- const { serializerOptions, ...restOfQuery } = query;
113
- let payload = {
114
- ast: {
115
- query: restOfQuery,
116
- serializerOptions,
117
- },
118
- };
119
- let limit = payload?.ast?.serializerOptions?.limit;
120
- let overfetch = payload?.ast?.serializerOptions?.overfetch || 10;
121
- if (limit && overfetch) {
122
- payload.ast.serializerOptions.limit = limit + overfetch;
123
- }
124
- // Determine if this is a write operation that needs FileObject processing
125
- const writeOperations = [
126
- "create", "bulk_create", "update", "delete", "update_instance", "delete_instance",
127
- "get_or_create", "update_or_create"
128
- ];
129
- const isWriteOperation = writeOperations.includes(operationType);
130
- const baseUrl = backend.API_URL.replace(/\/+$/, "");
131
- const finalUrl = `${baseUrl}/${ModelClass.modelName}/`;
132
- const headers = backend.getAuthHeaders ? backend.getAuthHeaders() : {};
133
- if (operationId) {
134
- headers["X-Operation-ID"] = operationId;
135
- }
136
- if (canonicalId) {
137
- headers["X-Canonical-ID"] = canonicalId;
138
- }
139
- // Use the queue for write operations, bypass for read operations
140
- const apiCall = async () => {
141
- try {
142
- let response = await axios.post(finalUrl, replaceTempPks(payload), { headers });
143
- if (typeof beforeExit === 'function' && response?.data) {
144
- await beforeExit(response.data);
145
- }
146
- return response.data;
147
- }
148
- catch (error) {
149
- if (error?.code === "ECONNREFUSED") {
150
- const hint = "Connection refused. If you're running tests, start the test server with `python manage.py statezero_testserver`.";
151
- throw new Error(`${hint} (${finalUrl})`);
152
- }
153
- if (error.response && error.response.data) {
154
- const parsedError = parseStateZeroError(error.response.data);
155
- if (Error.captureStackTrace) {
156
- Error.captureStackTrace(parsedError, makeApiCall);
157
- }
158
- throw parsedError;
159
- }
160
- throw new Error(`API call failed: ${error.message}`);
161
- }
162
- };
163
- // Queue write operations, execute read operations immediately
164
- // Use namespace-based queues to separate sync ops from app ops
165
- const queue = getQueue(namespace);
166
- const queuedCall = isWriteOperation ? queue.add(apiCall) : apiCall();
167
- // Apply timeout if specified
168
- return timeout ? withTimeout(queuedCall, timeout) : queuedCall;
169
- }