@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
@@ -0,0 +1,166 @@
1
+ import { computed as c, provide as q, unref as m, inject as G, onMounted as T, resolveComponent as U, createElementBlock as d, openBlock as r, Fragment as v, createBlock as y, createCommentVNode as g, resolveDynamicComponent as i, normalizeClass as F, renderList as b, withCtx as z, createVNode as H, toDisplayString as M } from "vue";
2
+ const N = {
3
+ key: 11,
4
+ class: "text-red-500 text-sm"
5
+ }, I = {
6
+ __name: "LayoutRenderer",
7
+ props: {
8
+ // The layout element to render (root or nested)
9
+ layout: { type: Object, required: !0 },
10
+ // Schema with field definitions (input_properties/properties)
11
+ schema: { type: Object, default: () => ({}) },
12
+ // Component registry: { Control, Display, Alert, Label, Divider, Group, Tabs, ErrorBlock }
13
+ components: { type: Object, required: !0 },
14
+ // Form data (v-model for Controls)
15
+ formData: { type: Object, default: () => ({}) },
16
+ // Workflow context (for Display elements)
17
+ context: { type: Object, default: () => ({}) },
18
+ // Errors object - can be raw DRF response: { fieldName: ['error'], non_field_errors: ['global error'] }
19
+ // The renderer automatically extracts non_field_errors/__all__ for the ErrorBlock
20
+ errors: { type: Object, default: () => ({}) },
21
+ // Explicit non-field errors (optional override - if not provided, extracted from errors.non_field_errors)
22
+ nonFieldErrors: { type: Array, default: null },
23
+ // Whether this is the root renderer (internal)
24
+ isRoot: { type: Boolean, default: !0 }
25
+ },
26
+ emits: ["update:formData"],
27
+ setup(e, { emit: E }) {
28
+ const t = e, D = E, h = c(() => {
29
+ var l, a;
30
+ if (t.nonFieldErrors !== null)
31
+ return t.nonFieldErrors;
32
+ const n = ((l = t.errors) == null ? void 0 : l.non_field_errors) || ((a = t.errors) == null ? void 0 : a.__all__);
33
+ return n ? Array.isArray(n) ? n.map((o) => typeof o == "string" ? o : o != null && o.message ? o.message : String(o)) : [String(n)] : [];
34
+ }), L = c(() => t.components), A = c(() => t.schema), R = c(() => t.formData), S = c(() => t.context), j = c(() => t.errors);
35
+ t.isRoot && q("layoutRenderer", {
36
+ components: L,
37
+ schema: A,
38
+ formData: R,
39
+ context: S,
40
+ errors: j,
41
+ updateField: (n, l) => {
42
+ const a = m(R) || {};
43
+ D("update:formData", { ...a, [n]: l });
44
+ }
45
+ });
46
+ const s = t.isRoot ? null : G("layoutRenderer", null), u = c(() => t.isRoot ? t.components : s && m(s.components) || t.components), p = c(() => t.isRoot ? t.schema : s && m(s.schema) || t.schema), x = c(() => t.isRoot ? t.formData : s && m(s.formData) || t.formData), f = c(() => t.isRoot ? t.context : s && m(s.context) || t.context), B = c(() => t.isRoot ? t.errors : s && m(s.errors) || t.errors), O = t.isRoot ? (n, l) => D("update:formData", { ...t.formData, [n]: l }) : (s == null ? void 0 : s.updateField) || (() => {
47
+ });
48
+ T(() => {
49
+ t.isRoot;
50
+ });
51
+ function w(n) {
52
+ try {
53
+ return new Function("formData", "context", `return ${n}`)(x.value, f.value);
54
+ } catch (l) {
55
+ return console.warn("[LayoutRenderer] Conditional eval failed:", n, l), !1;
56
+ }
57
+ }
58
+ function V(n) {
59
+ var a, o;
60
+ return (((a = p.value) == null ? void 0 : a.properties) || ((o = p.value) == null ? void 0 : o.input_properties) || {})[n] || {};
61
+ }
62
+ function $(n) {
63
+ var a;
64
+ if (n === "non_field_errors" || n === "__all__") return [];
65
+ const l = (a = B.value) == null ? void 0 : a[n];
66
+ return l ? Array.isArray(l) ? l.map((o) => typeof o == "string" ? o : o != null && o.message ? o.message : String(o)) : [String(l)] : [];
67
+ }
68
+ function C(n) {
69
+ if (!n) return;
70
+ const l = n.split(".");
71
+ let a = f.value;
72
+ for (const o of l) {
73
+ if (a == null) return;
74
+ a = a[o];
75
+ }
76
+ return a;
77
+ }
78
+ return (n, l) => {
79
+ const a = U("LayoutRenderer", !0);
80
+ return r(), d(v, null, [
81
+ e.isRoot && h.value.length > 0 && u.value.ErrorBlock ? (r(), y(i(u.value.ErrorBlock), {
82
+ key: 0,
83
+ errors: h.value
84
+ }, null, 8, ["errors"])) : g("", !0),
85
+ e.layout.type === "VerticalLayout" ? (r(), d("div", {
86
+ key: 1,
87
+ class: F(["sz-layout sz-layout-vertical", `sz-gap-${e.layout.gap || "md"}`])
88
+ }, [
89
+ (r(!0), d(v, null, b(e.layout.elements, (o, k) => (r(), y(a, {
90
+ key: k,
91
+ layout: o,
92
+ components: u.value,
93
+ "is-root": !1
94
+ }, null, 8, ["layout", "components"]))), 128))
95
+ ], 2)) : e.layout.type === "HorizontalLayout" ? (r(), d("div", {
96
+ key: 2,
97
+ class: F(["sz-layout sz-layout-horizontal", [`sz-gap-${e.layout.gap || "md"}`, `sz-align-${e.layout.align || "start"}`]])
98
+ }, [
99
+ (r(!0), d(v, null, b(e.layout.elements, (o, k) => (r(), y(a, {
100
+ key: k,
101
+ layout: o,
102
+ components: u.value,
103
+ "is-root": !1
104
+ }, null, 8, ["layout", "components"]))), 128))
105
+ ], 2)) : e.layout.type === "Group" ? (r(), y(i(u.value.Group), {
106
+ key: 3,
107
+ element: e.layout
108
+ }, {
109
+ default: z(() => [
110
+ e.layout.layout ? (r(), y(a, {
111
+ key: 0,
112
+ layout: e.layout.layout,
113
+ components: u.value,
114
+ "is-root": !1
115
+ }, null, 8, ["layout", "components"])) : g("", !0)
116
+ ]),
117
+ _: 1
118
+ }, 8, ["element"])) : e.layout.type === "Tabs" ? (r(), y(i(u.value.Tabs), {
119
+ key: 4,
120
+ element: e.layout
121
+ }, {
122
+ tab: z(({ tab: o }) => [
123
+ H(a, {
124
+ layout: o.layout,
125
+ components: u.value,
126
+ "is-root": !1
127
+ }, null, 8, ["layout", "components"])
128
+ ]),
129
+ _: 1
130
+ }, 8, ["element"])) : e.layout.type === "Conditional" ? (r(), d(v, { key: 5 }, [
131
+ w(e.layout.when) ? (r(), y(a, {
132
+ key: 0,
133
+ layout: e.layout.layout,
134
+ components: u.value,
135
+ "is-root": !1
136
+ }, null, 8, ["layout", "components"])) : g("", !0)
137
+ ], 64)) : e.layout.type === "Control" ? (r(), y(i(u.value.Control), {
138
+ key: 6,
139
+ element: e.layout,
140
+ "model-value": x.value[e.layout.field_name],
141
+ errors: $(e.layout.field_name),
142
+ context: f.value,
143
+ "form-data": x.value,
144
+ schema: V(e.layout.field_name),
145
+ "onUpdate:modelValue": l[0] || (l[0] = (o) => m(O)(e.layout.field_name, o))
146
+ }, null, 8, ["element", "model-value", "errors", "context", "form-data", "schema"])) : e.layout.type === "Display" ? (r(), y(i(u.value.Display), {
147
+ key: 7,
148
+ element: e.layout,
149
+ context: f.value,
150
+ value: C(e.layout.context_path)
151
+ }, null, 8, ["element", "context", "value"])) : e.layout.type === "Alert" ? (r(), y(i(u.value.Alert), {
152
+ key: 8,
153
+ element: e.layout,
154
+ context: f.value,
155
+ text: e.layout.text || C(e.layout.context_path)
156
+ }, null, 8, ["element", "context", "text"])) : e.layout.type === "Label" ? (r(), y(i(u.value.Label), {
157
+ key: 9,
158
+ element: e.layout
159
+ }, null, 8, ["element"])) : e.layout.type === "Divider" ? (r(), y(i(u.value.Divider), { key: 10 })) : (r(), d("div", N, " [LayoutRenderer] Unknown element type: " + M(e.layout.type), 1))
160
+ ], 64);
161
+ };
162
+ }
163
+ };
164
+ export {
165
+ I as default
166
+ };
@@ -0,0 +1,31 @@
1
+ import { createElementBlock as o, openBlock as l, normalizeClass as c, createElementVNode as s, toDisplayString as n } from "vue";
2
+ const i = { class: "flex-shrink-0" }, a = { class: "text-sm" }, g = {
3
+ __name: "AlertElement",
4
+ props: {
5
+ element: { type: Object, required: !0 },
6
+ context: { type: Object, default: () => ({}) },
7
+ text: { type: String, default: "" }
8
+ },
9
+ setup(e) {
10
+ const t = {
11
+ info: "bg-blue-500/10 border-blue-500/20 text-blue-400",
12
+ warning: "bg-yellow-500/10 border-yellow-500/20 text-yellow-400",
13
+ error: "bg-red-500/10 border-red-500/20 text-red-400",
14
+ success: "bg-green-500/10 border-green-500/20 text-green-400"
15
+ }, r = {
16
+ info: "ℹ️",
17
+ warning: "⚠️",
18
+ error: "❌",
19
+ success: "✓"
20
+ };
21
+ return (d, b) => (l(), o("div", {
22
+ class: c(["flex items-start gap-3 p-3 rounded-lg border", t[e.element.severity] || t.info])
23
+ }, [
24
+ s("span", i, n(r[e.element.severity] || r.info), 1),
25
+ s("p", a, n(e.text), 1)
26
+ ], 2));
27
+ }
28
+ };
29
+ export {
30
+ g as default
31
+ };
@@ -0,0 +1,44 @@
1
+ import { createElementBlock as t, openBlock as n, createCommentVNode as c, createElementVNode as o, toDisplayString as l, Fragment as s } from "vue";
2
+ const m = { class: "space-y-1" }, u = {
3
+ key: 0,
4
+ class: "block text-sm font-medium text-muted-foreground"
5
+ }, i = { class: "text-sm" }, r = { key: 0 }, y = {
6
+ key: 1,
7
+ class: "text-muted-foreground italic"
8
+ }, x = {
9
+ key: 1,
10
+ class: "px-2 py-1 bg-muted rounded font-mono text-sm"
11
+ }, f = {
12
+ key: 2,
13
+ class: "flex items-center gap-2"
14
+ }, v = { class: "flex-1 px-2 py-1 bg-muted rounded font-mono text-xs truncate" }, b = { class: "text-xs text-muted-foreground ml-2" }, k = {
15
+ __name: "DisplayElement",
16
+ props: {
17
+ element: { type: Object, required: !0 },
18
+ context: { type: Object, default: () => ({}) },
19
+ value: { default: null }
20
+ },
21
+ setup(e) {
22
+ return (d, a) => (n(), t("div", m, [
23
+ e.element.label ? (n(), t("label", u, l(e.element.label), 1)) : c("", !0),
24
+ o("div", i, [
25
+ !e.element.display_component || e.element.display_component === "text" ? (n(), t(s, { key: 0 }, [
26
+ e.value !== null && e.value !== void 0 ? (n(), t("span", r, l(e.value), 1)) : (n(), t("span", y, "—"))
27
+ ], 64)) : e.element.display_component === "code" ? (n(), t("code", x, l(e.value), 1)) : e.element.display_component === "copy-url" ? (n(), t("div", f, [
28
+ o("code", v, l(e.value), 1),
29
+ o("button", {
30
+ type: "button",
31
+ class: "px-2 py-1 text-xs bg-primary text-primary-foreground rounded hover:bg-primary/90",
32
+ onClick: a[0] || (a[0] = (p) => d.navigator.clipboard.writeText(e.value))
33
+ }, " Copy ")
34
+ ])) : (n(), t(s, { key: 3 }, [
35
+ o("span", null, l(e.value), 1),
36
+ o("span", b, "(" + l(e.element.display_component) + ")", 1)
37
+ ], 64))
38
+ ])
39
+ ]));
40
+ }
41
+ };
42
+ export {
43
+ k as default
44
+ };
@@ -0,0 +1,10 @@
1
+ import { createElementBlock as e, openBlock as r } from "vue";
2
+ const t = { class: "border-t border-border my-2" }, s = {
3
+ __name: "DividerElement",
4
+ setup(o) {
5
+ return (c, _) => (r(), e("hr", t));
6
+ }
7
+ };
8
+ export {
9
+ s as default
10
+ };
@@ -0,0 +1,24 @@
1
+ import { createElementBlock as e, createCommentVNode as d, openBlock as r, createElementVNode as o, Fragment as l, renderList as c, toDisplayString as i } from "vue";
2
+ const m = {
3
+ key: 0,
4
+ class: "flex items-start gap-3 p-3 rounded-lg border bg-red-500/10 border-red-500/20"
5
+ }, p = { class: "space-y-1" }, g = {
6
+ __name: "ErrorBlock",
7
+ props: {
8
+ errors: { type: Array, required: !0 }
9
+ },
10
+ setup(t) {
11
+ return (u, s) => t.errors.length > 0 ? (r(), e("div", m, [
12
+ s[0] || (s[0] = o("span", { class: "flex-shrink-0 text-red-400" }, "❌", -1)),
13
+ o("div", p, [
14
+ (r(!0), e(l, null, c(t.errors, (n, a) => (r(), e("p", {
15
+ key: a,
16
+ class: "text-sm text-red-400"
17
+ }, i(n), 1))), 128))
18
+ ])
19
+ ])) : d("", !0);
20
+ }
21
+ };
22
+ export {
23
+ g as default
24
+ };
@@ -0,0 +1,41 @@
1
+ import { ref as a, createElementBlock as o, openBlock as s, createElementVNode as t, withDirectives as m, normalizeClass as u, createCommentVNode as c, toDisplayString as n, renderSlot as p, vShow as f } from "vue";
2
+ const v = { class: "border border-border rounded-lg overflow-hidden" }, h = { class: "flex items-center justify-between" }, b = { class: "font-medium" }, g = {
3
+ key: 0,
4
+ class: "text-sm text-muted-foreground mt-0.5"
5
+ }, _ = {
6
+ key: 0,
7
+ class: "text-muted-foreground"
8
+ }, x = { class: "p-4" }, C = {
9
+ __name: "GroupElement",
10
+ props: {
11
+ element: { type: Object, required: !0 }
12
+ },
13
+ setup(e) {
14
+ const r = e, l = a(r.element.collapsed || !1);
15
+ function i() {
16
+ r.element.collapsible && (l.value = !l.value);
17
+ }
18
+ return (d, y) => (s(), o("div", v, [
19
+ t("div", {
20
+ class: u(["px-4 py-3 bg-muted/50", { "cursor-pointer hover:bg-muted/70": e.element.collapsible }]),
21
+ onClick: i
22
+ }, [
23
+ t("div", h, [
24
+ t("div", null, [
25
+ t("h4", b, n(e.element.label), 1),
26
+ e.element.description ? (s(), o("p", g, n(e.element.description), 1)) : c("", !0)
27
+ ]),
28
+ e.element.collapsible ? (s(), o("span", _, n(l.value ? "▶" : "▼"), 1)) : c("", !0)
29
+ ])
30
+ ], 2),
31
+ m(t("div", x, [
32
+ p(d.$slots, "default")
33
+ ], 512), [
34
+ [f, !l.value]
35
+ ])
36
+ ]));
37
+ }
38
+ };
39
+ export {
40
+ C as default
41
+ };
@@ -0,0 +1,21 @@
1
+ import { createElementBlock as n, openBlock as a, normalizeClass as o, toDisplayString as r } from "vue";
2
+ const i = {
3
+ __name: "LabelElement",
4
+ props: {
5
+ element: { type: Object, required: !0 }
6
+ },
7
+ setup(e) {
8
+ const t = {
9
+ heading: "text-lg font-semibold",
10
+ subheading: "text-base font-medium text-muted-foreground",
11
+ body: "text-sm",
12
+ caption: "text-xs text-muted-foreground"
13
+ };
14
+ return (s, l) => (a(), n("p", {
15
+ class: o(t[e.element.variant] || t.body)
16
+ }, r(e.element.text), 3));
17
+ }
18
+ };
19
+ export {
20
+ i as default
21
+ };
@@ -0,0 +1,38 @@
1
+ import { ref as b, createElementBlock as t, openBlock as r, createElementVNode as a, Fragment as c, renderList as u, normalizeClass as m, toDisplayString as d, withDirectives as p, renderSlot as v, vShow as f } from "vue";
2
+ const y = { class: "flex border-b border-border" }, _ = ["onClick"], h = { class: "pt-4" }, E = {
3
+ __name: "TabsElement",
4
+ props: {
5
+ element: { type: Object, required: !0 }
6
+ },
7
+ setup(o) {
8
+ const n = b(o.element.default_tab || 0);
9
+ function i(l) {
10
+ n.value = l;
11
+ }
12
+ return (l, x) => (r(), t("div", null, [
13
+ a("div", y, [
14
+ (r(!0), t(c, null, u(o.element.tabs, (s, e) => (r(), t("button", {
15
+ key: e,
16
+ type: "button",
17
+ class: m(["px-4 py-2 text-sm font-medium transition-colors", [
18
+ n.value === e ? "text-primary border-b-2 border-primary -mb-px" : "text-muted-foreground hover:text-foreground"
19
+ ]]),
20
+ onClick: (g) => i(e)
21
+ }, d(s.label), 11, _))), 128))
22
+ ]),
23
+ a("div", h, [
24
+ (r(!0), t(c, null, u(o.element.tabs, (s, e) => p((r(), t("div", { key: e }, [
25
+ v(l.$slots, "tab", {
26
+ tab: s,
27
+ index: e
28
+ })
29
+ ], 512)), [
30
+ [f, n.value === e]
31
+ ])), 128))
32
+ ])
33
+ ]));
34
+ }
35
+ };
36
+ export {
37
+ E as default
38
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statezero/core",
3
- "version": "0.2.37",
3
+ "version": "0.2.38",
4
4
  "type": "module",
5
5
  "module": "ESNext",
6
6
  "description": "The type-safe frontend client for StateZero - connect directly to your backend models with zero boilerplate",
@@ -27,7 +27,6 @@
27
27
  "require": "./dist/vue-entry.js"
28
28
  },
