@defra/forms-engine-plugin 0.0.2 → 0.0.4

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 (330) hide show
  1. package/.public/assets/fonts/bold-affa96571d-v2.woff +0 -0
  2. package/.public/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
  3. package/.public/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
  4. package/.public/assets/fonts/light-f591b13f7d-v2.woff +0 -0
  5. package/.public/assets/images/favicon.ico +0 -0
  6. package/.public/assets/images/favicon.svg +1 -0
  7. package/.public/assets/images/govuk-crest.svg +1 -0
  8. package/.public/assets/images/govuk-icon-180.png +0 -0
  9. package/.public/assets/images/govuk-icon-192.png +0 -0
  10. package/.public/assets/images/govuk-icon-512.png +0 -0
  11. package/.public/assets/images/govuk-icon-mask.svg +1 -0
  12. package/.public/assets/images/govuk-opengraph-image.png +0 -0
  13. package/.public/assets/manifest.json +39 -0
  14. package/.public/assets-manifest.json +24 -0
  15. package/.public/javascripts/application.0fd8c18.min.js +3 -0
  16. package/.public/javascripts/application.0fd8c18.min.js.LICENSE.txt +58 -0
  17. package/.public/javascripts/application.0fd8c18.min.js.map +1 -0
  18. package/.public/javascripts/file-upload.b2f18f5.min.js +2 -0
  19. package/.public/javascripts/file-upload.b2f18f5.min.js.map +1 -0
  20. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js +2 -0
  21. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js.map +1 -0
  22. package/.public/stylesheets/application.e340021.min.css +14 -0
  23. package/.public/stylesheets/application.e340021.min.css.map +1 -0
  24. package/.server/server/plugins/nunjucks/environment.js +3 -3
  25. package/.server/server/plugins/nunjucks/environment.js.map +1 -1
  26. package/package.json +6 -2
  27. package/.browserslistrc +0 -16
  28. package/.editorconfig +0 -9
  29. package/.eslintrc.cjs +0 -266
  30. package/.github/dependabot.yml +0 -85
  31. package/.github/workflows/check-pull-request.yml +0 -209
  32. package/.github/workflows/pr-notifier.yml +0 -98
  33. package/.github/workflows/publish.yml +0 -111
  34. package/.husky/pre-commit +0 -1
  35. package/.lintstagedrc.js +0 -4
  36. package/.nvmrc +0 -1
  37. package/.prettierignore +0 -8
  38. package/.prettierrc.cjs +0 -26
  39. package/Dockerfile +0 -61
  40. package/Procfile +0 -1
  41. package/babel.config.cjs +0 -55
  42. package/compose/aws.env +0 -4
  43. package/compose/start-localstack.sh +0 -26
  44. package/docker-compose.yaml +0 -86
  45. package/globals.d.ts +0 -1
  46. package/jest.config.cjs +0 -54
  47. package/jest.environment.js +0 -4
  48. package/jest.setup.cjs +0 -14
  49. package/postcss.config.js +0 -26
  50. package/sonar-project.properties +0 -17
  51. package/src/client/javascripts/application.js +0 -87
  52. package/src/client/javascripts/file-upload.js +0 -386
  53. package/src/client/stylesheets/_code.scss +0 -33
  54. package/src/client/stylesheets/_govuk-frontend.scss +0 -4
  55. package/src/client/stylesheets/_prose.scss +0 -56
  56. package/src/client/stylesheets/_service-banner.scss +0 -24
  57. package/src/client/stylesheets/_summary-list.scss +0 -28
  58. package/src/client/stylesheets/_tag-env.scss +0 -24
  59. package/src/client/stylesheets/application.scss +0 -14
  60. package/src/common/cookies.js +0 -58
  61. package/src/common/cookies.test.js +0 -23
  62. package/src/common/types.js +0 -5
  63. package/src/config/index.ts +0 -271
  64. package/src/index.ts +0 -31
  65. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  66. package/src/server/common/helpers/logging/logger-options.ts +0 -46
  67. package/src/server/common/helpers/logging/logger.ts +0 -7
  68. package/src/server/common/helpers/logging/request-logger.ts +0 -9
  69. package/src/server/common/helpers/logging/request-tracing.js +0 -10
  70. package/src/server/common/helpers/redis-client.js +0 -70
  71. package/src/server/constants.js +0 -1
  72. package/src/server/forms/README.md +0 -10
  73. package/src/server/forms/components.json +0 -1015
  74. package/src/server/forms/report-a-terrorist.json +0 -270
  75. package/src/server/forms/runner-components-test.json +0 -365
  76. package/src/server/forms/test.json +0 -581
  77. package/src/server/index.test.ts +0 -582
  78. package/src/server/index.ts +0 -140
  79. package/src/server/plugins/blankie.test.ts +0 -73
  80. package/src/server/plugins/blankie.ts +0 -48
  81. package/src/server/plugins/crumb.ts +0 -20
  82. package/src/server/plugins/engine/README.md +0 -87
  83. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -294
  84. package/src/server/plugins/engine/components/AutocompleteField.ts +0 -49
  85. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -379
  86. package/src/server/plugins/engine/components/CheckboxesField.ts +0 -106
  87. package/src/server/plugins/engine/components/ComponentBase.ts +0 -97
  88. package/src/server/plugins/engine/components/ComponentCollection.ts +0 -278
  89. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -822
  90. package/src/server/plugins/engine/components/DatePartsField.ts +0 -264
  91. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  92. package/src/server/plugins/engine/components/Details.ts +0 -30
  93. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -395
  94. package/src/server/plugins/engine/components/EmailAddressField.ts +0 -55
  95. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -778
  96. package/src/server/plugins/engine/components/FileUploadField.ts +0 -262
  97. package/src/server/plugins/engine/components/FormComponent.ts +0 -249
  98. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  99. package/src/server/plugins/engine/components/Html.ts +0 -29
  100. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  101. package/src/server/plugins/engine/components/InsetText.ts +0 -27
  102. package/src/server/plugins/engine/components/List.test.ts +0 -76
  103. package/src/server/plugins/engine/components/List.ts +0 -72
  104. package/src/server/plugins/engine/components/ListFormComponent.ts +0 -140
  105. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -567
  106. package/src/server/plugins/engine/components/MonthYearField.ts +0 -222
  107. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -558
  108. package/src/server/plugins/engine/components/MultilineTextField.ts +0 -138
  109. package/src/server/plugins/engine/components/NumberField.test.ts +0 -701
  110. package/src/server/plugins/engine/components/NumberField.ts +0 -163
  111. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -288
  112. package/src/server/plugins/engine/components/RadiosField.ts +0 -24
  113. package/src/server/plugins/engine/components/SelectField.test.ts +0 -288
  114. package/src/server/plugins/engine/components/SelectField.ts +0 -47
  115. package/src/server/plugins/engine/components/SelectionControlField.ts +0 -43
  116. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -356
  117. package/src/server/plugins/engine/components/TelephoneNumberField.ts +0 -67
  118. package/src/server/plugins/engine/components/TextField.test.ts +0 -489
  119. package/src/server/plugins/engine/components/TextField.ts +0 -96
  120. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -623
  121. package/src/server/plugins/engine/components/UkAddressField.ts +0 -172
  122. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -248
  123. package/src/server/plugins/engine/components/YesNoField.ts +0 -31
  124. package/src/server/plugins/engine/components/constants.ts +0 -1
  125. package/src/server/plugins/engine/components/helpers.ts +0 -330
  126. package/src/server/plugins/engine/components/index.ts +0 -24
  127. package/src/server/plugins/engine/components/types.ts +0 -117
  128. package/src/server/plugins/engine/configureEnginePlugin.ts +0 -47
  129. package/src/server/plugins/engine/helpers.test.ts +0 -791
  130. package/src/server/plugins/engine/helpers.ts +0 -379
  131. package/src/server/plugins/engine/index.ts +0 -7
  132. package/src/server/plugins/engine/models/FormModel.test.ts +0 -42
  133. package/src/server/plugins/engine/models/FormModel.ts +0 -443
  134. package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
  135. package/src/server/plugins/engine/models/Section.ts +0 -0
  136. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -209
  137. package/src/server/plugins/engine/models/SummaryViewModel.ts +0 -220
  138. package/src/server/plugins/engine/models/index.ts +0 -2
  139. package/src/server/plugins/engine/models/types.ts +0 -114
  140. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -143
  141. package/src/server/plugins/engine/outputFormatters/human/v1.ts +0 -73
  142. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  143. package/src/server/plugins/engine/outputFormatters/index.ts +0 -44
  144. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -229
  145. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +0 -140
  146. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -229
  147. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +0 -153
  148. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1108
  149. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +0 -446
  150. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -205
  151. package/src/server/plugins/engine/pageControllers/PageController.ts +0 -176
  152. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1264
  153. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +0 -561
  154. package/src/server/plugins/engine/pageControllers/README.md +0 -28
  155. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -264
  156. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +0 -458
  157. package/src/server/plugins/engine/pageControllers/StartPageController.ts +0 -18
  158. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +0 -50
  159. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +0 -261
  160. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -28
  161. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +0 -19
  162. package/src/server/plugins/engine/pageControllers/helpers.test.ts +0 -198
  163. package/src/server/plugins/engine/pageControllers/helpers.ts +0 -101
  164. package/src/server/plugins/engine/pageControllers/index.ts +0 -10
  165. package/src/server/plugins/engine/pageControllers/validationOptions.ts +0 -89
  166. package/src/server/plugins/engine/plugin.ts +0 -673
  167. package/src/server/plugins/engine/services/formSubmissionService.js +0 -46
  168. package/src/server/plugins/engine/services/formsService.js +0 -46
  169. package/src/server/plugins/engine/services/formsService.test.js +0 -90
  170. package/src/server/plugins/engine/services/index.js +0 -3
  171. package/src/server/plugins/engine/services/notifyService.test.ts +0 -132
  172. package/src/server/plugins/engine/services/notifyService.ts +0 -64
  173. package/src/server/plugins/engine/services/uploadService.js +0 -60
  174. package/src/server/plugins/engine/types.ts +0 -315
  175. package/src/server/plugins/engine/views/components/autocompletefield.html +0 -5
  176. package/src/server/plugins/engine/views/components/checkboxesfield.html +0 -5
  177. package/src/server/plugins/engine/views/components/datepartsfield.html +0 -5
  178. package/src/server/plugins/engine/views/components/details.html +0 -6
  179. package/src/server/plugins/engine/views/components/emailaddressfield.html +0 -5
  180. package/src/server/plugins/engine/views/components/fileuploadfield-key.html +0 -8
  181. package/src/server/plugins/engine/views/components/fileuploadfield-value.html +0 -3
  182. package/src/server/plugins/engine/views/components/fileuploadfield.html +0 -24
  183. package/src/server/plugins/engine/views/components/html.html +0 -3
  184. package/src/server/plugins/engine/views/components/insettext.html +0 -7
  185. package/src/server/plugins/engine/views/components/list.html +0 -36
  186. package/src/server/plugins/engine/views/components/monthyearfield.html +0 -5
  187. package/src/server/plugins/engine/views/components/multilinetextfield.html +0 -10
  188. package/src/server/plugins/engine/views/components/numberfield.html +0 -5
  189. package/src/server/plugins/engine/views/components/radiosfield.html +0 -5
  190. package/src/server/plugins/engine/views/components/selectfield.html +0 -5
  191. package/src/server/plugins/engine/views/components/telephonenumberfield.html +0 -5
  192. package/src/server/plugins/engine/views/components/textfield.html +0 -5
  193. package/src/server/plugins/engine/views/components/ukaddressfield.html +0 -25
  194. package/src/server/plugins/engine/views/components/yesnofield.html +0 -5
  195. package/src/server/plugins/engine/views/file-upload.html +0 -45
  196. package/src/server/plugins/engine/views/index.html +0 -39
  197. package/src/server/plugins/engine/views/item-delete.html +0 -56
  198. package/src/server/plugins/engine/views/partials/components.html +0 -6
  199. package/src/server/plugins/engine/views/partials/conditional-components.html +0 -3
  200. package/src/server/plugins/engine/views/partials/debug.html +0 -44
  201. package/src/server/plugins/engine/views/partials/form.html +0 -15
  202. package/src/server/plugins/engine/views/partials/heading.html +0 -16
  203. package/src/server/plugins/engine/views/partials/preview-banner.html +0 -32
  204. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  205. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +0 -10
  206. package/src/server/plugins/engine/views/repeat-list-summary.html +0 -53
  207. package/src/server/plugins/errorPages.ts +0 -58
  208. package/src/server/plugins/nunjucks/context.js +0 -88
  209. package/src/server/plugins/nunjucks/context.test.js +0 -142
  210. package/src/server/plugins/nunjucks/enviroment.test.js +0 -201
  211. package/src/server/plugins/nunjucks/environment.js +0 -116
  212. package/src/server/plugins/nunjucks/filters/answer.js +0 -27
  213. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -89
  214. package/src/server/plugins/nunjucks/filters/evaluate.js +0 -21
  215. package/src/server/plugins/nunjucks/filters/field.js +0 -28
  216. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  217. package/src/server/plugins/nunjucks/filters/highlight.js +0 -11
  218. package/src/server/plugins/nunjucks/filters/href.js +0 -30
  219. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  220. package/src/server/plugins/nunjucks/filters/index.js +0 -8
  221. package/src/server/plugins/nunjucks/filters/inspect.js +0 -15
  222. package/src/server/plugins/nunjucks/filters/page.js +0 -24
  223. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  224. package/src/server/plugins/nunjucks/index.js +0 -3
  225. package/src/server/plugins/nunjucks/plugin.js +0 -40
  226. package/src/server/plugins/nunjucks/render.js +0 -42
  227. package/src/server/plugins/nunjucks/types.js +0 -40
  228. package/src/server/plugins/pulse.ts +0 -11
  229. package/src/server/plugins/router.ts +0 -201
  230. package/src/server/plugins/session.ts +0 -28
  231. package/src/server/routes/health.js +0 -13
  232. package/src/server/routes/health.test.js +0 -35
  233. package/src/server/routes/index.test.ts +0 -125
  234. package/src/server/routes/index.ts +0 -2
  235. package/src/server/routes/public.ts +0 -47
  236. package/src/server/routes/types.ts +0 -48
  237. package/src/server/schemas/index.ts +0 -34
  238. package/src/server/secure-context.js +0 -43
  239. package/src/server/services/cacheService.test.ts +0 -276
  240. package/src/server/services/cacheService.ts +0 -131
  241. package/src/server/services/httpService.test.js +0 -491
  242. package/src/server/services/httpService.ts +0 -50
  243. package/src/server/services/index.ts +0 -1
  244. package/src/server/types.ts +0 -54
  245. package/src/server/utils/notify.test.ts +0 -37
  246. package/src/server/utils/notify.ts +0 -50
  247. package/src/server/utils/secure-context/get-trust-store-certs.js +0 -11
  248. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  249. package/src/server/utils/utils.js +0 -24
  250. package/src/server/utils/utils.test.js +0 -54
  251. package/src/server/views/404.html +0 -16
  252. package/src/server/views/500.html +0 -19
  253. package/src/server/views/components/debug/macro.njk +0 -3
  254. package/src/server/views/components/debug/template.njk +0 -13
  255. package/src/server/views/components/service-banner/macro.njk +0 -3
  256. package/src/server/views/components/service-banner/template.njk +0 -20
  257. package/src/server/views/components/service-banner/template.test.js +0 -43
  258. package/src/server/views/components/tag-env/macro.njk +0 -3
  259. package/src/server/views/components/tag-env/template.njk +0 -30
  260. package/src/server/views/components/tag-env/template.test.js +0 -66
  261. package/src/server/views/confirmation.html +0 -19
  262. package/src/server/views/help/accessibility-statement.html +0 -58
  263. package/src/server/views/help/cookie-preferences.html +0 -57
  264. package/src/server/views/help/cookies.html +0 -71
  265. package/src/server/views/help/get-support.html +0 -37
  266. package/src/server/views/help/privacy-notice.html +0 -68
  267. package/src/server/views/help/terms-and-conditions.html +0 -83
  268. package/src/server/views/layout.html +0 -199
  269. package/src/server/views/summary.html +0 -50
  270. package/src/typings/hapi/index.d.ts +0 -95
  271. package/src/typings/hapi-tracing/index.d.ts +0 -6
  272. package/src/typings/index.d.ts +0 -3
  273. package/src/typings/joi/index.d.ts +0 -22
  274. package/stylelint.config.js +0 -10
  275. package/test/client/javascripts/file-upload.test.js +0 -1197
  276. package/test/condition/checkboxes.test.js +0 -112
  277. package/test/condition/radios.test.js +0 -112
  278. package/test/condition/text.test.js +0 -103
  279. package/test/fixtures/assets-manifest.json +0 -4
  280. package/test/fixtures/form.js +0 -86
  281. package/test/fixtures/index.js +0 -2
  282. package/test/fixtures/list.js +0 -92
  283. package/test/form/cookies.test.js +0 -338
  284. package/test/form/csrf.test.js +0 -87
  285. package/test/form/definitions/basic.js +0 -101
  286. package/test/form/definitions/blank.js +0 -10
  287. package/test/form/definitions/checkboxes.json +0 -88
  288. package/test/form/definitions/components.json +0 -452
  289. package/test/form/definitions/conditional-reveal.js +0 -140
  290. package/test/form/definitions/conditions-basic.js +0 -187
  291. package/test/form/definitions/conditions-complex.js +0 -338
  292. package/test/form/definitions/conditions-dates.js +0 -78
  293. package/test/form/definitions/conditions-escaping.js +0 -143
  294. package/test/form/definitions/demo-cph-number.js +0 -3099
  295. package/test/form/definitions/feedback.json +0 -45
  296. package/test/form/definitions/fields-optional.js +0 -402
  297. package/test/form/definitions/fields-required.js +0 -402
  298. package/test/form/definitions/file-upload-basic.js +0 -44
  299. package/test/form/definitions/file-upload.js +0 -66
  300. package/test/form/definitions/minimal.js +0 -39
  301. package/test/form/definitions/phase-alpha.json +0 -33
  302. package/test/form/definitions/phase-default.json +0 -26
  303. package/test/form/definitions/radios.json +0 -88
  304. package/test/form/definitions/repeat-mixed.js +0 -54
  305. package/test/form/definitions/repeat.js +0 -70
  306. package/test/form/definitions/status.json +0 -126
  307. package/test/form/definitions/templates.js +0 -183
  308. package/test/form/definitions/test.json +0 -581
  309. package/test/form/definitions/text.json +0 -75
  310. package/test/form/definitions/titles.json +0 -170
  311. package/test/form/definitions.test.js +0 -47
  312. package/test/form/exit-page.test.js +0 -210
  313. package/test/form/feedback.test.js +0 -68
  314. package/test/form/fields-optional.test.js +0 -237
  315. package/test/form/fields-required.test.js +0 -294
  316. package/test/form/file-upload.test.js +0 -313
  317. package/test/form/govuk-notify.test.js +0 -449
  318. package/test/form/journey-basic.test.js +0 -444
  319. package/test/form/persist-files.test.js +0 -227
  320. package/test/form/phase-banner.test.js +0 -71
  321. package/test/form/repeat.test.js +0 -628
  322. package/test/form/summary-submission-email.test.js +0 -95
  323. package/test/form/template.test.js +0 -288
  324. package/test/form/titles.test.js +0 -204
  325. package/test/helpers/component-helpers.js +0 -74
  326. package/test/utils/get-cookie.js +0 -42
  327. package/test/utils/get-form-definitions.js +0 -18
  328. package/tmp.pdf +0 -1
  329. package/tsconfig.json +0 -28
  330. package/webpack.config.js +0 -208
