@defra/forms-engine-plugin 5.0.0-alpha.3 → 5.0.0-alpha.31

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 (406) hide show
  1. package/.public/37c964ca545c240f010a.mjs +2 -0
  2. package/.public/37c964ca545c240f010a.mjs.LICENSE.txt +4 -0
  3. package/.public/assets-manifest.json +3 -0
  4. package/.public/javascripts/application.min.js +1 -1
  5. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/application.min.js.map +1 -1
  7. package/.public/javascripts/shared.min.js +1 -1
  8. package/.public/javascripts/shared.min.js.LICENSE.txt +9 -0
  9. package/.public/javascripts/shared.min.js.map +1 -1
  10. package/.public/javascripts/vendor/@defra.min.js +1 -1
  11. package/.public/javascripts/vendor/@defra.min.js.map +1 -1
  12. package/.public/javascripts/vendor/maplibre-gl.min.js +1 -1
  13. package/.public/javascripts/vendor/maplibre-gl.min.js.LICENSE.txt +3 -3
  14. package/.public/javascripts/vendor/maplibre-gl.min.js.map +1 -1
  15. package/.public/stylesheets/application.min.css +1 -1
  16. package/.public/stylesheets/application.min.css.map +1 -1
  17. package/.server/client/javascripts/file-upload.js +6 -3
  18. package/.server/client/javascripts/file-upload.js.map +1 -1
  19. package/.server/client/javascripts/geospatial-map.d.ts +159 -5
  20. package/.server/client/javascripts/geospatial-map.js +161 -81
  21. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  22. package/.server/client/javascripts/geospatial-map.test.js +152 -0
  23. package/.server/client/javascripts/geospatial-map.test.js.map +1 -0
  24. package/.server/client/javascripts/govuk.js +2 -1
  25. package/.server/client/javascripts/govuk.js.map +1 -1
  26. package/.server/client/javascripts/location-map.d.ts +44 -0
  27. package/.server/client/javascripts/location-map.js +55 -6
  28. package/.server/client/javascripts/location-map.js.map +1 -1
  29. package/.server/client/javascripts/map-constants.d.ts +3 -0
  30. package/.server/client/javascripts/map-constants.js +4 -0
  31. package/.server/client/javascripts/map-constants.js.map +1 -0
  32. package/.server/client/javascripts/map.d.ts +17 -4
  33. package/.server/client/javascripts/map.js +59 -6
  34. package/.server/client/javascripts/map.js.map +1 -1
  35. package/.server/client/javascripts/maps.d.ts +5 -0
  36. package/.server/client/javascripts/maps.js +6 -0
  37. package/.server/client/javascripts/maps.js.map +1 -0
  38. package/.server/client/javascripts/shared.d.ts +1 -4
  39. package/.server/client/javascripts/shared.js +1 -4
  40. package/.server/client/javascripts/shared.js.map +1 -1
  41. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  42. package/.server/client/javascripts/sssi-dataset.js +37 -39
  43. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  44. package/.server/client/stylesheets/maps.scss +4 -0
  45. package/.server/client/stylesheets/shared.scss +1 -5
  46. package/.server/server/constants.d.ts +2 -0
  47. package/.server/server/constants.js +2 -0
  48. package/.server/server/constants.js.map +1 -1
  49. package/.server/server/forms/components.json +8 -0
  50. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
  51. package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
  52. package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
  53. package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
  54. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +8 -3
  55. package/.server/server/plugins/engine/components/AutocompleteField.js +17 -0
  56. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +23 -2
  58. package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
  59. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/ComponentBase.d.ts +2 -1
  61. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  62. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  63. package/.server/server/plugins/engine/components/ComponentCollection.js +12 -7
  64. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  65. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  66. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  67. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/DeclarationField.d.ts +6 -3
  69. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  70. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  71. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  72. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
  73. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  74. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  75. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  76. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  77. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  78. package/.server/server/plugins/engine/components/FileUploadField.d.ts +23 -2
  79. package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
  80. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  81. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  82. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  83. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  84. package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
  85. package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
  86. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  87. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  89. package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
  90. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  91. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  92. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  93. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +3 -2
  94. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
  95. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  96. package/.server/server/plugins/engine/components/LocationFieldBase.js +31 -7
  97. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  98. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
  99. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
  100. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  101. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  103. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  104. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  105. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  106. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  108. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  109. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  110. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  111. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  112. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  113. package/.server/server/plugins/engine/components/NumberField.js +22 -0
  114. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  115. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
  116. package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
  117. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  118. package/.server/server/plugins/engine/components/PaymentField.d.ts +2 -0
  119. package/.server/server/plugins/engine/components/PaymentField.js +9 -5
  120. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  121. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  122. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  123. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  124. package/.server/server/plugins/engine/components/TrackingField.d.ts +21 -0
  125. package/.server/server/plugins/engine/components/TrackingField.js +46 -0
  126. package/.server/server/plugins/engine/components/TrackingField.js.map +1 -0
  127. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  128. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  129. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  130. package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -2
  131. package/.server/server/plugins/engine/components/YesNoField.js +22 -8
  132. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  133. package/.server/server/plugins/engine/components/helpers/components.d.ts +1 -1
  134. package/.server/server/plugins/engine/components/helpers/components.js +6 -3
  135. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  136. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
  137. package/.server/server/plugins/engine/components/helpers/geospatial.js +58 -17
  138. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  139. package/.server/server/plugins/engine/components/helpers/index.d.ts +21 -1
  140. package/.server/server/plugins/engine/components/helpers/index.js +45 -1
  141. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  142. package/.server/server/plugins/engine/components/index.d.ts +1 -0
  143. package/.server/server/plugins/engine/components/index.js +1 -0
  144. package/.server/server/plugins/engine/components/index.js.map +1 -1
  145. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  146. package/.server/server/plugins/engine/components/types.js.map +1 -1
  147. package/.server/server/plugins/engine/errors.d.ts +49 -0
  148. package/.server/server/plugins/engine/errors.js +75 -0
  149. package/.server/server/plugins/engine/errors.js.map +1 -0
  150. package/.server/server/plugins/engine/form-availability.d.ts +3 -2
  151. package/.server/server/plugins/engine/form-availability.js +3 -2
  152. package/.server/server/plugins/engine/form-availability.js.map +1 -1
  153. package/.server/server/plugins/engine/form-context.js +2 -2
  154. package/.server/server/plugins/engine/form-context.js.map +1 -1
  155. package/.server/server/plugins/engine/helpers.d.ts +23 -2
  156. package/.server/server/plugins/engine/helpers.js +44 -5
  157. package/.server/server/plugins/engine/helpers.js.map +1 -1
  158. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
  159. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
  160. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  161. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  162. package/.server/server/plugins/engine/i18n/createFormTranslator.js +27 -5
  163. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  164. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  165. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  166. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  167. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  168. package/.server/server/plugins/engine/i18n/form.js +35 -0
  169. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  170. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  171. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  172. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  173. package/.server/server/plugins/engine/i18n/translations/cy.json +176 -7
  174. package/.server/server/plugins/engine/i18n/translations/en-GB.json +110 -6
  175. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  176. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  177. package/.server/server/plugins/engine/index.d.ts +4 -0
  178. package/.server/server/plugins/engine/index.js +4 -0
  179. package/.server/server/plugins/engine/index.js.map +1 -1
  180. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  181. package/.server/server/plugins/engine/models/FormModel.js +35 -23
  182. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  183. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  184. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  185. package/.server/server/plugins/engine/models/types.d.ts +28 -1
  186. package/.server/server/plugins/engine/models/types.js.map +1 -1
  187. package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
  188. package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
  189. package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
  190. package/.server/server/plugins/engine/options.js +2 -1
  191. package/.server/server/plugins/engine/options.js.map +1 -1
  192. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
  193. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  194. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  195. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  196. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  197. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  198. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  199. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  200. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  201. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  202. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  203. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +2 -2
  204. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  205. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  206. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  207. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  208. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  209. package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
  210. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
  211. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
  212. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
  213. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  214. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
  215. package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
  216. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  217. package/.server/server/plugins/engine/plugin.js +3 -0
  218. package/.server/server/plugins/engine/plugin.js.map +1 -1
  219. package/.server/server/plugins/engine/referenceNumbers.d.ts +1 -0
  220. package/.server/server/plugins/engine/referenceNumbers.js +1 -0
  221. package/.server/server/plugins/engine/referenceNumbers.js.map +1 -1
  222. package/.server/server/plugins/engine/routes/index.js +9 -4
  223. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  224. package/.server/server/plugins/engine/types/enums.d.ts +3 -3
  225. package/.server/server/plugins/engine/types/enums.js +5 -4
  226. package/.server/server/plugins/engine/types/enums.js.map +1 -1
  227. package/.server/server/plugins/engine/types/schema.js +15 -4
  228. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  229. package/.server/server/plugins/engine/types.d.ts +24 -2
  230. package/.server/server/plugins/engine/types.js.map +1 -1
  231. package/.server/server/plugins/engine/unavailable-response.js +5 -2
  232. package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
  233. package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
  234. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  235. package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
  236. package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
  237. package/.server/server/plugins/engine/views/components/trackingfield.html +3 -0
  238. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  239. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  240. package/.server/server/plugins/engine/views/summary.html +1 -0
  241. package/.server/server/plugins/engine/views/unavailable.html +14 -11
  242. package/.server/server/plugins/map/routes/index.d.ts +4 -0
  243. package/.server/server/plugins/map/routes/index.js +12 -4
  244. package/.server/server/plugins/map/routes/index.js.map +1 -1
  245. package/.server/server/plugins/map/routes/index.test.js +7 -0
  246. package/.server/server/plugins/map/routes/index.test.js.map +1 -0
  247. package/.server/server/plugins/map/routes/vts/README.md +38 -0
  248. package/.server/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
  249. package/.server/server/plugins/map/routes/vts/countries.geojson +10 -39283
  250. package/.server/server/plugins/map/types.d.ts +24 -2
  251. package/.server/server/plugins/map/types.js +9 -2
  252. package/.server/server/plugins/map/types.js.map +1 -1
  253. package/.server/server/plugins/nunjucks/enviroment.test.js +11 -4
  254. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
  255. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  256. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  257. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  258. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  259. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  260. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  261. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  262. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  263. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  264. package/.server/server/plugins/payment/helper.d.ts +11 -1
  265. package/.server/server/plugins/payment/helper.js +18 -2
  266. package/.server/server/plugins/payment/helper.js.map +1 -1
  267. package/.server/server/plugins/payment/helper.test.js +2 -1
  268. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  269. package/.server/server/plugins/payment/service.d.ts +2 -1
  270. package/.server/server/plugins/payment/service.js +5 -2
  271. package/.server/server/plugins/payment/service.js.map +1 -1
  272. package/.server/server/plugins/payment/service.test.js +7 -3
  273. package/.server/server/plugins/payment/service.test.js.map +1 -1
  274. package/.server/server/plugins/payment/types.d.ts +4 -0
  275. package/.server/server/plugins/payment/types.js +1 -0
  276. package/.server/server/plugins/payment/types.js.map +1 -1
  277. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  278. package/.server/server/plugins/postcode-lookup/models/index.js +103 -36
  279. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  280. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  281. package/.server/server/plugins/postcode-lookup/routes/index.js +64 -18
  282. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  283. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  284. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  285. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  286. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  287. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  288. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  289. package/.server/server/utils/type-utils.d.ts +1 -2
  290. package/.server/server/utils/type-utils.js +0 -3
  291. package/.server/server/utils/type-utils.js.map +1 -1
  292. package/.server/server/utils/utils.d.ts +6 -0
  293. package/.server/server/utils/utils.js +18 -1
  294. package/.server/server/utils/utils.js.map +1 -1
  295. package/.server/server/utils/utils.test.js +21 -1
  296. package/.server/server/utils/utils.test.js.map +1 -1
  297. package/.server/typings/geodesy/index.d.js +2 -0
  298. package/.server/typings/geodesy/index.d.js.map +1 -0
  299. package/.server/typings/hapi/index.d.js.map +1 -1
  300. package/package.json +24 -9
  301. package/src/client/javascripts/file-upload.js +11 -3
  302. package/src/client/javascripts/geospatial-map.js +181 -86
  303. package/src/client/javascripts/govuk.js +2 -0
  304. package/src/client/javascripts/location-map.js +62 -6
  305. package/src/client/javascripts/map-constants.js +3 -0
  306. package/src/client/javascripts/map.js +66 -9
  307. package/src/client/javascripts/maps.js +5 -0
  308. package/src/client/javascripts/shared.js +1 -4
  309. package/src/client/javascripts/sssi-dataset.js +39 -41
  310. package/src/client/stylesheets/maps.scss +4 -0
  311. package/src/client/stylesheets/shared.scss +1 -5
  312. package/src/server/constants.js +2 -0
  313. package/src/server/forms/components.json +8 -0
  314. package/src/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
  315. package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
  316. package/src/server/plugins/engine/components/AutocompleteField.ts +20 -0
  317. package/src/server/plugins/engine/components/CheckboxesField.ts +41 -8
  318. package/src/server/plugins/engine/components/ComponentBase.ts +6 -4
  319. package/src/server/plugins/engine/components/ComponentCollection.ts +17 -15
  320. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  321. package/src/server/plugins/engine/components/DeclarationField.ts +10 -10
  322. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  323. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  324. package/src/server/plugins/engine/components/FileUploadField.ts +46 -5
  325. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  326. package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
  327. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  328. package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
  329. package/src/server/plugins/engine/components/LocationFieldBase.ts +41 -8
  330. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
  331. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  332. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  333. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  334. package/src/server/plugins/engine/components/NumberField.ts +24 -0
  335. package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
  336. package/src/server/plugins/engine/components/PaymentField.ts +9 -4
  337. package/src/server/plugins/engine/components/TrackingField.ts +64 -0
  338. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  339. package/src/server/plugins/engine/components/YesNoField.ts +27 -9
  340. package/src/server/plugins/engine/components/helpers/components.ts +8 -3
  341. package/src/server/plugins/engine/components/helpers/geospatial.ts +87 -24
  342. package/src/server/plugins/engine/components/helpers/index.ts +64 -1
  343. package/src/server/plugins/engine/components/index.ts +1 -0
  344. package/src/server/plugins/engine/components/types.ts +1 -0
  345. package/src/server/plugins/engine/errors.ts +78 -0
  346. package/src/server/plugins/engine/form-availability.ts +8 -2
  347. package/src/server/plugins/engine/form-context.ts +4 -2
  348. package/src/server/plugins/engine/helpers.ts +52 -5
  349. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
  350. package/src/server/plugins/engine/i18n/createFormTranslator.ts +43 -12
  351. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  352. package/src/server/plugins/engine/i18n/form.ts +54 -0
  353. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  354. package/src/server/plugins/engine/i18n/translations/cy.json +176 -7
  355. package/src/server/plugins/engine/i18n/translations/en-GB.json +110 -6
  356. package/src/server/plugins/engine/i18n/types.ts +2 -0
  357. package/src/server/plugins/engine/index.ts +7 -0
  358. package/src/server/plugins/engine/models/FormModel.ts +46 -23
  359. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  360. package/src/server/plugins/engine/models/types.ts +31 -0
  361. package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
  362. package/src/server/plugins/engine/options.js +2 -1
  363. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
  364. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  365. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  366. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  367. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +2 -2
  368. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  369. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  370. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
  371. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
  372. package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
  373. package/src/server/plugins/engine/plugin.ts +6 -0
  374. package/src/server/plugins/engine/referenceNumbers.ts +2 -0
  375. package/src/server/plugins/engine/routes/index.ts +9 -3
  376. package/src/server/plugins/engine/types/enums.ts +4 -3
  377. package/src/server/plugins/engine/types/schema.ts +22 -5
  378. package/src/server/plugins/engine/types.ts +28 -1
  379. package/src/server/plugins/engine/unavailable-response.ts +6 -2
  380. package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
  381. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  382. package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
  383. package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
  384. package/src/server/plugins/engine/views/components/trackingfield.html +3 -0
  385. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  386. package/src/server/plugins/engine/views/file-upload.html +1 -1
  387. package/src/server/plugins/engine/views/summary.html +1 -0
  388. package/src/server/plugins/engine/views/unavailable.html +14 -11
  389. package/src/server/plugins/map/routes/index.js +29 -4
  390. package/src/server/plugins/map/routes/vts/README.md +38 -0
  391. package/src/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
  392. package/src/server/plugins/map/routes/vts/countries.geojson +10 -39283
  393. package/src/server/plugins/map/types.js +9 -2
  394. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  395. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  396. package/src/server/plugins/payment/helper.js +22 -2
  397. package/src/server/plugins/payment/service.js +6 -2
  398. package/src/server/plugins/payment/types.js +1 -0
  399. package/src/server/plugins/postcode-lookup/models/index.js +91 -46
  400. package/src/server/plugins/postcode-lookup/routes/index.js +96 -24
  401. package/src/server/plugins/postcode-lookup/types.js +6 -1
  402. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  403. package/src/server/utils/type-utils.ts +1 -11
  404. package/src/server/utils/utils.js +19 -1
  405. package/src/typings/geodesy/index.d.ts +18 -0
  406. package/src/typings/hapi/index.d.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Joi","t","i18nT","service","crumbSchema","postcodeQueryFieldName","buildingNameQueryFieldName","uprnFieldName","line1FieldName","line2FieldName","townFieldName","countyFieldName","postcodeFieldName","GOVUK_MARGIN_RIGHT_1","steps","details","select","manual","JOURNEY_BASE_URL","buildErrors","err","hasErrors","isError","length","getError","fieldName","find","item","path","postcodeQueryError","buildingNameQueryError","uprnError","line1Error","line2Error","townError","countyError","postcodeError","errors","pushError","push","text","message","href","getAddresses","postcodeQuery","buildingNameQuery","apiKey","addresses","search","addressCount","singleAddress","at","undefined","hasAddresses","hasMultipleAddresses","getDetailsFields","language","id","name","label","hint","value","errorMessage","getSelectFields","payload","selectAddressText","type","uprn","items","concat","map","formatted","getManualFields","addressLine1","addressLine2","classes","town","county","postcode","stepSchema","string","valid","Object","keys","required","sharedPayloadSchemaKeys","crumb","step","createDetailsPayloadSchema","object","pattern","trim","messages","allow","createSelectPayloadSchema","createManualPayloadSchema","getHref","query","detailsViewModel","data","componentTitle","pageTitle","formName","sourceUrl","initial","backLink","fields","continueButton","manualLink","showTitle","serviceUrl","buttons","selectViewModel","session","title","formPath","searchAgainText","searchAgainLink","addressesFoundText","count","noAddressFoundText","manualViewModel","componentHint","detailsLink"],"sources":["../../../../../src/server/plugins/postcode-lookup/models/index.js"],"sourcesContent":["import Joi from 'joi'\n\nimport { t as i18nT } from '~/src/server/plugins/engine/i18n/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\nimport { crumbSchema } from '~/src/server/schemas/index.js'\n\n// Field names/ids\nconst postcodeQueryFieldName = 'postcodeQuery'\nconst buildingNameQueryFieldName = 'buildingNameQuery'\nconst uprnFieldName = 'uprn'\n\nconst line1FieldName = 'addressLine1'\nconst line2FieldName = 'addressLine2'\nconst townFieldName = 'town'\nconst countyFieldName = 'county'\nconst postcodeFieldName = 'postcode'\n\nconst GOVUK_MARGIN_RIGHT_1 = 'govuk-!-margin-right-1'\n\nexport const steps = {\n // Step 1: Postcode/building name input\n details: 'details',\n // Step 2: Select address\n select: 'select',\n // Step 3: Manual address\n manual: 'manual'\n}\n\nexport const JOURNEY_BASE_URL = '/postcode-lookup'\n\n/**\n * Build form errors\n * @param {Error} [err]\n */\nfunction buildErrors(err) {\n const hasErrors = Joi.isError(err) && err.details.length > 0\n\n if (!hasErrors) {\n return {}\n }\n\n /**\n * Get error by path\n * @param {string} fieldName\n */\n const getError = (fieldName) => {\n return err.details.find((item) => item.path[0] === fieldName)\n }\n\n const postcodeQueryError = getError(postcodeQueryFieldName)\n const buildingNameQueryError = getError(buildingNameQueryFieldName)\n const uprnError = getError(uprnFieldName)\n const line1Error = getError(line1FieldName)\n const line2Error = getError(line2FieldName)\n const townError = getError(townFieldName)\n const countyError = getError(countyFieldName)\n const postcodeError = getError(postcodeFieldName)\n\n /**\n * @type {{ text: string, href: string }[]}\n */\n const errors = []\n\n /**\n * Push error\n * @param {string} fieldName - the field name\n * @param {ValidationErrorItem} [item] - the joi validation error\n */\n const pushError = (fieldName, item) => {\n if (item) {\n errors.push({\n text: item.message,\n href: `#${fieldName}`\n })\n }\n }\n\n pushError(postcodeQueryFieldName, postcodeQueryError)\n pushError(buildingNameQueryFieldName, buildingNameQueryError)\n pushError(uprnFieldName, uprnError)\n pushError(line1FieldName, line1Error)\n pushError(line2FieldName, line2Error)\n pushError(townFieldName, townError)\n pushError(countyFieldName, countyError)\n pushError(postcodeFieldName, postcodeError)\n\n return {\n errors,\n postcodeQueryError,\n buildingNameQueryError,\n uprnError,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n }\n}\n\n/**\n * Search ordnance survey for addresses\n * @param {string} postcodeQuery\n * @param {string} buildingNameQuery\n * @param {string} apiKey\n */\nasync function getAddresses(postcodeQuery, buildingNameQuery, apiKey) {\n const addresses = await service.search(\n postcodeQuery,\n buildingNameQuery,\n apiKey\n )\n const addressCount = addresses.length\n const singleAddress = addressCount === 1 ? addresses.at(0) : undefined\n const hasAddresses = addressCount > 0\n const hasMultipleAddresses = addressCount > 1\n\n return {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n }\n}\n\n/**\n * Get the details view fields\n * @param {PostcodeLookupDetailsData | undefined} details\n * @param {OptionalValidationErrorItem} postcodeQueryError\n * @param {OptionalValidationErrorItem} buildingNameQueryError\n * @param {string} language\n */\nfunction getDetailsFields(\n details,\n postcodeQueryError,\n buildingNameQueryError,\n language\n) {\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n label: {\n text: i18nT('postcodeLookup.postcodeLabel', language)\n },\n hint: {\n text: i18nT('postcodeLookup.postcodeHint', language)\n },\n value: details?.postcodeQuery,\n errorMessage: postcodeQueryError && { text: postcodeQueryError.message }\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n label: {\n text: i18nT('postcodeLookup.buildingNameLabel', language)\n },\n hint: {\n text: i18nT('postcodeLookup.buildingNameHint', language)\n },\n value: details?.buildingNameQuery,\n errorMessage: buildingNameQueryError && {\n text: buildingNameQueryError.message\n }\n }\n }\n}\n\n/**\n * Get the select view fields\n * @param {PostcodeLookupDetailsData} details\n * @param {boolean} hasMultipleAddresses\n * @param {Address | undefined} singleAddress\n * @param {PostcodeLookupSelectPayload | undefined} payload\n * @param {OptionalValidationErrorItem} uprnError\n * @param {Address[]} addresses\n * @param {string} language\n */\nfunction getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses,\n language\n) {\n const selectAddressText = i18nT('postcodeLookup.selectAddress', language)\n\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n type: 'hidden',\n value: details.postcodeQuery\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n type: 'hidden',\n value: details.buildingNameQuery\n },\n [uprnFieldName]: {\n id: uprnFieldName,\n name: uprnFieldName,\n label: hasMultipleAddresses\n ? {\n text: selectAddressText\n }\n : undefined,\n value: singleAddress ? singleAddress.uprn : payload?.uprn,\n errorMessage: uprnError && { text: uprnError.message },\n items: hasMultipleAddresses\n ? [{ text: selectAddressText, value: '' }].concat(\n addresses.map((item) => ({\n text: item.formatted,\n value: item.uprn\n }))\n )\n : undefined,\n type: singleAddress ? 'hidden' : undefined\n }\n }\n}\n\n/**\n * Get the manual view fields\n * @param {PostcodeLookupManualPayload | undefined} payload\n * @param {OptionalValidationErrorItem} line1Error\n * @param {OptionalValidationErrorItem} line2Error\n * @param {OptionalValidationErrorItem} townError\n * @param {OptionalValidationErrorItem} countyError\n * @param {OptionalValidationErrorItem} postcodeError\n * @param {string} language\n */\nfunction getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError,\n language\n) {\n return {\n [line1FieldName]: {\n id: line1FieldName,\n name: line1FieldName,\n label: {\n text: i18nT('postcodeLookup.addressLine1Label', language)\n },\n value: payload?.addressLine1,\n errorMessage: line1Error && { text: line1Error.message }\n },\n [line2FieldName]: {\n id: line2FieldName,\n name: line2FieldName,\n label: {\n text: i18nT('postcodeLookup.addressLine2Label', language)\n },\n value: payload?.addressLine2,\n errorMessage: line2Error && { text: line2Error.message }\n },\n [townFieldName]: {\n id: townFieldName,\n name: townFieldName,\n label: {\n text: i18nT('postcodeLookup.townLabel', language)\n },\n classes: 'govuk-!-width-two-thirds',\n value: payload?.town,\n errorMessage: townError && { text: townError.message }\n },\n [countyFieldName]: {\n id: countyFieldName,\n name: countyFieldName,\n label: {\n text: i18nT('postcodeLookup.countyLabel', language)\n },\n value: payload?.county,\n errorMessage: countyError && { text: countyError.message }\n },\n [postcodeFieldName]: {\n id: postcodeFieldName,\n name: postcodeFieldName,\n label: {\n text: i18nT('postcodeLookup.postcodeLabel', language)\n },\n classes: 'govuk-input--width-10',\n value: payload?.postcode,\n errorMessage: postcodeError && { text: postcodeError.message }\n }\n }\n}\n\nexport const stepSchema = Joi.string()\n .valid(...Object.keys(steps))\n .required()\n\nconst sharedPayloadSchemaKeys = {\n crumb: crumbSchema,\n step: stepSchema\n}\n\n/**\n * Postcode lookup details form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupDetailsPayload>}\n */\nexport function createDetailsPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [postcodeQueryFieldName]: Joi.string()\n .pattern(/^[a-zA-Z]{1,2}\\d[a-zA-Z\\d]?\\s?\\d[a-zA-Z]{2}$/)\n .trim()\n .required()\n .messages({\n 'string.pattern.base': i18nT(\n 'postcodeLookup.validation.invalidPostcode',\n language\n ),\n '*': i18nT('postcodeLookup.validation.requiredPostcode', language)\n }),\n [buildingNameQueryFieldName]: Joi.string()\n .trim()\n .required()\n .allow('')\n .trim()\n })\n .required()\n}\n\n/**\n * Postcode lookup select form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupSelectPayload>}\n */\nexport function createSelectPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [uprnFieldName]: Joi.string()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.selectAddress', language)\n })\n })\n .required()\n}\n\n/**\n * Postcode lookup manual form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupManualPayload>}\n */\nexport function createManualPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [line1FieldName]: Joi.string()\n .trim()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.requiredAddressLine1', language)\n }),\n [line2FieldName]: Joi.string().trim().allow('').required(),\n [townFieldName]: Joi.string()\n .trim()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.requiredTown', language)\n }),\n [countyFieldName]: Joi.string().trim().allow('').required(),\n [postcodeFieldName]: Joi.string()\n .pattern(/^[a-zA-Z]{1,2}\\d[a-zA-Z\\d]?\\s?\\d[a-zA-Z]{2}$/)\n .trim()\n .required()\n .messages({\n 'string.pattern.base': i18nT(\n 'postcodeLookup.validation.invalidManualPostcode',\n language\n ),\n '*': i18nT(\n 'postcodeLookup.validation.requiredManualPostcode',\n language\n )\n })\n })\n .required()\n}\n\n/**\n * Get the postcode lookup href\n * @param {string} [step] - the postcode lookup step\n */\nfunction getHref(step) {\n const query = step ? `?step=${step}` : ''\n\n return `${JOURNEY_BASE_URL}${query}`\n}\n\n/**\n * The postcode lookup details form view model\n * @param {PostcodeLookupSessionData} data\n * @param {PostcodeLookupDetailsData} [payload]\n * @param {Error} [err]\n */\nexport function detailsViewModel(data, payload, err) {\n const {\n componentTitle: pageTitle,\n formName,\n sourceUrl,\n language = 'en-GB'\n } = data.initial\n\n const backLink = {\n href: sourceUrl\n }\n\n const { errors, postcodeQueryError, buildingNameQueryError } =\n buildErrors(err)\n\n const fields = getDetailsFields(\n payload ?? data.details,\n postcodeQueryError,\n buildingNameQueryError,\n language\n )\n\n const continueButton = {\n text: i18nT('postcodeLookup.findAddress', language),\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: i18nT('postcodeLookup.enterManually', language),\n href: getHref(steps.manual)\n }\n\n return {\n step: steps.details,\n showTitle: true,\n name: formName,\n serviceUrl: sourceUrl,\n pageTitle,\n backLink,\n errors,\n fields,\n buttons: { continueButton, manualLink }\n }\n}\n\n/**\n * The postcode lookup select form view model\n * @param {{ session: PostcodeLookupSessionData, apiKey: string }} data\n * @param {PostcodeLookupSelectPayload} [payload]\n * @param {Error} [err]\n */\nexport async function selectViewModel(data, payload, err) {\n const { session, apiKey } = data\n const { details, initial } = session\n const { postcodeQuery, buildingNameQuery } = details\n const language = initial.language ?? 'en-GB'\n\n const {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n } = await getAddresses(postcodeQuery, buildingNameQuery, apiKey)\n\n const title = hasAddresses\n ? initial.componentTitle\n : i18nT('postcodeLookup.noAddressFoundTitle', language)\n const formPath = initial.sourceUrl\n const href = getHref()\n\n const backLink = { href }\n\n const { errors, uprnError } = buildErrors(err)\n\n const fields = getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses,\n language\n )\n\n const searchAgainText = i18nT('postcodeLookup.searchAgain', language)\n\n const searchAgainLink = {\n text: searchAgainText,\n href\n }\n\n const continueButton = {\n href: hasAddresses ? undefined : href,\n text: hasAddresses\n ? i18nT('postcodeLookup.useThisAddress', language)\n : searchAgainText,\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: i18nT('postcodeLookup.enterManually', language),\n href: `${href}?step=${steps.manual}`\n }\n\n const addressesFoundText = hasAddresses\n ? i18nT('postcodeLookup.addressFound', language, { count: addressCount })\n : undefined\n const noAddressFoundText = !hasAddresses\n ? i18nT('postcodeLookup.noAddressFoundBody', language)\n : undefined\n\n return {\n step: steps.select,\n showTitle: true,\n name: title,\n serviceUrl: formPath,\n pageTitle: title,\n backLink,\n errors,\n searchAgainLink,\n fields,\n details,\n addressCount,\n singleAddress,\n hasAddresses,\n hasMultipleAddresses,\n addressesFoundText,\n noAddressFoundText,\n buttons: { continueButton, manualLink }\n }\n}\n\n/**\n * The postcode lookup manual form view model\n * @param {PostcodeLookupSessionData} data\n * @param {PostcodeLookupManualPayload} [payload]\n * @param {Error} [err]\n */\nexport function manualViewModel(data, payload, err) {\n const {\n componentTitle,\n sourceUrl,\n componentHint,\n language = 'en-GB'\n } = data.initial\n const formPath = sourceUrl\n const href = getHref()\n\n const backLink = {\n href\n }\n\n const {\n errors,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n } = buildErrors(err)\n\n const hint = componentHint && {\n text: componentHint\n }\n\n const fields = getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError,\n language\n )\n\n const continueButton = {\n text: i18nT('postcodeLookup.useThisAddress', language),\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const detailsLink = {\n text: i18nT('postcodeLookup.findAnAddressInstead', language),\n href\n }\n\n return {\n step: steps.manual,\n showTitle: true,\n name: componentTitle,\n serviceUrl: formPath,\n pageTitle: componentTitle,\n backLink,\n errors,\n hint,\n fields,\n buttons: { continueButton, detailsLink }\n }\n}\n\n/** @typedef { ValidationErrorItem | undefined } OptionalValidationErrorItem */\n\n/**\n * @import { ObjectSchema, ValidationErrorItem } from 'joi'\n * @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Joi","t","i18nT","service","crumbSchema","postcodeQueryFieldName","buildingNameQueryFieldName","uprnFieldName","line1FieldName","line2FieldName","townFieldName","countyFieldName","postcodeFieldName","GOVUK_MARGIN_RIGHT_1","COMMON_BACK","steps","details","select","manual","JOURNEY_BASE_URL","buildErrors","err","hasErrors","isError","length","getError","fieldName","find","item","path","postcodeQueryError","buildingNameQueryError","uprnError","line1Error","line2Error","townError","countyError","postcodeError","errors","pushError","push","text","message","href","getAddresses","postcodeQuery","buildingNameQuery","apiKey","addresses","search","addressCount","singleAddress","at","undefined","hasAddresses","hasMultipleAddresses","getDetailsFields","language","id","name","label","hint","value","errorMessage","getSelectFields","payload","selectAddressText","type","uprn","items","concat","map","formatted","getManualFields","addressLine1","addressLine2","classes","town","county","postcode","stepSchema","string","valid","Object","keys","required","detailsObjectSchema","object","bind","selectObjectSchema","manualObjectSchema","sharedPayloadSchemaKeys","crumb","step","createDetailsPayloadSchema","pattern","trim","messages","allow","createSelectPayloadSchema","createManualPayloadSchema","getHref","query","detailsViewModel","data","translator","componentId","componentHint","sourceUrl","languages","initial","tComponent","tForm","component","backLink","fields","continueButton","manualLink","selector","showTitle","serviceUrl","pageTitle","buttons","selectViewModel","session","title","formPath","searchAgainText","searchAgainLink","addressesFoundText","count","noAddressFoundText","manualViewModel","detailsLink"],"sources":["../../../../../src/server/plugins/postcode-lookup/models/index.js"],"sourcesContent":["import Joi from 'joi'\n\nimport { t as i18nT } from '~/src/server/plugins/engine/i18n/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\nimport { crumbSchema } from '~/src/server/schemas/index.js'\n\n// Field names/ids\nconst postcodeQueryFieldName = 'postcodeQuery'\nconst buildingNameQueryFieldName = 'buildingNameQuery'\nconst uprnFieldName = 'uprn'\n\nconst line1FieldName = 'addressLine1'\nconst line2FieldName = 'addressLine2'\nconst townFieldName = 'town'\nconst countyFieldName = 'county'\nconst postcodeFieldName = 'postcode'\n\nconst GOVUK_MARGIN_RIGHT_1 = 'govuk-!-margin-right-1'\nconst COMMON_BACK = 'common.back'\n\nexport const steps = {\n // Step 1: Postcode/building name input\n details: 'details',\n // Step 2: Select address\n select: 'select',\n // Step 3: Manual address\n manual: 'manual'\n}\n\nexport const JOURNEY_BASE_URL = '/postcode-lookup'\n\n/**\n * Build form errors\n * @param {Error} [err]\n */\nfunction buildErrors(err) {\n const hasErrors = Joi.isError(err) && err.details.length > 0\n\n if (!hasErrors) {\n return {}\n }\n\n /**\n * Get error by path\n * @param {string} fieldName\n */\n const getError = (fieldName) => {\n return err.details.find((item) => item.path[0] === fieldName)\n }\n\n const postcodeQueryError = getError(postcodeQueryFieldName)\n const buildingNameQueryError = getError(buildingNameQueryFieldName)\n const uprnError = getError(uprnFieldName)\n const line1Error = getError(line1FieldName)\n const line2Error = getError(line2FieldName)\n const townError = getError(townFieldName)\n const countyError = getError(countyFieldName)\n const postcodeError = getError(postcodeFieldName)\n\n /**\n * @type {{ text: string, href: string }[]}\n */\n const errors = []\n\n /**\n * Push error\n * @param {string} fieldName - the field name\n * @param {ValidationErrorItem} [item] - the joi validation error\n */\n const pushError = (fieldName, item) => {\n if (item) {\n errors.push({\n text: item.message,\n href: `#${fieldName}`\n })\n }\n }\n\n pushError(postcodeQueryFieldName, postcodeQueryError)\n pushError(buildingNameQueryFieldName, buildingNameQueryError)\n pushError(uprnFieldName, uprnError)\n pushError(line1FieldName, line1Error)\n pushError(line2FieldName, line2Error)\n pushError(townFieldName, townError)\n pushError(countyFieldName, countyError)\n pushError(postcodeFieldName, postcodeError)\n\n return {\n errors,\n postcodeQueryError,\n buildingNameQueryError,\n uprnError,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n }\n}\n\n/**\n * Search ordnance survey for addresses\n * @param {string} postcodeQuery\n * @param {string} buildingNameQuery\n * @param {string} apiKey\n */\nasync function getAddresses(postcodeQuery, buildingNameQuery, apiKey) {\n const addresses = await service.search(\n postcodeQuery,\n buildingNameQuery,\n apiKey\n )\n const addressCount = addresses.length\n const singleAddress = addressCount === 1 ? addresses.at(0) : undefined\n const hasAddresses = addressCount > 0\n const hasMultipleAddresses = addressCount > 1\n\n return {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n }\n}\n\n/**\n * Get the details view fields\n * @param {PostcodeLookupDetailsData | undefined} details\n * @param {OptionalValidationErrorItem} postcodeQueryError\n * @param {OptionalValidationErrorItem} buildingNameQueryError\n * @param {string} language\n */\nfunction getDetailsFields(\n details,\n postcodeQueryError,\n buildingNameQueryError,\n language\n) {\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n label: {\n text: i18nT('postcodeLookup.postcodeLabel', language)\n },\n hint: {\n text: i18nT('postcodeLookup.postcodeHint', language)\n },\n value: details?.postcodeQuery,\n errorMessage: postcodeQueryError && { text: postcodeQueryError.message }\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n label: {\n text: i18nT('postcodeLookup.buildingNameLabel', language)\n },\n hint: {\n text: i18nT('postcodeLookup.buildingNameHint', language)\n },\n value: details?.buildingNameQuery,\n errorMessage: buildingNameQueryError && {\n text: buildingNameQueryError.message\n }\n }\n }\n}\n\n/**\n * Get the select view fields\n * @param {PostcodeLookupDetailsData} details\n * @param {boolean} hasMultipleAddresses\n * @param {Address | undefined} singleAddress\n * @param {PostcodeLookupSelectPayload | undefined} payload\n * @param {OptionalValidationErrorItem} uprnError\n * @param {Address[]} addresses\n * @param {string} language\n */\nfunction getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses,\n language\n) {\n const selectAddressText = i18nT('postcodeLookup.selectAddress', language)\n\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n type: 'hidden',\n value: details.postcodeQuery\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n type: 'hidden',\n value: details.buildingNameQuery\n },\n [uprnFieldName]: {\n id: uprnFieldName,\n name: uprnFieldName,\n label: hasMultipleAddresses\n ? {\n text: selectAddressText\n }\n : undefined,\n value: singleAddress ? singleAddress.uprn : payload?.uprn,\n errorMessage: uprnError && { text: uprnError.message },\n items: hasMultipleAddresses\n ? [{ text: selectAddressText, value: '' }].concat(\n addresses.map((item) => ({\n text: item.formatted,\n value: item.uprn\n }))\n )\n : undefined,\n type: singleAddress ? 'hidden' : undefined\n }\n }\n}\n\n/**\n * Get the manual view fields\n * @param {PostcodeLookupManualPayload | undefined} payload\n * @param {OptionalValidationErrorItem} line1Error\n * @param {OptionalValidationErrorItem} line2Error\n * @param {OptionalValidationErrorItem} townError\n * @param {OptionalValidationErrorItem} countyError\n * @param {OptionalValidationErrorItem} postcodeError\n * @param {string} language\n */\nfunction getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError,\n language\n) {\n return {\n [line1FieldName]: {\n id: line1FieldName,\n name: line1FieldName,\n label: {\n text: i18nT('postcodeLookup.addressLine1Label', language)\n },\n value: payload?.addressLine1,\n errorMessage: line1Error && { text: line1Error.message }\n },\n [line2FieldName]: {\n id: line2FieldName,\n name: line2FieldName,\n label: {\n text: i18nT('postcodeLookup.addressLine2Label', language)\n },\n value: payload?.addressLine2,\n errorMessage: line2Error && { text: line2Error.message }\n },\n [townFieldName]: {\n id: townFieldName,\n name: townFieldName,\n label: {\n text: i18nT('postcodeLookup.townLabel', language)\n },\n classes: 'govuk-!-width-two-thirds',\n value: payload?.town,\n errorMessage: townError && { text: townError.message }\n },\n [countyFieldName]: {\n id: countyFieldName,\n name: countyFieldName,\n label: {\n text: i18nT('postcodeLookup.countyLabel', language)\n },\n value: payload?.county,\n errorMessage: countyError && { text: countyError.message }\n },\n [postcodeFieldName]: {\n id: postcodeFieldName,\n name: postcodeFieldName,\n label: {\n text: i18nT('postcodeLookup.postcodeLabel', language)\n },\n classes: 'govuk-input--width-10',\n value: payload?.postcode,\n errorMessage: postcodeError && { text: postcodeError.message }\n }\n }\n}\n\nexport const stepSchema = Joi.string()\n .valid(...Object.keys(steps))\n .required()\n\n/**\n * Joi object schema factories typed with their payload, as JavaScript files\n * cannot pass type arguments to `Joi.object<T>()`\n */\n/** @type {() => ObjectSchema<PostcodeLookupDetailsPayload>} */\nconst detailsObjectSchema = Joi.object.bind(Joi)\n\n/** @type {() => ObjectSchema<PostcodeLookupSelectPayload>} */\nconst selectObjectSchema = Joi.object.bind(Joi)\n\n/** @type {() => ObjectSchema<PostcodeLookupManualPayload>} */\nconst manualObjectSchema = Joi.object.bind(Joi)\n\nconst sharedPayloadSchemaKeys = {\n crumb: crumbSchema,\n step: stepSchema\n}\n\n/**\n * Postcode lookup details form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupDetailsPayload>}\n */\nexport function createDetailsPayloadSchema(language = 'en-GB') {\n return detailsObjectSchema()\n .keys({\n ...sharedPayloadSchemaKeys,\n [postcodeQueryFieldName]: Joi.string()\n .pattern(/^[a-zA-Z]{1,2}\\d[a-zA-Z\\d]?\\s?\\d[a-zA-Z]{2}$/)\n .trim()\n .required()\n .messages({\n 'string.pattern.base': i18nT(\n 'postcodeLookup.validation.invalidPostcode',\n language\n ),\n '*': i18nT('postcodeLookup.validation.requiredPostcode', language)\n }),\n [buildingNameQueryFieldName]: Joi.string()\n .trim()\n .required()\n .allow('')\n .trim()\n })\n .required()\n}\n\n/**\n * Postcode lookup select form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupSelectPayload>}\n */\nexport function createSelectPayloadSchema(language = 'en-GB') {\n return selectObjectSchema()\n .keys({\n ...sharedPayloadSchemaKeys,\n [uprnFieldName]: Joi.string()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.selectAddress', language)\n })\n })\n .required()\n}\n\n/**\n * Postcode lookup manual form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupManualPayload>}\n */\nexport function createManualPayloadSchema(language = 'en-GB') {\n return manualObjectSchema()\n .keys({\n ...sharedPayloadSchemaKeys,\n [line1FieldName]: Joi.string()\n .trim()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.requiredAddressLine1', language)\n }),\n [line2FieldName]: Joi.string().trim().allow('').required(),\n [townFieldName]: Joi.string()\n .trim()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.requiredTown', language)\n }),\n [countyFieldName]: Joi.string().trim().allow('').required(),\n [postcodeFieldName]: Joi.string()\n .pattern(/^[a-zA-Z]{1,2}\\d[a-zA-Z\\d]?\\s?\\d[a-zA-Z]{2}$/)\n .trim()\n .required()\n .messages({\n 'string.pattern.base': i18nT(\n 'postcodeLookup.validation.invalidManualPostcode',\n language\n ),\n '*': i18nT(\n 'postcodeLookup.validation.requiredManualPostcode',\n language\n )\n })\n })\n .required()\n}\n\n/**\n * Get the postcode lookup href\n * @param {string} [step] - the postcode lookup step\n */\nfunction getHref(step) {\n const query = step ? `?step=${step}` : ''\n\n return `${JOURNEY_BASE_URL}${query}`\n}\n\n/**\n * The postcode lookup details form view model\n * @param {PostcodeLookupSessionData} data\n * @param {Translator} translator\n * @param {PostcodeLookupDetailsData} [payload]\n * @param {Error} [err]\n */\nexport function detailsViewModel(data, translator, payload, err) {\n const { componentId, componentHint, sourceUrl, languages } = data.initial\n\n const { t, tComponent, tForm } = translator\n\n const component = /** @type {ComponentDef} */ ({ id: componentId })\n\n const backLink = {\n href: sourceUrl,\n text: t(COMMON_BACK)\n }\n\n const { errors, postcodeQueryError, buildingNameQueryError } =\n buildErrors(err)\n\n const fields = getDetailsFields(\n payload ?? data.details,\n postcodeQueryError,\n buildingNameQueryError,\n translator.language\n )\n\n const hint = componentHint && {\n text: tComponent(component, 'hint')\n }\n\n const continueButton = {\n text: t('postcodeLookup.findAddress'),\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: t('postcodeLookup.enterManually'),\n href: getHref(steps.manual)\n }\n\n const selector = languages?.length ? { languages } : {}\n\n return {\n step: steps.details,\n showTitle: true,\n name: tForm('title'),\n serviceUrl: sourceUrl,\n pageTitle: tComponent(component, 'title'),\n hint,\n backLink,\n errors,\n fields,\n buttons: { continueButton, manualLink },\n t,\n language: translator.language,\n ...selector\n }\n}\n\n/**\n * The postcode lookup select form view model\n * @param {{ session: PostcodeLookupSessionData, apiKey: string }} data\n * @param {Translator} translator\n * @param {PostcodeLookupSelectPayload} [payload]\n * @param {Error} [err]\n */\nexport async function selectViewModel(data, translator, payload, err) {\n const { session, apiKey } = data\n const { details, initial } = session\n const { postcodeQuery, buildingNameQuery } = details\n const { language, t, tComponent, tForm } = translator\n\n const {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n } = await getAddresses(postcodeQuery, buildingNameQuery, apiKey)\n\n const title = hasAddresses\n ? tComponent(\n /** @type {ComponentDef} */ ({ id: initial.componentId }),\n 'title'\n )\n : t('postcodeLookup.noAddressFoundTitle')\n const formPath = initial.sourceUrl\n const href = getHref()\n\n const backLink = {\n href,\n text: t(COMMON_BACK)\n }\n\n const { errors, uprnError } = buildErrors(err)\n\n const fields = getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses,\n language\n )\n\n const searchAgainText = t('postcodeLookup.searchAgain')\n\n const searchAgainLink = {\n text: searchAgainText,\n href\n }\n\n const continueButton = {\n href: hasAddresses ? undefined : href,\n text: hasAddresses ? t('postcodeLookup.useThisAddress') : searchAgainText,\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: t('postcodeLookup.enterManually'),\n href: `${href}?step=${steps.manual}`\n }\n\n const addressesFoundText = hasAddresses\n ? t('postcodeLookup.addressFound', { count: addressCount })\n : undefined\n const noAddressFoundText = !hasAddresses\n ? t('postcodeLookup.noAddressFoundBody')\n : undefined\n\n const selector = initial.languages?.length\n ? { languages: initial.languages }\n : {}\n\n return {\n step: steps.select,\n showTitle: true,\n name: tForm('title'),\n serviceUrl: formPath,\n pageTitle: title,\n backLink,\n errors,\n searchAgainLink,\n fields,\n details,\n addressCount,\n singleAddress,\n hasAddresses,\n hasMultipleAddresses,\n addressesFoundText,\n noAddressFoundText,\n buttons: { continueButton, manualLink },\n t,\n language,\n ...selector\n }\n}\n\n/**\n * The postcode lookup manual form view model\n * @param {PostcodeLookupSessionData} data\n * @param {Translator} translator\n * @param {PostcodeLookupManualPayload} [payload]\n * @param {Error} [err]\n */\nexport function manualViewModel(data, translator, payload, err) {\n const { componentId, sourceUrl, componentHint, languages } = data.initial\n const formPath = sourceUrl\n const href = getHref()\n\n const { t, tComponent, tForm } = translator\n\n const component = /** @type {ComponentDef} */ ({ id: componentId })\n\n const backLink = {\n href,\n text: t(COMMON_BACK)\n }\n\n const {\n errors,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n } = buildErrors(err)\n\n const hint = componentHint && {\n text: tComponent(component, 'hint')\n }\n\n const fields = getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError,\n translator.language\n )\n\n const continueButton = {\n text: t('postcodeLookup.useThisAddress'),\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const detailsLink = {\n text: t('postcodeLookup.findAnAddressInstead'),\n href\n }\n\n const selector = languages?.length ? { languages } : {}\n\n return {\n step: steps.manual,\n showTitle: true,\n name: tForm('title'),\n serviceUrl: formPath,\n pageTitle: tComponent(component, 'title'),\n backLink,\n errors,\n hint,\n fields,\n buttons: { continueButton, detailsLink },\n t,\n language: translator.language,\n ...selector\n }\n}\n\n/** @typedef { ValidationErrorItem | undefined } OptionalValidationErrorItem */\n\n/**\n * @import { ObjectSchema, ValidationErrorItem } from 'joi'\n * @import { ComponentDef } from '@defra/forms-model'\n * @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { Translator } from '~/src/server/plugins/engine/i18n/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,15 @@
