@defra/forms-engine-plugin 4.22.0 → 5.0.0-alpha

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 (309) hide show
  1. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
  2. package/.server/server/forms/simple-form.yaml +106 -3
  3. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +11 -11
  4. package/.server/server/plugins/engine/components/AutocompleteField.js +2 -2
  5. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  6. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +3 -2
  7. package/.server/server/plugins/engine/components/CheckboxesField.js +4 -9
  8. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  9. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -7
  10. package/.server/server/plugins/engine/components/ComponentCollection.js +106 -51
  11. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  12. package/.server/server/plugins/engine/components/DatePartsField.d.ts +8 -6
  13. package/.server/server/plugins/engine/components/DatePartsField.js +27 -9
  14. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  15. package/.server/server/plugins/engine/components/DeclarationField.d.ts +13 -11
  16. package/.server/server/plugins/engine/components/DeclarationField.js +31 -9
  17. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  18. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +6 -5
  19. package/.server/server/plugins/engine/components/EastingNorthingField.js +42 -22
  20. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  21. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +11 -14
  22. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -2
  23. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  24. package/.server/server/plugins/engine/components/FileUploadField.d.ts +14 -12
  25. package/.server/server/plugins/engine/components/FileUploadField.js +22 -12
  26. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  27. package/.server/server/plugins/engine/components/FormComponent.d.ts +21 -12
  28. package/.server/server/plugins/engine/components/FormComponent.js +33 -14
  29. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  30. package/.server/server/plugins/engine/components/GeospatialField.d.ts +14 -12
  31. package/.server/server/plugins/engine/components/GeospatialField.js +19 -13
  32. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  33. package/.server/server/plugins/engine/components/LatLongField.d.ts +6 -5
  34. package/.server/server/plugins/engine/components/LatLongField.js +32 -20
  35. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  36. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +7 -6
  37. package/.server/server/plugins/engine/components/ListFormComponent.js +19 -7
  38. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
  39. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +17 -16
  40. package/.server/server/plugins/engine/components/LocationFieldBase.js +2 -2
  41. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  42. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +3 -3
  43. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +2 -2
  44. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  45. package/.server/server/plugins/engine/components/Markdown.d.ts +8 -7
  46. package/.server/server/plugins/engine/components/Markdown.js +5 -2
  47. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  48. package/.server/server/plugins/engine/components/MonthYearField.d.ts +9 -7
  49. package/.server/server/plugins/engine/components/MonthYearField.js +26 -8
  50. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  51. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +10 -9
  52. package/.server/server/plugins/engine/components/MultilineTextField.js +2 -2
  53. package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -1
  54. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  55. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +14 -6
  56. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/NumberField.d.ts +10 -9
  58. package/.server/server/plugins/engine/components/NumberField.js +2 -2
  59. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  61. package/.server/server/plugins/engine/components/OsGridRefField.js +14 -6
  62. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  63. package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -10
  64. package/.server/server/plugins/engine/components/PaymentField.js +21 -8
  65. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  66. package/.server/server/plugins/engine/components/SelectField.d.ts +11 -11
  67. package/.server/server/plugins/engine/components/SelectField.js +2 -2
  68. package/.server/server/plugins/engine/components/SelectField.js.map +1 -1
  69. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +4 -4
  70. package/.server/server/plugins/engine/components/SelectionControlField.js +2 -2
  71. package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -1
  72. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +10 -9
  73. package/.server/server/plugins/engine/components/TelephoneNumberField.js +2 -2
  74. package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
  75. package/.server/server/plugins/engine/components/UkAddressField.d.ts +12 -10
  76. package/.server/server/plugins/engine/components/UkAddressField.js +29 -17
  77. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  78. package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -0
  79. package/.server/server/plugins/engine/components/YesNoField.js +9 -0
  80. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  81. package/.server/server/plugins/engine/components/helpers/components.d.ts +3 -2
  82. package/.server/server/plugins/engine/components/helpers/components.js +11 -8
  83. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  84. package/.server/server/plugins/engine/components/types.d.ts +8 -1
  85. package/.server/server/plugins/engine/components/types.js.map +1 -1
  86. package/.server/server/plugins/engine/configureEnginePlugin.js +8 -1
  87. package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
  88. package/.server/server/plugins/engine/form-context.d.ts +1 -0
  89. package/.server/server/plugins/engine/form-context.js +4 -2
  90. package/.server/server/plugins/engine/form-context.js.map +1 -1
  91. package/.server/server/plugins/engine/helpers.d.ts +1 -1
  92. package/.server/server/plugins/engine/helpers.js +8 -13
  93. package/.server/server/plugins/engine/helpers.js.map +1 -1
  94. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +39 -0
  95. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +50 -0
  96. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -0
  97. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +5 -0
  98. package/.server/server/plugins/engine/i18n/createFormTranslator.js +18 -0
  99. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -0
  100. package/.server/server/plugins/engine/i18n/createTranslator.d.ts +9 -0
  101. package/.server/server/plugins/engine/i18n/createTranslator.js +51 -0
  102. package/.server/server/plugins/engine/i18n/createTranslator.js.map +1 -0
  103. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +5 -0
  104. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +57 -0
  105. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -0
  106. package/.server/server/plugins/engine/i18n/index.d.ts +18 -0
  107. package/.server/server/plugins/engine/i18n/index.js +71 -0
  108. package/.server/server/plugins/engine/i18n/index.js.map +1 -0
  109. package/.server/server/plugins/engine/i18n/translations/cy.json +271 -0
  110. package/.server/server/plugins/engine/i18n/translations/en-GB.json +271 -0
  111. package/.server/server/plugins/engine/i18n/types.d.ts +41 -0
  112. package/.server/server/plugins/engine/i18n/types.js +2 -0
  113. package/.server/server/plugins/engine/i18n/types.js.map +1 -0
  114. package/.server/server/plugins/engine/index.js +3 -2
  115. package/.server/server/plugins/engine/index.js.map +1 -1
  116. package/.server/server/plugins/engine/models/FormModel.d.ts +9 -1
  117. package/.server/server/plugins/engine/models/FormModel.js +44 -18
  118. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  119. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +5 -2
  120. package/.server/server/plugins/engine/models/SummaryViewModel.js +44 -18
  121. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  122. package/.server/server/plugins/engine/options.js +2 -1
  123. package/.server/server/plugins/engine/options.js.map +1 -1
  124. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +4 -0
  125. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  126. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  127. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  128. package/.server/server/plugins/engine/outputFormatters/machine/v1.js +7 -6
  129. package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -1
  130. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +2 -1
  131. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +6 -3
  132. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  133. package/.server/server/plugins/engine/pageControllers/PageController.d.ts +3 -1
  134. package/.server/server/plugins/engine/pageControllers/PageController.js +11 -1
  135. package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -1
  136. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +4 -2
  137. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +52 -21
  138. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  139. package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +3 -2
  140. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +63 -26
  141. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  142. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +3 -1
  143. package/.server/server/plugins/engine/pageControllers/StartPageController.js +2 -2
  144. package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -1
  145. package/.server/server/plugins/engine/pageControllers/StatusPageController.js +12 -2
  146. package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -1
  147. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +4 -3
  148. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +45 -28
  149. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  150. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.d.ts +2 -0
  151. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js +24 -0
  152. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js.map +1 -0
  153. package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
  154. package/.server/server/plugins/engine/pageControllers/errors.js +3 -2
  155. package/.server/server/plugins/engine/pageControllers/errors.js.map +1 -1
  156. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +3 -2
  157. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +4 -4
  158. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  159. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +7 -3
  160. package/.server/server/plugins/engine/pageControllers/validationOptions.js +34 -33
  161. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  162. package/.server/server/plugins/engine/plugin.js +2 -0
  163. package/.server/server/plugins/engine/plugin.js.map +1 -1
  164. package/.server/server/plugins/engine/routes/index.js +4 -1
  165. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  166. package/.server/server/plugins/engine/routes/questions.js +5 -2
  167. package/.server/server/plugins/engine/routes/questions.js.map +1 -1
  168. package/.server/server/plugins/engine/types/index.d.ts +1 -0
  169. package/.server/server/plugins/engine/types/index.js.map +1 -1
  170. package/.server/server/plugins/engine/types/schema.js +1 -0
  171. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  172. package/.server/server/plugins/engine/types.d.ts +12 -1
  173. package/.server/server/plugins/engine/types.js.map +1 -1
  174. package/.server/server/plugins/engine/views/components/_location-field-base.html +1 -1
  175. package/.server/server/plugins/engine/views/components/fileuploadfield.html +3 -3
  176. package/.server/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
  177. package/.server/server/plugins/engine/views/components/osgridreffield.html +1 -1
  178. package/.server/server/plugins/engine/views/components/paymentfield.html +8 -8
  179. package/.server/server/plugins/engine/views/components/ukaddressfield.html +4 -4
  180. package/.server/server/plugins/engine/views/confirmation.html +4 -4
  181. package/.server/server/plugins/engine/views/exit.html +4 -4
  182. package/.server/server/plugins/engine/views/file-upload.html +3 -3
  183. package/.server/server/plugins/engine/views/index.html +3 -3
  184. package/.server/server/plugins/engine/views/item-delete.html +1 -1
  185. package/.server/server/plugins/engine/views/partials/form.html +3 -3
  186. package/.server/server/plugins/engine/views/partials/preview-banner.html +4 -4
  187. package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
  188. package/.server/server/plugins/engine/views/repeat-list-summary.html +4 -4
  189. package/.server/server/plugins/engine/views/summary.html +14 -7
  190. package/.server/server/plugins/nunjucks/enviroment.test.js +10 -0
  191. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
  192. package/.server/server/plugins/nunjucks/environment.d.ts +8 -0
  193. package/.server/server/plugins/nunjucks/environment.js +13 -0
  194. package/.server/server/plugins/nunjucks/environment.js.map +1 -1
  195. package/.server/server/plugins/nunjucks/filters/answer.js +9 -1
  196. package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -1
  197. package/.server/server/plugins/nunjucks/filters/answer.test.js +13 -2
  198. package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -1
  199. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  200. package/.server/server/plugins/postcode-lookup/models/index.d.ts +24 -19
  201. package/.server/server/plugins/postcode-lookup/models/index.js +83 -76
  202. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  203. package/.server/server/plugins/postcode-lookup/routes/index.js +7 -13
  204. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  205. package/.server/server/plugins/postcode-lookup/types.d.ts +1 -0
  206. package/.server/server/plugins/postcode-lookup/types.js +1 -0
  207. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  208. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  209. package/.server/server/types.d.ts +2 -1
  210. package/.server/server/types.js.map +1 -1
  211. package/.server/server/utils/utils.d.ts +5 -0
  212. package/.server/server/utils/utils.js +16 -0
  213. package/.server/server/utils/utils.js.map +1 -1
  214. package/.server/typings/hapi/index.d.js.map +1 -1
  215. package/package.json +3 -2
  216. package/src/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
  217. package/src/server/forms/simple-form.yaml +106 -3
  218. package/src/server/plugins/engine/components/AutocompleteField.ts +3 -6
  219. package/src/server/plugins/engine/components/CheckboxesField.ts +12 -11
  220. package/src/server/plugins/engine/components/ComponentCollection.ts +143 -61
  221. package/src/server/plugins/engine/components/DatePartsField.ts +33 -11
  222. package/src/server/plugins/engine/components/DeclarationField.ts +37 -14
  223. package/src/server/plugins/engine/components/EastingNorthingField.ts +83 -22
  224. package/src/server/plugins/engine/components/EmailAddressField.ts +4 -7
  225. package/src/server/plugins/engine/components/FileUploadField.ts +28 -22
  226. package/src/server/plugins/engine/components/FormComponent.ts +49 -12
  227. package/src/server/plugins/engine/components/GeospatialField.ts +36 -21
  228. package/src/server/plugins/engine/components/LatLongField.ts +52 -21
  229. package/src/server/plugins/engine/components/ListFormComponent.ts +26 -10
  230. package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -8
  231. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +3 -3
  232. package/src/server/plugins/engine/components/Markdown.ts +7 -3
  233. package/src/server/plugins/engine/components/MonthYearField.ts +32 -10
  234. package/src/server/plugins/engine/components/MultilineTextField.ts +5 -8
  235. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +25 -11
  236. package/src/server/plugins/engine/components/NumberField.ts +3 -4
  237. package/src/server/plugins/engine/components/OsGridRefField.ts +25 -9
  238. package/src/server/plugins/engine/components/PaymentField.ts +22 -12
  239. package/src/server/plugins/engine/components/SelectField.ts +3 -6
  240. package/src/server/plugins/engine/components/SelectionControlField.ts +7 -8
  241. package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -7
  242. package/src/server/plugins/engine/components/UkAddressField.ts +33 -18
  243. package/src/server/plugins/engine/components/YesNoField.ts +10 -0
  244. package/src/server/plugins/engine/components/helpers/components.ts +13 -6
  245. package/src/server/plugins/engine/components/types.ts +9 -0
  246. package/src/server/plugins/engine/configureEnginePlugin.ts +12 -1
  247. package/src/server/plugins/engine/form-context.ts +8 -2
  248. package/src/server/plugins/engine/helpers.ts +10 -18
  249. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +69 -0
  250. package/src/server/plugins/engine/i18n/createFormTranslator.ts +33 -0
  251. package/src/server/plugins/engine/i18n/createTranslator.ts +61 -0
  252. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +61 -0
  253. package/src/server/plugins/engine/i18n/index.ts +80 -0
  254. package/src/server/plugins/engine/i18n/translations/cy.json +271 -0
  255. package/src/server/plugins/engine/i18n/translations/en-GB.json +271 -0
  256. package/src/server/plugins/engine/i18n/types.ts +62 -0
  257. package/src/server/plugins/engine/index.ts +4 -2
  258. package/src/server/plugins/engine/models/FormModel.ts +59 -23
  259. package/src/server/plugins/engine/models/SummaryViewModel.ts +68 -25
  260. package/src/server/plugins/engine/options.js +2 -1
  261. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +5 -0
  262. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -3
  263. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +9 -8
  264. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +7 -3
  265. package/src/server/plugins/engine/pageControllers/PageController.ts +12 -1
  266. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +53 -21
  267. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +66 -29
  268. package/src/server/plugins/engine/pageControllers/StartPageController.ts +7 -2
  269. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +10 -2
  270. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +53 -24
  271. package/src/server/plugins/engine/pageControllers/__stubs__/translator.ts +28 -0
  272. package/src/server/plugins/engine/pageControllers/errors.ts +4 -2
  273. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +11 -4
  274. package/src/server/plugins/engine/pageControllers/validationOptions.ts +43 -53
  275. package/src/server/plugins/engine/plugin.ts +2 -0
  276. package/src/server/plugins/engine/routes/index.ts +9 -1
  277. package/src/server/plugins/engine/routes/questions.ts +5 -1
  278. package/src/server/plugins/engine/types/index.ts +5 -0
  279. package/src/server/plugins/engine/types/schema.ts +1 -0
  280. package/src/server/plugins/engine/types.ts +10 -0
  281. package/src/server/plugins/engine/views/components/_location-field-base.html +1 -1
  282. package/src/server/plugins/engine/views/components/fileuploadfield.html +3 -3
  283. package/src/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
  284. package/src/server/plugins/engine/views/components/osgridreffield.html +1 -1
  285. package/src/server/plugins/engine/views/components/paymentfield.html +8 -8
  286. package/src/server/plugins/engine/views/components/ukaddressfield.html +4 -4
  287. package/src/server/plugins/engine/views/confirmation.html +4 -4
  288. package/src/server/plugins/engine/views/exit.html +4 -4
  289. package/src/server/plugins/engine/views/file-upload.html +3 -3
  290. package/src/server/plugins/engine/views/index.html +3 -3
  291. package/src/server/plugins/engine/views/item-delete.html +1 -1
  292. package/src/server/plugins/engine/views/partials/form.html +3 -3
  293. package/src/server/plugins/engine/views/partials/preview-banner.html +4 -4
  294. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
  295. package/src/server/plugins/engine/views/repeat-list-summary.html +4 -4
  296. package/src/server/plugins/engine/views/summary.html +14 -7
  297. package/src/server/plugins/nunjucks/environment.js +14 -0
  298. package/src/server/plugins/nunjucks/filters/answer.js +12 -1
  299. package/src/server/plugins/postcode-lookup/models/index.js +144 -87
  300. package/src/server/plugins/postcode-lookup/routes/index.js +13 -16
  301. package/src/server/plugins/postcode-lookup/types.js +1 -0
  302. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  303. package/src/server/types.ts +2 -0
  304. package/src/server/utils/utils.js +14 -0
  305. package/src/typings/hapi/index.d.ts +1 -0
  306. package/.server/server/plugins/engine/components/constants.d.ts +0 -1
  307. package/.server/server/plugins/engine/components/constants.js +0 -2
  308. package/.server/server/plugins/engine/components/constants.js.map +0 -1
  309. package/src/server/plugins/engine/components/constants.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Joi","service","crumbSchema","postcodeQueryFieldName","buildingNameQueryFieldName","uprnFieldName","line1FieldName","line2FieldName","townFieldName","countyFieldName","postcodeFieldName","selectLabelText","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","id","name","label","hint","value","errorMessage","getSelectFields","payload","type","uprn","items","concat","map","formatted","getManualFields","addressLine1","addressLine2","classes","town","county","postcode","stepSchema","string","valid","Object","keys","required","sharedPayloadSchemaKeys","crumb","step","detailsPayloadSchema","object","pattern","trim","messages","allow","selectPayloadSchema","manualPayloadSchema","getHref","query","detailsViewModel","data","componentTitle","pageTitle","formName","sourceUrl","initial","backLink","fields","continueButton","manualLink","showTitle","serviceUrl","buttons","selectViewModel","session","title","formPath","searchAgainLink","manualViewModel","componentHint","detailsLink"],"sources":["../../../../../src/server/plugins/postcode-lookup/models/index.js"],"sourcesContent":["import Joi from 'joi'\n\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 selectLabelText = 'Select an address'\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 */\nfunction getDetailsFields(details, postcodeQueryError, buildingNameQueryError) {\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n label: {\n text: 'Postcode'\n },\n hint: {\n text: 'For example, AA3 1AB'\n },\n value: details?.postcodeQuery,\n errorMessage: postcodeQueryError && { text: postcodeQueryError.message }\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n label: {\n text: 'Building name or number (optional)'\n },\n hint: {\n text: 'For example, 15 or Prospect Cottage'\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 */\nfunction getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses\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: selectLabelText\n }\n : undefined,\n value: singleAddress ? singleAddress.uprn : payload?.uprn,\n errorMessage: uprnError && { text: uprnError.message },\n items: hasMultipleAddresses\n ? [{ text: selectLabelText, 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 */\nfunction getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n) {\n return {\n [line1FieldName]: {\n id: line1FieldName,\n name: line1FieldName,\n label: {\n text: 'Address line 1'\n },\n value: payload?.addressLine1,\n errorMessage: line1Error && { text: line1Error.message }\n },\n [line2FieldName]: {\n id: line2FieldName,\n name: line2FieldName,\n label: {\n text: 'Address line 2 (optional)'\n },\n value: payload?.addressLine2,\n errorMessage: line2Error && { text: line2Error.message }\n },\n [townFieldName]: {\n id: townFieldName,\n name: townFieldName,\n label: {\n text: 'Town or city'\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: 'County (optional)'\n },\n value: payload?.county,\n errorMessage: countyError && { text: countyError.message }\n },\n [postcodeFieldName]: {\n id: postcodeFieldName,\n name: postcodeFieldName,\n label: {\n text: 'Postcode'\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 * @type {ObjectSchema<PostcodeLookupDetailsPayload>}\n */\nexport const detailsPayloadSchema = 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':\n 'Enter a valid postcode or enter an address manually',\n '*': 'Enter a postcode'\n }),\n [buildingNameQueryFieldName]: Joi.string()\n .trim()\n .required()\n .allow('')\n .trim()\n })\n .required()\n\n/**\n * Postcode lookup select form payload schema\n * @type {ObjectSchema<PostcodeLookupSelectPayload>}\n */\nexport const selectPayloadSchema = Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [uprnFieldName]: Joi.string().required().messages({\n '*': selectLabelText\n })\n })\n .required()\n\n/**\n * Postcode lookup manual form payload schema\n * @type {ObjectSchema<PostcodeLookupManualPayload>}\n */\nexport const manualPayloadSchema = Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [line1FieldName]: Joi.string().trim().required().messages({\n '*': 'Enter address line 1'\n }),\n [line2FieldName]: Joi.string().trim().allow('').required(),\n [townFieldName]: Joi.string().trim().required().messages({\n '*': 'Enter town or city'\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': 'Enter a valid postcode',\n '*': 'Enter postcode'\n })\n })\n .required()\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 { componentTitle: pageTitle, formName, sourceUrl } = data.initial\n\n const backLink = {\n href: sourceUrl\n }\n\n const { errors, postcodeQueryError, buildingNameQueryError } =\n buildErrors(err)\n\n // Model fields\n const fields = getDetailsFields(\n payload ?? data.details,\n postcodeQueryError,\n buildingNameQueryError\n )\n\n // Model buttons\n const continueButton = {\n text: 'Find address',\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: 'enter address manually',\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\n // Search for addresses\n const {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n } = await getAddresses(postcodeQuery, buildingNameQuery, apiKey)\n\n const title = hasAddresses ? initial.componentTitle : 'No address found'\n const formPath = initial.sourceUrl\n const href = getHref()\n\n const backLink = { href }\n\n const { errors, uprnError } = buildErrors(err)\n\n // Model fields\n const fields = getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses\n )\n\n const searchAgainLink = {\n text: 'Search again',\n href\n }\n\n // Model buttons\n const continueButton = {\n href: hasAddresses ? undefined : href,\n text: hasAddresses ? 'Use this address' : 'Search again',\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: 'enter address manually',\n href: `${href}?step=${steps.manual}`\n }\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 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 { componentTitle, sourceUrl, componentHint } = 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 // Model hint\n const hint = componentHint && {\n text: componentHint\n }\n\n // Model fields\n const fields = getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n )\n\n // Model buttons\n const continueButton = {\n text: 'Use this address',\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const detailsLink = {\n text: 'find an address instead',\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","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":[]}
@@ -2,7 +2,7 @@ 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 { JOURNEY_BASE_URL, detailsPayloadSchema, detailsViewModel, manualPayloadSchema, manualViewModel, selectPayloadSchema, selectViewModel, stepSchema, steps } from "../models/index.js";
5
+ import { JOURNEY_BASE_URL, createDetailsPayloadSchema, createManualPayloadSchema, createSelectPayloadSchema, detailsViewModel, manualViewModel, selectViewModel, stepSchema, steps } from "../models/index.js";
6
6
  import * as service from "../service.js";
7
7
  const viewName = 'postcode-lookup-details';
8
8
 
@@ -158,13 +158,11 @@ async function detailsPostHandler(request, h, options) {
158
158
  const {
159
159
  ordnanceSurveyApiKey: apiKey
160
160
  } = options;
161
-
162
- /** @type {{ value: PostcodeLookupDetailsPayload, error?: import('joi').ValidationError }} */
163
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
161
+ const language = session.initial.language ?? 'en-GB';
164
162
  const {
165
163
  value: details,
166
164
  error
167
- } = detailsPayloadSchema.validate(request.payload);
165
+ } = createDetailsPayloadSchema(language).validate(request.payload);
168
166
  let model;
169
167
  if (error) {
170
168
  model = detailsViewModel(session, details, error);
@@ -199,13 +197,11 @@ async function selectPostHandler(request, h, options) {
199
197
  const {
200
198
  ordnanceSurveyApiKey: apiKey
201
199
  } = options;
202
-
203
- /** @type {{ value: PostcodeLookupSelectPayload, error?: import('joi').ValidationError }} */
204
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
200
+ const language = session.initial.language ?? 'en-GB';
205
201
  const {
206
202
  value: select,
207
203
  error
208
- } = selectPayloadSchema.validate(request.payload);
204
+ } = createSelectPayloadSchema(language).validate(request.payload);
209
205
  if (error) {
210
206
  const model = await selectViewModel({
211
207
  session,
@@ -235,13 +231,11 @@ async function selectPostHandler(request, h, options) {
235
231
  */
236
232
  function manualPostHandler(request, h) {
237
233
  const session = getSessionState(request);
238
-
239
- /** @type {{ value: PostcodeLookupManualPayload, error?: import('joi').ValidationError }} */
240
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
234
+ const language = session.initial.language ?? 'en-GB';
241
235
  const {
242
236
  value: manual,
243
237
  error
244
- } = manualPayloadSchema.validate(request.payload, {
238
+ } = createManualPayloadSchema(language).validate(request.payload, {
245
239
  abortEarly: false
246
240
  });
247
241
  if (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","JOURNEY_BASE_URL","detailsPayloadSchema","detailsViewModel","manualPayloadSchema","manualViewModel","selectPayloadSchema","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","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 detailsPayloadSchema,\n detailsViewModel,\n manualPayloadSchema,\n manualViewModel,\n selectPayloadSchema,\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\n /** @type {{ value: PostcodeLookupDetailsPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: details, error } = detailsPayloadSchema.validate(\n request.payload\n )\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\n /** @type {{ value: PostcodeLookupSelectPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: select, error } = selectPayloadSchema.validate(request.payload)\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\n /** @type {{ value: PostcodeLookupManualPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: manual, error } = manualPayloadSchema.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","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":[]}
@@ -12,6 +12,7 @@ export type PostcodeLookupDispatchData = {
12
12
  componentTitle: string;
13
13
  componentHint?: string;
14
14
  step?: string;
15
+ language?: string;
15
16
  };
16
17
  export type PostcodeLookupSessionData = {
17
18
  initial: PostcodeLookupDispatchData;
@@ -19,6 +19,7 @@
19
19
  * componentTitle: string,
20
20
  * componentHint?: string
21
21
  * step?: string
22
+ * language?: string
22
23
  * }} PostcodeLookupDispatchData
23
24
  */
24
25
 
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/postcode-lookup/types.js"],"sourcesContent":["/**\n * @typedef {{\n * ordnanceSurveyApiKey: string\n * }} PostcodeLookupConfiguration\n */\n\n/**\n * @typedef {{\n * name: string\n * step?: string\n * }} PostcodeLookupDispatchArgs\n */\n\n/**\n * @typedef {{\n * sourceUrl: string,\n * formName: string\n * componentName: string\n * componentTitle: string,\n * componentHint?: string\n * step?: string\n * }} PostcodeLookupDispatchData\n */\n\n/**\n * @typedef {{\n * initial: PostcodeLookupDispatchData\n * details: PostcodeLookupDetailsData\n * }} PostcodeLookupSessionData\n */\n\n//\n// Model types\n//\n\n/**\n * The postcode lookup details form view model data\n * @typedef {object} PostcodeLookupDetailsData\n * @property {string} postcodeQuery - postcode query\n * @property {string} buildingNameQuery - Building name or number query\n */\n\n//\n// Route types\n//\n\n/**\n * Postcode lookup query params\n * @typedef {object} PostcodeLookupQuery\n * @property {string} [step] - step\n */\n\n/**\n * @typedef {object} PostcodeLookupDetailsPayloadProperties\n * @property {string} step - step\n */\n\n/**\n * @typedef {PostcodeLookupDetailsData & PostcodeLookupDetailsPayloadProperties} PostcodeLookupDetailsPayload\n */\n\n/**\n * @typedef {object} PostcodeLookupSelectPayload\n * @property {string} step - step\n * @property {string} uprn - postcode\n */\n\n/**\n * Postcode lookup get request\n * @typedef {object} PostcodeLookupGetRequestRefs\n * @property {PostcodeLookupQuery} Query - Request query\n */\n\n/**\n * Postcode lookup post request\n * @typedef {object} PostcodeLookupPostRequestRefs\n * @property {PostcodeLookupDetailsPayload | PostcodeLookupSelectPayload} Payload - Request payload\n */\n\n/**\n * @typedef {PostcodeLookupGetRequestRefs | PostcodeLookupPostRequestRefs} PostcodeLookupRequestRefs\n * @typedef {Request<PostcodeLookupGetRequestRefs>} PostcodeLookupGetRequest\n * @typedef {Request<PostcodeLookupPostRequestRefs>} PostcodeLookupPostRequest\n * @typedef {PostcodeLookupGetRequest | PostcodeLookupPostRequest} PostcodeLookupRequest\n */\n\n/**\n * @typedef {object} PostcodeLookupManualPayload\n * @property {string} addressLine1 - The address line 1\n * @property {string} addressLine2 - The address line 2\n * @property {string} town - The address town or city\n * @property {string} county - The address county\n * @property {string} postcode - The address postcode\n */\n\n//\n// Service types\n//\n\n/**\n * @typedef {object} Address\n * @property {string} uprn - The unique property reference\n * @property {string} address - The full address\n * @property {string} addressLine1 - Address line 1\n * @property {string} addressLine2 - Address line 2\n * @property {string} town - Address town\n * @property {string} county - Address county\n * @property {string} postcode - Address postcode\n * @property {string} formatted - The full formatted address\n */\n\n/**\n * OS places address response\n * @typedef {object} DeliveryPointAddress\n * @property {string} UPRN - Unique property reference number\n * @property {string} UDPRN - Unique delivery point Reference Number\n * @property {string} ADDRESS - Address\n * @property {string} ORGANISATION_NAME - Organisation name\n * @property {string} SUB_BUILDING_NAME - Sub building name\n * @property {string} BUILDING_NAME - Building name\n * @property {string} BUILDING_NUMBER - Building number\n * @property {string} THOROUGHFARE_NAME - Throughfare name\n * @property {string} DEPENDENT_LOCALITY - Dependent locality\n * @property {string} POST_TOWN - Post town\n * @property {string} POSTCODE - Postcode\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressItem\n * @property {DeliveryPointAddress} DPA - Delivery point address\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressResult\n * @property {DeliveryPointAddressItem[]} [results] - Delivery point address results\n */\n\n/**\n * @import { Request } from '@hapi/hapi'\n * @import { FormPayload } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/postcode-lookup/types.js"],"sourcesContent":["/**\n * @typedef {{\n * ordnanceSurveyApiKey: string\n * }} PostcodeLookupConfiguration\n */\n\n/**\n * @typedef {{\n * name: string\n * step?: string\n * }} PostcodeLookupDispatchArgs\n */\n\n/**\n * @typedef {{\n * sourceUrl: string,\n * formName: string\n * componentName: string\n * componentTitle: string,\n * componentHint?: string\n * step?: string\n * language?: string\n * }} PostcodeLookupDispatchData\n */\n\n/**\n * @typedef {{\n * initial: PostcodeLookupDispatchData\n * details: PostcodeLookupDetailsData\n * }} PostcodeLookupSessionData\n */\n\n//\n// Model types\n//\n\n/**\n * The postcode lookup details form view model data\n * @typedef {object} PostcodeLookupDetailsData\n * @property {string} postcodeQuery - postcode query\n * @property {string} buildingNameQuery - Building name or number query\n */\n\n//\n// Route types\n//\n\n/**\n * Postcode lookup query params\n * @typedef {object} PostcodeLookupQuery\n * @property {string} [step] - step\n */\n\n/**\n * @typedef {object} PostcodeLookupDetailsPayloadProperties\n * @property {string} step - step\n */\n\n/**\n * @typedef {PostcodeLookupDetailsData & PostcodeLookupDetailsPayloadProperties} PostcodeLookupDetailsPayload\n */\n\n/**\n * @typedef {object} PostcodeLookupSelectPayload\n * @property {string} step - step\n * @property {string} uprn - postcode\n */\n\n/**\n * Postcode lookup get request\n * @typedef {object} PostcodeLookupGetRequestRefs\n * @property {PostcodeLookupQuery} Query - Request query\n */\n\n/**\n * Postcode lookup post request\n * @typedef {object} PostcodeLookupPostRequestRefs\n * @property {PostcodeLookupDetailsPayload | PostcodeLookupSelectPayload} Payload - Request payload\n */\n\n/**\n * @typedef {PostcodeLookupGetRequestRefs | PostcodeLookupPostRequestRefs} PostcodeLookupRequestRefs\n * @typedef {Request<PostcodeLookupGetRequestRefs>} PostcodeLookupGetRequest\n * @typedef {Request<PostcodeLookupPostRequestRefs>} PostcodeLookupPostRequest\n * @typedef {PostcodeLookupGetRequest | PostcodeLookupPostRequest} PostcodeLookupRequest\n */\n\n/**\n * @typedef {object} PostcodeLookupManualPayload\n * @property {string} addressLine1 - The address line 1\n * @property {string} addressLine2 - The address line 2\n * @property {string} town - The address town or city\n * @property {string} county - The address county\n * @property {string} postcode - The address postcode\n */\n\n//\n// Service types\n//\n\n/**\n * @typedef {object} Address\n * @property {string} uprn - The unique property reference\n * @property {string} address - The full address\n * @property {string} addressLine1 - Address line 1\n * @property {string} addressLine2 - Address line 2\n * @property {string} town - Address town\n * @property {string} county - Address county\n * @property {string} postcode - Address postcode\n * @property {string} formatted - The full formatted address\n */\n\n/**\n * OS places address response\n * @typedef {object} DeliveryPointAddress\n * @property {string} UPRN - Unique property reference number\n * @property {string} UDPRN - Unique delivery point Reference Number\n * @property {string} ADDRESS - Address\n * @property {string} ORGANISATION_NAME - Organisation name\n * @property {string} SUB_BUILDING_NAME - Sub building name\n * @property {string} BUILDING_NAME - Building name\n * @property {string} BUILDING_NUMBER - Building number\n * @property {string} THOROUGHFARE_NAME - Throughfare name\n * @property {string} DEPENDENT_LOCALITY - Dependent locality\n * @property {string} POST_TOWN - Post town\n * @property {string} POSTCODE - Postcode\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressItem\n * @property {DeliveryPointAddress} DPA - Delivery point address\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressResult\n * @property {DeliveryPointAddressItem[]} [results] - Delivery point address results\n */\n\n/**\n * @import { Request } from '@hapi/hapi'\n * @import { FormPayload } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -13,7 +13,7 @@
13
13
  <div class="govuk-grid-column-two-thirds">
14
14
  {% if errors %}
15
15
  {{ govukErrorSummary({
16
- titleText: "There is a problem",
16
+ titleText: t('errors.title'),
17
17
  errorList: errors
18
18
  }) }}
19
19
  {% endif %}
@@ -38,7 +38,7 @@
38
38
 
39
39
  {% if hasAddresses %}
40
40
  <p class="govuk-body">
41
- {{addressCount}} address{{ "es" if hasMultipleAddresses }} found for {{ detailsHtml | safe }}. <a href="{{ searchAgainLink.href }}" class="govuk-link govuk-link--no-visited-state">{{ searchAgainLink.text }}</a>
41
+ {{ addressesFoundText }} {{ detailsHtml | safe }}. <a href="{{ searchAgainLink.href }}" class="govuk-link govuk-link--no-visited-state">{{ searchAgainLink.text }}</a>
42
42
  </p>
43
43
  {% endif %}
44
44
 
@@ -53,7 +53,7 @@
53
53
  }) }}
54
54
  {% else %}
55
55
  <!-- No addresses found - show try again -->
56
- <p class="govuk-body">We could not find an address that matches {{ detailsHtml | safe }}.</p>
56
+ <p class="govuk-body">{{ noAddressFoundText }} {{ detailsHtml | safe }}.</p>
57
57
  {% endif %}
58
58
  {% case "manual" %}
59
59
  <!-- Postcode lookup manual entry -->
@@ -3,7 +3,7 @@ import { type Server } from '@hapi/hapi';
3
3
  import { type FormModel } from '../server/plugins/engine/models/index.js';
4
4
  import { type DetailItem } from '../server/plugins/engine/models/types.js';
5
5
  import { type PageController } from '../server/plugins/engine/pageControllers/PageController.js';
6
- import { type FormContext, type OnRequestCallback, type PluginOptions, type PreparePageEventRequestOptions } from '../server/plugins/engine/types.js';
6
+ import { type FormContext, type GetLanguageHandler, type OnRequestCallback, type PluginOptions, type PreparePageEventRequestOptions } from '../server/plugins/engine/types.js';
7
7
  import { type PaymentService } from '../server/plugins/payment/service.js';
8
8
  import { type FormRequestPayload, type FormStatus } from '../server/routes/types.js';
9
9
  import { type CacheService } from '../server/services/cacheService.js';
@@ -38,6 +38,7 @@ export interface RouteConfig {
38
38
  cacheServiceCreator?: (server: Server) => CacheService;
39
39
  ordnanceSurveyApiKey?: string;
40
40
  ordnanceSurveyApiSecret?: string;
41
+ getLanguage?: GetLanguageHandler;
41
42
  }
42
43
  export interface OutputService {
43
44
  submit: (context: FormContext, request: FormRequestPayload, model: FormModel, emailAddress: string, items: DetailItem[], submitResponse: SubmitResponsePayload, formMetadata?: FormMetadata) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../src/server/types.ts"],"sourcesContent":["import {\n type FormDefinition,\n type FormMetadata,\n type SubmitPayload,\n type SubmitResponsePayload\n} from '@defra/forms-model'\nimport { type Server } from '@hapi/hapi'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type DetailItem } from '~/src/server/plugins/engine/models/types.js'\nimport { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'\nimport {\n type FormContext,\n type OnRequestCallback,\n type PluginOptions,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport { type PaymentService } from '~/src/server/plugins/payment/service.js'\nimport {\n type FormRequestPayload,\n type FormStatus\n} from '~/src/server/routes/types.js'\nimport { type CacheService } from '~/src/server/services/cacheService.js'\n\nexport interface FormsService {\n getFormMetadata: (slug: string) => Promise<FormMetadata>\n getFormMetadataById: (id: string) => Promise<FormMetadata>\n getFormDefinition: (\n id: string,\n state: FormStatus\n ) => Promise<FormDefinition | undefined>\n getFormSecret: (formId: string, secretName: string) => Promise<string>\n}\n\nexport interface FormSubmissionService {\n persistFiles: (\n files: { fileId: string; initiatedRetrievalKey: string }[],\n persistedRetrievalKey: string\n ) => Promise<object>\n submit: (data: SubmitPayload) => Promise<SubmitResponsePayload | undefined>\n}\n\nexport interface Services {\n formsService: FormsService\n formSubmissionService: FormSubmissionService\n outputService: OutputService\n paymentService?: PaymentService\n}\n\nexport interface RouteConfig {\n formFileName?: string\n formFilePath?: string\n enforceCsrf?: boolean\n services?: Services\n controllers?: Record<string, typeof PageController>\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n onRequest?: OnRequestCallback\n saveAndExit?: PluginOptions['saveAndExit']\n cacheServiceCreator?: (server: Server) => CacheService\n ordnanceSurveyApiKey?: string\n ordnanceSurveyApiSecret?: string\n}\n\nexport interface OutputService {\n submit: (\n context: FormContext,\n request: FormRequestPayload,\n model: FormModel,\n emailAddress: string,\n items: DetailItem[],\n submitResponse: SubmitResponsePayload,\n formMetadata?: FormMetadata\n ) => Promise<void>\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/server/types.ts"],"sourcesContent":["import {\n type FormDefinition,\n type FormMetadata,\n type SubmitPayload,\n type SubmitResponsePayload\n} from '@defra/forms-model'\nimport { type Server } from '@hapi/hapi'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type DetailItem } from '~/src/server/plugins/engine/models/types.js'\nimport { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'\nimport {\n type FormContext,\n type GetLanguageHandler,\n type OnRequestCallback,\n type PluginOptions,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport { type PaymentService } from '~/src/server/plugins/payment/service.js'\nimport {\n type FormRequestPayload,\n type FormStatus\n} from '~/src/server/routes/types.js'\nimport { type CacheService } from '~/src/server/services/cacheService.js'\n\nexport interface FormsService {\n getFormMetadata: (slug: string) => Promise<FormMetadata>\n getFormMetadataById: (id: string) => Promise<FormMetadata>\n getFormDefinition: (\n id: string,\n state: FormStatus\n ) => Promise<FormDefinition | undefined>\n getFormSecret: (formId: string, secretName: string) => Promise<string>\n}\n\nexport interface FormSubmissionService {\n persistFiles: (\n files: { fileId: string; initiatedRetrievalKey: string }[],\n persistedRetrievalKey: string\n ) => Promise<object>\n submit: (data: SubmitPayload) => Promise<SubmitResponsePayload | undefined>\n}\n\nexport interface Services {\n formsService: FormsService\n formSubmissionService: FormSubmissionService\n outputService: OutputService\n paymentService?: PaymentService\n}\n\nexport interface RouteConfig {\n formFileName?: string\n formFilePath?: string\n enforceCsrf?: boolean\n services?: Services\n controllers?: Record<string, typeof PageController>\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n onRequest?: OnRequestCallback\n saveAndExit?: PluginOptions['saveAndExit']\n cacheServiceCreator?: (server: Server) => CacheService\n ordnanceSurveyApiKey?: string\n ordnanceSurveyApiSecret?: string\n getLanguage?: GetLanguageHandler\n}\n\nexport interface OutputService {\n submit: (\n context: FormContext,\n request: FormRequestPayload,\n model: FormModel,\n emailAddress: string,\n items: DetailItem[],\n submitResponse: SubmitResponsePayload,\n formMetadata?: FormMetadata\n ) => Promise<void>\n}\n"],"mappings":"","ignoreList":[]}
@@ -11,3 +11,8 @@ export function applyTraceHeaders(existingHeaders?: Record<string, string> | und
11
11
  * @returns
12
12
  */
13
13
  export function isValidUUID(str: string): boolean;
14
+ /**
15
+ * @param {AnyFormRequest} request
16
+ */
17
+ export function resolveLanguage(request: AnyFormRequest): string;
18
+ import type { AnyFormRequest } from '../../server/plugins/engine/types.js';
@@ -1,6 +1,7 @@
1
1
  import { getTraceId } from '@defra/hapi-tracing';
2
2
  import Joi from 'joi';
3
3
  import { config } from "../../config/index.js";
4
+ import { getPluginOptions } from "../plugins/engine/helpers.js";
4
5
 
5
6
  /**
6
7
  * Returns a set of headers to use in an HTTP request, merging them with any existing headers in options.
@@ -30,4 +31,19 @@ export function isValidUUID(str) {
30
31
  } = Joi.string().uuid().validate(str);
31
32
  return error === undefined;
32
33
  }
34
+
35
+ /**
36
+ * @param {AnyFormRequest} request
37
+ */
38
+ export function resolveLanguage(request) {
39
+ const {
40
+ getLanguage
41
+ } = getPluginOptions(request.server);
42
+ return getLanguage?.(request.query, request.yar) ?? 'en-GB';
43
+ }
44
+
45
+ /**
46
+ * @import { FormMetadata } from '@defra/forms-model'
47
+ * @import { AnyFormRequest } from '../../server/plugins/engine/types.js'
48
+ */
33
49
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["getTraceId","Joi","config","applyTraceHeaders","existingHeaders","header","get","traceId","headers","undefined","Object","assign","isValidUUID","str","error","string","uuid","validate"],"sources":["../../../src/server/utils/utils.js"],"sourcesContent":["import { getTraceId } from '@defra/hapi-tracing'\nimport Joi from 'joi'\n\nimport { config } from '~/src/config/index.js'\n\n/**\n * Returns a set of headers to use in an HTTP request, merging them with any existing headers in options.\n * @param {Record<string, string> | undefined} [existingHeaders] - Optional existing headers to merge with the tracing headers.\n * @param {string} [header] - The tracing header name to use.\n * @returns {Record<string, string> | undefined} The merged headers, or undefined if no tracing header is available.\n */\nexport function applyTraceHeaders(\n existingHeaders,\n header = config.get('tracing').header\n) {\n if (!header) {\n return existingHeaders\n }\n\n const traceId = getTraceId()\n\n const headers = traceId ? { [header]: traceId } : undefined\n\n return existingHeaders ? Object.assign(existingHeaders, headers) : headers\n}\n\n/**\n * Validates if a string conforms to the uuid structure\n * @param {string} str\n * @returns\n */\nexport function isValidUUID(str) {\n const { error } = Joi.string().uuid().validate(str)\n return error === undefined\n}\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,qBAAqB;AAChD,OAAOC,GAAG,MAAM,KAAK;AAErB,SAASC,MAAM;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,eAAe,EACfC,MAAM,GAAGH,MAAM,CAACI,GAAG,CAAC,SAAS,CAAC,CAACD,MAAM,EACrC;EACA,IAAI,CAACA,MAAM,EAAE;IACX,OAAOD,eAAe;EACxB;EAEA,MAAMG,OAAO,GAAGP,UAAU,CAAC,CAAC;EAE5B,MAAMQ,OAAO,GAAGD,OAAO,GAAG;IAAE,CAACF,MAAM,GAAGE;EAAQ,CAAC,GAAGE,SAAS;EAE3D,OAAOL,eAAe,GAAGM,MAAM,CAACC,MAAM,CAACP,eAAe,EAAEI,OAAO,CAAC,GAAGA,OAAO;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,WAAWA,CAACC,GAAG,EAAE;EAC/B,MAAM;IAAEC;EAAM,CAAC,GAAGb,GAAG,CAACc,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,QAAQ,CAACJ,GAAG,CAAC;EACnD,OAAOC,KAAK,KAAKL,SAAS;AAC5B","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["getTraceId","Joi","config","getPluginOptions","applyTraceHeaders","existingHeaders","header","get","traceId","headers","undefined","Object","assign","isValidUUID","str","error","string","uuid","validate","resolveLanguage","request","getLanguage","server","query","yar"],"sources":["../../../src/server/utils/utils.js"],"sourcesContent":["import { getTraceId } from '@defra/hapi-tracing'\nimport Joi from 'joi'\n\nimport { config } from '~/src/config/index.js'\nimport { getPluginOptions } from '~/src/server/plugins/engine/helpers.js'\n\n/**\n * Returns a set of headers to use in an HTTP request, merging them with any existing headers in options.\n * @param {Record<string, string> | undefined} [existingHeaders] - Optional existing headers to merge with the tracing headers.\n * @param {string} [header] - The tracing header name to use.\n * @returns {Record<string, string> | undefined} The merged headers, or undefined if no tracing header is available.\n */\nexport function applyTraceHeaders(\n existingHeaders,\n header = config.get('tracing').header\n) {\n if (!header) {\n return existingHeaders\n }\n\n const traceId = getTraceId()\n\n const headers = traceId ? { [header]: traceId } : undefined\n\n return existingHeaders ? Object.assign(existingHeaders, headers) : headers\n}\n\n/**\n * Validates if a string conforms to the uuid structure\n * @param {string} str\n * @returns\n */\nexport function isValidUUID(str) {\n const { error } = Joi.string().uuid().validate(str)\n return error === undefined\n}\n\n/**\n * @param {AnyFormRequest} request\n */\nexport function resolveLanguage(request) {\n const { getLanguage } = getPluginOptions(request.server)\n return getLanguage?.(request.query, request.yar) ?? 'en-GB'\n}\n\n/**\n * @import { FormMetadata } from '@defra/forms-model'\n * @import { AnyFormRequest } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,qBAAqB;AAChD,OAAOC,GAAG,MAAM,KAAK;AAErB,SAASC,MAAM;AACf,SAASC,gBAAgB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,eAAe,EACfC,MAAM,GAAGJ,MAAM,CAACK,GAAG,CAAC,SAAS,CAAC,CAACD,MAAM,EACrC;EACA,IAAI,CAACA,MAAM,EAAE;IACX,OAAOD,eAAe;EACxB;EAEA,MAAMG,OAAO,GAAGR,UAAU,CAAC,CAAC;EAE5B,MAAMS,OAAO,GAAGD,OAAO,GAAG;IAAE,CAACF,MAAM,GAAGE;EAAQ,CAAC,GAAGE,SAAS;EAE3D,OAAOL,eAAe,GAAGM,MAAM,CAACC,MAAM,CAACP,eAAe,EAAEI,OAAO,CAAC,GAAGA,OAAO;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,WAAWA,CAACC,GAAG,EAAE;EAC/B,MAAM;IAAEC;EAAM,CAAC,GAAGd,GAAG,CAACe,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,QAAQ,CAACJ,GAAG,CAAC;EACnD,OAAOC,KAAK,KAAKL,SAAS;AAC5B;;AAEA;AACA;AACA;AACA,OAAO,SAASS,eAAeA,CAACC,OAAO,EAAE;EACvC,MAAM;IAAEC;EAAY,CAAC,GAAGlB,gBAAgB,CAACiB,OAAO,CAACE,MAAM,CAAC;EACxD,OAAOD,WAAW,GAAGD,OAAO,CAACG,KAAK,EAAEH,OAAO,CAACI,GAAG,CAAC,IAAI,OAAO;AAC7D;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["import { type Plugin } from '@hapi/hapi'\nimport { type ServerYar, type Yar } from '@hapi/yar'\nimport { type Logger } from 'pino'\n\nimport {\n type COMPONENT_STATE_ERROR,\n type EXTERNAL_STATE_APPENDAGE,\n type EXTERNAL_STATE_PAYLOAD\n} from '~/src/server/constants.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n type AnyFormRequest,\n type FormSubmissionError,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.ts'\nimport { type CacheService } from '~/src/server/services/index.js'\n\ndeclare module '@hapi/yar' {\n interface YarFlashes {\n [EXTERNAL_STATE_APPENDAGE]: object\n [EXTERNAL_STATE_PAYLOAD]: object\n [COMPONENT_STATE_ERROR]: string\n [key: string]: { errors: FormSubmissionError[] }\n }\n}\n\ndeclare module '@hapi/hapi' {\n // Here we are decorating Hapi interface types with\n // props from plugins which doesn't export @types\n interface PluginProperties {\n crumb: {\n generate?: (request: AnyRequest) => string\n }\n 'forms-engine-plugin': {\n baseLayoutPath: string\n cacheService: CacheService\n viewContext?: (\n request: AnyFormRequest | null\n ) => Record<string, unknown> | Promise<Record<string, unknown>>\n saveAndExit?: PluginOptions['saveAndExit']\n baseUrl: string\n services: PluginOptions['services']\n }\n }\n\n interface Request {\n logger: Logger\n yar: Yar\n }\n\n interface RequestApplicationState {\n model?: FormModel\n }\n\n interface Server {\n logger: Logger\n yar: ServerYar\n }\n\n interface ServerApplicationState {\n model?: FormModel\n models?: Map<string, { model: FormModel; updatedAt: Date }>\n }\n}\n\ndeclare module 'blankie' {\n declare const blankie: {\n plugin: Plugin<Record<string, boolean | string | string[]>>\n }\n\n export = blankie\n}\n\ndeclare module 'blipp' {\n declare const blipp: {\n plugin: Plugin\n }\n\n export = blipp\n}\n\ndeclare module 'hapi-pulse' {\n declare const hapiPulse: {\n plugin: Plugin<{\n timeout: number\n }>\n }\n\n export = hapiPulse\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["import { type Plugin } from '@hapi/hapi'\nimport { type ServerYar, type Yar } from '@hapi/yar'\nimport { type Logger } from 'pino'\n\nimport {\n type COMPONENT_STATE_ERROR,\n type EXTERNAL_STATE_APPENDAGE,\n type EXTERNAL_STATE_PAYLOAD\n} from '~/src/server/constants.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n type AnyFormRequest,\n type FormSubmissionError,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.ts'\nimport { type CacheService } from '~/src/server/services/index.js'\n\ndeclare module '@hapi/yar' {\n interface YarFlashes {\n [EXTERNAL_STATE_APPENDAGE]: object\n [EXTERNAL_STATE_PAYLOAD]: object\n [COMPONENT_STATE_ERROR]: string\n [key: string]: { errors: FormSubmissionError[] }\n }\n}\n\ndeclare module '@hapi/hapi' {\n // Here we are decorating Hapi interface types with\n // props from plugins which doesn't export @types\n interface PluginProperties {\n crumb: {\n generate?: (request: AnyRequest) => string\n }\n 'forms-engine-plugin': {\n baseLayoutPath: string\n cacheService: CacheService\n viewContext?: (\n request: AnyFormRequest | null\n ) => Record<string, unknown> | Promise<Record<string, unknown>>\n saveAndExit?: PluginOptions['saveAndExit']\n getLanguage?: PluginOptions['getLanguage']\n baseUrl: string\n services: PluginOptions['services']\n }\n }\n\n interface Request {\n logger: Logger\n yar: Yar\n }\n\n interface RequestApplicationState {\n model?: FormModel\n }\n\n interface Server {\n logger: Logger\n yar: ServerYar\n }\n\n interface ServerApplicationState {\n model?: FormModel\n models?: Map<string, { model: FormModel; updatedAt: Date }>\n }\n}\n\ndeclare module 'blankie' {\n declare const blankie: {\n plugin: Plugin<Record<string, boolean | string | string[]>>\n }\n\n export = blankie\n}\n\ndeclare module 'blipp' {\n declare const blipp: {\n plugin: Plugin\n }\n\n export = blipp\n}\n\ndeclare module 'hapi-pulse' {\n declare const hapiPulse: {\n plugin: Plugin<{\n timeout: number\n }>\n }\n\n export = hapiPulse\n}\n"],"mappings":"","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "4.22.0",
3
+ "version": "5.0.0-alpha",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "files": [
@@ -83,7 +83,7 @@
83
83
  },
84
84
  "engines": {
85
85
  "node": ">=22.11.0 <25.0.0",
86
- "npm": ">=10.9.0 <11.6.4"
86
+ "npm": ">=10.9.0 <=11.17.0"
87
87
  },
88
88
  "license": "SEE LICENSE IN LICENSE",
89
89
  "dependencies": {
@@ -126,6 +126,7 @@
126
126
  "highlight.js": "^11.11.1",
127
127
  "http-status-codes": "^2.3.0",
128
128
  "humanize-duration": "^3.33.1",
129
+ "i18next": "^26.0.5",
129
130
  "ioredis": "^5.8.2",
130
131
  "joi": "^17.13.3",
131
132
  "liquidjs": "^10.24.0",
@@ -242,20 +242,6 @@ pages:
242
242
  content: 'Fill in this field'
243
243
  options:
244
244
  required: false
245
- next:
246
- - path: '/pay-for-your-licence'
247
- - title: Pay for your licence
248
- path: '/pay-for-your-licence'
249
- section: section
250
- components:
251
- - name: licencePayment
252
- title: Unicorn breeder licence fee
253
- type: PaymentField
254
- hint: You'll be redirected to GOV.UK Pay to complete your payment
255
- options:
256
- required: true
257
- amount: 50
258
- description: Unicorn breeder annual licence fee
259
245
  next:
260
246
  - path: '/summary'
261
247
  conditions: