@defra/forms-engine-plugin 4.7.2 → 4.7.3

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 (402) hide show
  1. package/.server/client/javascripts/geospatial-map.d.ts +6 -6
  2. package/.server/client/javascripts/geospatial-map.js +3 -3
  3. package/.server/client/javascripts/location-map.d.ts +1 -1
  4. package/.server/client/javascripts/location-map.js +1 -1
  5. package/.server/client/javascripts/map.d.ts +1 -1
  6. package/.server/client/javascripts/map.js +1 -1
  7. package/.server/client/javascripts/shared.d.ts +7 -7
  8. package/.server/server/index.d.ts +1 -1
  9. package/.server/server/plugins/crumb.d.ts +1 -1
  10. package/.server/server/plugins/engine/beta/form-context.d.ts +6 -6
  11. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +4 -4
  12. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +2 -2
  13. package/.server/server/plugins/engine/components/CheckboxesField.js +2 -2
  14. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  15. package/.server/server/plugins/engine/components/ComponentBase.d.ts +5 -5
  16. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -8
  17. package/.server/server/plugins/engine/components/DatePartsField.d.ts +11 -11
  18. package/.server/server/plugins/engine/components/DeclarationField.d.ts +3 -3
  19. package/.server/server/plugins/engine/components/Details.d.ts +1 -1
  20. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +22 -22
  21. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -4
  22. package/.server/server/plugins/engine/components/FileUploadField.d.ts +3 -3
  23. package/.server/server/plugins/engine/components/FormComponent.d.ts +10 -10
  24. package/.server/server/plugins/engine/components/GeospatialField.d.ts +6 -6
  25. package/.server/server/plugins/engine/components/HiddenField.d.ts +2 -2
  26. package/.server/server/plugins/engine/components/Html.d.ts +1 -1
  27. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -1
  28. package/.server/server/plugins/engine/components/LatLongField.d.ts +22 -22
  29. package/.server/server/plugins/engine/components/List.d.ts +8 -8
  30. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +10 -10
  31. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +6 -6
  32. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +14 -14
  33. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -1
  34. package/.server/server/plugins/engine/components/MonthYearField.d.ts +11 -11
  35. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +5 -5
  36. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +1 -1
  37. package/.server/server/plugins/engine/components/NumberField.d.ts +3 -3
  38. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +1 -1
  39. package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -12
  40. package/.server/server/plugins/engine/components/RadiosField.d.ts +1 -1
  41. package/.server/server/plugins/engine/components/SelectField.d.ts +4 -4
  42. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +10 -10
  43. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +4 -4
  44. package/.server/server/plugins/engine/components/TextField.d.ts +2 -2
  45. package/.server/server/plugins/engine/components/UkAddressField.d.ts +11 -11
  46. package/.server/server/plugins/engine/components/YesNoField.d.ts +2 -2
  47. package/.server/server/plugins/engine/components/helpers/__stubs__/geospatial.d.ts +1 -1
  48. package/.server/server/plugins/engine/components/helpers/components.d.ts +5 -5
  49. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +1 -1
  50. package/.server/server/plugins/engine/components/index.d.ts +27 -27
  51. package/.server/server/plugins/engine/components/types.d.ts +1 -1
  52. package/.server/server/plugins/engine/configureEnginePlugin.d.ts +4 -4
  53. package/.server/server/plugins/engine/date-helper.d.ts +1 -1
  54. package/.server/server/plugins/engine/helpers.d.ts +8 -8
  55. package/.server/server/plugins/engine/index.d.ts +5 -5
  56. package/.server/server/plugins/engine/models/FormModel.d.ts +6 -6
  57. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +6 -6
  58. package/.server/server/plugins/engine/models/index.d.ts +2 -2
  59. package/.server/server/plugins/engine/models/types.d.ts +4 -4
  60. package/.server/server/plugins/engine/options.d.ts +1 -1
  61. package/.server/server/plugins/engine/options.js +1 -1
  62. package/.server/server/plugins/engine/options.test.js +1 -1
  63. package/.server/server/plugins/engine/outputFormatters/adapter/v1.d.ts +4 -4
  64. package/.server/server/plugins/engine/outputFormatters/human/v1.d.ts +4 -4
  65. package/.server/server/plugins/engine/outputFormatters/index.d.ts +5 -5
  66. package/.server/server/plugins/engine/outputFormatters/machine/v1.d.ts +4 -4
  67. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +4 -4
  68. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +8 -8
  69. package/.server/server/plugins/engine/pageControllers/PageController.d.ts +6 -6
  70. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +8 -8
  71. package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +5 -5
  72. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +4 -4
  73. package/.server/server/plugins/engine/pageControllers/StatusPageController.d.ts +4 -4
  74. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +5 -5
  75. package/.server/server/plugins/engine/pageControllers/TerminalPageController.d.ts +3 -3
  76. package/.server/server/plugins/engine/pageControllers/__stubs__/request.d.ts +2 -2
  77. package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
  78. package/.server/server/plugins/engine/pageControllers/helpers/pages.d.ts +2 -2
  79. package/.server/server/plugins/engine/pageControllers/helpers/state.d.ts +5 -5
  80. package/.server/server/plugins/engine/pageControllers/helpers/state.js +1 -1
  81. package/.server/server/plugins/engine/pageControllers/helpers/state.js.map +1 -1
  82. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  83. package/.server/server/plugins/engine/pageControllers/index.d.ts +7 -7
  84. package/.server/server/plugins/engine/plugin.d.ts +1 -1
  85. package/.server/server/plugins/engine/routes/file-upload.d.ts +1 -1
  86. package/.server/server/plugins/engine/routes/index.d.ts +3 -3
  87. package/.server/server/plugins/engine/routes/payment-helper.d.ts +3 -3
  88. package/.server/server/plugins/engine/routes/payment-helper.js +2 -2
  89. package/.server/server/plugins/engine/routes/payment.js +5 -5
  90. package/.server/server/plugins/engine/routes/payment.test.js +1 -1
  91. package/.server/server/plugins/engine/routes/questions.d.ts +2 -2
  92. package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -2
  93. package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -2
  94. package/.server/server/plugins/engine/services/index.d.ts +3 -3
  95. package/.server/server/plugins/engine/services/notifyService.d.ts +4 -4
  96. package/.server/server/plugins/engine/services/uploadService.d.ts +2 -2
  97. package/.server/server/plugins/engine/services/uploadService.js +1 -1
  98. package/.server/server/plugins/engine/types/index.d.ts +10 -10
  99. package/.server/server/plugins/engine/types/schema.d.ts +1 -1
  100. package/.server/server/plugins/engine/types.d.ts +25 -16
  101. package/.server/server/plugins/engine/types.js.map +1 -1
  102. package/.server/server/plugins/engine/validationHelpers.d.ts +2 -2
  103. package/.server/server/plugins/engine/vision.d.ts +1 -1
  104. package/.server/server/plugins/map/index.d.ts +1 -1
  105. package/.server/server/plugins/map/index.js +1 -1
  106. package/.server/server/plugins/map/routes/get-os-token.d.ts +11 -1
  107. package/.server/server/plugins/map/routes/get-os-token.js +12 -2
  108. package/.server/server/plugins/map/routes/get-os-token.js.map +1 -1
  109. package/.server/server/plugins/map/routes/index.d.ts +4 -4
  110. package/.server/server/plugins/map/routes/index.js +3 -2
  111. package/.server/server/plugins/map/routes/index.js.map +1 -1
  112. package/.server/server/plugins/map/service.d.ts +1 -1
  113. package/.server/server/plugins/map/service.js +5 -2
  114. package/.server/server/plugins/map/service.js.map +1 -1
  115. package/.server/server/plugins/map/test/__stubs__/find.d.ts +1 -1
  116. package/.server/server/plugins/map/test/__stubs__/find.js +1 -1
  117. package/.server/server/plugins/nunjucks/context.d.ts +2 -2
  118. package/.server/server/plugins/nunjucks/context.js +2 -2
  119. package/.server/server/plugins/nunjucks/context.test.js +1 -1
  120. package/.server/server/plugins/nunjucks/enviroment.test.js +1 -1
  121. package/.server/server/plugins/nunjucks/environment.d.ts +3 -3
  122. package/.server/server/plugins/nunjucks/environment.js +3 -3
  123. package/.server/server/plugins/nunjucks/filters/answer.d.ts +1 -1
  124. package/.server/server/plugins/nunjucks/filters/answer.js +2 -2
  125. package/.server/server/plugins/nunjucks/filters/answer.test.js +1 -1
  126. package/.server/server/plugins/nunjucks/filters/evaluate.d.ts +1 -1
  127. package/.server/server/plugins/nunjucks/filters/evaluate.js +1 -1
  128. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  129. package/.server/server/plugins/nunjucks/filters/field.js +1 -1
  130. package/.server/server/plugins/nunjucks/filters/field.test.js +1 -1
  131. package/.server/server/plugins/nunjucks/filters/href.d.ts +1 -1
  132. package/.server/server/plugins/nunjucks/filters/href.js +1 -1
  133. package/.server/server/plugins/nunjucks/filters/href.test.js +1 -1
  134. package/.server/server/plugins/nunjucks/filters/index.d.ts +8 -8
  135. package/.server/server/plugins/nunjucks/filters/page.d.ts +1 -1
  136. package/.server/server/plugins/nunjucks/filters/page.js +1 -1
  137. package/.server/server/plugins/nunjucks/filters/page.test.js +1 -1
  138. package/.server/server/plugins/nunjucks/index.d.ts +3 -3
  139. package/.server/server/plugins/nunjucks/render.d.ts +2 -2
  140. package/.server/server/plugins/nunjucks/render.js +1 -1
  141. package/.server/server/plugins/nunjucks/types.d.ts +1 -1
  142. package/.server/server/plugins/nunjucks/types.js +1 -1
  143. package/.server/server/plugins/payment/helper.d.ts +2 -2
  144. package/.server/server/plugins/payment/helper.js +1 -1
  145. package/.server/server/plugins/payment/service.d.ts +3 -3
  146. package/.server/server/plugins/payment/service.js +1 -1
  147. package/.server/server/plugins/postcode-lookup/index.d.ts +1 -1
  148. package/.server/server/plugins/postcode-lookup/index.js +1 -1
  149. package/.server/server/plugins/postcode-lookup/models/index.d.ts +6 -6
  150. package/.server/server/plugins/postcode-lookup/models/index.js +1 -1
  151. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +6 -6
  152. package/.server/server/plugins/postcode-lookup/routes/index.js +15 -15
  153. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  154. package/.server/server/plugins/postcode-lookup/service.d.ts +1 -1
  155. package/.server/server/plugins/postcode-lookup/service.js +5 -2
  156. package/.server/server/plugins/postcode-lookup/service.js.map +1 -1
  157. package/.server/server/plugins/postcode-lookup/types.js +1 -1
  158. package/.server/server/routes/index.d.ts +2 -2
  159. package/.server/server/routes/types.d.ts +1 -1
  160. package/.server/server/schemas/index.d.ts +2 -2
  161. package/.server/server/services/cacheService.d.ts +8 -8
  162. package/.server/server/services/cacheService.js +2 -5
  163. package/.server/server/services/cacheService.js.map +1 -1
  164. package/.server/server/services/httpService.test.js +1 -1
  165. package/.server/server/services/index.d.ts +1 -1
  166. package/.server/server/types.d.ts +7 -7
  167. package/.server/server/utils/file-form-service.d.ts +2 -2
  168. package/.server/server/utils/file-form-service.js +1 -1
  169. package/package.json +8 -4
  170. package/src/client/javascripts/application.js +1 -1
  171. package/src/client/javascripts/geospatial-map.js +4 -4
  172. package/src/client/javascripts/location-map.js +2 -2
  173. package/src/client/javascripts/map.js +3 -3
  174. package/src/client/javascripts/shared.js +7 -7
  175. package/src/index.ts +3 -3
  176. package/src/server/common/helpers/logging/logger-options.ts +1 -1
  177. package/src/server/common/helpers/logging/logger.ts +1 -1
  178. package/src/server/common/helpers/logging/request-logger.ts +1 -1
  179. package/src/server/common/helpers/logging/request-tracing.js +1 -1
  180. package/src/server/common/helpers/redis-client.js +2 -2
  181. package/src/server/index.ts +13 -13
  182. package/src/server/plugins/crumb.ts +2 -2
  183. package/src/server/plugins/engine/beta/form-context.ts +9 -9
  184. package/src/server/plugins/engine/components/AutocompleteField.ts +3 -3
  185. package/src/server/plugins/engine/components/CheckboxesField.ts +7 -8
  186. package/src/server/plugins/engine/components/ComponentBase.ts +5 -5
  187. package/src/server/plugins/engine/components/ComponentCollection.ts +9 -9
  188. package/src/server/plugins/engine/components/DatePartsField.ts +8 -8
  189. package/src/server/plugins/engine/components/DeclarationField.ts +3 -3
  190. package/src/server/plugins/engine/components/Details.ts +1 -1
  191. package/src/server/plugins/engine/components/EastingNorthingField.ts +9 -9
  192. package/src/server/plugins/engine/components/EmailAddressField.ts +3 -3
  193. package/src/server/plugins/engine/components/FileUploadField.ts +6 -6
  194. package/src/server/plugins/engine/components/FormComponent.ts +4 -4
  195. package/src/server/plugins/engine/components/GeospatialField.ts +5 -5
  196. package/src/server/plugins/engine/components/HiddenField.ts +4 -4
  197. package/src/server/plugins/engine/components/Html.ts +1 -1
  198. package/src/server/plugins/engine/components/InsetText.ts +1 -1
  199. package/src/server/plugins/engine/components/LatLongField.ts +9 -9
  200. package/src/server/plugins/engine/components/List.ts +2 -2
  201. package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
  202. package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -5
  203. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +5 -5
  204. package/src/server/plugins/engine/components/Markdown.ts +1 -1
  205. package/src/server/plugins/engine/components/MonthYearField.ts +8 -8
  206. package/src/server/plugins/engine/components/MultilineTextField.ts +4 -4
  207. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +2 -2
  208. package/src/server/plugins/engine/components/NumberField.ts +3 -3
  209. package/src/server/plugins/engine/components/OsGridRefField.ts +2 -2
  210. package/src/server/plugins/engine/components/PaymentField.ts +8 -8
  211. package/src/server/plugins/engine/components/RadiosField.ts +1 -1
  212. package/src/server/plugins/engine/components/SelectField.ts +2 -2
  213. package/src/server/plugins/engine/components/SelectionControlField.ts +4 -4
  214. package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -4
  215. package/src/server/plugins/engine/components/TextField.ts +3 -3
  216. package/src/server/plugins/engine/components/UkAddressField.ts +7 -7
  217. package/src/server/plugins/engine/components/YesNoField.ts +5 -5
  218. package/src/server/plugins/engine/components/helpers/__stubs__/geospatial.ts +1 -1
  219. package/src/server/plugins/engine/components/helpers/components.ts +8 -8
  220. package/src/server/plugins/engine/components/helpers/geospatial.ts +1 -1
  221. package/src/server/plugins/engine/components/index.ts +27 -27
  222. package/src/server/plugins/engine/components/types.ts +1 -1
  223. package/src/server/plugins/engine/configureEnginePlugin.ts +10 -10
  224. package/src/server/plugins/engine/date-helper.ts +1 -1
  225. package/src/server/plugins/engine/helpers.ts +8 -8
  226. package/src/server/plugins/engine/index.ts +8 -8
  227. package/src/server/plugins/engine/models/FormModel.ts +15 -15
  228. package/src/server/plugins/engine/models/SummaryViewModel.ts +10 -10
  229. package/src/server/plugins/engine/models/index.ts +2 -2
  230. package/src/server/plugins/engine/models/types.ts +4 -4
  231. package/src/server/plugins/engine/options.js +3 -3
  232. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +6 -6
  233. package/src/server/plugins/engine/outputFormatters/human/v1.ts +9 -9
  234. package/src/server/plugins/engine/outputFormatters/index.ts +8 -8
  235. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +7 -7
  236. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +6 -6
  237. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +9 -9
  238. package/src/server/plugins/engine/pageControllers/PageController.ts +7 -7
  239. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +13 -13
  240. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +6 -6
  241. package/src/server/plugins/engine/pageControllers/StartPageController.ts +3 -3
  242. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +5 -5
  243. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +12 -12
  244. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +3 -3
  245. package/src/server/plugins/engine/pageControllers/__stubs__/request.ts +3 -3
  246. package/src/server/plugins/engine/pageControllers/__stubs__/server.ts +2 -2
  247. package/src/server/plugins/engine/pageControllers/errors.ts +1 -1
  248. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -2
  249. package/src/server/plugins/engine/pageControllers/helpers/state.ts +9 -9
  250. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +5 -5
  251. package/src/server/plugins/engine/pageControllers/index.ts +7 -7
  252. package/src/server/plugins/engine/pageControllers/validationOptions.ts +1 -1
  253. package/src/server/plugins/engine/plugin.ts +14 -14
  254. package/src/server/plugins/engine/routes/file-upload.ts +2 -2
  255. package/src/server/plugins/engine/routes/index.ts +10 -10
  256. package/src/server/plugins/engine/routes/payment-helper.js +4 -4
  257. package/src/server/plugins/engine/routes/payment.js +9 -9
  258. package/src/server/plugins/engine/routes/questions.ts +10 -10
  259. package/src/server/plugins/engine/routes/repeaters/item-delete.ts +6 -6
  260. package/src/server/plugins/engine/routes/repeaters/summary.ts +5 -5
  261. package/src/server/plugins/engine/services/formSubmissionService.js +2 -2
  262. package/src/server/plugins/engine/services/index.js +3 -3
  263. package/src/server/plugins/engine/services/localFormsService.js +2 -2
  264. package/src/server/plugins/engine/services/notifyService.ts +9 -9
  265. package/src/server/plugins/engine/services/uploadService.js +3 -3
  266. package/src/server/plugins/engine/types/index.ts +10 -10
  267. package/src/server/plugins/engine/types/schema.ts +2 -2
  268. package/src/server/plugins/engine/types.ts +22 -17
  269. package/src/server/plugins/engine/validationHelpers.ts +3 -3
  270. package/src/server/plugins/engine/vision.ts +3 -3
  271. package/src/server/plugins/map/index.js +2 -2
  272. package/src/server/plugins/map/routes/get-os-token.js +15 -3
  273. package/src/server/plugins/map/routes/index.js +7 -5
  274. package/src/server/plugins/map/service.js +7 -4
  275. package/src/server/plugins/map/test/__stubs__/find.js +1 -1
  276. package/src/server/plugins/nunjucks/context.js +5 -5
  277. package/src/server/plugins/nunjucks/environment.js +6 -6
  278. package/src/server/plugins/nunjucks/filters/answer.js +3 -3
  279. package/src/server/plugins/nunjucks/filters/evaluate.js +2 -2
  280. package/src/server/plugins/nunjucks/filters/field.js +1 -1
  281. package/src/server/plugins/nunjucks/filters/href.js +2 -2
  282. package/src/server/plugins/nunjucks/filters/index.js +8 -8
  283. package/src/server/plugins/nunjucks/filters/page.js +1 -1
  284. package/src/server/plugins/nunjucks/index.js +3 -3
  285. package/src/server/plugins/nunjucks/plugin.js +3 -3
  286. package/src/server/plugins/nunjucks/render.js +2 -2
  287. package/src/server/plugins/nunjucks/types.js +1 -1
  288. package/src/server/plugins/payment/helper.js +2 -2
  289. package/src/server/plugins/payment/service.js +4 -4
  290. package/src/server/plugins/postcode-lookup/index.js +2 -2
  291. package/src/server/plugins/postcode-lookup/models/index.js +3 -3
  292. package/src/server/plugins/postcode-lookup/routes/index.js +24 -14
  293. package/src/server/plugins/postcode-lookup/service.js +7 -4
  294. package/src/server/plugins/postcode-lookup/types.js +1 -1
  295. package/src/server/plugins/session.ts +1 -1
  296. package/src/server/routes/index.ts +2 -2
  297. package/src/server/routes/public.ts +1 -1
  298. package/src/server/routes/types.ts +1 -1
  299. package/src/server/schemas/index.ts +2 -2
  300. package/src/server/secure-context.js +1 -1
  301. package/src/server/services/cacheService.ts +13 -18
  302. package/src/server/services/httpService.ts +1 -1
  303. package/src/server/services/index.ts +1 -1
  304. package/src/server/types.ts +7 -7
  305. package/src/server/utils/notify.ts +2 -2
  306. package/src/server/utils/utils.js +1 -1
  307. package/src/typings/hapi/index.d.ts +4 -4
  308. package/src/typings/joi/index.d.ts +1 -1
  309. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  310. package/src/server/index.test.ts +0 -644
  311. package/src/server/plugins/engine/beta/form-context.test.ts +0 -373
  312. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -362
  313. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -486
  314. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -927
  315. package/src/server/plugins/engine/components/DeclarationField.test.ts +0 -560
  316. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  317. package/src/server/plugins/engine/components/EastingNorthingField.test.ts +0 -727
  318. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -445
  319. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -1079
  320. package/src/server/plugins/engine/components/GeospatialField.test.ts +0 -380
  321. package/src/server/plugins/engine/components/HiddenField.test.ts +0 -188
  322. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  323. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  324. package/src/server/plugins/engine/components/LatLongField.test.ts +0 -898
  325. package/src/server/plugins/engine/components/List.test.ts +0 -79
  326. package/src/server/plugins/engine/components/LocationFieldBase.test.ts +0 -253
  327. package/src/server/plugins/engine/components/LocationFieldHelpers.test.ts +0 -743
  328. package/src/server/plugins/engine/components/Markdown.test.ts +0 -48
  329. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -617
  330. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -647
  331. package/src/server/plugins/engine/components/NationalGridFieldNumberField.test.ts +0 -449
  332. package/src/server/plugins/engine/components/NumberField.test.ts +0 -723
  333. package/src/server/plugins/engine/components/OsGridRefField.test.ts +0 -460
  334. package/src/server/plugins/engine/components/PaymentField.test.ts +0 -745
  335. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -297
  336. package/src/server/plugins/engine/components/SelectField.test.ts +0 -289
  337. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -384
  338. package/src/server/plugins/engine/components/TextField.test.ts +0 -521
  339. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -806
  340. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -256
  341. package/src/server/plugins/engine/components/helpers/components.test.ts +0 -399
  342. package/src/server/plugins/engine/components/helpers/geospatial.test.js +0 -55
  343. package/src/server/plugins/engine/components/helpers/helpers.test.ts +0 -219
  344. package/src/server/plugins/engine/date-helper.test.ts +0 -47
  345. package/src/server/plugins/engine/helpers.test.ts +0 -868
  346. package/src/server/plugins/engine/models/FormModel.test.ts +0 -725
  347. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -472
  348. package/src/server/plugins/engine/options.test.js +0 -63
  349. package/src/server/plugins/engine/outputFormatters/adapter/v1.location.test.ts +0 -356
  350. package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +0 -871
  351. package/src/server/plugins/engine/outputFormatters/human/v1.payment.test.ts +0 -147
  352. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -145
  353. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  354. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -268
  355. package/src/server/plugins/engine/outputFormatters/machine/v2.location.test.ts +0 -341
  356. package/src/server/plugins/engine/outputFormatters/machine/v2.payment.test.ts +0 -115
  357. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -311
  358. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1372
  359. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -246
  360. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1686
  361. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -279
  362. package/src/server/plugins/engine/pageControllers/StartPageController.test.ts +0 -32
  363. package/src/server/plugins/engine/pageControllers/StatusPageController.test.ts +0 -32
  364. package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +0 -89
  365. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -37
  366. package/src/server/plugins/engine/pageControllers/errors.test.ts +0 -78
  367. package/src/server/plugins/engine/pageControllers/helpers/helpers.test.ts +0 -182
  368. package/src/server/plugins/engine/pageControllers/helpers/state.test.ts +0 -359
  369. package/src/server/plugins/engine/pageControllers/helpers/submission.test.ts +0 -373
  370. package/src/server/plugins/engine/referenceNumbers.test.ts +0 -74
  371. package/src/server/plugins/engine/routes/index.test.ts +0 -332
  372. package/src/server/plugins/engine/routes/payment-helper.test.js +0 -136
  373. package/src/server/plugins/engine/routes/payment.test.js +0 -180
  374. package/src/server/plugins/engine/routes/questions.test.ts +0 -502
  375. package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +0 -83
  376. package/src/server/plugins/engine/routes/repeaters/summary.test.ts +0 -75
  377. package/src/server/plugins/engine/services/formsService.test.js +0 -26
  378. package/src/server/plugins/engine/services/notifyService.test.ts +0 -310
  379. package/src/server/plugins/engine/types/schema.test.ts +0 -234
  380. package/src/server/plugins/engine/views/components/service-banner/template.test.js +0 -43
  381. package/src/server/plugins/engine/views/components/tag-env/template.test.js +0 -28
  382. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  383. package/src/server/plugins/map/routes/get-os-token.test.js +0 -55
  384. package/src/server/plugins/map/service.test.js +0 -144
  385. package/src/server/plugins/nunjucks/context.test.js +0 -109
  386. package/src/server/plugins/nunjucks/enviroment.test.js +0 -207
  387. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -92
  388. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  389. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  390. package/src/server/plugins/nunjucks/filters/merge.test.js +0 -15
  391. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  392. package/src/server/plugins/payment/helper.test.js +0 -29
  393. package/src/server/plugins/payment/service.test.js +0 -218
  394. package/src/server/plugins/postcode-lookup/service.test.js +0 -177
  395. package/src/server/postcode-lookup.test.ts +0 -64
  396. package/src/server/routes/dummy-api.test.ts +0 -97
  397. package/src/server/services/cacheService.test.ts +0 -308
  398. package/src/server/services/httpService.test.js +0 -491
  399. package/src/server/utils/file-form-service.test.js +0 -127
  400. package/src/server/utils/notify.test.ts +0 -37
  401. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  402. package/src/server/utils/utils.test.js +0 -69