1
+ /**
2
+ * Get the session state associated with this journey
3
+ * @param {PostcodeLookupRequest} request
4
+ */
5
+ export function getSessionState(request: PostcodeLookupRequest): PostcodeLookupSessionData;
6
+ /**
7
+ * Get a cached translator, or create a new one if not in the cache
8
+ * @param {PostcodeLookupRequest} request
9
+ * @param {PostcodeLookupDispatchData} initial
10
+ * @param { string | string[] | undefined } language
11
+ */
12
+ export function getDispatchTranslator(request: PostcodeLookupRequest, initial: PostcodeLookupDispatchData, language: string | string[] | undefined): Promise<import("../../engine/i18n/types.js").Translator>;
1
13
  /**
2
14
  * Initialises and dispatches the request to the postcode lookup journey
3
15
  * @param {FormRequestPayload} request - the source page
@@ -10,9 +22,11 @@ export function dispatch(request: FormRequestPayload, h: FormResponseToolkit, in
10
22
  * @param {PostcodeLookupConfiguration} options - ordnance survey api key
11
23
  */
12
24
  export function getRoutes(options: PostcodeLookupConfiguration): (ServerRoute<PostcodeLookupGetRequestRefs> | ServerRoute<PostcodeLookupPostRequestRefs>)[];
