@defra/forms-engine-plugin 4.7.2 → 4.8.0

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 (407) hide show
  1. package/.public/javascripts/shared.min.js +1 -1
  2. package/.public/javascripts/shared.min.js.map +1 -1
  3. package/.server/client/javascripts/geospatial-map.d.ts +6 -6
  4. package/.server/client/javascripts/geospatial-map.js +3 -3
  5. package/.server/client/javascripts/location-map.d.ts +1 -1
  6. package/.server/client/javascripts/location-map.js +1 -1
  7. package/.server/client/javascripts/map.d.ts +5 -1
  8. package/.server/client/javascripts/map.js +10 -2
  9. package/.server/client/javascripts/map.js.map +1 -1
  10. package/.server/client/javascripts/shared.d.ts +7 -7
  11. package/.server/server/index.d.ts +1 -1
  12. package/.server/server/plugins/crumb.d.ts +1 -1
  13. package/.server/server/plugins/engine/beta/form-context.d.ts +6 -6
  14. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +4 -4
  15. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +2 -2
  16. package/.server/server/plugins/engine/components/CheckboxesField.js +2 -2
  17. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  18. package/.server/server/plugins/engine/components/ComponentBase.d.ts +5 -5
  19. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -8
  20. package/.server/server/plugins/engine/components/DatePartsField.d.ts +11 -11
  21. package/.server/server/plugins/engine/components/DeclarationField.d.ts +3 -3
  22. package/.server/server/plugins/engine/components/Details.d.ts +1 -1
  23. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +22 -22
  24. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -4
  25. package/.server/server/plugins/engine/components/FileUploadField.d.ts +3 -3
  26. package/.server/server/plugins/engine/components/FormComponent.d.ts +10 -10
  27. package/.server/server/plugins/engine/components/GeospatialField.d.ts +6 -6
  28. package/.server/server/plugins/engine/components/HiddenField.d.ts +2 -2
  29. package/.server/server/plugins/engine/components/Html.d.ts +1 -1
  30. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -1
  31. package/.server/server/plugins/engine/components/LatLongField.d.ts +22 -22
  32. package/.server/server/plugins/engine/components/List.d.ts +8 -8
  33. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +10 -10
  34. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +6 -6
  35. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +14 -14
  36. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -1
  37. package/.server/server/plugins/engine/components/MonthYearField.d.ts +11 -11
  38. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +5 -5
  39. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +1 -1
  40. package/.server/server/plugins/engine/components/NumberField.d.ts +3 -3
  41. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +1 -1
  42. package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -12
  43. package/.server/server/plugins/engine/components/RadiosField.d.ts +1 -1
  44. package/.server/server/plugins/engine/components/SelectField.d.ts +4 -4
  45. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +10 -10
  46. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +4 -4
  47. package/.server/server/plugins/engine/components/TextField.d.ts +2 -2
  48. package/.server/server/plugins/engine/components/UkAddressField.d.ts +11 -11
  49. package/.server/server/plugins/engine/components/YesNoField.d.ts +2 -2
  50. package/.server/server/plugins/engine/components/helpers/__stubs__/geospatial.d.ts +1 -1
  51. package/.server/server/plugins/engine/components/helpers/components.d.ts +5 -5
  52. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +1 -1
  53. package/.server/server/plugins/engine/components/index.d.ts +27 -27
  54. package/.server/server/plugins/engine/components/types.d.ts +1 -1
  55. package/.server/server/plugins/engine/configureEnginePlugin.d.ts +4 -4
  56. package/.server/server/plugins/engine/date-helper.d.ts +1 -1
  57. package/.server/server/plugins/engine/helpers.d.ts +8 -8
  58. package/.server/server/plugins/engine/index.d.ts +5 -5
  59. package/.server/server/plugins/engine/models/FormModel.d.ts +6 -6
  60. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +6 -6
  61. package/.server/server/plugins/engine/models/index.d.ts +2 -2
  62. package/.server/server/plugins/engine/models/types.d.ts +4 -4
  63. package/.server/server/plugins/engine/options.d.ts +1 -1
  64. package/.server/server/plugins/engine/options.js +1 -1
  65. package/.server/server/plugins/engine/options.test.js +1 -1
  66. package/.server/server/plugins/engine/outputFormatters/adapter/v1.d.ts +4 -4
  67. package/.server/server/plugins/engine/outputFormatters/human/v1.d.ts +4 -4
  68. package/.server/server/plugins/engine/outputFormatters/index.d.ts +5 -5
  69. package/.server/server/plugins/engine/outputFormatters/machine/v1.d.ts +4 -4
  70. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +4 -4
  71. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +8 -8
  72. package/.server/server/plugins/engine/pageControllers/PageController.d.ts +6 -6
  73. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +8 -8
  74. package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +5 -5
  75. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +4 -4
  76. package/.server/server/plugins/engine/pageControllers/StatusPageController.d.ts +4 -4
  77. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +5 -5
  78. package/.server/server/plugins/engine/pageControllers/TerminalPageController.d.ts +3 -3
  79. package/.server/server/plugins/engine/pageControllers/__stubs__/request.d.ts +2 -2
  80. package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
  81. package/.server/server/plugins/engine/pageControllers/helpers/pages.d.ts +2 -2
  82. package/.server/server/plugins/engine/pageControllers/helpers/state.d.ts +5 -5
  83. package/.server/server/plugins/engine/pageControllers/helpers/state.js +1 -1
  84. package/.server/server/plugins/engine/pageControllers/helpers/state.js.map +1 -1
  85. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  86. package/.server/server/plugins/engine/pageControllers/index.d.ts +7 -7
  87. package/.server/server/plugins/engine/plugin.d.ts +1 -1
  88. package/.server/server/plugins/engine/routes/file-upload.d.ts +1 -1
  89. package/.server/server/plugins/engine/routes/index.d.ts +3 -3
  90. package/.server/server/plugins/engine/routes/payment-helper.d.ts +3 -3
  91. package/.server/server/plugins/engine/routes/payment-helper.js +2 -2
  92. package/.server/server/plugins/engine/routes/payment.js +5 -5
  93. package/.server/server/plugins/engine/routes/payment.test.js +1 -1
  94. package/.server/server/plugins/engine/routes/questions.d.ts +2 -2
  95. package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -2
  96. package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -2
  97. package/.server/server/plugins/engine/services/index.d.ts +3 -3
  98. package/.server/server/plugins/engine/services/notifyService.d.ts +4 -4
  99. package/.server/server/plugins/engine/services/uploadService.d.ts +2 -2
  100. package/.server/server/plugins/engine/services/uploadService.js +1 -1
  101. package/.server/server/plugins/engine/types/index.d.ts +10 -10
  102. package/.server/server/plugins/engine/types/schema.d.ts +1 -1
  103. package/.server/server/plugins/engine/types.d.ts +25 -16
  104. package/.server/server/plugins/engine/types.js.map +1 -1
  105. package/.server/server/plugins/engine/validationHelpers.d.ts +2 -2
  106. package/.server/server/plugins/engine/vision.d.ts +1 -1
  107. package/.server/server/plugins/map/index.d.ts +1 -1
  108. package/.server/server/plugins/map/index.js +1 -1
  109. package/.server/server/plugins/map/routes/get-os-token.d.ts +11 -1
  110. package/.server/server/plugins/map/routes/get-os-token.js +12 -2
  111. package/.server/server/plugins/map/routes/get-os-token.js.map +1 -1
  112. package/.server/server/plugins/map/routes/index.d.ts +4 -4
  113. package/.server/server/plugins/map/routes/index.js +3 -2
  114. package/.server/server/plugins/map/routes/index.js.map +1 -1
  115. package/.server/server/plugins/map/routes/vts/esri-aerial.json +23 -0
  116. package/.server/server/plugins/map/service.d.ts +1 -1
  117. package/.server/server/plugins/map/service.js +5 -2
  118. package/.server/server/plugins/map/service.js.map +1 -1
  119. package/.server/server/plugins/map/test/__stubs__/find.d.ts +1 -1
  120. package/.server/server/plugins/map/test/__stubs__/find.js +1 -1
  121. package/.server/server/plugins/nunjucks/context.d.ts +2 -2
  122. package/.server/server/plugins/nunjucks/context.js +2 -2
  123. package/.server/server/plugins/nunjucks/context.test.js +1 -1
  124. package/.server/server/plugins/nunjucks/enviroment.test.js +1 -1
  125. package/.server/server/plugins/nunjucks/environment.d.ts +3 -3
  126. package/.server/server/plugins/nunjucks/environment.js +3 -3
  127. package/.server/server/plugins/nunjucks/filters/answer.d.ts +1 -1
  128. package/.server/server/plugins/nunjucks/filters/answer.js +2 -2
  129. package/.server/server/plugins/nunjucks/filters/answer.test.js +1 -1
  130. package/.server/server/plugins/nunjucks/filters/evaluate.d.ts +1 -1
  131. package/.server/server/plugins/nunjucks/filters/evaluate.js +1 -1
  132. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  133. package/.server/server/plugins/nunjucks/filters/field.js +1 -1
  134. package/.server/server/plugins/nunjucks/filters/field.test.js +1 -1
  135. package/.server/server/plugins/nunjucks/filters/href.d.ts +1 -1
  136. package/.server/server/plugins/nunjucks/filters/href.js +1 -1
  137. package/.server/server/plugins/nunjucks/filters/href.test.js +1 -1
  138. package/.server/server/plugins/nunjucks/filters/index.d.ts +8 -8
  139. package/.server/server/plugins/nunjucks/filters/page.d.ts +1 -1
  140. package/.server/server/plugins/nunjucks/filters/page.js +1 -1
  141. package/.server/server/plugins/nunjucks/filters/page.test.js +1 -1
  142. package/.server/server/plugins/nunjucks/index.d.ts +3 -3
  143. package/.server/server/plugins/nunjucks/render.d.ts +2 -2
  144. package/.server/server/plugins/nunjucks/render.js +1 -1
  145. package/.server/server/plugins/nunjucks/types.d.ts +1 -1
  146. package/.server/server/plugins/nunjucks/types.js +1 -1
  147. package/.server/server/plugins/payment/helper.d.ts +2 -2
  148. package/.server/server/plugins/payment/helper.js +1 -1
  149. package/.server/server/plugins/payment/service.d.ts +3 -3
  150. package/.server/server/plugins/payment/service.js +1 -1
  151. package/.server/server/plugins/postcode-lookup/index.d.ts +1 -1
  152. package/.server/server/plugins/postcode-lookup/index.js +1 -1
  153. package/.server/server/plugins/postcode-lookup/models/index.d.ts +6 -6
  154. package/.server/server/plugins/postcode-lookup/models/index.js +1 -1
  155. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +6 -6
  156. package/.server/server/plugins/postcode-lookup/routes/index.js +15 -15
  157. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  158. package/.server/server/plugins/postcode-lookup/service.d.ts +1 -1
  159. package/.server/server/plugins/postcode-lookup/service.js +5 -2
  160. package/.server/server/plugins/postcode-lookup/service.js.map +1 -1
  161. package/.server/server/plugins/postcode-lookup/types.js +1 -1
  162. package/.server/server/routes/index.d.ts +2 -2
  163. package/.server/server/routes/types.d.ts +1 -1
  164. package/.server/server/schemas/index.d.ts +2 -2
  165. package/.server/server/services/cacheService.d.ts +8 -8
  166. package/.server/server/services/cacheService.js +2 -5
  167. package/.server/server/services/cacheService.js.map +1 -1
  168. package/.server/server/services/httpService.test.js +1 -1
  169. package/.server/server/services/index.d.ts +1 -1
  170. package/.server/server/types.d.ts +7 -7
  171. package/.server/server/utils/file-form-service.d.ts +2 -2
  172. package/.server/server/utils/file-form-service.js +1 -1
  173. package/package.json +8 -4
  174. package/src/client/javascripts/application.js +1 -1
  175. package/src/client/javascripts/geospatial-map.js +4 -4
  176. package/src/client/javascripts/location-map.js +2 -2
  177. package/src/client/javascripts/map.js +13 -4
  178. package/src/client/javascripts/shared.js +7 -7
  179. package/src/index.ts +3 -3
  180. package/src/server/common/helpers/logging/logger-options.ts +1 -1
  181. package/src/server/common/helpers/logging/logger.ts +1 -1
  182. package/src/server/common/helpers/logging/request-logger.ts +1 -1
  183. package/src/server/common/helpers/logging/request-tracing.js +1 -1
  184. package/src/server/common/helpers/redis-client.js +2 -2
  185. package/src/server/index.ts +13 -13
  186. package/src/server/plugins/crumb.ts +2 -2
  187. package/src/server/plugins/engine/beta/form-context.ts +9 -9
  188. package/src/server/plugins/engine/components/AutocompleteField.ts +3 -3
  189. package/src/server/plugins/engine/components/CheckboxesField.ts +7 -8
  190. package/src/server/plugins/engine/components/ComponentBase.ts +5 -5
  191. package/src/server/plugins/engine/components/ComponentCollection.ts +9 -9
  192. package/src/server/plugins/engine/components/DatePartsField.ts +8 -8
  193. package/src/server/plugins/engine/components/DeclarationField.ts +3 -3
  194. package/src/server/plugins/engine/components/Details.ts +1 -1
  195. package/src/server/plugins/engine/components/EastingNorthingField.ts +9 -9
  196. package/src/server/plugins/engine/components/EmailAddressField.ts +3 -3
  197. package/src/server/plugins/engine/components/FileUploadField.ts +6 -6
  198. package/src/server/plugins/engine/components/FormComponent.ts +4 -4
  199. package/src/server/plugins/engine/components/GeospatialField.ts +5 -5
  200. package/src/server/plugins/engine/components/HiddenField.ts +4 -4
  201. package/src/server/plugins/engine/components/Html.ts +1 -1
  202. package/src/server/plugins/engine/components/InsetText.ts +1 -1
  203. package/src/server/plugins/engine/components/LatLongField.ts +9 -9
  204. package/src/server/plugins/engine/components/List.ts +2 -2
  205. package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
  206. package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -5
  207. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +5 -5
  208. package/src/server/plugins/engine/components/Markdown.ts +1 -1
  209. package/src/server/plugins/engine/components/MonthYearField.ts +8 -8
  210. package/src/server/plugins/engine/components/MultilineTextField.ts +4 -4
  211. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +2 -2
  212. package/src/server/plugins/engine/components/NumberField.ts +3 -3
  213. package/src/server/plugins/engine/components/OsGridRefField.ts +2 -2
  214. package/src/server/plugins/engine/components/PaymentField.ts +8 -8
  215. package/src/server/plugins/engine/components/RadiosField.ts +1 -1
  216. package/src/server/plugins/engine/components/SelectField.ts +2 -2
  217. package/src/server/plugins/engine/components/SelectionControlField.ts +4 -4
  218. package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -4
  219. package/src/server/plugins/engine/components/TextField.ts +3 -3
  220. package/src/server/plugins/engine/components/UkAddressField.ts +7 -7
  221. package/src/server/plugins/engine/components/YesNoField.ts +5 -5
  222. package/src/server/plugins/engine/components/helpers/__stubs__/geospatial.ts +1 -1
  223. package/src/server/plugins/engine/components/helpers/components.ts +8 -8
  224. package/src/server/plugins/engine/components/helpers/geospatial.ts +1 -1
  225. package/src/server/plugins/engine/components/index.ts +27 -27
  226. package/src/server/plugins/engine/components/types.ts +1 -1
  227. package/src/server/plugins/engine/configureEnginePlugin.ts +10 -10
  228. package/src/server/plugins/engine/date-helper.ts +1 -1
  229. package/src/server/plugins/engine/helpers.ts +8 -8
  230. package/src/server/plugins/engine/index.ts +8 -8
  231. package/src/server/plugins/engine/models/FormModel.ts +15 -15
  232. package/src/server/plugins/engine/models/SummaryViewModel.ts +10 -10
  233. package/src/server/plugins/engine/models/index.ts +2 -2
  234. package/src/server/plugins/engine/models/types.ts +4 -4
  235. package/src/server/plugins/engine/options.js +3 -3
  236. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +6 -6
  237. package/src/server/plugins/engine/outputFormatters/human/v1.ts +9 -9
  238. package/src/server/plugins/engine/outputFormatters/index.ts +8 -8
  239. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +7 -7
  240. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +6 -6
  241. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +9 -9
  242. package/src/server/plugins/engine/pageControllers/PageController.ts +7 -7
  243. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +13 -13
  244. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +6 -6
  245. package/src/server/plugins/engine/pageControllers/StartPageController.ts +3 -3
  246. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +5 -5
  247. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +12 -12
  248. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +3 -3
  249. package/src/server/plugins/engine/pageControllers/__stubs__/request.ts +3 -3
  250. package/src/server/plugins/engine/pageControllers/__stubs__/server.ts +2 -2
  251. package/src/server/plugins/engine/pageControllers/errors.ts +1 -1
  252. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -2
  253. package/src/server/plugins/engine/pageControllers/helpers/state.ts +9 -9
  254. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +5 -5
  255. package/src/server/plugins/engine/pageControllers/index.ts +7 -7
  256. package/src/server/plugins/engine/pageControllers/validationOptions.ts +1 -1
  257. package/src/server/plugins/engine/plugin.ts +14 -14
  258. package/src/server/plugins/engine/routes/file-upload.ts +2 -2
  259. package/src/server/plugins/engine/routes/index.ts +10 -10
  260. package/src/server/plugins/engine/routes/payment-helper.js +4 -4
  261. package/src/server/plugins/engine/routes/payment.js +9 -9
  262. package/src/server/plugins/engine/routes/questions.ts +10 -10
  263. package/src/server/plugins/engine/routes/repeaters/item-delete.ts +6 -6
  264. package/src/server/plugins/engine/routes/repeaters/summary.ts +5 -5
  265. package/src/server/plugins/engine/services/formSubmissionService.js +2 -2
  266. package/src/server/plugins/engine/services/index.js +3 -3
  267. package/src/server/plugins/engine/services/localFormsService.js +2 -2
  268. package/src/server/plugins/engine/services/notifyService.ts +9 -9
  269. package/src/server/plugins/engine/services/uploadService.js +3 -3
  270. package/src/server/plugins/engine/types/index.ts +10 -10
  271. package/src/server/plugins/engine/types/schema.ts +2 -2
  272. package/src/server/plugins/engine/types.ts +22 -17
  273. package/src/server/plugins/engine/validationHelpers.ts +3 -3
  274. package/src/server/plugins/engine/vision.ts +3 -3
  275. package/src/server/plugins/map/index.js +2 -2
  276. package/src/server/plugins/map/routes/get-os-token.js +15 -3
  277. package/src/server/plugins/map/routes/index.js +7 -5
  278. package/src/server/plugins/map/routes/vts/esri-aerial.json +23 -0
  279. package/src/server/plugins/map/service.js +7 -4
  280. package/src/server/plugins/map/test/__stubs__/find.js +1 -1
  281. package/src/server/plugins/nunjucks/context.js +5 -5
  282. package/src/server/plugins/nunjucks/environment.js +6 -6
  283. package/src/server/plugins/nunjucks/filters/answer.js +3 -3
  284. package/src/server/plugins/nunjucks/filters/evaluate.js +2 -2
  285. package/src/server/plugins/nunjucks/filters/field.js +1 -1
  286. package/src/server/plugins/nunjucks/filters/href.js +2 -2
  287. package/src/server/plugins/nunjucks/filters/index.js +8 -8
  288. package/src/server/plugins/nunjucks/filters/page.js +1 -1
  289. package/src/server/plugins/nunjucks/index.js +3 -3
  290. package/src/server/plugins/nunjucks/plugin.js +3 -3
  291. package/src/server/plugins/nunjucks/render.js +2 -2
  292. package/src/server/plugins/nunjucks/types.js +1 -1
  293. package/src/server/plugins/payment/helper.js +2 -2
  294. package/src/server/plugins/payment/service.js +4 -4
  295. package/src/server/plugins/postcode-lookup/index.js +2 -2
  296. package/src/server/plugins/postcode-lookup/models/index.js +3 -3
  297. package/src/server/plugins/postcode-lookup/routes/index.js +24 -14
  298. package/src/server/plugins/postcode-lookup/service.js +7 -4
  299. package/src/server/plugins/postcode-lookup/types.js +1 -1
  300. package/src/server/plugins/session.ts +1 -1
  301. package/src/server/routes/index.ts +2 -2
  302. package/src/server/routes/public.ts +1 -1
  303. package/src/server/routes/types.ts +1 -1
  304. package/src/server/schemas/index.ts +2 -2
  305. package/src/server/secure-context.js +1 -1
  306. package/src/server/services/cacheService.ts +13 -18
  307. package/src/server/services/httpService.ts +1 -1
  308. package/src/server/services/index.ts +1 -1
  309. package/src/server/types.ts +7 -7
  310. package/src/server/utils/notify.ts +2 -2
  311. package/src/server/utils/utils.js +1 -1
  312. package/src/typings/hapi/index.d.ts +4 -4
  313. package/src/typings/joi/index.d.ts +1 -1
  314. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  315. package/src/server/index.test.ts +0 -644
  316. package/src/server/plugins/engine/beta/form-context.test.ts +0 -373
  317. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -362
  318. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -486
  319. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -927
  320. package/src/server/plugins/engine/components/DeclarationField.test.ts +0 -560
  321. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  322. package/src/server/plugins/engine/components/EastingNorthingField.test.ts +0 -727
  323. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -445
  324. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -1079
  325. package/src/server/plugins/engine/components/GeospatialField.test.ts +0 -380
  326. package/src/server/plugins/engine/components/HiddenField.test.ts +0 -188
  327. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  328. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  329. package/src/server/plugins/engine/components/LatLongField.test.ts +0 -898
  330. package/src/server/plugins/engine/components/List.test.ts +0 -79
  331. package/src/server/plugins/engine/components/LocationFieldBase.test.ts +0 -253
  332. package/src/server/plugins/engine/components/LocationFieldHelpers.test.ts +0 -743
  333. package/src/server/plugins/engine/components/Markdown.test.ts +0 -48
  334. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -617
  335. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -647
  336. package/src/server/plugins/engine/components/NationalGridFieldNumberField.test.ts +0 -449
  337. package/src/server/plugins/engine/components/NumberField.test.ts +0 -723
  338. package/src/server/plugins/engine/components/OsGridRefField.test.ts +0 -460
  339. package/src/server/plugins/engine/components/PaymentField.test.ts +0 -745
  340. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -297
  341. package/src/server/plugins/engine/components/SelectField.test.ts +0 -289
  342. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -384
  343. package/src/server/plugins/engine/components/TextField.test.ts +0 -521
  344. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -806
  345. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -256
  346. package/src/server/plugins/engine/components/helpers/components.test.ts +0 -399
  347. package/src/server/plugins/engine/components/helpers/geospatial.test.js +0 -55
  348. package/src/server/plugins/engine/components/helpers/helpers.test.ts +0 -219
  349. package/src/server/plugins/engine/date-helper.test.ts +0 -47
  350. package/src/server/plugins/engine/helpers.test.ts +0 -868
  351. package/src/server/plugins/engine/models/FormModel.test.ts +0 -725
  352. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -472
  353. package/src/server/plugins/engine/options.test.js +0 -63
  354. package/src/server/plugins/engine/outputFormatters/adapter/v1.location.test.ts +0 -356
  355. package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +0 -871
  356. package/src/server/plugins/engine/outputFormatters/human/v1.payment.test.ts +0 -147
  357. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -145
  358. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  359. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -268
  360. package/src/server/plugins/engine/outputFormatters/machine/v2.location.test.ts +0 -341
  361. package/src/server/plugins/engine/outputFormatters/machine/v2.payment.test.ts +0 -115
  362. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -311
  363. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1372
  364. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -246
  365. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1686
  366. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -279
  367. package/src/server/plugins/engine/pageControllers/StartPageController.test.ts +0 -32
  368. package/src/server/plugins/engine/pageControllers/StatusPageController.test.ts +0 -32
  369. package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +0 -89
  370. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -37
  371. package/src/server/plugins/engine/pageControllers/errors.test.ts +0 -78
  372. package/src/server/plugins/engine/pageControllers/helpers/helpers.test.ts +0 -182
  373. package/src/server/plugins/engine/pageControllers/helpers/state.test.ts +0 -359
  374. package/src/server/plugins/engine/pageControllers/helpers/submission.test.ts +0 -373
  375. package/src/server/plugins/engine/referenceNumbers.test.ts +0 -74
  376. package/src/server/plugins/engine/routes/index.test.ts +0 -332
  377. package/src/server/plugins/engine/routes/payment-helper.test.js +0 -136
  378. package/src/server/plugins/engine/routes/payment.test.js +0 -180
  379. package/src/server/plugins/engine/routes/questions.test.ts +0 -502
  380. package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +0 -83
  381. package/src/server/plugins/engine/routes/repeaters/summary.test.ts +0 -75
  382. package/src/server/plugins/engine/services/formsService.test.js +0 -26
  383. package/src/server/plugins/engine/services/notifyService.test.ts +0 -310
  384. package/src/server/plugins/engine/types/schema.test.ts +0 -234
  385. package/src/server/plugins/engine/views/components/service-banner/template.test.js +0 -43
  386. package/src/server/plugins/engine/views/components/tag-env/template.test.js +0 -28
  387. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  388. package/src/server/plugins/map/routes/get-os-token.test.js +0 -55
  389. package/src/server/plugins/map/service.test.js +0 -144
  390. package/src/server/plugins/nunjucks/context.test.js +0 -109
  391. package/src/server/plugins/nunjucks/enviroment.test.js +0 -207
  392. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -92
  393. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  394. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  395. package/src/server/plugins/nunjucks/filters/merge.test.js +0 -15
  396. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  397. package/src/server/plugins/payment/helper.test.js +0 -29
  398. package/src/server/plugins/payment/service.test.js +0 -218
  399. package/src/server/plugins/postcode-lookup/service.test.js +0 -177
  400. package/src/server/postcode-lookup.test.ts +0 -64
  401. package/src/server/routes/dummy-api.test.ts +0 -97
  402. package/src/server/services/cacheService.test.ts +0 -308
  403. package/src/server/services/httpService.test.js +0 -491
  404. package/src/server/utils/file-form-service.test.js +0 -127
  405. package/src/server/utils/notify.test.ts +0 -37
  406. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  407. package/src/server/utils/utils.test.js +0 -69
