@statezero/core 0.2.38 → 0.2.40

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 (294) hide show
  1. package/dist/actions/backend1/django_app/calculate-hash.d.ts +57 -0
  2. package/dist/actions/backend1/django_app/calculate-hash.js +80 -0
  3. package/dist/actions/backend1/django_app/calculate-hash.schema.json +148 -0
  4. package/dist/actions/backend1/django_app/get-current-username.d.ts +29 -0
  5. package/dist/actions/backend1/django_app/get-current-username.js +65 -0
  6. package/dist/actions/backend1/django_app/get-current-username.schema.json +47 -0
  7. package/dist/actions/backend1/django_app/get-server-status.d.ts +38 -0
  8. package/dist/actions/backend1/django_app/get-server-status.js +68 -0
  9. package/dist/actions/backend1/django_app/get-server-status.schema.json +93 -0
  10. package/dist/actions/backend1/django_app/get-user-info.d.ts +44 -0
  11. package/dist/actions/backend1/django_app/get-user-info.js +70 -0
  12. package/dist/actions/backend1/django_app/get-user-info.schema.json +127 -0
  13. package/dist/actions/backend1/django_app/index.d.ts +1 -0
  14. package/dist/actions/backend1/django_app/index.js +6 -0
  15. package/dist/actions/backend1/django_app/process-data.d.ts +51 -0
  16. package/dist/actions/backend1/django_app/process-data.js +78 -0
  17. package/dist/actions/backend1/django_app/process-data.schema.json +117 -0
  18. package/dist/actions/backend1/django_app/send-notification.d.ts +55 -0
  19. package/dist/actions/backend1/django_app/send-notification.js +81 -0
  20. package/dist/actions/backend1/django_app/send-notification.schema.json +175 -0
  21. package/dist/actions/backend1/index.d.ts +1 -0
  22. package/dist/actions/backend1/index.js +1 -0
  23. package/dist/actions/default/django_app/calculate-hash.d.ts +57 -0
  24. package/dist/actions/default/django_app/calculate-hash.js +80 -0
  25. package/dist/actions/default/django_app/calculate-hash.schema.json +148 -0
  26. package/dist/actions/default/django_app/get-current-username.d.ts +29 -0
  27. package/dist/actions/default/django_app/get-current-username.js +65 -0
  28. package/dist/actions/default/django_app/get-current-username.schema.json +47 -0
  29. package/dist/actions/default/django_app/get-server-status.d.ts +38 -0
  30. package/dist/actions/default/django_app/get-server-status.js +68 -0
  31. package/dist/actions/default/django_app/get-server-status.schema.json +93 -0
  32. package/dist/actions/default/django_app/get-user-info.d.ts +44 -0
  33. package/dist/actions/default/django_app/get-user-info.js +70 -0
  34. package/dist/actions/default/django_app/get-user-info.schema.json +127 -0
  35. package/dist/actions/default/django_app/index.d.ts +1 -0
  36. package/dist/actions/default/django_app/index.js +6 -0
  37. package/dist/actions/default/django_app/process-data.d.ts +51 -0
  38. package/dist/actions/default/django_app/process-data.js +78 -0
  39. package/dist/actions/default/django_app/process-data.schema.json +117 -0
  40. package/dist/actions/default/django_app/send-notification.d.ts +55 -0
  41. package/dist/actions/default/django_app/send-notification.js +81 -0
  42. package/dist/actions/default/django_app/send-notification.schema.json +175 -0
  43. package/dist/actions/default/index.d.ts +1 -0
  44. package/dist/actions/default/index.js +1 -0
  45. package/dist/actions/index.d.ts +1 -0
  46. package/dist/actions/index.js +5 -0
  47. package/dist/adaptors/react/composables.d.ts +1 -0
  48. package/dist/adaptors/react/composables.js +4 -0
  49. package/dist/adaptors/react/index.d.ts +1 -0
  50. package/dist/adaptors/react/index.js +1 -0
  51. package/dist/adaptors/vue/components/LayoutRenderer.js +46 -49
  52. package/dist/adaptors/vue/components/defaults/index.d.ts +7 -0
  53. package/dist/adaptors/vue/components/defaults/index.js +31 -0
  54. package/dist/adaptors/vue/components/index.d.ts +1 -0
  55. package/dist/adaptors/vue/components/index.js +7 -0
  56. package/dist/adaptors/vue/composables.d.ts +2 -0
  57. package/dist/adaptors/vue/composables.js +44 -0
  58. package/dist/adaptors/vue/index.d.ts +3 -0
  59. package/dist/adaptors/vue/index.js +4 -0
  60. package/dist/adaptors/vue/reactivity.d.ts +18 -0
  61. package/dist/adaptors/vue/reactivity.js +132 -0
  62. package/dist/cli/commands/sync.d.ts +6 -0
  63. package/dist/cli/commands/sync.js +30 -0
  64. package/dist/cli/commands/syncActions.d.ts +46 -0
  65. package/dist/cli/commands/syncActions.js +717 -0
  66. package/dist/cli/commands/syncModels.d.ts +132 -0
  67. package/dist/cli/commands/syncModels.js +1120 -0
  68. package/dist/cli/configFileLoader.d.ts +10 -0
  69. package/dist/cli/configFileLoader.js +85 -0
  70. package/dist/cli/index.d.ts +2 -0
  71. package/dist/cli/index.js +22 -0
  72. package/dist/config.d.ts +57 -0
  73. package/dist/config.js +273 -0
  74. package/dist/core/eventReceivers.d.ts +185 -0
  75. package/dist/core/eventReceivers.js +266 -0
  76. package/dist/core/utils.d.ts +8 -0
  77. package/dist/core/utils.js +62 -0
  78. package/dist/errorHandler.d.ts +21 -0
  79. package/dist/errorHandler.js +27 -0
  80. package/dist/filtering/localFiltering.d.ts +110 -0
  81. package/dist/filtering/localFiltering.js +1080 -0
  82. package/dist/flavours/django/dates.d.ts +34 -0
  83. package/dist/flavours/django/dates.js +113 -0
  84. package/dist/flavours/django/errors.d.ts +138 -0
  85. package/dist/flavours/django/errors.js +195 -0
  86. package/dist/flavours/django/f.d.ts +6 -0
  87. package/dist/flavours/django/f.js +91 -0
  88. package/dist/flavours/django/files.d.ts +62 -0
  89. package/dist/flavours/django/files.js +355 -0
  90. package/dist/flavours/django/makeApiCall.d.ts +36 -0
  91. package/dist/flavours/django/makeApiCall.js +169 -0
  92. package/dist/flavours/django/manager.d.ts +204 -0
  93. package/dist/flavours/django/manager.js +222 -0
  94. package/dist/flavours/django/model.d.ts +137 -0
  95. package/dist/flavours/django/model.js +366 -0
  96. package/dist/flavours/django/operationFactory.d.ts +73 -0
  97. package/dist/flavours/django/operationFactory.js +248 -0
  98. package/dist/flavours/django/q.d.ts +70 -0
  99. package/dist/flavours/django/q.js +43 -0
  100. package/dist/flavours/django/queryExecutor.d.ts +149 -0
  101. package/dist/flavours/django/queryExecutor.js +590 -0
  102. package/dist/flavours/django/querySet.d.ts +301 -0
  103. package/dist/flavours/django/querySet.js +736 -0
  104. package/dist/flavours/django/serializers.d.ts +39 -0
  105. package/dist/flavours/django/serializers.js +296 -0
  106. package/dist/flavours/django/tempPk.d.ts +31 -0
  107. package/dist/flavours/django/tempPk.js +92 -0
  108. package/dist/flavours/django/utils.d.ts +19 -0
  109. package/dist/flavours/django/utils.js +29 -0
  110. package/dist/index.d.ts +46 -0
  111. package/dist/index.js +48 -0
  112. package/dist/models/backend1/django_app/comprehensivemodel.d.ts +894 -0
  113. package/dist/models/backend1/django_app/comprehensivemodel.js +71 -0
  114. package/dist/models/backend1/django_app/comprehensivemodel.schema.json +870 -0
  115. package/dist/models/backend1/django_app/custompkmodel.d.ts +92 -0
  116. package/dist/models/backend1/django_app/custompkmodel.js +69 -0
  117. package/dist/models/backend1/django_app/custompkmodel.schema.json +71 -0
  118. package/dist/models/backend1/django_app/dailyrate.d.ts +230 -0
  119. package/dist/models/backend1/django_app/dailyrate.js +71 -0
  120. package/dist/models/backend1/django_app/dailyrate.schema.json +212 -0
  121. package/dist/models/backend1/django_app/deepmodellevel1.d.ts +140 -0
  122. package/dist/models/backend1/django_app/deepmodellevel1.js +72 -0
  123. package/dist/models/backend1/django_app/deepmodellevel1.schema.json +114 -0
  124. package/dist/models/backend1/django_app/deepmodellevel2.d.ts +118 -0
  125. package/dist/models/backend1/django_app/deepmodellevel2.js +71 -0
  126. package/dist/models/backend1/django_app/deepmodellevel2.schema.json +92 -0
  127. package/dist/models/backend1/django_app/deepmodellevel3.d.ts +92 -0
  128. package/dist/models/backend1/django_app/deepmodellevel3.js +69 -0
  129. package/dist/models/backend1/django_app/deepmodellevel3.schema.json +69 -0
  130. package/dist/models/backend1/django_app/dummymodel.d.ts +134 -0
  131. package/dist/models/backend1/django_app/dummymodel.js +71 -0
  132. package/dist/models/backend1/django_app/dummymodel.schema.json +109 -0
  133. package/dist/models/backend1/django_app/dummyrelatedmodel.d.ts +92 -0
  134. package/dist/models/backend1/django_app/dummyrelatedmodel.js +69 -0
  135. package/dist/models/backend1/django_app/dummyrelatedmodel.schema.json +69 -0
  136. package/dist/models/backend1/django_app/filetest.d.ts +140 -0
  137. package/dist/models/backend1/django_app/filetest.js +69 -0
  138. package/dist/models/backend1/django_app/filetest.schema.json +111 -0
  139. package/dist/models/backend1/django_app/index.d.ts +1 -0
  140. package/dist/models/backend1/django_app/index.js +21 -0
  141. package/dist/models/backend1/django_app/m2mdepthtestlevel1.d.ts +118 -0
  142. package/dist/models/backend1/django_app/m2mdepthtestlevel1.js +71 -0
  143. package/dist/models/backend1/django_app/m2mdepthtestlevel1.schema.json +94 -0
  144. package/dist/models/backend1/django_app/m2mdepthtestlevel2.d.ts +118 -0
  145. package/dist/models/backend1/django_app/m2mdepthtestlevel2.js +71 -0
  146. package/dist/models/backend1/django_app/m2mdepthtestlevel2.schema.json +94 -0
  147. package/dist/models/backend1/django_app/m2mdepthtestlevel3.d.ts +134 -0
  148. package/dist/models/backend1/django_app/m2mdepthtestlevel3.js +71 -0
  149. package/dist/models/backend1/django_app/m2mdepthtestlevel3.schema.json +112 -0
  150. package/dist/models/backend1/django_app/modelwithcustompkrelation.d.ts +118 -0
  151. package/dist/models/backend1/django_app/modelwithcustompkrelation.js +71 -0
  152. package/dist/models/backend1/django_app/modelwithcustompkrelation.schema.json +93 -0
  153. package/dist/models/backend1/django_app/modelwithrestrictedfields.d.ts +134 -0
  154. package/dist/models/backend1/django_app/modelwithrestrictedfields.js +71 -0
  155. package/dist/models/backend1/django_app/modelwithrestrictedfields.schema.json +111 -0
  156. package/dist/models/backend1/django_app/namefiltercustompkmodel.d.ts +92 -0
  157. package/dist/models/backend1/django_app/namefiltercustompkmodel.js +69 -0
  158. package/dist/models/backend1/django_app/namefiltercustompkmodel.schema.json +71 -0
  159. package/dist/models/backend1/django_app/order.d.ts +220 -0
  160. package/dist/models/backend1/django_app/order.js +71 -0
  161. package/dist/models/backend1/django_app/order.schema.json +203 -0
  162. package/dist/models/backend1/django_app/orderitem.d.ts +172 -0
  163. package/dist/models/backend1/django_app/orderitem.js +72 -0
  164. package/dist/models/backend1/django_app/orderitem.schema.json +149 -0
  165. package/dist/models/backend1/django_app/product.d.ts +254 -0
  166. package/dist/models/backend1/django_app/product.js +71 -0
  167. package/dist/models/backend1/django_app/product.schema.json +277 -0
  168. package/dist/models/backend1/django_app/productcategory.d.ts +92 -0
  169. package/dist/models/backend1/django_app/productcategory.js +69 -0
  170. package/dist/models/backend1/django_app/productcategory.schema.json +70 -0
  171. package/dist/models/backend1/django_app/rateplan.d.ts +92 -0
  172. package/dist/models/backend1/django_app/rateplan.js +69 -0
  173. package/dist/models/backend1/django_app/rateplan.schema.json +70 -0
  174. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.d.ts +108 -0
  175. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.js +69 -0
  176. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.schema.json +87 -0
  177. package/dist/models/backend1/fileobject.d.ts +4 -0
  178. package/dist/models/backend1/fileobject.js +9 -0
  179. package/dist/models/backend1/index.d.ts +2 -0
  180. package/dist/models/backend1/index.js +2 -0
  181. package/dist/models/default/django_app/comprehensivemodel.d.ts +894 -0
  182. package/dist/models/default/django_app/comprehensivemodel.js +71 -0
  183. package/dist/models/default/django_app/comprehensivemodel.schema.json +870 -0
  184. package/dist/models/default/django_app/custompkmodel.d.ts +92 -0
  185. package/dist/models/default/django_app/custompkmodel.js +69 -0
  186. package/dist/models/default/django_app/custompkmodel.schema.json +71 -0
  187. package/dist/models/default/django_app/dailyrate.d.ts +230 -0
  188. package/dist/models/default/django_app/dailyrate.js +71 -0
  189. package/dist/models/default/django_app/dailyrate.schema.json +212 -0
  190. package/dist/models/default/django_app/deepmodellevel1.d.ts +128 -0
  191. package/dist/models/default/django_app/deepmodellevel1.js +72 -0
  192. package/dist/models/default/django_app/deepmodellevel1.schema.json +102 -0
  193. package/dist/models/default/django_app/deepmodellevel2.d.ts +106 -0
  194. package/dist/models/default/django_app/deepmodellevel2.js +71 -0
  195. package/dist/models/default/django_app/deepmodellevel2.schema.json +80 -0
  196. package/dist/models/default/django_app/deepmodellevel3.d.ts +80 -0
  197. package/dist/models/default/django_app/deepmodellevel3.js +69 -0
  198. package/dist/models/default/django_app/deepmodellevel3.schema.json +57 -0
  199. package/dist/models/default/django_app/dummymodel.d.ts +122 -0
  200. package/dist/models/default/django_app/dummymodel.js +71 -0
  201. package/dist/models/default/django_app/dummymodel.schema.json +97 -0
  202. package/dist/models/default/django_app/dummyrelatedmodel.d.ts +80 -0
  203. package/dist/models/default/django_app/dummyrelatedmodel.js +69 -0
  204. package/dist/models/default/django_app/dummyrelatedmodel.schema.json +57 -0
  205. package/dist/models/default/django_app/filetest.d.ts +128 -0
  206. package/dist/models/default/django_app/filetest.js +69 -0
  207. package/dist/models/default/django_app/filetest.schema.json +99 -0
  208. package/dist/models/default/django_app/index.d.ts +1 -0
  209. package/dist/models/default/django_app/index.js +21 -0
  210. package/dist/models/default/django_app/m2mdepthtestlevel1.d.ts +118 -0
  211. package/dist/models/default/django_app/m2mdepthtestlevel1.js +71 -0
  212. package/dist/models/default/django_app/m2mdepthtestlevel1.schema.json +94 -0
  213. package/dist/models/default/django_app/m2mdepthtestlevel2.d.ts +118 -0
  214. package/dist/models/default/django_app/m2mdepthtestlevel2.js +71 -0
  215. package/dist/models/default/django_app/m2mdepthtestlevel2.schema.json +94 -0
  216. package/dist/models/default/django_app/m2mdepthtestlevel3.d.ts +134 -0
  217. package/dist/models/default/django_app/m2mdepthtestlevel3.js +71 -0
  218. package/dist/models/default/django_app/m2mdepthtestlevel3.schema.json +112 -0
  219. package/dist/models/default/django_app/modelwithcustompkrelation.d.ts +118 -0
  220. package/dist/models/default/django_app/modelwithcustompkrelation.js +71 -0
  221. package/dist/models/default/django_app/modelwithcustompkrelation.schema.json +93 -0
  222. package/dist/models/default/django_app/modelwithrestrictedfields.d.ts +134 -0
  223. package/dist/models/default/django_app/modelwithrestrictedfields.js +71 -0
  224. package/dist/models/default/django_app/modelwithrestrictedfields.schema.json +111 -0
  225. package/dist/models/default/django_app/namefiltercustompkmodel.d.ts +92 -0
  226. package/dist/models/default/django_app/namefiltercustompkmodel.js +69 -0
  227. package/dist/models/default/django_app/namefiltercustompkmodel.schema.json +71 -0
  228. package/dist/models/default/django_app/order.d.ts +220 -0
  229. package/dist/models/default/django_app/order.js +71 -0
  230. package/dist/models/default/django_app/order.schema.json +203 -0
  231. package/dist/models/default/django_app/orderitem.d.ts +172 -0
  232. package/dist/models/default/django_app/orderitem.js +72 -0
  233. package/dist/models/default/django_app/orderitem.schema.json +149 -0
  234. package/dist/models/default/django_app/product.d.ts +254 -0
  235. package/dist/models/default/django_app/product.js +71 -0
  236. package/dist/models/default/django_app/product.schema.json +277 -0
  237. package/dist/models/default/django_app/productcategory.d.ts +92 -0
  238. package/dist/models/default/django_app/productcategory.js +69 -0
  239. package/dist/models/default/django_app/productcategory.schema.json +70 -0
  240. package/dist/models/default/django_app/rateplan.d.ts +92 -0
  241. package/dist/models/default/django_app/rateplan.js +69 -0
  242. package/dist/models/default/django_app/rateplan.schema.json +70 -0
  243. package/dist/models/default/django_app/restrictedfieldrelatedmodel.d.ts +108 -0
  244. package/dist/models/default/django_app/restrictedfieldrelatedmodel.js +69 -0
  245. package/dist/models/default/django_app/restrictedfieldrelatedmodel.schema.json +87 -0
  246. package/dist/models/default/fileobject.d.ts +4 -0
  247. package/dist/models/default/fileobject.js +9 -0
  248. package/dist/models/default/index.d.ts +2 -0
  249. package/dist/models/default/index.js +2 -0
  250. package/dist/models/index.d.ts +1 -0
  251. package/dist/models/index.js +5 -0
  252. package/dist/react-entry.d.ts +2 -0
  253. package/dist/react-entry.js +2 -0
  254. package/dist/reactiveAdaptor.d.ts +24 -0
  255. package/dist/reactiveAdaptor.js +38 -0
  256. package/dist/reset.d.ts +15 -0
  257. package/dist/reset.js +97 -0
  258. package/dist/setup.d.ts +15 -0
  259. package/dist/setup.js +33 -0
  260. package/dist/syncEngine/cache/cache.d.ts +75 -0
  261. package/dist/syncEngine/cache/cache.js +355 -0
  262. package/dist/syncEngine/metrics/metricOptCalcs.d.ts +79 -0
  263. package/dist/syncEngine/metrics/metricOptCalcs.js +284 -0
  264. package/dist/syncEngine/registries/metricRegistry.d.ts +58 -0
  265. package/dist/syncEngine/registries/metricRegistry.js +171 -0
  266. package/dist/syncEngine/registries/modelStoreRegistry.d.ts +11 -0
  267. package/dist/syncEngine/registries/modelStoreRegistry.js +63 -0
  268. package/dist/syncEngine/registries/querysetStoreGraph.d.ts +41 -0
  269. package/dist/syncEngine/registries/querysetStoreGraph.js +174 -0
  270. package/dist/syncEngine/registries/querysetStoreRegistry.d.ts +72 -0
  271. package/dist/syncEngine/registries/querysetStoreRegistry.js +335 -0
  272. package/dist/syncEngine/stores/metricStore.d.ts +55 -0
  273. package/dist/syncEngine/stores/metricStore.js +222 -0
  274. package/dist/syncEngine/stores/modelStore.d.ts +53 -0
  275. package/dist/syncEngine/stores/modelStore.js +565 -0
  276. package/dist/syncEngine/stores/operation.d.ts +139 -0
  277. package/dist/syncEngine/stores/operation.js +291 -0
  278. package/dist/syncEngine/stores/operationEventHandlers.d.ts +8 -0
  279. package/dist/syncEngine/stores/operationEventHandlers.js +348 -0
  280. package/dist/syncEngine/stores/querysetStore.d.ts +60 -0
  281. package/dist/syncEngine/stores/querysetStore.js +294 -0
  282. package/dist/syncEngine/stores/reactivity.d.ts +3 -0
  283. package/dist/syncEngine/stores/reactivity.js +4 -0
  284. package/dist/syncEngine/stores/utils.d.ts +14 -0
  285. package/dist/syncEngine/stores/utils.js +32 -0
  286. package/dist/syncEngine/sync.d.ts +51 -0
  287. package/dist/syncEngine/sync.js +419 -0
  288. package/dist/testing.d.ts +63 -0
  289. package/dist/testing.js +175 -0
  290. package/dist/vue-entry.d.ts +15 -0
  291. package/dist/vue-entry.js +7 -0
  292. package/package.json +6 -7
  293. package/dist/adaptors/vue/components/layout.tailwind.css +0 -51
  294. /package/{dist → src}/adaptors/vue/components/layout.css +0 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Loads configuration from file using cosmiconfig and sets it into the global config singleton.