@@ -57,4 +57,4 @@ export type NunjucksContext = {
57
57
  */
58
58
  ctx: ViewContext;
59
59
  };
60
- import type { FormContext } from '~/src/server/plugins/engine/types.js';
60
+ import type { FormContext } from '../../../server/plugins/engine/types.js';
@@ -27,6 +27,6 @@
27
27
  */
28
28
 
29
29
  /**
30
- * @import { FormContext } from '~/src/server/plugins/engine/types.js'
30
+ * @import { FormContext } from '../../../server/plugins/engine/types.js'
31
31
  */
32
32
  //# sourceMappingURL=types.js.map
@@ -21,5 +21,5 @@ export function formatPaymentDate(isoString: string): string;
21
21
  */
22
22
  export function formatCurrency(amount: number, locale?: "en-GB", currency?: "GBP"): string;
23
23
  export const DEFAULT_PAYMENT_HELP_URL: "https://www.gov.uk/government/organisations/department-for-environment-food-rural-affairs";
24
- import type { FormsService } from '~/src/server/types.js';
25
- import { PaymentService } from '~/src/server/plugins/payment/service.js';
24
+ import type { FormsService } from '../../../server/types.js';
25
+ import { PaymentService } from '../../../server/plugins/payment/service.js';
@@ -42,6 +42,6 @@ export function formatCurrency(amount, locale = 'en-GB', currency = 'GBP') {
42
42
  }
