@defra/forms-engine-plugin 5.0.0-alpha.2 → 5.0.0-alpha.21

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 (346) hide show
  1. package/.public/javascripts/application.min.js +1 -1
  2. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  3. package/.public/javascripts/application.min.js.map +1 -1
  4. package/.public/javascripts/shared.min.js +1 -1
  5. package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/shared.min.js.map +1 -1
  7. package/.public/stylesheets/application.min.css.map +1 -1
  8. package/.server/client/javascripts/file-upload.js +6 -3
  9. package/.server/client/javascripts/file-upload.js.map +1 -1
  10. package/.server/client/javascripts/geospatial-map.d.ts +153 -5
  11. package/.server/client/javascripts/geospatial-map.js +157 -77
  12. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  13. package/.server/client/javascripts/govuk.js +2 -1
  14. package/.server/client/javascripts/govuk.js.map +1 -1
  15. package/.server/client/javascripts/location-map.d.ts +44 -0
  16. package/.server/client/javascripts/location-map.js +54 -5
  17. package/.server/client/javascripts/location-map.js.map +1 -1
  18. package/.server/client/javascripts/map-constants.d.ts +3 -0
  19. package/.server/client/javascripts/map-constants.js +4 -0
  20. package/.server/client/javascripts/map-constants.js.map +1 -0
  21. package/.server/client/javascripts/map.d.ts +10 -0
  22. package/.server/client/javascripts/map.js +42 -0
  23. package/.server/client/javascripts/map.js.map +1 -1
  24. package/.server/client/javascripts/maps.d.ts +5 -0
  25. package/.server/client/javascripts/maps.js +6 -0
  26. package/.server/client/javascripts/maps.js.map +1 -0
  27. package/.server/client/javascripts/shared.d.ts +1 -4
  28. package/.server/client/javascripts/shared.js +1 -4
  29. package/.server/client/javascripts/shared.js.map +1 -1
  30. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  31. package/.server/client/javascripts/sssi-dataset.js +37 -39
  32. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  33. package/.server/client/stylesheets/maps.scss +4 -0
  34. package/.server/client/stylesheets/shared.scss +1 -5
  35. package/.server/server/constants.d.ts +2 -0
  36. package/.server/server/constants.js +2 -0
  37. package/.server/server/constants.js.map +1 -1
  38. package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
  39. package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
  40. package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
  41. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  42. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  43. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  44. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +21 -0
  45. package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
  46. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  48. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  49. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  50. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  51. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  52. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  53. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  54. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  55. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  56. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  57. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  58. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  59. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
  60. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  61. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  62. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  63. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  64. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  65. package/.server/server/plugins/engine/components/FileUploadField.d.ts +21 -0
  66. package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
  67. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  69. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  70. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  71. package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
  72. package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
  73. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  74. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  75. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  76. package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
  77. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  78. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  79. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  80. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  81. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  82. package/.server/server/plugins/engine/components/LocationFieldBase.js +25 -6
  83. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  84. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
  85. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
  86. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  87. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  89. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  90. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  91. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  92. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  93. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  94. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  95. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  96. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  97. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  98. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  99. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  100. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  101. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
  102. package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
  103. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  104. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  105. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  106. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  108. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  109. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  110. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  111. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  112. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  113. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  114. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  115. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  116. package/.server/server/plugins/engine/components/helpers/components.js +3 -3
  117. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  118. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
  119. package/.server/server/plugins/engine/components/helpers/geospatial.js +56 -15
  120. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  121. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  122. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  123. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  124. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  125. package/.server/server/plugins/engine/components/types.js.map +1 -1
  126. package/.server/server/plugins/engine/errors.d.ts +49 -0
  127. package/.server/server/plugins/engine/errors.js +75 -0
  128. package/.server/server/plugins/engine/errors.js.map +1 -0
  129. package/.server/server/plugins/engine/form-availability.d.ts +3 -2
  130. package/.server/server/plugins/engine/form-availability.js +3 -2
  131. package/.server/server/plugins/engine/form-availability.js.map +1 -1
  132. package/.server/server/plugins/engine/form-context.js +2 -2
  133. package/.server/server/plugins/engine/form-context.js.map +1 -1
  134. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  135. package/.server/server/plugins/engine/helpers.js +44 -5
  136. package/.server/server/plugins/engine/helpers.js.map +1 -1
  137. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
  138. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
  139. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  140. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  141. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  142. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  143. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  144. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  145. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  146. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  147. package/.server/server/plugins/engine/i18n/form.js +35 -0
  148. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  149. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  150. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  151. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  152. package/.server/server/plugins/engine/i18n/translations/cy.json +192 -9
  153. package/.server/server/plugins/engine/i18n/translations/en-GB.json +125 -7
  154. package/.server/server/plugins/engine/i18n/types.d.ts +3 -0
  155. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  156. package/.server/server/plugins/engine/index.d.ts +4 -0
  157. package/.server/server/plugins/engine/index.js +4 -0
  158. package/.server/server/plugins/engine/index.js.map +1 -1
  159. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  160. package/.server/server/plugins/engine/models/FormModel.js +35 -23
  161. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  162. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  163. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  164. package/.server/server/plugins/engine/models/types.d.ts +28 -1
  165. package/.server/server/plugins/engine/models/types.js.map +1 -1
  166. package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
  167. package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
  168. package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
  169. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
  170. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  171. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  172. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  173. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  174. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  175. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  176. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  177. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  178. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  179. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  180. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  181. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  182. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  183. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  184. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  185. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  186. package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
  187. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
  188. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
  189. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
  190. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  191. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
  192. package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
  193. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  194. package/.server/server/plugins/engine/types/enums.d.ts +3 -3
  195. package/.server/server/plugins/engine/types/enums.js +5 -4
  196. package/.server/server/plugins/engine/types/enums.js.map +1 -1
  197. package/.server/server/plugins/engine/types/schema.js +10 -3
  198. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  199. package/.server/server/plugins/engine/types.d.ts +18 -2
  200. package/.server/server/plugins/engine/types.js.map +1 -1
  201. package/.server/server/plugins/engine/unavailable-response.js +5 -2
  202. package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
  203. package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
  204. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  205. package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
  206. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  207. package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
  208. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  209. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  210. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  211. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  212. package/.server/server/plugins/engine/views/unavailable.html +14 -11
  213. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  214. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  215. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  216. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  217. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  218. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  219. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  220. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  221. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  222. package/.server/server/plugins/payment/helper.d.ts +11 -1
  223. package/.server/server/plugins/payment/helper.js +18 -2
  224. package/.server/server/plugins/payment/helper.js.map +1 -1
  225. package/.server/server/plugins/payment/helper.test.js +2 -1
  226. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  227. package/.server/server/plugins/payment/service.d.ts +2 -1
  228. package/.server/server/plugins/payment/service.js +5 -2
  229. package/.server/server/plugins/payment/service.js.map +1 -1
  230. package/.server/server/plugins/payment/service.test.js +7 -3
  231. package/.server/server/plugins/payment/service.test.js.map +1 -1
  232. package/.server/server/plugins/payment/types.d.ts +4 -0
  233. package/.server/server/plugins/payment/types.js +1 -0
  234. package/.server/server/plugins/payment/types.js.map +1 -1
  235. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  236. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  237. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  238. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  239. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  240. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  241. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  242. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  243. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  244. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  245. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  246. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  247. package/.server/server/utils/type-utils.d.ts +1 -2
  248. package/.server/server/utils/type-utils.js +0 -3
  249. package/.server/server/utils/type-utils.js.map +1 -1
  250. package/.server/server/utils/utils.d.ts +6 -0
  251. package/.server/server/utils/utils.js +18 -1
  252. package/.server/server/utils/utils.js.map +1 -1
  253. package/.server/server/utils/utils.test.js +21 -1
  254. package/.server/server/utils/utils.test.js.map +1 -1
  255. package/package.json +20 -5
  256. package/src/client/javascripts/file-upload.js +11 -3
  257. package/src/client/javascripts/geospatial-map.js +176 -81
  258. package/src/client/javascripts/govuk.js +2 -0
  259. package/src/client/javascripts/location-map.js +60 -4
  260. package/src/client/javascripts/map-constants.js +3 -0
  261. package/src/client/javascripts/map.js +47 -0
  262. package/src/client/javascripts/maps.js +5 -0
  263. package/src/client/javascripts/shared.js +1 -4
  264. package/src/client/javascripts/sssi-dataset.js +39 -41
  265. package/src/client/stylesheets/maps.scss +4 -0
  266. package/src/client/stylesheets/shared.scss +1 -5
  267. package/src/server/constants.js +2 -0
  268. package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
  269. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  270. package/src/server/plugins/engine/components/CheckboxesField.ts +38 -5
  271. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  272. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  273. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  274. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  275. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  276. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  277. package/src/server/plugins/engine/components/FileUploadField.ts +44 -3
  278. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  279. package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
  280. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  281. package/src/server/plugins/engine/components/LocationFieldBase.ts +30 -7
  282. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
  283. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  284. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  285. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  286. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  287. package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
  288. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  289. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  290. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  291. package/src/server/plugins/engine/components/helpers/components.ts +3 -3
  292. package/src/server/plugins/engine/components/helpers/geospatial.ts +84 -21
  293. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  294. package/src/server/plugins/engine/components/types.ts +1 -0
  295. package/src/server/plugins/engine/errors.ts +78 -0
  296. package/src/server/plugins/engine/form-availability.ts +8 -2
  297. package/src/server/plugins/engine/form-context.ts +4 -2
  298. package/src/server/plugins/engine/helpers.ts +52 -5
  299. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
  300. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  301. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  302. package/src/server/plugins/engine/i18n/form.ts +54 -0
  303. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  304. package/src/server/plugins/engine/i18n/translations/cy.json +192 -9
  305. package/src/server/plugins/engine/i18n/translations/en-GB.json +125 -7
  306. package/src/server/plugins/engine/i18n/types.ts +3 -0
  307. package/src/server/plugins/engine/index.ts +7 -0
  308. package/src/server/plugins/engine/models/FormModel.ts +46 -23
  309. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  310. package/src/server/plugins/engine/models/types.ts +31 -0
  311. package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
  312. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
  313. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  314. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  315. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  316. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  317. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  318. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  319. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
  320. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
  321. package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
  322. package/src/server/plugins/engine/types/enums.ts +4 -3
  323. package/src/server/plugins/engine/types/schema.ts +17 -4
  324. package/src/server/plugins/engine/types.ts +19 -1
  325. package/src/server/plugins/engine/unavailable-response.ts +6 -2
  326. package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
  327. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  328. package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
  329. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  330. package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
  331. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  332. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  333. package/src/server/plugins/engine/views/file-upload.html +1 -1
  334. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  335. package/src/server/plugins/engine/views/unavailable.html +14 -11
  336. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  337. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  338. package/src/server/plugins/payment/helper.js +22 -2
  339. package/src/server/plugins/payment/service.js +6 -2
  340. package/src/server/plugins/payment/types.js +1 -0
  341. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  342. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  343. package/src/server/plugins/postcode-lookup/types.js +6 -1
  344. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  345. package/src/server/utils/type-utils.ts +1 -11
  346. package/src/server/utils/utils.js +19 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pages.js","names":["ControllerType","controllerNameFromPath","PageControllers","createPage","model","pageDef","controllerName","controller","QuestionPageController","Start","StartPageController","Page","Terminal","TerminalPageController","Summary","SummaryPageController","Status","StatusPageController","FileUpload","FileUploadPageController","Repeat","RepeatPageController","controllers","Ctrl","Error"],"sources":["../../../../../../src/server/plugins/engine/pageControllers/helpers/pages.ts"],"sourcesContent":["import {\n ControllerType,\n controllerNameFromPath,\n type Page\n} from '@defra/forms-model'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport * as PageControllers from '~/src/server/plugins/engine/pageControllers/index.js'\n\nexport type PageControllerClass = InstanceType<PageControllerType>\nexport type PageControllerType =\n (typeof PageControllers)[keyof typeof PageControllers]\n\n/**\n * Creates page instance for each {@link Page} type\n */\nexport function createPage(model: FormModel, pageDef: Page) {\n const controllerName = controllerNameFromPath(pageDef.controller)\n\n if (!pageDef.controller) {\n return new PageControllers.QuestionPageController(model, pageDef)\n }\n\n // Patch legacy controllers\n if (controllerName && pageDef.controller !== controllerName) {\n pageDef.controller = controllerName\n }\n\n let controller: PageControllerClass | undefined\n\n switch (pageDef.controller) {\n case ControllerType.Start:\n controller = new PageControllers.StartPageController(model, pageDef)\n break\n\n case ControllerType.Page:\n controller = new PageControllers.QuestionPageController(model, pageDef)\n break\n\n case ControllerType.Terminal:\n controller = new PageControllers.TerminalPageController(model, pageDef)\n break\n\n case ControllerType.Summary:\n controller = new PageControllers.SummaryPageController(model, pageDef)\n break\n\n case ControllerType.Status:\n controller = new PageControllers.StatusPageController(model, pageDef)\n break\n\n case ControllerType.FileUpload:\n controller = new PageControllers.FileUploadPageController(model, pageDef)\n break\n\n case ControllerType.Repeat:\n controller = new PageControllers.RepeatPageController(model, pageDef)\n break\n }\n\n if (typeof controller === 'undefined') {\n if (model.controllers?.[pageDef.controller]) {\n const Ctrl = model.controllers[pageDef.controller]\n controller = new Ctrl(model, pageDef) as unknown as PageControllerClass // type assertion needed because TS can't verify custom controller structure\n }\n }\n\n if (typeof controller === 'undefined') {\n throw new Error(`Page controller ${pageDef.controller} does not exist`)\n }\n\n return controller\n}\n"],"mappings":"AAAA,SACEA,cAAc,EACdC,sBAAsB,QAEjB,oBAAoB;AAG3B,OAAO,KAAKC,eAAe;AAM3B;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,KAAgB,EAAEC,OAAa,EAAE;EAC1D,MAAMC,cAAc,GAAGL,sBAAsB,CAACI,OAAO,CAACE,UAAU,CAAC;EAEjE,IAAI,CAACF,OAAO,CAACE,UAAU,EAAE;IACvB,OAAO,IAAIL,eAAe,CAACM,sBAAsB,CAACJ,KAAK,EAAEC,OAAO,CAAC;EACnE;;EAEA;EACA,IAAIC,cAAc,IAAID,OAAO,CAACE,UAAU,KAAKD,cAAc,EAAE;IAC3DD,OAAO,CAACE,UAAU,GAAGD,cAAc;EACrC;EAEA,IAAIC,UAA2C;EAE/C,QAAQF,OAAO,CAACE,UAAU;IACxB,KAAKP,cAAc,CAACS,KAAK;MACvBF,UAAU,GAAG,IAAIL,eAAe,CAACQ,mBAAmB,CAACN,KAAK,EAAEC,OAAO,CAAC;MACpE;IAEF,KAAKL,cAAc,CAACW,IAAI;MACtBJ,UAAU,GAAG,IAAIL,eAAe,CAACM,sBAAsB,CAACJ,KAAK,EAAEC,OAAO,CAAC;MACvE;IAEF,KAAKL,cAAc,CAACY,QAAQ;MAC1BL,UAAU,GAAG,IAAIL,eAAe,CAACW,sBAAsB,CAACT,KAAK,EAAEC,OAAO,CAAC;MACvE;IAEF,KAAKL,cAAc,CAACc,OAAO;MACzBP,UAAU,GAAG,IAAIL,eAAe,CAACa,qBAAqB,CAACX,KAAK,EAAEC,OAAO,CAAC;MACtE;IAEF,KAAKL,cAAc,CAACgB,MAAM;MACxBT,UAAU,GAAG,IAAIL,eAAe,CAACe,oBAAoB,CAACb,KAAK,EAAEC,OAAO,CAAC;MACrE;IAEF,KAAKL,cAAc,CAACkB,UAAU;MAC5BX,UAAU,GAAG,IAAIL,eAAe,CAACiB,wBAAwB,CAACf,KAAK,EAAEC,OAAO,CAAC;MACzE;IAEF,KAAKL,cAAc,CAACoB,MAAM;MACxBb,UAAU,GAAG,IAAIL,eAAe,CAACmB,oBAAoB,CAACjB,KAAK,EAAEC,OAAO,CAAC;MACrE;EACJ;EAEA,IAAI,OAAOE,UAAU,KAAK,WAAW,EAAE;IACrC,IAAIH,KAAK,CAACkB,WAAW,GAAGjB,OAAO,CAACE,UAAU,CAAC,EAAE;MAC3C,MAAMgB,IAAI,GAAGnB,KAAK,CAACkB,WAAW,CAACjB,OAAO,CAACE,UAAU,CAAC;MAClDA,UAAU,GAAG,IAAIgB,IAAI,CAACnB,KAAK,EAAEC,OAAO,CAAmC,EAAC;IAC1E;EACF;EAEA,IAAI,OAAOE,UAAU,KAAK,WAAW,EAAE;IACrC,MAAM,IAAIiB,KAAK,CAAC,mBAAmBnB,OAAO,CAACE,UAAU,iBAAiB,CAAC;EACzE;EAEA,OAAOA,UAAU;AACnB","ignoreList":[]}
1
+ {"version":3,"file":"pages.js","names":["ControllerType","controllerNameFromPath","UnknownPageControllerError","PageControllers","createPage","model","pageDef","controllerName","controller","QuestionPageController","Start","StartPageController","Page","Terminal","TerminalPageController","Summary","SummaryPageController","Status","StatusPageController","FileUpload","FileUploadPageController","Repeat","RepeatPageController","controllers","Ctrl"],"sources":["../../../../../../src/server/plugins/engine/pageControllers/helpers/pages.ts"],"sourcesContent":["import {\n ControllerType,\n controllerNameFromPath,\n type Page\n} from '@defra/forms-model'\n\nimport { UnknownPageControllerError } from '~/src/server/plugins/engine/errors.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport * as PageControllers from '~/src/server/plugins/engine/pageControllers/index.js'\n\nexport type PageControllerClass = InstanceType<PageControllerType>\nexport type PageControllerType =\n (typeof PageControllers)[keyof typeof PageControllers]\n\n/**\n * Creates page instance for each {@link Page} type\n */\nexport function createPage(model: FormModel, pageDef: Page) {\n const controllerName = controllerNameFromPath(pageDef.controller)\n\n if (!pageDef.controller) {\n return new PageControllers.QuestionPageController(model, pageDef)\n }\n\n // Patch legacy controllers\n if (controllerName && pageDef.controller !== controllerName) {\n pageDef.controller = controllerName\n }\n\n let controller: PageControllerClass | undefined\n\n switch (pageDef.controller) {\n case ControllerType.Start:\n controller = new PageControllers.StartPageController(model, pageDef)\n break\n\n case ControllerType.Page:\n controller = new PageControllers.QuestionPageController(model, pageDef)\n break\n\n case ControllerType.Terminal:\n controller = new PageControllers.TerminalPageController(model, pageDef)\n break\n\n case ControllerType.Summary:\n controller = new PageControllers.SummaryPageController(model, pageDef)\n break\n\n case ControllerType.Status:\n controller = new PageControllers.StatusPageController(model, pageDef)\n break\n\n case ControllerType.FileUpload:\n controller = new PageControllers.FileUploadPageController(model, pageDef)\n break\n\n case ControllerType.Repeat:\n controller = new PageControllers.RepeatPageController(model, pageDef)\n break\n }\n\n if (typeof controller === 'undefined') {\n if (model.controllers?.[pageDef.controller]) {\n const Ctrl = model.controllers[pageDef.controller]\n controller = new Ctrl(model, pageDef) as unknown as PageControllerClass // type assertion needed because TS can't verify custom controller structure\n }\n }\n\n if (typeof controller === 'undefined') {\n throw new UnknownPageControllerError(pageDef.controller)\n }\n\n return controller\n}\n"],"mappings":"AAAA,SACEA,cAAc,EACdC,sBAAsB,QAEjB,oBAAoB;AAE3B,SAASC,0BAA0B;AAEnC,OAAO,KAAKC,eAAe;AAM3B;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,KAAgB,EAAEC,OAAa,EAAE;EAC1D,MAAMC,cAAc,GAAGN,sBAAsB,CAACK,OAAO,CAACE,UAAU,CAAC;EAEjE,IAAI,CAACF,OAAO,CAACE,UAAU,EAAE;IACvB,OAAO,IAAIL,eAAe,CAACM,sBAAsB,CAACJ,KAAK,EAAEC,OAAO,CAAC;EACnE;;EAEA;EACA,IAAIC,cAAc,IAAID,OAAO,CAACE,UAAU,KAAKD,cAAc,EAAE;IAC3DD,OAAO,CAACE,UAAU,GAAGD,cAAc;EACrC;EAEA,IAAIC,UAA2C;EAE/C,QAAQF,OAAO,CAACE,UAAU;IACxB,KAAKR,cAAc,CAACU,KAAK;MACvBF,UAAU,GAAG,IAAIL,eAAe,CAACQ,mBAAmB,CAACN,KAAK,EAAEC,OAAO,CAAC;MACpE;IAEF,KAAKN,cAAc,CAACY,IAAI;MACtBJ,UAAU,GAAG,IAAIL,eAAe,CAACM,sBAAsB,CAACJ,KAAK,EAAEC,OAAO,CAAC;MACvE;IAEF,KAAKN,cAAc,CAACa,QAAQ;MAC1BL,UAAU,GAAG,IAAIL,eAAe,CAACW,sBAAsB,CAACT,KAAK,EAAEC,OAAO,CAAC;MACvE;IAEF,KAAKN,cAAc,CAACe,OAAO;MACzBP,UAAU,GAAG,IAAIL,eAAe,CAACa,qBAAqB,CAACX,KAAK,EAAEC,OAAO,CAAC;MACtE;IAEF,KAAKN,cAAc,CAACiB,MAAM;MACxBT,UAAU,GAAG,IAAIL,eAAe,CAACe,oBAAoB,CAACb,KAAK,EAAEC,OAAO,CAAC;MACrE;IAEF,KAAKN,cAAc,CAACmB,UAAU;MAC5BX,UAAU,GAAG,IAAIL,eAAe,CAACiB,wBAAwB,CAACf,KAAK,EAAEC,OAAO,CAAC;MACzE;IAEF,KAAKN,cAAc,CAACqB,MAAM;MACxBb,UAAU,GAAG,IAAIL,eAAe,CAACmB,oBAAoB,CAACjB,KAAK,EAAEC,OAAO,CAAC;MACrE;EACJ;EAEA,IAAI,OAAOE,UAAU,KAAK,WAAW,EAAE;IACrC,IAAIH,KAAK,CAACkB,WAAW,GAAGjB,OAAO,CAACE,UAAU,CAAC,EAAE;MAC3C,MAAMgB,IAAI,GAAGnB,KAAK,CAACkB,WAAW,CAACjB,OAAO,CAACE,UAAU,CAAC;MAClDA,UAAU,GAAG,IAAIgB,IAAI,CAACnB,KAAK,EAAEC,OAAO,CAAmC,EAAC;IAC1E;EACF;EAEA,IAAI,OAAOE,UAAU,KAAK,WAAW,EAAE;IACrC,MAAM,IAAIN,0BAA0B,CAACI,OAAO,CAACE,UAAU,CAAC;EAC1D;EAEA,OAAOA,UAAU;AACnB","ignoreList":[]}
@@ -1,6 +1,8 @@
1
- import { type SubmitPayload } from '@defra/forms-model';
1
+ import { type SubmitConditionEvaluation, type SubmitPayload } from '@defra/forms-model';
2
2
  import { type Translator } from '../../../../../server/plugins/engine/i18n/types.js';
3
+ import { type FormModel } from '../../../../../server/plugins/engine/models/FormModel.js';
3
4
  import { type DetailItem, type DetailItemField } from '../../../../../server/plugins/engine/models/types.js';
5
+ import { type FormContext, type FormStateValue } from '../../../../../server/plugins/engine/types.js';
4
6
  export interface SubmitRecord {
5
7
  name: string;
6
8
  title: string;
@@ -21,8 +23,39 @@ export declare function buildMainRecords(items: DetailItem[], translator: Transl
21
23
  *
22
24
  * Returns an empty array if no payment state exists.
23
25
  */
24
- export declare function buildPaymentRecords(item: DetailItemField): SubmitRecord[];
26
+ export declare function buildPaymentRecords(item: DetailItemField, translator: Translator): SubmitRecord[];
25
27
  /**
26
28
  * Builds the repeater submission records from repeater items.
27
29
  */
28
30
  export declare function buildRepeaterRecords(items: DetailItem[], translator: Translator): SubmitPayload['repeaters'];
31
+ /**
32
+ * Records the outcome of every condition in the form definition, evaluated
33
+ * against the answers as they stand at the point of submission.
34
+ *
35
+ * Evaluated here rather than by the consumer because only the engine holds
36
+ * the context to evaluate against: `evaluationState` is built by walking the
37
+ * form from its start page along the path taken, applying page conditions as
38
+ * it goes. A consumer receives the flat submitted answers, not that walked
39
+ * state, and reproducing the walk in a second codebase would leave two
40
+ * implementations of the same logic free to diverge.
41
+ *
42
+ * Each record carries the components the condition depends on and whether each
43
+ * was answered. An unanswered question still yields a boolean - negative
44
+ * operators such as "is not" return `true` against the seeded `null` - so the
45
+ * outcome alone cannot be read as evidence that the user gave that answer.
46
+ *
47
+ * V2 definitions only. `conditionId` is the V2 condition id, and the
48
+ * references are resolved from the component ids V2 conditions carry - V1
49
+ * conditions reference components by name, and V1 components need not have
50
+ * an id at all.
51
+ */
52
+ export declare function buildConditionEvaluations(model: FormModel, context: FormContext): SubmitConditionEvaluation[];
53
+ /**
54
+ * Whether a component held an answer at the point a condition was evaluated.
55
+ *
56
+ * The engine seeds every component in `evaluationState` with `null` before the
57
+ * page walk begins, so an unanswered question is present but empty rather than
58
+ * absent.
59
+ * @see {@link FormModel.initialiseContext}
60
+ */
61
+ export declare function isAnswered(value: FormStateValue | undefined): boolean;
@@ -1,3 +1,4 @@
1
+ import { isConditionWrapperV2 } from '@defra/forms-model';
1
2
  import { GeospatialField } from "../../components/GeospatialField.js";
2
3
  import { PaymentField } from "../../components/PaymentField.js";
3
4
  import { getAnswer } from "../../components/helpers/components.js";
@@ -12,7 +13,7 @@ export function buildMainRecords(items, translator) {
12
13
  const records = [];
13
14
  for (const item of fieldItems) {
14
15
  if (item.field instanceof PaymentField) {
15
- records.push(...buildPaymentRecords(item));
16
+ records.push(...buildPaymentRecords(item, translator));
16
17
  } else if (item.field instanceof GeospatialField) {
17
18
  // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`
18
19
  // so we don't incur the overhead of JSON.stringify on every request when building context
@@ -44,7 +45,7 @@ export function buildMainRecords(items, translator) {
44
45
  *
45
46
  * Returns an empty array if no payment state exists.
46
47
  */
47
- export function buildPaymentRecords(item) {
48
+ export function buildPaymentRecords(item, translator) {
48
49
  const paymentState = item.field.getPaymentStateFromState(item.state);
49
50
  if (!paymentState) {
50
51
  return [];
@@ -64,7 +65,7 @@ export function buildPaymentRecords(item) {
64
65
  }, {
65
66
  name: `${item.name}_paymentDate`,
66
67
  title: 'Payment date',
67
- value: paymentState.preAuth?.createdAt ? formatPaymentDate(paymentState.preAuth.createdAt) : ''
68
+ value: paymentState.preAuth?.createdAt ? formatPaymentDate(paymentState.preAuth.createdAt, translator.language) : ''
68
69
  }];
69
70
  }
70
71
 
@@ -95,4 +96,100 @@ export function buildRepeaterRecords(items, translator) {
95
96
  }))
96
97
  }));
97
98
  }
99
+
100
+ /**
101
+ * Records the outcome of every condition in the form definition, evaluated
102
+ * against the answers as they stand at the point of submission.
103
+ *
104
+ * Evaluated here rather than by the consumer because only the engine holds
105
+ * the context to evaluate against: `evaluationState` is built by walking the
106
+ * form from its start page along the path taken, applying page conditions as
107
+ * it goes. A consumer receives the flat submitted answers, not that walked
108
+ * state, and reproducing the walk in a second codebase would leave two
109
+ * implementations of the same logic free to diverge.
110
+ *
111
+ * Each record carries the components the condition depends on and whether each
112
+ * was answered. An unanswered question still yields a boolean - negative
113
+ * operators such as "is not" return `true` against the seeded `null` - so the
114
+ * outcome alone cannot be read as evidence that the user gave that answer.
115
+ *
116
+ * V2 definitions only. `conditionId` is the V2 condition id, and the
117
+ * references are resolved from the component ids V2 conditions carry - V1
118
+ * conditions reference components by name, and V1 components need not have
119
+ * an id at all.
120
+ */
121
+ export function buildConditionEvaluations(model, context) {
122
+ const {
123
+ evaluationState
124
+ } = context;
125
+ return model.def.conditions.filter(isConditionWrapperV2).flatMap(conditionDef => {
126
+ const condition = model.conditions[conditionDef.id];
127
+ if (!condition) {
128
+ return [];
129
+ }
130
+ const {
131
+ outcome
132
+ } = condition.evaluate(evaluationState);
133
+ const references = collectReferences(model, conditionDef, evaluationState);
134
+ return {
135
+ conditionId: conditionDef.id,
136
+ outcome,
137
+ references: [...references.values()]
138
+ };
139
+ });
140
+ }
141
+
142
+ /**
143
+ * Whether a component held an answer at the point a condition was evaluated.
144
+ *
145
+ * The engine seeds every component in `evaluationState` with `null` before the
146
+ * page walk begins, so an unanswered question is present but empty rather than
147
+ * absent.
148
+ * @see {@link FormModel.initialiseContext}
149
+ */
150
+ export function isAnswered(value) {
151
+ if (value === undefined || value === null) {
152
+ return false;
153
+ }
154
+ if (Array.isArray(value)) {
155
+ return value.length > 0;
156
+ }
157
+ return value !== '';
158
+ }
159
+ function isConditionDataV2(item) {
160
+ return 'componentId' in item;
161
+ }
162
+
163
+ /**
164
+ * Recursive function that collects every component a condition depends on, following nested condition
165
+ * references. Results are keyed by component id so a component referenced more
166
+ * than once is reported once.
167
+ */
168
+ function collectReferences(model, conditionDef, evaluationState, references = new Map(), visited = new Set()) {
169
+ if (visited.has(conditionDef.id)) {
170
+ return references;
171
+ }
172
+ visited.add(conditionDef.id);
173
+ for (const item of conditionDef.items) {
174
+ if (isConditionDataV2(item)) {
175
+ const component = model.getComponentById(item.componentId);
176
+
177
+ // A condition referencing a component that no longer exists cannot be
178
+ // resolved to a name, so there is nothing meaningful to report for it
179
+ if (component) {
180
+ references.set(item.componentId, {
181
+ componentId: item.componentId,
182
+ componentName: component.name,
183
+ answered: isAnswered(evaluationState[component.name])
184
+ });
185
+ }
186
+ continue;
187
+ }
188
+ const referenced = model.getConditionById(item.conditionId);
189
+ if (referenced) {
190
+ collectReferences(model, referenced, evaluationState, references, visited);
191
+ }
192
+ }
193
+ return references;
194
+ }
98
195
  //# sourceMappingURL=submission.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"submission.js","names":["GeospatialField","PaymentField","getAnswer","formatCurrency","formatPaymentDate","buildMainRecords","items","translator","fieldItems","filter","item","records","field","push","buildPaymentRecords","value","getFormValueFromState","state","name","title","label","undefined","JSON","stringify","format","paymentState","getPaymentStateFromState","description","amount","reference","preAuth","createdAt","buildRepeaterRecords","map","subItems","detailItems","subItem","formValue"],"sources":["../../../../../../src/server/plugins/engine/pageControllers/helpers/submission.ts"],"sourcesContent":["import { type SubmitPayload } from '@defra/forms-model'\n\nimport { GeospatialField } from '~/src/server/plugins/engine/components/GeospatialField.js'\nimport { PaymentField } from '~/src/server/plugins/engine/components/PaymentField.js'\nimport { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport {\n type DetailItem,\n type DetailItemField\n} from '~/src/server/plugins/engine/models/types.js'\nimport {\n formatCurrency,\n formatPaymentDate\n} from '~/src/server/plugins/payment/helper.js'\n\nexport interface SubmitRecord {\n name: string\n title: string\n value: string\n}\n\n/**\n * Builds the main submission records from field items.\n * Regular fields are converted to single records, while PaymentField\n * components are expanded into four separate records.\n */\nexport function buildMainRecords(\n items: DetailItem[],\n translator: Translator\n): SubmitRecord[] {\n const fieldItems = items.filter(\n (item): item is DetailItemField => 'field' in item\n )\n\n const records: SubmitRecord[] = []\n\n for (const item of fieldItems) {\n if (item.field instanceof PaymentField) {\n records.push(...buildPaymentRecords(item))\n } else if (item.field instanceof GeospatialField) {\n // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`\n // so we don't incur the overhead of JSON.stringify on every request when building context\n const value = item.field.getFormValueFromState(item.state)\n records.push({\n name: item.name,\n title: item.label,\n value: value === undefined ? '' : JSON.stringify(value)\n })\n } else {\n records.push({\n name: item.name,\n title: item.label,\n value: getAnswer(item.field, item.state, translator, { format: 'data' })\n })\n }\n }\n\n return records\n}\n\n/**\n * Expands a PaymentField into four submission records:\n * - Payment description\n * - Payment amount (formatted with currency symbol)\n * - Payment reference\n * - Payment date (formatted date/time)\n *\n * Returns an empty array if no payment state exists.\n */\nexport function buildPaymentRecords(item: DetailItemField): SubmitRecord[] {\n const paymentState = (item.field as PaymentField).getPaymentStateFromState(\n item.state\n )\n\n if (!paymentState) {\n return []\n }\n\n return [\n {\n name: `${item.name}_paymentDescription`,\n title: 'Payment description',\n value: paymentState.description\n },\n {\n name: `${item.name}_paymentAmount`,\n title: 'Payment amount',\n value: formatCurrency(paymentState.amount)\n },\n {\n name: `${item.name}_paymentReference`,\n title: 'Payment reference',\n value: paymentState.reference\n },\n {\n name: `${item.name}_paymentDate`,\n title: 'Payment date',\n value: paymentState.preAuth?.createdAt\n ? formatPaymentDate(paymentState.preAuth.createdAt)\n : ''\n }\n ]\n}\n\n/**\n * Builds the repeater submission records from repeater items.\n */\nexport function buildRepeaterRecords(\n items: DetailItem[],\n translator: Translator\n): SubmitPayload['repeaters'] {\n return items\n .filter((item) => 'subItems' in item)\n .map((item) => ({\n name: item.name,\n title: item.label,\n value: item.subItems.map((detailItems) =>\n detailItems.map((subItem) => {\n let value\n\n if (subItem.field instanceof GeospatialField) {\n // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`\n // so we don't incur the overhead of JSON.stringify on every request when building context\n const formValue = subItem.field.getFormValueFromState(subItem.state)\n value = formValue === undefined ? '' : JSON.stringify(formValue)\n } else {\n value = getAnswer(subItem.field, subItem.state, translator, {\n format: 'data'\n })\n }\n\n return {\n name: subItem.name,\n title: subItem.label,\n value\n }\n })\n )\n }))\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"submission.js","names":["isConditionWrapperV2","GeospatialField","PaymentField","getAnswer","formatCurrency","formatPaymentDate","buildMainRecords","items","translator","fieldItems","filter","item","records","field","push","buildPaymentRecords","value","getFormValueFromState","state","name","title","label","undefined","JSON","stringify","format","paymentState","getPaymentStateFromState","description","amount","reference","preAuth","createdAt","language","buildRepeaterRecords","map","subItems","detailItems","subItem","formValue","buildConditionEvaluations","model","context","evaluationState","def","conditions","flatMap","conditionDef","condition","id","outcome","evaluate","references","collectReferences","conditionId","values","isAnswered","Array","isArray","length","isConditionDataV2","Map","visited","Set","has","add","component","getComponentById","componentId","set","componentName","answered","referenced","getConditionById"],"sources":["../../../../../../src/server/plugins/engine/pageControllers/helpers/submission.ts"],"sourcesContent":["import {\n isConditionWrapperV2,\n type ConditionDataV2,\n type ConditionRefDataV2,\n type ConditionWrapperV2,\n type SubmitConditionEvaluation,\n type SubmitConditionReference,\n type SubmitPayload\n} from '@defra/forms-model'\n\nimport { GeospatialField } from '~/src/server/plugins/engine/components/GeospatialField.js'\nimport { PaymentField } from '~/src/server/plugins/engine/components/PaymentField.js'\nimport { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport {\n type DetailItem,\n type DetailItemField\n} from '~/src/server/plugins/engine/models/types.js'\nimport {\n type FormContext,\n type FormState,\n type FormStateValue\n} from '~/src/server/plugins/engine/types.js'\nimport {\n formatCurrency,\n formatPaymentDate\n} from '~/src/server/plugins/payment/helper.js'\n\nexport interface SubmitRecord {\n name: string\n title: string\n value: string\n}\n\n/**\n * Builds the main submission records from field items.\n * Regular fields are converted to single records, while PaymentField\n * components are expanded into four separate records.\n */\nexport function buildMainRecords(\n items: DetailItem[],\n translator: Translator\n): SubmitRecord[] {\n const fieldItems = items.filter(\n (item): item is DetailItemField => 'field' in item\n )\n\n const records: SubmitRecord[] = []\n\n for (const item of fieldItems) {\n if (item.field instanceof PaymentField) {\n records.push(...buildPaymentRecords(item, translator))\n } else if (item.field instanceof GeospatialField) {\n // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`\n // so we don't incur the overhead of JSON.stringify on every request when building context\n const value = item.field.getFormValueFromState(item.state)\n records.push({\n name: item.name,\n title: item.label,\n value: value === undefined ? '' : JSON.stringify(value)\n })\n } else {\n records.push({\n name: item.name,\n title: item.label,\n value: getAnswer(item.field, item.state, translator, { format: 'data' })\n })\n }\n }\n\n return records\n}\n\n/**\n * Expands a PaymentField into four submission records:\n * - Payment description\n * - Payment amount (formatted with currency symbol)\n * - Payment reference\n * - Payment date (formatted date/time)\n *\n * Returns an empty array if no payment state exists.\n */\nexport function buildPaymentRecords(\n item: DetailItemField,\n translator: Translator\n): SubmitRecord[] {\n const paymentState = (item.field as PaymentField).getPaymentStateFromState(\n item.state\n )\n\n if (!paymentState) {\n return []\n }\n\n return [\n {\n name: `${item.name}_paymentDescription`,\n title: 'Payment description',\n value: paymentState.description\n },\n {\n name: `${item.name}_paymentAmount`,\n title: 'Payment amount',\n value: formatCurrency(paymentState.amount)\n },\n {\n name: `${item.name}_paymentReference`,\n title: 'Payment reference',\n value: paymentState.reference\n },\n {\n name: `${item.name}_paymentDate`,\n title: 'Payment date',\n value: paymentState.preAuth?.createdAt\n ? formatPaymentDate(paymentState.preAuth.createdAt, translator.language)\n : ''\n }\n ]\n}\n\n/**\n * Builds the repeater submission records from repeater items.\n */\nexport function buildRepeaterRecords(\n items: DetailItem[],\n translator: Translator\n): SubmitPayload['repeaters'] {\n return items\n .filter((item) => 'subItems' in item)\n .map((item) => ({\n name: item.name,\n title: item.label,\n value: item.subItems.map((detailItems) =>\n detailItems.map((subItem) => {\n let value\n\n if (subItem.field instanceof GeospatialField) {\n // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`\n // so we don't incur the overhead of JSON.stringify on every request when building context\n const formValue = subItem.field.getFormValueFromState(subItem.state)\n value = formValue === undefined ? '' : JSON.stringify(formValue)\n } else {\n value = getAnswer(subItem.field, subItem.state, translator, {\n format: 'data'\n })\n }\n\n return {\n name: subItem.name,\n title: subItem.label,\n value\n }\n })\n )\n }))\n}\n\n/**\n * Records the outcome of every condition in the form definition, evaluated\n * against the answers as they stand at the point of submission.\n *\n * Evaluated here rather than by the consumer because only the engine holds\n * the context to evaluate against: `evaluationState` is built by walking the\n * form from its start page along the path taken, applying page conditions as\n * it goes. A consumer receives the flat submitted answers, not that walked\n * state, and reproducing the walk in a second codebase would leave two\n * implementations of the same logic free to diverge.\n *\n * Each record carries the components the condition depends on and whether each\n * was answered. An unanswered question still yields a boolean - negative\n * operators such as \"is not\" return `true` against the seeded `null` - so the\n * outcome alone cannot be read as evidence that the user gave that answer.\n *\n * V2 definitions only. `conditionId` is the V2 condition id, and the\n * references are resolved from the component ids V2 conditions carry - V1\n * conditions reference components by name, and V1 components need not have\n * an id at all.\n */\nexport function buildConditionEvaluations(\n model: FormModel,\n context: FormContext\n): SubmitConditionEvaluation[] {\n const { evaluationState } = context\n\n return model.def.conditions\n .filter(isConditionWrapperV2)\n .flatMap((conditionDef) => {\n const condition = model.conditions[conditionDef.id]\n\n if (!condition) {\n return []\n }\n\n const { outcome } = condition.evaluate(evaluationState)\n\n const references = collectReferences(model, conditionDef, evaluationState)\n\n return {\n conditionId: conditionDef.id,\n outcome,\n references: [...references.values()]\n }\n })\n}\n\n/**\n * Whether a component held an answer at the point a condition was evaluated.\n *\n * The engine seeds every component in `evaluationState` with `null` before the\n * page walk begins, so an unanswered question is present but empty rather than\n * absent.\n * @see {@link FormModel.initialiseContext}\n */\nexport function isAnswered(value: FormStateValue | undefined) {\n if (value === undefined || value === null) {\n return false\n }\n\n if (Array.isArray(value)) {\n return value.length > 0\n }\n\n return value !== ''\n}\n\nfunction isConditionDataV2(\n item: ConditionDataV2 | ConditionRefDataV2\n): item is ConditionDataV2 {\n return 'componentId' in item\n}\n\n/**\n * Recursive function that collects every component a condition depends on, following nested condition\n * references. Results are keyed by component id so a component referenced more\n * than once is reported once.\n */\nfunction collectReferences(\n model: FormModel,\n conditionDef: ConditionWrapperV2,\n evaluationState: FormState,\n references: Map<string, SubmitConditionReference> = new Map<\n string,\n SubmitConditionReference\n >(),\n visited: Set<string> = new Set<string>()\n) {\n if (visited.has(conditionDef.id)) {\n return references\n }\n\n visited.add(conditionDef.id)\n\n for (const item of conditionDef.items) {\n if (isConditionDataV2(item)) {\n const component = model.getComponentById(item.componentId)\n\n // A condition referencing a component that no longer exists cannot be\n // resolved to a name, so there is nothing meaningful to report for it\n if (component) {\n references.set(item.componentId, {\n componentId: item.componentId,\n componentName: component.name,\n answered: isAnswered(evaluationState[component.name])\n })\n }\n\n continue\n }\n\n const referenced = model.getConditionById(item.conditionId)\n\n if (referenced) {\n collectReferences(model, referenced, evaluationState, references, visited)\n }\n }\n\n return references\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,5 +9,5 @@ export declare const opts: ReferenceOptions;
9
9
  export declare const messageTemplate: ValidationMessages;
10
10
  export declare const messages: LanguageMessagesExt;
11
11
  export declare const messagesPre: LanguageMessages;
12
- export declare function buildLanguageMessages(t: (key: string) => string): LanguageMessages;
12
+ export declare function buildLanguageMessages(t: (key: string, options?: Record<string, unknown>) => string): LanguageMessages;
13
13
  export declare const validationOptions: ValidationOptions;
@@ -14,7 +14,7 @@ export const opts = {
14
14
  * Components that have not yet been migrated to use model.validationMessages still
15
15
  * import messageTemplate directly and get the English version.
16
16
  */
17
- export const messageTemplate = buildValidationMessages(key => t(key, 'en-GB'));
17
+ export const messageTemplate = buildValidationMessages((key, options) => t(key, 'en-GB', options));
18
18
  export const messages = {
19
19
  'string.base': messageTemplate.required,
20
20
  'string.min': messageTemplate.min,
@@ -39,7 +39,17 @@ export const messages = {
39
39
  'date.format': messageTemplate.dateFormat,
40
40
  'date.min': messageTemplate.dateMin,
41
41
  'date.max': messageTemplate.dateMax,
42
- 'object.invalidjson': messageTemplate.format
42
+ 'array.min': messageTemplate.arrayMin,
43
+ 'array.max': messageTemplate.arrayMax,
44
+ 'array.length': messageTemplate.arrayLength,
45
+ 'features.min': messageTemplate.featuresMin,
46
+ 'features.max': messageTemplate.featuresMax,
47
+ 'features.length': messageTemplate.featuresLength,
48
+ 'files.min': messageTemplate.filesMin,
49
+ 'files.max': messageTemplate.filesMax,
50
+ 'filees.length': messageTemplate.filesLength,
51
+ 'object.invalidjson': messageTemplate.format,
52
+ 'phoneNumber.invalid': messageTemplate.format
43
53
  };
44
54
  export const messagesPre = messages;
45
55
  export function buildLanguageMessages(t) {
@@ -52,6 +62,7 @@ export function buildLanguageMessages(t) {
52
62
  'string.email': vm.format,
53
63
  'string.pattern.base': vm.pattern,
54
64
  'string.maxWords': vm.maxWords,
65
+ 'string.unicode': vm.unicode,
55
66
  'number.base': vm.number,
56
67
  'number.precision': vm.numberPrecision,
57
68
  'number.integer': vm.numberInteger,
@@ -67,7 +78,17 @@ export function buildLanguageMessages(t) {
67
78
  'date.format': vm.dateFormat,
68
79
  'date.min': vm.dateMin,
69
80
  'date.max': vm.dateMax,
70
- 'object.invalidjson': vm.format
81
+ 'array.min': vm.arrayMin,
82
+ 'array.max': vm.arrayMax,
83
+ 'array.length': vm.arrayLength,
84
+ 'features.min': vm.featuresMin,
85
+ 'features.max': vm.featuresMax,
86
+ 'features.length': vm.featuresLength,
87
+ 'files.min': vm.filesMin,
88
+ 'files.max': vm.filesMax,
89
+ 'files.length': vm.filesLength,
90
+ 'object.invalidjson': vm.format,
91
+ 'phoneNumber.invalid': vm.format
71
92
  };
72
93
  }
73
94
  export const validationOptions = {
@@ -1 +1 @@
1
- {"version":3,"file":"validationOptions.js","names":["lowerFirstPreserveProperNouns","buildValidationMessages","t","opts","functions","lowerFirst","messageTemplate","key","messages","required","min","max","format","unicode","pattern","maxWords","number","numberPrecision","numberInteger","numberMin","numberMax","objectRequired","objectMissing","selectRequired","dateFormat","dateMin","dateMax","messagesPre","buildLanguageMessages","vm","validationOptions","abortEarly","errors","wrap","array","label"],"sources":["../../../../../src/server/plugins/engine/pageControllers/validationOptions.ts"],"sourcesContent":["// Declaration above is needed for: https://github.com/hapijs/joi/issues/3064\n\nimport {\n type LanguageMessages,\n type LanguageMessagesExt,\n type ReferenceOptions,\n type ValidationOptions\n} from 'joi'\n\nimport { lowerFirstPreserveProperNouns } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n buildValidationMessages,\n type ValidationMessages\n} from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\n\nexport const opts = {\n functions: {\n lowerFirst: lowerFirstPreserveProperNouns\n }\n} as ReferenceOptions\n\n/**\n * Module-level English message templates — built via the same factory used per-form.\n * Components that have not yet been migrated to use model.validationMessages still\n * import messageTemplate directly and get the English version.\n */\nexport const messageTemplate: ValidationMessages = buildValidationMessages(\n (key) => t(key, 'en-GB')\n)\n\nexport const messages: LanguageMessagesExt = {\n 'string.base': messageTemplate.required,\n 'string.min': messageTemplate.min,\n 'string.empty': messageTemplate.required,\n 'string.max': messageTemplate.max,\n 'string.email': messageTemplate.format,\n 'string.unicode': messageTemplate.unicode,\n 'string.pattern.base': messageTemplate.pattern,\n 'string.maxWords': messageTemplate.maxWords,\n\n 'number.base': messageTemplate.number,\n 'number.precision': messageTemplate.numberPrecision,\n 'number.integer': messageTemplate.numberInteger,\n 'number.unsafe': messageTemplate.format,\n 'number.min': messageTemplate.numberMin,\n 'number.max': messageTemplate.numberMax,\n\n 'object.required': messageTemplate.objectRequired,\n 'object.and': messageTemplate.objectMissing,\n\n 'any.only': messageTemplate.selectRequired,\n 'any.required': messageTemplate.selectRequired,\n 'any.empty': messageTemplate.required,\n\n 'date.base': messageTemplate.dateFormat,\n 'date.format': messageTemplate.dateFormat,\n 'date.min': messageTemplate.dateMin,\n 'date.max': messageTemplate.dateMax,\n\n 'object.invalidjson': messageTemplate.format\n}\n\nexport const messagesPre: LanguageMessages =\n messages as unknown as LanguageMessages\n\nexport function buildLanguageMessages(\n t: (key: string) => string\n): LanguageMessages {\n const vm = buildValidationMessages(t)\n return {\n 'string.base': vm.required,\n 'string.min': vm.min,\n 'string.empty': vm.required,\n 'string.max': vm.max,\n 'string.email': vm.format,\n 'string.pattern.base': vm.pattern,\n 'string.maxWords': vm.maxWords,\n 'number.base': vm.number,\n 'number.precision': vm.numberPrecision,\n 'number.integer': vm.numberInteger,\n 'number.unsafe': vm.format,\n 'number.min': vm.numberMin,\n 'number.max': vm.numberMax,\n 'object.required': vm.objectRequired,\n 'object.and': vm.objectMissing,\n 'any.only': vm.selectRequired,\n 'any.required': vm.selectRequired,\n 'any.empty': vm.required,\n 'date.base': vm.dateFormat,\n 'date.format': vm.dateFormat,\n 'date.min': vm.dateMin,\n 'date.max': vm.dateMax,\n 'object.invalidjson': vm.format\n } as unknown as LanguageMessages\n}\n\nexport const validationOptions: ValidationOptions = {\n abortEarly: false,\n messages: messagesPre,\n errors: {\n wrap: {\n array: false,\n label: false\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"validationOptions.js","names":["lowerFirstPreserveProperNouns","buildValidationMessages","t","opts","functions","lowerFirst","messageTemplate","key","options","messages","required","min","max","format","unicode","pattern","maxWords","number","numberPrecision","numberInteger","numberMin","numberMax","objectRequired","objectMissing","selectRequired","dateFormat","dateMin","dateMax","arrayMin","arrayMax","arrayLength","featuresMin","featuresMax","featuresLength","filesMin","filesMax","filesLength","messagesPre","buildLanguageMessages","vm","validationOptions","abortEarly","errors","wrap","array","label"],"sources":["../../../../../src/server/plugins/engine/pageControllers/validationOptions.ts"],"sourcesContent":["// Declaration above is needed for: https://github.com/hapijs/joi/issues/3064\n\nimport {\n type LanguageMessages,\n type LanguageMessagesExt,\n type ReferenceOptions,\n type ValidationOptions\n} from 'joi'\n\nimport { lowerFirstPreserveProperNouns } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n buildValidationMessages,\n type ValidationMessages\n} from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\n\nexport const opts = {\n functions: {\n lowerFirst: lowerFirstPreserveProperNouns\n }\n} as ReferenceOptions\n\n/**\n * Module-level English message templates — built via the same factory used per-form.\n * Components that have not yet been migrated to use model.validationMessages still\n * import messageTemplate directly and get the English version.\n */\nexport const messageTemplate: ValidationMessages = buildValidationMessages(\n (key, options) => t(key, 'en-GB', options)\n)\n\nexport const messages: LanguageMessagesExt = {\n 'string.base': messageTemplate.required,\n 'string.min': messageTemplate.min,\n 'string.empty': messageTemplate.required,\n 'string.max': messageTemplate.max,\n 'string.email': messageTemplate.format,\n 'string.unicode': messageTemplate.unicode,\n 'string.pattern.base': messageTemplate.pattern,\n 'string.maxWords': messageTemplate.maxWords,\n\n 'number.base': messageTemplate.number,\n 'number.precision': messageTemplate.numberPrecision,\n 'number.integer': messageTemplate.numberInteger,\n 'number.unsafe': messageTemplate.format,\n 'number.min': messageTemplate.numberMin,\n 'number.max': messageTemplate.numberMax,\n\n 'object.required': messageTemplate.objectRequired,\n 'object.and': messageTemplate.objectMissing,\n\n 'any.only': messageTemplate.selectRequired,\n 'any.required': messageTemplate.selectRequired,\n 'any.empty': messageTemplate.required,\n\n 'date.base': messageTemplate.dateFormat,\n 'date.format': messageTemplate.dateFormat,\n 'date.min': messageTemplate.dateMin,\n 'date.max': messageTemplate.dateMax,\n\n 'array.min': messageTemplate.arrayMin,\n 'array.max': messageTemplate.arrayMax,\n 'array.length': messageTemplate.arrayLength,\n\n 'features.min': messageTemplate.featuresMin,\n 'features.max': messageTemplate.featuresMax,\n 'features.length': messageTemplate.featuresLength,\n\n 'files.min': messageTemplate.filesMin,\n 'files.max': messageTemplate.filesMax,\n 'filees.length': messageTemplate.filesLength,\n\n 'object.invalidjson': messageTemplate.format,\n\n 'phoneNumber.invalid': messageTemplate.format\n}\n\nexport const messagesPre: LanguageMessages =\n messages as unknown as LanguageMessages\n\nexport function buildLanguageMessages(\n t: (key: string, options?: Record<string, unknown>) => string\n): LanguageMessages {\n const vm = buildValidationMessages(t)\n return {\n 'string.base': vm.required,\n 'string.min': vm.min,\n 'string.empty': vm.required,\n 'string.max': vm.max,\n 'string.email': vm.format,\n 'string.pattern.base': vm.pattern,\n 'string.maxWords': vm.maxWords,\n 'string.unicode': vm.unicode,\n 'number.base': vm.number,\n 'number.precision': vm.numberPrecision,\n 'number.integer': vm.numberInteger,\n 'number.unsafe': vm.format,\n 'number.min': vm.numberMin,\n 'number.max': vm.numberMax,\n 'object.required': vm.objectRequired,\n 'object.and': vm.objectMissing,\n 'any.only': vm.selectRequired,\n 'any.required': vm.selectRequired,\n 'any.empty': vm.required,\n 'date.base': vm.dateFormat,\n 'date.format': vm.dateFormat,\n 'date.min': vm.dateMin,\n 'date.max': vm.dateMax,\n 'array.min': vm.arrayMin,\n 'array.max': vm.arrayMax,\n 'array.length': vm.arrayLength,\n 'features.min': vm.featuresMin,\n 'features.max': vm.featuresMax,\n 'features.length': vm.featuresLength,\n 'files.min': vm.filesMin,\n 'files.max': vm.filesMax,\n 'files.length': vm.filesLength,\n 'object.invalidjson': vm.format,\n 'phoneNumber.invalid': vm.format\n } as unknown as LanguageMessages\n}\n\nexport const validationOptions: ValidationOptions = {\n abortEarly: false,\n messages: messagesPre,\n errors: {\n wrap: {\n array: false,\n label: false\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,6 +8,6 @@ export declare enum FileStatus {
8
8
  rejected = "rejected",
9
9
  pending = "pending"
10
10
  }
11
- export declare enum FormAdapterSubmissionSchemaVersion {
12
- V1 = 1
13
- }
11
+ export declare const FormAdapterSubmissionSchemaVersion: {
12
+ readonly V1: 1;
13
+ };
@@ -10,8 +10,9 @@ export let FileStatus = /*#__PURE__*/function (FileStatus) {
10
10
  FileStatus["pending"] = "pending";
11
11
  return FileStatus;
12
12
  }({});
13
- export let FormAdapterSubmissionSchemaVersion = /*#__PURE__*/function (FormAdapterSubmissionSchemaVersion) {
14
- FormAdapterSubmissionSchemaVersion[FormAdapterSubmissionSchemaVersion["V1"] = 1] = "V1";
15
- return FormAdapterSubmissionSchemaVersion;
16
- }({});
13
+
14
+ // Changed from an enum to enforce numeric values
15
+ export const FormAdapterSubmissionSchemaVersion = {
16
+ V1: 1
17
+ };
17
18
  //# sourceMappingURL=enums.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"enums.js","names":["UploadStatus","FileStatus","FormAdapterSubmissionSchemaVersion"],"sources":["../../../../../src/server/plugins/engine/types/enums.ts"],"sourcesContent":["export enum UploadStatus {\n initiated = 'initiated',\n pending = 'pending',\n ready = 'ready'\n}\n\nexport enum FileStatus {\n complete = 'complete',\n rejected = 'rejected',\n pending = 'pending'\n}\n\nexport enum FormAdapterSubmissionSchemaVersion {\n V1 = 1\n}\n"],"mappings":"AAAA,WAAYA,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;AAMxB,WAAYC,UAAU,0BAAVA,UAAU;EAAVA,UAAU;EAAVA,UAAU;EAAVA,UAAU;EAAA,OAAVA,UAAU;AAAA;AAMtB,WAAYC,kCAAkC,0BAAlCA,kCAAkC;EAAlCA,kCAAkC,CAAlCA,kCAAkC;EAAA,OAAlCA,kCAAkC;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"enums.js","names":["UploadStatus","FileStatus","FormAdapterSubmissionSchemaVersion","V1"],"sources":["../../../../../src/server/plugins/engine/types/enums.ts"],"sourcesContent":["export enum UploadStatus {\n initiated = 'initiated',\n pending = 'pending',\n ready = 'ready'\n}\n\nexport enum FileStatus {\n complete = 'complete',\n rejected = 'rejected',\n pending = 'pending'\n}\n\n// Changed from an enum to enforce numeric values\nexport const FormAdapterSubmissionSchemaVersion = {\n V1: 1\n} as const satisfies Record<string, number>\n"],"mappings":"AAAA,WAAYA,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;AAMxB,WAAYC,UAAU,0BAAVA,UAAU;EAAVA,UAAU;EAAVA,UAAU;EAAVA,UAAU;EAAA,OAAVA,UAAU;AAAA;;AAMtB;AACA,OAAO,MAAMC,kCAAkC,GAAG;EAChDC,EAAE,EAAE;AACN,CAA2C","ignoreList":[]}
@@ -1,8 +1,8 @@
1
- import { FormStatus, formVersionMetadataSchema, idSchema, notificationEmailAddressSchema, slugSchema, titleSchema } from '@defra/forms-model';
1
+ import { FormStatus, formSubmitConditionEvaluationSchema, formVersionMetadataSchema, idSchema, notificationEmailAddressSchema, slugSchema, titleSchema } from '@defra/forms-model';
2
2
  import Joi from 'joi';
3
3
  import { FormAdapterSubmissionSchemaVersion } from "./enums.js";
4
4
  export const formAdapterSubmissionMessageMetaSchema = Joi.object().keys({
5
- schemaVersion: Joi.string().valid(...Object.values(FormAdapterSubmissionSchemaVersion)),
5
+ schemaVersion: Joi.number().valid(...Object.values(FormAdapterSubmissionSchemaVersion)).required(),
6
6
  timestamp: Joi.date().required(),
7
7
  referenceNumber: Joi.string().required(),
8
8
  formName: titleSchema,
@@ -23,6 +23,7 @@ export const formAdapterSubmissionMessageDataSchema = Joi.object().keys({
23
23
  reference: Joi.string().required(),
24
24
  amount: Joi.number().required(),
25
25
  description: Joi.string().required(),
26
+ descriptionInEng: Joi.string().optional(),
26
27
  createdAt: Joi.string().required()
27
28
  }).optional(),
28
29
  files: Joi.object().pattern(Joi.string(), Joi.array().items(Joi.object().keys({
@@ -40,6 +41,12 @@ export const formAdapterSubmissionMessageResultSchema = Joi.object().keys({
40
41
  export const formAdapterSubmissionMessagePayloadSchema = Joi.object().keys({
41
42
  meta: formAdapterSubmissionMessageMetaSchema.required(),
42
43
  data: formAdapterSubmissionMessageDataSchema.required(),
43
- result: formAdapterSubmissionMessageResultSchema.required()
44
+ result: formAdapterSubmissionMessageResultSchema.required(),
45
+ // Optional so that messages published before this existed - which may
46
+ // still be in flight or sitting on a dead-letter queue - continue to
47
+ // validate. Consumers treat its absence as "resolve the recipients from
48
+ // the form definition yourself"
49
+ // This should be required at a later point in time.
50
+ conditionEvaluations: Joi.array().items(formSubmitConditionEvaluationSchema).optional().description('Outcome of every condition in the form definition, evaluated against the final answers at submission')
44
51
  });
45
52
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":["FormStatus","formVersionMetadataSchema","idSchema","notificationEmailAddressSchema","slugSchema","titleSchema","Joi","FormAdapterSubmissionSchemaVersion","formAdapterSubmissionMessageMetaSchema","object","keys","schemaVersion","string","valid","Object","values","timestamp","date","required","referenceNumber","formName","formId","formSlug","status","isPreview","boolean","notificationEmail","versionMetadata","optional","language","custom","pattern","any","unknown","description","formAdapterSubmissionMessageDataSchema","main","repeaters","payment","paymentId","reference","amount","number","createdAt","files","array","items","fileName","fileId","userDownloadLink","formAdapterSubmissionMessageResultSchema","formAdapterSubmissionMessagePayloadSchema","meta","data","result"],"sources":["../../../../../src/server/plugins/engine/types/schema.ts"],"sourcesContent":["import {\n FormStatus,\n formVersionMetadataSchema,\n idSchema,\n notificationEmailAddressSchema,\n slugSchema,\n titleSchema\n} from '@defra/forms-model'\nimport Joi from 'joi'\n\nimport { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'\nimport {\n type FormAdapterSubmissionMessageData,\n type FormAdapterSubmissionMessageMeta,\n type FormAdapterSubmissionMessagePayload,\n type FormAdapterSubmissionMessageResult\n} from '~/src/server/plugins/engine/types.js'\n\nexport const formAdapterSubmissionMessageMetaSchema =\n Joi.object<FormAdapterSubmissionMessageMeta>().keys({\n schemaVersion: Joi.string().valid(\n ...Object.values(FormAdapterSubmissionSchemaVersion)\n ),\n timestamp: Joi.date().required(),\n referenceNumber: Joi.string().required(),\n formName: titleSchema,\n formId: idSchema,\n formSlug: slugSchema,\n status: Joi.string()\n .valid(...Object.values(FormStatus))\n .required(),\n isPreview: Joi.boolean().required(),\n notificationEmail: notificationEmailAddressSchema.required(),\n versionMetadata: formVersionMetadataSchema.optional(),\n language: Joi.string().optional(),\n custom: Joi.object()\n .pattern(/^/, Joi.any())\n .unknown()\n .optional()\n .description('Custom properties for the message')\n })\n\nexport const formAdapterSubmissionMessageDataSchema =\n Joi.object<FormAdapterSubmissionMessageData>().keys({\n main: Joi.object(),\n repeaters: Joi.object(),\n payment: Joi.object()\n .keys({\n paymentId: Joi.string().required(),\n reference: Joi.string().required(),\n amount: Joi.number().required(),\n description: Joi.string().required(),\n createdAt: Joi.string().required()\n })\n .optional(),\n files: Joi.object().pattern(\n Joi.string(),\n Joi.array().items(\n Joi.object().keys({\n fileName: Joi.string().required(),\n fileId: Joi.string().required(),\n userDownloadLink: Joi.string().required()\n })\n )\n )\n })\n\nexport const formAdapterSubmissionMessageResultSchema =\n Joi.object<FormAdapterSubmissionMessageResult>().keys({\n files: Joi.object()\n .keys({\n main: Joi.string().required(),\n repeaters: Joi.object()\n })\n .required()\n })\n\nexport const formAdapterSubmissionMessagePayloadSchema =\n Joi.object<FormAdapterSubmissionMessagePayload>().keys({\n meta: formAdapterSubmissionMessageMetaSchema.required(),\n data: formAdapterSubmissionMessageDataSchema.required(),\n result: formAdapterSubmissionMessageResultSchema.required()\n })\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"schema.js","names":["FormStatus","formSubmitConditionEvaluationSchema","formVersionMetadataSchema","idSchema","notificationEmailAddressSchema","slugSchema","titleSchema","Joi","FormAdapterSubmissionSchemaVersion","formAdapterSubmissionMessageMetaSchema","object","keys","schemaVersion","number","valid","Object","values","required","timestamp","date","referenceNumber","string","formName","formId","formSlug","status","isPreview","boolean","notificationEmail","versionMetadata","optional","language","custom","pattern","any","unknown","description","formAdapterSubmissionMessageDataSchema","main","repeaters","payment","paymentId","reference","amount","descriptionInEng","createdAt","files","array","items","fileName","fileId","userDownloadLink","formAdapterSubmissionMessageResultSchema","formAdapterSubmissionMessagePayloadSchema","meta","data","result","conditionEvaluations"],"sources":["../../../../../src/server/plugins/engine/types/schema.ts"],"sourcesContent":["import {\n FormStatus,\n formSubmitConditionEvaluationSchema,\n formVersionMetadataSchema,\n idSchema,\n notificationEmailAddressSchema,\n slugSchema,\n titleSchema\n} from '@defra/forms-model'\nimport Joi from 'joi'\n\nimport { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'\nimport {\n type FormAdapterSubmissionMessageData,\n type FormAdapterSubmissionMessageMeta,\n type FormAdapterSubmissionMessagePayload,\n type FormAdapterSubmissionMessageResult\n} from '~/src/server/plugins/engine/types.js'\n\nexport const formAdapterSubmissionMessageMetaSchema =\n Joi.object<FormAdapterSubmissionMessageMeta>().keys({\n schemaVersion: Joi.number()\n .valid(...Object.values(FormAdapterSubmissionSchemaVersion))\n .required(),\n timestamp: Joi.date().required(),\n referenceNumber: Joi.string().required(),\n formName: titleSchema,\n formId: idSchema,\n formSlug: slugSchema,\n status: Joi.string()\n .valid(...Object.values(FormStatus))\n .required(),\n isPreview: Joi.boolean().required(),\n notificationEmail: notificationEmailAddressSchema.required(),\n versionMetadata: formVersionMetadataSchema.optional(),\n language: Joi.string().optional(),\n custom: Joi.object()\n .pattern(/^/, Joi.any())\n .unknown()\n .optional()\n .description('Custom properties for the message')\n })\n\nexport const formAdapterSubmissionMessageDataSchema =\n Joi.object<FormAdapterSubmissionMessageData>().keys({\n main: Joi.object(),\n repeaters: Joi.object(),\n payment: Joi.object()\n .keys({\n paymentId: Joi.string().required(),\n reference: Joi.string().required(),\n amount: Joi.number().required(),\n description: Joi.string().required(),\n descriptionInEng: Joi.string().optional(),\n createdAt: Joi.string().required()\n })\n .optional(),\n files: Joi.object().pattern(\n Joi.string(),\n Joi.array().items(\n Joi.object().keys({\n fileName: Joi.string().required(),\n fileId: Joi.string().required(),\n userDownloadLink: Joi.string().required()\n })\n )\n )\n })\n\nexport const formAdapterSubmissionMessageResultSchema =\n Joi.object<FormAdapterSubmissionMessageResult>().keys({\n files: Joi.object()\n .keys({\n main: Joi.string().required(),\n repeaters: Joi.object()\n })\n .required()\n })\n\nexport const formAdapterSubmissionMessagePayloadSchema =\n Joi.object<FormAdapterSubmissionMessagePayload>().keys({\n meta: formAdapterSubmissionMessageMetaSchema.required(),\n data: formAdapterSubmissionMessageDataSchema.required(),\n result: formAdapterSubmissionMessageResultSchema.required(),\n // Optional so that messages published before this existed - which may\n // still be in flight or sitting on a dead-letter queue - continue to\n // validate. Consumers treat its absence as \"resolve the recipients from\n // the form definition yourself\"\n // This should be required at a later point in time.\n conditionEvaluations: Joi.array()\n .items(formSubmitConditionEvaluationSchema)\n .optional()\n .description(\n 'Outcome of every condition in the form definition, evaluated against the final answers at submission'\n )\n })\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { type ComponentDef, type Event, type FormVersionMetadata, type Item, type List, type Page, type PaymentFieldComponent, type UkAddressFieldComponent } from '@defra/forms-model';
1
+ import { type ComponentDef, type Event, type FormVersionMetadata, type Item, type List, type Page, type PaymentFieldComponent, type SubmitConditionEvaluation, type UkAddressFieldComponent } from '@defra/forms-model';
2
2
  import { type PluginProperties, type Request, type RequestQuery, type ResponseObject } from '@hapi/hapi';
3
3
  import { type Yar } from '@hapi/yar';
4
4
  import { type JoiExpression, type ValidationErrorItem } from 'joi';
@@ -167,10 +167,14 @@ export type FileUpload = {
167
167
  contentLength: number;
168
168
  } & ({
169
169
  fileStatus: FileStatus.complete | FileStatus.rejected | FileStatus.pending;
170
+ errorCode?: string;
170
171
  errorMessage?: string;
172
+ errorParams?: Record<string, number | string | string[]>;
171
173
  } | {
172
174
  fileStatus: FileStatus.complete;
175
+ errorCode?: string;
173
176
  errorMessage?: undefined;
177
+ errorParams?: Record<string, number | string | string[]>;
174
178
  });
175
179
  export interface FileUploadMetadata {
176
180
  retrievalKey: string;
@@ -392,7 +396,7 @@ export interface PluginOptions {
392
396
  ordnanceSurveyApiSecret?: string;
393
397
  }
394
398
  export interface FormAdapterSubmissionMessageMeta {
395
- schemaVersion: FormAdapterSubmissionSchemaVersion;
399
+ schemaVersion: (typeof FormAdapterSubmissionSchemaVersion)[keyof typeof FormAdapterSubmissionSchemaVersion];
396
400
  timestamp: Date;
397
401
  referenceNumber: string;
398
402
  formName: string;
@@ -420,6 +424,7 @@ export interface FormAdapterPayment {
420
424
  reference: string;
421
425
  amount: number;
422
426
  description: string;
427
+ descriptionInEng?: string;
423
428
  createdAt: string;
424
429
  }
425
430
  export interface FormAdapterSubmissionMessageResult {
@@ -451,6 +456,17 @@ export interface FormAdapterSubmissionMessagePayload {
451
456
  meta: FormAdapterSubmissionMessageMeta;
452
457
  data: FormAdapterSubmissionMessageData;
453
458
  result: FormAdapterSubmissionMessageResult;
459
+ /**
460
+ * The outcome of every condition in the form definition, evaluated against
461
+ * the final answers at the point of submission.
462
+ *
463
+ * Always emitted, empty when there is nothing to report - a V1-engine form
464
+ * has no stable condition ids to record against. Optional only for
465
+ * backwards compatibility: a message published before this existed carries
466
+ * no evaluations at all, and consumers fall back to resolving the recipients
467
+ * from the form definition themselves.
468
+ */
469
+ conditionEvaluations?: SubmitConditionEvaluation[];
454
470
  }
455
471
  export interface FormAdapterSubmissionMessage extends FormAdapterSubmissionMessagePayload {
456
472
  messageId: string;