@olaboot/esm-form-engine-lib 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/LICENSE.txt +401 -0
  2. package/README.md +202 -0
  3. package/dist/adapters/control-adapter.d.ts +3 -0
  4. package/dist/adapters/control-adapter.d.ts.map +1 -0
  5. package/dist/adapters/control-adapter.js +17 -0
  6. package/dist/adapters/encounter-datetime-adapter.d.ts +3 -0
  7. package/dist/adapters/encounter-datetime-adapter.d.ts.map +1 -0
  8. package/dist/adapters/encounter-datetime-adapter.js +26 -0
  9. package/dist/adapters/encounter-diagnosis-adapter.d.ts +10 -0
  10. package/dist/adapters/encounter-diagnosis-adapter.d.ts.map +1 -0
  11. package/dist/adapters/encounter-diagnosis-adapter.js +89 -0
  12. package/dist/adapters/encounter-diagnosis-adapter.test.js +217 -0
  13. package/dist/adapters/encounter-location-adapter.d.ts +3 -0
  14. package/dist/adapters/encounter-location-adapter.d.ts.map +1 -0
  15. package/dist/adapters/encounter-location-adapter.js +25 -0
  16. package/dist/adapters/encounter-provider-adapter.d.ts +3 -0
  17. package/dist/adapters/encounter-provider-adapter.d.ts.map +1 -0
  18. package/dist/adapters/encounter-provider-adapter.js +34 -0
  19. package/dist/adapters/encounter-role-adapter.d.ts +3 -0
  20. package/dist/adapters/encounter-role-adapter.d.ts.map +1 -0
  21. package/dist/adapters/encounter-role-adapter.js +40 -0
  22. package/dist/adapters/inline-date-adapter.d.ts +3 -0
  23. package/dist/adapters/inline-date-adapter.d.ts.map +1 -0
  24. package/dist/adapters/inline-date-adapter.js +56 -0
  25. package/dist/adapters/obs-adapter.d.ts +29 -0
  26. package/dist/adapters/obs-adapter.d.ts.map +1 -0
  27. package/dist/adapters/obs-adapter.js +284 -0
  28. package/dist/adapters/obs-adapter.test.js +1443 -0
  29. package/dist/adapters/obs-comment-adapter.d.ts +4 -0
  30. package/dist/adapters/obs-comment-adapter.d.ts.map +1 -0
  31. package/dist/adapters/obs-comment-adapter.js +52 -0
  32. package/dist/adapters/orders-adapter.d.ts +4 -0
  33. package/dist/adapters/orders-adapter.d.ts.map +1 -0
  34. package/dist/adapters/orders-adapter.js +64 -0
  35. package/dist/adapters/patient-identifier-adapter.d.ts +3 -0
  36. package/dist/adapters/patient-identifier-adapter.d.ts.map +1 -0
  37. package/dist/adapters/patient-identifier-adapter.js +40 -0
  38. package/dist/adapters/person-attribute-adapter.d.ts +3 -0
  39. package/dist/adapters/person-attribute-adapter.d.ts.map +1 -0
  40. package/dist/adapters/person-attribute-adapter.js +39 -0
  41. package/dist/adapters/person-attribute-adapter.test.js +146 -0
  42. package/dist/adapters/program-state-adapter.d.ts +3 -0
  43. package/dist/adapters/program-state-adapter.d.ts.map +1 -0
  44. package/dist/adapters/program-state-adapter.js +41 -0
  45. package/dist/adapters/program-state-adapter.test.js +411 -0
  46. package/dist/api/index.d.ts +27 -0
  47. package/dist/api/index.d.ts.map +1 -0
  48. package/dist/api/index.js +170 -0
  49. package/dist/components/error/error-modal.component.d.ts +7 -0
  50. package/dist/components/error/error-modal.component.d.ts.map +1 -0
  51. package/dist/components/error/error-modal.component.js +31 -0
  52. package/dist/components/error/error.scss +4 -0
  53. package/dist/components/extension/extension-parcel.component.d.ts +5 -0
  54. package/dist/components/extension/extension-parcel.component.d.ts.map +1 -0
  55. package/dist/components/extension/extension-parcel.component.js +35 -0
  56. package/dist/components/field-label/field-label.component.d.ts +12 -0
  57. package/dist/components/field-label/field-label.component.d.ts.map +1 -0
  58. package/dist/components/field-label/field-label.component.js +33 -0
  59. package/dist/components/field-label/field-label.scss +15 -0
  60. package/dist/components/group/obs-group.component.d.ts +5 -0
  61. package/dist/components/group/obs-group.component.d.ts.map +1 -0
  62. package/dist/components/group/obs-group.component.js +48 -0
  63. package/dist/components/group/obs-group.scss +16 -0
  64. package/dist/components/inputs/content-switcher/content-switcher.component.d.ts +5 -0
  65. package/dist/components/inputs/content-switcher/content-switcher.component.d.ts.map +1 -0
  66. package/dist/components/inputs/content-switcher/content-switcher.component.js +70 -0
  67. package/dist/components/inputs/content-switcher/content-switcher.scss +55 -0
  68. package/dist/components/inputs/date/date.component.d.ts +5 -0
  69. package/dist/components/inputs/date/date.component.d.ts.map +1 -0
  70. package/dist/components/inputs/date/date.component.js +125 -0
  71. package/dist/components/inputs/date/date.scss +37 -0
  72. package/dist/components/inputs/date/date.test.js +85 -0
  73. package/dist/components/inputs/file/file-thumbnail.component.d.ts +10 -0
  74. package/dist/components/inputs/file/file-thumbnail.component.d.ts.map +1 -0
  75. package/dist/components/inputs/file/file-thumbnail.component.js +51 -0
  76. package/dist/components/inputs/file/file-thumbnail.scss +42 -0
  77. package/dist/components/inputs/file/file.component.d.ts +5 -0
  78. package/dist/components/inputs/file/file.component.d.ts.map +1 -0
  79. package/dist/components/inputs/file/file.component.js +90 -0
  80. package/dist/components/inputs/file/file.scss +21 -0
  81. package/dist/components/inputs/fixed-value/fixed-value.component.d.ts +5 -0
  82. package/dist/components/inputs/fixed-value/fixed-value.component.d.ts.map +1 -0
  83. package/dist/components/inputs/fixed-value/fixed-value.component.js +14 -0
  84. package/dist/components/inputs/markdown/markdown-wrapper.component.d.ts +6 -0
  85. package/dist/components/inputs/markdown/markdown-wrapper.component.d.ts.map +1 -0
  86. package/dist/components/inputs/markdown/markdown-wrapper.component.js +20 -0
  87. package/dist/components/inputs/markdown/markdown.component.d.ts +5 -0
  88. package/dist/components/inputs/markdown/markdown.component.d.ts.map +1 -0
  89. package/dist/components/inputs/markdown/markdown.component.js +26 -0
  90. package/dist/components/inputs/multi-select/multi-select.component.d.ts +5 -0
  91. package/dist/components/inputs/multi-select/multi-select.component.d.ts.map +1 -0
  92. package/dist/components/inputs/multi-select/multi-select.component.js +134 -0
  93. package/dist/components/inputs/multi-select/multi-select.scss +25 -0
  94. package/dist/components/inputs/multi-select/multi-select.test.js +106 -0
  95. package/dist/components/inputs/number/number.component.d.ts +5 -0
  96. package/dist/components/inputs/number/number.component.d.ts.map +1 -0
  97. package/dist/components/inputs/number/number.component.js +77 -0
  98. package/dist/components/inputs/number/number.scss +15 -0
  99. package/dist/components/inputs/number/number.test.js +98 -0
  100. package/dist/components/inputs/radio/radio.component.d.ts +5 -0
  101. package/dist/components/inputs/radio/radio.component.d.ts.map +1 -0
  102. package/dist/components/inputs/radio/radio.component.js +69 -0
  103. package/dist/components/inputs/radio/radio.scss +36 -0
  104. package/dist/components/inputs/radio/radio.test.js +190 -0
  105. package/dist/components/inputs/select/dropdown.component.d.ts +5 -0
  106. package/dist/components/inputs/select/dropdown.component.d.ts.map +1 -0
  107. package/dist/components/inputs/select/dropdown.component.js +82 -0
  108. package/dist/components/inputs/select/dropdown.scss +11 -0
  109. package/dist/components/inputs/select/dropdown.test.js +157 -0
  110. package/dist/components/inputs/text/text.component.d.ts +5 -0
  111. package/dist/components/inputs/text/text.component.d.ts.map +1 -0
  112. package/dist/components/inputs/text/text.component.js +62 -0
  113. package/dist/components/inputs/text/text.scss +15 -0
  114. package/dist/components/inputs/text/text.test.js +184 -0
  115. package/dist/components/inputs/text-area/text-area.component.d.ts +5 -0
  116. package/dist/components/inputs/text-area/text-area.component.d.ts.map +1 -0
  117. package/dist/components/inputs/text-area/text-area.component.js +60 -0
  118. package/dist/components/inputs/text-area/text-area.scss +11 -0
  119. package/dist/components/inputs/toggle/toggle.component.d.ts +5 -0
  120. package/dist/components/inputs/toggle/toggle.component.d.ts.map +1 -0
  121. package/dist/components/inputs/toggle/toggle.component.js +57 -0
  122. package/dist/components/inputs/toggle/toggle.scss +12 -0
  123. package/dist/components/inputs/ui-select-extended/ui-select-extended.component.d.ts +5 -0
  124. package/dist/components/inputs/ui-select-extended/ui-select-extended.component.d.ts.map +1 -0
  125. package/dist/components/inputs/ui-select-extended/ui-select-extended.component.js +203 -0
  126. package/dist/components/inputs/ui-select-extended/ui-select-extended.scss +19 -0
  127. package/dist/components/inputs/ui-select-extended/ui-select-extended.test.js +250 -0
  128. package/dist/components/inputs/unspecified/unspecified.component.d.ts +11 -0
  129. package/dist/components/inputs/unspecified/unspecified.component.d.ts.map +1 -0
  130. package/dist/components/inputs/unspecified/unspecified.component.js +65 -0
  131. package/dist/components/inputs/unspecified/unspecified.scss +7 -0
  132. package/dist/components/inputs/unspecified/unspecified.test.js +152 -0
  133. package/dist/components/inputs/workspace-launcher/workspace-launcher.component.d.ts +5 -0
  134. package/dist/components/inputs/workspace-launcher/workspace-launcher.component.d.ts.map +1 -0
  135. package/dist/components/inputs/workspace-launcher/workspace-launcher.component.js +64 -0
  136. package/dist/components/inputs/workspace-launcher/workspace-launcher.scss +21 -0
  137. package/dist/components/inputs/workspace-launcher/workspace-launcher.test.js +174 -0
  138. package/dist/components/label/label.component.d.ts +8 -0
  139. package/dist/components/label/label.component.d.ts.map +1 -0
  140. package/dist/components/label/label.component.js +15 -0
  141. package/dist/components/label/label.scss +15 -0
  142. package/dist/components/loaders/loader.component.d.ts +4 -0
  143. package/dist/components/loaders/loader.component.d.ts.map +1 -0
  144. package/dist/components/loaders/loader.component.js +14 -0
  145. package/dist/components/loaders/loader.scss +20 -0
  146. package/dist/components/patient-banner/patient-banner.component.d.ts +7 -0
  147. package/dist/components/patient-banner/patient-banner.component.d.ts.map +1 -0
  148. package/dist/components/patient-banner/patient-banner.component.js +16 -0
  149. package/dist/components/patient-banner/patient-banner.scss +12 -0
  150. package/dist/components/previous-value-review/previous-value-review.component.d.ts +12 -0
  151. package/dist/components/previous-value-review/previous-value-review.component.d.ts.map +1 -0
  152. package/dist/components/previous-value-review/previous-value-review.component.js +29 -0
  153. package/dist/components/previous-value-review/previous-value-review.scss +36 -0
  154. package/dist/components/processor-factory/form-processor-factory.component.d.ts +10 -0
  155. package/dist/components/processor-factory/form-processor-factory.component.d.ts.map +1 -0
  156. package/dist/components/processor-factory/form-processor-factory.component.js +114 -0
  157. package/dist/components/renderer/custom-hooks-renderer.component.d.ts +13 -0
  158. package/dist/components/renderer/custom-hooks-renderer.component.d.ts.map +1 -0
  159. package/dist/components/renderer/custom-hooks-renderer.component.js +13 -0
  160. package/dist/components/renderer/field/fieldLogic.d.ts +16 -0
  161. package/dist/components/renderer/field/fieldLogic.d.ts.map +1 -0
  162. package/dist/components/renderer/field/fieldLogic.js +238 -0
  163. package/dist/components/renderer/field/fieldLogic.test.js +140 -0
  164. package/dist/components/renderer/field/fieldRenderUtils.d.ts +9 -0
  165. package/dist/components/renderer/field/fieldRenderUtils.d.ts.map +1 -0
  166. package/dist/components/renderer/field/fieldRenderUtils.js +8 -0
  167. package/dist/components/renderer/field/fieldRenderUtils.test.js +51 -0
  168. package/dist/components/renderer/field/form-field-renderer.component.d.ts +19 -0
  169. package/dist/components/renderer/field/form-field-renderer.component.d.ts.map +1 -0
  170. package/dist/components/renderer/field/form-field-renderer.component.js +214 -0
  171. package/dist/components/renderer/field/form-field-renderer.scss +5 -0
  172. package/dist/components/renderer/form/form-renderer.component.d.ts +10 -0
  173. package/dist/components/renderer/form/form-renderer.component.d.ts.map +1 -0
  174. package/dist/components/renderer/form/form-renderer.component.js +102 -0
  175. package/dist/components/renderer/form/state.d.ts +41 -0
  176. package/dist/components/renderer/form/state.d.ts.map +1 -0
  177. package/dist/components/renderer/form/state.js +69 -0
  178. package/dist/components/renderer/page/page.renderer.component.d.ts +9 -0
  179. package/dist/components/renderer/page/page.renderer.component.d.ts.map +1 -0
  180. package/dist/components/renderer/page/page.renderer.component.js +85 -0
  181. package/dist/components/renderer/page/page.renderer.scss +74 -0
  182. package/dist/components/renderer/section/section-renderer.component.d.ts +6 -0
  183. package/dist/components/renderer/section/section-renderer.component.d.ts.map +1 -0
  184. package/dist/components/renderer/section/section-renderer.component.js +20 -0
  185. package/dist/components/renderer/section/section-renderer.scss +19 -0
  186. package/dist/components/repeat/helpers.d.ts +6 -0
  187. package/dist/components/repeat/helpers.d.ts.map +1 -0
  188. package/dist/components/repeat/helpers.js +64 -0
  189. package/dist/components/repeat/helpers.test.js +25 -0
  190. package/dist/components/repeat/repeat-controls.component.d.ts +12 -0
  191. package/dist/components/repeat/repeat-controls.component.d.ts.map +1 -0
  192. package/dist/components/repeat/repeat-controls.component.js +22 -0
  193. package/dist/components/repeat/repeat-controls.scss +7 -0
  194. package/dist/components/repeat/repeat.component.d.ts +5 -0
  195. package/dist/components/repeat/repeat.component.d.ts.map +1 -0
  196. package/dist/components/repeat/repeat.component.js +185 -0
  197. package/dist/components/repeat/repeat.scss +30 -0
  198. package/dist/components/repeat/repeat.test.js +25 -0
  199. package/dist/components/sidebar/page-observer.d.ts +20 -0
  200. package/dist/components/sidebar/page-observer.d.ts.map +1 -0
  201. package/dist/components/sidebar/page-observer.js +60 -0
  202. package/dist/components/sidebar/sidebar.component.d.ts +14 -0
  203. package/dist/components/sidebar/sidebar.component.d.ts.map +1 -0
  204. package/dist/components/sidebar/sidebar.component.js +77 -0
  205. package/dist/components/sidebar/sidebar.scss +114 -0
  206. package/dist/components/sidebar/useCurrentActivePage.d.ts +34 -0
  207. package/dist/components/sidebar/useCurrentActivePage.d.ts.map +1 -0
  208. package/dist/components/sidebar/useCurrentActivePage.js +114 -0
  209. package/dist/components/sidebar/useCurrentActivePage.test.js +208 -0
  210. package/dist/components/sidebar/usePageObserver.d.ts +11 -0
  211. package/dist/components/sidebar/usePageObserver.d.ts.map +1 -0
  212. package/dist/components/sidebar/usePageObserver.js +42 -0
  213. package/dist/components/value/value.component.d.ts +6 -0
  214. package/dist/components/value/value.component.d.ts.map +1 -0
  215. package/dist/components/value/value.component.js +24 -0
  216. package/dist/components/value/value.scss +17 -0
  217. package/dist/components/value/view/field-value-view.component.d.ts +10 -0
  218. package/dist/components/value/view/field-value-view.component.d.ts.map +1 -0
  219. package/dist/components/value/view/field-value-view.component.js +29 -0
  220. package/dist/components/value/view/field-value-view.scss +31 -0
  221. package/dist/constants.d.ts +9 -0
  222. package/dist/constants.d.ts.map +1 -0
  223. package/dist/constants.js +13 -0
  224. package/dist/datasources/concept-data-source.d.ts +6 -0
  225. package/dist/datasources/concept-data-source.d.ts.map +1 -0
  226. package/dist/datasources/concept-data-source.js +35 -0
  227. package/dist/datasources/data-source.d.ts +10 -0
  228. package/dist/datasources/data-source.d.ts.map +1 -0
  229. package/dist/datasources/data-source.js +41 -0
  230. package/dist/datasources/encounter-role-datasource.d.ts +6 -0
  231. package/dist/datasources/encounter-role-datasource.d.ts.map +1 -0
  232. package/dist/datasources/encounter-role-datasource.js +13 -0
  233. package/dist/datasources/historical-data-source.d.ts +6 -0
  234. package/dist/datasources/historical-data-source.d.ts.map +1 -0
  235. package/dist/datasources/historical-data-source.js +24 -0
  236. package/dist/datasources/location-data-source.d.ts +6 -0
  237. package/dist/datasources/location-data-source.d.ts.map +1 -0
  238. package/dist/datasources/location-data-source.js +24 -0
  239. package/dist/datasources/provider-datasource.d.ts +6 -0
  240. package/dist/datasources/provider-datasource.d.ts.map +1 -0
  241. package/dist/datasources/provider-datasource.js +13 -0
  242. package/dist/datasources/select-concept-answers-datasource.d.ts +9 -0
  243. package/dist/datasources/select-concept-answers-datasource.d.ts.map +1 -0
  244. package/dist/datasources/select-concept-answers-datasource.js +19 -0
  245. package/dist/declarations.d.js +0 -0
  246. package/dist/external-function-context.d.ts +7 -0
  247. package/dist/external-function-context.d.ts.map +1 -0
  248. package/dist/external-function-context.js +2 -0
  249. package/dist/form-engine.component.d.ts +23 -0
  250. package/dist/form-engine.component.d.ts.map +1 -0
  251. package/dist/form-engine.component.js +174 -0
  252. package/dist/form-engine.scss +148 -0
  253. package/dist/form-engine.test.js +1253 -0
  254. package/dist/globals.d.ts +3 -0
  255. package/dist/globals.d.ts.map +1 -0
  256. package/dist/globals.js +2 -0
  257. package/dist/hooks/useConcepts.d.ts +23 -0
  258. package/dist/hooks/useConcepts.d.ts.map +1 -0
  259. package/dist/hooks/useConcepts.js +31 -0
  260. package/dist/hooks/useDataSourceDependentValue.d.ts +4 -0
  261. package/dist/hooks/useDataSourceDependentValue.d.ts.map +1 -0
  262. package/dist/hooks/useDataSourceDependentValue.js +14 -0
  263. package/dist/hooks/useEncounter.d.ts +7 -0
  264. package/dist/hooks/useEncounter.d.ts.map +1 -0
  265. package/dist/hooks/useEncounter.js +38 -0
  266. package/dist/hooks/useEncounterRole.d.ts +7 -0
  267. package/dist/hooks/useEncounterRole.d.ts.map +1 -0
  268. package/dist/hooks/useEncounterRole.js +18 -0
  269. package/dist/hooks/useEvaluateFormFieldExpressions.d.ts +7 -0
  270. package/dist/hooks/useEvaluateFormFieldExpressions.d.ts.map +1 -0
  271. package/dist/hooks/useEvaluateFormFieldExpressions.js +112 -0
  272. package/dist/hooks/useExternalFormAction.d.ts +43 -0
  273. package/dist/hooks/useExternalFormAction.d.ts.map +1 -0
  274. package/dist/hooks/useExternalFormAction.js +71 -0
  275. package/dist/hooks/useFormCollapse.d.ts +6 -0
  276. package/dist/hooks/useFormCollapse.d.ts.map +1 -0
  277. package/dist/hooks/useFormCollapse.js +35 -0
  278. package/dist/hooks/useFormFieldValidators.d.ts +3 -0
  279. package/dist/hooks/useFormFieldValidators.d.ts.map +1 -0
  280. package/dist/hooks/useFormFieldValidators.js +20 -0
  281. package/dist/hooks/useFormFieldValueAdapters.d.ts +3 -0
  282. package/dist/hooks/useFormFieldValueAdapters.d.ts.map +1 -0
  283. package/dist/hooks/useFormFieldValueAdapters.js +21 -0
  284. package/dist/hooks/useFormFields.d.ts +6 -0
  285. package/dist/hooks/useFormFields.d.ts.map +1 -0
  286. package/dist/hooks/useFormFields.js +62 -0
  287. package/dist/hooks/useFormFieldsMeta.d.ts +4 -0
  288. package/dist/hooks/useFormFieldsMeta.d.ts.map +1 -0
  289. package/dist/hooks/useFormFieldsMeta.js +42 -0
  290. package/dist/hooks/useFormJson.d.ts +19 -0
  291. package/dist/hooks/useFormJson.d.ts.map +1 -0
  292. package/dist/hooks/useFormJson.js +198 -0
  293. package/dist/hooks/useFormJson.test.js +194 -0
  294. package/dist/hooks/useFormStateHelpers.d.ts +15 -0
  295. package/dist/hooks/useFormStateHelpers.d.ts.map +1 -0
  296. package/dist/hooks/useFormStateHelpers.js +83 -0
  297. package/dist/hooks/useFormWorkspaceSize.d.ts +7 -0
  298. package/dist/hooks/useFormWorkspaceSize.d.ts.map +1 -0
  299. package/dist/hooks/useFormWorkspaceSize.js +46 -0
  300. package/dist/hooks/useFormWorkspaceSize.test.js +141 -0
  301. package/dist/hooks/useInitialValues.d.ts +9 -0
  302. package/dist/hooks/useInitialValues.d.ts.map +1 -0
  303. package/dist/hooks/useInitialValues.js +29 -0
  304. package/dist/hooks/useInitialValues.test.js +78 -0
  305. package/dist/hooks/usePatientData.d.ts +6 -0
  306. package/dist/hooks/usePatientData.d.ts.map +1 -0
  307. package/dist/hooks/usePatientData.js +30 -0
  308. package/dist/hooks/usePatientPrograms.d.ts +7 -0
  309. package/dist/hooks/usePatientPrograms.d.ts.map +1 -0
  310. package/dist/hooks/usePatientPrograms.js +22 -0
  311. package/dist/hooks/usePostSubmissionActions.d.ts +13 -0
  312. package/dist/hooks/usePostSubmissionActions.d.ts.map +1 -0
  313. package/dist/hooks/usePostSubmissionActions.js +23 -0
  314. package/dist/hooks/usePostSubmissionActions.test.js +55 -0
  315. package/dist/hooks/useProcessorDependencies.d.ts +8 -0
  316. package/dist/hooks/useProcessorDependencies.d.ts.map +1 -0
  317. package/dist/hooks/useProcessorDependencies.js +33 -0
  318. package/dist/index.d.ts +12 -0
  319. package/dist/index.d.ts.map +1 -0
  320. package/dist/index.js +11 -0
  321. package/dist/lifecycle.d.ts +11 -0
  322. package/dist/lifecycle.d.ts.map +1 -0
  323. package/dist/lifecycle.js +25 -0
  324. package/dist/post-submission-actions/mark-patient-deceased-action.d.ts +4 -0
  325. package/dist/post-submission-actions/mark-patient-deceased-action.d.ts.map +1 -0
  326. package/dist/post-submission-actions/mark-patient-deceased-action.js +53 -0
  327. package/dist/post-submission-actions/program-enrollment-action.d.ts +4 -0
  328. package/dist/post-submission-actions/program-enrollment-action.d.ts.map +1 -0
  329. package/dist/post-submission-actions/program-enrollment-action.js +105 -0
  330. package/dist/processors/encounter/encounter-form-processor.d.ts +26 -0
  331. package/dist/processors/encounter/encounter-form-processor.d.ts.map +1 -0
  332. package/dist/processors/encounter/encounter-form-processor.js +376 -0
  333. package/dist/processors/encounter/encounter-form-processor.test.js +207 -0
  334. package/dist/processors/encounter/encounter-processor-helper.d.ts +19 -0
  335. package/dist/processors/encounter/encounter-processor-helper.d.ts.map +1 -0
  336. package/dist/processors/encounter/encounter-processor-helper.js +293 -0
  337. package/dist/processors/form-processor.d.ts +25 -0
  338. package/dist/processors/form-processor.d.ts.map +1 -0
  339. package/dist/processors/form-processor.js +26 -0
  340. package/dist/provider/form-factory-helper.d.ts +8 -0
  341. package/dist/provider/form-factory-helper.d.ts.map +1 -0
  342. package/dist/provider/form-factory-helper.js +73 -0
  343. package/dist/provider/form-factory-provider.d.ts +48 -0
  344. package/dist/provider/form-factory-provider.d.ts.map +1 -0
  345. package/dist/provider/form-factory-provider.js +136 -0
  346. package/dist/provider/form-provider.d.ts +26 -0
  347. package/dist/provider/form-provider.d.ts.map +1 -0
  348. package/dist/provider/form-provider.js +17 -0
  349. package/dist/registry/inbuilt-components/InbuiltPostSubmissionActions.d.ts +4 -0
  350. package/dist/registry/inbuilt-components/InbuiltPostSubmissionActions.d.ts.map +1 -0
  351. package/dist/registry/inbuilt-components/InbuiltPostSubmissionActions.js +10 -0
  352. package/dist/registry/inbuilt-components/control-templates.d.ts +4 -0
  353. package/dist/registry/inbuilt-components/control-templates.d.ts.map +1 -0
  354. package/dist/registry/inbuilt-components/control-templates.js +54 -0
  355. package/dist/registry/inbuilt-components/inbuiltControls.d.ts +7 -0
  356. package/dist/registry/inbuilt-components/inbuiltControls.d.ts.map +1 -0
  357. package/dist/registry/inbuilt-components/inbuiltControls.js +94 -0
  358. package/dist/registry/inbuilt-components/inbuiltDataSources.d.ts +8 -0
  359. package/dist/registry/inbuilt-components/inbuiltDataSources.d.ts.map +1 -0
  360. package/dist/registry/inbuilt-components/inbuiltDataSources.js +36 -0
  361. package/dist/registry/inbuilt-components/inbuiltFieldValueAdapters.d.ts +4 -0
  362. package/dist/registry/inbuilt-components/inbuiltFieldValueAdapters.d.ts.map +1 -0
  363. package/dist/registry/inbuilt-components/inbuiltFieldValueAdapters.js +71 -0
  364. package/dist/registry/inbuilt-components/inbuiltTransformers.d.ts +4 -0
  365. package/dist/registry/inbuilt-components/inbuiltTransformers.d.ts.map +1 -0
  366. package/dist/registry/inbuilt-components/inbuiltTransformers.js +7 -0
  367. package/dist/registry/inbuilt-components/inbuiltValidators.d.ts +7 -0
  368. package/dist/registry/inbuilt-components/inbuiltValidators.d.ts.map +1 -0
  369. package/dist/registry/inbuilt-components/inbuiltValidators.js +29 -0
  370. package/dist/registry/inbuilt-components/template-component-map.d.ts +5 -0
  371. package/dist/registry/inbuilt-components/template-component-map.d.ts.map +1 -0
  372. package/dist/registry/inbuilt-components/template-component-map.js +27 -0
  373. package/dist/registry/registry.d.ts +61 -0
  374. package/dist/registry/registry.d.ts.map +1 -0
  375. package/dist/registry/registry.js +184 -0
  376. package/dist/registry/registry.test.js +17 -0
  377. package/dist/setup-tests.js +30 -0
  378. package/dist/transformers/default-schema-transformer.d.ts +4 -0
  379. package/dist/transformers/default-schema-transformer.d.ts.map +1 -0
  380. package/dist/transformers/default-schema-transformer.js +308 -0
  381. package/dist/transformers/default-schema-transformer.test.js +319 -0
  382. package/dist/types/domain.d.ts +219 -0
  383. package/dist/types/domain.d.ts.map +1 -0
  384. package/dist/types/domain.js +1 -0
  385. package/dist/types/index.d.ts +126 -0
  386. package/dist/types/index.d.ts.map +1 -0
  387. package/dist/types/index.js +2 -0
  388. package/dist/types/schema.d.ts +243 -0
  389. package/dist/types/schema.d.ts.map +1 -0
  390. package/dist/types/schema.js +1 -0
  391. package/dist/typings.d.js +1 -0
  392. package/dist/utils/boolean-utils.d.ts +13 -0
  393. package/dist/utils/boolean-utils.d.ts.map +1 -0
  394. package/dist/utils/boolean-utils.js +22 -0
  395. package/dist/utils/common-expression-helpers.d.ts +261 -0
  396. package/dist/utils/common-expression-helpers.d.ts.map +1 -0
  397. package/dist/utils/common-expression-helpers.js +538 -0
  398. package/dist/utils/common-expression-helpers.test.js +461 -0
  399. package/dist/utils/common-utils.d.ts +51 -0
  400. package/dist/utils/common-utils.d.ts.map +1 -0
  401. package/dist/utils/common-utils.js +102 -0
  402. package/dist/utils/common-utils.test.js +134 -0
  403. package/dist/utils/error-utils.d.ts +11 -0
  404. package/dist/utils/error-utils.d.ts.map +1 -0
  405. package/dist/utils/error-utils.js +34 -0
  406. package/dist/utils/expression-runner.d.ts +25 -0
  407. package/dist/utils/expression-runner.d.ts.map +1 -0
  408. package/dist/utils/expression-runner.js +104 -0
  409. package/dist/utils/expression-runner.test.js +362 -0
  410. package/dist/utils/form-helper.d.ts +37 -0
  411. package/dist/utils/form-helper.d.ts.map +1 -0
  412. package/dist/utils/form-helper.js +239 -0
  413. package/dist/utils/form-helper.test.js +638 -0
  414. package/dist/utils/form-page-utils.d.ts +3 -0
  415. package/dist/utils/form-page-utils.d.ts.map +1 -0
  416. package/dist/utils/form-page-utils.js +10 -0
  417. package/dist/utils/forms-loader.d.ts +45 -0
  418. package/dist/utils/forms-loader.d.ts.map +1 -0
  419. package/dist/utils/forms-loader.js +246 -0
  420. package/dist/utils/forms-loader.test.js +333 -0
  421. package/dist/utils/post-submission-action-helper.d.ts +2 -0
  422. package/dist/utils/post-submission-action-helper.d.ts.map +1 -0
  423. package/dist/utils/post-submission-action-helper.js +57 -0
  424. package/dist/utils/test-utils.js +66 -0
  425. package/dist/utils/zscore-service.d.ts +6 -0
  426. package/dist/utils/zscore-service.d.ts.map +1 -0
  427. package/dist/utils/zscore-service.js +54 -0
  428. package/dist/validators/conditional-answered-validator.d.ts +3 -0
  429. package/dist/validators/conditional-answered-validator.d.ts.map +1 -0
  430. package/dist/validators/conditional-answered-validator.js +18 -0
  431. package/dist/validators/conditional-answered-validator.test.js +63 -0
  432. package/dist/validators/date-validator.d.ts +3 -0
  433. package/dist/validators/date-validator.d.ts.map +1 -0
  434. package/dist/validators/date-validator.js +21 -0
  435. package/dist/validators/date-validator.test.js +53 -0
  436. package/dist/validators/default-value-validator.d.ts +3 -0
  437. package/dist/validators/default-value-validator.d.ts.map +1 -0
  438. package/dist/validators/default-value-validator.js +46 -0
  439. package/dist/validators/default-value-validator.test.js +95 -0
  440. package/dist/validators/form-validator.d.ts +9 -0
  441. package/dist/validators/form-validator.d.ts.map +1 -0
  442. package/dist/validators/form-validator.js +82 -0
  443. package/dist/validators/form-validator.test.js +158 -0
  444. package/dist/validators/js-expression-validator.d.ts +3 -0
  445. package/dist/validators/js-expression-validator.d.ts.map +1 -0
  446. package/dist/validators/js-expression-validator.js +25 -0
  447. package/dist/validators/js-expression-validator.test.js +115 -0
  448. package/dist/validators/schema.d.ts +1 -0
  449. package/dist/validators/schema.d.ts.map +1 -0
  450. package/dist/validators/schema.js +32 -0
  451. package/dist/zscore/bfa_boys_5_above.json +2522 -0
  452. package/dist/zscore/bfa_girls_5_above.json +2522 -0
  453. package/dist/zscore/hfa_boys_5_above.json +2186 -0
  454. package/dist/zscore/hfa_boys_below5.json +22286 -0
  455. package/dist/zscore/hfa_girls_5_above.json +2186 -0
  456. package/dist/zscore/hfa_girls_below5.json +22286 -0
  457. package/dist/zscore/wfl_boys_below5.json +7814 -0
  458. package/dist/zscore/wfl_girls_below5.json +7814 -0
  459. package/dist/zscore-tests/bmi-age.test.js +84 -0
  460. package/dist/zscore-tests/height-age.test.js +88 -0
  461. package/dist/zscore-tests/weight-height.test.js +82 -0
  462. package/package.json +105 -0
  463. package/src/adapters/control-adapter.ts +29 -0
  464. package/src/adapters/encounter-datetime-adapter.ts +38 -0
  465. package/src/adapters/encounter-diagnosis-adapter.ts +121 -0
  466. package/src/adapters/encounter-location-adapter.ts +39 -0
  467. package/src/adapters/encounter-provider-adapter.ts +48 -0
  468. package/src/adapters/encounter-role-adapter.ts +54 -0
  469. package/src/adapters/inline-date-adapter.ts +59 -0
  470. package/src/adapters/obs-adapter.ts +349 -0
  471. package/src/adapters/obs-comment-adapter.ts +61 -0
  472. package/src/adapters/orders-adapter.ts +82 -0
  473. package/src/adapters/patient-identifier-adapter.ts +46 -0
  474. package/src/adapters/person-attribute-adapter.ts +45 -0
  475. package/src/adapters/program-state-adapter.ts +57 -0
  476. package/src/api/index.ts +224 -0
  477. package/src/components/error/error-modal.component.tsx +37 -0
  478. package/src/components/error/error.scss +4 -0
  479. package/src/components/extension/extension-parcel.component.tsx +32 -0
  480. package/src/components/field-label/field-label.component.tsx +55 -0
  481. package/src/components/field-label/field-label.scss +15 -0
  482. package/src/components/group/obs-group.component.tsx +59 -0
  483. package/src/components/group/obs-group.scss +16 -0
  484. package/src/components/inputs/content-switcher/content-switcher.component.tsx +81 -0
  485. package/src/components/inputs/content-switcher/content-switcher.scss +55 -0
  486. package/src/components/inputs/date/date.component.tsx +141 -0
  487. package/src/components/inputs/date/date.scss +37 -0
  488. package/src/components/inputs/file/file-thumbnail.component.tsx +55 -0
  489. package/src/components/inputs/file/file-thumbnail.scss +42 -0
  490. package/src/components/inputs/file/file.component.tsx +98 -0
  491. package/src/components/inputs/file/file.scss +21 -0
  492. package/src/components/inputs/fixed-value/fixed-value.component.tsx +19 -0
  493. package/src/components/inputs/markdown/markdown-wrapper.component.tsx +14 -0
  494. package/src/components/inputs/markdown/markdown.component.tsx +24 -0
  495. package/src/components/inputs/multi-select/multi-select.component.tsx +152 -0
  496. package/src/components/inputs/multi-select/multi-select.scss +25 -0
  497. package/src/components/inputs/number/number.component.tsx +85 -0
  498. package/src/components/inputs/number/number.scss +15 -0
  499. package/src/components/inputs/radio/radio.component.tsx +81 -0
  500. package/src/components/inputs/radio/radio.scss +36 -0
  501. package/src/components/inputs/select/dropdown.component.tsx +86 -0
  502. package/src/components/inputs/select/dropdown.scss +11 -0
  503. package/src/components/inputs/text/text.component.tsx +67 -0
  504. package/src/components/inputs/text/text.scss +15 -0
  505. package/src/components/inputs/text-area/text-area.component.tsx +63 -0
  506. package/src/components/inputs/text-area/text-area.scss +11 -0
  507. package/src/components/inputs/toggle/toggle.component.tsx +66 -0
  508. package/src/components/inputs/toggle/toggle.scss +12 -0
  509. package/src/components/inputs/ui-select-extended/ui-select-extended.component.tsx +208 -0
  510. package/src/components/inputs/ui-select-extended/ui-select-extended.scss +19 -0
  511. package/src/components/inputs/unspecified/unspecified.component.tsx +84 -0
  512. package/src/components/inputs/unspecified/unspecified.scss +7 -0
  513. package/src/components/inputs/workspace-launcher/workspace-launcher.component.tsx +80 -0
  514. package/src/components/inputs/workspace-launcher/workspace-launcher.scss +21 -0
  515. package/src/components/label/label.component.tsx +20 -0
  516. package/src/components/label/label.scss +15 -0
  517. package/src/components/loaders/loader.component.tsx +16 -0
  518. package/src/components/loaders/loader.scss +20 -0
  519. package/src/components/patient-banner/patient-banner.component.tsx +20 -0
  520. package/src/components/patient-banner/patient-banner.scss +12 -0
  521. package/src/components/previous-value-review/previous-value-review.component.tsx +49 -0
  522. package/src/components/previous-value-review/previous-value-review.scss +36 -0
  523. package/src/components/processor-factory/form-processor-factory.component.tsx +128 -0
  524. package/src/components/renderer/custom-hooks-renderer.component.tsx +30 -0
  525. package/src/components/renderer/field/fieldLogic.ts +314 -0
  526. package/src/components/renderer/field/fieldRenderUtils.ts +16 -0
  527. package/src/components/renderer/field/form-field-renderer.component.tsx +291 -0
  528. package/src/components/renderer/field/form-field-renderer.scss +5 -0
  529. package/src/components/renderer/form/form-renderer.component.tsx +123 -0
  530. package/src/components/renderer/form/state.ts +59 -0
  531. package/src/components/renderer/page/page.renderer.component.tsx +120 -0
  532. package/src/components/renderer/page/page.renderer.scss +74 -0
  533. package/src/components/renderer/section/section-renderer.component.tsx +25 -0
  534. package/src/components/renderer/section/section-renderer.scss +19 -0
  535. package/src/components/repeat/helpers.ts +77 -0
  536. package/src/components/repeat/repeat-controls.component.tsx +38 -0
  537. package/src/components/repeat/repeat-controls.scss +7 -0
  538. package/src/components/repeat/repeat.component.tsx +206 -0
  539. package/src/components/repeat/repeat.scss +30 -0
  540. package/src/components/sidebar/page-observer.ts +58 -0
  541. package/src/components/sidebar/sidebar.component.tsx +121 -0
  542. package/src/components/sidebar/sidebar.scss +114 -0
  543. package/src/components/sidebar/useCurrentActivePage.ts +137 -0
  544. package/src/components/sidebar/usePageObserver.ts +45 -0
  545. package/src/components/value/value.component.tsx +30 -0
  546. package/src/components/value/value.scss +17 -0
  547. package/src/components/value/view/field-value-view.component.tsx +36 -0
  548. package/src/components/value/view/field-value-view.scss +31 -0
  549. package/src/constants.ts +14 -0
  550. package/src/datasources/concept-data-source.ts +42 -0
  551. package/src/datasources/data-source.ts +34 -0
  552. package/src/datasources/encounter-role-datasource.ts +15 -0
  553. package/src/datasources/historical-data-source.ts +11 -0
  554. package/src/datasources/location-data-source.ts +27 -0
  555. package/src/datasources/provider-datasource.ts +15 -0
  556. package/src/datasources/select-concept-answers-datasource.ts +25 -0
  557. package/src/declarations.d.ts +2 -0
  558. package/src/external-function-context.tsx +8 -0
  559. package/src/form-engine.component.tsx +222 -0
  560. package/src/form-engine.scss +148 -0
  561. package/src/globals.ts +2 -0
  562. package/src/hooks/useConcepts.ts +58 -0
  563. package/src/hooks/useDataSourceDependentValue.ts +16 -0
  564. package/src/hooks/useEncounter.ts +40 -0
  565. package/src/hooks/useEncounterRole.ts +15 -0
  566. package/src/hooks/useEvaluateFormFieldExpressions.ts +152 -0
  567. package/src/hooks/useExternalFormAction.ts +94 -0
  568. package/src/hooks/useFormCollapse.ts +36 -0
  569. package/src/hooks/useFormFieldValidators.ts +22 -0
  570. package/src/hooks/useFormFieldValueAdapters.ts +23 -0
  571. package/src/hooks/useFormFields.ts +65 -0
  572. package/src/hooks/useFormFieldsMeta.ts +48 -0
  573. package/src/hooks/useFormJson.ts +257 -0
  574. package/src/hooks/useFormStateHelpers.ts +72 -0
  575. package/src/hooks/useFormWorkspaceSize.ts +52 -0
  576. package/src/hooks/useInitialValues.ts +39 -0
  577. package/src/hooks/usePatientData.ts +32 -0
  578. package/src/hooks/usePatientPrograms.ts +38 -0
  579. package/src/hooks/usePostSubmissionActions.ts +31 -0
  580. package/src/hooks/useProcessorDependencies.ts +42 -0
  581. package/src/index.ts +11 -0
  582. package/src/lifecycle.ts +32 -0
  583. package/src/post-submission-actions/mark-patient-deceased-action.ts +68 -0
  584. package/src/post-submission-actions/program-enrollment-action.ts +137 -0
  585. package/src/processors/encounter/encounter-form-processor.ts +445 -0
  586. package/src/processors/encounter/encounter-processor-helper.ts +387 -0
  587. package/src/processors/form-processor.ts +40 -0
  588. package/src/provider/form-factory-helper.ts +106 -0
  589. package/src/provider/form-factory-provider.tsx +211 -0
  590. package/src/provider/form-provider.tsx +39 -0
  591. package/src/registry/inbuilt-components/InbuiltPostSubmissionActions.ts +13 -0
  592. package/src/registry/inbuilt-components/control-templates.ts +57 -0
  593. package/src/registry/inbuilt-components/inbuiltControls.ts +99 -0
  594. package/src/registry/inbuilt-components/inbuiltDataSources.ts +41 -0
  595. package/src/registry/inbuilt-components/inbuiltFieldValueAdapters.ts +74 -0
  596. package/src/registry/inbuilt-components/inbuiltTransformers.ts +10 -0
  597. package/src/registry/inbuilt-components/inbuiltValidators.ts +33 -0
  598. package/src/registry/inbuilt-components/template-component-map.ts +28 -0
  599. package/src/registry/registry.ts +290 -0
  600. package/src/transformers/default-schema-transformer.ts +340 -0
  601. package/src/types/domain.ts +237 -0
  602. package/src/types/index.ts +153 -0
  603. package/src/types/schema.ts +259 -0
  604. package/src/typings.d.ts +9 -0
  605. package/src/utils/boolean-utils.ts +25 -0
  606. package/src/utils/common-expression-helpers.ts +636 -0
  607. package/src/utils/common-utils.ts +108 -0
  608. package/src/utils/error-utils.ts +37 -0
  609. package/src/utils/expression-runner.ts +172 -0
  610. package/src/utils/form-helper.ts +283 -0
  611. package/src/utils/form-page-utils.ts +13 -0
  612. package/src/utils/forms-loader.ts +306 -0
  613. package/src/utils/post-submission-action-helper.ts +71 -0
  614. package/src/utils/zscore-service.ts +59 -0
  615. package/src/validators/conditional-answered-validator.ts +17 -0
  616. package/src/validators/date-validator.ts +19 -0
  617. package/src/validators/default-value-validator.ts +36 -0
  618. package/src/validators/form-validator.ts +95 -0
  619. package/src/validators/js-expression-validator.ts +44 -0
  620. package/src/validators/schema.ts +34 -0
  621. package/src/zscore/bfa_boys_5_above.json +2522 -0
  622. package/src/zscore/bfa_girls_5_above.json +2522 -0
  623. package/src/zscore/hfa_boys_5_above.json +2186 -0
  624. package/src/zscore/hfa_boys_below5.json +22286 -0
  625. package/src/zscore/hfa_girls_5_above.json +2186 -0
  626. package/src/zscore/hfa_girls_below5.json +22286 -0
  627. package/src/zscore/wfl_boys_below5.json +7814 -0
  628. package/src/zscore/wfl_girls_below5.json +7814 -0
