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

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 (339) hide show
  1. package/.public/javascripts/application.min.js +1 -1
  2. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  3. package/.public/javascripts/application.min.js.map +1 -1
  4. package/.public/javascripts/shared.min.js +1 -1
  5. package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/shared.min.js.map +1 -1
  7. package/.public/stylesheets/application.min.css.map +1 -1
  8. package/.server/client/javascripts/file-upload.js +6 -3
  9. package/.server/client/javascripts/file-upload.js.map +1 -1
  10. package/.server/client/javascripts/geospatial-map.d.ts +153 -5
  11. package/.server/client/javascripts/geospatial-map.js +157 -77
  12. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  13. package/.server/client/javascripts/govuk.js +2 -1
  14. package/.server/client/javascripts/govuk.js.map +1 -1
  15. package/.server/client/javascripts/location-map.d.ts +44 -0
  16. package/.server/client/javascripts/location-map.js +54 -5
  17. package/.server/client/javascripts/location-map.js.map +1 -1
  18. package/.server/client/javascripts/map-constants.d.ts +3 -0
  19. package/.server/client/javascripts/map-constants.js +4 -0
  20. package/.server/client/javascripts/map-constants.js.map +1 -0
  21. package/.server/client/javascripts/map.d.ts +10 -0
  22. package/.server/client/javascripts/map.js +42 -0
  23. package/.server/client/javascripts/map.js.map +1 -1
  24. package/.server/client/javascripts/maps.d.ts +5 -0
  25. package/.server/client/javascripts/maps.js +6 -0
  26. package/.server/client/javascripts/maps.js.map +1 -0
  27. package/.server/client/javascripts/shared.d.ts +1 -4
  28. package/.server/client/javascripts/shared.js +1 -4
  29. package/.server/client/javascripts/shared.js.map +1 -1
  30. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  31. package/.server/client/javascripts/sssi-dataset.js +37 -39
  32. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  33. package/.server/client/stylesheets/maps.scss +4 -0
  34. package/.server/client/stylesheets/shared.scss +1 -5
  35. package/.server/server/constants.d.ts +2 -0
  36. package/.server/server/constants.js +2 -0
  37. package/.server/server/constants.js.map +1 -1
  38. package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
  39. package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
  40. package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
  41. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  42. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  43. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  44. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +21 -0
  45. package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
  46. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  48. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  49. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  50. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  51. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  52. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  53. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  54. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  55. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  56. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  57. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  58. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  59. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
  60. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  61. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  62. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  63. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  64. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  65. package/.server/server/plugins/engine/components/FileUploadField.d.ts +21 -0
  66. package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
  67. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  69. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  70. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  71. package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
  72. package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
  73. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  74. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  75. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  76. package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
  77. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  78. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  79. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  80. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  81. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  82. package/.server/server/plugins/engine/components/LocationFieldBase.js +25 -6
  83. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  84. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
  85. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
  86. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  87. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  89. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  90. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  91. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  92. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  93. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  94. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  95. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  96. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  97. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  98. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  99. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  100. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  101. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
  102. package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
  103. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  104. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  105. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  106. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  108. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  109. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  110. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  111. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  112. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  113. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  114. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  115. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  116. package/.server/server/plugins/engine/components/helpers/components.js +3 -3
  117. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  118. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
  119. package/.server/server/plugins/engine/components/helpers/geospatial.js +56 -15
  120. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  121. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  122. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  123. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  124. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  125. package/.server/server/plugins/engine/components/types.js.map +1 -1
  126. package/.server/server/plugins/engine/errors.d.ts +49 -0
  127. package/.server/server/plugins/engine/errors.js +75 -0
  128. package/.server/server/plugins/engine/errors.js.map +1 -0
  129. package/.server/server/plugins/engine/form-availability.d.ts +3 -2
  130. package/.server/server/plugins/engine/form-availability.js +3 -2
  131. package/.server/server/plugins/engine/form-availability.js.map +1 -1
  132. package/.server/server/plugins/engine/form-context.js +2 -2
  133. package/.server/server/plugins/engine/form-context.js.map +1 -1
  134. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  135. package/.server/server/plugins/engine/helpers.js +44 -5
  136. package/.server/server/plugins/engine/helpers.js.map +1 -1
  137. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
  138. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
  139. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  140. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  141. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  142. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  143. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  144. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  145. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  146. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  147. package/.server/server/plugins/engine/i18n/form.js +35 -0
  148. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  149. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  150. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  151. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  152. package/.server/server/plugins/engine/i18n/translations/cy.json +192 -9
  153. package/.server/server/plugins/engine/i18n/translations/en-GB.json +125 -7
  154. package/.server/server/plugins/engine/i18n/types.d.ts +3 -0
  155. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  156. package/.server/server/plugins/engine/index.d.ts +4 -0
  157. package/.server/server/plugins/engine/index.js +4 -0
  158. package/.server/server/plugins/engine/index.js.map +1 -1
  159. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  160. package/.server/server/plugins/engine/models/FormModel.js +19 -17
  161. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  162. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  163. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  164. package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
  165. package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
  166. package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
  167. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
  168. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  169. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  170. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  171. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  172. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  173. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  174. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  175. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  176. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  177. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  178. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  179. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  180. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  181. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  182. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  183. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  184. package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
  185. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
  186. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  187. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
  188. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  189. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
  190. package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
  191. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  192. package/.server/server/plugins/engine/types/schema.js +1 -0
  193. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  194. package/.server/server/plugins/engine/types.d.ts +5 -0
  195. package/.server/server/plugins/engine/types.js.map +1 -1
  196. package/.server/server/plugins/engine/unavailable-response.js +5 -2
  197. package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
  198. package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
  199. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  200. package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
  201. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  202. package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
  203. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  204. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  205. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  206. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  207. package/.server/server/plugins/engine/views/unavailable.html +14 -11
  208. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  209. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  210. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  211. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  212. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  213. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  214. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  215. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  216. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  217. package/.server/server/plugins/payment/helper.d.ts +11 -1
  218. package/.server/server/plugins/payment/helper.js +18 -2
  219. package/.server/server/plugins/payment/helper.js.map +1 -1
  220. package/.server/server/plugins/payment/helper.test.js +2 -1
  221. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  222. package/.server/server/plugins/payment/service.d.ts +2 -1
  223. package/.server/server/plugins/payment/service.js +5 -2
  224. package/.server/server/plugins/payment/service.js.map +1 -1
  225. package/.server/server/plugins/payment/service.test.js +7 -3
  226. package/.server/server/plugins/payment/service.test.js.map +1 -1
  227. package/.server/server/plugins/payment/types.d.ts +4 -0
  228. package/.server/server/plugins/payment/types.js +1 -0
  229. package/.server/server/plugins/payment/types.js.map +1 -1
  230. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  231. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  232. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  233. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  234. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  235. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  236. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  237. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  238. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  239. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  240. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  241. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  242. package/.server/server/utils/type-utils.d.ts +1 -2
  243. package/.server/server/utils/type-utils.js +0 -3
  244. package/.server/server/utils/type-utils.js.map +1 -1
  245. package/.server/server/utils/utils.d.ts +6 -0
  246. package/.server/server/utils/utils.js +18 -1
  247. package/.server/server/utils/utils.js.map +1 -1
  248. package/.server/server/utils/utils.test.js +21 -1
  249. package/.server/server/utils/utils.test.js.map +1 -1
  250. package/package.json +20 -5
  251. package/src/client/javascripts/file-upload.js +11 -3
  252. package/src/client/javascripts/geospatial-map.js +176 -81
  253. package/src/client/javascripts/govuk.js +2 -0
  254. package/src/client/javascripts/location-map.js +60 -4
  255. package/src/client/javascripts/map-constants.js +3 -0
  256. package/src/client/javascripts/map.js +47 -0
  257. package/src/client/javascripts/maps.js +5 -0
  258. package/src/client/javascripts/shared.js +1 -4
  259. package/src/client/javascripts/sssi-dataset.js +39 -41
  260. package/src/client/stylesheets/maps.scss +4 -0
  261. package/src/client/stylesheets/shared.scss +1 -5
  262. package/src/server/constants.js +2 -0
  263. package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
  264. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  265. package/src/server/plugins/engine/components/CheckboxesField.ts +38 -5
  266. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  267. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  268. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  269. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  270. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  271. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  272. package/src/server/plugins/engine/components/FileUploadField.ts +44 -3
  273. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  274. package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
  275. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  276. package/src/server/plugins/engine/components/LocationFieldBase.ts +30 -7
  277. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
  278. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  279. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  280. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  281. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  282. package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
  283. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  284. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  285. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  286. package/src/server/plugins/engine/components/helpers/components.ts +3 -3
  287. package/src/server/plugins/engine/components/helpers/geospatial.ts +84 -21
  288. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  289. package/src/server/plugins/engine/components/types.ts +1 -0
  290. package/src/server/plugins/engine/errors.ts +78 -0
  291. package/src/server/plugins/engine/form-availability.ts +8 -2
  292. package/src/server/plugins/engine/form-context.ts +4 -2
  293. package/src/server/plugins/engine/helpers.ts +52 -5
  294. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
  295. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  296. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  297. package/src/server/plugins/engine/i18n/form.ts +54 -0
  298. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  299. package/src/server/plugins/engine/i18n/translations/cy.json +192 -9
  300. package/src/server/plugins/engine/i18n/translations/en-GB.json +125 -7
  301. package/src/server/plugins/engine/i18n/types.ts +3 -0
  302. package/src/server/plugins/engine/index.ts +7 -0
  303. package/src/server/plugins/engine/models/FormModel.ts +21 -17
  304. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  305. package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
  306. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
  307. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  308. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  309. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  310. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  311. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  312. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  313. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
  314. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
  315. package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
  316. package/src/server/plugins/engine/types/schema.ts +1 -0
  317. package/src/server/plugins/engine/types.ts +5 -0
  318. package/src/server/plugins/engine/unavailable-response.ts +6 -2
  319. package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
  320. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  321. package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
  322. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  323. package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
  324. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  325. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  326. package/src/server/plugins/engine/views/file-upload.html +1 -1
  327. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  328. package/src/server/plugins/engine/views/unavailable.html +14 -11
  329. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  330. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  331. package/src/server/plugins/payment/helper.js +22 -2
  332. package/src/server/plugins/payment/service.js +6 -2
  333. package/src/server/plugins/payment/types.js +1 -0
  334. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  335. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  336. package/src/server/plugins/postcode-lookup/types.js +6 -1
  337. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  338. package/src/server/utils/type-utils.ts +1 -11
  339. package/src/server/utils/utils.js +19 -1