@@ -1,927 +0,0 @@
1
- import { ComponentType, type DatePartsFieldComponent } from '@defra/forms-model'
2
- import { addDays, format, startOfDay } from 'date-fns'
3
-
4
- import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
5
- import {
6
- getAnswer,
7
- type Field
8
- } from '~/src/server/plugins/engine/components/helpers/components.js'
9
- import { type DateInputItem } from '~/src/server/plugins/engine/components/types.js'
10
- import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
11
- import {
12
- type ErrorMessageTemplateList,
13
- type FormPayload,
14
- type FormState
15
- } from '~/src/server/plugins/engine/types.js'
16
- import definition from '~/test/form/definitions/blank.js'
17
-
18
- describe('DatePartsField', () => {
19
- let model: FormModel
20
-
21
- beforeEach(() => {
22
- model = new FormModel(definition, {
23
- basePath: 'test'
24
- })
25
- })
26
-
27
- describe('Defaults', () => {
28
- let def: DatePartsFieldComponent
29
- let collection: ComponentCollection
30
- let field: Field
31
-
32
- beforeEach(() => {
33
- def = {
34
- title: 'Example date parts field',
35
- shortDescription: 'Example date parts',
36
- name: 'myComponent',
37
- type: ComponentType.DatePartsField,
38
- options: {}
39
- } satisfies DatePartsFieldComponent
40
-
41
- collection = new ComponentCollection([def], { model })
42
- field = collection.fields[0]
43
- })
44
-
45
- describe('Schema', () => {
46
- it('uses collection titles as labels', () => {
47
- const { formSchema } = collection
48
- const { keys } = formSchema.describe()
49
-
50
- expect(keys).toHaveProperty(
51
- 'myComponent__day',
52
- expect.objectContaining({
53
- flags: expect.objectContaining({ label: 'Day' })
54
- })
55
- )
56
-
57
- expect(keys).toHaveProperty(
58
- 'myComponent__month',
59
- expect.objectContaining({
60
- flags: expect.objectContaining({ label: 'Month' })
61
- })
62
- )
63
-
64
- expect(keys).toHaveProperty(
65
- 'myComponent__year',
66
- expect.objectContaining({
67
- flags: expect.objectContaining({ label: 'Year' })
68
- })
69
- )
70
- })
71
-
72
- it('uses collection names as keys', () => {
73
- const { formSchema } = collection
74
- const { keys } = formSchema.describe()
75
-
76
- expect(field.keys).toEqual([
77
- 'myComponent',
78
- 'myComponent__day',
79
- 'myComponent__month',
80
- 'myComponent__year'
81
- ])
82
-
83
- expect(field.collection?.keys).not.toHaveProperty('myComponent')
84
-
85
- for (const key of field.collection?.keys ?? []) {
86
- expect(keys).toHaveProperty(key)
87
- }
88
- })
89
-
90
- it('is required by default', () => {
91
- const { formSchema } = collection
92
- const { keys } = formSchema.describe()
93
-
94
- expect(keys).toHaveProperty(
95
- 'myComponent__day',
96
- expect.objectContaining({
97
- flags: expect.objectContaining({ presence: 'required' })
98
- })
99
- )
100
-
101
- expect(keys).toHaveProperty(
102
- 'myComponent__month',
103
- expect.objectContaining({
104
- flags: expect.objectContaining({ presence: 'required' })
105
- })
106
- )
107
-
108
- expect(keys).toHaveProperty(
109
- 'myComponent__year',
110
- expect.objectContaining({
111
- flags: expect.objectContaining({ presence: 'required' })
112
- })
113
- )
114
- })
115
-
116
- it('is optional when configured', () => {
117
- const collectionOptional = new ComponentCollection(
118
- [
119
- {
120
- title: 'Example date parts field',
121
- name: 'myComponent',
122
- type: ComponentType.DatePartsField,
123
- options: { required: false }
124
- }
125
- ],
126
- { model }
127
- )
128
-
129
- const { formSchema } = collectionOptional
130
- const { keys } = formSchema.describe()
131
-
132
- expect(keys).toHaveProperty(
133
- 'myComponent__day',
134
- expect.objectContaining({ allow: [''] })
135
- )
136
-
137
- expect(keys).toHaveProperty(
138
- 'myComponent__month',
139
- expect.objectContaining({ allow: [''] })
140
- )
141
-
142
- expect(keys).toHaveProperty(
143
- 'myComponent__year',
144
- expect.objectContaining({ allow: [''] })
145
- )
146
-
147
- // Empty optional payload (valid)
148
- const result1 = collectionOptional.validate(
149
- getFormData({
150
- day: '',
151
- month: '',
152
- year: ''
153
- })
154
- )
155
-
156
- // Partial optional payload (invalid)
157
- const result2 = collectionOptional.validate(
158
- getFormData({
159
- day: '31',
160
- month: '',
161
- year: ''
162
- })
163
- )
164
-
165
- expect(result1.errors).toBeUndefined()
166
- expect(result2.errors).toEqual([
167
- expect.objectContaining({
168
- text: 'Example date parts field must include a month'
169
- })
170
- ])
171
- })
172
-
173
- it('accepts valid values', () => {
174
- const result1 = collection.validate(
175
- getFormData({
176
- day: '31',
177
- month: '12',
178
- year: '2024'
179
- })
180
- )
181
-
182
- const result2 = collection.validate(
183
- getFormData({
184
- day: '1',
185
- month: '2',
186
- year: '2024'
187
- })
188
- )
189
-
190
- // Leap year in 2024
191
- const result3 = collection.validate(
192
- getFormData({
193
- day: '29',
194
- month: '2',
195
- year: '2024'
196
- })
197
- )
198
-
199
- expect(result1.errors).toBeUndefined()
200
- expect(result2.errors).toBeUndefined()
201
- expect(result3.errors).toBeUndefined()
202
- })
203
-
204
- it('adds errors for empty value when short description exists', () => {
205
- const result = collection.validate(
206
- getFormData({
207
- day: '',
208
- month: '',
209
- year: ''
210
- })
211
- )
212
-
213
- expect(result.errors).toEqual([
214
- expect.objectContaining({
215
- text: 'Example date parts must include a day'
216
- }),
217
- expect.objectContaining({
218
- text: 'Example date parts must include a month'
219
- }),
220
- expect.objectContaining({
221
- text: 'Example date parts must include a year'
222
- })
223
- ])
224
- })
225
-
226
- it('adds errors for invalid values', () => {
227
- const result1 = collection.validate(getFormData({ unknown: 'invalid' }))
228
-
229
- const result2 = collection.validate(
230
- getFormData({
231
- day: ['invalid'],
232
- month: ['invalid'],
233
- year: ['invalid']
234
- })
235
- )
236
-
237
- const result3 = collection.validate(
238
- getFormData({
239
- day: 'invalid',
240
- month: 'invalid',
241
- year: 'invalid'
242
- })
243
- )
244
-
245
- // Check a non-4-digit year shows as an error
246
- const state4 = getFormState({
247
- day: 1,
248
- month: 2,
249
- year: 20
250
- })
251
- const result4 = field.getContextValueFromState(state4)
252
-
253
- const state5 = getFormState({
254
- day: 1,
255
- month: 2,
256
- year: 2000
257
- })
258
- const result5 = field.getContextValueFromState(state5)
259
-
260
- expect(result1.errors).toBeTruthy()
261
- expect(result2.errors).toBeTruthy()
262
- expect(result3.errors).toBeTruthy()
263
- expect(result4).toBeNull()
264
- expect(result5).toBe('2000-02-01')
265
- })
266
- })
267
-
268
- describe('State', () => {
269
- const date = new Date('2024-12-31')
270
-
271
- it('returns text from state', () => {
272
- const state1 = getFormState(date)
273
- const state2 = getFormState({})
274
-
275
- const answer1 = getAnswer(field, state1)
276
- const answer2 = getAnswer(field, state2)
277
-
278
- expect(answer1).toBe('31 December 2024')
279
- expect(answer2).toBe('')
280
- })
281
-
282
- it('returns payload from state', () => {
283
- const state1 = getFormState(startOfDay(date))
284
- const state2 = getFormState({})
285
-
286
- const payload1 = field.getFormDataFromState(state1)
287
- const payload2 = field.getFormDataFromState(state2)
288
-
289
- expect(payload1).toEqual(getFormData(date))
290
- expect(payload2).toEqual(getFormData({}))
291
- })
292
-
293
- it('returns value from state', () => {
294
- const state1 = getFormState(startOfDay(date))
295
- const state2 = getFormState({})
296
-
297
- const value1 = field.getFormValueFromState(state1)
298
- const value2 = field.getFormValueFromState(state2)
299
-
300
- expect(value1).toEqual({
301
- day: 31,
302
- month: 12,
303
- year: 2024
304
- })
305
-
306
- expect(value2).toBeUndefined()
307
- })
308
-
309
- it('returns context for conditions and form submission', () => {
310
- const state1 = getFormState(startOfDay(date))
311
- const state2 = getFormState({})
312
-
313
- const value1 = field.getContextValueFromState(state1)
314
- const value2 = field.getContextValueFromState(state2)
315
-
316
- expect(value1).toBe('2024-12-31')
317
- expect(value2).toBeNull()
318
- })
319
-
320
- it('returns null context when date is invalid', () => {
321
- const state1 = getFormState({ day: 1, month: 0, year: 2025 })
322
- const state2 = getFormState({})
323
- const state3 = getFormState({ day: 1, month: 13, year: 2025 })
324
- const state4 = getFormState({ day: 32, month: 12, year: 2025 })
325
-
326
- const value1 = field.getContextValueFromState(state1)
327
- const value2 = field.getContextValueFromState(state2)
328
- const value3 = field.getContextValueFromState(state3)
329
- const value4 = field.getContextValueFromState(state4)
330
-
331
- expect(value1).toBeNull()
332
- expect(value2).toBeNull()
333
- expect(value3).toBeNull()
334
- expect(value4).toBeNull()
335
- })
336
-
337
- it('returns state from payload', () => {
338
- const payload1 = getFormData(date)
339
- const payload2 = getFormData({})
340
-
341
- const value1 = field.getStateFromValidForm(payload1)
342
- const value2 = field.getStateFromValidForm(payload2)
343
-
344
- expect(value1).toEqual(getFormState(date))
345
- expect(value2).toEqual(getFormState({}))
346
- })
347
- })
348
-
349
- describe('View model', () => {
350
- const date = new Date('2024-12-31')
351
-
352
- it('sets Nunjucks component defaults', () => {
353
- const payload = getFormData(date)
354
- const viewModel = field.getViewModel(payload)
355
-
356
- expect(viewModel).toEqual(
357
- expect.objectContaining({
358
- label: { text: def.title },
359
- name: 'myComponent',
360
- id: 'myComponent',
361
- value: undefined,
362
- items: [
363
- expect.objectContaining(
364
- getViewModel(date, 'day', {
365
- label: { text: 'Day' },
366
- classes: 'govuk-input--width-2',
367
- value: 31
368
- })
369
- ),
370
-
371
- expect.objectContaining(
372
- getViewModel(date, 'month', {
373
- label: { text: 'Month' },
374
- classes: 'govuk-input--width-2',
375
- value: 12
376
- })
377
- ),
378
-
379
- expect.objectContaining(
380
- getViewModel(date, 'year', {
381
- label: { text: 'Year' },
382
- classes: 'govuk-input--width-4',
383
- value: 2024
384
- })
385
- )
386
- ]
387
- })
388
- )
389
- })
390
-
391
- it('sets Nunjucks component value when invalid', () => {
392
- const payload = getFormData({
393
- day: 'DD',
394
- month: 'MM',
395
- year: 'YYYY'
396
- })
397
-
398
- const viewModel = field.getViewModel(payload)
399
-
400
- expect(viewModel).toEqual(
401
- expect.objectContaining({
402
- items: [
403
- expect.objectContaining(
404
- getViewModel(date, 'day', { value: 'DD' })
405
- ),
406
-
407
- expect.objectContaining(
408
- getViewModel(date, 'month', { value: 'MM' })
409
- ),
410
-
411
- expect.objectContaining(
412
- getViewModel(date, 'year', { value: 'YYYY' })
413
- )
414
- ]
415
- })
416
- )
417
- })
418
-
419
- it('sets Nunjucks component fieldset', () => {
420
- const payload = getFormData(date)
421
- const viewModel = field.getViewModel(payload)
422
-
423
- expect(viewModel.fieldset).toEqual({
424
- legend: {
425
- text: def.title,
426
- classes: 'govuk-fieldset__legend--m'
427
- }
428
- })
429
- })
430
- })
431
-
432
- describe('AllPossibleErrors', () => {
433
- it('should return errors from instance method', () => {
434
- const errors = field.getAllPossibleErrors()
435
- expect(errors.baseErrors).not.toBeEmpty()
436
- expect(errors.advancedSettingsErrors).not.toBeEmpty()
437
- })
438
-
439
- it('should return errors from static method', () => {
440
- const staticErrors = (
441
- field.constructor as typeof field.constructor & {
442
- getAllPossibleErrors(): ErrorMessageTemplateList
443
- }
444
- ).getAllPossibleErrors()
445
- expect(staticErrors.baseErrors).not.toBeEmpty()
446
- expect(staticErrors.advancedSettingsErrors).not.toBeEmpty()
447
- })
448
-
449
- it('instance method should delegate to static method', () => {
450
- const staticResult = (
451
- field.constructor as typeof field.constructor & {
452
- getAllPossibleErrors(): ErrorMessageTemplateList
453
- }
454
- ).getAllPossibleErrors()
455
-
456
- const instanceResult = field.getAllPossibleErrors()
457
-
458
- expect(instanceResult).toEqual(staticResult)
459
- })
460
- })
461
- })
462
-
463
- describe('Validation', () => {
464
- const today = startOfDay(new Date())
465
- const date = new Date('2001-01-01')
466
-
467
- const OneDayInPast = addDays(today, -1)
468
- const TwoDaysInPast = addDays(today, -2)
469
- const OneDayInFuture = addDays(today, 1)
470
- const TwoDaysInFuture = addDays(today, 2)
471
-
472
- describe.each([
473
- {
474
- description: 'Trim empty spaces',
475
- component: {
476
- title: 'Example date parts field',
477
- name: 'myComponent',
478
- type: ComponentType.DatePartsField,
479
- options: {}
480
- } satisfies DatePartsFieldComponent,
481
- assertions: [
482
- {
483
- input: getFormData({
484
- day: ' 01',
485
- month: ' 01',
486
- year: ' 2001'
487
- }),
488
- output: {
489
- value: getFormData(date)
490
- }
491
- },
492
- {
493
- input: getFormData({
494
- day: '01 ',
495
- month: '01 ',
496
- year: '2001 '
497
- }),
498
- output: {
499
- value: getFormData(date)
500
- }
501
- },
502
- {
503
- input: getFormData({
504
- day: ' 01 \n\n',
505
- month: ' 01 \n\n',
506
- year: ' 2001 \n\n'
507
- }),
508
- output: {
509
- value: getFormData(date)
510
- }
511
- }
512
- ]
513
- },
514
- {
515
- description: 'Decimals',
516
- component: {
517
- title: 'Example date parts field',
518
- name: 'myComponent',
519
- type: ComponentType.DatePartsField,
520
- options: {}
521
- } satisfies DatePartsFieldComponent,
522
- assertions: [
523
- {
524
- input: getFormData({
525
- day: '1.1',
526
- month: '1.2',
527
- year: '2001.3'
528
- }),
529
- output: {
530
- value: getFormData({
531
- day: 1.1,
532
- month: 1.2,
533
- year: 2001.3
534
- }),
535
- errors: [
536
- expect.objectContaining({
537
- text: 'Example date parts field must be a real date'
538
- }),
539
- expect.objectContaining({
540
- text: 'Example date parts field must be a real date'
541
- }),
542
- expect.objectContaining({
543
- text: 'Example date parts field must be a real date'
544
- })
545
- ]
546
- }
547
- }
548
- ]
549
- },
550
- {
551
- description: 'Leap years',
552
- component: {
553
- title: 'Example date parts field',
554
- name: 'myComponent',
555
- type: ComponentType.DatePartsField,
556
- options: {}
557
- } satisfies DatePartsFieldComponent,
558
- assertions: [
559
- {
560
- // Leap year in 2024
561
- input: getFormData({
562
- day: '29',
563
- month: '2',
564
- year: '2024'
565
- }),
566
- output: {
567
- value: getFormData({
568
- day: 29,
569
- month: 2,
570
- year: 2024
571
- })
572
- }
573
- },
574
- {
575
- // Not a leap year in 2023
576
- input: getFormData({
577
- day: '29',
578
- month: '2',
579
- year: '2023'
580
- }),
581
- output: {
582
- value: getFormData({
583
- day: 29,
584
- month: 2,
585
- year: 2023
586
- }),
587
- errors: [
588
- expect.objectContaining({
589
- text: 'Example date parts field must be a real date'
590
- })
591
- ]
592
- }
593
- }
594
- ]
595
- },
596
- {
597
- description: 'Out of range values',
598
- component: {
599
- title: 'Example date parts field',
600
- name: 'myComponent',
601
- type: ComponentType.DatePartsField,
602
- options: {}
603
- } satisfies DatePartsFieldComponent,
604
- assertions: [
605
- {
606
- input: getFormData({
607
- day: '32',
608
- month: '1',
609
- year: '2024'
610
- }),
611
- output: {
612
- value: getFormData({
613
- day: 32,
614
- month: 1,
615
- year: 2024
616
- }),
617
- errors: [
618
- expect.objectContaining({
619
- text: 'Example date parts field must be a real date'
620
- })
621
- ]
622
- }
623
- },
624
- {
625
- input: getFormData({
626
- day: '1',
627
- month: '13',
628
- year: '2024'
629
- }),
630
- output: {
631
- value: getFormData({
632
- day: 1,
633
- month: 13,
634
- year: 2024
635
- }),
636
- errors: [
637
- expect.objectContaining({
638
- text: 'Example date parts field must be a real date'
639
- })
640
- ]
641
- }
642
- },
643
- {
644
- input: getFormData({
645
- day: '1',
646
- month: '1',
647
- year: '999'
648
- }),
649
- output: {
650
- value: getFormData({
651
- day: 1,
652
- month: 1,
653
- year: 999
654
- }),
655
- errors: [
656
- expect.objectContaining({
657
- text: 'Example date parts field must be a real date'
658
- })
659
- ]
660
- }
661
- }
662
- ]
663
- },
664
- {
665
- description: 'Impossible dates',
666
- component: {
667
- title: 'Example date parts field',
668
- name: 'myComponent',
669
- type: ComponentType.DatePartsField,
670
- options: {}
671
- } satisfies DatePartsFieldComponent,
672
- assertions: [
673
- {
674
- input: getFormData({
675
- day: '31',
676
- month: '4',
677
- year: '2024'
678
- }),
679
- output: {
680
- value: getFormData({
681
- day: 31,
682
- month: 4,
683
- year: 2024
684
- }),
685
- errors: [
686
- expect.objectContaining({
687
- text: 'Example date parts field must be a real date'
688
- })
689
- ]
690
- }
691
- },
692
- {
693
- input: getFormData({
694
- day: '31',
695
- month: '6',
696
- year: '2024'
697
- }),
698
- output: {
699
- value: getFormData({
700
- day: 31,
701
- month: 6,
702
- year: 2024
703
- }),
704
- errors: [
705
- expect.objectContaining({
706
- text: 'Example date parts field must be a real date'
707
- })
708
- ]
709
- }
710
- }
711
- ]
712
- },
713
- {
714
- description: 'Max days in the past option',
715
- component: {
716
- title: 'Example date parts field',
717
- name: 'myComponent',
718
- type: ComponentType.DatePartsField,
719
- options: {
720
- maxDaysInPast: 1
721
- }
722
- } satisfies DatePartsFieldComponent,
723
- assertions: [
724
- {
725
- input: getFormData(TwoDaysInPast),
726
- output: {
727
- value: getFormData(TwoDaysInPast),
728
- errors: [
729
- expect.objectContaining({
730
- text: `Example date parts field must be the same as or after ${format(OneDayInPast, 'd MMMM yyyy')}`
731
- })
732
- ]
733
- }
734
- },
735
- {
736
- input: getFormData(today),
737
- output: { value: getFormData(today) }
738
- }
739
- ]
740
- },
741
- {
742
- description: 'Max days in the future option',
743
- component: {
744
- title: 'Example date parts field',
745
- name: 'myComponent',
746
- type: ComponentType.DatePartsField,
747
- options: {
748
- maxDaysInFuture: 1
749
- }
750
- } satisfies DatePartsFieldComponent,
751
- assertions: [
752
- {
753
- input: getFormData(TwoDaysInFuture),
754
- output: {
755
- value: getFormData(TwoDaysInFuture),
756
- errors: [
757
- expect.objectContaining({
758
- text: `Example date parts field must be the same as or before ${format(OneDayInFuture, 'd MMMM yyyy')}`
759
- })
760
- ]
761
- }
762
- },
763
- {
764
- input: getFormData(today),
765
- output: { value: getFormData(today) }
766
- }
767
- ]
768
- },
769
- {
770
- description: 'Max days in the future of zero',
771
- component: {
772
- title: 'Example date parts field',
773
- name: 'myComponent',
774
- type: ComponentType.DatePartsField,
775
- options: {
776
- maxDaysInFuture: 0
777
- }
778
- } satisfies DatePartsFieldComponent,
779
- assertions: [
780
- {
781
- input: getFormData(OneDayInFuture),
782
- output: {
783
- value: getFormData(OneDayInFuture),
784
- errors: [
785
- expect.objectContaining({
786
- text: `Example date parts field must be the same as or before ${format(today, 'd MMMM yyyy')}`
787
- })
788
- ]
789
- }
790
- },
791
- {
792
- input: getFormData(today),
793
- output: { value: getFormData(today) }
794
- }
795
- ]
796
- },
797
- {
798
- description: 'Max days in the past of zero',
799
- component: {
800
- title: 'Example date parts field',
801
- name: 'myComponent',
802
- type: ComponentType.DatePartsField,
803
- options: {
804
- maxDaysInPast: 0
805
- }
806
- } satisfies DatePartsFieldComponent,
807
- assertions: [
808
- {
809
- input: getFormData(OneDayInPast),
810
- output: {
811
- value: getFormData(OneDayInPast),
812
- errors: [
813
- expect.objectContaining({
814
- text: `Example date parts field must be the same as or after ${format(today, 'd MMMM yyyy')}`
815
- })
816
- ]
817
- }
818
- },
819
- {
820
- input: getFormData(today),
821
- output: { value: getFormData(today) }
822
- }
823
- ]
824
- },
825
- {
826
- description: 'Optional fields',
827
- component: {
828
- title: 'Example date parts field',
829
- name: 'myComponent',
830
- type: ComponentType.DatePartsField,
831
- options: {
832
- required: false
833
- }
834
- } satisfies DatePartsFieldComponent,
835
- assertions: [
836
- {
837
- input: getFormData({
838
- day: '',
839
- month: '',
840
- year: ''
841
- }),
842
- output: {
843
- value: getFormData({
844
- day: '',
845
- month: '',
846
- year: ''
847
- })
848
- }
849
- }
850
- ]
851
- }
852
- ])('$description', ({ component: def, assertions }) => {
853
- let collection: ComponentCollection
854
-
855
- beforeEach(() => {
856
- collection = new ComponentCollection([def], { model })
857
- })
858
-
859
- it.each([...assertions])(
860
- 'validates custom example',
861
- ({ input, output }) => {
862
- const result = collection.validate(input)
863
- expect(result).toEqual(output)
864
- }
865
- )
866
- })
867
- })
868
- })
869
-
870
- /**
871
- * Date field view model
872
- */
873
- function getViewModel(
874
- date: Date,
875
- name: string,
876
- overrides?: Partial<DateInputItem>
877
- ): DateInputItem {
878
- const payload = getFormData(date)
879
-
880
- const fieldName = `myComponent__${name}`
881
- const fieldValue = overrides?.value ?? payload[fieldName]
882
- const fieldClasses = overrides?.classes ?? expect.any(String)
883
-
884
- return {
885
- label: expect.objectContaining(
886
- overrides?.label ?? {
887
- text: expect.any(String)
888
- }
889
- ),
890
- name: fieldName,
891
- id: fieldName,
892
- value: fieldValue as DateInputItem['value'],
893
- classes: fieldClasses
894
- }
895
- }
896
-
897
- /**
898
- * Date form data
899
- */
900
- function getFormData(date: Date | FormPayload): FormPayload {
901
- if (date instanceof Date) {
902
- date = {
903
- day: date.getDate(),
904
- month: date.getMonth() + 1,
905
- year: date.getFullYear()
906
- }
907
- }
908
-
909
- return {
910
- myComponent__day: date.day,
911
- myComponent__month: date.month,
912
- myComponent__year: date.year
913
- }
914
- }
915
-
916
- /**
917
- * Date session state
918
- */
919
- function getFormState(date: Date | FormPayload): FormState {
920
- const [day, month, year] = Object.values(getFormData(date))
921
-
922
- return {
923
- myComponent__day: day ?? null,
924
- myComponent__month: month ?? null,
925
- myComponent__year: year ?? null
926
- }
927
- }