@@ -0,0 +1,306 @@
1
+ import * as semver from 'semver';
2
+ import { type FormField } from '../types';
3
+
4
+ let baseRegistry = {};
5
+ export interface FormJsonFile {
6
+ version: string;
7
+ semanticVersion?: string;
8
+ json: any;
9
+ }
10
+
11
+ /**
12
+ * This is a form behaviour property applied on `page` or `section` or `question`
13
+ */
14
+ interface BehaviourProperty {
15
+ name: string;
16
+ type: 'field' | 'section' | 'page' | 'all';
17
+ value: string;
18
+ }
19
+
20
+ /**
21
+ * Convenience function for loading form(s) associated to a given package or form version.
22
+ *
23
+ * @param packageName The package associated with the form
24
+ * @param formNamespace The form namespace
25
+ * @param version The form version
26
+ * @param isStrict If `true`, throws error if specified form version wasn't found
27
+ * @param formsRegistry Form registry. (This was added for testing purposes)
28
+ * @returns The form json
29
+ */
30
+ export function getForm(
31
+ packageName: string,
32
+ formNamespace: string,
33
+ version?: string,
34
+ isStrict?: boolean,
35
+ formsRegistry?: any,
36
+ ) {
37
+ const forms = lookupForms(packageName, formNamespace, formsRegistry);
38
+ let form = null;
39
+ if (version) {
40
+ form = getFormByVersion(forms, version, isStrict);
41
+ }
42
+ if (!form) {
43
+ form = getLatestFormVersion(forms);
44
+ }
45
+ return loadSubforms(form.json);
46
+ }
47
+
48
+ export function loadSubforms(parentForm) {
49
+ parentForm.pages = parentForm.pages || [];
50
+ parentForm.pages.forEach((page) => {
51
+ if (page.isSubform && page.subform?.name && page.subform.package) {
52
+ try {
53
+ const subform = getForm(page.subform.package, page.subform.name);
54
+ if (!subform) {
55
+ console.error(`Form with name "${page.subform.package}/${page.subform.name}" was not found in registry.`);
56
+ }
57
+ page.subform.form = subform;
58
+ } catch (error) {
59
+ console.error(error);
60
+ }
61
+ }
62
+ });
63
+ return parentForm;
64
+ }
65
+
66
+ export function getLatestFormVersion(forms: FormJsonFile[]) {
67
+ if (forms.length == 1) {
68
+ return forms[0];
69
+ }
70
+ const candidates = forms.map((f) => f.semanticVersion);
71
+ const latest = candidates.sort(formsVersionComparator)[candidates.length - 1];
72
+ return forms.find((f) => f.semanticVersion == latest);
73
+ }
74
+
75
+ export function getFormByVersion(forms: FormJsonFile[], requiredVersion: string, isStrict?: boolean) {
76
+ for (let form of forms) {
77
+ if (semver.satisfies(form.semanticVersion, requiredVersion)) {
78
+ return form;
79
+ }
80
+ }
81
+ if (isStrict) {
82
+ throw new Error(`Couldn't find form with version: ${requiredVersion}`);
83
+ } else {
84
+ return null;
85
+ }
86
+ }
87
+
88
+ export function lookupForms(packageName, formNamespace, formsRegistry) {
89
+ const pkg = formsRegistry ? formsRegistry[packageName] : baseRegistry[packageName];
90
+ if (!pkg) {
91
+ throw Error(`Package with name ${packageName} was not found in registry`);
92
+ }
93
+ if (!pkg[formNamespace]) {
94
+ throw new Error(`Form namespace '${formNamespace}' was not found in forms registry`);
95
+ }
96
+ return Object.keys(pkg[formNamespace]).map((formVersion) => {
97
+ return {
98
+ version: formVersion,
99
+ semanticVersion: semver.coerce(formVersion).version,
100
+ json: pkg[formNamespace][formVersion],
101
+ };
102
+ });
103
+ }
104
+
105
+ /**
106
+ * Function parses JSON form input and filters validation behaviours according to a given intent
107
+ *
108
+ * @param {string} intent The specified intent
109
+ * @param {object} originalJson The original JSON form schema object
110
+ * @param parentOverrides An array of behaviour overrides from parent form to be applied to a subform
111
+ * @returns {object} The form json
112
+ */
113
+ export function applyFormIntent(intent, originalJson, parentOverrides?: Array<BehaviourProperty>) {
114
+ if (!intent) {
115
+ return originalJson;
116
+ }
117
+ const jsonBuffer = JSON.parse(JSON.stringify(originalJson));
118
+ // Set the default page based on the current intent
119
+ jsonBuffer.defaultPage = jsonBuffer.availableIntents?.find(
120
+ (candidate) => candidate.intent === (intent?.intent || intent),
121
+ )?.defaultPage;
122
+
123
+ // filter form-level markdown behaviour
124
+ if (jsonBuffer.markdown) {
125
+ updateMarkdownRequiredBehaviour(jsonBuffer.markdown, intent);
126
+ }
127
+
128
+ // Before starting traversal, ensure nodes exist, at least as empty-arrays
129
+ jsonBuffer.pages = jsonBuffer.pages || [];
130
+
131
+ // Traverse the property tree with items of interest for validation
132
+ jsonBuffer.pages.forEach((page) => {
133
+ if (page.isSubform && page.subform?.form) {
134
+ const behaviourOverrides = [];
135
+ const targetBehaviour = page.subform.behaviours?.find(
136
+ (behaviour) => behaviour.intent == intent?.intent || intent,
137
+ );
138
+ if (targetBehaviour?.readonly !== undefined || targetBehaviour?.readonly != null) {
139
+ behaviourOverrides.push({ name: 'readonly', type: 'field', value: targetBehaviour?.readonly });
140
+ }
141
+
142
+ page.subform.form = applyFormIntent(
143
+ targetBehaviour?.subform_intent || '*',
144
+ page.subform?.form,
145
+ behaviourOverrides,
146
+ );
147
+ }
148
+ const pageBehaviour = page.behaviours?.find((behaviour) => behaviour.intent === (intent?.intent || intent));
149
+ if (pageBehaviour) {
150
+ page.hide = pageBehaviour.hide ?? page.hide;
151
+ page.readonly = pageBehaviour.readonly ?? page.readonly;
152
+ } else {
153
+ const fallBackBehaviour = page.behaviours?.find((behaviour) => behaviour.intent === '*');
154
+ if (fallBackBehaviour) {
155
+ page.hide = fallBackBehaviour.hide ?? page.hide;
156
+ page.readonly = fallBackBehaviour.readonly ?? page.readonly;
157
+ }
158
+ }
159
+
160
+ // filter page-level markdown behaviour
161
+ if (page.markdown) {
162
+ updateMarkdownRequiredBehaviour(page.markdown, intent);
163
+ }
164
+ // Before starting traversal, ensure nodes exist, at least as empty-arrays
165
+ page.sections = page.sections || [];
166
+
167
+ page.sections.forEach((section) => {
168
+ const secBehaviour = section.behaviours?.find((behaviour) => behaviour.intent === intent?.intent || intent);
169
+ if (secBehaviour) {
170
+ section.hide = secBehaviour.hide ?? section.hide;
171
+ } else {
172
+ const fallBackBehaviour = section.behaviours?.find((behaviour) => behaviour.intent === '*');
173
+ section.hide = fallBackBehaviour?.hide ?? section.hide;
174
+ }
175
+
176
+ // filter section-level markdown behaviour
177
+ if (section.markdown) {
178
+ updateMarkdownRequiredBehaviour(section.markdown, intent);
179
+ }
180
+
181
+ // Before starting traversal, ensure nodes exist, at least as empty-arrays
182
+ section.questions = section.questions || [];
183
+
184
+ section.questions.forEach((question: FormField) => {
185
+ if (question['behaviours']) {
186
+ updateQuestionRequiredBehaviour(question, intent?.intent || intent);
187
+ parentOverrides
188
+ ?.filter((override) => override.type == 'all' || override.type == 'field')
189
+ ?.forEach((override) => {
190
+ question[override.name] = override.value;
191
+ });
192
+ }
193
+
194
+ if (question.questions && question.questions.length) {
195
+ question.questions.forEach((childQuestion) => {
196
+ updateQuestionRequiredBehaviour(childQuestion, intent?.intent || intent);
197
+
198
+ parentOverrides
199
+ ?.filter((override) => override.type == 'all' || override.type == 'field')
200
+ ?.forEach((override) => {
201
+ childQuestion[override.name] = override.value;
202
+ });
203
+ });
204
+ }
205
+ });
206
+ });
207
+ });
208
+ return jsonBuffer;
209
+ }
210
+
211
+ // Helpers
212
+
213
+ function updateQuestionRequiredBehaviour(question, intent: string) {
214
+ const requiredIntentBehaviour = question.behaviours?.find((behaviour) => behaviour.intent === intent);
215
+
216
+ const defaultIntentBehaviour = question.behaviours?.find((behaviour) => behaviour.intent === '*');
217
+ // If both required and default intents exist, combine them and update to question
218
+ if (requiredIntentBehaviour || defaultIntentBehaviour) {
219
+ // Remove the intent name props from each object
220
+ delete requiredIntentBehaviour?.intent;
221
+ delete defaultIntentBehaviour?.intent;
222
+
223
+ // Combine required and default intents following the rules:
224
+ // 1. The default intent is applied to all other intents
225
+ // 2. Intent-specific behaviour overrides default behaviour
226
+ const combinedBehaviours = Object.assign(defaultIntentBehaviour || {}, requiredIntentBehaviour || {});
227
+ const defaultValue = combinedBehaviours.defaultValue;
228
+ if (defaultValue != undefined) {
229
+ // add the default value under the question options
230
+ question.questionOptions.defaultValue = defaultValue;
231
+ // delete it so that it's not added at the root level of the question
232
+ delete combinedBehaviours.defaultValue;
233
+ }
234
+ // Add the combinedBehaviours data to initial question
235
+ question = Object.assign(question, combinedBehaviours);
236
+ // Remove behaviours list
237
+ delete question.behaviours;
238
+ }
239
+ }
240
+
241
+ function updateMarkdownRequiredBehaviour(markdown, intent) {
242
+ const requiredIntentBehaviour = markdown.behaviours?.find((behaviour) => behaviour.intent === intent);
243
+ const defaultIntentBehaviour = markdown.behaviours?.find((behaviour) => behaviour.intent === '*');
244
+
245
+ if (requiredIntentBehaviour && defaultIntentBehaviour) {
246
+ delete requiredIntentBehaviour.intent;
247
+ delete defaultIntentBehaviour.intent;
248
+ const combinedBehaviours = Object.assign(defaultIntentBehaviour, requiredIntentBehaviour);
249
+
250
+ markdown = Object.assign(markdown, combinedBehaviours);
251
+ delete markdown.behaviours;
252
+ } else if (!requiredIntentBehaviour && defaultIntentBehaviour) {
253
+ delete defaultIntentBehaviour.intent;
254
+
255
+ markdown = Object.assign(markdown, defaultIntentBehaviour);
256
+ delete markdown.behaviours;
257
+ }
258
+ }
259
+
260
+ export function updateExcludeIntentBehaviour(excludedIntents: Array<string>, originalJson) {
261
+ originalJson.availableIntents = originalJson.availableIntents.filter(
262
+ (intent) => !excludedIntents.includes(intent?.intent || intent),
263
+ );
264
+ return originalJson;
265
+ }
266
+
267
+ export function addToBaseFormsRegistry(customRegistry: Record<string, any>) {
268
+ baseRegistry = { ...baseRegistry, ...customRegistry };
269
+ }
270
+
271
+ function isPositiveInteger(x) {
272
+ return /^\d+$/.test(x);
273
+ }
274
+
275
+ function formsVersionComparator(v1, v2) {
276
+ let v1parts = v1.split('.');
277
+ let v2parts = v2.split('.');
278
+ // First, validate both numbers are true version numbers
279
+ function validateParts(parts) {
280
+ for (let i = 0; i < parts.length; ++i) {
281
+ if (!isPositiveInteger(parts[i])) {
282
+ return false;
283
+ }
284
+ }
285
+ return true;
286
+ }
287
+ if (!validateParts(v1parts) || !validateParts(v2parts)) {
288
+ return NaN;
289
+ }
290
+ for (let i = 0; i < v1parts.length; ++i) {
291
+ if (v2parts.length === i) {
292
+ return 1;
293
+ }
294
+ if (v1parts[i] === v2parts[i]) {
295
+ continue;
296
+ }
297
+ if (v1parts[i] > v2parts[i]) {
298
+ return 1;
299
+ }
300
+ return -1;
301
+ }
302
+ if (v1parts.length != v2parts.length) {
303
+ return -1;
304
+ }
305
+ return 0;
306
+ }
@@ -0,0 +1,71 @@
1
+ export function evaluatePostSubmissionExpression(expression: string, encounters: any[]): boolean {
2
+ const encounter = encounters[0];
3
+ const regx = /(?:\w+|'(?:\\'|[^'\n])*')/g;
4
+ let match;
5
+ const fieldIds = new Set<string>();
6
+ try {
7
+ while ((match = regx.exec(expression))) {
8
+ const value = match[0].replace(/\\'/g, "'"); // Replace escaped single quotes
9
+
10
+ const isBoolean = /^(true|false)$/i.test(value);
11
+ const isNumber = /^-?\d+$/.test(value);
12
+ const isFloat = /^-?\d+\.\d+$/.test(value);
13
+
14
+ if (
15
+ !(value.startsWith("'") && value.endsWith("'")) &&
16
+ typeof value === 'string' &&
17
+ !isBoolean &&
18
+ !isNumber &&
19
+ !isFloat
20
+ ) {
21
+ fieldIds.add(value);
22
+ }
23
+ }
24
+
25
+ let fieldToValueMap = {};
26
+ let replacedExpression;
27
+ if (fieldIds.size) {
28
+ fieldToValueMap = getFieldValues(fieldIds, encounter);
29
+ }
30
+
31
+ if (Object.keys(fieldToValueMap).length) {
32
+ replacedExpression = expression.replace(/(\w+)/g, (match) => {
33
+ return Object.prototype.hasOwnProperty.call(fieldToValueMap, match) ? fieldToValueMap[match] : match;
34
+ });
35
+ } else {
36
+ replacedExpression = expression;
37
+ }
38
+
39
+ return eval(replacedExpression);
40
+ } catch (error) {
41
+ throw new Error('Error evaluating expression');
42
+ }
43
+ }
44
+
45
+ function getFieldValues(fieldIds: Set<string>, encounter: any): Record<string, any> {
46
+ const result: Record<string, any> = {};
47
+ fieldIds.forEach((fieldId) => {
48
+ let value = encounter.obs?.find((item) => item.formFieldPath.includes(fieldId))?.value;
49
+ if (typeof value === 'object') {
50
+ value = value.uuid;
51
+ }
52
+ if (value) {
53
+ value = formatValue(value);
54
+ }
55
+ result[fieldId] = value;
56
+ });
57
+
58
+ return result;
59
+ }
60
+
61
+ //This function wraps string values in single quotes which Javascript will evaluate
62
+ function formatValue(value: any): any {
63
+ if (typeof value === 'string') {
64
+ if (value.length >= 2 && value[0] === "'" && value[value.length - 1] === "'") {
65
+ return value;
66
+ } else {
67
+ return `'${value}'`;
68
+ }
69
+ }
70
+ return value;
71
+ }
@@ -0,0 +1,59 @@
1
+ import filter from 'lodash/filter';
2
+ import bfaMale5Above from '../zscore/bfa_boys_5_above.json';
3
+ import wflMaleBelow5 from '../zscore/wfl_boys_below5.json';
4
+ import hfaMale5Above from '../zscore/hfa_boys_5_above.json';
5
+ import hfaMaleBelow5 from '../zscore/hfa_boys_below5.json';
6
+ import bfaFemale5Above from '../zscore/bfa_girls_5_above.json';
7
+ import wflFemaleBelow5 from '../zscore/wfl_girls_below5.json';
8
+ import hfaFemale5Above from '../zscore/hfa_girls_5_above.json';
9
+ import hfaFemaleBelow5 from '../zscore/hfa_girls_below5.json';
10
+ import dayjs from 'dayjs';
11
+
12
+ export function getZRefByGenderAndAge(gender, birthDate, refdate) {
13
+ const scoreRefModel = {
14
+ weightForHeightRef: null,
15
+ heightForAgeRef: null,
16
+ bmiForAgeRef: null,
17
+ };
18
+ const age = getAge(birthDate, refdate, 'years');
19
+ const ageInMonths = getAge(birthDate, refdate, 'months');
20
+ const ageInDays = getAge(birthDate, refdate, 'days');
21
+
22
+ if (gender === 'F') {
23
+ if (age < 5) {
24
+ scoreRefModel.weightForHeightRef = wflFemaleBelow5;
25
+ scoreRefModel.heightForAgeRef = getScoreReference(hfaFemaleBelow5, 'Day', ageInDays);
26
+ }
27
+ if (age >= 5 && age < 18) {
28
+ scoreRefModel.bmiForAgeRef = getScoreReference(bfaFemale5Above, 'Month', ageInMonths);
29
+ scoreRefModel.heightForAgeRef = getScoreReference(hfaFemale5Above, 'Month', ageInMonths);
30
+ }
31
+ }
32
+ if (gender === 'M') {
33
+ if (age < 5) {
34
+ scoreRefModel.weightForHeightRef = wflMaleBelow5;
35
+ scoreRefModel.heightForAgeRef = getScoreReference(hfaMaleBelow5, 'Day', ageInDays);
36
+ }
37
+
38
+ if (age >= 5 && age < 18) {
39
+ scoreRefModel.bmiForAgeRef = getScoreReference(bfaMale5Above, 'Month', ageInMonths);
40
+ scoreRefModel.heightForAgeRef = getScoreReference(hfaMale5Above, 'Month', ageInMonths);
41
+ }
42
+ }
43
+ return scoreRefModel;
44
+ }
45
+
46
+ function getScoreReference(refData, searchKey, searchValue): any {
47
+ return filter(refData, (refObject) => {
48
+ return refObject[searchKey] === searchValue;
49
+ });
50
+ }
51
+
52
+ function getAge(birthdate, refDate, ageIn) {
53
+ if (birthdate && refDate && ageIn) {
54
+ const todayMoment: any = dayjs(refDate);
55
+ const birthDateMoment: any = dayjs(birthdate);
56
+ return todayMoment.diff(birthDateMoment, ageIn);
57
+ }
58
+ return null;
59
+ }
@@ -0,0 +1,17 @@
1
+ import { isEmpty } from '../validators/form-validator';
2
+ import { type FormFieldValidator, type FormField } from '../types';
3
+
4
+ export const conditionalAnsweredValidator: FormFieldValidator = {
5
+ validate: function (field: FormField, value: unknown, config: Record<string, any>) {
6
+ const { referenceQuestionId, referenceQuestionAnswers, values, formFields, message } = config;
7
+
8
+ const referencedField = formFields.find((field) => field.id === referenceQuestionId);
9
+ const referencedFieldValue = values[referencedField.id];
10
+
11
+ if (!isEmpty(value) && !referenceQuestionAnswers.includes(referencedFieldValue)) {
12
+ return [{ resultType: 'error', errCode: 'invalid.valueSelected', message: message }];
13
+ }
14
+
15
+ return [];
16
+ },
17
+ };
@@ -0,0 +1,19 @@
1
+ import { type FormFieldValidator, type FormField } from '../types';
2
+ import { isTrue } from '../utils/boolean-utils';
3
+ import { FieldValidator } from './form-validator';
4
+
5
+ export const DateValidator: FormFieldValidator = {
6
+ validate: (field: FormField, value: Date, config: any) => {
7
+ const now = new Date();
8
+ const errors = !value ? FieldValidator.validate(field, value) : [];
9
+ if (errors.length) {
10
+ return errors;
11
+ }
12
+ if (value && !isTrue(config?.allowFutureDates)) {
13
+ return value.getTime && value.getTime() > now.getTime()
14
+ ? [{ resultType: 'error', errCode: 'value.invalid', message: 'Future dates not allowed' }]
15
+ : [];
16
+ }
17
+ return [];
18
+ },
19
+ };
@@ -0,0 +1,36 @@
1
+ import dayjs from 'dayjs';
2
+ import { type FormFieldValidator, type FormField } from '../types';
3
+ import { codedTypes } from '../constants';
4
+ import { isEmpty } from './form-validator';
5
+
6
+ export const DefaultValueValidator: FormFieldValidator = {
7
+ validate: (field: FormField, value: any) => {
8
+ if (!isEmpty(value) && codedTypes.includes(field.questionOptions.rendering)) {
9
+ const valuesArray = Array.isArray(value) ? value : [value];
10
+ // check whether value exists in answers
11
+ if (
12
+ !valuesArray.every((val: string) =>
13
+ field.questionOptions.answers?.find((answer) => answer.concept === val || answer.value === val),
14
+ )
15
+ ) {
16
+ return [
17
+ { resultType: 'error', errCode: 'invalid.defaultValue', message: 'Value not found in coded answers list' },
18
+ ];
19
+ }
20
+ }
21
+ if (!isEmpty(value) && field.questionOptions.rendering == 'date') {
22
+ // Check if value is a valid date value
23
+ if (!dayjs(value).isValid()) {
24
+ return [{ resultType: 'error', errCode: 'invalid.defaultValue', message: `Invalid date value: '${value}'` }];
25
+ }
26
+ }
27
+ if (!isEmpty(value) && field.questionOptions.rendering == 'number') {
28
+ if (isNaN(value)) {
29
+ return [
30
+ { resultType: 'error', errCode: 'invalid.defaultValue', message: `Invalid numerical value: '${value}'` },
31
+ ];
32
+ }
33
+ }
34
+ return [];
35
+ },
36
+ };
@@ -0,0 +1,95 @@
1
+ import { type FormFieldValidator, type FormField } from '../types';
2
+ export const fieldRequiredErrCode = 'field.required';
3
+ export const fieldOutOfBoundErrCode = 'field.outOfBound';
4
+
5
+ export const FieldValidator: FormFieldValidator = {
6
+ validate: (field: FormField, value: any) => {
7
+ if (field.meta?.submission?.unspecified) {
8
+ return [];
9
+ }
10
+ if (isEmpty(value) && field.isRequired) {
11
+ if (typeof field.required === 'object' && field.required.type === 'conditionalRequired' && field.isRequired) {
12
+ return addError(fieldRequiredErrCode, field.required.message ?? 'Field is mandatory');
13
+ } else if (field.isRequired) {
14
+ return addError(fieldRequiredErrCode, 'Field is mandatory');
15
+ }
16
+ }
17
+ if (field.questionOptions.rendering === 'text') {
18
+ const minLength = field.questionOptions.minLength;
19
+ const maxLength = field.questionOptions.maxLength;
20
+
21
+ return textInputLengthValidator(minLength, maxLength, value?.length) ?? [];
22
+ }
23
+ if (field.questionOptions.rendering === 'number') {
24
+ const min = Number(field.questionOptions.min);
25
+ const max = Number(field.questionOptions.max);
26
+ const disallowDecimals = field.questionOptions.disallowDecimals || field.meta?.concept?.allowDecimal;
27
+ if (isEmpty(value)) return [];
28
+ if (disallowDecimals && !Number.isInteger(value)) {
29
+ return addError(fieldOutOfBoundErrCode, 'Decimal values are not allowed for this field');
30
+ }
31
+ if (!Number.isNaN(min) || !Number.isNaN(max)) {
32
+ return numberInputRangeValidator(min, max, value);
33
+ }
34
+ }
35
+ return [];
36
+ },
37
+ };
38
+
39
+ export function numberInputRangeValidator(min: number, max: number, inputValue: number) {
40
+ if (!Number.isNaN(min) && inputValue < min) {
41
+ return addError(fieldOutOfBoundErrCode, `Value must be greater than ${min}`);
42
+ }
43
+
44
+ if (!Number.isNaN(max) && inputValue > max) {
45
+ return addError(fieldOutOfBoundErrCode, `Value must be lower than ${max}`);
46
+ }
47
+
48
+ return [];
49
+ }
50
+
51
+ export function isEmpty(value: any): boolean {
52
+ if (value === undefined || value === null || value === '') {
53
+ return true;
54
+ }
55
+ if (typeof value == 'string' && !value?.trim()) {
56
+ return true;
57
+ }
58
+ if (Array.isArray(value) && !value.length) {
59
+ return true;
60
+ }
61
+ return false;
62
+ }
63
+
64
+ export function textInputLengthValidator(minLength: string, maxLength: string, inputLength: number) {
65
+ const minLen = Number(minLength);
66
+ const maxLen = Number(maxLength);
67
+
68
+ if (typeof inputLength === 'number' && !Number.isNaN(inputLength)) {
69
+ if (minLen && maxLen && inputLength >= minLen && inputLength <= maxLen) {
70
+ return [];
71
+ }
72
+
73
+ if (minLen && inputLength < minLen) {
74
+ return addError(fieldOutOfBoundErrCode, `Length should be at least ${minLen} characters`);
75
+ }
76
+
77
+ if (maxLen && inputLength > maxLen) {
78
+ return addError(fieldOutOfBoundErrCode, `Length should not exceed ${maxLen} characters`);
79
+ }
80
+
81
+ if (maxLen && minLen && inputLength < minLen && inputLength > maxLen) {
82
+ return addError(fieldOutOfBoundErrCode, `Length should be between ${minLen} and ${maxLen} characters`);
83
+ }
84
+ }
85
+ }
86
+
87
+ export function addError(errorCode: string, message: string): [{}] {
88
+ return [
89
+ {
90
+ resultType: 'error',
91
+ errCode: errorCode,
92
+ message: message,
93
+ },
94
+ ];
95
+ }
@@ -0,0 +1,44 @@
1
+ import { type FormFieldValidator, type FormField } from '../types';
2
+ import { evaluateExpression, type ExpressionContext } from '../utils/expression-runner';
3
+
4
+ interface ExpressionValidatorConfig {
5
+ failsWhenExpression?: string;
6
+ warnsWhenExpression?: string;
7
+ message: string;
8
+ formFields: FormField[];
9
+ expressionContext: ExpressionContext;
10
+ values: Record<string, any>;
11
+ }
12
+
13
+ export const ExpressionValidator: FormFieldValidator = {
14
+ validate: function (field: FormField, value: any, config: ExpressionValidatorConfig) {
15
+ const INVALID_VALUE_ERR_CODE = 'value.invalid';
16
+ const INVALID_VALUE_ERR_MESSAGE = 'Invalid value';
17
+ const FIELD_HAS_WARNINGS_MESSAGE = 'Field has warnings';
18
+ config.expressionContext.myValue = value;
19
+ return Object.keys(config)
20
+ .filter((key) => key === 'failsWhenExpression' || key === 'warnsWhenExpression')
21
+ .flatMap((key) => {
22
+ const isErrorValidator = key === 'failsWhenExpression';
23
+ return evaluateExpression(
24
+ config[key],
25
+ { value: field, type: 'field' },
26
+ config.formFields,
27
+ { ...config.values, [field.id]: value },
28
+ config.expressionContext,
29
+ )
30
+ ? [
31
+ {
32
+ resultType: isErrorValidator ? 'error' : 'warning',
33
+ errCode: isErrorValidator ? INVALID_VALUE_ERR_CODE : null,
34
+ message: config.message
35
+ ? config.message
36
+ : isErrorValidator
37
+ ? INVALID_VALUE_ERR_MESSAGE
38
+ : FIELD_HAS_WARNINGS_MESSAGE,
39
+ },
40
+ ]
41
+ : [];
42
+ });
43
+ },
44
+ };
@@ -0,0 +1,34 @@
1
+ // import { z, type ZodTypeAny } from 'zod';
2
+ // import { type FormFieldValidator, type FormField, type ValidationResult } from '../types';
3
+
4
+ // TODOs
5
+ // - add a reactive context to evaluate expressions
6
+ // - figure out how to track errors vs warnings with different severity levels
7
+ // (I will be managing validation manually for now until I figure out the above)
8
+ // export const createValidationSchema = (formFields: FormField[], validators: Record<string, FormFieldValidator>) => {
9
+ // const schemaShape: Record<string, ZodTypeAny> = {};
10
+ // formFields.forEach((field) => {
11
+ // schemaShape[field.id] = zodFieldValidator(field, validators);
12
+ // });
13
+ // return z.object(schemaShape);
14
+ // };
15
+
16
+ // const zodFieldValidator = (field: FormField, validators: Record<string, FormFieldValidator>) => {
17
+ // return z.any().refine((value) => {
18
+ // const errorsAndWarnings: ValidationResult[] = [];
19
+ // try {
20
+ // field.validators.forEach((validatorConfig) => {
21
+ // const errorsAndWarnings = validators[validatorConfig.type]?.validate?.(field, value, validatorConfig);
22
+ // if (errorsAndWarnings?.length) {
23
+ // errorsAndWarnings.forEach((errorOrWarning) => {
24
+ // errorsAndWarnings.push(errorOrWarning);
25
+ // });
26
+ // }
27
+ // });
28
+ // return errorsAndWarnings.length === 0;
29
+ // } catch (error) {
30
+ // console.error(error);
31
+ // return false;
32
+ // }
33
+ // });
34
+ // };