@@ -1,276 +0,0 @@
1
- import { type Request, type Server } from '@hapi/hapi'
2
-
3
- import { config } from '~/src/config/index.js'
4
- import { type FormRequest } from '~/src/server/routes/types.js'
5
- import { CacheService, merge } from '~/src/server/services/cacheService.js'
6
-
7
- describe('CacheService', () => {
8
- let mockServer: Partial<Server>
9
- let mockCache: {
10
- get: jest.Mock
11
- set: jest.Mock
12
- drop: jest.Mock
13
- }
14
- let cacheService: CacheService
15
-
16
- beforeEach(() => {
17
- mockCache = {
18
- get: jest.fn(),
19
- set: jest.fn(),
20
- drop: jest.fn()
21
- }
22
-
23
- mockServer = {
24
- cache: (() => ({
25
- ...mockCache,
26
- provision: jest.fn()
27
- })) as unknown as Server['cache'],
28
- logger: {
29
- info: jest.fn()
30
- } as unknown as Server['logger']
31
- }
32
-
33
- cacheService = new CacheService(mockServer as Server)
34
- })
35
-
36
- describe('getState', () => {
37
- describe('when cache exists', () => {
38
- it('should return cached state', async () => {
39
- const mockRequest = {
40
- yar: { id: 'some-session' },
41
- params: { state: 'form1', slug: 'page1' }
42
- } as unknown as FormRequest
43
- const mockState = { someData: 'test' }
44
-
45
- mockCache.get.mockResolvedValue(mockState)
46
-
47
- const result = await cacheService.getState(mockRequest)
48
-
49
- expect(result).toEqual(mockState)
50
- expect(mockCache.get).toHaveBeenCalledWith({
51
- segment: 'cache',
52
- id: 'some-session:form1:page1:'
53
- })
54
- })
55
- })
56
-
57
- describe('when cache does not exist', () => {
58
- it('should return empty object', async () => {
59
- const mockRequest = {
60
- yar: { id: 'some-session' },
61
- params: { state: 'form1', slug: 'page1' }
62
- } as unknown as FormRequest
63
-
64
- mockCache.get.mockResolvedValue(null)
65
-
66
- const result = await cacheService.getState(mockRequest)
67
-
68
- expect(result).toEqual({})
69
- })
70
- })
71
- })
72
-
73
- describe('setState', () => {
74
- it('should set state with correct TTL', async () => {
75
- const mockRequest = {
76
- yar: { id: 'some-session' },
77
- params: { state: 'form1', slug: 'page1' }
78
- } as unknown as FormRequest
79
- const mockState = { someData: 'test' }
80
- const mockTTL = 3600000
81
-
82
- jest.spyOn(config, 'get').mockReturnValue(mockTTL)
83
-
84
- await cacheService.setState(mockRequest, mockState)
85
-
86
- expect(mockCache.set).toHaveBeenCalledWith(
87
- {
88
- segment: 'cache',
89
- id: 'some-session:form1:page1:'
90
- },
91
- mockState,
92
- mockTTL
93
- )
94
- })
95
- })
96
-
97
- describe('Key', () => {
98
- describe('when session ID is missing', () => {
99
- it('should throw error', () => {
100
- const mockRequest = {
101
- yar: { id: null },
102
- params: {}
103
- } as unknown as Request
104
-
105
- expect(() => cacheService.Key(mockRequest)).toThrow(
106
- 'No session ID found'
107
- )
108
- })
109
- })
110
- })
111
-
112
- describe('merge', () => {
113
- describe('when merging objects', () => {
114
- it('should merge them correctly', () => {
115
- const state = { field1: 'some-data-1', field2: 'some-data-2' }
116
- const update = { field2: 'updated', field3: 'some-data-3' }
117
-
118
- const result = merge(state, update)
119
-
120
- expect(result).toEqual({
121
- field1: 'some-data-1',
122
- field2: 'updated',
123
- field3: 'some-data-3'
124
- })
125
- })
126
- })
127
-
128
- describe('when merging arrays', () => {
129
- it('should overwrite instead of merge', () => {
130
- const state = { items: ['some-item-1', 'some-item-2'] }
131
- const update = { items: ['some-item-3'] }
132
-
133
- const result = merge(state, update)
134
-
135
- expect(result.items).toEqual(['some-item-3'])
136
- })
137
- })
138
- })
139
-
140
- describe('getFlash', () => {
141
- describe('when messages exist', () => {
142
- it('should return first message', () => {
143
- const mockRequest = {
144
- yar: {
145
- id: 'some-session',
146
- flash: jest.fn().mockReturnValue([{ errors: [{ type: 'error' }] }])
147
- },
148
- params: { state: 'form1', slug: 'page1' }
149
- } as unknown as FormRequest
150
-
151
- const result = cacheService.getFlash(mockRequest)
152
-
153
- expect(result).toEqual({ errors: [{ type: 'error' }] })
154
- })
155
- })
156
-
157
- describe('when no messages exist', () => {
158
- it('should return undefined', () => {
159
- const mockRequest = {
160
- yar: {
161
- id: 'some-session',
162
- flash: jest.fn().mockReturnValue([])
163
- },
164
- params: { state: 'form1', slug: 'page1' }
165
- } as unknown as FormRequest
166
-
167
- const result = cacheService.getFlash(mockRequest)
168
-
169
- expect(result).toBeUndefined()
170
- })
171
- })
172
- })
173
-
174
- describe('setFlash', () => {
175
- it('should set flash message', () => {
176
- const mockRequest = {
177
- yar: {
178
- id: 'some-session',
179
- flash: jest.fn()
180
- },
181
- params: { state: 'form1', slug: 'page1' }
182
- } as unknown as FormRequest
183
- const message = {
184
- errors: [
185
- {
186
- type: 'error',
187
- href: '#error',
188
- name: 'error',
189
- text: 'Error message',
190
- path: ['path-abc']
191
- }
192
- ]
193
- }
194
-
195
- cacheService.setFlash(mockRequest, message)
196
-
197
- expect(mockRequest.yar.flash).toHaveBeenCalledWith(
198
- 'some-session:form1:page1:',
199
- message
200
- )
201
- })
202
- })
203
-
204
- describe('clearState', () => {
205
- it('should clear state from cache', async () => {
206
- const mockRequest = {
207
- yar: { id: 'some-session' },
208
- params: { state: 'form1', slug: 'page1' }
209
- } as unknown as FormRequest
210
-
211
- await cacheService.clearState(mockRequest)
212
-
213
- expect(mockCache.drop).toHaveBeenCalledWith({
214
- segment: 'cache',
215
- id: 'some-session:form1:page1:'
216
- })
217
- })
218
- })
219
-
220
- describe('getConfirmationState', () => {
221
- it('should return confirmation state from cache', async () => {
222
- const mockRequest = {
223
- yar: { id: 'some-session' },
224
- params: { state: 'form1', slug: 'page1' }
225
- } as unknown as FormRequest
226
- const mockState = { confirmed: true as const }
227
-
228
- mockCache.get.mockResolvedValue(mockState)
229
-
230
- const result = await cacheService.getConfirmationState(mockRequest)
231
-
232
- expect(result).toEqual(mockState)
233
- expect(mockCache.get).toHaveBeenCalledWith({
234
- segment: 'cache',
235
- id: 'some-session:form1:page1::confirmation'
236
- })
237
- })
238
-
239
- it('should return empty object when no confirmation state exists', async () => {
240
- const mockRequest = {
241
- yar: { id: 'some-session' },
242
- params: { state: 'form1', slug: 'page1' }
243
- } as unknown as FormRequest
244
-
245
- mockCache.get.mockResolvedValue(null)
246
-
247
- const result = await cacheService.getConfirmationState(mockRequest)
248
-
249
- expect(result).toEqual({})
250
- })
251
- })
252
-
253
- describe('setConfirmationState', () => {
254
- it('should set confirmation state in cache', async () => {
255
- const mockRequest = {
256
- yar: { id: 'some-session' },
257
- params: { state: 'form1', slug: 'page1' }
258
- } as unknown as FormRequest
259
- const mockState = { confirmed: true as const }
260
- const mockTTL = 3600000
261
-
262
- jest.spyOn(config, 'get').mockReturnValue(mockTTL)
263
-
264
- await cacheService.setConfirmationState(mockRequest, mockState)
265
-
266
- expect(mockCache.set).toHaveBeenCalledWith(
267
- {
268
- segment: 'cache',
269
- id: 'some-session:form1:page1::confirmation'
270
- },
271
- mockState,
272
- mockTTL
273
- )
274
- })
275
- })
276
- })
@@ -1,131 +0,0 @@
1
- import { type Request, type Server } from '@hapi/hapi'
2
- import * as Hoek from '@hapi/hoek'
3
-
4
- import { config } from '~/src/config/index.js'
5
- import { type createServer } from '~/src/server/index.js'
6
- import {
7
- type FormPayload,
8
- type FormState,
9
- type FormSubmissionError,
10
- type FormSubmissionState
11
- } from '~/src/server/plugins/engine/types.js'
12
- import {
13
- type FormRequest,
14
- type FormRequestPayload
15
- } from '~/src/server/routes/types.js'
16
-
17
- const partition = 'cache'
18
-
19
- enum ADDITIONAL_IDENTIFIER {
20
- Confirmation = ':confirmation'
21
- }
22
-
23
- export class CacheService {
24
- /**
25
- * 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}
26
- */
27
- cache
28
- logger: Server['logger']
29
-
30
- constructor(server: Server) {
31
- this.cache = server.cache({ cache: 'session', segment: 'formSubmission' })
32
- this.logger = server.logger
33
- }
34
-
35
- async getState(
36
- request: Request | FormRequest | FormRequestPayload
37
- ): Promise<FormSubmissionState> {
38
- const cached = await this.cache.get(this.Key(request))
39
-
40
- return cached || {}
41
- }
42
-
43
- async setState(
44
- request: FormRequest | FormRequestPayload,
45
- state: FormSubmissionState
46
- ) {
47
- const key = this.Key(request)
48
- const ttl = config.get('sessionTimeout')
49
-
50
- await this.cache.set(key, state, ttl)
51
- return this.getState(request)
52
- }
53
-
54
- async getConfirmationState(
55
- request: FormRequest | FormRequestPayload
56
- ): Promise<{ confirmed?: true }> {
57
- const key = this.Key(request, ADDITIONAL_IDENTIFIER.Confirmation)
58
- const value = await this.cache.get(key)
59
-
60
- return value || {}
61
- }
62
-
63
- async setConfirmationState(
64
- request: FormRequest | FormRequestPayload,
65
- confirmationState: { confirmed?: true }
66
- ) {
67
- const key = this.Key(request, ADDITIONAL_IDENTIFIER.Confirmation)
68
- const ttl = config.get('confirmationSessionTimeout')
69
-
70
- return this.cache.set(key, confirmationState, ttl)
71
- }
72
-
73
- async clearState(request: FormRequest | FormRequestPayload) {
74
- if (request.yar.id) {
75
- await this.cache.drop(this.Key(request))
76
- }
77
- }
78
-
79
- getFlash(
80
- request: FormRequest | FormRequestPayload
81
- ): { errors: FormSubmissionError[] } | undefined {
82
- const key = this.Key(request)
83
- const messages = request.yar.flash(key.id)
84
-
85
- if (Array.isArray(messages) && messages.length) {
86
- return messages.at(0) as { errors: FormSubmissionError[] }
87
- }
88
- }
89
-
90
- setFlash(
91
- request: FormRequest | FormRequestPayload,
92
- message: { errors: FormSubmissionError[] }
93
- ) {
94
- const key = this.Key(request)
95
-
96
- request.yar.flash(key.id, message)
97
- }
98
-
99
- /**
100
- * The key used to store user session data against.
101
- * 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`
102
- * @param request - hapi request object
103
- * @param additionalIdentifier - appended to the id
104
- */
105
- Key(
106
- request: Request | FormRequest | FormRequestPayload,
107
- additionalIdentifier?: ADDITIONAL_IDENTIFIER
108
- ) {
109
- if (!request.yar.id) {
110
- throw Error('No session ID found')
111
- }
112
- return {
113
- segment: partition,
114
- id: `${request.yar.id}:${request.params.state ?? ''}:${request.params.slug ?? ''}:${additionalIdentifier ?? ''}`
115
- }
116
- }
117
- }
118
-
119
- /**
120
- * State merge helper
121
- * 1. Merges objects (form fields)
122
- * 2. Overwrites arrays
123
- */
124
- export function merge<StateType extends FormState | FormPayload>(
125
- state: StateType,
126
- update: object
127
- ): StateType {
128
- return Hoek.merge(state, update, {
129
- mergeArrays: false
130
- })
131
- }