@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":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template","govukRebrand"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\nexport function govukRebrand() {\n return true\n}\n\nenvironment.addGlobal('govukRebrand', govukRebrand())\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","t","i18nT","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template","govukRebrand","tGlobal","key","opts"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport { t as i18nT } from '~/src/server/plugins/engine/i18n/index.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\nexport function govukRebrand() {\n return true\n}\n\nenvironment.addGlobal('govukRebrand', govukRebrand())\n\n/**\n * Global t() function — en-GB fallback for templates not wired to a specific language.\n * Per-request page controllers override this by passing t in their view model.\n * @param {string} key\n * @param {Record<string, unknown>} [opts]\n * @returns {string}\n */\nexport function tGlobal(key, opts) {\n return i18nT(key, 'en-GB', opts)\n}\n\nenvironment.addGlobal('t', tGlobal)\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -16,7 +16,15 @@ export function answer(name) {
16
16
  if (!component?.isFormComponent) {
17
17
  return undefined;
18
18
  }
19
- return getAnswer(/** @type {Field} */component, context.relevantState);
19
+ const field = /** @type {Field} */component;
20
+ const {
21
+ translator
22
+ } = context;
23
+
24
+ // Fallback if no translator in the context
25
+ return getAnswer(field, context.relevantState, translator ?? field.model.createTranslator(), {
26
+ format: 'summary'
27
+ });
20
28
  }
21
29
 
