@defra/forms-engine-plugin 0.0.3 → 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 (328) 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/package.json +6 -2
  25. package/.browserslistrc +0 -16
  26. package/.editorconfig +0 -9
  27. package/.eslintrc.cjs +0 -266
  28. package/.github/dependabot.yml +0 -85
  29. package/.github/workflows/check-pull-request.yml +0 -209
  30. package/.github/workflows/pr-notifier.yml +0 -98
  31. package/.github/workflows/publish.yml +0 -111
  32. package/.husky/pre-commit +0 -1
  33. package/.lintstagedrc.js +0 -4
  34. package/.nvmrc +0 -1
  35. package/.prettierignore +0 -8
  36. package/.prettierrc.cjs +0 -26
  37. package/Dockerfile +0 -61
  38. package/Procfile +0 -1
  39. package/babel.config.cjs +0 -55
  40. package/compose/aws.env +0 -4
  41. package/compose/start-localstack.sh +0 -26
  42. package/docker-compose.yaml +0 -86
  43. package/globals.d.ts +0 -1
  44. package/jest.config.cjs +0 -54
  45. package/jest.environment.js +0 -4
  46. package/jest.setup.cjs +0 -14
  47. package/postcss.config.js +0 -26
  48. package/sonar-project.properties +0 -17
  49. package/src/client/javascripts/application.js +0 -87
  50. package/src/client/javascripts/file-upload.js +0 -386
  51. package/src/client/stylesheets/_code.scss +0 -33
  52. package/src/client/stylesheets/_govuk-frontend.scss +0 -4
  53. package/src/client/stylesheets/_prose.scss +0 -56
  54. package/src/client/stylesheets/_service-banner.scss +0 -24
  55. package/src/client/stylesheets/_summary-list.scss +0 -28
  56. package/src/client/stylesheets/_tag-env.scss +0 -24
  57. package/src/client/stylesheets/application.scss +0 -14
  58. package/src/common/cookies.js +0 -58
  59. package/src/common/cookies.test.js +0 -23
  60. package/src/common/types.js +0 -5
  61. package/src/config/index.ts +0 -271
  62. package/src/index.ts +0 -31
  63. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  64. package/src/server/common/helpers/logging/logger-options.ts +0 -46
  65. package/src/server/common/helpers/logging/logger.ts +0 -7
  66. package/src/server/common/helpers/logging/request-logger.ts +0 -9
  67. package/src/server/common/helpers/logging/request-tracing.js +0 -10
  68. package/src/server/common/helpers/redis-client.js +0 -70
  69. package/src/server/constants.js +0 -1
  70. package/src/server/forms/README.md +0 -10
  71. package/src/server/forms/components.json +0 -1015
  72. package/src/server/forms/report-a-terrorist.json +0 -270
  73. package/src/server/forms/runner-components-test.json +0 -365
  74. package/src/server/forms/test.json +0 -581
  75. package/src/server/index.test.ts +0 -582
  76. package/src/server/index.ts +0 -140
  77. package/src/server/plugins/blankie.test.ts +0 -73
  78. package/src/server/plugins/blankie.ts +0 -48
  79. package/src/server/plugins/crumb.ts +0 -20
  80. package/src/server/plugins/engine/README.md +0 -87
  81. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -294
  82. package/src/server/plugins/engine/components/AutocompleteField.ts +0 -49
  83. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -379
  84. package/src/server/plugins/engine/components/CheckboxesField.ts +0 -106
  85. package/src/server/plugins/engine/components/ComponentBase.ts +0 -97
  86. package/src/server/plugins/engine/components/ComponentCollection.ts +0 -278
  87. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -822
  88. package/src/server/plugins/engine/components/DatePartsField.ts +0 -264
  89. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  90. package/src/server/plugins/engine/components/Details.ts +0 -30
  91. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -395
  92. package/src/server/plugins/engine/components/EmailAddressField.ts +0 -55
  93. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -778
  94. package/src/server/plugins/engine/components/FileUploadField.ts +0 -262
  95. package/src/server/plugins/engine/components/FormComponent.ts +0 -249
  96. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  97. package/src/server/plugins/engine/components/Html.ts +0 -29
  98. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  99. package/src/server/plugins/engine/components/InsetText.ts +0 -27
  100. package/src/server/plugins/engine/components/List.test.ts +0 -76
  101. package/src/server/plugins/engine/components/List.ts +0 -72
  102. package/src/server/plugins/engine/components/ListFormComponent.ts +0 -140
  103. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -567
  104. package/src/server/plugins/engine/components/MonthYearField.ts +0 -222
  105. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -558
  106. package/src/server/plugins/engine/components/MultilineTextField.ts +0 -138
  107. package/src/server/plugins/engine/components/NumberField.test.ts +0 -701
  108. package/src/server/plugins/engine/components/NumberField.ts +0 -163
  109. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -288
  110. package/src/server/plugins/engine/components/RadiosField.ts +0 -24
  111. package/src/server/plugins/engine/components/SelectField.test.ts +0 -288
  112. package/src/server/plugins/engine/components/SelectField.ts +0 -47
  113. package/src/server/plugins/engine/components/SelectionControlField.ts +0 -43
  114. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -356
  115. package/src/server/plugins/engine/components/TelephoneNumberField.ts +0 -67
  116. package/src/server/plugins/engine/components/TextField.test.ts +0 -489
  117. package/src/server/plugins/engine/components/TextField.ts +0 -96
  118. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -623
  119. package/src/server/plugins/engine/components/UkAddressField.ts +0 -172
  120. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -248
  121. package/src/server/plugins/engine/components/YesNoField.ts +0 -31
  122. package/src/server/plugins/engine/components/constants.ts +0 -1
  123. package/src/server/plugins/engine/components/helpers.ts +0 -330
  124. package/src/server/plugins/engine/components/index.ts +0 -24
  125. package/src/server/plugins/engine/components/types.ts +0 -117
  126. package/src/server/plugins/engine/configureEnginePlugin.ts +0 -47
  127. package/src/server/plugins/engine/helpers.test.ts +0 -791
  128. package/src/server/plugins/engine/helpers.ts +0 -379
  129. package/src/server/plugins/engine/index.ts +0 -7
  130. package/src/server/plugins/engine/models/FormModel.test.ts +0 -42
  131. package/src/server/plugins/engine/models/FormModel.ts +0 -443
  132. package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
  133. package/src/server/plugins/engine/models/Section.ts +0 -0
  134. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -209
  135. package/src/server/plugins/engine/models/SummaryViewModel.ts +0 -220
  136. package/src/server/plugins/engine/models/index.ts +0 -2
  137. package/src/server/plugins/engine/models/types.ts +0 -114
  138. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -143
  139. package/src/server/plugins/engine/outputFormatters/human/v1.ts +0 -73
  140. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  141. package/src/server/plugins/engine/outputFormatters/index.ts +0 -44
  142. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -229
  143. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +0 -140
  144. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -229
  145. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +0 -153
  146. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1108
  147. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +0 -446
  148. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -205
  149. package/src/server/plugins/engine/pageControllers/PageController.ts +0 -176
  150. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1264
  151. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +0 -561
  152. package/src/server/plugins/engine/pageControllers/README.md +0 -28
  153. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -264
  154. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +0 -458
  155. package/src/server/plugins/engine/pageControllers/StartPageController.ts +0 -18
  156. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +0 -50
  157. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +0 -261
  158. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -28
  159. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +0 -19
  160. package/src/server/plugins/engine/pageControllers/helpers.test.ts +0 -198
  161. package/src/server/plugins/engine/pageControllers/helpers.ts +0 -101
  162. package/src/server/plugins/engine/pageControllers/index.ts +0 -10
  163. package/src/server/plugins/engine/pageControllers/validationOptions.ts +0 -89
  164. package/src/server/plugins/engine/plugin.ts +0 -673
  165. package/src/server/plugins/engine/services/formSubmissionService.js +0 -46
  166. package/src/server/plugins/engine/services/formsService.js +0 -46
  167. package/src/server/plugins/engine/services/formsService.test.js +0 -90
  168. package/src/server/plugins/engine/services/index.js +0 -3
  169. package/src/server/plugins/engine/services/notifyService.test.ts +0 -132
  170. package/src/server/plugins/engine/services/notifyService.ts +0 -64
  171. package/src/server/plugins/engine/services/uploadService.js +0 -60
  172. package/src/server/plugins/engine/types.ts +0 -315
  173. package/src/server/plugins/engine/views/components/autocompletefield.html +0 -5
  174. package/src/server/plugins/engine/views/components/checkboxesfield.html +0 -5
  175. package/src/server/plugins/engine/views/components/datepartsfield.html +0 -5
  176. package/src/server/plugins/engine/views/components/details.html +0 -6
  177. package/src/server/plugins/engine/views/components/emailaddressfield.html +0 -5
  178. package/src/server/plugins/engine/views/components/fileuploadfield-key.html +0 -8
  179. package/src/server/plugins/engine/views/components/fileuploadfield-value.html +0 -3
  180. package/src/server/plugins/engine/views/components/fileuploadfield.html +0 -24
  181. package/src/server/plugins/engine/views/components/html.html +0 -3
  182. package/src/server/plugins/engine/views/components/insettext.html +0 -7
  183. package/src/server/plugins/engine/views/components/list.html +0 -36
  184. package/src/server/plugins/engine/views/components/monthyearfield.html +0 -5
  185. package/src/server/plugins/engine/views/components/multilinetextfield.html +0 -10
  186. package/src/server/plugins/engine/views/components/numberfield.html +0 -5
  187. package/src/server/plugins/engine/views/components/radiosfield.html +0 -5
  188. package/src/server/plugins/engine/views/components/selectfield.html +0 -5
  189. package/src/server/plugins/engine/views/components/telephonenumberfield.html +0 -5
  190. package/src/server/plugins/engine/views/components/textfield.html +0 -5
  191. package/src/server/plugins/engine/views/components/ukaddressfield.html +0 -25
  192. package/src/server/plugins/engine/views/components/yesnofield.html +0 -5
  193. package/src/server/plugins/engine/views/file-upload.html +0 -45
  194. package/src/server/plugins/engine/views/index.html +0 -39
  195. package/src/server/plugins/engine/views/item-delete.html +0 -56
  196. package/src/server/plugins/engine/views/partials/components.html +0 -6
  197. package/src/server/plugins/engine/views/partials/conditional-components.html +0 -3
  198. package/src/server/plugins/engine/views/partials/debug.html +0 -44
  199. package/src/server/plugins/engine/views/partials/form.html +0 -15
  200. package/src/server/plugins/engine/views/partials/heading.html +0 -16
  201. package/src/server/plugins/engine/views/partials/preview-banner.html +0 -32
  202. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  203. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +0 -10
  204. package/src/server/plugins/engine/views/repeat-list-summary.html +0 -53
  205. package/src/server/plugins/errorPages.ts +0 -58
  206. package/src/server/plugins/nunjucks/context.js +0 -88
  207. package/src/server/plugins/nunjucks/context.test.js +0 -142
  208. package/src/server/plugins/nunjucks/enviroment.test.js +0 -201
  209. package/src/server/plugins/nunjucks/environment.js +0 -116
  210. package/src/server/plugins/nunjucks/filters/answer.js +0 -27
  211. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -89
  212. package/src/server/plugins/nunjucks/filters/evaluate.js +0 -21
  213. package/src/server/plugins/nunjucks/filters/field.js +0 -28
  214. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  215. package/src/server/plugins/nunjucks/filters/highlight.js +0 -11
  216. package/src/server/plugins/nunjucks/filters/href.js +0 -30
  217. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  218. package/src/server/plugins/nunjucks/filters/index.js +0 -8
  219. package/src/server/plugins/nunjucks/filters/inspect.js +0 -15
  220. package/src/server/plugins/nunjucks/filters/page.js +0 -24
  221. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  222. package/src/server/plugins/nunjucks/index.js +0 -3
  223. package/src/server/plugins/nunjucks/plugin.js +0 -40
  224. package/src/server/plugins/nunjucks/render.js +0 -42
  225. package/src/server/plugins/nunjucks/types.js +0 -40
  226. package/src/server/plugins/pulse.ts +0 -11
  227. package/src/server/plugins/router.ts +0 -201
  228. package/src/server/plugins/session.ts +0 -28
  229. package/src/server/routes/health.js +0 -13
  230. package/src/server/routes/health.test.js +0 -35
  231. package/src/server/routes/index.test.ts +0 -125
  232. package/src/server/routes/index.ts +0 -2
  233. package/src/server/routes/public.ts +0 -47
  234. package/src/server/routes/types.ts +0 -48
  235. package/src/server/schemas/index.ts +0 -34
  236. package/src/server/secure-context.js +0 -43
  237. package/src/server/services/cacheService.test.ts +0 -276
  238. package/src/server/services/cacheService.ts +0 -131
  239. package/src/server/services/httpService.test.js +0 -491
  240. package/src/server/services/httpService.ts +0 -50
  241. package/src/server/services/index.ts +0 -1
  242. package/src/server/types.ts +0 -54
  243. package/src/server/utils/notify.test.ts +0 -37
  244. package/src/server/utils/notify.ts +0 -50
  245. package/src/server/utils/secure-context/get-trust-store-certs.js +0 -11
  246. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  247. package/src/server/utils/utils.js +0 -24
  248. package/src/server/utils/utils.test.js +0 -54
  249. package/src/server/views/404.html +0 -16
  250. package/src/server/views/500.html +0 -19
  251. package/src/server/views/components/debug/macro.njk +0 -3
  252. package/src/server/views/components/debug/template.njk +0 -13
  253. package/src/server/views/components/service-banner/macro.njk +0 -3
  254. package/src/server/views/components/service-banner/template.njk +0 -20
  255. package/src/server/views/components/service-banner/template.test.js +0 -43
  256. package/src/server/views/components/tag-env/macro.njk +0 -3
  257. package/src/server/views/components/tag-env/template.njk +0 -30
  258. package/src/server/views/components/tag-env/template.test.js +0 -66
  259. package/src/server/views/confirmation.html +0 -19
  260. package/src/server/views/help/accessibility-statement.html +0 -58
  261. package/src/server/views/help/cookie-preferences.html +0 -57
  262. package/src/server/views/help/cookies.html +0 -71
  263. package/src/server/views/help/get-support.html +0 -37
  264. package/src/server/views/help/privacy-notice.html +0 -68
  265. package/src/server/views/help/terms-and-conditions.html +0 -83
  266. package/src/server/views/layout.html +0 -199
  267. package/src/server/views/summary.html +0 -50
  268. package/src/typings/hapi/index.d.ts +0 -95
  269. package/src/typings/hapi-tracing/index.d.ts +0 -6
  270. package/src/typings/index.d.ts +0 -3
  271. package/src/typings/joi/index.d.ts +0 -22
  272. package/stylelint.config.js +0 -10
  273. package/test/client/javascripts/file-upload.test.js +0 -1197
  274. package/test/condition/checkboxes.test.js +0 -112
  275. package/test/condition/radios.test.js +0 -112
  276. package/test/condition/text.test.js +0 -103
  277. package/test/fixtures/assets-manifest.json +0 -4
  278. package/test/fixtures/form.js +0 -86
  279. package/test/fixtures/index.js +0 -2
  280. package/test/fixtures/list.js +0 -92
  281. package/test/form/cookies.test.js +0 -338
  282. package/test/form/csrf.test.js +0 -87
  283. package/test/form/definitions/basic.js +0 -101
  284. package/test/form/definitions/blank.js +0 -10
  285. package/test/form/definitions/checkboxes.json +0 -88
  286. package/test/form/definitions/components.json +0 -452
  287. package/test/form/definitions/conditional-reveal.js +0 -140
  288. package/test/form/definitions/conditions-basic.js +0 -187
  289. package/test/form/definitions/conditions-complex.js +0 -338
  290. package/test/form/definitions/conditions-dates.js +0 -78
  291. package/test/form/definitions/conditions-escaping.js +0 -143
  292. package/test/form/definitions/demo-cph-number.js +0 -3099
  293. package/test/form/definitions/feedback.json +0 -45
  294. package/test/form/definitions/fields-optional.js +0 -402
  295. package/test/form/definitions/fields-required.js +0 -402
  296. package/test/form/definitions/file-upload-basic.js +0 -44
  297. package/test/form/definitions/file-upload.js +0 -66
  298. package/test/form/definitions/minimal.js +0 -39
  299. package/test/form/definitions/phase-alpha.json +0 -33
  300. package/test/form/definitions/phase-default.json +0 -26
  301. package/test/form/definitions/radios.json +0 -88
  302. package/test/form/definitions/repeat-mixed.js +0 -54
  303. package/test/form/definitions/repeat.js +0 -70
  304. package/test/form/definitions/status.json +0 -126
  305. package/test/form/definitions/templates.js +0 -183
  306. package/test/form/definitions/test.json +0 -581
  307. package/test/form/definitions/text.json +0 -75
  308. package/test/form/definitions/titles.json +0 -170
  309. package/test/form/definitions.test.js +0 -47
  310. package/test/form/exit-page.test.js +0 -210
  311. package/test/form/feedback.test.js +0 -68
  312. package/test/form/fields-optional.test.js +0 -237
  313. package/test/form/fields-required.test.js +0 -294
  314. package/test/form/file-upload.test.js +0 -313
  315. package/test/form/govuk-notify.test.js +0 -449
  316. package/test/form/journey-basic.test.js +0 -444
  317. package/test/form/persist-files.test.js +0 -227
  318. package/test/form/phase-banner.test.js +0 -71
  319. package/test/form/repeat.test.js +0 -628
  320. package/test/form/summary-submission-email.test.js +0 -95
  321. package/test/form/template.test.js +0 -288
  322. package/test/form/titles.test.js +0 -204
  323. package/test/helpers/component-helpers.js +0 -74
  324. package/test/utils/get-cookie.js +0 -42
  325. package/test/utils/get-form-definitions.js +0 -18
  326. package/tmp.pdf +0 -1
  327. package/tsconfig.json +0 -28
  328. 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
- }