29
29
  "./vue/layout.css": "./dist/adaptors/vue/components/layout.css",
30
- "./vue/layout.tailwind.css": "./dist/adaptors/vue/components/layout.tailwind.css",
31
30
  "./testing": {
32
31
  "import": "./dist/testing.js",
33
32
  "require": "./dist/testing.js"
@@ -42,8 +41,9 @@
42
41
  "generate:test-apps": "ts-node scripts/generate-test-apps.js",
43
42
  "test:adaptors": "playwright test tests/adaptors",
44
43
  "test:coverage": "vitest run --coverage",
45
- "build": "tsc && npm run copy-vue",
46
- "copy-vue": "cp -r src/adaptors/vue/components/*.vue dist/adaptors/vue/components/ && cp -r src/adaptors/vue/components/defaults/*.vue dist/adaptors/vue/components/defaults/ && cp src/adaptors/vue/components/*.css dist/adaptors/vue/components/",
44
+ "build": "tsc && npm run build:vue && npm run copy-css",
45
+ "build:vue": "vite build --config vite.vue.config.ts",
46
+ "copy-css": "cp src/adaptors/vue/components/*.css dist/adaptors/vue/components/",
47
47
  "parse-queries": "node scripts/perfect-query-parser.js",
48
48
  "sync": "node src/cli/index.js sync",
49
49
  "sync:dev": "npx cross-env NODE_ENV=test npm run sync",
@@ -121,6 +121,8 @@
121
121
  "rimraf": "^5.0.5",
122
122
  "ts-node": "^10.9.2",
123
123
  "typescript": "^5.7.3",
124
+ "vite": "^6.0.0",
125
+ "@vitejs/plugin-vue": "^5.2.0",
124
126
  "vitest": "^3.0.5",
125
127
  "vue": "^3.2.0"
126
128
  },