22
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"answer.js","names":["getAnswer","answer","name","context","ctx","undefined","component","componentMap","get","isFormComponent","relevantState"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\n\n/**\n * Nunjucks filter to get the answer for a component\n * @this {NunjucksContext}\n * @param {string} name - The name of the component to check\n */\nexport function answer(name) {\n const { context } = this.ctx\n\n if (!context) {\n return undefined\n }\n\n const component = context.componentMap.get(name)\n\n if (!component?.isFormComponent) {\n return undefined\n }\n\n return getAnswer(/** @type {Field} */ (component), context.relevantState)\n}\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { Field } from '~/src/server/plugins/engine/components/helpers/components.js'\n */\n"],"mappings":"AAAA,SAASA,SAAS;;AAElB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAACC,IAAI,EAAE;EAC3B,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAI,CAACC,GAAG;EAE5B,IAAI,CAACD,OAAO,EAAE;IACZ,OAAOE,SAAS;EAClB;EAEA,MAAMC,SAAS,GAAGH,OAAO,CAACI,YAAY,CAACC,GAAG,CAACN,IAAI,CAAC;EAEhD,IAAI,CAACI,SAAS,EAAEG,eAAe,EAAE;IAC/B,OAAOJ,SAAS;EAClB;EAEA,OAAOL,SAAS,CAAC,oBAAsBM,SAAS,EAAGH,OAAO,CAACO,aAAa,CAAC;AAC3E;;AAEA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"answer.js","names":["getAnswer","answer","name","context","ctx","undefined","component","componentMap","get","isFormComponent","field","translator","relevantState","model","createTranslator","format"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\n\n/**\n * Nunjucks filter to get the answer for a component\n * @this {NunjucksContext}\n * @param {string} name - The name of the component to check\n */\nexport function answer(name) {\n const { context } = this.ctx\n\n if (!context) {\n return undefined\n }\n\n const component = context.componentMap.get(name)\n\n if (!component?.isFormComponent) {\n return undefined\n }\n\n const field = /** @type {Field} */ (component)\n const { translator } = context\n\n // Fallback if no translator in the context\n return getAnswer(\n field,\n context.relevantState,\n translator ?? field.model.createTranslator(),\n {\n format: 'summary'\n }\n )\n}\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { Field } from '~/src/server/plugins/engine/components/helpers/components.js'\n */\n"],"mappings":"AAAA,SAASA,SAAS;;AAElB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAACC,IAAI,EAAE;EAC3B,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAI,CAACC,GAAG;EAE5B,IAAI,CAACD,OAAO,EAAE;IACZ,OAAOE,SAAS;EAClB;EAEA,MAAMC,SAAS,GAAGH,OAAO,CAACI,YAAY,CAACC,GAAG,CAACN,IAAI,CAAC;EAEhD,IAAI,CAACI,SAAS,EAAEG,eAAe,EAAE;IAC/B,OAAOJ,SAAS;EAClB;EAEA,MAAMK,KAAK,GAAG,oBAAsBJ,SAAU;EAC9C,MAAM;IAAEK;EAAW,CAAC,GAAGR,OAAO;;EAE9B;EACA,OAAOH,SAAS,CACdU,KAAK,EACLP,OAAO,CAACS,aAAa,EACrBD,UAAU,IAAID,KAAK,CAACG,KAAK,CAACC,gBAAgB,CAAC,CAAC,EAC5C;IACEC,MAAM,EAAE;EACV,CACF,CAAC;AACH;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -52,13 +52,24 @@ describe('answer Nunjucks filter', () => {
52
52
  it('returns the answer', () => {
53
53
  const mockFormComponent = {
54
54
  isFormComponent: true,
55
- someProperty: 'value'
55
+ someProperty: 'value',
56
+ model: {
57
+ createTranslator: jest.fn().mockImplementation(() => {
58
+ return {
59
+ t: jest.fn().mockReturnValue('translated text')
60
+ };
61
+ })
62
+ }
56
63
  };
57
64
  mockThis.ctx.context?.componentMap.set('validFormComponent',
58
65
  // @ts-expect-error - simplified mock component for testing
59
66
  mockFormComponent);
60
67
  const result = answer.call(mockThis, 'validFormComponent');
61
- expect(getAnswer).toHaveBeenCalledWith(mockFormComponent, mockThis.ctx.context?.relevantState);
68
+ expect(getAnswer).toHaveBeenCalledWith(mockFormComponent, mockThis.ctx.context?.relevantState, {
69
+ t: expect.anything()
70
+ }, {
71
+ format: 'summary'
72
+ });
62
73
  expect(result).toBe('test answer');
63
74
  });
64
75
  });
@@ -1 +1 @@
1
- {"version":3,"file":"answer.test.js","names":["getAnswer","answer","jest","mock","fn","describe","mockThis","beforeEach","clearAllMocks","ctx","context","componentMap","Map","relevantState","someState","mocked","mockReturnValue","it","undefined","result","call","expect","toBeUndefined","not","toHaveBeenCalled","set","isFormComponent","mockFormComponent","someProperty","toHaveBeenCalledWith","toBe"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.test.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'\n\njest.mock(\n '~/src/server/plugins/engine/components/helpers/components.ts',\n () => ({\n getAnswer: jest.fn()\n })\n)\n\ndescribe('answer Nunjucks filter', () => {\n /** @type { NunjucksContext } */\n let mockThis\n\n beforeEach(() => {\n jest.clearAllMocks()\n\n mockThis = /** @type {NunjucksContext} */ (\n /** @type {unknown} */ ({\n ctx: {\n context: {\n componentMap: new Map(),\n relevantState: { someState: 'value' }\n }\n }\n })\n )\n\n jest.mocked(getAnswer).mockReturnValue('test answer')\n })\n\n describe('missing context', () => {\n it('returns undefined', () => {\n mockThis.ctx.context = undefined\n\n const result = answer.call(mockThis, 'componentName')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('component lookup', () => {\n it('returns undefined for non-existent component', () => {\n const result = answer.call(mockThis, 'nonExistentComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('non-form component', () => {\n it('returns undefined', () => {\n mockThis.ctx.context?.componentMap.set(\n 'nonFormComponent',\n // @ts-expect-error - simplified mock component for testing\n { isFormComponent: false }\n )\n\n const result = answer.call(mockThis, 'nonFormComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('valid form component', () => {\n it('returns the answer', () => {\n const mockFormComponent = {\n isFormComponent: true,\n someProperty: 'value'\n }\n mockThis.ctx.context?.componentMap.set(\n 'validFormComponent',\n // @ts-expect-error - simplified mock component for testing\n mockFormComponent\n )\n\n const result = answer.call(mockThis, 'validFormComponent')\n\n expect(getAnswer).toHaveBeenCalledWith(\n mockFormComponent,\n mockThis.ctx.context?.relevantState\n )\n expect(result).toBe('test answer')\n })\n })\n})\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n */\n"],"mappings":"AAAA,SAASA,SAAS;AAClB,SAASC,MAAM;AAEfC,IAAI,CAACC,IAAI,kDAEP,OAAO;EACLH,SAAS,EAAEE,IAAI,CAACE,EAAE,CAAC;AACrB,CAAC,CACH,CAAC;AAEDC,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvC;EACA,IAAIC,QAAQ;EAEZC,UAAU,CAAC,MAAM;IACfL,IAAI,CAACM,aAAa,CAAC,CAAC;IAEpBF,QAAQ,GAAG;IACT,sBAAwB;MACtBG,GAAG,EAAE;QACHC,OAAO,EAAE;UACPC,YAAY,EAAE,IAAIC,GAAG,CAAC,CAAC;UACvBC,aAAa,EAAE;YAAEC,SAAS,EAAE;UAAQ;QACtC;MACF;IACF,CACD;IAEDZ,IAAI,CAACa,MAAM,CAACf,SAAS,CAAC,CAACgB,eAAe,CAAC,aAAa,CAAC;EACvD,CAAC,CAAC;EAEFX,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAChCY,EAAE,CAAC,mBAAmB,EAAE,MAAM;MAC5BX,QAAQ,CAACG,GAAG,CAACC,OAAO,GAAGQ,SAAS;MAEhC,MAAMC,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,eAAe,CAAC;MAErDe,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,kBAAkB,EAAE,MAAM;IACjCY,EAAE,CAAC,8CAA8C,EAAE,MAAM;MACvD,MAAME,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,sBAAsB,CAAC;MAE5De,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,oBAAoB,EAAE,MAAM;IACnCY,EAAE,CAAC,mBAAmB,EAAE,MAAM;MAC5BX,QAAQ,CAACG,GAAG,CAACC,OAAO,EAAEC,YAAY,CAACc,GAAG,CACpC,kBAAkB;MAClB;MACA;QAAEC,eAAe,EAAE;MAAM,CAC3B,CAAC;MAED,MAAMP,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,kBAAkB,CAAC;MAExDe,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,sBAAsB,EAAE,MAAM;IACrCY,EAAE,CAAC,oBAAoB,EAAE,MAAM;MAC7B,MAAMU,iBAAiB,GAAG;QACxBD,eAAe,EAAE,IAAI;QACrBE,YAAY,EAAE;MAChB,CAAC;MACDtB,QAAQ,CAACG,GAAG,CAACC,OAAO,EAAEC,YAAY,CAACc,GAAG,CACpC,oBAAoB;MACpB;MACAE,iBACF,CAAC;MAED,MAAMR,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,oBAAoB,CAAC;MAE1De,MAAM,CAACrB,SAAS,CAAC,CAAC6B,oBAAoB,CACpCF,iBAAiB,EACjBrB,QAAQ,CAACG,GAAG,CAACC,OAAO,EAAEG,aACxB,CAAC;MACDQ,MAAM,CAACF,MAAM,CAAC,CAACW,IAAI,CAAC,aAAa,CAAC;IACpC,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"answer.test.js","names":["getAnswer","answer","jest","mock","fn","describe","mockThis","beforeEach","clearAllMocks","ctx","context","componentMap","Map","relevantState","someState","mocked","mockReturnValue","it","undefined","result","call","expect","toBeUndefined","not","toHaveBeenCalled","set","isFormComponent","mockFormComponent","someProperty","model","createTranslator","mockImplementation","t","toHaveBeenCalledWith","anything","format","toBe"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.test.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'\n\njest.mock(\n '~/src/server/plugins/engine/components/helpers/components.ts',\n () => ({\n getAnswer: jest.fn()\n })\n)\n\ndescribe('answer Nunjucks filter', () => {\n /** @type { NunjucksContext } */\n let mockThis\n\n beforeEach(() => {\n jest.clearAllMocks()\n\n mockThis = /** @type {NunjucksContext} */ (\n /** @type {unknown} */ ({\n ctx: {\n context: {\n componentMap: new Map(),\n relevantState: { someState: 'value' }\n }\n }\n })\n )\n\n jest.mocked(getAnswer).mockReturnValue('test answer')\n })\n\n describe('missing context', () => {\n it('returns undefined', () => {\n mockThis.ctx.context = undefined\n\n const result = answer.call(mockThis, 'componentName')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('component lookup', () => {\n it('returns undefined for non-existent component', () => {\n const result = answer.call(mockThis, 'nonExistentComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('non-form component', () => {\n it('returns undefined', () => {\n mockThis.ctx.context?.componentMap.set(\n 'nonFormComponent',\n // @ts-expect-error - simplified mock component for testing\n { isFormComponent: false }\n )\n\n const result = answer.call(mockThis, 'nonFormComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('valid form component', () => {\n it('returns the answer', () => {\n const mockFormComponent = {\n isFormComponent: true,\n someProperty: 'value',\n model: {\n createTranslator: jest.fn().mockImplementation(() => {\n return {\n t: jest.fn().mockReturnValue('translated text')\n }\n })\n }\n }\n mockThis.ctx.context?.componentMap.set(\n 'validFormComponent',\n // @ts-expect-error - simplified mock component for testing\n mockFormComponent\n )\n\n const result = answer.call(mockThis, 'validFormComponent')\n\n expect(getAnswer).toHaveBeenCalledWith(\n mockFormComponent,\n mockThis.ctx.context?.relevantState,\n { t: expect.anything() },\n { format: 'summary' }\n )\n expect(result).toBe('test answer')\n })\n })\n})\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -3,5 +3,5 @@
3
3
  * @this {NunjucksContext}
4
4
  * @param {string} name - The name of the component
5
5
  */
6
- export function field(this: NunjucksContext, name: string): import("../../engine/components/TextField.js").TextField | import("../../engine/components/SelectField.js").SelectField | import("../../engine/components/RadiosField.js").RadiosField | import("../../engine/components/YesNoField.js").YesNoField | import("../../engine/components/CheckboxesField.js").CheckboxesField | import("../../engine/components/DatePartsField.js").DatePartsField | import("../../engine/components/DeclarationField.js").DeclarationField | import("../../engine/components/EastingNorthingField.js").EastingNorthingField | import("../../engine/components/EmailAddressField.js").EmailAddressField | import("../../engine/components/LatLongField.js").LatLongField | import("../../engine/components/MonthYearField.js").MonthYearField | import("../../engine/components/MultilineTextField.js").MultilineTextField | import("../../engine/components/NationalGridFieldNumberField.js").NationalGridFieldNumberField | import("../../engine/components/NumberField.js").NumberField | import("../../engine/components/OsGridRefField.js").OsGridRefField | import("../../engine/components/TelephoneNumberField.js").TelephoneNumberField | import("../../engine/components/UkAddressField.js").UkAddressField | import("../../engine/components/FileUploadField.js").FileUploadField | import("../../engine/components/HiddenField.js").HiddenField | import("../../engine/components/PaymentField.js").PaymentField | import("../../engine/components/GeospatialField.js").GeospatialField | import("../../engine/components/Details.js").Details | import("../../engine/components/Html.js").Html | import("../../engine/components/InsetText.js").InsetText | import("../../engine/components/List.js").List | import("../../engine/components/Markdown.js").Markdown | import("../../engine/components/NotificationBanner.js").NotificationBanner | undefined;
6
+ export function field(this: NunjucksContext, name: string): import("../../engine/components/TextField.js").TextField | import("../../engine/components/PaymentField.js").PaymentField | import("../../engine/components/SelectField.js").SelectField | import("../../engine/components/RadiosField.js").RadiosField | import("../../engine/components/YesNoField.js").YesNoField | import("../../engine/components/CheckboxesField.js").CheckboxesField | import("../../engine/components/DatePartsField.js").DatePartsField | import("../../engine/components/DeclarationField.js").DeclarationField | import("../../engine/components/EastingNorthingField.js").EastingNorthingField | import("../../engine/components/EmailAddressField.js").EmailAddressField | import("../../engine/components/LatLongField.js").LatLongField | import("../../engine/components/MonthYearField.js").MonthYearField | import("../../engine/components/MultilineTextField.js").MultilineTextField | import("../../engine/components/NationalGridFieldNumberField.js").NationalGridFieldNumberField | import("../../engine/components/NumberField.js").NumberField | import("../../engine/components/OsGridRefField.js").OsGridRefField | import("../../engine/components/TelephoneNumberField.js").TelephoneNumberField | import("../../engine/components/UkAddressField.js").UkAddressField | import("../../engine/components/FileUploadField.js").FileUploadField | import("../../engine/components/HiddenField.js").HiddenField | import("../../engine/components/GeospatialField.js").GeospatialField | import("../../engine/components/Details.js").Details | import("../../engine/components/Html.js").Html | import("../../engine/components/InsetText.js").InsetText | import("../../engine/components/List.js").List | import("../../engine/components/Markdown.js").Markdown | import("../../engine/components/NotificationBanner.js").NotificationBanner | undefined;
7
7
  import type { NunjucksContext } from '../../../../server/plugins/nunjucks/types.js';
@@ -1,3 +1,21 @@
1
+ /**
2
+ * Postcode lookup details form payload schema
3
+ * @param {string} [language]
4
+ * @returns {ObjectSchema<PostcodeLookupDetailsPayload>}
5
+ */
6
+ export function createDetailsPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupDetailsPayload>;
7
+ /**
8
+ * Postcode lookup select form payload schema
9
+ * @param {string} [language]
10
+ * @returns {ObjectSchema<PostcodeLookupSelectPayload>}
11
+ */
12
+ export function createSelectPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupSelectPayload>;
13
+ /**
14
+ * Postcode lookup manual form payload schema
15
+ * @param {string} [language]
16
+ * @returns {ObjectSchema<PostcodeLookupManualPayload>}
17
+ */
18
+ export function createManualPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupManualPayload>;
1
19
  /**
2
20
  * The postcode lookup details form view model
3
21
  * @param {PostcodeLookupSessionData} data
@@ -119,6 +137,8 @@ export function selectViewModel(data: {
119
137
  singleAddress: Address | undefined;
120
138
  hasAddresses: boolean;
121
139
  hasMultipleAddresses: boolean;
140
+ addressesFoundText: string | undefined;
141
+ noAddressFoundText: string | undefined;
122
142
  buttons: {
123
143
  continueButton: {
124
144
  href: string | undefined;
@@ -230,26 +250,11 @@ export namespace steps {
230
250
  }
231
251
  export const JOURNEY_BASE_URL: "/postcode-lookup";
232
252
  export const stepSchema: Joi.StringSchema<string>;
233
- /**
234
- * Postcode lookup details form payload schema
235
- * @type {ObjectSchema<PostcodeLookupDetailsPayload>}
236
- */
237
- export const detailsPayloadSchema: Joi.ObjectSchema<PostcodeLookupDetailsPayload>;
238
- /**
239
- * Postcode lookup select form payload schema
240
- * @type {ObjectSchema<PostcodeLookupSelectPayload>}
241
- */
242
- export const selectPayloadSchema: Joi.ObjectSchema<PostcodeLookupSelectPayload>;
243
- /**
244
- * Postcode lookup manual form payload schema
245
- * @type {ObjectSchema<PostcodeLookupManualPayload>}
246
- */
247
- export const manualPayloadSchema: Joi.ObjectSchema<PostcodeLookupManualPayload>;
248
253
  export type OptionalValidationErrorItem = Joi.ValidationErrorItem | undefined;
254
+ import type { PostcodeLookupDetailsPayload } from '../../../../server/plugins/postcode-lookup/types.js';
255
+ import Joi from 'joi';
256
+ import type { PostcodeLookupSelectPayload } from '../../../../server/plugins/postcode-lookup/types.js';
257
+ import type { PostcodeLookupManualPayload } from '../../../../server/plugins/postcode-lookup/types.js';
249
258
  import type { PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js';
250
259
  import type { PostcodeLookupDetailsData } from '../../../../server/plugins/postcode-lookup/types.js';
251
- import type { PostcodeLookupSelectPayload } from '../../../../server/plugins/postcode-lookup/types.js';
252
260
  import type { Address } from '../../../../server/plugins/postcode-lookup/types.js';
253
- import type { PostcodeLookupManualPayload } from '../../../../server/plugins/postcode-lookup/types.js';
254
- import Joi from 'joi';
255
- import type { PostcodeLookupDetailsPayload } from '../../../../server/plugins/postcode-lookup/types.js';
@@ -1,4 +1,5 @@
1
1
  import Joi from 'joi';
2
+ import { t as i18nT } from "../../engine/i18n/index.js";
2
3
  import * as service from "../service.js";
3
4
  import { crumbSchema } from "../../../schemas/index.js";
4
5
 
@@ -11,7 +12,6 @@ const line2FieldName = 'addressLine2';
11
12
  const townFieldName = 'town';
12
13
  const countyFieldName = 'county';
13
14
  const postcodeFieldName = 'postcode';
14
- const selectLabelText = 'Select an address';
15
15
  const GOVUK_MARGIN_RIGHT_1 = 'govuk-!-margin-right-1';
16
16
  export const steps = {
17
17
  // Step 1: Postcode/building name input
@@ -114,17 +114,18 @@ async function getAddresses(postcodeQuery, buildingNameQuery, apiKey) {
114
114
  * @param {PostcodeLookupDetailsData | undefined} details
115
115
  * @param {OptionalValidationErrorItem} postcodeQueryError
116
116
  * @param {OptionalValidationErrorItem} buildingNameQueryError
117
+ * @param {string} language
117
118
  */
118
- function getDetailsFields(details, postcodeQueryError, buildingNameQueryError) {
119
+ function getDetailsFields(details, postcodeQueryError, buildingNameQueryError, language) {
119
120
  return {
120
121
  [postcodeQueryFieldName]: {
121
122
  id: postcodeQueryFieldName,
122
123
  name: postcodeQueryFieldName,
123
124
  label: {
124
- text: 'Postcode'
125
+ text: i18nT('postcodeLookup.postcodeLabel', language)
125
126
  },
126
127
  hint: {
127
- text: 'For example, AA3 1AB'
128
+ text: i18nT('postcodeLookup.postcodeHint', language)
128
129
  },
129
130
  value: details?.postcodeQuery,
130
131
  errorMessage: postcodeQueryError && {
@@ -135,10 +136,10 @@ function getDetailsFields(details, postcodeQueryError, buildingNameQueryError) {
135
136
  id: buildingNameQueryFieldName,
136
137
  name: buildingNameQueryFieldName,
137
138
  label: {
138
- text: 'Building name or number (optional)'
139
+ text: i18nT('postcodeLookup.buildingNameLabel', language)
139
140
  },
140
141
  hint: {
141
- text: 'For example, 15 or Prospect Cottage'
142
+ text: i18nT('postcodeLookup.buildingNameHint', language)
142
143
  },
143
144
  value: details?.buildingNameQuery,
144
145
  errorMessage: buildingNameQueryError && {
@@ -156,8 +157,10 @@ function getDetailsFields(details, postcodeQueryError, buildingNameQueryError) {
156
157
  * @param {PostcodeLookupSelectPayload | undefined} payload
157
158
  * @param {OptionalValidationErrorItem} uprnError
158
159
  * @param {Address[]} addresses
160
+ * @param {string} language
159
161
  */
160
- function getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses) {
162
+ function getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses, language) {
163
+ const selectAddressText = i18nT('postcodeLookup.selectAddress', language);
161
164
  return {
162
165
  [postcodeQueryFieldName]: {
163
166
  id: postcodeQueryFieldName,
@@ -175,14 +178,14 @@ function getSelectFields(details, hasMultipleAddresses, singleAddress, payload,
175
178
  id: uprnFieldName,
176
179
  name: uprnFieldName,
177
180
  label: hasMultipleAddresses ? {
178
- text: selectLabelText
181
+ text: selectAddressText
179
182
  } : undefined,
180
183
  value: singleAddress ? singleAddress.uprn : payload?.uprn,
181
184
  errorMessage: uprnError && {
182
185
  text: uprnError.message
183
186
  },
184
187
  items: hasMultipleAddresses ? [{
185
- text: selectLabelText,
188
+ text: selectAddressText,
186
189
  value: ''
187
190
  }].concat(addresses.map(item => ({
188
191
  text: item.formatted,
@@ -201,14 +204,15 @@ function getSelectFields(details, hasMultipleAddresses, singleAddress, payload,
201
204
  * @param {OptionalValidationErrorItem} townError
202
205
  * @param {OptionalValidationErrorItem} countyError
203
206
  * @param {OptionalValidationErrorItem} postcodeError
207
+ * @param {string} language
204
208
  */
205
- function getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError) {
209
+ function getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError, language) {
206
210
  return {
207
211
  [line1FieldName]: {
208
212
  id: line1FieldName,
209
213
  name: line1FieldName,
210
214
  label: {
211
- text: 'Address line 1'
215
+ text: i18nT('postcodeLookup.addressLine1Label', language)
212
216
  },
213
217
  value: payload?.addressLine1,
214
218
  errorMessage: line1Error && {
@@ -219,7 +223,7 @@ function getManualFields(payload, line1Error, line2Error, townError, countyError
219
223
  id: line2FieldName,
220
224
  name: line2FieldName,
221
225
  label: {
222
- text: 'Address line 2 (optional)'
226
+ text: i18nT('postcodeLookup.addressLine2Label', language)
223
227
  },
224
228
  value: payload?.addressLine2,
225
229
  errorMessage: line2Error && {
@@ -230,7 +234,7 @@ function getManualFields(payload, line1Error, line2Error, townError, countyError
230
234
  id: townFieldName,
231
235
  name: townFieldName,
232
236
  label: {
233
- text: 'Town or city'
237
+ text: i18nT('postcodeLookup.townLabel', language)
234
238
  },
235
239
  classes: 'govuk-!-width-two-thirds',
236
240
  value: payload?.town,
@@ -242,7 +246,7 @@ function getManualFields(payload, line1Error, line2Error, townError, countyError
242
246
  id: countyFieldName,
243
247
  name: countyFieldName,
244
248
  label: {
245
- text: 'County (optional)'
249
+ text: i18nT('postcodeLookup.countyLabel', language)
246
250
  },
247
251
  value: payload?.county,
248
252
  errorMessage: countyError && {
@@ -253,7 +257,7 @@ function getManualFields(payload, line1Error, line2Error, townError, countyError
253
257
  id: postcodeFieldName,
254
258
  name: postcodeFieldName,
255
259
  label: {
256
- text: 'Postcode'
260
+ text: i18nT('postcodeLookup.postcodeLabel', language)
257
261
  },
258
262
  classes: 'govuk-input--width-10',
259
263
  value: payload?.postcode,
@@ -271,47 +275,56 @@ const sharedPayloadSchemaKeys = {
271
275
 
272
276
  /**
273
277
  * Postcode lookup details form payload schema
274
- * @type {ObjectSchema<PostcodeLookupDetailsPayload>}
278
+ * @param {string} [language]
279
+ * @returns {ObjectSchema<PostcodeLookupDetailsPayload>}
275
280
  */
276
- export const detailsPayloadSchema = Joi.object().keys({
277
- ...sharedPayloadSchemaKeys,
278
- [postcodeQueryFieldName]: Joi.string().pattern(/^[a-zA-Z]{1,2}\d[a-zA-Z\d]?\s?\d[a-zA-Z]{2}$/).trim().required().messages({
279
- 'string.pattern.base': 'Enter a valid postcode or enter an address manually',
280
- '*': 'Enter a postcode'
281
- }),
282
- [buildingNameQueryFieldName]: Joi.string().trim().required().allow('').trim()
283
- }).required();
281
+ export function createDetailsPayloadSchema(language = 'en-GB') {
282
+ return Joi.object().keys({
283
+ ...sharedPayloadSchemaKeys,
284
+ [postcodeQueryFieldName]: Joi.string().pattern(/^[a-zA-Z]{1,2}\d[a-zA-Z\d]?\s?\d[a-zA-Z]{2}$/).trim().required().messages({
285
+ 'string.pattern.base': i18nT('postcodeLookup.validation.invalidPostcode', language),
286
+ '*': i18nT('postcodeLookup.validation.requiredPostcode', language)
287
+ }),
288
+ [buildingNameQueryFieldName]: Joi.string().trim().required().allow('').trim()
289
+ }).required();
290
+ }
284
291
 
285
292
  /**
286
293
  * Postcode lookup select form payload schema
287
- * @type {ObjectSchema<PostcodeLookupSelectPayload>}
294
+ * @param {string} [language]
295
+ * @returns {ObjectSchema<PostcodeLookupSelectPayload>}
288
296
  */
289
- export const selectPayloadSchema = Joi.object().keys({
290
- ...sharedPayloadSchemaKeys,
291
- [uprnFieldName]: Joi.string().required().messages({
292
- '*': selectLabelText
293
- })
294
- }).required();
297
+ export function createSelectPayloadSchema(language = 'en-GB') {
298
+ return Joi.object().keys({
299
+ ...sharedPayloadSchemaKeys,
300
+ [uprnFieldName]: Joi.string().required().messages({
301
+ '*': i18nT('postcodeLookup.validation.selectAddress', language)
302
+ })
303
+ }).required();
304
+ }
295
305
 
296
306
  /**
297
307
  * Postcode lookup manual form payload schema
298
- * @type {ObjectSchema<PostcodeLookupManualPayload>}
308
+ * @param {string} [language]
309
+ * @returns {ObjectSchema<PostcodeLookupManualPayload>}
299
310
  */
300
- export const manualPayloadSchema = Joi.object().keys({
301
- ...sharedPayloadSchemaKeys,
302
- [line1FieldName]: Joi.string().trim().required().messages({
303
- '*': 'Enter address line 1'
304
- }),
305
- [line2FieldName]: Joi.string().trim().allow('').required(),
306
- [townFieldName]: Joi.string().trim().required().messages({
307
- '*': 'Enter town or city'
308
- }),
309
- [countyFieldName]: Joi.string().trim().allow('').required(),
310
- [postcodeFieldName]: Joi.string().pattern(/^[a-zA-Z]{1,2}\d[a-zA-Z\d]?\s?\d[a-zA-Z]{2}$/).trim().required().messages({
311
- 'string.pattern.base': 'Enter a valid postcode',
312
- '*': 'Enter postcode'
313
- })
314
- }).required();
311
+ export function createManualPayloadSchema(language = 'en-GB') {
312
+ return Joi.object().keys({
313
+ ...sharedPayloadSchemaKeys,
314
+ [line1FieldName]: Joi.string().trim().required().messages({
315
+ '*': i18nT('postcodeLookup.validation.requiredAddressLine1', language)
316
+ }),
317
+ [line2FieldName]: Joi.string().trim().allow('').required(),
318
+ [townFieldName]: Joi.string().trim().required().messages({
319
+ '*': i18nT('postcodeLookup.validation.requiredTown', language)
320
+ }),
321
+ [countyFieldName]: Joi.string().trim().allow('').required(),
322
+ [postcodeFieldName]: Joi.string().pattern(/^[a-zA-Z]{1,2}\d[a-zA-Z\d]?\s?\d[a-zA-Z]{2}$/).trim().required().messages({
323
+ 'string.pattern.base': i18nT('postcodeLookup.validation.invalidManualPostcode', language),
324
+ '*': i18nT('postcodeLookup.validation.requiredManualPostcode', language)
325
+ })
326
+ }).required();
327
+ }
315
328
 
316
329
  /**
317
330
  * Get the postcode lookup href
@@ -332,7 +345,8 @@ export function detailsViewModel(data, payload, err) {
332
345
  const {
333
346
  componentTitle: pageTitle,
334
347
  formName,
335
- sourceUrl
348
+ sourceUrl,
349
+ language = 'en-GB'
336
350
  } = data.initial;
337
351
  const backLink = {
338
352
  href: sourceUrl
@@ -342,17 +356,13 @@ export function detailsViewModel(data, payload, err) {
342
356
  postcodeQueryError,
343
357
  buildingNameQueryError
344
358
  } = buildErrors(err);
345
-
346
- // Model fields
347
- const fields = getDetailsFields(payload ?? data.details, postcodeQueryError, buildingNameQueryError);
348
-
349
- // Model buttons
359
+ const fields = getDetailsFields(payload ?? data.details, postcodeQueryError, buildingNameQueryError, language);
350
360
  const continueButton = {
351
- text: 'Find address',
361
+ text: i18nT('postcodeLookup.findAddress', language),
352
362
  classes: GOVUK_MARGIN_RIGHT_1
353
363
  };
354
364
  const manualLink = {
355
- text: 'enter address manually',
365
+ text: i18nT('postcodeLookup.enterManually', language),
356
366
  href: getHref(steps.manual)
357
367
  };
358
368
  return {
@@ -390,8 +400,7 @@ export async function selectViewModel(data, payload, err) {
390
400
  postcodeQuery,
391
401
  buildingNameQuery
392
402
  } = details;
393
-
394
- // Search for addresses
403
+ const language = initial.language ?? 'en-GB';
395
404
  const {
396
405
  hasAddresses,
397
406
  hasMultipleAddresses,
@@ -399,7 +408,7 @@ export async function selectViewModel(data, payload, err) {
399
408
  addresses,
400
409
  addressCount
401
410
  } = await getAddresses(postcodeQuery, buildingNameQuery, apiKey);
402
- const title = hasAddresses ? initial.componentTitle : 'No address found';
411
+ const title = hasAddresses ? initial.componentTitle : i18nT('postcodeLookup.noAddressFoundTitle', language);
403
412
  const formPath = initial.sourceUrl;
404
413
  const href = getHref();
405
414
  const backLink = {
@@ -409,24 +418,25 @@ export async function selectViewModel(data, payload, err) {
409
418
  errors,
410
419
  uprnError
411
420
  } = buildErrors(err);
412
-
413
- // Model fields
414
- const fields = getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses);
421
+ const fields = getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses, language);
422
+ const searchAgainText = i18nT('postcodeLookup.searchAgain', language);
415
423
  const searchAgainLink = {
416
- text: 'Search again',
424
+ text: searchAgainText,
417
425
  href
418
426
  };
419
-
420
- // Model buttons
421
427
  const continueButton = {
422
428
  href: hasAddresses ? undefined : href,
423
- text: hasAddresses ? 'Use this address' : 'Search again',
429
+ text: hasAddresses ? i18nT('postcodeLookup.useThisAddress', language) : searchAgainText,
424
430
  classes: GOVUK_MARGIN_RIGHT_1
425
431
  };
426
432
  const manualLink = {
427
- text: 'enter address manually',
433
+ text: i18nT('postcodeLookup.enterManually', language),
428
434
  href: `${href}?step=${steps.manual}`
429
435
  };
436
+ const addressesFoundText = hasAddresses ? i18nT('postcodeLookup.addressFound', language, {
437
+ count: addressCount
438
+ }) : undefined;
439
+ const noAddressFoundText = !hasAddresses ? i18nT('postcodeLookup.noAddressFoundBody', language) : undefined;
430
440
  return {
431
441
  step: steps.select,
432
442
  showTitle: true,
@@ -442,6 +452,8 @@ export async function selectViewModel(data, payload, err) {
442
452
  singleAddress,
443
453
  hasAddresses,
444
454
  hasMultipleAddresses,
455
+ addressesFoundText,
456
+ noAddressFoundText,
445
457
  buttons: {
446
458
  continueButton,
447
459
  manualLink
@@ -459,7 +471,8 @@ export function manualViewModel(data, payload, err) {
459
471
  const {
460
472
  componentTitle,
461
473
  sourceUrl,
462
- componentHint
474
+ componentHint,
475
+ language = 'en-GB'
463
476
  } = data.initial;
464
477
  const formPath = sourceUrl;
465
478
  const href = getHref();
@@ -474,22 +487,16 @@ export function manualViewModel(data, payload, err) {
474
487
  countyError,
475
488
  postcodeError
476
489
  } = buildErrors(err);
477
-
478
- // Model hint
479
490
  const hint = componentHint && {
480
491
  text: componentHint
481
492
  };
482
-
483
- // Model fields
484
- const fields = getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError);
485
-
486
- // Model buttons
493
+ const fields = getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError, language);
487
494
  const continueButton = {
488
- text: 'Use this address',
495
+ text: i18nT('postcodeLookup.useThisAddress', language),
489
496
  classes: GOVUK_MARGIN_RIGHT_1
490
497
  };
491
498
  const detailsLink = {
492
- text: 'find an address instead',
499
+ text: i18nT('postcodeLookup.findAnAddressInstead', language),
493
500
  href
494
501
  };
495
502
  return {