@defra/forms-engine-plugin 5.0.0-alpha.1 → 5.0.0-alpha.11

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 (301) 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.js +10 -31
  11. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  12. package/.server/client/javascripts/govuk.js +2 -1
  13. package/.server/client/javascripts/govuk.js.map +1 -1
  14. package/.server/client/javascripts/location-map.js +11 -2
  15. package/.server/client/javascripts/location-map.js.map +1 -1
  16. package/.server/client/javascripts/map.d.ts +6 -0
  17. package/.server/client/javascripts/map.js +37 -0
  18. package/.server/client/javascripts/map.js.map +1 -1
  19. package/.server/client/javascripts/maps.d.ts +5 -0
  20. package/.server/client/javascripts/maps.js +6 -0
  21. package/.server/client/javascripts/maps.js.map +1 -0
  22. package/.server/client/javascripts/shared.d.ts +1 -3
  23. package/.server/client/javascripts/shared.js +1 -3
  24. package/.server/client/javascripts/shared.js.map +1 -1
  25. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  26. package/.server/client/javascripts/sssi-dataset.js +37 -39
  27. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  28. package/.server/client/stylesheets/maps.scss +4 -0
  29. package/.server/client/stylesheets/shared.scss +1 -5
  30. package/.server/server/constants.d.ts +2 -0
  31. package/.server/server/constants.js +2 -0
  32. package/.server/server/constants.js.map +1 -1
  33. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  34. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  35. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  36. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +4 -1
  37. package/.server/server/plugins/engine/components/CheckboxesField.js +13 -0
  38. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  39. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  40. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  41. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  42. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  43. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  44. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  45. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  46. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  48. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  49. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  50. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  51. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +29 -2
  52. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  53. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  54. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  55. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  56. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/FileUploadField.d.ts +12 -0
  58. package/.server/server/plugins/engine/components/FileUploadField.js +23 -3
  59. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  61. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  62. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  63. package/.server/server/plugins/engine/components/GeospatialField.d.ts +1 -0
  64. package/.server/server/plugins/engine/components/GeospatialField.js +1 -1
  65. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  66. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  67. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  68. package/.server/server/plugins/engine/components/LatLongField.d.ts +28 -2
  69. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  70. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  71. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  72. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  73. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  74. package/.server/server/plugins/engine/components/LocationFieldBase.js +18 -5
  75. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  76. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +8 -3
  77. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +13 -12
  78. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  79. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  80. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  81. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  82. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  83. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  84. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  85. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  86. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  87. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  88. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  89. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  90. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  91. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  92. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  93. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  94. package/.server/server/plugins/engine/components/OsGridRefField.js +4 -3
  95. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  96. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  97. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  98. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  99. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  100. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  101. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  103. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  104. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  105. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  106. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  107. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  108. package/.server/server/plugins/engine/components/helpers/components.js +1 -2
  109. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  110. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +3 -1
  111. package/.server/server/plugins/engine/components/helpers/geospatial.js +32 -0
  112. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  113. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  114. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  115. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  116. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  117. package/.server/server/plugins/engine/components/types.js.map +1 -1
  118. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  119. package/.server/server/plugins/engine/helpers.js +44 -5
  120. package/.server/server/plugins/engine/helpers.js.map +1 -1
  121. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +3 -0
  122. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +10 -7
  123. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  124. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  125. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  126. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  127. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  128. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  129. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  130. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  131. package/.server/server/plugins/engine/i18n/form.js +35 -0
  132. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  133. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  134. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  135. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  136. package/.server/server/plugins/engine/i18n/translations/cy.json +85 -8
  137. package/.server/server/plugins/engine/i18n/translations/en-GB.json +55 -6
  138. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  139. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  140. package/.server/server/plugins/engine/index.d.ts +4 -0
  141. package/.server/server/plugins/engine/index.js +4 -0
  142. package/.server/server/plugins/engine/index.js.map +1 -1
  143. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  144. package/.server/server/plugins/engine/models/FormModel.js +9 -15
  145. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  146. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  147. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  148. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
  149. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  150. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  151. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  152. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  153. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  154. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  155. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  156. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  157. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  158. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  159. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  160. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  161. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  162. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  163. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  164. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  165. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  166. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
  167. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  168. package/.server/server/plugins/engine/pageControllers/validationOptions.js +23 -2
  169. package/.server/server/plugins/engine/pageControllers/validationOptions.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 +5 -0
  173. package/.server/server/plugins/engine/types.js.map +1 -1
  174. package/.server/server/plugins/engine/views/components/_location-field-base.html +2 -1
  175. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  176. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  177. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  178. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  179. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  180. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  181. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  182. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  183. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  184. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  185. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  186. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  187. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  188. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  189. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  190. package/.server/server/plugins/payment/helper.d.ts +11 -1
  191. package/.server/server/plugins/payment/helper.js +18 -2
  192. package/.server/server/plugins/payment/helper.js.map +1 -1
  193. package/.server/server/plugins/payment/helper.test.js +2 -1
  194. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  195. package/.server/server/plugins/payment/service.d.ts +2 -1
  196. package/.server/server/plugins/payment/service.js +5 -2
  197. package/.server/server/plugins/payment/service.js.map +1 -1
  198. package/.server/server/plugins/payment/service.test.js +7 -3
  199. package/.server/server/plugins/payment/service.test.js.map +1 -1
  200. package/.server/server/plugins/payment/types.d.ts +4 -0
  201. package/.server/server/plugins/payment/types.js +1 -0
  202. package/.server/server/plugins/payment/types.js.map +1 -1
  203. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  204. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  205. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  206. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  207. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  208. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  209. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  210. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  211. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  212. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  213. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  214. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  215. package/.server/server/utils/type-utils.d.ts +1 -2
  216. package/.server/server/utils/type-utils.js +0 -3
  217. package/.server/server/utils/type-utils.js.map +1 -1
  218. package/.server/server/utils/utils.d.ts +6 -0
  219. package/.server/server/utils/utils.js +18 -1
  220. package/.server/server/utils/utils.js.map +1 -1
  221. package/.server/server/utils/utils.test.js +21 -1
  222. package/.server/server/utils/utils.test.js.map +1 -1
  223. package/package.json +9 -2
  224. package/src/client/javascripts/file-upload.js +11 -3
  225. package/src/client/javascripts/geospatial-map.js +7 -34
  226. package/src/client/javascripts/govuk.js +2 -0
  227. package/src/client/javascripts/location-map.js +9 -1
  228. package/src/client/javascripts/map.js +42 -0
  229. package/src/client/javascripts/maps.js +5 -0
  230. package/src/client/javascripts/shared.js +1 -3
  231. package/src/client/javascripts/sssi-dataset.js +39 -41
  232. package/src/client/stylesheets/maps.scss +4 -0
  233. package/src/client/stylesheets/shared.scss +1 -5
  234. package/src/server/constants.js +2 -0
  235. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  236. package/src/server/plugins/engine/components/CheckboxesField.ts +13 -1
  237. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  238. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  239. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  240. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  241. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  242. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  243. package/src/server/plugins/engine/components/FileUploadField.ts +24 -3
  244. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  245. package/src/server/plugins/engine/components/GeospatialField.ts +6 -1
  246. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  247. package/src/server/plugins/engine/components/LocationFieldBase.ts +23 -6
  248. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +20 -13
  249. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  250. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  251. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  252. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  253. package/src/server/plugins/engine/components/OsGridRefField.ts +9 -3
  254. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  255. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  256. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  257. package/src/server/plugins/engine/components/helpers/components.ts +1 -2
  258. package/src/server/plugins/engine/components/helpers/geospatial.ts +53 -0
  259. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  260. package/src/server/plugins/engine/components/types.ts +1 -0
  261. package/src/server/plugins/engine/helpers.ts +52 -5
  262. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +10 -7
  263. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  264. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  265. package/src/server/plugins/engine/i18n/form.ts +54 -0
  266. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  267. package/src/server/plugins/engine/i18n/translations/cy.json +85 -8
  268. package/src/server/plugins/engine/i18n/translations/en-GB.json +55 -6
  269. package/src/server/plugins/engine/i18n/types.ts +2 -0
  270. package/src/server/plugins/engine/index.ts +7 -0
  271. package/src/server/plugins/engine/models/FormModel.ts +9 -15
  272. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  273. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
  274. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  275. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  276. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  277. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  278. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  279. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  280. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
  281. package/src/server/plugins/engine/pageControllers/validationOptions.ts +27 -2
  282. package/src/server/plugins/engine/types/schema.ts +1 -0
  283. package/src/server/plugins/engine/types.ts +5 -0
  284. package/src/server/plugins/engine/views/components/_location-field-base.html +2 -1
  285. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  286. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  287. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  288. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  289. package/src/server/plugins/engine/views/file-upload.html +1 -1
  290. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  291. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  292. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  293. package/src/server/plugins/payment/helper.js +22 -2
  294. package/src/server/plugins/payment/service.js +6 -2
  295. package/src/server/plugins/payment/types.js +1 -0
  296. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  297. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  298. package/src/server/plugins/postcode-lookup/types.js +6 -1
  299. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  300. package/src/server/utils/type-utils.ts +1 -11
  301. package/src/server/utils/utils.js +19 -1