43
43
 
44
44
  /**
45
- * @import { FormsService } from '~/src/server/types.js'
45
+ * @import { FormsService } from '../../../server/types.js'
46
46
  */
47
47
  //# sourceMappingURL=helper.js.map
@@ -38,6 +38,6 @@ export class PaymentService {
38
38
  postToPayProvider(payload: CreatePaymentRequest): Promise<CreatePaymentResponse>;
39
39
  #private;
40
40
  }
41
- import type { GetPaymentResponse } from '~/src/server/plugins/payment/types.js';
42
- import type { CreatePaymentRequest } from '~/src/server/plugins/payment/types.js';
43
- import type { CreatePaymentResponse } from '~/src/server/plugins/payment/types.js';
41
+ import type { GetPaymentResponse } from '../../../server/plugins/payment/types.js';
42
+ import type { CreatePaymentRequest } from '../../../server/plugins/payment/types.js';
43
+ import type { CreatePaymentResponse } from '../../../server/plugins/payment/types.js';
@@ -149,6 +149,6 @@ export class PaymentService {
149
149
  }
150
150
 
151
151
  /**
152
- * @import { CreatePaymentRequest, CreatePaymentResponse, GetPaymentApiResponse, GetPaymentResponse } from '~/src/server/plugins/payment/types.js'
152
+ * @import { CreatePaymentRequest, CreatePaymentResponse, GetPaymentApiResponse, GetPaymentResponse } from '../../../server/plugins/payment/types.js'
153
153
  */
154
154
  //# sourceMappingURL=service.js.map
@@ -5,4 +5,4 @@ export namespace postcodeLookupPlugin {
5
5
  let multiple: false;
6
6
  function register(server: import("@hapi/hapi").Server<import("@hapi/hapi").ServerApplicationState>, options: PostcodeLookupConfiguration): void;
7
7
  }