@@ -114,7 +114,7 @@ export class SummaryPageController extends QuestionPageController {
114
114
  viewModel.paymentDetails = this.buildPaymentDetails(
115
115
  paymentField,
116
116
  paymentState,
117
- t
117
+ translator
118
118
  )
119
119
  }
120
120
 
@@ -151,8 +151,9 @@ export class SummaryPageController extends QuestionPageController {
151
151
  paymentState: NonNullable<
152
152
  ReturnType<PaymentField['getPaymentStateFromState']>
153
153
  >,
154
- t: (key: string, opts?: Record<string, unknown>) => string
154
+ translator: Translator
155
155
  ) {
156
+ const { t } = translator
156
157
  const rows = [
157
158
  {
158
159
  key: { text: t('pages.summary.paymentFor') },
@@ -171,7 +172,12 @@ export class SummaryPageController extends QuestionPageController {
171
172
  if (paymentState.preAuth?.createdAt) {
172
173
  rows.push({
173
174
  key: { text: t('pages.summary.dateOfPayment') },
174
- value: { text: formatPaymentDate(paymentState.preAuth.createdAt) }
175
+ value: {
176
+ text: formatPaymentDate(
177
+ paymentState.preAuth.createdAt,
178
+ translator.language
179
+ )
180
+ }
175
181
  })
176
182
  }
177
183
 
@@ -557,7 +563,12 @@ function submitData(
557
563
  retrievalKey,
558
564
  referenceNumber,
559
565
  main: buildMainRecords(items, translator),
560
- repeaters: buildRepeaterRecords(items, translator)
566
+ repeaters: buildRepeaterRecords(items, translator),
567
+ // Only populate the language property if the form is multi-language enabled
568
+ // @ts-expect-error - dynamic language property
569
+ language: model.def.metadata?.translations?.cy
570
+ ? translator.language
571
+ : undefined
561
572
  }
562
573
  return submit(payload)
563
574
  }
@@ -4,6 +4,7 @@ import {
4
4
  type Page
5
5
  } from '@defra/forms-model'
6
6
 
7
+ import { UnknownPageControllerError } from '../../errors.js'
7
8
  import { type FormModel } from '../../models/index.js'
8
9
  import * as PageControllers from '../index.js'
9
10
 
@@ -66,7 +67,7 @@ export function createPage(model: FormModel, pageDef: Page) {
66
67
  }
67
68
 
68
69
  if (typeof controller === 'undefined') {
69
- throw new Error(`Page controller ${pageDef.controller} does not exist`)
70
+ throw new UnknownPageControllerError(pageDef.controller)
70
71
  }
71
72
 
72
73
  return controller
@@ -36,7 +36,7 @@ export function buildMainRecords(
36
36
 
37
37
  for (const item of fieldItems) {
38
38
  if (item.field instanceof PaymentField) {
39
- records.push(...buildPaymentRecords(item))
39
+ records.push(...buildPaymentRecords(item, translator))
40
40
  } else if (item.field instanceof GeospatialField) {
41
41
  // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`
42
42
  // so we don't incur the overhead of JSON.stringify on every request when building context
@@ -67,7 +67,10 @@ export function buildMainRecords(
67
67
  *
68
68
  * Returns an empty array if no payment state exists.
69
69
  */
70
- export function buildPaymentRecords(item: DetailItemField): SubmitRecord[] {
70
+ export function buildPaymentRecords(
71
+ item: DetailItemField,
72
+ translator: Translator
73
+ ): SubmitRecord[] {
71
74
  const paymentState = (item.field as PaymentField).getPaymentStateFromState(
72
75
  item.state
73
76
  )
@@ -96,7 +99,7 @@ export function buildPaymentRecords(item: DetailItemField): SubmitRecord[] {
96
99
  name: `${item.name}_paymentDate`,
97
100
  title: 'Payment date',
98
101
  value: paymentState.preAuth?.createdAt
99
- ? formatPaymentDate(paymentState.preAuth.createdAt)
102
+ ? formatPaymentDate(paymentState.preAuth.createdAt, translator.language)
100
103
  : ''
101
104
  }
102
105
  ]
@@ -26,7 +26,7 @@ export const opts = {
26
26
  * import messageTemplate directly and get the English version.
27
27
  */
28
28
  export const messageTemplate: ValidationMessages = buildValidationMessages(
29
- (key) => t(key, 'en-GB')
29
+ (key, options) => t(key, 'en-GB', options)
30
30
  )
31
31
 
32
32
  export const messages: LanguageMessagesExt = {
@@ -58,14 +58,28 @@ export const messages: LanguageMessagesExt = {
58
58
  'date.min': messageTemplate.dateMin,
59
59
  'date.max': messageTemplate.dateMax,
60
60
 
61
- 'object.invalidjson': messageTemplate.format
61
+ 'array.min': messageTemplate.arrayMin,
62
+ 'array.max': messageTemplate.arrayMax,
63
+ 'array.length': messageTemplate.arrayLength,
64
+
65
+ 'features.min': messageTemplate.featuresMin,
66
+ 'features.max': messageTemplate.featuresMax,
67
+ 'features.length': messageTemplate.featuresLength,
68
+
69
+ 'files.min': messageTemplate.filesMin,
70
+ 'files.max': messageTemplate.filesMax,
71
+ 'filees.length': messageTemplate.filesLength,
72
+
73
+ 'object.invalidjson': messageTemplate.format,
74
+
75
+ 'phoneNumber.invalid': messageTemplate.format
62
76
  }
63
77
 
64
78
  export const messagesPre: LanguageMessages =
65
79
  messages as unknown as LanguageMessages
66
80
 
67
81
  export function buildLanguageMessages(
68
- t: (key: string) => string
82
+ t: (key: string, options?: Record<string, unknown>) => string
69
83
  ): LanguageMessages {
70
84
  const vm = buildValidationMessages(t)
71
85
  return {
@@ -76,6 +90,7 @@ export function buildLanguageMessages(
76
90
  'string.email': vm.format,
77
91
  'string.pattern.base': vm.pattern,
78
92
  'string.maxWords': vm.maxWords,
93
+ 'string.unicode': vm.unicode,
79
94
  'number.base': vm.number,
80
95
  'number.precision': vm.numberPrecision,
81
96
  'number.integer': vm.numberInteger,
@@ -91,7 +106,17 @@ export function buildLanguageMessages(
91
106
  'date.format': vm.dateFormat,
92
107
  'date.min': vm.dateMin,
93
108
  'date.max': vm.dateMax,
94
- 'object.invalidjson': vm.format
109
+ 'array.min': vm.arrayMin,
110
+ 'array.max': vm.arrayMax,
111
+ 'array.length': vm.arrayLength,
112
+ 'features.min': vm.featuresMin,
113
+ 'features.max': vm.featuresMax,
114
+ 'features.length': vm.featuresLength,
115
+ 'files.min': vm.filesMin,
116
+ 'files.max': vm.filesMax,
117
+ 'files.length': vm.filesLength,
118
+ 'object.invalidjson': vm.format,
119
+ 'phoneNumber.invalid': vm.format
95
120
  } as unknown as LanguageMessages
96
121
  }
97
122
 
@@ -50,6 +50,7 @@ export const formAdapterSubmissionMessageDataSchema =
50
50
  reference: Joi.string().required(),
51
51
  amount: Joi.number().required(),
52
52
  description: Joi.string().required(),
53
+ descriptionInEng: Joi.string().optional(),
53
54
  createdAt: Joi.string().required()
54
55
  })
55
56
  .optional(),
@@ -245,11 +245,15 @@ export type FileUpload = {
245
245
  } & (
246
246
  | {
247
247
  fileStatus: FileStatus.complete | FileStatus.rejected | FileStatus.pending
248
+ errorCode?: string
248
249
  errorMessage?: string
250
+ errorParams?: Record<string, number | string | string[]>
249
251
  }
250
252
  | {
251
253
  fileStatus: FileStatus.complete
254
+ errorCode?: string
252
255
  errorMessage?: undefined
256
+ errorParams?: Record<string, number | string | string[]>
253
257
  }
254
258
  )
255
259
 
@@ -558,6 +562,7 @@ export interface FormAdapterPayment {
558
562
  reference: string
559
563
  amount: number
560
564
  description: string
565
+ descriptionInEng?: string
561
566
  createdAt: string
562
567
  }
563
568
 
@@ -2,6 +2,8 @@ import { type Request, type ResponseToolkit, type Server } from '@hapi/hapi'
2
2
 
3
3
  import { isOfflineBoom } from './form-availability.js'
4
4
  import { unavailableViewModel } from './models/unavailable-view-model.js'
5
+ import { type AnyFormRequest } from './types.js'
6
+ import { resolveLanguage } from '../../utils/utils.js'
5
7
 
6
8
  /**
7
9
  * Registers a server-wide onPreResponse extension that intercepts the offline
@@ -17,10 +19,12 @@ export function registerUnavailableResponse(server: Server) {
17
19
  return h.continue
18
20
  }
19
21
 
20
- const { metadata } = response.data
22
+ const { metadata, definition } = response.data
23
+
24
+ const language = resolveLanguage(request as unknown as AnyFormRequest)
21
25
 
22
26
  return h
23
- .view('unavailable', unavailableViewModel(metadata))
27
+ .view('unavailable', unavailableViewModel(metadata, definition, language))
24
28
  .header('Cache-Control', 'no-store, no-cache, must-revalidate')
25
29
  .header('X-Robots-Tag', 'noindex, nofollow')
26
30
  .code(200)
@@ -61,7 +61,7 @@
61
61
  {% set detailsHtml %}
62
62
  {% if component.model.instructionText %}
63
63
  {{ govukDetails({
64
- summaryText: t('components.locationFieldBase.howToFind'),
64
+ summaryText: component.model.instructionSummary,
65
65
  html: component.model.instructionText | markdown | safe,
66
66
  classes: "govuk-!-margin-top-3"
67
67
  }) }}
@@ -70,8 +70,10 @@
70
70
 
71
71
  {% set hasErrors = showFieldsetError and component.model.errorMessage %}
72
72
 
73
- <div class="govuk-form-group app-location-field {{ "govuk-form-group--error" if hasErrors }}"
73
+ <div id="{{component.model.name}}" class="govuk-form-group app-location-field {{ "govuk-form-group--error" if hasErrors }}"
74
74
  data-locationtype="{{component.type | lower}}"
75
+ data-country="{{component.model.country}}"
76
+ data-lang="{{component.model.lang}}"
75
77
  data-maplayers="{{component.model.mapLayers}}">
76
78
  {{ govukFieldset({
77
79
  legend: {
@@ -3,7 +3,7 @@
3
3
  {% macro FileUploadField(component) %}
4
4
  {% set upload = component.model.upload %}
5
5
 
6
- <div id="uploadedFilesContainer">
6
+ <div id="uploadedFilesContainer" data-uploadinglabel="{{ upload.uploadingLabel }}">
7
7
  <h2 class="govuk-heading-m">{{ t('components.fileUploadField.uploadedFilesHeading') }}</h2>
8
8
  {% if upload.count %}
9
9
  <p class="govuk-body" role="alert">{{ t('components.fileUploadField.filesCount', { count: upload.count }) }}</p>
@@ -2,6 +2,7 @@
2
2
 
3
3
  {% macro GeospatialField(component) %}
4
4
  <div class="app-geospatial-field"
5
+ data-lang="{{component.model.lang}}"
5
6
  data-country="{{component.model.country}}"
6
7
  data-geometryTypes="{{component.model.geometryTypes}}"
7
8
  data-maplayers="{{component.model.mapLayers}}">
@@ -3,7 +3,18 @@
3
3
 
4
4
  {% macro MultilineTextField(component) %}
5
5
  {% if component.model.isCharacterOrWordCount == true %}
6
- {{ govukCharacterCount(component.model) }}
6
+ {% set characterParams = component.model | merge({
7
+ charactersUnderLimitText: {
8
+ one: t('components.characterCount.underLimit.one'),
9
+ other: t('components.characterCount.underLimit.other')
10
+ },
11
+ charactersAtLimitText: t('components.characterCount.atLimit'),
12
+ charactersOverLimitText: {
13
+ one: t('components.characterCount.overLimit.one'),
14
+ other: t('components.characterCount.overLimit.other')
15
+ }
16
+ } ) %}
17
+ {{ govukCharacterCount(characterParams) }}
7
18
  {% else %}
8
19
  {{ govukTextarea(component.model) }}
9
20
  {% endif %}
@@ -3,7 +3,10 @@
3
3
 
4
4
  {% macro OsGridRefField(component) %}
5
5
  {% set hasErrors = component.model.errorMessage %}
6
- <div class="govuk-form-group app-location-field {{ "govuk-form-group--error" if hasErrors }}" data-locationtype="{{component.type | lower}}">
6
+ <div class="govuk-form-group app-location-field {{ "govuk-form-group--error" if hasErrors }}"
7
+ data-locationtype="{{component.type | lower}}"
8
+ data-lang="{{component.model.lang}}"
9
+ data-maplayers="{{component.model.mapLayers}}">
7
10
  <div class="app-location-field-inputs">
8
11
  {{ TextField(component) }}
9
12
  </div>
@@ -16,7 +16,7 @@
16
16
  <p class="govuk-body">{{ t('components.paymentField.preAuthorisedBody') }}</p>
17
17
  {% else %}
18
18
  {# No pre-authorisation - show payment form #}
19
- <h2 class="govuk-heading-m">{{ model.label.text if model.label and model.label.text else t('components.paymentField.detailsRequired') }}</h2>
19
+ <h2 class="govuk-heading-m">{{ t('components.paymentField.detailsRequired') }}</h2>
20
20
 
21
21
  <p class="govuk-body">{{ description }}</p>
22
22
 
@@ -61,7 +61,7 @@
61
61
  },
62
62
  classes: "govuk-button--secondary govuk-!-margin-right-1 govuk-!-margin-bottom-0"
63
63
  }) }}
64
- <p class="govuk-body govuk-!-margin-bottom-0">or <button class="govuk-link govuk-button--link govuk-!-margin-right-1 govuk-!-margin-bottom-0" name="action" value="external-{{component.model.name}}--step:manual">{{ t('components.addressField.enterManually') }}</button></p>
64
+ <p class="govuk-body govuk-!-margin-bottom-0">{{ t('common.or')}} <button class="govuk-link govuk-button--link govuk-!-margin-right-1 govuk-!-margin-bottom-0" name="action" value="external-{{component.model.name}}--step:manual">{{ t('components.addressField.enterManually') }}</button></p>
65
65
  </div>
66
66
  {# Include a line break if this is the last component #}
67
67
  {% if components[components.length - 1] == component %}
@@ -15,7 +15,7 @@
15
15
  {% if formAction %}
16
16
  {{ govukButton({
17
17
  text: t('pages.fileUpload.upload'),
18
- classes: "govuk-button--secondary upload-file-button",
18
+ classes: "govuk-button--secondary upload-file-button js-hidden",
19
19
  preventDoubleClick: true,
20
20
  disabled: context.isForceAccess
21
21
  }) }}
@@ -8,7 +8,9 @@
8
8
  </p>
9
9
  {%- endmacro -%}
10
10
 
11
- {% call govukNotificationBanner() %}
11
+ {% call govukNotificationBanner({
12
+ titleText: t('pages.preview.bannerTitle')
13
+ }) %}
12
14
  {% set previewModeTranslated = t('common.' + previewMode) %}
13
15
  {% if not context.isForceAccess %}
14
16
  <p class="govuk-notification-banner__heading govuk-!-margin-bottom-0">
@@ -1,32 +1,35 @@
1
1
  {% extends baseLayoutPath %}
2
2
 
3
+ {% set t = context.translator.t %}
4
+ {% set tForm = context.translator.tForm %}
5
+
3
6
  {% block content %}
4
7
  <div class="govuk-grid-row">
5
8
  <div class="govuk-grid-column-two-thirds">
6
- <h1 class="govuk-heading-l">Sorry, this form is unavailable</h1>
7
- <p class="govuk-body">'{{ formTitle }}' is no longer available.</p>
8
- <h2 class="govuk-heading-m">Contact details for {{ organisationName }}</h2>
9
+ <h1 class="govuk-heading-l">{{ t('pages.formUnavailable.title') }}</h1>
10
+ <p class="govuk-body">{{ t('pages.formUnavailable.subHeading', { formTitle: formTitle }) }}</p>
11
+ <h2 class="govuk-heading-m">{{ t('pages.formUnavailable.contactDetailsHeading', { organisationName: organisationName }) }}</h2>
9
12
 
10
13
  {% if contact.phone %}
11
- <h3 class="govuk-heading-s">Telephone</h3>
14
+ <h3 class="govuk-heading-s">{{ t('pages.formUnavailable.telephone') }}</h3>
12
15
  <div class="app-prose-scope">
13
- {{ contact.phone | markdown(3) | safe }}
16
+ {{ tForm('contact.phone') | markdown(3) | safe }}
14
17
  </div>
15
- <p class="govuk-body"><a href="https://www.gov.uk/call-charges" class="govuk-link govuk-link--no-visited-state">Find out about call charges</a></p>
18
+ <p class="govuk-body"><a href="https://www.gov.uk/call-charges" class="govuk-link govuk-link--no-visited-state">{{ t('pages.formUnavailable.callCharges') }}</a></p>
16
19
  {% endif %}
17
20
 
18
21
  {% if contact.email %}
19
- <h3 class="govuk-heading-s">Email</h3>
22
+ <h3 class="govuk-heading-s">{{ t('pages.formUnavailable.email') }}</h3>
20
23
  <ul class="govuk-list">
21
- <li><a class="govuk-link govuk-link--no-visited-state" href="mailto:{{ contact.email.address }}">{{ contact.email.address }}</a></li>
22
- <li>{{ contact.email.responseTime }}</li>
24
+ <li><a class="govuk-link govuk-link--no-visited-state" href="mailto:{{ tForm('contact.email.address') }}">{{ tForm('contact.email.address') }}</a></li>
25
+ <li>{{ tForm('contact.email.responseTime') }}</li>
23
26
  </ul>
24
27
  {% endif %}
25
28
 
26
29
  {% if contact.online %}
27
- <h3 class="govuk-heading-s">Online contact form</h3>
30
+ <h3 class="govuk-heading-s">{{ t('pages.formUnavailable.onlineContactForm') }}</h3>
28
31
  <ul class="govuk-list">
29
- <li><a class="govuk-link govuk-link--no-visited-state" href="{{ contact.online.url }}">{{ contact.online.text }}</a></li>
32
+ <li><a class="govuk-link govuk-link--no-visited-state" href="{{ tForm('contact.online.url') }}">{{ tForm('contact.online.text') }}</a></li>
30
33
  </ul>
31
34
  {% endif %}
32
35
  </div>
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Nunjucks filter to add/replace a parameter on a query string of a url.
3
+ * Currently only used in forms-runner.
4
+ * @param {string} urlPath - existing relative url with query string
5
+ * @param {string} paramName - name of parameter
6
+ * @param {string} paramValue - value of parameter
7
+ * @returns {string}
8
+ */
9
+ export function applyUrlParam(urlPath, paramName, paramValue) {
10
+ if (typeof urlPath !== 'string') {
11
+ return ''
12
+ }
13
+ const url = new URL(urlPath, 'https://dummy')
14
+ url.searchParams.set(paramName, paramValue)
15
+
16
+ return url.pathname + url.search
17
+ }
@@ -6,3 +6,4 @@ export { href } from './href.js'
6
6
  export { field } from './field.js'
7
7
  export { page } from './page.js'
8
8
  export { merge } from './merge.js'
9
+ export { applyUrlParam } from './applyUrlParam.js'
@@ -1,5 +1,6 @@
1
1
  import { format } from 'date-fns'
2
2
 
3
+ import { toLanguageLocale } from '../engine/helpers.js'
3
4
  import { PaymentService } from './service.js'
4
5
 
5
6
  export const DEFAULT_PAYMENT_HELP_URL =
@@ -28,10 +29,29 @@ export async function createPaymentService(
28
29
  /**
29
30
  * Formats a payment date for display
30
31
  * @param {string} isoString - ISO date string
32
+ * @param {string} language - the target language
31
33
  * @returns {string} Formatted date string (e.g., "26 January 2026 5:01pm")
32
34
  */
33
- export function formatPaymentDate(isoString) {
34
- return format(new Date(isoString), 'd MMMM yyyy h:mmaaa')
35
+ export function formatPaymentDate(isoString, language) {
36
+ return formatDateForLanguage(
37
+ new Date(isoString),
38
+ 'd MMMM yyyy h:mmaaa',
39
+ language
40
+ )
41
+ }
42
+
43
+ /**
44
+ * Formats a date for display in a specific language.
45
+ * To use additional languages, the appropriate module must be imported from 'date-fns/locale'
46
+ * @param { Date | string } date - the date
47
+ * @param {string} formatMask - the format mask
48
+ * @param {string} language - the target language
49
+ * @returns {string} Formatted date string (e.g., "26 January 2026 5:01pm")
50
+ */
51
+ export function formatDateForLanguage(date, formatMask, language) {
52
+ return format(date, formatMask, {
53
+ locale: toLanguageLocale(language)
54
+ })
35
55
  }
36
56
 
37
57
  /**
@@ -1,6 +1,7 @@
1
1
  import { StatusCodes } from 'http-status-codes'
2
2
 
3
3
  import { logger } from '../../common/helpers/logging/logger.js'
4
+ import { toPayLanguageCode } from '../engine/helpers.js'
4
5
  import {
5
6
  buildPaymentInfo,
6
7
  convertPenceToPounds
@@ -38,7 +39,7 @@ export class PaymentService {
38
39
  * @param {string} returnUrl
39
40
  * @param {string} reference
40
41
  * @param {boolean} isLivePayment
41
- * @param {{ formId: string, slug: string } | undefined } metadata
42
+ * @param {{ formId: string, slug: string, language: string } | undefined } metadata
42
43
  * @param {string} [email] - optional email to prepopulate on GOV.UK Pay
43
44
  */
44
45
  async createPayment(
@@ -50,6 +51,8 @@ export class PaymentService {
50
51
  metadata,
51
52
  email
52
53
  ) {
54
+ const language = toPayLanguageCode(metadata?.language)
55
+
53
56
  try {
54
57
  /** @type {CreatePaymentRequest} */
55
58
  const payload = {
@@ -58,7 +61,8 @@ export class PaymentService {
58
61
  reference,
59
62
  metadata,
60
63
  return_url: returnUrl,
61
- delayed_capture: true
64
+ delayed_capture: true,
65
+ language
62
66
  }
63
67
 
64
68
  // Prepopulate email on GOV.UK Pay if provided
@@ -18,6 +18,7 @@
18
18
  * @property {string} reference - Unique reference for the payment
19
19
  * @property {string} description - Human-readable description of the payment
20
20
  * @property {string} return_url - URL to redirect the user to after payment
21
+ * @property {string} language - the desired language for translations
21
22
  * @property {boolean} [delayed_capture] - Whether to delay capturing the payment
22
23
  * @property {{ formId: string, slug: string }} [metadata] - Additional metadata for the payment
23
24
  * @property {string} [email] - Email to prepopulate on GOV.UK Pay (max 254 chars)