@@ -15,6 +15,7 @@ import {
15
15
  type Field,
16
16
  type Guidance
17
17
  } from './helpers/components.js'
18
+ import { getTranslatedLabel } from './helpers/index.js'
18
19
  import {
19
20
  type ComponentViewModel,
20
21
  type RenderContext
@@ -302,26 +303,28 @@ export class ComponentCollection {
302
303
  for (const subField of field.collection.fields) {
303
304
  const translatedSubLabel = t(subField.title) || subField.label
304
305
  let patchedSchema = subField.formSchema.label(translatedSubLabel)
305
- if (messagesOverride) {
306
- patchedSchema = patchedSchema.messages(messagesOverride)
306
+ const subFieldMessages = messagesOverride
307
+ ? messagesOverride[subField.name]
308
+ : undefined
309
+ if (subFieldMessages) {
310
+ patchedSchema = patchedSchema.messages(subFieldMessages)
307
311
  }
308
312
  labelOverrides[subField.name] = patchedSchema
309
313
  }
310
314
  } else {
311
- const translatedLabel =
312
- translator.tComponent(
313
- field as unknown as ComponentDef,
314
- 'shortDescription'
315
- ) ||
316
- translator.tComponent(field as unknown as ComponentDef, 'title')
315
+ const fieldDef = field.def
316
+ const translatedLabel = getTranslatedLabel(fieldDef, translator)
317
317
  const messagesOverride =
318
318
  field.getValidationMessagesOverride(translator)
319
319
  let patchedSchema = field.formSchema
320
320
  if (translatedLabel && translatedLabel !== field.label) {
321
321
  patchedSchema = patchedSchema.label(translatedLabel)
322
322
  }
323
- if (messagesOverride) {
324
- patchedSchema = patchedSchema.messages(messagesOverride)
323
+ const fieldMessages = messagesOverride
324
+ ? messagesOverride[field.name]
325
+ : undefined
326
+ if (fieldMessages) {
327
+ patchedSchema = patchedSchema.messages(fieldMessages)
325
328
  }
326
329
  if (patchedSchema !== field.formSchema) {
327
330
  labelOverrides[field.name] = patchedSchema
@@ -340,10 +343,12 @@ export class ComponentCollection {
340
343
  })
341
344
 
342
345
  const details = result.error?.details
346
+ const language = translator?.language
343
347
 
344
348
  return {
345
349
  value: (result.value ?? {}) as typeof value,
346
- errors: this.page?.getErrors(details) ?? getErrors(details)
350
+ errors:
351
+ this.page?.getErrors(details, language) ?? getErrors(language, details)
347
352
  }
348
353
  }
349
354
 
@@ -1,6 +1,11 @@
1
1
  import { ComponentType, type DatePartsFieldComponent } from '@defra/forms-model'
2
2
  import { add, format, isValid, parse, startOfToday, sub } from 'date-fns'
3
- import { type Context, type CustomValidator, type ObjectSchema } from 'joi'
3
+ import {
4
+ type Context,
5
+ type CustomValidator,
6
+ type LanguageMessages,
7
+ type ObjectSchema
8
+ } from 'joi'
4
9
 
5
10
  import { ComponentCollection } from './ComponentCollection.js'
6
11
  import {
@@ -25,7 +30,7 @@ import {
25
30
  type FormStateValue,
26
31
  type FormSubmissionState
27
32
  } from '../types.js'
28
- import { convertToLanguageMessages } from '../../../utils/type-utils.js'
33
+ import { formatDateForLanguage } from '../../payment/helper.js'
29
34
 
30
35
  export class DatePartsField extends FormComponent {
31
36
  declare options: DatePartsFieldComponent['options']
@@ -43,7 +48,7 @@ export class DatePartsField extends FormComponent {
43
48
 
44
49
  const isRequired = options.required !== false
45
50
 
46
- const customValidationMessages = convertToLanguageMessages({
51
+ const customValidationMessages = {
47
52
  'any.required': messageTemplate.objectMissing,
48
53
  'number.base': messageTemplate.objectMissing,
49
54
  'number.precision': messageTemplate.dateFormat,
@@ -51,7 +56,7 @@ export class DatePartsField extends FormComponent {
51
56
  'number.unsafe': messageTemplate.dateFormat,
52
57
  'number.min': messageTemplate.dateFormat,
53
58
  'number.max': messageTemplate.dateFormat
54
- })
59
+ } as LanguageMessages
55
60
 
56
61
  this.collection = new ComponentCollection(
57
62
  [
@@ -111,15 +116,16 @@ export class DatePartsField extends FormComponent {
111
116
 
112
117
  getDisplayStringFromFormValue(
113
118
  formValue: DatePartsState | undefined,
114
- _translator: Translator
119
+ translator: Translator
115
120
  ) {
116
121
  if (!formValue) {
117
122
  return ''
118
123
  }
119
124
 
120
- return format(
125
+ return formatDateForLanguage(
121
126
  `${formValue.year}-${formValue.month}-${formValue.day}`,
122
- 'd MMMM yyyy'
127
+ 'd MMMM yyyy',
128
+ translator.language
123
129
  )
124
130
  }
125
131
 
@@ -158,7 +164,7 @@ export class DatePartsField extends FormComponent {
158
164
 
159
165
  getValidationMessagesOverride(translator: Translator) {
160
166
  const { t } = translator
161
- return convertToLanguageMessages({
167
+ const messages = {
162
168
  'any.required': buildValidationMessages(t).objectMissing,
163
169
  'number.base': buildValidationMessages(t).objectMissing,
164
170
  'number.precision': buildValidationMessages(t).dateFormat,
@@ -166,7 +172,12 @@ export class DatePartsField extends FormComponent {
166
172
  'number.unsafe': buildValidationMessages(t).dateFormat,
167
173
  'number.min': buildValidationMessages(t).dateFormat,
168
174
  'number.max': buildValidationMessages(t).dateFormat
169
- })
175
+ } as LanguageMessages
176
+ return {
177
+ [`${this.name}__day`]: messages,
178
+ [`${this.name}__month`]: messages,
179
+ [`${this.name}__year`]: messages
180
+ }
170
181
  }
171
182
 
172
183
  getViewModel(context: RenderContext) {
@@ -2,7 +2,6 @@ import {
2
2
  ComponentType,
3
3
  hasFormComponents,
4
4
  isFormType,
5
- type ComponentDef,
6
5
  type DeclarationFieldComponent,
7
6
  type Item
8
7
  } from '@defra/forms-model'
@@ -121,10 +120,12 @@ export class DeclarationField extends FormComponent {
121
120
  const { declarationRequired } = buildValidationMessages(translator.t)
122
121
  const msg = declarationRequired as unknown as string
123
122
  return {
124
- 'any.required': msg,
125
- 'any.unknown': msg,
126
- 'array.includesRequiredUnknowns': msg
127
- } as unknown as LanguageMessages
123
+ [this.name]: {
124
+ 'any.required': msg,
125
+ 'any.unknown': msg,
126
+ 'array.includesRequiredUnknowns': msg
127
+ } as unknown as LanguageMessages
128
+ }
128
129
  }
129
130
 
130
131
  getDisplayStringFromFormValue(
@@ -148,7 +149,7 @@ export class DeclarationField extends FormComponent {
148
149
  'components.declarationField.defaultLabel'
149
150
  )
150
151
  } = this
151
- const content = tComponent(this as unknown as ComponentDef, 'content')
152
+ const content = tComponent(this.def, 'content')
152
153
 
153
154
  const viewModel = super.getViewModel(context)
154
155
  let { fieldset, label } = viewModel
@@ -15,7 +15,11 @@ import {
15
15
  getLocationFieldViewModel
16
16
  } from './LocationFieldHelpers.js'
17
17
  import { NumberField } from './NumberField.js'
18
- import { createLowerFirstExpression } from './helpers/index.js'
18
+ import { getEastingNorthingCountryValidator } from './helpers/geospatial.js'
19
+ import {
20
+ createLowerFirstExpression,
21
+ getTranslatedLabel
22
+ } from './helpers/index.js'
19
23
  import {
20
24
  type EastingNorthingState,
21
25
  type RenderContext
@@ -31,7 +35,6 @@ import {
31
35
  type FormSubmissionError,
32
36
  type FormSubmissionState
33
37
  } from '../types.js'
34
- import { convertToLanguageMessages } from '../../../utils/type-utils.js'
35
38
 
36
39
  // British National Grid coordinate limits
37
40
  const DEFAULT_EASTING_MIN = 0
@@ -55,89 +58,18 @@ export class EastingNorthingField extends FormComponent {
55
58
 
56
59
  const isRequired = options.required !== false
57
60
 
58
- const eastingMin = schema?.easting?.min ?? DEFAULT_EASTING_MIN
59
- const eastingMax = schema?.easting?.max ?? DEFAULT_EASTING_MAX
60
- const northingMin = schema?.northing?.min ?? DEFAULT_NORTHING_MIN
61
- const northingMax = schema?.northing?.max ?? DEFAULT_NORTHING_MAX
62
-
63
- const fieldLabel = lowerFirst(this.label)
61
+ const { eastingMin, eastingMax, northingMin, northingMax } =
62
+ EastingNorthingField.getMinMax(schema)
64
63
 
65
- const eastingDigitsMessage = tPlugin(
66
- 'components.eastingNorthingField.eastingDigits',
67
- 'en-GB',
68
- { fieldLabel }
69
- )
70
- const northingDigitsMessage = tPlugin(
71
- 'components.eastingNorthingField.northingDigits',
72
- 'en-GB',
73
- { fieldLabel }
74
- )
75
-
76
- const customValidationMessages: LanguageMessages =
77
- convertToLanguageMessages({
78
- 'any.required': tPlugin(
79
- 'components.eastingNorthingField.eastingRequired',
80
- 'en-GB'
81
- ),
82
- 'number.base': tPlugin(
83
- 'components.eastingNorthingField.eastingRequired',
84
- 'en-GB'
85
- ),
86
- 'number.min': tPlugin(
87
- 'components.eastingNorthingField.eastingRange',
88
- 'en-GB',
89
- {
90
- fieldLabel,
91
- min: eastingMin,
92
- max: eastingMax
93
- }
94
- ),
95
- 'number.max': tPlugin(
96
- 'components.eastingNorthingField.eastingRange',
97
- 'en-GB',
98
- {
99
- fieldLabel,
100
- min: eastingMin,
101
- max: eastingMax
102
- }
103
- ),
104
- 'number.precision': eastingDigitsMessage,
105
- 'number.integer': eastingDigitsMessage,
106
- 'number.unsafe': eastingDigitsMessage
107
- })
108
-
109
- const northingValidationMessages: LanguageMessages =
110
- convertToLanguageMessages({
111
- 'any.required': tPlugin(
112
- 'components.eastingNorthingField.northingRequired',
113
- 'en-GB'
114
- ),
115
- 'number.base': tPlugin(
116
- 'components.eastingNorthingField.northingRequired',
117
- 'en-GB'
118
- ),
119
- 'number.min': tPlugin(
120
- 'components.eastingNorthingField.northingRange',
121
- 'en-GB',
122
- {
123
- fieldLabel,
124
- min: northingMin,
125
- max: northingMax
126
- }
127
- ),
128
- 'number.max': tPlugin(
129
- 'components.eastingNorthingField.northingRange',
130
- 'en-GB',
131
- {
132
- fieldLabel,
133
- min: northingMin,
134
- max: northingMax
135
- }
136
- ),
137
- 'number.precision': northingDigitsMessage,
138
- 'number.integer': northingDigitsMessage,
139
- 'number.unsafe': northingDigitsMessage
140
- })
64
+ const { eastingValidationMessages, northingValidationMessages } =
65
+ EastingNorthingField.buildErrorMessages(
66
+ this.label,
67
+ eastingMin,
68
+ eastingMax,
69
+ northingMin,
70
+ northingMax,
71
+ 'en-GB'
72
+ )
141
73
 
142
74
  this.collection = new ComponentCollection(
143
75
  [
@@ -154,7 +86,7 @@ export class EastingNorthingField extends FormComponent {
154
86
  required: isRequired,
155
87
  optionalText: true,
156
88
  classes: 'govuk-input--width-10',
157
- customValidationMessages
89
+ customValidationMessages: eastingValidationMessages
158
90
  }
159
91
  },
160
92
  {
@@ -181,6 +113,18 @@ export class EastingNorthingField extends FormComponent {
181
113
  )
182
114
 
183
115
  this.options = options
116
+
117
+ const country = options.countries?.at(0)
118
+
119
+ if (country) {
120
+ this.collection.formSchema = this.collection.formSchema.custom(
121
+ getEastingNorthingCountryValidator(this, country)
122
+ )
123
+ this.collection.stateSchema = this.collection.stateSchema.custom(
124
+ getEastingNorthingCountryValidator(this, country)
125
+ )
126
+ }
127
+
184
128
  this.formSchema = this.collection.formSchema
185
129
  this.stateSchema = this.collection.stateSchema
186
130
  }
@@ -192,14 +136,15 @@ export class EastingNorthingField extends FormComponent {
192
136
 
193
137
  getDisplayStringFromFormValue(
194
138
  value: EastingNorthingState | undefined,
195
- _translator: Translator
139
+ translator: Translator
196
140
  ): string {
197
141
  if (!value) {
198
142
  return ''
199
143
  }
200
144
 
201
- // CYA page format: <<eastingvalue, northingvalue>>
202
- return `${value.easting}, ${value.northing}`
145
+ const { t } = translator
146
+
147
+ return `${t('components.eastingNorthingField.easting')}: ${value.easting}\n${t('components.eastingNorthingField.northing')}: ${value.northing}`
203
148
  }
204
149
 
205
150
  getDisplayStringFromState(
@@ -218,7 +163,7 @@ export class EastingNorthingField extends FormComponent {
218
163
  return null
219
164
  }
220
165
 
221
- return `Easting: ${value.easting}\nNorthing: ${value.northing}`
166
+ return `${value.easting}, ${value.northing}`
222
167
  }
223
168
 
224
169
  getContextValueFromState(state: FormSubmissionState) {
@@ -232,6 +177,24 @@ export class EastingNorthingField extends FormComponent {
232
177
  return getLocationFieldViewModel(this, viewModel, context)
233
178
  }
234
179
 
180
+ getErrors(
181
+ translator: Translator,
182
+ errors?: FormSubmissionError[]
183
+ ): FormSubmissionError[] | undefined {
184
+ const fieldErrors = super.getErrors(translator, errors)
185
+
186
+ fieldErrors?.forEach((err) => {
187
+ if (err.context?.country) {
188
+ err.text = translator.t(
189
+ 'components.eastingNorthingField.wrongCountry',
190
+ { country: err.context.country }
191
+ )
192
+ }
193
+ })
194
+
195
+ return fieldErrors
196
+ }
197
+
235
198
  getViewErrors(
236
199
  translator: Translator,
237
200
  errors?: FormSubmissionError[]
@@ -244,6 +207,26 @@ export class EastingNorthingField extends FormComponent {
244
207
  return EastingNorthingField.isEastingNorthing(value)
245
208
  }
246
209
 
210
+ getValidationMessagesOverride(translator: Translator) {
211
+ const def = this.def as EastingNorthingFieldComponent
212
+ const translatedLabel = getTranslatedLabel(def, translator)
213
+ const { eastingMin, eastingMax, northingMin, northingMax } =
214
+ EastingNorthingField.getMinMax(def.schema)
215
+ const { eastingValidationMessages, northingValidationMessages } =
216
+ EastingNorthingField.buildErrorMessages(
217
+ translatedLabel,
218
+ eastingMin,
219
+ eastingMax,
220
+ northingMin,
221
+ northingMax,
222
+ translator.language
223
+ )
224
+ return {
225
+ [`${this.name}__easting`]: eastingValidationMessages,
226
+ [`${this.name}__northing`]: northingValidationMessages
227
+ }
228
+ }
229
+
247
230
  /**
248
231
  * For error preview page that shows all possible errors on a component
249
232
  */
@@ -309,4 +292,117 @@ export class EastingNorthingField extends FormComponent {
309
292
  NumberField.isNumber(value.northing)
310
293
  )
311
294
  }
295
+
296
+ static buildErrorMessages(
297
+ label: string,
298
+ eastingMin: number,
299
+ eastingMax: number,
300
+ northingMin: number,
301
+ northingMax: number,
302
+ language: string
303
+ ) {
304
+ const fieldLabel = lowerFirst(label)
305
+
306
+ const eastingDigitsMessage = tPlugin(
307
+ 'components.eastingNorthingField.eastingDigits',
308
+ language,
309
+ { fieldLabel }
310
+ )
311
+ const northingDigitsMessage = tPlugin(
312
+ 'components.eastingNorthingField.northingDigits',
313
+ language,
314
+ { fieldLabel }
315
+ )
316
+
317
+ const eastingValidationMessages: LanguageMessages = {
318
+ 'any.required': tPlugin(
319
+ 'components.eastingNorthingField.eastingRequired',
320
+ language
321
+ ),
322
+ 'number.base': tPlugin(
323
+ 'components.eastingNorthingField.eastingRequired',
324
+ language
325
+ ),
326
+ 'number.min': tPlugin(
327
+ 'components.eastingNorthingField.eastingRange',
328
+ language,
329
+ {
330
+ fieldLabel,
331
+ min: eastingMin,
332
+ max: eastingMax
333
+ }
334
+ ),
335
+ 'number.max': tPlugin(
336
+ 'components.eastingNorthingField.eastingRange',
337
+ language,
338
+ {
339
+ fieldLabel,
340
+ min: eastingMin,
341
+ max: eastingMax
342
+ }
343
+ ),
344
+ 'number.precision': eastingDigitsMessage,
345
+ 'number.integer': eastingDigitsMessage,
346
+ 'number.unsafe': eastingDigitsMessage
347
+ }
348
+
349
+ const northingValidationMessages: LanguageMessages = {
350
+ 'any.required': tPlugin(
351
+ 'components.eastingNorthingField.northingRequired',
352
+ language
353
+ ),
354
+ 'number.base': tPlugin(
355
+ 'components.eastingNorthingField.northingRequired',
356
+ language
357
+ ),
358
+ 'number.min': tPlugin(
359
+ 'components.eastingNorthingField.northingRange',
360
+ language,
361
+ {
362
+ fieldLabel,
363
+ min: northingMin,
364
+ max: northingMax
365
+ }
366
+ ),
367
+ 'number.max': tPlugin(
368
+ 'components.eastingNorthingField.northingRange',
369
+ language,
370
+ {
371
+ fieldLabel,
372
+ min: northingMin,
373
+ max: northingMax
374
+ }
375
+ ),
376
+ 'number.precision': northingDigitsMessage,
377
+ 'number.integer': northingDigitsMessage,
378
+ 'number.unsafe': northingDigitsMessage
379
+ }
380
+ return {
381
+ eastingValidationMessages,
382
+ northingValidationMessages
383
+ }
384
+ }
385
+
386
+ // Read schema values from def.schema with fallback defaults
387
+ static getMinMax(
388
+ schema:
389
+ | {
390
+ easting?: {
391
+ min?: number
392
+ max?: number
393
+ }
394
+ northing?: {
395
+ min?: number
396
+ max?: number
397
+ }
398
+ }
399
+ | undefined
400
+ ) {
401
+ return {
402
+ eastingMin: schema?.easting?.min ?? DEFAULT_EASTING_MIN,
403
+ eastingMax: schema?.easting?.max ?? DEFAULT_EASTING_MAX,
404
+ northingMin: schema?.northing?.min ?? DEFAULT_NORTHING_MIN,
405
+ northingMax: schema?.northing?.max ?? DEFAULT_NORTHING_MAX
406
+ }
407
+ }
312
408
  }
@@ -40,7 +40,8 @@ export class EmailAddressField extends FormComponent {
40
40
  formSchema = formSchema.messages({
41
41
  'any.required': message,
42
42
  'string.empty': message,
43
- 'string.email': message
43
+ 'string.email': message,
44
+ 'string.unicode': message
44
45
  })
45
46
  } else if (options.customValidationMessages) {
46
47
  formSchema = formSchema.messages(options.customValidationMessages)
@@ -5,11 +5,13 @@ import {
5
5
  import Boom from '@hapi/boom'
6
6
  import joi, { type ArraySchema } from 'joi'
7
7
 
8
+ import { EN_GB } from '../../../constants.js'
8
9
  import {
9
10
  FormComponent,
10
11
  isUploadState
11
12
  } from './FormComponent.js'
12
13
  import { type RenderContext } from './types.js'
14
+ import { t as tPlugin } from '../i18n/index.js'
13
15
  import { type Translator } from '../i18n/types.js'
14
16
  import { InvalidComponentStateError } from '../pageControllers/errors.js'
15
17
  import { messageTemplate } from '../pageControllers/validationOptions.js'
@@ -50,7 +52,9 @@ export const tempFileSchema = fileSchema.append({
50
52
  .string()
51
53
  .valid(FileStatus.complete, FileStatus.rejected, FileStatus.pending)
52
54
  .required(),
53
- errorMessage: joi.string().optional()
55
+ errorMessage: joi.string().optional(),
56
+ errorCode: joi.string().optional(),
57
+ errorParams: joi.any().optional()
54
58
  })
55
59
 
56
60
  export const formFileSchema = fileSchema.append({
@@ -142,6 +146,8 @@ export class FileUploadField extends FormComponent {
142
146
  formSchema = formSchema.length(schema.length)
143
147
  }
144
148
 
149
+ formSchema = formSchema.messages(FileUploadField.buildErrorMessages(EN_GB))
150
+
145
151
  this.formSchema = formSchema.items(formItemSchema)
146
152
  this.stateSchema = formSchema
147
153
  .items(formItemSchema)
@@ -169,7 +175,7 @@ export class FileUploadField extends FormComponent {
169
175
  return ''
170
176
  }
171
177
 
172
- return translator.t('components.fileUploadField.filesCount', {
178
+ return translator.t('pages.summary.fileUpload', {
173
179
  count: files.length
174
180
  })
175
181
  }
@@ -244,7 +250,7 @@ export class FileUploadField extends FormComponent {
244
250
 
245
251
  items.push({
246
252
  href,
247
- text: 'Remove',
253
+ text: t('pages.fileUpload.remove'),
248
254
  classes: 'govuk-link--no-visited-state',
249
255
  attributes: { id: `${id}__${index}` },
250
256
  visuallyHiddenText: file.filename
@@ -300,6 +306,13 @@ export class FileUploadField extends FormComponent {
300
306
  return isUploadState(value)
301
307
  }
302
308
 
309
+ getValidationMessagesOverride(translator: Translator) {
310
+ const { language } = translator
311
+ return {
312
+ [this.name]: FileUploadField.buildErrorMessages(language)
313
+ }
314
+ }
315
+
303
316
  /**
304
317
  * For error preview page that shows all possible errors on a component
305
318
  */
@@ -403,4 +416,12 @@ export class FileUploadField extends FormComponent {
403
416
  ]
404
417
  }
405
418
  }
419
+
420
+ static buildErrorMessages(language: string) {
421
+ return {
422
+ 'array.min': tPlugin('validation.filesMin', language),
423
+ 'array.max': tPlugin('validation.filesMax', language),
424
+ 'array.length': tPlugin('validation.filesLength', language)
425
+ }
426
+ }
406
427
  }
@@ -1,5 +1,4 @@
1
1
  import {
2
- type ComponentDef,
3
2
  type FormComponentsDef,
4
3
  type FormMetadata,
5
4
  type Item
@@ -158,10 +157,13 @@ export class FormComponent extends ComponentBase {
158
157
  * Override in composite fields to return translated Joi message overrides for
159
158
  * their sub-fields, applied at validation time so schema-level English messages
160
159
  * are replaced with the correct language. Return null to skip message patching.
160
+ * The return object may contain message overrides at component-level, or sub-field-level.
161
+ * This would allow different error message overrides per field within a collection e.g.
162
+ * for EastingNothingField
161
163
  */
162
164
  getValidationMessagesOverride(
163
165
  _translator: Translator
164
- ): LanguageMessages | null {
166
+ ): Record<string, LanguageMessages> | null {
165
167
  return null
166
168
  }
167
169
 
@@ -178,15 +180,14 @@ export class FormComponent extends ComponentBase {
178
180
  const isRequired = !('required' in options) || options.required !== false
179
181
  const hideOptional = 'optionalText' in options && options.optionalText
180
182
 
181
- const resolvedTitle =
182
- tComponent(this as unknown as ComponentDef, 'title') || title
183
+ const resolvedTitle = tComponent(this.def, 'title') || title
183
184
  const optionalTag =
184
185
  !isRequired && !hideOptional ? ` ${t('common.optional')}` : ''
185
186
  const label = `${resolvedTitle}${optionalTag}`
186
187
 
187
188
  if (hint) {
188
189
  viewModel.hint = {
189
- text: tComponent(this as unknown as ComponentDef, 'hint') || hint
190
+ text: tComponent(this.def, 'hint') || hint
190
191
  }
191
192
  }
192
193
 
@@ -125,7 +125,12 @@ export class GeospatialField extends FormComponent {
125
125
  err.href = `#description_${err.path[1]}`
126
126
  err.text = translator.t(
127
127
  'components.geospatialField.validation.wrongCountry',
128
- { count: Number(err.path[1]) + 1, country: err.context.country }
128
+ {
129
+ count: Number(err.path[1]) + 1,
130
+ country: translator.t(
131
+ `common.${(err.context.country as string).toLowerCase()}`
132
+ )
133
+ }
129
134
  )
130
135
  }
131
136
  })