3
+ *
4
+ * The function searches for a configuration file (e.g. statezero.config.js, .modelsynrc, etc.)
5
+ * and checks if an environment variable (STATEZERO_CONFIG_PATH) overrides the default search path.
6
+ * If a configuration file is found, it is validated and set via configInstance.setConfig().
7
+ *
8
+ * @returns {void}
9
+ */
10
+ export function loadConfigFromFile(): void;
@@ -0,0 +1,85 @@
1
+ import { cosmiconfigSync } from 'cosmiconfig';
2
+ import { configInstance } from '../config.js';
3
+ /**
4
+ * Loads configuration from file using cosmiconfig and sets it into the global config singleton.
5
+ *
6
+ * The function searches for a configuration file (e.g. statezero.config.js, .modelsynrc, etc.)
7
+ * and checks if an environment variable (STATEZERO_CONFIG_PATH) overrides the default search path.
8
+ * If a configuration file is found, it is validated and set via configInstance.setConfig().
9
+ *
10
+ * @returns {void}
11
+ */
12
+ export function loadConfigFromFile() {
13
+ const explorerSync = cosmiconfigSync('statezero', {
14
+ searchPlaces: [
15
+ 'statezero.config.js',
16
+ 'src/statezero.config.js',
17
+ ],
18
+ transform: (result) => {
19
+ if (!result) {
20
+ console.log('No configuration file found.');
21
+ return null;
22
+ }
23
+ console.log(`Successfully loaded config from: ${result.filepath}`);
24
+ // Handle ESM modules with default export
25
+ if (result.config && result.config.__esModule && result.config.default) {
26
+ result.config = result.config.default;
27
+ }
28
+ // Parse any stringified values back to their original format
29
+ const parseNestedValues = (obj) => {
30
+ if (!obj || typeof obj !== 'object')
31
+ return obj;
32
+ Object.keys(obj).forEach(key => {
33
+ const value = obj[key];
34
+ // Don't try to parse functions
35
+ if (typeof value === 'string' && !value.includes('Function')) {
36
+ try {
37
+ // Check if it's a stringified value
38
+ if ((value.startsWith('"') && value.endsWith('"')) ||
39
+ (value === 'true' || value === 'false')) {
40
+ obj[key] = JSON.parse(value);
41
+ }
42
+ }
43
+ catch (e) {
44
+ // If parsing fails, keep the original value
45
+ }
46
+ }
47
+ // Recursively parse nested objects
48
+ if (value && typeof value === 'object') {
49
+ parseNestedValues(value);
50
+ }
51
+ });
52
+ return obj;
53
+ };
54
+ // Parse any stringified values in the config
55
+ if (result.config && typeof result.config === 'object') {
56
+ parseNestedValues(result.config);
57
+ }
58
+ return result;
59
+ }
60
+ });
61
+ const envConfigPath = process.env.STATEZERO_CONFIG_PATH;
62
+ let result = null;
63
+ if (envConfigPath) {
64
+ console.log(`Attempting to load config from environment path: ${envConfigPath}`);
65
+ try {
66
+ result = explorerSync.load(envConfigPath);
67
+ }
68
+ catch (error) {
69
+ console.log(`Failed to load from environment path: ${error.message}`);
70
+ }
71
+ }
72
+ if (!result) {
73
+ console.log('Searching for statezero configuration files...');
74
+ result = explorerSync.search();
75
+ }
76
+ if (result && result.config) {
77
+ // Apply the configuration
78
+ configInstance.setConfig(result.config);
79
+ console.log(`Configuration set from ${result.filepath}`);
80
+ }
81
+ else {
82
+ console.log('Could not find configuration, using default empty config');
83
+ configInstance.setConfig({ backendConfigs: {} });
84
+ }
85
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ import dotenv from "dotenv";
3
+ dotenv.config();
4
+ import yargs from "yargs";
5
+ import { hideBin } from "yargs/helpers";
6
+ import { generateSchema } from "./commands/syncModels.js";
7
+ import { generateActions } from "./commands/syncActions.js";
8
+ import { sync } from "./commands/sync.js"; // Import the new combined sync function
9
+ yargs(hideBin(process.argv))
10
+ // The new 'sync' command
11
+ .command("sync", "Synchronize both models and actions from the backend", {}, // Builder for command-specific options (if any)
12
+ async (argv) => {
13
+ await sync(argv);
14
+ })
15
+ .command("sync-models", "Generate model classes from the backend schema", {}, async (argv) => {
16
+ await generateSchema(argv);
17
+ })
18
+ .command("sync-actions", "Generate action functions from the backend schema", {}, async (argv) => {
19
+ await generateActions(); // This function does not take arguments
20
+ })
21
+ .demandCommand(1, "You must provide a command to run. Use --help to see available commands.")
22
+ .help().argv;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Sets the entire configuration, validating it before storing.
3
+ * If the configuration is invalid, it throws a ConfigError.
4
+ */
5
+ export function setConfig(newConfig: any): void;
6
+ /**
7
+ * Retrieves the validated configuration.
8
+ * If no configuration has been set, it throws a ConfigError.
9
+ */
10
+ export function getConfig(): any;
11
+ /**
12
+ * Merges a partial override into an existing backend config.
13
+ */
14
+ export function setBackendConfig(backendKey: any, newConfig: any): void;
15
+ /**
16
+ * Initializes the event receiver based on the configuration.
17
+ */
18
+ export function initializeEventReceiver(backendKey?: string): PusherEventReceiver | null;
19
+ /**
20
+ * Initializes event receivers for all configured backends.
21
+ *
22
+ * @returns {Object} Map of backend keys to their initialized event receivers
23
+ * @throws {ConfigError} If configuration is not set or if initialization fails
24
+ */
25
+ export function initializeAllEventReceivers(): Object;
26
+ /**
27
+ * Registers the function used to retrieve model classes.
28
+ * This should be called once during application setup after setConfig.
29
+ * @param {Function} getterFn - The getModelClass function imported from model-registry.js
30
+ */
31
+ export function registerModelGetter(getterFn: Function): void;
32
+ /**
33
+ * Helper function to build file URLs
34
+ */
35
+ export function buildFileUrl(fileUrl: any, backendKey?: string): any;
36
+ /**
37
+ * Get a model class by name using the registered getter.
38
+ *
39
+ * @param {string} modelName - The model name (e.g., 'app.MyModel')
40
+ * @param {string} configKey - The config key (backend name)
41
+ * @returns {Function|null} - The model class or null if not found
42
+ */
43
+ export function getModelClass(modelName: string, configKey: string): Function | null;
44
+ export namespace liveConfig {
45
+ let backendConfigs: {};
46
+ }
47
+ export namespace configInstance {
48
+ export { setConfig };
49
+ export { getConfig };
50
+ export { setBackendConfig };
51
+ export { initializeEventReceiver };
52
+ export { registerModelGetter };
53
+ export { getModelClass };
54
+ export { buildFileUrl };
55
+ }
56
+ export default configInstance;
57
+ import { PusherEventReceiver } from './core/eventReceivers.js';
package/dist/config.js ADDED
@@ -0,0 +1,273 @@
1
+ import { z } from 'zod';
2
+ import { ConfigError } from './flavours/django/errors.js';
3
+ import { PusherEventReceiver, setEventReceiver } from './core/eventReceivers.js';
4
+ // The live configuration object. By default it is empty.
5
+ export let liveConfig = {
6
+ backendConfigs: {}
7
+ };
8
+ // --- Zod Schemas ---
9
+ const pusherSchema = z.object({
10
+ clientOptions: z.object({
11
+ appKey: z.string({ required_error: 'Pusher appKey is required' }),
12
+ cluster: z.string({ required_error: 'Pusher cluster is required' }),
13
+ forceTLS: z.boolean().optional(),
14
+ authEndpoint: z.string()
15
+ .url('Pusher authentication endpoint URL is required'),
16
+ getAuthHeaders: z.function().optional()
17
+ .refine((fn) => fn === undefined || typeof fn === 'function', 'getAuthHeaders must be a function if provided')
18
+ })
19
+ });
20
+ const eventConfigSchema = z.object({
21
+ type: z.enum(['websocket', 'pusher', 'none']),
22
+ websocketUrl: z.string().url().optional(),
23
+ pusher: pusherSchema.optional(),
24
+ hotpaths: z.array(z.string()).default(['default'])
25
+ }).superRefine((data, ctx) => {
26
+ // Conditional validation based on type
27
+ if (data.type === 'websocket') {
28
+ if (!data.websocketUrl) {
29
+ ctx.addIssue({
30
+ code: z.ZodIssueCode.custom,
31
+ path: ['websocketUrl'],
32
+ message: 'WebSocket URL is required for WebSocket event receiver'
33
+ });
34
+ }
35
+ }
36
+ if (data.type === 'pusher') {
37
+ if (!data.pusher) {
38
+ ctx.addIssue({
39
+ code: z.ZodIssueCode.custom,
40
+ path: ['pusher'],
41
+ message: 'Pusher configuration is required for Pusher event receiver'
42
+ });
43
+ }
44
+ }
45
+ });
46
+ const backendSchema = z.object({
47
+ API_URL: z.string().url("API_URL must be a valid URL"),
48
+ GENERATED_TYPES_DIR: z.string({
49
+ required_error: "GENERATED_TYPES_DIR is required",
50
+ }),
51
+ GENERATED_ACTIONS_DIR: z.string().optional(),
52
+ BACKEND_TZ: z.string().optional(),
53
+ SYNC_TOKEN: z.string().optional(),
54
+ fileRootURL: z.string().url("fileRootURL must be a valid URL").optional(),
55
+ fileUploadMode: z.enum(["server", "s3"]).default("server"),
56
+ getAuthHeaders: z
57
+ .function()
58
+ .optional()
59
+ .refine((fn) => fn === undefined || typeof fn === "function", "getAuthHeaders must be a function if provided"),
60
+ eventInterceptor: z
61
+ .function()
62
+ .optional()
63
+ .refine((fn) => fn === undefined || typeof fn === "function", "eventInterceptor must be a function if provided"),
64
+ events: z.lazy(() => eventConfigSchema.optional()),
65
+ });
66
+ const configSchema = z.object({
67
+ backendConfigs: z.record(z.string(), backendSchema)
68
+ .refine((configs) => {
69
+ // Validate each backend config
70
+ for (const [key, backend] of Object.entries(configs)) {
71
+ const result = backendSchema.safeParse(backend);
72
+ if (!result.success) {
73
+ return false;
74
+ }
75
+ }
76
+ return true;
77
+ }, (configs) => {
78
+ // Generate detailed error message
79
+ const errors = [];
80
+ for (const [key, backend] of Object.entries(configs)) {
81
+ const result = backendSchema.safeParse(backend);
82
+ if (!result.success) {
83
+ const errorMessages = result.error.errors.map(err => err.message);
84
+ errors.push(`Backend "${key}" is invalid: ${errorMessages.join(', ')}`);
85
+ }
86
+ }
87
+ return { message: errors.join('; ') };
88
+ }),
89
+ periodicSyncIntervalSeconds: z.number().min(5).nullable().optional().default(null),
90
+ });
91
+ // Internal variable to hold the validated configuration.
92
+ let config = null;
93
+ /**
94
+ * Sets the entire configuration, validating it before storing.
95
+ * If the configuration is invalid, it throws a ConfigError.
96
+ */
97
+ export function setConfig(newConfig) {
98
+ liveConfig = newConfig;
99
+ const result = configSchema.safeParse(liveConfig);
100
+ if (!result.success) {
101
+ const errorMessages = result.error.errors.map(err => err.message);
102
+ throw new ConfigError(`Error setting configuration: ${errorMessages.join(', ')}`);
103
+ }
104
+ config = result.data;
105
+ }
106
+ /**
107
+ * Retrieves the validated configuration.
108
+ * If no configuration has been set, it throws a ConfigError.
109
+ */
110
+ export function getConfig() {
111
+ if (!config) {
112
+ throw new ConfigError('Configuration not set. Please call setConfig() with a valid configuration.');
113
+ }
114
+ return config;
115
+ }
116
+ /**
117
+ * Merges a partial override into an existing backend config.
118
+ */
119
+ export function setBackendConfig(backendKey, newConfig) {
120
+ try {
121
+ const cfg = getConfig();
122
+ if (!cfg.backendConfigs[backendKey]) {
123
+ throw new ConfigError(`Backend "${backendKey}" not found in configuration.`);
124
+ }
125
+ const merged = { ...cfg.backendConfigs[backendKey], ...newConfig };
126
+ const result = backendSchema.safeParse(merged);
127
+ if (!result.success) {
128
+ const errorMessages = result.error.errors.map(err => err.message);
129
+ throw new ConfigError(`Invalid backend configuration: ${errorMessages.join(', ')}`);
130
+ }
131
+ cfg.backendConfigs[backendKey] = result.data;
132
+ }
133
+ catch (error) {
134
+ if (error instanceof ConfigError) {
135
+ throw error;
136
+ }
137
+ throw new ConfigError(error.message || 'Invalid backend configuration');
138
+ }
139
+ }
140
+ /**
141
+ * Initializes the event receiver based on the configuration.
142
+ */
143
+ export function initializeEventReceiver(backendKey = 'default') {
144
+ try {
145
+ const cfg = getConfig();
146
+ if (!cfg.backendConfigs[backendKey]) {
147
+ throw new ConfigError(`Backend "${backendKey}" not found in configuration.`);
148
+ }
149
+ const backendConfig = cfg.backendConfigs[backendKey];
150
+ if (!backendConfig.events) {
151
+ return null;
152
+ }
153
+ let receiver = null;
154
+ switch (backendConfig.events.type) {
155
+ case 'pusher':
156
+ if (!backendConfig.events.pusher || !backendConfig.events.pusher.clientOptions) {
157
+ throw new ConfigError('Pusher client options are required for Pusher event receiver.');
158
+ }
159
+ if (!backendConfig.events.pusher.clientOptions.authEndpoint) {
160
+ throw new ConfigError('Pusher auth endpoint is required for Pusher event receiver.');
161
+ }
162
+ const clientOptions = {
163
+ ...backendConfig.events.pusher.clientOptions,
164
+ getAuthHeaders: backendConfig.events.pusher.clientOptions.getAuthHeaders || backendConfig.getAuthHeaders
165
+ };
166
+ // Pass the backendKey to the constructor
167
+ receiver = new PusherEventReceiver({ clientOptions }, backendKey);
168
+ break;
169
+ case 'none':
170
+ return null;
171
+ default:
172
+ throw new ConfigError(`Unknown event receiver type: ${backendConfig.events.type}`);
173
+ }
174
+ if (receiver) {
175
+ // Pass the backendKey to associate the receiver with this backend
176
+ setEventReceiver(backendKey, receiver);
177
+ }
178
+ return receiver;
179
+ }
180
+ catch (error) {
181
+ if (error instanceof ConfigError) {
182
+ throw error;
183
+ }
184
+ throw new ConfigError(`Failed to initialize event receiver: ${error.message}`);
185
+ }
186
+ }
187
+ /**
188
+ * Initializes event receivers for all configured backends.
189
+ *
190
+ * @returns {Object} Map of backend keys to their initialized event receivers
191
+ * @throws {ConfigError} If configuration is not set or if initialization fails
192
+ */
193
+ export function initializeAllEventReceivers() {
194
+ try {
195
+ const cfg = getConfig();
196
+ const receivers = {};
197
+ // Initialize event receivers for each backend configuration
198
+ Object.keys(cfg.backendConfigs).forEach(backendKey => {
199
+ try {
200
+ receivers[backendKey] = initializeEventReceiver(backendKey);
201
+ }
202
+ catch (error) {
203
+ console.warn(`Failed to initialize event receiver for backend "${backendKey}": ${error.message}`);
204
+ }
205
+ });
206
+ return receivers;
207
+ }
208
+ catch (error) {
209
+ throw new ConfigError(`Failed to initialize event receivers: ${error.message}`);
210
+ }
211
+ }
212
+ // --- Declare the variable to hold the registered model getter ---
213
+ let modelGetter = null;
214
+ /**
215
+ * Registers the function used to retrieve model classes.
216
+ * This should be called once during application setup after setConfig.
217
+ * @param {Function} getterFn - The getModelClass function imported from model-registry.js
218
+ */
219
+ export function registerModelGetter(getterFn) {
220
+ if (typeof getterFn !== 'function') {
221
+ throw new ConfigError('Provided model getter must be a function.');
222
+ }
223
+ modelGetter = getterFn;
224
+ }
225
+ /**
226
+ * Helper function to build file URLs
227
+ */
228
+ export function buildFileUrl(fileUrl, backendKey = 'default') {
229
+ // If URL is already absolute (cloud storage), use it as-is
230
+ if (fileUrl && fileUrl.startsWith('http')) {
231
+ return fileUrl;
232
+ }
233
+ const cfg = getConfig();
234
+ const backend = cfg.backendConfigs[backendKey];
235
+ if (!backend) {
236
+ throw new ConfigError(`Backend "${backendKey}" not found in configuration.`);
237
+ }
238
+ // If no fileRootURL provided, return relative URL as-is
239
+ if (!backend.fileRootURL) {
240
+ return fileUrl;
241
+ }
242
+ // Construct full URL
243
+ return backend.fileRootURL.replace(/\/$/, '') + fileUrl;
244
+ }
245
+ /**
246
+ * Get a model class by name using the registered getter.
247
+ *
248
+ * @param {string} modelName - The model name (e.g., 'app.MyModel')
249
+ * @param {string} configKey - The config key (backend name)
250
+ * @returns {Function|null} - The model class or null if not found
251
+ */
252
+ export function getModelClass(modelName, configKey) {
253
+ if (!modelGetter) {
254
+ // Optionally check if config is set first
255
+ // getConfig(); // This will throw if config isn't set
256
+ throw new ConfigError('Model registry not registered. Please call registerModelGetter() with the function from model-registry.js during app initialization.');
257
+ }
258
+ // Delegate to the function provided by the user from model-registry.js
259
+ return modelGetter(modelName, configKey);
260
+ }
261
+ /**
262
+ * Exposes a singleton object for configuration functionality.
263
+ */
264
+ export const configInstance = {
265
+ setConfig,
266
+ getConfig,
267
+ setBackendConfig,
268
+ initializeEventReceiver,
269
+ registerModelGetter,
270
+ getModelClass,
271
+ buildFileUrl
272
+ };
273
+ export default configInstance;
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Set an event receiver for a specific backend.
3
+ * @param {string} configKey - The backend configuration key
4
+ * @param {EventReceiver} receiver - The event receiver instance
5
+ */
6
+ export function setEventReceiver(configKey: string, receiver: EventReceiver): void;
7
+ /**
8
+ * Get the event receiver for a specific backend.
9
+ * @param {string} configKey - The backend configuration key
10
+ * @returns {EventReceiver|null}
11
+ */
12
+ export function getEventReceiver(configKey?: string): EventReceiver | null;
13
+ /**
14
+ * Get all registered event receivers.
15
+ * @returns {Map<string, EventReceiver>}
16
+ */
17
+ export function getAllEventReceivers(): Map<string, EventReceiver>;
18
+ /**
19
+ * Set a custom namespace resolver function for a specific backend.
20
+ * @param {string} configKey - The backend configuration key
21
+ * @param {NamespaceResolver} resolver
22
+ */
23
+ export function setNamespaceResolver(configKey: string, resolver: NamespaceResolver): void;
24
+ /**
25
+ * Event types that can be received from the server.
26
+ */
27
+ export type EventType = string;
28
+ export namespace EventType {
29
+ let CREATE: string;
30
+ let UPDATE: string;
31
+ let DELETE: string;
32
+ let BULK_CREATE: string;
33
+ let BULK_UPDATE: string;
34
+ let BULK_DELETE: string;
35
+ }
36
+ /**
37
+ * Callback for handling model events.
38
+ * @callback EventHandler
39
+ * @param {ModelEvent} event - The event object.
40
+ */
41
+ /**
42
+ * A namespace resolver function.
43
+ * @callback NamespaceResolver
44
+ * @param {string} modelName - The model name.
45
+ * @returns {string} The namespace.
46
+ */
47
+ /**
48
+ * Options for instantiating a Pusher client.
49
+ * @typedef {Object} PusherClientOptions
50
+ * @property {string} appKey
51
+ * @property {string} cluster
52
+ * @property {boolean} [forceTLS]
53
+ * @property {string} authEndpoint
54
+ * @property {function(): Object<string, string>} [getAuthHeaders]
55
+ */
56
+ /**
57
+ * Configuration options for Pusher event receivers.
58
+ * @typedef {Object} PusherReceiverOptions
59
+ * @property {PusherClientOptions} clientOptions
60
+ * @property {function(string): string} [formatChannelName] - Optional channel name formatter. Default: (namespace) => `private-${namespace}`
61
+ * @property {NamespaceResolver} [namespaceResolver] - Optional namespace resolver. Default: (modelName) => modelName.
62
+ */
63
+ /**
64
+ * Implementation of EventReceiver that uses Pusher.
65
+ */
66
+ export class PusherEventReceiver {
67
+ /**
68
+ * @param {PusherReceiverOptions} options
69
+ * @param {string} configKey - The backend configuration key
70
+ */
71
+ constructor(options: PusherReceiverOptions, configKey: string);
72
+ configKey: string;
73
+ connectionTimeoutId: NodeJS.Timeout;
74
+ pusherClient: any;
75
+ formatChannelName: (arg0: string) => string;
76
+ namespaceResolver: NamespaceResolver;
77
+ channels: Map<any, any>;
78
+ eventHandlers: Set<any>;
79
+ /**
80
+ * @private
81
+ * @param {string} reason
82
+ */
83
+ private _logConnectionError;
84
+ /**
85
+ * Set the namespace resolver function.
86
+ * @param {NamespaceResolver} resolver
87
+ */
88
+ setNamespaceResolver(resolver: NamespaceResolver): void;
89
+ /**
90
+ * Connect to Pusher (no-op since Pusher handles connection automatically).
91
+ */
92
+ connect(): void;
93
+ /**
94
+ * Subscribe to events for a specific namespace.
95
+ * @param {string} namespace
96
+ */
97
+ subscribe(namespace: string): void;
98
+ unsubscribe(namespace: any): void;
99
+ /**
100
+ * Disconnect from Pusher.
101
+ */
102
+ disconnect(): void;
103
+ /**
104
+ * Add handler for model events
105
+ * @param {EventHandler} handler
106
+ */
107
+ addModelEventHandler(handler: EventHandler): void;
108
+ /**
109
+ * Legacy method - adds event handler for backwards compatibility
110
+ * @param {EventHandler} handler
111
+ */
112
+ addEventHandler(handler: EventHandler): void;
113
+ /**
114
+ * Remove an event handler callback.
115
+ * @param {EventHandler} handler
116
+ */
117
+ removeEventHandler(handler: EventHandler): void;
118
+ /**
119
+ * Get namespace from model name using the resolver.
120
+ * @param {string} modelName
121
+ * @returns {string}
122
+ */
123
+ getNamespace(modelName: string): string;
124
+ }
125
+ /**
126
+ * Structure of events received from the server.
127
+ */
128
+ export type ModelEvent = {
129
+ /**
130
+ * - Support both frontend (type) and backend (event) naming conventions.
131
+ */
132
+ type?: string | undefined;
133
+ event?: string | undefined;
134
+ model: string;
135
+ data?: any;
136
+ operationId?: string | undefined;
137
+ namespace?: string | undefined;
138
+ /**
139
+ * - For bulk events.
140
+ */
141
+ instances?: (string | number)[] | undefined;
142
+ pk_field_name?: string | undefined;
143
+ /**
144
+ * - The backend configuration key this event is associated with.
145
+ */
146
+ configKey?: string | undefined;
147
+ /**
148
+ * - Additional open-ended keys.
149
+ */
150
+ key?: any;
151
+ };
152
+ /**
153
+ * Callback for handling model events.
154
+ */
155
+ export type EventHandler = (event: ModelEvent) => any;
156
+ /**
157
+ * A namespace resolver function.
158
+ */
159
+ export type NamespaceResolver = (modelName: string) => string;
160
+ /**
161
+ * Options for instantiating a Pusher client.
162
+ */
163
+ export type PusherClientOptions = {
164
+ appKey: string;
165
+ cluster: string;
166
+ forceTLS?: boolean | undefined;
167
+ authEndpoint: string;
168
+ getAuthHeaders?: (() => {
169
+ [x: string]: string;
170
+ }) | undefined;
171
+ };
172
+ /**
173
+ * Configuration options for Pusher event receivers.
174
+ */
175
+ export type PusherReceiverOptions = {
176
+ clientOptions: PusherClientOptions;
177
+ /**
178
+ * - Optional channel name formatter. Default: (namespace) => `private-${namespace}`
179
+ */
180
+ formatChannelName?: ((arg0: string) => string) | undefined;
181
+ /**
182
+ * - Optional namespace resolver. Default: (modelName) => modelName.
183
+ */
184
+ namespaceResolver?: NamespaceResolver | undefined;
185
+ };