@@ -1,57 +0,0 @@
1
- /**
2
- * Calculate hash of input text (demonstrates string processing)
3
- *
4
- * @param string text - Text to hash
5
- * @param 'md5' | 'sha1' | 'sha256' algorithm - Hash algorithm to use
6
- * @param {Object} [axiosOverrides] - Allows overriding Axios request parameters.
7
- * @returns {Promise<Object>} A promise that resolves with the action's result.
8
- */
9
- export function calculateHash(text: any, algorithm?: string, axiosOverrides?: Object): Promise<Object>;
10
- export namespace calculateHash {
11
- let actionName: string;
12
- let title: string;
13
- let app: string;
14
- let permissions: string[];
15
- let configKey: string;
16
- }
17
- /**
18
- * Zod schema for the input of calculateHash.
19
- * NOTE: This is an object schema for validating the data payload.
20
- */
21
- export const calculateHashInputSchema: z.ZodObject<{
22
- text: z.ZodString;
23
- algorithm: z.ZodDefault<z.ZodOptional<z.ZodEnum<["md5", "sha1", "sha256"]>>>;
24
- }, "strip", z.ZodTypeAny, {
25
- algorithm: "md5" | "sha1" | "sha256";
26
- text: string;
27
- }, {
28
- text: string;
29
- algorithm?: "md5" | "sha1" | "sha256" | undefined;
30
- }>;
31
- /**
32
- * Zod schema for the response of calculateHash.
33
- */
34
- export const calculateHashResponseSchema: z.ZodObject<{
35
- original_text: z.ZodString;
36
- algorithm: z.ZodString;
37
- hash: z.ZodString;
38
- text_length: z.ZodNumber;
39
- processed_by: z.ZodString;
40
- processed_at: z.ZodString;
41
- }, "strip", z.ZodTypeAny, {
42
- original_text: string;
43
- algorithm: string;
44
- hash: string;
45
- text_length: number;
46
- processed_by: string;
47
- processed_at: string;
48
- }, {
49
- original_text: string;
50
- algorithm: string;
51
- hash: string;
52
- text_length: number;
53
- processed_by: string;
54
- processed_at: string;
55
- }>;
56
- export default calculateHash;
57
- import { z } from 'zod';
@@ -1,80 +0,0 @@
1
- /**
2
- * This file was auto-generated. Do not make direct changes to the file.
3
- * Action: Calculate Hash
4
- * App: django_app
5
- */
6
- import axios from 'axios';
7
- import { z } from 'zod';
8
- import { configInstance, parseStateZeroError, serializeActionPayload } from '../../../../src';
9
- import actionSchema from './calculate-hash.schema.json' assert { type: 'json' };
10
- /**
11
- * Zod schema for the input of calculateHash.
12
- * NOTE: This is an object schema for validating the data payload.
13
- */
14
- export const calculateHashInputSchema = z.object({ text: z.string(),
15
- algorithm: z.enum(["md5", "sha1", "sha256"]).optional().default("sha256") });
16
- /**
17
- * Zod schema for the response of calculateHash.
18
- */
19
- export const calculateHashResponseSchema = z.object({ original_text: z.string(),
20
- algorithm: z.string(),
21
- hash: z.string(),
22
- text_length: z.number().int(),
23
- processed_by: z.string(),
24
- processed_at: z.string().datetime({ message: "Invalid ISO 8601 datetime string" }) });
25
- /**
26
- * Calculate hash of input text (demonstrates string processing)
27
- *
28
- * @param string text - Text to hash
29
- * @param 'md5' | 'sha1' | 'sha256' algorithm - Hash algorithm to use
30
- * @param {Object} [axiosOverrides] - Allows overriding Axios request parameters.
31
- * @returns {Promise<Object>} A promise that resolves with the action's result.
32
- */
33
- export async function calculateHash(text, algorithm = "sha256", axiosOverrides = {}) {
34
- // Construct the data payload from the function arguments
35
- const rawPayload = {
36
- text,
37
- algorithm
38
- };
39
- // Serialize payload - handles model instances (extracts PK), files, dates, etc.
40
- const payload = serializeActionPayload(rawPayload, actionSchema.input_properties);
41
- const config = configInstance.getConfig();
42
- const backend = config.backendConfigs['backend1'];
43
- if (!backend) {
44
- throw new Error(`No backend configuration found for key: backend1`);
45
- }
46
- const baseUrl = backend.API_URL.replace(/\/+$/, '');
47
- const actionUrl = `${baseUrl}/actions/calculate_hash/`;
48
- const headers = backend.getAuthHeaders ? backend.getAuthHeaders() : {};
49
- try {
50
- const response = await axios.post(actionUrl, payload, {
51
- headers: { 'Content-Type': 'application/json', ...headers },
52
- ...axiosOverrides,
53
- });
54
- return calculateHashResponseSchema.parse(response.data);
55
- }
56
- catch (error) {
57
- if (error instanceof z.ZodError) {
58
- throw new Error(`Calculate Hash failed: Invalid response from server. Details: ${error.message}`);
59
- }
60
- if (error.response && error.response.data) {
61
- const parsedError = parseStateZeroError(error.response.data);
62
- if (Error.captureStackTrace) {
63
- Error.captureStackTrace(parsedError, calculateHash);
64
- }
65
- throw parsedError;
66
- }
67
- else if (error.request) {
68
- throw new Error(`Calculate Hash failed: No response received from server.`);
69
- }
70
- else {
71
- throw new Error(`Calculate Hash failed: ${error.message}`);
72
- }
73
- }
74
- }
75
- export default calculateHash;
76
- calculateHash.actionName = 'calculate_hash';
77
- calculateHash.title = 'Calculate Hash';
78
- calculateHash.app = 'django_app';
79
- calculateHash.permissions = ['ValidatedIsAuthenticated'];
80
- calculateHash.configKey = 'backend1';