@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,201 +0,0 @@
1
- import { slugSchema } from '@defra/forms-model'
2
- import Boom from '@hapi/boom'
3
- import { type ServerRegisterPluginObject } from '@hapi/hapi'
4
- import humanizeDuration from 'humanize-duration'
5
- import Joi from 'joi'
6
-
7
- import {
8
- defaultConsent,
9
- parseCookieConsent,
10
- serialiseCookieConsent
11
- } from '~/src/common/cookies.js'
12
- import { type CookieConsent } from '~/src/common/types.js'
13
- import { config } from '~/src/config/index.js'
14
- import { isPathRelative } from '~/src/server/plugins/engine/helpers.js'
15
- import { getFormMetadata } from '~/src/server/plugins/engine/services/formsService.js'
16
- import { healthRoute, publicRoutes } from '~/src/server/routes/index.js'
17
- import { crumbSchema } from '~/src/server/schemas/index.js'
18
-
19
- const routes = [...publicRoutes, healthRoute]
20
-
21
- export default {
22
- plugin: {
23
- name: 'router',
24
- register: (server) => {
25
- server.route(routes)
26
-
27
- // Shared help routes params schema & options
28
- const params = Joi.object()
29
- .keys({
30
- slug: slugSchema
31
- })
32
- .required()
33
-
34
- const options = {
35
- validate: {
36
- params
37
- }
38
- }
39
-
40
- server.route<{ Params: { slug: string } }>({
41
- method: 'get',
42
- path: '/help/get-support/{slug}',
43
- async handler(request, h) {
44
- const { slug } = request.params
45
- const form = await getFormMetadata(slug)
46
-
47
- return h.view('help/get-support', { form })
48
- },
49
- options
50
- })
51
-
52
- server.route<{ Params: { slug: string } }>({
53
- method: 'get',
54
- path: '/help/privacy/{slug}',
55
- async handler(request, h) {
56
- const { slug } = request.params
57
- const form = await getFormMetadata(slug)
58
-
59
- return h.view('help/privacy-notice', { form })
60
- },
61
- options
62
- })
63
-
64
- server.route<{ Params: { slug: string } }>({
65
- method: 'get',
66
- path: '/help/cookies/{slug}',
67
- handler(_request, h) {
68
- const sessionTimeout = config.get('sessionTimeout')
69
-
70
- const sessionDurationPretty = humanizeDuration(sessionTimeout)
71
-
72
- return h.view('help/cookies', {
73
- googleAnalyticsContainerId: config
74
- .get('googleAnalyticsTrackingId')
75
- .replace(/^G-/, ''),
76
- sessionDurationPretty
77
- })
78
- },
79
- options
80
- })
81
-
82
- server.route<{
83
- Params: { slug: string }
84
- Payload: {
85
- crumb?: string
86
- 'cookies[analytics]'?: string
87
- 'cookies[dismissed]'?: string
88
- }
89
- Query: { returnUrl?: string }
90
- }>({
91
- method: 'post',
92
- path: '/help/cookie-preferences/{slug}',
93
- handler(request, h) {
94
- const { params, payload, query } = request
95
- const { slug } = params
96
- let { returnUrl } = query
97
-
98
- if (returnUrl && !isPathRelative(returnUrl)) {
99
- throw Boom.badRequest('Return URL must be relative')
100
- }
101
-
102
- const analyticsDecision = (
103
- payload['cookies[analytics]'] ?? ''
104
- ).toLowerCase()
105
-
106
- const dismissedDecision = (
107
- payload['cookies[dismissed]'] ?? ''
108
- ).toLowerCase()
109
-
110
- // move the parser into our JS code so we can delegate to the frontend in a future iteration
111
- let cookieConsent: CookieConsent
112
-
113
- if (typeof request.state.cookieConsent === 'string') {
114
- cookieConsent = parseCookieConsent(request.state.cookieConsent)
115
- } else {
116
- cookieConsent = defaultConsent
117
- }
118
-
119
- if (analyticsDecision) {
120
- cookieConsent.analytics = analyticsDecision === 'yes'
121
- cookieConsent.dismissed = false
122
- }
123
-
124
- if (dismissedDecision) {
125
- cookieConsent.dismissed = dismissedDecision === 'yes'
126
- }
127
-
128
- if (!returnUrl) {
129
- cookieConsent.dismissed = true // this page already has a confirmation message, don't show another
130
- returnUrl = `/help/cookie-preferences/${slug}`
131
- }
132
-
133
- const serialisedCookieConsent = serialiseCookieConsent(cookieConsent)
134
- h.state('cookieConsent', serialisedCookieConsent)
135
-
136
- return h.redirect(returnUrl)
137
- },
138
- options: {
139
- validate: {
140
- params,
141
- payload: Joi.object({
142
- crumb: crumbSchema,
143
- 'cookies[analytics]': Joi.string().valid('yes', 'no').optional(),
144
- 'cookies[dismissed]': Joi.string().valid('yes', 'no').optional()
145
- }),
146
- query: Joi.object({
147
- returnUrl: Joi.string().optional()
148
- })
149
- }
150
- }
151
- })
152
-
153
- server.route({
154
- method: 'get',
155
- path: '/',
156
- handler() {
157
- throw Boom.notFound()
158
- }
159
- })
160
-
161
- server.route<{ Params: { slug: string } }>({
162
- method: 'get',
163
- path: '/help/cookie-preferences/{slug}',
164
- handler(request, h) {
165
- const { params } = request
166
- const { slug } = params
167
- let cookieConsentDismissed = false
168
-
169
- if (typeof request.state.cookieConsent === 'string') {
170
- const cookieConsent = parseCookieConsent(
171
- request.state.cookieConsent
172
- )
173
-
174
- cookieConsentDismissed = cookieConsent.dismissed
175
- }
176
-
177
- // if the user has come back to this page after updating their preferences
178
- // override the 'dismissed' behaviour to show a success notification instead of
179
- // the cookie banner
180
- const showConsentSuccess =
181
- cookieConsentDismissed &&
182
- request.info.referrer.endsWith(`/help/cookie-preferences/${slug}`)
183
-
184
- return h.view('help/cookie-preferences', {
185
- cookieConsentUpdated: showConsentSuccess
186
- })
187
- },
188
- options
189
- })
190
-
191
- server.route<{ Params: { slug: string } }>({
192
- method: 'get',
193
- path: '/help/accessibility-statement/{slug}',
194
- handler(_request, h) {
195
- return h.view('help/accessibility-statement')
196
- },
197
- options
198
- })
199
- }
200
- }
201
- } satisfies ServerRegisterPluginObject<void>
@@ -1,28 +0,0 @@
1
- import { type ServerRegisterPluginObject } from '@hapi/hapi'
2
- import yar, { type YarOptions } from '@hapi/yar'
3
-
4
- import { config } from '~/src/config/index.js'
5
-
6
- /**
7
- * Yar is used for temporary session data but not form submissions, e.g. UI helpers, session flags.
8
- */
9
- export default {
10
- plugin: yar,
11
- options: {
12
- maxCookieSize: 0, // Always use server-side storage
13
- cache: {
14
- cache: 'session',
15
- segment: 'session',
16
- expiresIn: config.get('sessionTimeout')
17
- },
18
- /**
19
- * @todo storeBlank is current commented out as it's a minor efficiency gain but breaks the auth tests if enabled.
20
- * this only seems to affect the auth code, which we might remove anyway so it's temporarily disabled.
21
- */
22
- // storeBlank: false,
23
- cookieOptions: {
24
- password: config.get('sessionCookiePassword'),
25
- isSecure: config.get('isProduction')
26
- }
27
- }
28
- } satisfies ServerRegisterPluginObject<YarOptions>
@@ -1,13 +0,0 @@
1
- import { StatusCodes } from 'http-status-codes'
2
-
3
- export default /** @type {ServerRoute} */ ({
4
- method: 'GET',
5
- path: '/health',
6
- handler(_, h) {
7
- return h.response({ message: 'success' }).code(StatusCodes.OK)
8
- }
9
- })
10
-
11
- /**
12
- * @import { ServerRoute } from '@hapi/hapi'
13
- */
@@ -1,35 +0,0 @@
1
- import { createServer } from '~/src/server/index.js'
2
-
3
- describe('Health check route', () => {
4
- const startServer = async () => {
5
- const server = await createServer()
6
- await server.initialize()
7
- return server
8
- }
9
-
10
- /** @type {Server} */
11
- let server
12
-
13
- afterEach(async () => {
14
- await server.stop()
15
- })
16
-
17
- test('/health route response is correct', async () => {
18
- server = await startServer()
19
-
20
- const options = {
21
- method: 'GET',
22
- url: '/health'
23
- }
24
-
25
- const { result } = await server.inject(options)
26
-
27
- expect(result).toMatchObject({
28
- message: 'success'
29
- })
30
- })
31
- })
32
-
33
- /**
34
- * @import { Server } from '@hapi/hapi'
35
- */
@@ -1,125 +0,0 @@
1
- import { type Server } from '@hapi/hapi'
2
- import { StatusCodes } from 'http-status-codes'
3
-
4
- import { config } from '~/src/config/index.js'
5
- import { createServer } from '~/src/server/index.js'
6
- import { getFormMetadata } from '~/src/server/plugins/engine/services/formsService.js'
7
- import * as fixtures from '~/test/fixtures/index.js'
8
- import { renderResponse } from '~/test/helpers/component-helpers.js'
9
-
10
- jest.mock('~/src/server/plugins/engine/services/formsService.js')
11
-
12
- describe('Routes', () => {
13
- let server: Server
14
-
15
- beforeAll(async () => {
16
- server = await createServer()
17
- await server.initialize()
18
- })
19
-
20
- afterAll(async () => {
21
- await server.stop()
22
- })
23
-
24
- test('cookies page is served with 24 hour duration', async () => {
25
- config.set('sessionTimeout', 86400000)
26
-
27
- const options = {
28
- method: 'GET',
29
- url: '/help/cookies/slug'
30
- }
31
-
32
- const { container } = await renderResponse(server, options)
33
-
34
- const $heading = container.getByRole('heading', {
35
- name: 'Cookies',
36
- level: 1
37
- })
38
-
39
- const $googleAnalyticsRowheader = container.getByRole('rowheader', {
40
- name: '_ga_123456789'
41
- })
42
-
43
- const $sessionDurationRow = container.getByRole('row', {
44
- name: 'session Remembers the information you enter When you close the browser, or after 1 day'
45
- })
46
-
47
- expect($heading).toBeInTheDocument()
48
- expect($heading).toHaveClass('govuk-heading-l')
49
- expect($googleAnalyticsRowheader).toBeInTheDocument()
50
- expect($sessionDurationRow).toBeInTheDocument()
51
- })
52
-
53
- test('accessibility statement page is served', async () => {
54
- const options = {
55
- method: 'GET',
56
- url: '/help/accessibility-statement/slug'
57
- }
58
-
59
- const { container } = await renderResponse(server, options)
60
-
61
- const $heading = container.getByRole('heading', {
62
- name: 'Accessibility statement for this form',
63
- level: 1
64
- })
65
-
66
- expect($heading).toBeInTheDocument()
67
- expect($heading).toHaveClass('govuk-heading-l')
68
- })
69
-
70
- test('Help page is served', async () => {
71
- jest.mocked(getFormMetadata).mockResolvedValue(fixtures.form.metadata)
72
-
73
- const options = {
74
- method: 'GET',
75
- url: '/help/get-support/slug'
76
- }
77
-
78
- const res = await server.inject(options)
79
-
80
- expect(res.statusCode).toBe(StatusCodes.OK)
81
- })
82
-
83
- test('Service banner is not shown by default', async () => {
84
- const { container } = await renderResponse(server, {
85
- method: 'GET',
86
- url: '/'
87
- })
88
-
89
- const $banner = container.queryByRole('complementary', {
90
- name: 'Service status'
91
- })
92
-
93
- expect($banner).not.toBeInTheDocument()
94
- })
95
-
96
- test('Service banner is not shown when empty', async () => {
97
- config.set('serviceBannerText', '')
98
-
99
- const { container } = await renderResponse(server, {
100
- method: 'GET',
101
- url: '/'
102
- })
103
-
104
- const $banner = container.queryByRole('complementary', {
105
- name: 'Service status'
106
- })
107
-
108
- expect($banner).not.toBeInTheDocument()
109
- })
110
-
111
- test('Service banner is shown when configured', async () => {
112
- config.set('serviceBannerText', 'Hello world')
113
-
114
- const { container } = await renderResponse(server, {
115
- method: 'GET',
116
- url: '/'
117
- })
118
-
119
- const $banner = container.getByRole('complementary', {
120
- name: 'Service status'
121
- })
122
-
123
- expect($banner).toHaveTextContent('Hello world')
124
- })
125
- })
@@ -1,2 +0,0 @@
1
- export { default as publicRoutes } from '~/src/server/routes/public.js'
2
- export { default as healthRoute } from '~/src/server/routes/health.js'
@@ -1,47 +0,0 @@
1
- import { join } from 'node:path'
2
-
3
- import { type HandlerDecorations, type ServerRoute } from '@hapi/hapi'
4
-
5
- import { config } from '~/src/config/index.js'
6
-
7
- export default [
8
- {
9
- from: '/javascripts/{path*}',
10
- to: join(config.get('publicDir'), 'javascripts'),
11
- immutable: true
12
- },
13
- {
14
- from: '/stylesheets/{path*}',
15
- to: join(config.get('publicDir'), 'stylesheets'),
16
- immutable: true
17
- },
18
- {
19
- from: '/assets/fonts/{path*}',
20
- to: join(config.get('publicDir'), 'assets/fonts'),
21
- immutable: true
22
- },
23
- {
24
- from: '/assets/{path*}',
25
- to: join(config.get('publicDir'), 'assets'),
26
- immutable: false
27
- }
28
- ].map((options) => {
29
- return {
30
- method: 'GET',
31
- path: options.from,
32
- options: {
33
- cache: {
34
- // Historically, an infinite max-age is the 32-bit maximum 2,147,483,648
35
- // https://datatracker.ietf.org/doc/html/rfc9111#section-1.2.2
36
- otherwise: options.immutable
37
- ? 'public, max-age=2147483648, immutable'
38
- : 'public, max-age=0, must-revalidate'
39
- },
40
- handler: {
41
- directory: {
42
- path: options.to
43
- }
44
- } satisfies HandlerDecorations
45
- }
46
- } satisfies ServerRoute
47
- })
@@ -1,48 +0,0 @@
1
- import { type ReqRefDefaults, type Request } from '@hapi/hapi'
2
-
3
- import { type FormPayload } from '~/src/server/plugins/engine/types.js'
4
-
5
- export interface FormQuery extends Partial<Record<string, string>> {
6
- /**
7
- * Allow preview URL direct access without relevant page checks
8
- */
9
- force?: string
10
-
11
- /**
12
- * Redirect location after 'continue' form action
13
- */
14
- returnUrl?: string
15
- }
16
-
17
- export interface FormParams extends Partial<Record<string, string>> {
18
- path: string
19
- slug: string
20
- state?: FormStatus
21
- }
22
-
23
- export interface FormRequestRefs
24
- extends Omit<ReqRefDefaults, 'Params' | 'Payload' | 'Query'> {
25
- Params: FormParams
26
- Payload: object | undefined
27
- Query: FormQuery
28
- }
29
-
30
- export interface FormRequestPayloadRefs extends FormRequestRefs {
31
- Payload: FormPayload
32
- }
33
-
34
- export type FormRequest = Request<FormRequestRefs>
35
- export type FormRequestPayload = Request<FormRequestPayloadRefs>
36
-
37
- export enum FormAction {
38
- Continue = 'continue',
39
- Validate = 'validate',
40
- Delete = 'delete',
41
- AddAnother = 'add-another',
42
- Send = 'send'
43
- }
44
-
45
- export enum FormStatus {
46
- Draft = 'draft',
47
- Live = 'live'
48
- }
@@ -1,34 +0,0 @@
1
- import Joi from 'joi'
2
-
3
- import { type FormParams } from '~/src/server/plugins/engine/types.js'
4
- import { FormAction, FormStatus } from '~/src/server/routes/types.js'
5
-
6
- export const stateSchema = Joi.string<FormStatus>()
7
- .valid(FormStatus.Draft, FormStatus.Live)
8
- .required()
9
-
10
- export const actionSchema = Joi.string<FormAction>()
11
- .valid(
12
- FormAction.Continue,
13
- FormAction.Validate,
14
- FormAction.Delete,
15
- FormAction.AddAnother,
16
- FormAction.Send
17
- )
18
- .default(FormAction.Validate)
19
- .optional()
20
-
21
- export const pathSchema = Joi.string().required()
22
- export const itemIdSchema = Joi.string().uuid().required()
23
- export const crumbSchema = Joi.string().optional().allow('')
24
- export const confirmSchema = Joi.boolean().empty(false)
25
-
26
- export const paramsSchema = Joi.object<FormParams>()
27
- .keys({
28
- action: actionSchema,
29
- confirm: confirmSchema,
30
- crumb: crumbSchema,
31
- itemId: itemIdSchema.optional()
32
- })
33
- .default({})
34
- .optional()
@@ -1,43 +0,0 @@
1
- import tls from 'node:tls'
2
-
3
- import { getTrustStoreCerts } from '~/src/server/utils/secure-context/get-trust-store-certs.js'
4
-
5
- /**
6
- * @type {SecureContext}
7
- */
8
- export let secureContext
9
-
10
- /**
11
- * Prepares the TLS secure context
12
- * @param {Server} server
13
- * @returns
14
- */
15
- export function prepareSecureContext(server) {
16
- const originalCreateSecureContext = tls.createSecureContext
17
-
18
- tls.createSecureContext = function (options = {}) {
19
- const trustStoreCerts = getTrustStoreCerts(process.env)
20
-
21
- if (!trustStoreCerts.length) {
22
- server.logger.info('Could not find any TRUSTSTORE_ certificates')
23
- }
24
-
25
- const originalSecureContext = originalCreateSecureContext(options)
26
-
27
- trustStoreCerts.forEach((cert) => {
28
- // eslint-disable-next-line -- Node.js API not documented
29
- originalSecureContext.context.addCACert(cert)
30
- })
31
-
32
- return originalSecureContext
33
- }
34
-
35
- secureContext = tls.createSecureContext()
36
-
37
- return secureContext
38
- }
39
-
40
- /**
41
- * @import { Server } from '@hapi/hapi'
42
- * @import { SecureContext } from 'node:tls'
43
- */