8
- import type { PostcodeLookupConfiguration } from '~/src/server/plugins/postcode-lookup/types.js';
8
+ import type { PostcodeLookupConfiguration } from '../../../server/plugins/postcode-lookup/types.js';
@@ -16,6 +16,6 @@ export const postcodeLookupPlugin = {
16
16
 
17
17
  /**
18
18
  * @import { NamedPlugin } from '@hapi/hapi'
19
- * @import { PostcodeLookupConfiguration } from '~/src/server/plugins/postcode-lookup/types.js'
19
+ * @import { PostcodeLookupConfiguration } from '../../../server/plugins/postcode-lookup/types.js'
20
20
  */
21
21
  //# sourceMappingURL=index.js.map
@@ -246,10 +246,10 @@ export const selectPayloadSchema: Joi.ObjectSchema<PostcodeLookupSelectPayload>;
246
246
  */
247
247
  export const manualPayloadSchema: Joi.ObjectSchema<PostcodeLookupManualPayload>;
248
248
  export type OptionalValidationErrorItem = Joi.ValidationErrorItem | undefined;
249
- import type { PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js';
250
- import type { PostcodeLookupDetailsData } from '~/src/server/plugins/postcode-lookup/types.js';
251
- import type { PostcodeLookupSelectPayload } from '~/src/server/plugins/postcode-lookup/types.js';
252
- import type { Address } from '~/src/server/plugins/postcode-lookup/types.js';
253
- import type { PostcodeLookupManualPayload } from '~/src/server/plugins/postcode-lookup/types.js';
249
+ import type { PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js';
250
+ import type { PostcodeLookupDetailsData } from '../../../../server/plugins/postcode-lookup/types.js';
251
+ import type { PostcodeLookupSelectPayload } from '../../../../server/plugins/postcode-lookup/types.js';
252
+ import type { Address } from '../../../../server/plugins/postcode-lookup/types.js';
253
+ import type { PostcodeLookupManualPayload } from '../../../../server/plugins/postcode-lookup/types.js';
254
254
  import Joi from 'joi';
255
- import type { PostcodeLookupDetailsPayload } from '~/src/server/plugins/postcode-lookup/types.js';
255
+ import type { PostcodeLookupDetailsPayload } from '../../../../server/plugins/postcode-lookup/types.js';
@@ -513,6 +513,6 @@ export function manualViewModel(data, payload, err) {
513
513
 
514
514
  /**
515
515
  * @import { ObjectSchema, ValidationErrorItem } from 'joi'
516
- * @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'
516
+ * @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js'
517
517
  */
518
518
  //# sourceMappingURL=index.js.map
@@ -10,10 +10,10 @@ export function dispatch(request: FormRequestPayload, h: FormResponseToolkit, in
10
10
  * @param {PostcodeLookupConfiguration} options - ordnance survey api key
11
11
  */
12
12
  export function getRoutes(options: PostcodeLookupConfiguration): (ServerRoute<PostcodeLookupGetRequestRefs> | ServerRoute<PostcodeLookupPostRequestRefs>)[];
13
- import type { FormRequestPayload } from '~/src/server/routes/types.js';
14
- import type { FormResponseToolkit } from '~/src/server/routes/types.js';
15
- import type { PostcodeLookupDispatchData } from '~/src/server/plugins/postcode-lookup/types.js';
16
- import type { PostcodeLookupConfiguration } from '~/src/server/plugins/postcode-lookup/types.js';
17
- import type { PostcodeLookupGetRequestRefs } from '~/src/server/plugins/postcode-lookup/types.js';
13
+ import type { FormRequestPayload } from '../../../../server/routes/types.js';
14
+ import type { FormResponseToolkit } from '../../../../server/routes/types.js';
15
+ import type { PostcodeLookupDispatchData } from '../../../../server/plugins/postcode-lookup/types.js';
16
+ import type { PostcodeLookupConfiguration } from '../../../../server/plugins/postcode-lookup/types.js';
17
+ import type { PostcodeLookupGetRequestRefs } from '../../../../server/plugins/postcode-lookup/types.js';
18
18
  import type { ServerRoute } from '@hapi/hapi';
19
- import type { PostcodeLookupPostRequestRefs } from '~/src/server/plugins/postcode-lookup/types.js';
19
+ import type { PostcodeLookupPostRequestRefs } from '../../../../server/plugins/postcode-lookup/types.js';
@@ -154,17 +154,17 @@ function postRoute(options) {
154
154
  * @param {PostcodeLookupConfiguration} options
155
155
  */
156
156
  async function detailsPostHandler(request, h, options) {
157
- const {
158
- payload
159
- } = request;
160
157
  const session = getSessionState(request);
161
158
  const {
162
159
  ordnanceSurveyApiKey: apiKey
163
160
  } = options;
161
+
162
+ /** @type {{ value: PostcodeLookupDetailsPayload, error?: import('joi').ValidationError }} */
163
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
164
164
  const {
165
165
  value: details,
166
166
  error
167
- } = detailsPayloadSchema.validate(payload);
167
+ } = detailsPayloadSchema.validate(request.payload);
168
168
  let model;
169
169
  if (error) {
170
170
  model = detailsViewModel(session, details, error);
@@ -195,17 +195,17 @@ async function detailsPostHandler(request, h, options) {
195
195
  * @param {PostcodeLookupConfiguration} options
196
196
  */
197
197
  async function selectPostHandler(request, h, options) {
198
- const {
199
- payload
200
- } = request;
201
198
  const session = getSessionState(request);
202
199
  const {
203
200
  ordnanceSurveyApiKey: apiKey
204
201
  } = options;
202
+
203
+ /** @type {{ value: PostcodeLookupSelectPayload, error?: import('joi').ValidationError }} */
204
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
205
205
  const {
206
206
  value: select,
207
207
  error
208
- } = selectPayloadSchema.validate(payload);
208
+ } = selectPayloadSchema.validate(request.payload);
209
209
  if (error) {
210
210
  const model = await selectViewModel({
211
211
  session,
@@ -234,14 +234,14 @@ async function selectPostHandler(request, h, options) {
234
234
  * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h
235
235
  */
236
236
  function manualPostHandler(request, h) {
237
- const {
238
- payload
239
- } = request;
240
237
  const session = getSessionState(request);
238
+
239
+ /** @type {{ value: PostcodeLookupManualPayload, error?: import('joi').ValidationError }} */
240
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
241
241
  const {
242
242
  value: manual,
243
243
  error
244
- } = manualPayloadSchema.validate(payload, {
244
+ } = manualPayloadSchema.validate(request.payload, {
245
245
  abortEarly: false
246
246
  });
247
247
  if (error) {
@@ -260,8 +260,8 @@ function manualPostHandler(request, h) {
260
260
 
261
261
  /**
262
262
  * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'
263
- * @import { PostcodeLookupManualPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'
264
- * @import { FormRequestPayload, FormResponseToolkit } from '~/src/server/routes/types.js'
265
- * @import { ExternalStateAppendage } from '~/src/server/plugins/engine/types.js'
263
+ * @import { PostcodeLookupManualPayload, PostcodeLookupDetailsPayload, PostcodeLookupSelectPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js'
264
+ * @import { FormRequestPayload, FormResponseToolkit } from '../../../../server/routes/types.js'
265
+ * @import { ExternalStateAppendage } from '../../../../server/plugins/engine/types.js'
266
266
  */
267
267
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","JOURNEY_BASE_URL","detailsPayloadSchema","detailsViewModel","manualPayloadSchema","manualViewModel","selectPayloadSchema","selectViewModel","stepSchema","steps","service","viewName","getSessionState","request","state","yar","get","badRequest","flashComponentState","componentName","address","addressState","addressLine1","addressLine2","town","county","postcode","uprn","undefined","appendage","component","data","flash","dispatch","h","initial","details","postcodeQuery","buildingNameQuery","set","query","step","redirect","code","SEE_OTHER","getRoutes","options","getRoute","postRoute","method","path","handler","session","model","manual","view","validate","object","keys","string","allow","optional","payload","detailsPostHandler","select","selectPostHandler","manualPostHandler","unknown","ordnanceSurveyApiKey","apiKey","value","error","addresses","searchByUPRN","property","at","internal","sourceUrl","abortEarly"],"sources":["../../../../../src/server/plugins/postcode-lookup/routes/index.js"],"sourcesContent":["import Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\nimport Joi from 'joi'\n\nimport { EXTERNAL_STATE_APPENDAGE } from '~/src/server/constants.js'\nimport {\n JOURNEY_BASE_URL,\n detailsPayloadSchema,\n detailsViewModel,\n manualPayloadSchema,\n manualViewModel,\n selectPayloadSchema,\n selectViewModel,\n stepSchema,\n steps\n} from '~/src/server/plugins/postcode-lookup/models/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\n\nconst viewName = 'postcode-lookup-details'\n\n/**\n * Get the session state associated with this journey\n * @param {PostcodeLookupRequest} request\n */\nfunction getSessionState(request) {\n /**\n * @type {PostcodeLookupSessionData | null | undefined}\n */\n const state = request.yar.get(JOURNEY_BASE_URL)\n\n if (!state) {\n throw Boom.badRequest(\n `No postcode lookup data found for ${JOURNEY_BASE_URL}`\n )\n }\n\n return state\n}\n\n/**\n * Flash form component state\n * @param {PostcodeLookupRequest} request - the request\n * @param {string} componentName - the component name\n * @param {Address | PostcodeLookupManualPayload} address - the address from ordnance survey or manually entered\n */\nfunction flashComponentState(request, componentName, address) {\n const addressState = {\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2,\n town: address.town,\n county: address.county,\n postcode: address.postcode,\n uprn: 'uprn' in address && address.uprn ? address.uprn : undefined\n }\n\n /**\n * @type {ExternalStateAppendage}\n */\n const appendage = {\n component: componentName,\n data: addressState\n }\n\n request.yar.flash(EXTERNAL_STATE_APPENDAGE, appendage, true)\n}\n\n/**\n * Initialises and dispatches the request to the postcode lookup journey\n * @param {FormRequestPayload} request - the source page\n * @param {FormResponseToolkit} h - the source page\n * @param {PostcodeLookupDispatchData} initial - the source data\n */\nexport function dispatch(request, h, initial) {\n /**\n * @type {PostcodeLookupSessionData}\n */\n const data = {\n initial,\n details: { postcodeQuery: '', buildingNameQuery: '' }\n }\n\n request.yar.set(JOURNEY_BASE_URL, data)\n\n const query = initial.step ? `?step=${initial.step}` : ''\n\n return h.redirect(`${JOURNEY_BASE_URL}${query}`).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Gets the postcode lookup routes\n * @param {PostcodeLookupConfiguration} options - ordnance survey api key\n */\nexport function getRoutes(options) {\n return [getRoute(), postRoute(options)]\n}\n\n/**\n * @returns {ServerRoute<PostcodeLookupGetRequestRefs>}\n */\nfunction getRoute() {\n return {\n method: 'GET',\n path: JOURNEY_BASE_URL,\n handler(request, h) {\n const { query } = request\n const { step } = query\n const session = getSessionState(request)\n\n const model =\n step === steps.manual\n ? manualViewModel(session)\n : detailsViewModel(session)\n\n return h.view(viewName, model)\n },\n options: {\n validate: {\n query: Joi.object()\n .keys({\n step: Joi.string().allow(steps.details, steps.manual).optional()\n })\n .optional()\n }\n }\n }\n}\n\n/**\n * @param {PostcodeLookupConfiguration} options\n * @returns {ServerRoute<PostcodeLookupPostRequestRefs>}\n */\nfunction postRoute(options) {\n return {\n method: 'POST',\n path: JOURNEY_BASE_URL,\n async handler(request, h) {\n const { payload } = request\n const { step } = payload\n\n switch (step) {\n case steps.details: {\n return detailsPostHandler(request, h, options)\n }\n case steps.select: {\n return selectPostHandler(request, h, options)\n }\n case steps.manual: {\n return manualPostHandler(request, h)\n }\n default:\n throw Boom.badRequest(`Invalid step ${step}`)\n }\n },\n options: {\n validate: {\n payload: Joi.object()\n .keys({\n step: stepSchema\n })\n .unknown(true)\n }\n }\n }\n}\n\n/**\n * Post handler for the details step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function detailsPostHandler(request, h, options) {\n const { payload } = request\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const { value: details, error } = detailsPayloadSchema.validate(payload)\n\n let model\n\n if (error) {\n model = detailsViewModel(session, details, error)\n\n return h.view(viewName, model)\n }\n\n const { postcodeQuery, buildingNameQuery } = details\n session.details = { postcodeQuery, buildingNameQuery }\n\n // Store the updated session\n request.yar.set(JOURNEY_BASE_URL, session)\n\n model = await selectViewModel({ session, apiKey })\n\n return h.view(viewName, model)\n}\n\n/**\n * Post handler for the select step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function selectPostHandler(request, h, options) {\n const { payload } = request\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const { value: select, error } = selectPayloadSchema.validate(payload)\n\n if (error) {\n const model = await selectViewModel({ session, apiKey }, select, error)\n\n return h.view(viewName, model)\n }\n\n const addresses = await service.searchByUPRN(select.uprn, apiKey)\n const property = addresses.at(0)\n\n if (!property) {\n throw Boom.internal(`UPRN ${property} not found`)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, property)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Post handler for the manual step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n */\nfunction manualPostHandler(request, h) {\n const { payload } = request\n const session = getSessionState(request)\n\n const { value: manual, error } = manualPayloadSchema.validate(payload, {\n abortEarly: false\n })\n\n if (error) {\n const model = manualViewModel(session, manual, error)\n\n return h.view(viewName, model)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, manual)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'\n * @import { PostcodeLookupManualPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { FormRequestPayload, FormResponseToolkit } from '~/src/server/routes/types.js'\n * @import { ExternalStateAppendage } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","JOURNEY_BASE_URL","detailsPayloadSchema","detailsViewModel","manualPayloadSchema","manualViewModel","selectPayloadSchema","selectViewModel","stepSchema","steps","service","viewName","getSessionState","request","state","yar","get","badRequest","flashComponentState","componentName","address","addressState","addressLine1","addressLine2","town","county","postcode","uprn","undefined","appendage","component","data","flash","dispatch","h","initial","details","postcodeQuery","buildingNameQuery","set","query","step","redirect","code","SEE_OTHER","getRoutes","options","getRoute","postRoute","method","path","handler","session","model","manual","view","validate","object","keys","string","allow","optional","payload","detailsPostHandler","select","selectPostHandler","manualPostHandler","unknown","ordnanceSurveyApiKey","apiKey","value","error","addresses","searchByUPRN","property","at","internal","sourceUrl","abortEarly"],"sources":["../../../../../src/server/plugins/postcode-lookup/routes/index.js"],"sourcesContent":["import Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\nimport Joi from 'joi'\n\nimport { EXTERNAL_STATE_APPENDAGE } from '~/src/server/constants.js'\nimport {\n JOURNEY_BASE_URL,\n detailsPayloadSchema,\n detailsViewModel,\n manualPayloadSchema,\n manualViewModel,\n selectPayloadSchema,\n selectViewModel,\n stepSchema,\n steps\n} from '~/src/server/plugins/postcode-lookup/models/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\n\nconst viewName = 'postcode-lookup-details'\n\n/**\n * Get the session state associated with this journey\n * @param {PostcodeLookupRequest} request\n */\nfunction getSessionState(request) {\n /**\n * @type {PostcodeLookupSessionData | null | undefined}\n */\n const state = request.yar.get(JOURNEY_BASE_URL)\n\n if (!state) {\n throw Boom.badRequest(\n `No postcode lookup data found for ${JOURNEY_BASE_URL}`\n )\n }\n\n return state\n}\n\n/**\n * Flash form component state\n * @param {PostcodeLookupRequest} request - the request\n * @param {string} componentName - the component name\n * @param {Address | PostcodeLookupManualPayload} address - the address from ordnance survey or manually entered\n */\nfunction flashComponentState(request, componentName, address) {\n const addressState = {\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2,\n town: address.town,\n county: address.county,\n postcode: address.postcode,\n uprn: 'uprn' in address && address.uprn ? address.uprn : undefined\n }\n\n /**\n * @type {ExternalStateAppendage}\n */\n const appendage = {\n component: componentName,\n data: addressState\n }\n\n request.yar.flash(EXTERNAL_STATE_APPENDAGE, appendage, true)\n}\n\n/**\n * Initialises and dispatches the request to the postcode lookup journey\n * @param {FormRequestPayload} request - the source page\n * @param {FormResponseToolkit} h - the source page\n * @param {PostcodeLookupDispatchData} initial - the source data\n */\nexport function dispatch(request, h, initial) {\n /**\n * @type {PostcodeLookupSessionData}\n */\n const data = {\n initial,\n details: { postcodeQuery: '', buildingNameQuery: '' }\n }\n\n request.yar.set(JOURNEY_BASE_URL, data)\n\n const query = initial.step ? `?step=${initial.step}` : ''\n\n return h.redirect(`${JOURNEY_BASE_URL}${query}`).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Gets the postcode lookup routes\n * @param {PostcodeLookupConfiguration} options - ordnance survey api key\n */\nexport function getRoutes(options) {\n return [getRoute(), postRoute(options)]\n}\n\n/**\n * @returns {ServerRoute<PostcodeLookupGetRequestRefs>}\n */\nfunction getRoute() {\n return {\n method: 'GET',\n path: JOURNEY_BASE_URL,\n handler(request, h) {\n const { query } = request\n const { step } = query\n const session = getSessionState(request)\n\n const model =\n step === steps.manual\n ? manualViewModel(session)\n : detailsViewModel(session)\n\n return h.view(viewName, model)\n },\n options: {\n validate: {\n query: Joi.object()\n .keys({\n step: Joi.string().allow(steps.details, steps.manual).optional()\n })\n .optional()\n }\n }\n }\n}\n\n/**\n * @param {PostcodeLookupConfiguration} options\n * @returns {ServerRoute<PostcodeLookupPostRequestRefs>}\n */\nfunction postRoute(options) {\n return {\n method: 'POST',\n path: JOURNEY_BASE_URL,\n async handler(request, h) {\n const { payload } = request\n const { step } = payload\n\n switch (step) {\n case steps.details: {\n return detailsPostHandler(request, h, options)\n }\n case steps.select: {\n return selectPostHandler(request, h, options)\n }\n case steps.manual: {\n return manualPostHandler(request, h)\n }\n default:\n throw Boom.badRequest(`Invalid step ${step}`)\n }\n },\n options: {\n validate: {\n payload: Joi.object()\n .keys({\n step: stepSchema\n })\n .unknown(true)\n }\n }\n }\n}\n\n/**\n * Post handler for the details step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function detailsPostHandler(request, h, options) {\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n\n /** @type {{ value: PostcodeLookupDetailsPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: details, error } = detailsPayloadSchema.validate(\n request.payload\n )\n\n let model\n\n if (error) {\n model = detailsViewModel(session, details, error)\n\n return h.view(viewName, model)\n }\n\n const { postcodeQuery, buildingNameQuery } = details\n session.details = { postcodeQuery, buildingNameQuery }\n\n // Store the updated session\n request.yar.set(JOURNEY_BASE_URL, session)\n\n model = await selectViewModel({ session, apiKey })\n\n return h.view(viewName, model)\n}\n\n/**\n * Post handler for the select step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function selectPostHandler(request, h, options) {\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n\n /** @type {{ value: PostcodeLookupSelectPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: select, error } = selectPayloadSchema.validate(request.payload)\n\n if (error) {\n const model = await selectViewModel({ session, apiKey }, select, error)\n\n return h.view(viewName, model)\n }\n\n const addresses = await service.searchByUPRN(select.uprn, apiKey)\n const property = addresses.at(0)\n\n if (!property) {\n throw Boom.internal(`UPRN ${property} not found`)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, property)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Post handler for the manual step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n */\nfunction manualPostHandler(request, h) {\n const session = getSessionState(request)\n\n /** @type {{ value: PostcodeLookupManualPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: manual, error } = manualPayloadSchema.validate(\n request.payload,\n {\n abortEarly: false\n }\n )\n\n if (error) {\n const model = manualViewModel(session, manual, error)\n\n return h.view(viewName, model)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, manual)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'\n * @import { PostcodeLookupManualPayload, PostcodeLookupDetailsPayload, PostcodeLookupSelectPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { FormRequestPayload, FormResponseToolkit } from '~/src/server/routes/types.js'\n * @import { ExternalStateAppendage } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA,OAAOA,IAAI,MAAM,YAAY;AAC7B,SAASC,WAAW,QAAQ,mBAAmB;AAC/C,OAAOC,GAAG,MAAM,KAAK;AAErB,SAASC,wBAAwB;AACjC,SACEC,gBAAgB,EAChBC,oBAAoB,EACpBC,gBAAgB,EAChBC,mBAAmB,EACnBC,eAAe,EACfC,mBAAmB,EACnBC,eAAe,EACfC,UAAU,EACVC,KAAK;AAEP,OAAO,KAAKC,OAAO;AAEnB,MAAMC,QAAQ,GAAG,yBAAyB;;AAE1C;AACA;AACA;AACA;AACA,SAASC,eAAeA,CAACC,OAAO,EAAE;EAChC;AACF;AACA;EACE,MAAMC,KAAK,GAAGD,OAAO,CAACE,GAAG,CAACC,GAAG,CAACf,gBAAgB,CAAC;EAE/C,IAAI,CAACa,KAAK,EAAE;IACV,MAAMjB,IAAI,CAACoB,UAAU,CACnB,qCAAqChB,gBAAgB,EACvD,CAAC;EACH;EAEA,OAAOa,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASI,mBAAmBA,CAACL,OAAO,EAAEM,aAAa,EAAEC,OAAO,EAAE;EAC5D,MAAMC,YAAY,GAAG;IACnBC,YAAY,EAAEF,OAAO,CAACE,YAAY;IAClCC,YAAY,EAAEH,OAAO,CAACG,YAAY;IAClCC,IAAI,EAAEJ,OAAO,CAACI,IAAI;IAClBC,MAAM,EAAEL,OAAO,CAACK,MAAM;IACtBC,QAAQ,EAAEN,OAAO,CAACM,QAAQ;IAC1BC,IAAI,EAAE,MAAM,IAAIP,OAAO,IAAIA,OAAO,CAACO,IAAI,GAAGP,OAAO,CAACO,IAAI,GAAGC;EAC3D,CAAC;;EAED;AACF;AACA;EACE,MAAMC,SAAS,GAAG;IAChBC,SAAS,EAAEX,aAAa;IACxBY,IAAI,EAAEV;EACR,CAAC;EAEDR,OAAO,CAACE,GAAG,CAACiB,KAAK,CAAChC,wBAAwB,EAAE6B,SAAS,EAAE,IAAI,CAAC;AAC9D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,QAAQA,CAACpB,OAAO,EAAEqB,CAAC,EAAEC,OAAO,EAAE;EAC5C;AACF;AACA;EACE,MAAMJ,IAAI,GAAG;IACXI,OAAO;IACPC,OAAO,EAAE;MAAEC,aAAa,EAAE,EAAE;MAAEC,iBAAiB,EAAE;IAAG;EACtD,CAAC;EAEDzB,OAAO,CAACE,GAAG,CAACwB,GAAG,CAACtC,gBAAgB,EAAE8B,IAAI,CAAC;EAEvC,MAAMS,KAAK,GAAGL,OAAO,CAACM,IAAI,GAAG,SAASN,OAAO,CAACM,IAAI,EAAE,GAAG,EAAE;EAEzD,OAAOP,CAAC,CAACQ,QAAQ,CAAC,GAAGzC,gBAAgB,GAAGuC,KAAK,EAAE,CAAC,CAACG,IAAI,CAAC7C,WAAW,CAAC8C,SAAS,CAAC;AAC9E;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACC,OAAO,EAAE;EACjC,OAAO,CAACC,QAAQ,CAAC,CAAC,EAAEC,SAAS,CAACF,OAAO,CAAC,CAAC;AACzC;;AAEA;AACA;AACA;AACA,SAASC,QAAQA,CAAA,EAAG;EAClB,OAAO;IACLE,MAAM,EAAE,KAAK;IACbC,IAAI,EAAEjD,gBAAgB;IACtBkD,OAAOA,CAACtC,OAAO,EAAEqB,CAAC,EAAE;MAClB,MAAM;QAAEM;MAAM,CAAC,GAAG3B,OAAO;MACzB,MAAM;QAAE4B;MAAK,CAAC,GAAGD,KAAK;MACtB,MAAMY,OAAO,GAAGxC,eAAe,CAACC,OAAO,CAAC;MAExC,MAAMwC,KAAK,GACTZ,IAAI,KAAKhC,KAAK,CAAC6C,MAAM,GACjBjD,eAAe,CAAC+C,OAAO,CAAC,GACxBjD,gBAAgB,CAACiD,OAAO,CAAC;MAE/B,OAAOlB,CAAC,CAACqB,IAAI,CAAC5C,QAAQ,EAAE0C,KAAK,CAAC;IAChC,CAAC;IACDP,OAAO,EAAE;MACPU,QAAQ,EAAE;QACRhB,KAAK,EAAEzC,GAAG,CAAC0D,MAAM,CAAC,CAAC,CAChBC,IAAI,CAAC;UACJjB,IAAI,EAAE1C,GAAG,CAAC4D,MAAM,CAAC,CAAC,CAACC,KAAK,CAACnD,KAAK,CAAC2B,OAAO,EAAE3B,KAAK,CAAC6C,MAAM,CAAC,CAACO,QAAQ,CAAC;QACjE,CAAC,CAAC,CACDA,QAAQ,CAAC;MACd;IACF;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,SAASb,SAASA,CAACF,OAAO,EAAE;EAC1B,OAAO;IACLG,MAAM,EAAE,MAAM;IACdC,IAAI,EAAEjD,gBAAgB;IACtB,MAAMkD,OAAOA,CAACtC,OAAO,EAAEqB,CAAC,EAAE;MACxB,MAAM;QAAE4B;MAAQ,CAAC,GAAGjD,OAAO;MAC3B,MAAM;QAAE4B;MAAK,CAAC,GAAGqB,OAAO;MAExB,QAAQrB,IAAI;QACV,KAAKhC,KAAK,CAAC2B,OAAO;UAAE;YAClB,OAAO2B,kBAAkB,CAAClD,OAAO,EAAEqB,CAAC,EAAEY,OAAO,CAAC;UAChD;QACA,KAAKrC,KAAK,CAACuD,MAAM;UAAE;YACjB,OAAOC,iBAAiB,CAACpD,OAAO,EAAEqB,CAAC,EAAEY,OAAO,CAAC;UAC/C;QACA,KAAKrC,KAAK,CAAC6C,MAAM;UAAE;YACjB,OAAOY,iBAAiB,CAACrD,OAAO,EAAEqB,CAAC,CAAC;UACtC;QACA;UACE,MAAMrC,IAAI,CAACoB,UAAU,CAAC,gBAAgBwB,IAAI,EAAE,CAAC;MACjD;IACF,CAAC;IACDK,OAAO,EAAE;MACPU,QAAQ,EAAE;QACRM,OAAO,EAAE/D,GAAG,CAAC0D,MAAM,CAAC,CAAC,CAClBC,IAAI,CAAC;UACJjB,IAAI,EAAEjC;QACR,CAAC,CAAC,CACD2D,OAAO,CAAC,IAAI;MACjB;IACF;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAeJ,kBAAkBA,CAAClD,OAAO,EAAEqB,CAAC,EAAEY,OAAO,EAAE;EACrD,MAAMM,OAAO,GAAGxC,eAAe,CAACC,OAAO,CAAC;EACxC,MAAM;IAAEuD,oBAAoB,EAAEC;EAAO,CAAC,GAAGvB,OAAO;;EAEhD;EACA;EACA,MAAM;IAAEwB,KAAK,EAAElC,OAAO;IAAEmC;EAAM,CAAC,GAAGrE,oBAAoB,CAACsD,QAAQ,CAC7D3C,OAAO,CAACiD,OACV,CAAC;EAED,IAAIT,KAAK;EAET,IAAIkB,KAAK,EAAE;IACTlB,KAAK,GAAGlD,gBAAgB,CAACiD,OAAO,EAAEhB,OAAO,EAAEmC,KAAK,CAAC;IAEjD,OAAOrC,CAAC,CAACqB,IAAI,CAAC5C,QAAQ,EAAE0C,KAAK,CAAC;EAChC;EAEA,MAAM;IAAEhB,aAAa;IAAEC;EAAkB,CAAC,GAAGF,OAAO;EACpDgB,OAAO,CAAChB,OAAO,GAAG;IAAEC,aAAa;IAAEC;EAAkB,CAAC;;EAEtD;EACAzB,OAAO,CAACE,GAAG,CAACwB,GAAG,CAACtC,gBAAgB,EAAEmD,OAAO,CAAC;EAE1CC,KAAK,GAAG,MAAM9C,eAAe,CAAC;IAAE6C,OAAO;IAAEiB;EAAO,CAAC,CAAC;EAElD,OAAOnC,CAAC,CAACqB,IAAI,CAAC5C,QAAQ,EAAE0C,KAAK,CAAC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAeY,iBAAiBA,CAACpD,OAAO,EAAEqB,CAAC,EAAEY,OAAO,EAAE;EACpD,MAAMM,OAAO,GAAGxC,eAAe,CAACC,OAAO,CAAC;EACxC,MAAM;IAAEuD,oBAAoB,EAAEC;EAAO,CAAC,GAAGvB,OAAO;;EAEhD;EACA;EACA,MAAM;IAAEwB,KAAK,EAAEN,MAAM;IAAEO;EAAM,CAAC,GAAGjE,mBAAmB,CAACkD,QAAQ,CAAC3C,OAAO,CAACiD,OAAO,CAAC;EAE9E,IAAIS,KAAK,EAAE;IACT,MAAMlB,KAAK,GAAG,MAAM9C,eAAe,CAAC;MAAE6C,OAAO;MAAEiB;IAAO,CAAC,EAAEL,MAAM,EAAEO,KAAK,CAAC;IAEvE,OAAOrC,CAAC,CAACqB,IAAI,CAAC5C,QAAQ,EAAE0C,KAAK,CAAC;EAChC;EAEA,MAAMmB,SAAS,GAAG,MAAM9D,OAAO,CAAC+D,YAAY,CAACT,MAAM,CAACrC,IAAI,EAAE0C,MAAM,CAAC;EACjE,MAAMK,QAAQ,GAAGF,SAAS,CAACG,EAAE,CAAC,CAAC,CAAC;EAEhC,IAAI,CAACD,QAAQ,EAAE;IACb,MAAM7E,IAAI,CAAC+E,QAAQ,CAAC,QAAQF,QAAQ,YAAY,CAAC;EACnD;EAEA,MAAM;IAAEvD,aAAa;IAAE0D;EAAU,CAAC,GAAGzB,OAAO,CAACjB,OAAO;EACpDjB,mBAAmB,CAACL,OAAO,EAAEM,aAAa,EAAEuD,QAAQ,CAAC;;EAErD;EACA,OAAOxC,CAAC,CAACQ,QAAQ,CAACmC,SAAS,CAAC,CAAClC,IAAI,CAAC7C,WAAW,CAAC8C,SAAS,CAAC;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASsB,iBAAiBA,CAACrD,OAAO,EAAEqB,CAAC,EAAE;EACrC,MAAMkB,OAAO,GAAGxC,eAAe,CAACC,OAAO,CAAC;;EAExC;EACA;EACA,MAAM;IAAEyD,KAAK,EAAEhB,MAAM;IAAEiB;EAAM,CAAC,GAAGnE,mBAAmB,CAACoD,QAAQ,CAC3D3C,OAAO,CAACiD,OAAO,EACf;IACEgB,UAAU,EAAE;EACd,CACF,CAAC;EAED,IAAIP,KAAK,EAAE;IACT,MAAMlB,KAAK,GAAGhD,eAAe,CAAC+C,OAAO,EAAEE,MAAM,EAAEiB,KAAK,CAAC;IAErD,OAAOrC,CAAC,CAACqB,IAAI,CAAC5C,QAAQ,EAAE0C,KAAK,CAAC;EAChC;EAEA,MAAM;IAAElC,aAAa;IAAE0D;EAAU,CAAC,GAAGzB,OAAO,CAACjB,OAAO;EACpDjB,mBAAmB,CAACL,OAAO,EAAEM,aAAa,EAAEmC,MAAM,CAAC;;EAEnD;EACA,OAAOpB,CAAC,CAACQ,QAAQ,CAACmC,SAAS,CAAC,CAAClC,IAAI,CAAC7C,WAAW,CAAC8C,SAAS,CAAC;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
@@ -23,4 +23,4 @@ export function searchByUPRN(uprn: string, apiKey: string): Promise<Address[]>;
23
23
  * @param {string} apiKey - the OS api key
24
24
  */
25
25
  export function search(postcodeQuery: string, buildingNameQuery: string, apiKey: string): Promise<Address[]>;
26
- import type { Address } from '~/src/server/plugins/postcode-lookup/types.js';
26
+ import type { Address } from '../../../server/plugins/postcode-lookup/types.js';
@@ -17,7 +17,10 @@ function empty() {
17
17
  * @param {string} endpoint - the OS api endpoint
18
18
  */
19
19
  function logErrorAndReturnEmpty(err, endpoint) {
20
- const msg = `${getErrorMessage(err)} ${(Boom.isBoom(err) && err.data?.payload?.error?.message) ?? ''}`;
20
+ /** @type {{ payload?: { error?: { message?: string } } } | false} */
21
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
22
+ const boomData = Boom.isBoom(err) && err.data;
23
+ const msg = `${getErrorMessage(err)} ${(boomData && boomData.payload?.error?.message) ?? ''}`;
21
24
  logger.error(err, `Exception occured calling OS places ${endpoint} - ${msg}}`);
22
25
  return empty();
23
26
  }
@@ -143,6 +146,6 @@ function titleCase(address) {
143
146
  }
144
147
 
145
148
  /**
146
- * @import { Address, DeliveryPointAddress, DeliveryPointAddressResult } from '~/src/server/plugins/postcode-lookup/types.js'
149
+ * @import { Address, DeliveryPointAddress, DeliveryPointAddressResult } from '../../../server/plugins/postcode-lookup/types.js'
147
150
  */
148
151
  //# sourceMappingURL=service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","names":["getErrorMessage","Boom","createLogger","getJson","logger","empty","logErrorAndReturnEmpty","err","endpoint","msg","isBoom","data","payload","error","message","getAddressData","url","getJsonByType","response","results","Array","isArray","map","result","formatAddress","DPA","searchByQuery","query","apiKey","encodeURIComponent","searchByPostcode","postcode","replaceAll","searchByUPRN","uprn","search","postcodeQuery","buildingNameQuery","addresses","filter","item","address","includes","toUpperCase","dpa","addressLine1","formatAddressLine1","addressLine2","formatAddressLine2","town","titleCase","POST_TOWN","POSTCODE","lines","formatted","i","join","UPRN","ADDRESS","county","ORGANISATION_NAME","SUB_BUILDING_NAME","BUILDING_NAME","BUILDING_NUMBER","THOROUGHFARE_NAME","DEPENDENT_LOCALITY","split","charAt","slice","toLowerCase"],"sources":["../../../../src/server/plugins/postcode-lookup/service.js"],"sourcesContent":["import { getErrorMessage } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\n\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport { getJson } from '~/src/server/services/httpService.js'\n\nconst logger = createLogger()\n\n/**\n * Returns an empty result set\n */\nfunction empty() {\n return []\n}\n\n/**\n * Logs OS places errors\n * @param {unknown} err - the error\n * @param {string} endpoint - the OS api endpoint\n */\nfunction logErrorAndReturnEmpty(err, endpoint) {\n const msg = `${getErrorMessage(err)} ${(Boom.isBoom(err) && err.data?.payload?.error?.message) ?? ''}`\n\n logger.error(err, `Exception occured calling OS places ${endpoint} - ${msg}}`)\n\n return empty()\n}\n\n/**\n * Fetch data from OS API\n * @param {string} url - the url to get address json data from\n * @param {string} endpoint - the url endpoint description for logging\n */\nasync function getAddressData(url, endpoint) {\n const getJsonByType =\n /** @type {typeof getJson<DeliveryPointAddressResult>} */ (getJson)\n\n try {\n const response = await getJsonByType(url)\n\n if (response.error) {\n return logErrorAndReturnEmpty(response.error, endpoint)\n }\n\n const results = response.payload.results\n\n if (!Array.isArray(results)) {\n return empty()\n }\n\n return results.map((result) => formatAddress(result.DPA))\n } catch (err) {\n return logErrorAndReturnEmpty(err, endpoint)\n }\n}\n\n/**\n * OS places search\n * @param {string} query - the search term\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByQuery(query, apiKey) {\n const endpoint = 'find'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?query=${encodeURIComponent(query)}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS postcode search\n * @param {string} postcode - the postcode\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByPostcode(postcode, apiKey) {\n const endpoint = 'postcode'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?postcode=${encodeURIComponent(postcode.replaceAll(/\\s/g, ''))}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS UPRN search\n * @param {string} uprn - the unique property reference number\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByUPRN(uprn, apiKey) {\n const endpoint = 'uprn'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?uprn=${uprn}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS postcode and building name search\n * @param {string} postcodeQuery - the postcode query\n * @param {string} buildingNameQuery - the building name query\n * @param {string} apiKey - the OS api key\n */\nexport async function search(postcodeQuery, buildingNameQuery, apiKey) {\n let addresses = await searchByPostcode(postcodeQuery, apiKey)\n\n if (buildingNameQuery) {\n addresses = addresses.filter((item) =>\n item.address.includes(buildingNameQuery.toUpperCase())\n )\n }\n\n return addresses\n}\n\n/**\n * Converts a delivery point address to an address\n * Taken from http://github.com/dwp/find-an-address-plugin/blob/main/utils/getData.js\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddress(dpa) {\n const addressLine1 = formatAddressLine1(dpa)\n const addressLine2 = formatAddressLine2(dpa)\n const town = titleCase(dpa.POST_TOWN || '')\n const postcode = dpa.POSTCODE || ''\n const lines = [addressLine1, addressLine2, town]\n const formatted = `${lines.filter((i) => !!i).join(', ')}, ${postcode}`\n\n /**\n * @type {Address}\n */\n const address = {\n uprn: dpa.UPRN,\n address: dpa.ADDRESS,\n addressLine1,\n addressLine2,\n town,\n county: '',\n postcode,\n formatted\n }\n\n return address\n}\n\n/**\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddressLine1(dpa) {\n return titleCase(\n dpa.ORGANISATION_NAME ||\n dpa.SUB_BUILDING_NAME ||\n dpa.BUILDING_NAME ||\n dpa.BUILDING_NUMBER\n ? [\n dpa.ORGANISATION_NAME || '',\n dpa.SUB_BUILDING_NAME || '',\n dpa.BUILDING_NAME || '',\n dpa.BUILDING_NUMBER || ''\n ]\n .filter((item) => !!item)\n .join(' ')\n : ''\n )\n}\n\n/**\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddressLine2(dpa) {\n return titleCase(\n dpa.THOROUGHFARE_NAME || dpa.DEPENDENT_LOCALITY\n ? [dpa.THOROUGHFARE_NAME || '', dpa.DEPENDENT_LOCALITY || '']\n .filter((item) => !!item)\n .join(', ')\n : ''\n )\n}\n\n/**\n * Title case address\n * @param {string} address\n */\nfunction titleCase(address) {\n return address\n .split(' ')\n .map((item) => item.charAt(0).toUpperCase() + item.slice(1).toLowerCase())\n .join(' ')\n}\n\n/**\n * @import { Address, DeliveryPointAddress, DeliveryPointAddressResult } from '~/src/server/plugins/postcode-lookup/types.js'\n */\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,oBAAoB;AACpD,OAAOC,IAAI,MAAM,YAAY;AAE7B,SAASC,YAAY;AACrB,SAASC,OAAO;AAEhB,MAAMC,MAAM,GAAGF,YAAY,CAAC,CAAC;;AAE7B;AACA;AACA;AACA,SAASG,KAAKA,CAAA,EAAG;EACf,OAAO,EAAE;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASC,sBAAsBA,CAACC,GAAG,EAAEC,QAAQ,EAAE;EAC7C,MAAMC,GAAG,GAAG,GAAGT,eAAe,CAACO,GAAG,CAAC,IAAI,CAACN,IAAI,CAACS,MAAM,CAACH,GAAG,CAAC,IAAIA,GAAG,CAACI,IAAI,EAAEC,OAAO,EAAEC,KAAK,EAAEC,OAAO,KAAK,EAAE,EAAE;EAEtGV,MAAM,CAACS,KAAK,CAACN,GAAG,EAAE,uCAAuCC,QAAQ,MAAMC,GAAG,GAAG,CAAC;EAE9E,OAAOJ,KAAK,CAAC,CAAC;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAeU,cAAcA,CAACC,GAAG,EAAER,QAAQ,EAAE;EAC3C,MAAMS,aAAa,GACjB,yDAA2Dd,OAAQ;EAErE,IAAI;IACF,MAAMe,QAAQ,GAAG,MAAMD,aAAa,CAACD,GAAG,CAAC;IAEzC,IAAIE,QAAQ,CAACL,KAAK,EAAE;MAClB,OAAOP,sBAAsB,CAACY,QAAQ,CAACL,KAAK,EAAEL,QAAQ,CAAC;IACzD;IAEA,MAAMW,OAAO,GAAGD,QAAQ,CAACN,OAAO,CAACO,OAAO;IAExC,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,OAAO,CAAC,EAAE;MAC3B,OAAOd,KAAK,CAAC,CAAC;IAChB;IAEA,OAAOc,OAAO,CAACG,GAAG,CAAEC,MAAM,IAAKC,aAAa,CAACD,MAAM,CAACE,GAAG,CAAC,CAAC;EAC3D,CAAC,CAAC,OAAOlB,GAAG,EAAE;IACZ,OAAOD,sBAAsB,CAACC,GAAG,EAAEC,QAAQ,CAAC;EAC9C;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAekB,aAAaA,CAACC,KAAK,EAAEC,MAAM,EAAE;EACjD,MAAMpB,QAAQ,GAAG,MAAM;EACvB,MAAMQ,GAAG,GAAG,sCAAsCR,QAAQ,UAAUqB,kBAAkB,CAACF,KAAK,CAAC,QAAQC,MAAM,EAAE;EAE7G,OAAOb,cAAc,CAACC,GAAG,EAAER,QAAQ,CAAC;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAesB,gBAAgBA,CAACC,QAAQ,EAAEH,MAAM,EAAE;EACvD,MAAMpB,QAAQ,GAAG,UAAU;EAC3B,MAAMQ,GAAG,GAAG,sCAAsCR,QAAQ,aAAaqB,kBAAkB,CAACE,QAAQ,CAACC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQJ,MAAM,EAAE;EAEzI,OAAOb,cAAc,CAACC,GAAG,EAAER,QAAQ,CAAC;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeyB,YAAYA,CAACC,IAAI,EAAEN,MAAM,EAAE;EAC/C,MAAMpB,QAAQ,GAAG,MAAM;EACvB,MAAMQ,GAAG,GAAG,sCAAsCR,QAAQ,SAAS0B,IAAI,QAAQN,MAAM,EAAE;EAEvF,OAAOb,cAAc,CAACC,GAAG,EAAER,QAAQ,CAAC;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAe2B,MAAMA,CAACC,aAAa,EAAEC,iBAAiB,EAAET,MAAM,EAAE;EACrE,IAAIU,SAAS,GAAG,MAAMR,gBAAgB,CAACM,aAAa,EAAER,MAAM,CAAC;EAE7D,IAAIS,iBAAiB,EAAE;IACrBC,SAAS,GAAGA,SAAS,CAACC,MAAM,CAAEC,IAAI,IAChCA,IAAI,CAACC,OAAO,CAACC,QAAQ,CAACL,iBAAiB,CAACM,WAAW,CAAC,CAAC,CACvD,CAAC;EACH;EAEA,OAAOL,SAAS;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASd,aAAaA,CAACoB,GAAG,EAAE;EAC1B,MAAMC,YAAY,GAAGC,kBAAkB,CAACF,GAAG,CAAC;EAC5C,MAAMG,YAAY,GAAGC,kBAAkB,CAACJ,GAAG,CAAC;EAC5C,MAAMK,IAAI,GAAGC,SAAS,CAACN,GAAG,CAACO,SAAS,IAAI,EAAE,CAAC;EAC3C,MAAMpB,QAAQ,GAAGa,GAAG,CAACQ,QAAQ,IAAI,EAAE;EACnC,MAAMC,KAAK,GAAG,CAACR,YAAY,EAAEE,YAAY,EAAEE,IAAI,CAAC;EAChD,MAAMK,SAAS,GAAG,GAAGD,KAAK,CAACd,MAAM,CAAEgB,CAAC,IAAK,CAAC,CAACA,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC,KAAKzB,QAAQ,EAAE;;EAEvE;AACF;AACA;EACE,MAAMU,OAAO,GAAG;IACdP,IAAI,EAAEU,GAAG,CAACa,IAAI;IACdhB,OAAO,EAAEG,GAAG,CAACc,OAAO;IACpBb,YAAY;IACZE,YAAY;IACZE,IAAI;IACJU,MAAM,EAAE,EAAE;IACV5B,QAAQ;IACRuB;EACF,CAAC;EAED,OAAOb,OAAO;AAChB;;AAEA;AACA;AACA;AACA,SAASK,kBAAkBA,CAACF,GAAG,EAAE;EAC/B,OAAOM,SAAS,CACdN,GAAG,CAACgB,iBAAiB,IACnBhB,GAAG,CAACiB,iBAAiB,IACrBjB,GAAG,CAACkB,aAAa,IACjBlB,GAAG,CAACmB,eAAe,GACjB,CACEnB,GAAG,CAACgB,iBAAiB,IAAI,EAAE,EAC3BhB,GAAG,CAACiB,iBAAiB,IAAI,EAAE,EAC3BjB,GAAG,CAACkB,aAAa,IAAI,EAAE,EACvBlB,GAAG,CAACmB,eAAe,IAAI,EAAE,CAC1B,CACExB,MAAM,CAAEC,IAAI,IAAK,CAAC,CAACA,IAAI,CAAC,CACxBgB,IAAI,CAAC,GAAG,CAAC,GACZ,EACN,CAAC;AACH;;AAEA;AACA;AACA;AACA,SAASR,kBAAkBA,CAACJ,GAAG,EAAE;EAC/B,OAAOM,SAAS,CACdN,GAAG,CAACoB,iBAAiB,IAAIpB,GAAG,CAACqB,kBAAkB,GAC3C,CAACrB,GAAG,CAACoB,iBAAiB,IAAI,EAAE,EAAEpB,GAAG,CAACqB,kBAAkB,IAAI,EAAE,CAAC,CACxD1B,MAAM,CAAEC,IAAI,IAAK,CAAC,CAACA,IAAI,CAAC,CACxBgB,IAAI,CAAC,IAAI,CAAC,GACb,EACN,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,SAASN,SAASA,CAACT,OAAO,EAAE;EAC1B,OAAOA,OAAO,CACXyB,KAAK,CAAC,GAAG,CAAC,CACV5C,GAAG,CAAEkB,IAAI,IAAKA,IAAI,CAAC2B,MAAM,CAAC,CAAC,CAAC,CAACxB,WAAW,CAAC,CAAC,GAAGH,IAAI,CAAC4B,KAAK,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,CAAC,CACzEb,IAAI,CAAC,GAAG,CAAC;AACd;;AAEA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"service.js","names":["getErrorMessage","Boom","createLogger","getJson","logger","empty","logErrorAndReturnEmpty","err","endpoint","boomData","isBoom","data","msg","payload","error","message","getAddressData","url","getJsonByType","response","results","Array","isArray","map","result","formatAddress","DPA","searchByQuery","query","apiKey","encodeURIComponent","searchByPostcode","postcode","replaceAll","searchByUPRN","uprn","search","postcodeQuery","buildingNameQuery","addresses","filter","item","address","includes","toUpperCase","dpa","addressLine1","formatAddressLine1","addressLine2","formatAddressLine2","town","titleCase","POST_TOWN","POSTCODE","lines","formatted","i","join","UPRN","ADDRESS","county","ORGANISATION_NAME","SUB_BUILDING_NAME","BUILDING_NAME","BUILDING_NUMBER","THOROUGHFARE_NAME","DEPENDENT_LOCALITY","split","charAt","slice","toLowerCase"],"sources":["../../../../src/server/plugins/postcode-lookup/service.js"],"sourcesContent":["import { getErrorMessage } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\n\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport { getJson } from '~/src/server/services/httpService.js'\n\nconst logger = createLogger()\n\n/**\n * Returns an empty result set\n */\nfunction empty() {\n return []\n}\n\n/**\n * Logs OS places errors\n * @param {unknown} err - the error\n * @param {string} endpoint - the OS api endpoint\n */\nfunction logErrorAndReturnEmpty(err, endpoint) {\n /** @type {{ payload?: { error?: { message?: string } } } | false} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const boomData = Boom.isBoom(err) && err.data\n const msg = `${getErrorMessage(err)} ${(boomData && boomData.payload?.error?.message) ?? ''}`\n\n logger.error(err, `Exception occured calling OS places ${endpoint} - ${msg}}`)\n\n return empty()\n}\n\n/**\n * Fetch data from OS API\n * @param {string} url - the url to get address json data from\n * @param {string} endpoint - the url endpoint description for logging\n */\nasync function getAddressData(url, endpoint) {\n const getJsonByType =\n /** @type {typeof getJson<DeliveryPointAddressResult>} */ (getJson)\n\n try {\n const response = await getJsonByType(url)\n\n if (response.error) {\n return logErrorAndReturnEmpty(response.error, endpoint)\n }\n\n const results = response.payload.results\n\n if (!Array.isArray(results)) {\n return empty()\n }\n\n return results.map((result) => formatAddress(result.DPA))\n } catch (err) {\n return logErrorAndReturnEmpty(err, endpoint)\n }\n}\n\n/**\n * OS places search\n * @param {string} query - the search term\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByQuery(query, apiKey) {\n const endpoint = 'find'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?query=${encodeURIComponent(query)}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS postcode search\n * @param {string} postcode - the postcode\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByPostcode(postcode, apiKey) {\n const endpoint = 'postcode'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?postcode=${encodeURIComponent(postcode.replaceAll(/\\s/g, ''))}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS UPRN search\n * @param {string} uprn - the unique property reference number\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByUPRN(uprn, apiKey) {\n const endpoint = 'uprn'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?uprn=${uprn}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS postcode and building name search\n * @param {string} postcodeQuery - the postcode query\n * @param {string} buildingNameQuery - the building name query\n * @param {string} apiKey - the OS api key\n */\nexport async function search(postcodeQuery, buildingNameQuery, apiKey) {\n let addresses = await searchByPostcode(postcodeQuery, apiKey)\n\n if (buildingNameQuery) {\n addresses = addresses.filter((item) =>\n item.address.includes(buildingNameQuery.toUpperCase())\n )\n }\n\n return addresses\n}\n\n/**\n * Converts a delivery point address to an address\n * Taken from http://github.com/dwp/find-an-address-plugin/blob/main/utils/getData.js\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddress(dpa) {\n const addressLine1 = formatAddressLine1(dpa)\n const addressLine2 = formatAddressLine2(dpa)\n const town = titleCase(dpa.POST_TOWN || '')\n const postcode = dpa.POSTCODE || ''\n const lines = [addressLine1, addressLine2, town]\n const formatted = `${lines.filter((i) => !!i).join(', ')}, ${postcode}`\n\n /**\n * @type {Address}\n */\n const address = {\n uprn: dpa.UPRN,\n address: dpa.ADDRESS,\n addressLine1,\n addressLine2,\n town,\n county: '',\n postcode,\n formatted\n }\n\n return address\n}\n\n/**\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddressLine1(dpa) {\n return titleCase(\n dpa.ORGANISATION_NAME ||\n dpa.SUB_BUILDING_NAME ||\n dpa.BUILDING_NAME ||\n dpa.BUILDING_NUMBER\n ? [\n dpa.ORGANISATION_NAME || '',\n dpa.SUB_BUILDING_NAME || '',\n dpa.BUILDING_NAME || '',\n dpa.BUILDING_NUMBER || ''\n ]\n .filter((item) => !!item)\n .join(' ')\n : ''\n )\n}\n\n/**\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddressLine2(dpa) {\n return titleCase(\n dpa.THOROUGHFARE_NAME || dpa.DEPENDENT_LOCALITY\n ? [dpa.THOROUGHFARE_NAME || '', dpa.DEPENDENT_LOCALITY || '']\n .filter((item) => !!item)\n .join(', ')\n : ''\n )\n}\n\n/**\n * Title case address\n * @param {string} address\n */\nfunction titleCase(address) {\n return address\n .split(' ')\n .map((item) => item.charAt(0).toUpperCase() + item.slice(1).toLowerCase())\n .join(' ')\n}\n\n/**\n * @import { Address, DeliveryPointAddress, DeliveryPointAddressResult } from '~/src/server/plugins/postcode-lookup/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -139,6 +139,6 @@
139
139
 
140
140
  /**
141
141
  * @import { Request } from '@hapi/hapi'
142
- * @import { FormPayload } from '~/src/server/plugins/engine/types.js'
142
+ * @import { FormPayload } from '../../../server/plugins/engine/types.js'
143
143
  */
144
144
  //# sourceMappingURL=types.js.map
@@ -1,2 +1,2 @@
1
- export { default as publicRoutes } from '~/src/server/routes/public.js';
2
- export { default as dummyApiRoutes } from '~/src/server/routes/dummy-api.js';
1
+ export { default as publicRoutes } from '../../server/routes/public.js';
2
+ export { default as dummyApiRoutes } from '../../server/routes/dummy-api.js';
@@ -1,5 +1,5 @@
1
1
  import { type ReqRefDefaults, type Request, type ResponseToolkit } from '@hapi/hapi';
2
- import { type FormPayload } from '~/src/server/plugins/engine/types.js';
2
+ import { type FormPayload } from '../../server/plugins/engine/types.js';
3
3
  export interface FormQuery extends Partial<Record<string, string>> {
4
4
  /**
5
5
  * Allow preview URL direct access without relevant page checks
@@ -1,6 +1,6 @@
1
1
  import Joi from 'joi';
2
- import { type FormPayloadParams } from '~/src/server/plugins/engine/types.js';
3
- import { FormAction, FormStatus } from '~/src/server/routes/types.js';
2
+ import { type FormPayloadParams } from '../../server/plugins/engine/types.js';
3
+ import { FormAction, FormStatus } from '../../server/routes/types.js';
4
4
  export declare const stateSchema: Joi.StringSchema<FormStatus>;
5
5
  export declare const actionSchema: Joi.StringSchema<FormAction>;
6
6
  export declare const pathSchema: Joi.StringSchema<string>;
@@ -1,5 +1,5 @@
1
1
  import { type Server } from '@hapi/hapi';
2
- import { type AnyFormRequest, type AnyRequest, type FormConfirmationState, type FormPayload, type FormState, type FormSubmissionError, type FormSubmissionState } from '~/src/server/plugins/engine/types.js';
2
+ import { type AnyFormRequest, type CacheRequest, type FormConfirmationState, type FormPayload, type FormState, type FormSubmissionError, type FormSubmissionState } from '../../server/plugins/engine/types.js';
3
3
  export declare enum ADDITIONAL_IDENTIFIER {
4
4
  Confirmation = ":confirmation"
5
5
  }
@@ -16,11 +16,11 @@ export declare class CacheService {
16
16
  server: Server;
17
17
  cacheName?: string;
18
18
  });
19
- getState(request: AnyRequest): Promise<FormSubmissionState>;
20
- setState(request: AnyFormRequest, state: FormSubmissionState): Promise<FormSubmissionState>;
21
- getConfirmationState(request: AnyFormRequest): Promise<FormConfirmationState>;
22
- setConfirmationState(request: AnyFormRequest, confirmationState: FormConfirmationState): Promise<void>;
23
- clearState(request: AnyFormRequest): Promise<void>;
19
+ getState(request: CacheRequest): Promise<FormSubmissionState>;
20
+ setState(request: CacheRequest, state: FormSubmissionState): Promise<FormSubmissionState>;
21
+ getConfirmationState(request: CacheRequest): Promise<FormConfirmationState>;
22
+ setConfirmationState(request: CacheRequest, confirmationState: FormConfirmationState): Promise<void>;
23
+ clearState(request: CacheRequest): Promise<void>;
24
24
  getFlash(request: AnyFormRequest): {
25
25
  errors: FormSubmissionError[];
26
26
  } | undefined;
@@ -50,14 +50,14 @@ export declare class CacheService {
50
50
  * ```
51
51
  * @returns The updated state after removal
52
52
  */
53
- resetComponentStates(request: AnyFormRequest, componentNames: string[]): Promise<FormSubmissionState>;
53
+ resetComponentStates(request: CacheRequest, componentNames: string[]): Promise<FormSubmissionState>;
54
54
  /**
55
55
  * The key used to store user session data against.
56
56
  * If there are multiple forms on the same runner instance, for example `form-a` and `form-a-feedback` this will prevent CacheService from clearing data from `form-a` if a user gave feedback before they finished `form-a`
57
57
  * @param request - hapi request object
58
58
  * @param additionalIdentifier - appended to the id
59
59
  */
60
- Key(request: AnyRequest, additionalIdentifier?: ADDITIONAL_IDENTIFIER): {
60
+ Key(request: CacheRequest, additionalIdentifier?: ADDITIONAL_IDENTIFIER): {
61
61
  segment: string;
62
62
  id: string;
63
63
  };
@@ -104,11 +104,8 @@ export class CacheService {
104
104
  if (!request.yar.id) {
105
105
  throw new Error('No session ID found');
106
106
  }
107
-
108
- // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style
109
- const state = request.params.state || '';
110
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
111
- const slug = request.params.slug || '';
107
+ const state = request.params.state ?? '';
108
+ const slug = request.params.slug ?? '';
112
109
  const key = `${request.yar.id}:${state}:${slug}:`;
113
110
  return {
114
111
  segment: partition,
@@ -1 +1 @@
1
- {"version":3,"file":"cacheService.js","names":["Hoek","unset","config","partition","ADDITIONAL_IDENTIFIER","CacheService","cache","logger","constructor","server","cacheName","log","segment","getState","request","key","Key","cached","get","setState","state","ttl","set","getConfirmationState","Confirmation","value","setConfirmationState","confirmationState","clearState","yar","id","drop","getFlash","messages","flash","Array","isArray","length","at","setFlash","message","resetComponentStates","componentNames","componentName","additionalIdentifier","Error","params","slug","merge","update","mergeArrays"],"sources":["../../../src/server/services/cacheService.ts"],"sourcesContent":["import { type Server } from '@hapi/hapi'\nimport * as Hoek from '@hapi/hoek'\nimport unset from 'lodash/unset.js'\n\nimport { config } from '~/src/config/index.js'\nimport { type createServer } from '~/src/server/index.js'\nimport {\n type AnyFormRequest,\n type AnyRequest,\n type FormConfirmationState,\n type FormPayload,\n type FormState,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nconst partition = 'cache'\n\nexport enum ADDITIONAL_IDENTIFIER {\n Confirmation = ':confirmation'\n}\n\nexport class CacheService {\n /**\n * This service is responsible for getting, storing or deleting a user's session data in the cache. This service has been registered by {@link createServer}\n */\n cache\n logger: Server['logger']\n\n constructor({ server, cacheName }: { server: Server; cacheName?: string }) {\n if (!cacheName) {\n server.log(\n 'warn',\n 'You are using the default hapi cache. Please provide a cache name in plugin registration options.'\n )\n }\n\n this.cache = server.cache({ cache: cacheName, segment: 'formSubmission' })\n this.logger = server.logger\n }\n\n async getState(request: AnyRequest): Promise<FormSubmissionState> {\n const key = this.Key(request)\n const cached = await this.cache.get(key)\n\n return cached ?? {}\n }\n\n async setState(request: AnyFormRequest, state: FormSubmissionState) {\n const key = this.Key(request)\n const ttl = config.get('sessionTimeout')\n\n await this.cache.set(key, state, ttl)\n\n return this.getState(request)\n }\n\n async getConfirmationState(\n request: AnyFormRequest\n ): Promise<FormConfirmationState> {\n const key = this.Key(request, ADDITIONAL_IDENTIFIER.Confirmation)\n const value = await this.cache.get(key)\n\n return value ?? {}\n }\n\n async setConfirmationState(\n request: AnyFormRequest,\n confirmationState: FormConfirmationState\n ) {\n const key = this.Key(request, ADDITIONAL_IDENTIFIER.Confirmation)\n const ttl = config.get('confirmationSessionTimeout')\n\n return this.cache.set(key, confirmationState, ttl)\n }\n\n async clearState(request: AnyFormRequest) {\n if (request.yar.id) {\n await this.cache.drop(this.Key(request))\n }\n }\n\n getFlash(\n request: AnyFormRequest\n ): { errors: FormSubmissionError[] } | undefined {\n const key = this.Key(request)\n const messages = request.yar.flash(key.id)\n\n if (Array.isArray(messages) && messages.length) {\n return messages.at(0)\n }\n }\n\n setFlash(\n request: AnyFormRequest,\n message: { errors: FormSubmissionError[] }\n ) {\n const key = this.Key(request)\n\n request.yar.flash(key.id, message)\n }\n\n /**\n * Resets (removes) component states from the form state by their keys.\n * Supports both flat keys and nested paths.\n * @param request - The Hapi request object\n * @param componentNames - Array of state keys to remove. Uses lodash's unset syntax. Can be:\n * - Flat keys: `'componentName'` for top-level state\n * - Nested paths: `\"upload['/my-page']\"` or `'upload./my-page'` for nested state\n * @example\n * ```typescript\n * // Remove a flat component state\n * await cacheService.resetComponentStates(request, ['emailAddress'])\n *\n * // Remove nested upload state for a specific page\n * await cacheService.resetComponentStates(request, [\"upload['/file-upload-page']\"])\n *\n * // Remove multiple states at once\n * await cacheService.resetComponentStates(request, [\n * 'componentName',\n * \"upload['/my-page']\"\n * ])\n * ```\n * @returns The updated state after removal\n */\n async resetComponentStates(\n request: AnyFormRequest,\n componentNames: string[]\n ) {\n const state = await this.getState(request)\n\n for (const componentName of componentNames) {\n unset(state, componentName)\n }\n\n return this.setState(request, state)\n }\n\n /**\n * The key used to store user session data against.\n * If there are multiple forms on the same runner instance, for example `form-a` and `form-a-feedback` this will prevent CacheService from clearing data from `form-a` if a user gave feedback before they finished `form-a`\n * @param request - hapi request object\n * @param additionalIdentifier - appended to the id\n */\n Key(request: AnyRequest, additionalIdentifier?: ADDITIONAL_IDENTIFIER) {\n if (!request.yar.id) {\n throw new Error('No session ID found')\n }\n\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n const state = (request.params.state as string) || ''\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const slug = (request.params.slug as string) || ''\n const key = `${request.yar.id}:${state}:${slug}:`\n\n return {\n segment: partition,\n id: `${key}${additionalIdentifier ?? ''}`\n }\n }\n}\n\n/**\n * State merge helper\n * 1. Merges objects (form fields)\n * 2. Overwrites arrays\n */\nexport function merge<StateType extends FormState | FormPayload>(\n state: StateType,\n update: object\n): StateType {\n return Hoek.merge(state, update, {\n mergeArrays: false\n })\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"cacheService.js","names":["Hoek","unset","config","partition","ADDITIONAL_IDENTIFIER","CacheService","cache","logger","constructor","server","cacheName","log","segment","getState","request","key","Key","cached","get","setState","state","ttl","set","getConfirmationState","Confirmation","value","setConfirmationState","confirmationState","clearState","yar","id","drop","getFlash","messages","flash","Array","isArray","length","at","setFlash","message","resetComponentStates","componentNames","componentName","additionalIdentifier","Error","params","slug","merge","update","mergeArrays"],"sources":["../../../src/server/services/cacheService.ts"],"sourcesContent":["import { type Server } from '@hapi/hapi'\nimport * as Hoek from '@hapi/hoek'\nimport unset from 'lodash/unset.js'\n\nimport { config } from '~/src/config/index.js'\nimport { type createServer } from '~/src/server/index.js'\nimport {\n type AnyFormRequest,\n type CacheRequest,\n type FormConfirmationState,\n type FormPayload,\n type FormState,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nconst partition = 'cache'\n\nexport enum ADDITIONAL_IDENTIFIER {\n Confirmation = ':confirmation'\n}\n\nexport class CacheService {\n /**\n * This service is responsible for getting, storing or deleting a user's session data in the cache. This service has been registered by {@link createServer}\n */\n cache\n logger: Server['logger']\n\n constructor({ server, cacheName }: { server: Server; cacheName?: string }) {\n if (!cacheName) {\n server.log(\n 'warn',\n 'You are using the default hapi cache. Please provide a cache name in plugin registration options.'\n )\n }\n\n this.cache = server.cache({ cache: cacheName, segment: 'formSubmission' })\n this.logger = server.logger\n }\n\n async getState(request: CacheRequest): Promise<FormSubmissionState> {\n const key = this.Key(request)\n const cached = await this.cache.get(key)\n\n return cached ?? {}\n }\n\n async setState(request: CacheRequest, state: FormSubmissionState) {\n const key = this.Key(request)\n const ttl = config.get('sessionTimeout')\n\n await this.cache.set(key, state, ttl)\n\n return this.getState(request)\n }\n\n async getConfirmationState(\n request: CacheRequest\n ): Promise<FormConfirmationState> {\n const key = this.Key(request, ADDITIONAL_IDENTIFIER.Confirmation)\n const value = await this.cache.get(key)\n\n return value ?? {}\n }\n\n async setConfirmationState(\n request: CacheRequest,\n confirmationState: FormConfirmationState\n ) {\n const key = this.Key(request, ADDITIONAL_IDENTIFIER.Confirmation)\n const ttl = config.get('confirmationSessionTimeout')\n\n return this.cache.set(key, confirmationState, ttl)\n }\n\n async clearState(request: CacheRequest) {\n if (request.yar.id) {\n await this.cache.drop(this.Key(request))\n }\n }\n\n getFlash(\n request: AnyFormRequest\n ): { errors: FormSubmissionError[] } | undefined {\n const key = this.Key(request)\n const messages = request.yar.flash(key.id)\n\n if (Array.isArray(messages) && messages.length) {\n return messages.at(0)\n }\n }\n\n setFlash(\n request: AnyFormRequest,\n message: { errors: FormSubmissionError[] }\n ) {\n const key = this.Key(request)\n\n request.yar.flash(key.id, message)\n }\n\n /**\n * Resets (removes) component states from the form state by their keys.\n * Supports both flat keys and nested paths.\n * @param request - The Hapi request object\n * @param componentNames - Array of state keys to remove. Uses lodash's unset syntax. Can be:\n * - Flat keys: `'componentName'` for top-level state\n * - Nested paths: `\"upload['/my-page']\"` or `'upload./my-page'` for nested state\n * @example\n * ```typescript\n * // Remove a flat component state\n * await cacheService.resetComponentStates(request, ['emailAddress'])\n *\n * // Remove nested upload state for a specific page\n * await cacheService.resetComponentStates(request, [\"upload['/file-upload-page']\"])\n *\n * // Remove multiple states at once\n * await cacheService.resetComponentStates(request, [\n * 'componentName',\n * \"upload['/my-page']\"\n * ])\n * ```\n * @returns The updated state after removal\n */\n async resetComponentStates(request: CacheRequest, componentNames: string[]) {\n const state = await this.getState(request)\n\n for (const componentName of componentNames) {\n unset(state, componentName)\n }\n\n return this.setState(request, state)\n }\n\n /**\n * The key used to store user session data against.\n * If there are multiple forms on the same runner instance, for example `form-a` and `form-a-feedback` this will prevent CacheService from clearing data from `form-a` if a user gave feedback before they finished `form-a`\n * @param request - hapi request object\n * @param additionalIdentifier - appended to the id\n */\n Key(request: CacheRequest, additionalIdentifier?: ADDITIONAL_IDENTIFIER) {\n if (!request.yar.id) {\n throw new Error('No session ID found')\n }\n\n const state = request.params.state ?? ''\n const slug = request.params.slug ?? ''\n const key = `${request.yar.id}:${state}:${slug}:`\n\n return {\n segment: partition,\n id: `${key}${additionalIdentifier ?? ''}`\n }\n }\n}\n\n/**\n * State merge helper\n * 1. Merges objects (form fields)\n * 2. Overwrites arrays\n */\nexport function merge<StateType extends FormState | FormPayload>(\n state: StateType,\n update: object\n): StateType {\n return Hoek.merge(state, update, {\n mergeArrays: false\n })\n}\n"],"mappings":"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","ignoreList":[]}
@@ -499,6 +499,6 @@ describe('HTTP service', () => {
499
499
 
500
500
  /**
501
501
  * @import { IncomingMessage } from 'node:http'
502
- * @import { RequestOptions } from '~/src/server/services/httpService.js'
502
+ * @import { RequestOptions } from '../../server/services/httpService.js'
503
503
  */
504
504
  //# sourceMappingURL=httpService.test.js.map
@@ -1 +1 @@
1
- export { CacheService } from '~/src/server/services/cacheService.js';
1
+ export { CacheService } from '../../server/services/cacheService.js';
@@ -1,12 +1,12 @@
1
1
  import { type FormDefinition, type FormMetadata, type SubmitPayload, type SubmitResponsePayload } from '@defra/forms-model';
2
2
  import { type Server } from '@hapi/hapi';
3
- import { type FormModel } from '~/src/server/plugins/engine/models/index.js';
4
- import { type DetailItem } from '~/src/server/plugins/engine/models/types.js';
5
- import { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js';
6
- import { type FormContext, type OnRequestCallback, type PluginOptions, type PreparePageEventRequestOptions } from '~/src/server/plugins/engine/types.js';
7
- import { type PaymentService } from '~/src/server/plugins/payment/service.js';
8
- import { type FormRequestPayload, type FormStatus } from '~/src/server/routes/types.js';
9
- import { type CacheService } from '~/src/server/services/cacheService.js';
3
+ import { type FormModel } from '../server/plugins/engine/models/index.js';
4
+ import { type DetailItem } from '../server/plugins/engine/models/types.js';
5
+ import { type PageController } from '../server/plugins/engine/pageControllers/PageController.js';
6
+ import { type FormContext, type OnRequestCallback, type PluginOptions, type PreparePageEventRequestOptions } from '../server/plugins/engine/types.js';
7
+ import { type PaymentService } from '../server/plugins/payment/service.js';
8
+ import { type FormRequestPayload, type FormStatus } from '../server/routes/types.js';
9
+ import { type CacheService } from '../server/services/cacheService.js';
10
10
  export interface FormsService {
11
11
  getFormMetadata: (slug: string) => Promise<FormMetadata>;
12
12
  getFormMetadataById: (id: string) => Promise<FormMetadata>;
@@ -47,9 +47,9 @@ export class FileFormService {
47
47
  getFormDefinition(id: string): FormDefinition;
48
48
  /**
49
49
  * Returns a FormsService compliant interface
50
- * @returns {import('~/src/server/types.js').FormsService}
50
+ * @returns {import('../../server/types.js').FormsService}
51
51
  */
52
- toFormsService(): import("~/src/server/types.js").FormsService;
52
+ toFormsService(): import("../../server/types.js").FormsService;
53
53
  #private;
54
54
  }
55
55
  import type { FormMetadata } from '@defra/forms-model';
@@ -117,7 +117,7 @@ export class FileFormService {
117
117
 
118
118
  /**
119
119
  * Returns a FormsService compliant interface
120
- * @returns {import('~/src/server/types.js').FormsService}
120
+ * @returns {import('../../server/types.js').FormsService}
121
121
  */
122
122
  toFormsService() {
123
123
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "4.7.2",
3
+ "version": "4.7.3",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "files": [
@@ -35,10 +35,11 @@
35
35
  "./package.json": "./package.json"
36
36
  },
37
37
  "scripts": {
38
- "build": "rm -rf ./.server && npm run build:server && npm run build:client && npm run build:types",
38
+ "build": "rm -rf ./.server ./.src && npm run build:server && npm run build:client && npm run build:types && npm run build:src",
39
39
  "build:client": "NODE_ENV=${NODE_ENV:-production} webpack",
40
40
  "build:server": "babel --delete-dir-on-start --extensions \".js\",\".ts\" --ignore \"**/*.test.ts\" --copy-files --no-copy-ignored --source-maps --out-dir ./.server ./src",
41
- "build:types": "tsc -p tsconfig.build.json",
41
+ "build:src": "node scripts/resolve-tilde-imports.js",
42
+ "build:types": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.alias.json",
42
43
  "dev": "concurrently \"npm run client:watch\" \"npm run server:watch:dev\" --kill-others --names \"client,server\" --prefix-colors \"red.dim,blue.dim\"",
43
44
  "dev:debug": "concurrently \"npm run client:watch\" \"npm run server:watch:debug\" --kill-others --names \"client,server\" --prefix-colors \"red.dim,blue.dim\"",
44
45
  "format": "npm run format:check -- --write",
@@ -50,10 +51,12 @@
50
51
  "docs:clear": "docusaurus clear",
51
52
  "generate-schema-docs": "node scripts/generate-schema-docs.js",
52
53
  "postinstall": "npm run setup:husky",
54
+ "postpack": "mv src .src && mv .src.bak src",
55
+ "prepack": "mv src .src.bak && mv .src src",
53
56
  "lint": "npm run lint:editorconfig && npm run lint:js && npm run lint:types",
54
57
  "lint:editorconfig": "editorconfig-checker",
55
58
  "lint:fix": "npm run lint:js -- --fix",
56
- "lint:js": "eslint --cache --cache-location .cache/eslint --cache-strategy content --color .",
59
+ "lint:js": "node --max-old-space-size=8192 ./node_modules/.bin/eslint --cache --cache-location .cache/eslint --cache-strategy content --color .",
57
60
  "lint:scss": "stylelint --cache --cache-location .cache/stylelint --cache-strategy content --color --ignore-path .gitignore --max-warnings 0 \"**/*.scss\"",
58
61
  "lint:types": "tsc --noEmit",
59
62
  "test": "jest --color --coverage --verbose",
@@ -209,6 +212,7 @@
209
212
  "stylelint": "^16.25.0",
210
213
  "stylelint-config-gds": "^2.0.0",
211
214
  "terser-webpack-plugin": "^5.3.14",
215
+ "tsc-alias": "^1.8.16",
212
216
  "tsx": "^4.20.6",
213
217
  "typescript": "^5.9.3",
214
218
  "typescript-eslint": "^8.56.1",