25
+ import type { PostcodeLookupRequest } from '../../../../server/plugins/postcode-lookup/types.js';
26
+ import type { PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js';
27
+ import type { PostcodeLookupDispatchData } from '../../../../server/plugins/postcode-lookup/types.js';
13
28
  import type { FormRequestPayload } from '../../../../server/routes/types.js';
14
29
  import type { FormResponseToolkit } from '../../../../server/routes/types.js';
15
- import type { PostcodeLookupDispatchData } from '../../../../server/plugins/postcode-lookup/types.js';
16
30
  import type { PostcodeLookupConfiguration } from '../../../../server/plugins/postcode-lookup/types.js';
17
31
  import type { PostcodeLookupGetRequestRefs } from '../../../../server/plugins/postcode-lookup/types.js';
18
32
  import type { ServerRoute } from '@hapi/hapi';
@@ -2,15 +2,17 @@ import Boom from '@hapi/boom';
2
2
  import { StatusCodes } from 'http-status-codes';
3
3
  import Joi from 'joi';
4
4
  import { EXTERNAL_STATE_APPENDAGE } from "../../../constants.js";
5
+ import { getCachedPluginTranslator } from "../../engine/i18n/form.js";
5
6
  import { JOURNEY_BASE_URL, createDetailsPayloadSchema, createManualPayloadSchema, createSelectPayloadSchema, detailsViewModel, manualViewModel, selectViewModel, stepSchema, steps } from "../models/index.js";
6
7
  import * as service from "../service.js";
8
+ import { resolveLanguage } from "../../../utils/utils.js";
7
9
  const viewName = 'postcode-lookup-details';
8
10
 
9
11
  /**
10
12
  * Get the session state associated with this journey
11
13
  * @param {PostcodeLookupRequest} request
12
14
  */
13
- function getSessionState(request) {
15
+ export function getSessionState(request) {
14
16
  /**
15
17
  * @type {PostcodeLookupSessionData | null | undefined}
16
18
  */
@@ -46,6 +48,29 @@ function flashComponentState(request, componentName, address) {
46
48
  };
47
49
  request.yar.flash(EXTERNAL_STATE_APPENDAGE, appendage, true);
48
50
  }
51
+ /**
52
+ * Get a cached translator, or create a new one if not in the cache
53
+ * @param {PostcodeLookupRequest} request
54
+ * @param {PostcodeLookupDispatchData} initial
55
+ * @param { string | string[] | undefined } language
56
+ */
57
+ export async function getDispatchTranslator(request, initial, language) {
58
+ const {
59
+ formId,
60
+ formStatus
61
+ } = initial;
62
+
63
+ // Override language if passed as a query param
64
+ if (language) {
65
+ request.yar.set('language', language);
66
+ }
67
+ const typedReq = /** @type {AnyFormRequest} */ /** @type {any} */request;
68
+ const lang = resolveLanguage(typedReq);
69
+ const translator = await getCachedPluginTranslator(typedReq, /** @type {FormMetadata} */{
70
+ id: formId
71
+ }, formStatus, lang);
72
+ return translator;
73
+ }
49
74
 
50
75
  /**
51
76
  * Initialises and dispatches the request to the postcode lookup journey
@@ -84,21 +109,24 @@ function getRoute() {
84
109
  return {
85
110
  method: 'GET',
86
111
  path: JOURNEY_BASE_URL,
87
- handler(request, h) {
112
+ async handler(request, h) {
88
113
  const {
89
114
  query
90
115
  } = request;
91
116
  const {
92
- step
117
+ step,
118
+ language
93
119
  } = query;
94
120
  const session = getSessionState(request);
95
- const model = step === steps.manual ? manualViewModel(session) : detailsViewModel(session);
121
+ const translator = await getDispatchTranslator(request, session.initial, language);
122
+ const model = step === steps.manual ? manualViewModel(session, translator) : detailsViewModel(session, translator);
96
123
  return h.view(viewName, model);
97
124
  },
98
125
  options: {
99
126
  validate: {
100
127
  query: Joi.object().keys({
101
- step: Joi.string().allow(steps.details, steps.manual).optional()
128
+ step: Joi.string().allow(steps.details, steps.manual).optional(),
129
+ language: Joi.string().allow('en-GB', 'cy').optional()
102
130
  }).optional()
103
131
  }
104
132
  }
@@ -147,6 +175,19 @@ function postRoute(options) {
147
175
  };
148
176
  }
149
177
 
178
+ /**
179
+ * Validate a payload against a schema. Joi types the value as `any` when
180
+ * validation fails, so it is typed here as the partially converted payload.
181
+ * @template TSchema
182
+ * @param {ObjectSchema<TSchema>} schema
183
+ * @param {unknown} payload
184
+ * @param {ValidationOptions} [options]
185
+ * @returns {{ value: TSchema, error: undefined } | { value: TSchema | undefined, error: ValidationError }}
186
+ */
187
+ function validatePayload(schema, payload, options) {
188
+ return schema.validate(payload, options);
189
+ }
190
+
150
191
  /**
151
192
  * Post handler for the details step
152
193
  * @param {PostcodeLookupPostRequest} request
@@ -158,14 +199,15 @@ async function detailsPostHandler(request, h, options) {
158
199
  const {
159
200
  ordnanceSurveyApiKey: apiKey
160
201
  } = options;
161
- const language = session.initial.language ?? 'en-GB';
202
+ const translator = await getDispatchTranslator(request, session.initial, request.query.language);
203
+ const language = translator.language;
162
204
  const {
163
205
  value: details,
164
206
  error
165
- } = createDetailsPayloadSchema(language).validate(request.payload);
207
+ } = validatePayload(createDetailsPayloadSchema(language), request.payload);
166
208
  let model;
167
209
  if (error) {
168
- model = detailsViewModel(session, details, error);
210
+ model = detailsViewModel(session, translator, details, error);
169
211
  return h.view(viewName, model);
170
212
  }
171
213
  const {
@@ -182,7 +224,7 @@ async function detailsPostHandler(request, h, options) {
182
224
  model = await selectViewModel({
183
225
  session,
184
226
  apiKey
185
- });
227
+ }, translator);
186
228
  return h.view(viewName, model);
187
229
  }
188
230
 
@@ -197,16 +239,17 @@ async function selectPostHandler(request, h, options) {
197
239
  const {
198
240
  ordnanceSurveyApiKey: apiKey
199
241
  } = options;
200
- const language = session.initial.language ?? 'en-GB';
242
+ const translator = await getDispatchTranslator(request, session.initial, request.query.language);
243
+ const language = translator.language;
201
244
  const {
202
245
  value: select,
203
246
  error
204
- } = createSelectPayloadSchema(language).validate(request.payload);
247
+ } = validatePayload(createSelectPayloadSchema(language), request.payload);
205
248
  if (error) {
206
249
  const model = await selectViewModel({
207
250
  session,
208
251
  apiKey
209
- }, select, error);
252
+ }, translator, select, error);
210
253
  return h.view(viewName, model);
211
254
  }
212
255
  const addresses = await service.searchByUPRN(select.uprn, apiKey);
@@ -229,17 +272,18 @@ async function selectPostHandler(request, h, options) {
229
272
  * @param {PostcodeLookupPostRequest} request
230
273
  * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h
231
274
  */
232
- function manualPostHandler(request, h) {
275
+ async function manualPostHandler(request, h) {
233
276
  const session = getSessionState(request);
234
- const language = session.initial.language ?? 'en-GB';
277
+ const translator = await getDispatchTranslator(request, session.initial, request.query.language);
278
+ const language = translator.language;
235
279
  const {
236
280
  value: manual,
237
281
  error
238
- } = createManualPayloadSchema(language).validate(request.payload, {
282
+ } = validatePayload(createManualPayloadSchema(language), request.payload, {
239
283
  abortEarly: false
240
284
  });
241
285
  if (error) {
242
- const model = manualViewModel(session, manual, error);
286
+ const model = manualViewModel(session, translator, manual, error);
243
287
  return h.view(viewName, model);
244
288
  }
245
289
  const {
@@ -254,8 +298,10 @@ function manualPostHandler(request, h) {
254
298
 
255
299
  /**
256
300
  * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'
257
- * @import { PostcodeLookupManualPayload, PostcodeLookupDetailsPayload, PostcodeLookupSelectPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js'
301
+ * @import { ObjectSchema, ValidationError, ValidationOptions } from 'joi'
302
+ * @import { FormMetadata } from '@defra/forms-model'
303
+ * @import { PostcodeLookupManualPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js'
258
304
  * @import { FormRequestPayload, FormResponseToolkit } from '../../../../server/routes/types.js'
259
- * @import { ExternalStateAppendage } from '../../../../server/plugins/engine/types.js'
305
+ * @import { AnyFormRequest, ExternalStateAppendage } from '../../../../server/plugins/engine/types.js'
260
306
  */
261
307
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","JOURNEY_BASE_URL","createDetailsPayloadSchema","createManualPayloadSchema","createSelectPayloadSchema","detailsViewModel","manualViewModel","selectViewModel","stepSchema","steps","service","viewName","getSessionState","request","state","yar","get","badRequest","flashComponentState","componentName","address","addressState","addressLine1","addressLine2","town","county","postcode","uprn","undefined","appendage","component","data","flash","dispatch","h","initial","details","postcodeQuery","buildingNameQuery","set","query","step","redirect","code","SEE_OTHER","getRoutes","options","getRoute","postRoute","method","path","handler","session","model","manual","view","validate","object","keys","string","allow","optional","payload","detailsPostHandler","select","selectPostHandler","manualPostHandler","unknown","ordnanceSurveyApiKey","apiKey","language","value","error","addresses","searchByUPRN","property","at","internal","sourceUrl","abortEarly"],"sources":["../../../../../src/server/plugins/postcode-lookup/routes/index.js"],"sourcesContent":["import Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\nimport Joi from 'joi'\n\nimport { EXTERNAL_STATE_APPENDAGE } from '~/src/server/constants.js'\nimport {\n JOURNEY_BASE_URL,\n createDetailsPayloadSchema,\n createManualPayloadSchema,\n createSelectPayloadSchema,\n detailsViewModel,\n manualViewModel,\n selectViewModel,\n stepSchema,\n steps\n} from '~/src/server/plugins/postcode-lookup/models/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\n\nconst viewName = 'postcode-lookup-details'\n\n/**\n * Get the session state associated with this journey\n * @param {PostcodeLookupRequest} request\n */\nfunction getSessionState(request) {\n /**\n * @type {PostcodeLookupSessionData | null | undefined}\n */\n const state = request.yar.get(JOURNEY_BASE_URL)\n\n if (!state) {\n throw Boom.badRequest(\n `No postcode lookup data found for ${JOURNEY_BASE_URL}`\n )\n }\n\n return state\n}\n\n/**\n * Flash form component state\n * @param {PostcodeLookupRequest} request - the request\n * @param {string} componentName - the component name\n * @param {Address | PostcodeLookupManualPayload} address - the address from ordnance survey or manually entered\n */\nfunction flashComponentState(request, componentName, address) {\n const addressState = {\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2,\n town: address.town,\n county: address.county,\n postcode: address.postcode,\n uprn: 'uprn' in address && address.uprn ? address.uprn : undefined\n }\n\n /**\n * @type {ExternalStateAppendage}\n */\n const appendage = {\n component: componentName,\n data: addressState\n }\n\n request.yar.flash(EXTERNAL_STATE_APPENDAGE, appendage, true)\n}\n\n/**\n * Initialises and dispatches the request to the postcode lookup journey\n * @param {FormRequestPayload} request - the source page\n * @param {FormResponseToolkit} h - the source page\n * @param {PostcodeLookupDispatchData} initial - the source data\n */\nexport function dispatch(request, h, initial) {\n /**\n * @type {PostcodeLookupSessionData}\n */\n const data = {\n initial,\n details: { postcodeQuery: '', buildingNameQuery: '' }\n }\n\n request.yar.set(JOURNEY_BASE_URL, data)\n\n const query = initial.step ? `?step=${initial.step}` : ''\n\n return h.redirect(`${JOURNEY_BASE_URL}${query}`).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Gets the postcode lookup routes\n * @param {PostcodeLookupConfiguration} options - ordnance survey api key\n */\nexport function getRoutes(options) {\n return [getRoute(), postRoute(options)]\n}\n\n/**\n * @returns {ServerRoute<PostcodeLookupGetRequestRefs>}\n */\nfunction getRoute() {\n return {\n method: 'GET',\n path: JOURNEY_BASE_URL,\n handler(request, h) {\n const { query } = request\n const { step } = query\n const session = getSessionState(request)\n\n const model =\n step === steps.manual\n ? manualViewModel(session)\n : detailsViewModel(session)\n\n return h.view(viewName, model)\n },\n options: {\n validate: {\n query: Joi.object()\n .keys({\n step: Joi.string().allow(steps.details, steps.manual).optional()\n })\n .optional()\n }\n }\n }\n}\n\n/**\n * @param {PostcodeLookupConfiguration} options\n * @returns {ServerRoute<PostcodeLookupPostRequestRefs>}\n */\nfunction postRoute(options) {\n return {\n method: 'POST',\n path: JOURNEY_BASE_URL,\n async handler(request, h) {\n const { payload } = request\n const { step } = payload\n\n switch (step) {\n case steps.details: {\n return detailsPostHandler(request, h, options)\n }\n case steps.select: {\n return selectPostHandler(request, h, options)\n }\n case steps.manual: {\n return manualPostHandler(request, h)\n }\n default:\n throw Boom.badRequest(`Invalid step ${step}`)\n }\n },\n options: {\n validate: {\n payload: Joi.object()\n .keys({\n step: stepSchema\n })\n .unknown(true)\n }\n }\n }\n}\n\n/**\n * Post handler for the details step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function detailsPostHandler(request, h, options) {\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const language = session.initial.language ?? 'en-GB'\n const { value: details, error } = createDetailsPayloadSchema(\n language\n ).validate(request.payload)\n\n let model\n\n if (error) {\n model = detailsViewModel(session, details, error)\n\n return h.view(viewName, model)\n }\n\n const { postcodeQuery, buildingNameQuery } = details\n session.details = { postcodeQuery, buildingNameQuery }\n\n // Store the updated session\n request.yar.set(JOURNEY_BASE_URL, session)\n\n model = await selectViewModel({ session, apiKey })\n\n return h.view(viewName, model)\n}\n\n/**\n * Post handler for the select step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function selectPostHandler(request, h, options) {\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const language = session.initial.language ?? 'en-GB'\n const { value: select, error } = createSelectPayloadSchema(language).validate(\n request.payload\n )\n\n if (error) {\n const model = await selectViewModel({ session, apiKey }, select, error)\n\n return h.view(viewName, model)\n }\n\n const addresses = await service.searchByUPRN(select.uprn, apiKey)\n const property = addresses.at(0)\n\n if (!property) {\n throw Boom.internal(`UPRN ${property} not found`)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, property)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Post handler for the manual step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n */\nfunction manualPostHandler(request, h) {\n const session = getSessionState(request)\n const language = session.initial.language ?? 'en-GB'\n\n const { value: manual, error } = createManualPayloadSchema(language).validate(\n request.payload,\n {\n abortEarly: false\n }\n )\n\n if (error) {\n const model = manualViewModel(session, manual, error)\n\n return h.view(viewName, model)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, manual)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'\n * @import { PostcodeLookupManualPayload, PostcodeLookupDetailsPayload, PostcodeLookupSelectPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { FormRequestPayload, FormResponseToolkit } from '~/src/server/routes/types.js'\n * @import { ExternalStateAppendage } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","getCachedPluginTranslator","JOURNEY_BASE_URL","createDetailsPayloadSchema","createManualPayloadSchema","createSelectPayloadSchema","detailsViewModel","manualViewModel","selectViewModel","stepSchema","steps","service","resolveLanguage","viewName","getSessionState","request","state","yar","get","badRequest","flashComponentState","componentName","address","addressState","addressLine1","addressLine2","town","county","postcode","uprn","undefined","appendage","component","data","flash","getDispatchTranslator","initial","language","formId","formStatus","set","typedReq","lang","translator","id","dispatch","h","details","postcodeQuery","buildingNameQuery","query","step","redirect","code","SEE_OTHER","getRoutes","options","getRoute","postRoute","method","path","handler","session","model","manual","view","validate","object","keys","string","allow","optional","payload","detailsPostHandler","select","selectPostHandler","manualPostHandler","unknown","validatePayload","schema","ordnanceSurveyApiKey","apiKey","value","error","addresses","searchByUPRN","property","at","internal","sourceUrl","abortEarly"],"sources":["../../../../../src/server/plugins/postcode-lookup/routes/index.js"],"sourcesContent":["import Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\nimport Joi from 'joi'\n\nimport { EXTERNAL_STATE_APPENDAGE } from '~/src/server/constants.js'\nimport { getCachedPluginTranslator } from '~/src/server/plugins/engine/i18n/form.js'\nimport {\n JOURNEY_BASE_URL,\n createDetailsPayloadSchema,\n createManualPayloadSchema,\n createSelectPayloadSchema,\n detailsViewModel,\n manualViewModel,\n selectViewModel,\n stepSchema,\n steps\n} from '~/src/server/plugins/postcode-lookup/models/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\nimport { resolveLanguage } from '~/src/server/utils/utils.js'\n\nconst viewName = 'postcode-lookup-details'\n\n/**\n * Get the session state associated with this journey\n * @param {PostcodeLookupRequest} request\n */\nexport function getSessionState(request) {\n /**\n * @type {PostcodeLookupSessionData | null | undefined}\n */\n const state = request.yar.get(JOURNEY_BASE_URL)\n\n if (!state) {\n throw Boom.badRequest(\n `No postcode lookup data found for ${JOURNEY_BASE_URL}`\n )\n }\n\n return state\n}\n\n/**\n * Flash form component state\n * @param {PostcodeLookupRequest} request - the request\n * @param {string} componentName - the component name\n * @param {Address | PostcodeLookupManualPayload} address - the address from ordnance survey or manually entered\n */\nfunction flashComponentState(request, componentName, address) {\n const addressState = {\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2,\n town: address.town,\n county: address.county,\n postcode: address.postcode,\n uprn: 'uprn' in address && address.uprn ? address.uprn : undefined\n }\n\n /**\n * @type {ExternalStateAppendage}\n */\n const appendage = {\n component: componentName,\n data: addressState\n }\n\n request.yar.flash(EXTERNAL_STATE_APPENDAGE, appendage, true)\n}\n/**\n * Get a cached translator, or create a new one if not in the cache\n * @param {PostcodeLookupRequest} request\n * @param {PostcodeLookupDispatchData} initial\n * @param { string | string[] | undefined } language\n */\nexport async function getDispatchTranslator(request, initial, language) {\n const { formId, formStatus } = initial\n\n // Override language if passed as a query param\n if (language) {\n request.yar.set('language', language)\n }\n\n const typedReq = /** @type {AnyFormRequest} */ (/** @type {any} */ (request))\n const lang = resolveLanguage(typedReq)\n\n const translator = await getCachedPluginTranslator(\n typedReq,\n /** @type {FormMetadata} */ ({ id: formId }),\n formStatus,\n lang\n )\n\n return translator\n}\n\n/**\n * Initialises and dispatches the request to the postcode lookup journey\n * @param {FormRequestPayload} request - the source page\n * @param {FormResponseToolkit} h - the source page\n * @param {PostcodeLookupDispatchData} initial - the source data\n */\nexport function dispatch(request, h, initial) {\n /**\n * @type {PostcodeLookupSessionData}\n */\n const data = {\n initial,\n details: { postcodeQuery: '', buildingNameQuery: '' }\n }\n\n request.yar.set(JOURNEY_BASE_URL, data)\n\n const query = initial.step ? `?step=${initial.step}` : ''\n\n return h.redirect(`${JOURNEY_BASE_URL}${query}`).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Gets the postcode lookup routes\n * @param {PostcodeLookupConfiguration} options - ordnance survey api key\n */\nexport function getRoutes(options) {\n return [getRoute(), postRoute(options)]\n}\n\n/**\n * @returns {ServerRoute<PostcodeLookupGetRequestRefs>}\n */\nfunction getRoute() {\n return {\n method: 'GET',\n path: JOURNEY_BASE_URL,\n async handler(request, h) {\n const { query } = request\n const { step, language } = query\n const session = getSessionState(request)\n\n const translator = await getDispatchTranslator(\n request,\n session.initial,\n language\n )\n\n const model =\n step === steps.manual\n ? manualViewModel(session, translator)\n : detailsViewModel(session, translator)\n\n return h.view(viewName, model)\n },\n options: {\n validate: {\n query: Joi.object()\n .keys({\n step: Joi.string().allow(steps.details, steps.manual).optional(),\n language: Joi.string().allow('en-GB', 'cy').optional()\n })\n .optional()\n }\n }\n }\n}\n\n/**\n * @param {PostcodeLookupConfiguration} options\n * @returns {ServerRoute<PostcodeLookupPostRequestRefs>}\n */\nfunction postRoute(options) {\n return {\n method: 'POST',\n path: JOURNEY_BASE_URL,\n async handler(request, h) {\n const { payload } = request\n const { step } = payload\n\n switch (step) {\n case steps.details: {\n return detailsPostHandler(request, h, options)\n }\n case steps.select: {\n return selectPostHandler(request, h, options)\n }\n case steps.manual: {\n return manualPostHandler(request, h)\n }\n default:\n throw Boom.badRequest(`Invalid step ${step}`)\n }\n },\n options: {\n validate: {\n payload: Joi.object()\n .keys({\n step: stepSchema\n })\n .unknown(true)\n }\n }\n }\n}\n\n/**\n * Validate a payload against a schema. Joi types the value as `any` when\n * validation fails, so it is typed here as the partially converted payload.\n * @template TSchema\n * @param {ObjectSchema<TSchema>} schema\n * @param {unknown} payload\n * @param {ValidationOptions} [options]\n * @returns {{ value: TSchema, error: undefined } | { value: TSchema | undefined, error: ValidationError }}\n */\nfunction validatePayload(schema, payload, options) {\n return schema.validate(payload, options)\n}\n\n/**\n * Post handler for the details step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function detailsPostHandler(request, h, options) {\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const translator = await getDispatchTranslator(\n request,\n session.initial,\n request.query.language\n )\n const language = translator.language\n\n const { value: details, error } = validatePayload(\n createDetailsPayloadSchema(language),\n request.payload\n )\n\n let model\n\n if (error) {\n model = detailsViewModel(session, translator, details, error)\n\n return h.view(viewName, model)\n }\n\n const { postcodeQuery, buildingNameQuery } = details\n session.details = { postcodeQuery, buildingNameQuery }\n\n // Store the updated session\n request.yar.set(JOURNEY_BASE_URL, session)\n\n model = await selectViewModel({ session, apiKey }, translator)\n\n return h.view(viewName, model)\n}\n\n/**\n * Post handler for the select step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function selectPostHandler(request, h, options) {\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const translator = await getDispatchTranslator(\n request,\n session.initial,\n request.query.language\n )\n const language = translator.language\n const { value: select, error } = validatePayload(\n createSelectPayloadSchema(language),\n request.payload\n )\n\n if (error) {\n const model = await selectViewModel(\n { session, apiKey },\n translator,\n select,\n error\n )\n\n return h.view(viewName, model)\n }\n\n const addresses = await service.searchByUPRN(select.uprn, apiKey)\n const property = addresses.at(0)\n\n if (!property) {\n throw Boom.internal(`UPRN ${property} not found`)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, property)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Post handler for the manual step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n */\nasync function manualPostHandler(request, h) {\n const session = getSessionState(request)\n const translator = await getDispatchTranslator(\n request,\n session.initial,\n request.query.language\n )\n const language = translator.language\n\n const { value: manual, error } = validatePayload(\n createManualPayloadSchema(language),\n request.payload,\n { abortEarly: false }\n )\n\n if (error) {\n const model = manualViewModel(session, translator, manual, error)\n\n return h.view(viewName, model)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, manual)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'\n * @import { ObjectSchema, ValidationError, ValidationOptions } from 'joi'\n * @import { FormMetadata } from '@defra/forms-model'\n * @import { PostcodeLookupManualPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { FormRequestPayload, FormResponseToolkit } from '~/src/server/routes/types.js'\n * @import { AnyFormRequest, ExternalStateAppendage } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,84 @@
1
+ import { EN_GB } from "../../../constants.js";
2
+ import { getCachedPluginTranslator } from "../../engine/i18n/form.js";
3
+ import { getDispatchTranslator, getSessionState } from "./index.js";
4
+ jest.mock("../../engine/i18n/form.ts");
5
+ describe('postcode-lookup routes', () => {
6
+ describe('getSessionState', () => {
7
+ test('should throw if missing state', () => {
8
+ const mockRequest = /** @type { PostcodeLookupRequest} */
9
+ /** @type {any} */
10
+ {
11
+ yar: {
12
+ get: jest.fn()
13
+ }
14
+ };
15
+ expect(() => getSessionState(mockRequest)).toThrow('No postcode lookup data found for /postcode-lookup');
16
+ });
17
+ });
18
+ describe('getDispatchTranslator', () => {
19
+ test('should get default translator', async () => {
20
+ const mockSet = jest.fn();
21
+ const mockRequest = /** @type { PostcodeLookupRequest} */
22
+ /** @type {any} */
23
+ {
24
+ yar: {
25
+ get: jest.fn(),
26
+ set: mockSet
27
+ },
28
+ query: {},
29
+ server: {
30
+ // eslint-disable-next-line no-useless-computed-key
31
+ plugins: {
32
+ ['forms-engine-plugin']: {
33
+ getLanguage: () => 'en-GB'
34
+ }
35
+ }
36
+ }
37
+ };
38
+ const mockTranslator = /** @type {Translator} */{
39
+ language: EN_GB
40
+ };
41
+ jest.mocked(getCachedPluginTranslator).mockResolvedValue(mockTranslator);
42
+ const initial = /** @type {PostcodeLookupDispatchData} */{};
43
+ const res = await getDispatchTranslator(mockRequest, initial, EN_GB);
44
+ expect(mockSet).toHaveBeenCalledWith('language', EN_GB);
45
+ expect(res).toBeDefined();
46
+ expect(res.language).toBe(EN_GB);
47
+ });
48
+ test('should get welsh translator', async () => {
49
+ const mockSet = jest.fn();
50
+ const mockRequest = /** @type { PostcodeLookupRequest} */
51
+ /** @type {any} */
52
+ {
53
+ yar: {
54
+ get: jest.fn().mockResolvedValueOnce('cy'),
55
+ set: mockSet
56
+ },
57
+ query: {},
58
+ server: {
59
+ // eslint-disable-next-line no-useless-computed-key
60
+ plugins: {
61
+ ['forms-engine-plugin']: {
62
+ getLanguage: () => 'en-GB'
63
+ }
64
+ }
65
+ }
66
+ };
67
+ const mockTranslator = /** @type {Translator} */{
68
+ language: 'cy'
69
+ };
70
+ jest.mocked(getCachedPluginTranslator).mockResolvedValue(mockTranslator);
71
+ const initial = /** @type {PostcodeLookupDispatchData} */{};
72
+ const res = await getDispatchTranslator(mockRequest, initial, 'cy');
73
+ expect(mockSet).toHaveBeenCalledWith('language', 'cy');
74
+ expect(res).toBeDefined();
75
+ expect(res.language).toBe('cy');
76
+ });
77
+ });
78
+ });
79
+
80
+ /**
81
+ * @import { PostcodeLookupDispatchData, PostcodeLookupRequest } from '../../../../server/plugins/postcode-lookup/types.js'
82
+ * @import { Translator } from '../../../../server/plugins/engine/i18n/types.js'
83
+ */
84
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","names":["EN_GB","getCachedPluginTranslator","getDispatchTranslator","getSessionState","jest","mock","describe","test","mockRequest","yar","get","fn","expect","toThrow","mockSet","set","query","server","plugins","getLanguage","mockTranslator","language","mocked","mockResolvedValue","initial","res","toHaveBeenCalledWith","toBeDefined","toBe","mockResolvedValueOnce"],"sources":["../../../../../src/server/plugins/postcode-lookup/routes/index.test.js"],"sourcesContent":["import { EN_GB } from '~/src/server/constants.js'\nimport { getCachedPluginTranslator } from '~/src/server/plugins/engine/i18n/form.js'\nimport {\n getDispatchTranslator,\n getSessionState\n} from '~/src/server/plugins/postcode-lookup/routes/index.js'\n\njest.mock('~/src/server/plugins/engine/i18n/form.ts')\n\ndescribe('postcode-lookup routes', () => {\n describe('getSessionState', () => {\n test('should throw if missing state', () => {\n const mockRequest = /** @type { PostcodeLookupRequest} */ (\n /** @type {any} */\n ({\n yar: {\n get: jest.fn()\n }\n })\n )\n expect(() => getSessionState(mockRequest)).toThrow(\n 'No postcode lookup data found for /postcode-lookup'\n )\n })\n })\n\n describe('getDispatchTranslator', () => {\n test('should get default translator', async () => {\n const mockSet = jest.fn()\n const mockRequest = /** @type { PostcodeLookupRequest} */ (\n /** @type {any} */\n ({\n yar: {\n get: jest.fn(),\n set: mockSet\n },\n query: {},\n server: {\n // eslint-disable-next-line no-useless-computed-key\n plugins: { ['forms-engine-plugin']: { getLanguage: () => 'en-GB' } }\n }\n })\n )\n const mockTranslator = /** @type {Translator} */ ({ language: EN_GB })\n jest.mocked(getCachedPluginTranslator).mockResolvedValue(mockTranslator)\n const initial = /** @type {PostcodeLookupDispatchData} */ ({})\n const res = await getDispatchTranslator(mockRequest, initial, EN_GB)\n expect(mockSet).toHaveBeenCalledWith('language', EN_GB)\n expect(res).toBeDefined()\n expect(res.language).toBe(EN_GB)\n })\n\n test('should get welsh translator', async () => {\n const mockSet = jest.fn()\n const mockRequest = /** @type { PostcodeLookupRequest} */ (\n /** @type {any} */\n ({\n yar: {\n get: jest.fn().mockResolvedValueOnce('cy'),\n set: mockSet\n },\n query: {},\n server: {\n // eslint-disable-next-line no-useless-computed-key\n plugins: { ['forms-engine-plugin']: { getLanguage: () => 'en-GB' } }\n }\n })\n )\n const mockTranslator = /** @type {Translator} */ ({ language: 'cy' })\n jest.mocked(getCachedPluginTranslator).mockResolvedValue(mockTranslator)\n const initial = /** @type {PostcodeLookupDispatchData} */ ({})\n const res = await getDispatchTranslator(mockRequest, initial, 'cy')\n expect(mockSet).toHaveBeenCalledWith('language', 'cy')\n expect(res).toBeDefined()\n expect(res.language).toBe('cy')\n })\n })\n})\n\n/**\n * @import { PostcodeLookupDispatchData, PostcodeLookupRequest } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { Translator } from '~/src/server/plugins/engine/i18n/types.js'\n */\n"],"mappings":"AAAA,SAASA,KAAK;AACd,SAASC,yBAAyB;AAClC,SACEC,qBAAqB,EACrBC,eAAe;AAGjBC,IAAI,CAACC,IAAI,4BAA2C,CAAC;AAErDC,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvCA,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAChCC,IAAI,CAAC,+BAA+B,EAAE,MAAM;MAC1C,MAAMC,WAAW,GAAG;MAClB;MACC;QACCC,GAAG,EAAE;UACHC,GAAG,EAAEN,IAAI,CAACO,EAAE,CAAC;QACf;MACF,CACD;MACDC,MAAM,CAAC,MAAMT,eAAe,CAACK,WAAW,CAAC,CAAC,CAACK,OAAO,CAChD,oDACF,CAAC;IACH,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFP,QAAQ,CAAC,uBAAuB,EAAE,MAAM;IACtCC,IAAI,CAAC,+BAA+B,EAAE,YAAY;MAChD,MAAMO,OAAO,GAAGV,IAAI,CAACO,EAAE,CAAC,CAAC;MACzB,MAAMH,WAAW,GAAG;MAClB;MACC;QACCC,GAAG,EAAE;UACHC,GAAG,EAAEN,IAAI,CAACO,EAAE,CAAC,CAAC;UACdI,GAAG,EAAED;QACP,CAAC;QACDE,KAAK,EAAE,CAAC,CAAC;QACTC,MAAM,EAAE;UACN;UACAC,OAAO,EAAE;YAAE,CAAC,qBAAqB,GAAG;cAAEC,WAAW,EAAEA,CAAA,KAAM;YAAQ;UAAE;QACrE;MACF,CACD;MACD,MAAMC,cAAc,GAAG,yBAA2B;QAAEC,QAAQ,EAAErB;MAAM,CAAE;MACtEI,IAAI,CAACkB,MAAM,CAACrB,yBAAyB,CAAC,CAACsB,iBAAiB,CAACH,cAAc,CAAC;MACxE,MAAMI,OAAO,GAAG,yCAA2C,CAAC,CAAE;MAC9D,MAAMC,GAAG,GAAG,MAAMvB,qBAAqB,CAACM,WAAW,EAAEgB,OAAO,EAAExB,KAAK,CAAC;MACpEY,MAAM,CAACE,OAAO,CAAC,CAACY,oBAAoB,CAAC,UAAU,EAAE1B,KAAK,CAAC;MACvDY,MAAM,CAACa,GAAG,CAAC,CAACE,WAAW,CAAC,CAAC;MACzBf,MAAM,CAACa,GAAG,CAACJ,QAAQ,CAAC,CAACO,IAAI,CAAC5B,KAAK,CAAC;IAClC,CAAC,CAAC;IAEFO,IAAI,CAAC,6BAA6B,EAAE,YAAY;MAC9C,MAAMO,OAAO,GAAGV,IAAI,CAACO,EAAE,CAAC,CAAC;MACzB,MAAMH,WAAW,GAAG;MAClB;MACC;QACCC,GAAG,EAAE;UACHC,GAAG,EAAEN,IAAI,CAACO,EAAE,CAAC,CAAC,CAACkB,qBAAqB,CAAC,IAAI,CAAC;UAC1Cd,GAAG,EAAED;QACP,CAAC;QACDE,KAAK,EAAE,CAAC,CAAC;QACTC,MAAM,EAAE;UACN;UACAC,OAAO,EAAE;YAAE,CAAC,qBAAqB,GAAG;cAAEC,WAAW,EAAEA,CAAA,KAAM;YAAQ;UAAE;QACrE;MACF,CACD;MACD,MAAMC,cAAc,GAAG,yBAA2B;QAAEC,QAAQ,EAAE;MAAK,CAAE;MACrEjB,IAAI,CAACkB,MAAM,CAACrB,yBAAyB,CAAC,CAACsB,iBAAiB,CAACH,cAAc,CAAC;MACxE,MAAMI,OAAO,GAAG,yCAA2C,CAAC,CAAE;MAC9D,MAAMC,GAAG,GAAG,MAAMvB,qBAAqB,CAACM,WAAW,EAAEgB,OAAO,EAAE,IAAI,CAAC;MACnEZ,MAAM,CAACE,OAAO,CAAC,CAACY,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC;MACtDd,MAAM,CAACa,GAAG,CAAC,CAACE,WAAW,CAAC,CAAC;MACzBf,MAAM,CAACa,GAAG,CAACJ,QAAQ,CAAC,CAACO,IAAI,CAAC,IAAI,CAAC;IACjC,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;AACA","ignoreList":[]}
@@ -7,12 +7,19 @@ export type PostcodeLookupDispatchArgs = {
7
7
  };
8
8
  export type PostcodeLookupDispatchData = {
9
9
  sourceUrl: string;
10
+ formId: string;
10
11
  formName: string;
12
+ formStatus: FormStatus;
13
+ componentId: string;
11
14
  componentName: string;
12
15
  componentTitle: string;
13
16
  componentHint?: string;
14
17
  step?: string;
15
18
  language?: string;
19
+ languages?: {
20
+ name: string;
21
+ code: string;
22
+ }[];
16
23
  };
17
24
  export type PostcodeLookupSessionData = {
18
25
  initial: PostcodeLookupDispatchData;
@@ -39,6 +46,10 @@ export type PostcodeLookupQuery = {
39
46
  * - step
40
47
  */
41
48
  step?: string | undefined;
49
+ /**
50
+ * - language
51
+ */
52
+ language?: string | undefined;
42
53
  };
43
54
  export type PostcodeLookupDetailsPayloadProperties = {
44
55
  /**
@@ -202,4 +213,5 @@ export type DeliveryPointAddressResult = {
202
213
  */
203
214
  results?: DeliveryPointAddressItem[] | undefined;
204
215
  };
216
+ import type { FormStatus } from '@defra/forms-model';
205
217
  import type { Request } from '@hapi/hapi';
@@ -14,12 +14,16 @@
14
14
  /**
15
15
  * @typedef {{
16
16
  * sourceUrl: string,
17
+ * formId: string
17
18
  * formName: string
19
+ * formStatus: FormStatus
20
+ * componentId: string
18
21
  * componentName: string
19
22
  * componentTitle: string,
20
23
  * componentHint?: string
21
24
  * step?: string
22
25
  * language?: string
26
+ * languages?: { name: string, code: string}[]
23
27
  * }} PostcodeLookupDispatchData
24
28
  */
25
29
 
@@ -49,6 +53,7 @@
49
53
  * Postcode lookup query params
50
54
  * @typedef {object} PostcodeLookupQuery
51
55
  * @property {string} [step] - step
56
+ * @property {string} [language] - language
52
57
  */
53
58
 
54
59
  /**
@@ -140,6 +145,6 @@
140
145
 
141
146
  /**
142
147
  * @import { Request } from '@hapi/hapi'
143
- * @import { FormPayload } from '../../../server/plugins/engine/types.js'
148
+ * @import { FormStatus } from '@defra/forms-model'
144
149
  */
145
150
  //# sourceMappingURL=types.js.map