@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,58 +0,0 @@
1
- /**
2
- @type {CookieConsent}
3
- */
4
- export const defaultConsent = {
5
- analytics: null,
6
- dismissed: false
7
- }
8
-
9
- /**
10
- * Parses the cookie consent policy
11
- * @param {string} value
12
- */
13
- export function parseCookieConsent(value) {
14
- /** @type {CookieConsent} */
15
- let cookieConsent
16
-
17
- try {
18
- const encodedValue = decodeURIComponent(value)
19
-
20
- // eslint-disable-next-line -- Allow JSON type 'any'
21
- const decodedValue = JSON.parse(encodedValue)
22
-
23
- if (isValidConsent(decodedValue)) {
24
- cookieConsent = decodedValue
25
- } else {
26
- cookieConsent = defaultConsent
27
- }
28
- } catch {
29
- cookieConsent = defaultConsent
30
- }
31
-
32
- return cookieConsent
33
- }
34
-
35
- /**
36
- * Serialises the cookie consent policy
37
- * @param {CookieConsent} consent
38
- * @returns {string} cookie value
39
- */
40
- export function serialiseCookieConsent(consent) {
41
- return encodeURIComponent(JSON.stringify(consent))
42
- }
43
-
44
- /**
45
- * @param {unknown} consent
46
- * @returns {consent is CookieConsent}
47
- */
48
- function isValidConsent(consent) {
49
- if (consent === null || Array.isArray(consent)) {
50
- return false
51
- }
52
-
53
- return typeof consent === 'object' && 'analytics' in consent
54
- }
55
-
56
- /**
57
- * @import {CookieConsent} from '~/src/common/types.js'
58
- */
@@ -1,23 +0,0 @@
1
- import { parseCookieConsent } from '~/src/common/cookies.js'
2
-
3
- describe('cookies', () => {
4
- it('parses a valid policy', () => {
5
- expect(parseCookieConsent('{"analytics":true}')).toEqual({
6
- analytics: true
7
- })
8
- })
9
-
10
- it.each([
11
- "['not', 'an', 'object']",
12
- '{{ not: "an object" }}',
13
- '{ additional: AAA }',
14
- '{ marketing: 100 }',
15
- '',
16
- 'null'
17
- ])('converts a malformed policy to the default', (value) => {
18
- expect(parseCookieConsent(value)).toEqual({
19
- analytics: null,
20
- dismissed: false
21
- })
22
- })
23
- })
@@ -1,5 +0,0 @@
1
- /**
2
- * @typedef CookieConsent
3
- * @property {boolean | null} analytics - whether analytics cookies are allowed
4
- * @property {boolean} dismissed - whether cookie banner has been dismissed
5
- */
@@ -1,271 +0,0 @@
1
- import { resolve } from 'node:path'
2
-
3
- import convict, { type SchemaObj } from 'convict'
4
- import { type LevelWithSilent } from 'pino'
5
-
6
- import 'dotenv/config'
7
-
8
- const isProduction = process.env.NODE_ENV === 'production'
9
- const isDev = process.env.NODE_ENV !== 'production'
10
- const isTest = process.env.NODE_ENV === 'test'
11
-
12
- const oneMinute = 1000 * 60
13
- const oneHour = oneMinute * 60
14
-
15
- export const config = convict({
16
- appDir: {
17
- format: String,
18
- default: resolve(import.meta.dirname, '../server')
19
- },
20
- publicDir: {
21
- format: String,
22
- default: isTest
23
- ? resolve(import.meta.dirname, '../../test/fixtures')
24
- : resolve(import.meta.dirname, '../../.public')
25
- },
26
-
27
- /**
28
- * Server
29
- */
30
- port: {
31
- format: 'port',
32
- default: 3009,
33
- env: 'PORT'
34
- },
35
- env: {
36
- doc: 'The application environment.',
37
- format: ['production', 'development', 'test'],
38
- default: 'development',
39
- env: 'NODE_ENV'
40
- },
41
- cdpEnvironment: {
42
- doc: 'The CDP environment the app is currently in, with the addition of "local"',
43
- format: [
44
- 'local',
45
- 'infra-dev',
46
- 'management',
47
- 'dev',
48
- 'test',
49
- 'perf-test',
50
- 'ext-test',
51
- 'prod'
52
- ],
53
- default: 'local',
54
- env: 'ENVIRONMENT'
55
- },
56
- enforceCsrf: {
57
- format: Boolean,
58
- default: isProduction,
59
- env: 'ENFORCE_CSRF'
60
- },
61
-
62
- /**
63
- * Helper flags
64
- */
65
- isProduction: {
66
- doc: 'If this application running in the production environment',
67
- format: Boolean,
68
- default: isProduction
69
- },
70
- isDevelopment: {
71
- doc: 'If this application running in the development environment',
72
- format: Boolean,
73
- default: isDev
74
- },
75
- isTest: {
76
- doc: 'If this application running in the test environment',
77
- format: Boolean,
78
- default: isTest
79
- },
80
-
81
- /**
82
- * Service
83
- */
84
- serviceName: {
85
- doc: 'Applications Service Name',
86
- format: String,
87
- default: 'Submit a form to Defra'
88
- },
89
- serviceVersion: {
90
- doc: 'The service version, this variable is injected into your docker container in CDP environments',
91
- format: String,
92
- nullable: true,
93
- default: null,
94
- env: 'SERVICE_VERSION'
95
- } as SchemaObj<string>,
96
- feedbackLink: {
97
- doc: 'Used in your phase banner. Can be a URL or more commonly mailto mailto:feedback@department.gov.uk',
98
- format: String,
99
- default: null,
100
- env: 'FEEDBACK_LINK'
101
- } as SchemaObj<string>,
102
- phaseTag: {
103
- format: String,
104
- default: 'beta', // Accepts "alpha" |"beta" | ""
105
- env: 'PHASE_TAG'
106
- },
107
-
108
- /**
109
- * Session storage
110
- * Redis integration is optional, but recommended for production environments.
111
- */
112
- sessionTimeout: {
113
- format: Number,
114
- default: oneHour * 24, // 1 day
115
- env: 'SESSION_TIMEOUT'
116
- },
117
- confirmationSessionTimeout: {
118
- format: Number,
119
- default: oneMinute * 20,
120
- env: 'CONFIRMATION_SESSION_TIMEOUT'
121
- },
122
- sessionCookiePassword: {
123
- format: String,
124
- default: null,
125
- sensitive: true,
126
- env: 'SESSION_COOKIE_PASSWORD'
127
- } as SchemaObj<string>,
128
- redis: {
129
- host: {
130
- doc: 'Redis cache host',
131
- format: String,
132
- default: null,
133
- env: 'REDIS_HOST'
134
- } as SchemaObj<string>,
135
- username: {
136
- doc: 'Redis cache username',
137
- format: String,
138
- default: null,
139
- env: 'REDIS_USERNAME'
140
- } as SchemaObj<string>,
141
- password: {
142
- doc: 'Redis cache password',
143
- format: '*',
144
- default: null,
145
- sensitive: true,
146
- env: 'REDIS_PASSWORD'
147
- } as SchemaObj<string>,
148
- keyPrefix: {
149
- doc: 'Redis cache key prefix name used to isolate the cached results across multiple clients',
150
- format: String,
151
- default: null,
152
- env: 'REDIS_KEY_PREFIX'
153
- } as SchemaObj<string>
154
- },
155
- tracing: {
156
- header: {
157
- doc: 'Tracing header name',
158
- format: String,
159
- default: 'x-cdp-request-id',
160
- env: 'TRACING_HEADER'
161
- } as SchemaObj<string>
162
- },
163
-
164
- /**
165
- * Email outputs
166
- * Email outputs will use notify to send an email to a single inbox.
167
- */
168
- notifyTemplateId: {
169
- format: String,
170
- default: null,
171
- env: 'NOTIFY_TEMPLATE_ID'
172
- } as SchemaObj<string>,
173
- notifyAPIKey: {
174
- format: String,
175
- default: null,
176
- env: 'NOTIFY_API_KEY'
177
- } as SchemaObj<string>,
178
-
179
- /**
180
- * API integrations
181
- */
182
- managerUrl: {
183
- format: String,
184
- default: null,
185
- env: 'MANAGER_URL'
186
- } as SchemaObj<string>,
187
-
188
- designerUrl: {
189
- format: String,
190
- default: null,
191
- env: 'DESIGNER_URL'
192
- } as SchemaObj<string>,
193
-
194
- submissionUrl: {
195
- format: String,
196
- default: null,
197
- env: 'SUBMISSION_URL'
198
- } as SchemaObj<string>,
199
-
200
- uploaderUrl: {
201
- format: String,
202
- default: null,
203
- env: 'UPLOADER_URL'
204
- } as SchemaObj<string>,
205
-
206
- uploaderBucketName: {
207
- format: String,
208
- default: 'files',
209
- env: 'UPLOADER_BUCKET_NAME'
210
- },
211
-
212
- /**
213
- * Logging
214
- */
215
- log: {
216
- enabled: {
217
- doc: 'Is logging enabled',
218
- format: Boolean,
219
- default: !isTest,
220
- env: 'LOG_ENABLED'
221
- },
222
- level: {
223
- doc: 'Logging level',
224
- format: ['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'],
225
- default: 'info',
226
- env: 'LOG_LEVEL'
227
- } as SchemaObj<LevelWithSilent>,
228
- format: {
229
- doc: 'Format to output logs in.',
230
- format: ['ecs', 'pino-pretty'],
231
- default: isProduction ? 'ecs' : 'pino-pretty',
232
- env: 'LOG_FORMAT'
233
- } as SchemaObj<'ecs' | 'pino-pretty'>,
234
- redact: {
235
- doc: 'Log paths to redact',
236
- format: Array,
237
- default: isProduction
238
- ? ['req.headers.authorization', 'req.headers.cookie', 'res.headers']
239
- : ['req', 'res', 'responseTime']
240
- }
241
- },
242
-
243
- safelist: {
244
- format: Array,
245
- default: ['61bca17e-fe74-40e0-9c15-a901ad120eca.mock.pstmn.io'],
246
- env: 'SAFELIST'
247
- },
248
-
249
- stagingPrefix: {
250
- doc: 'Prefix for staging files in S3',
251
- format: String,
252
- default: 'staging',
253
- env: 'STAGING_PREFIX'
254
- },
255
-
256
- serviceBannerText: {
257
- doc: 'Service banner text used to show a maintenance message on all pages when set',
258
- format: String,
259
- default: '',
260
- env: 'SERVICE_BANNER_TEXT'
261
- },
262
-
263
- googleAnalyticsTrackingId: {
264
- doc: 'Google analytics tracking ID to be used when a user has opted in to additional cookies',
265
- format: String,
266
- default: '',
267
- env: 'GOOGLE_ANALYTICS_TRACKING_ID'
268
- }
269
- })
270
-
271
- config.validate({ allowed: 'strict' })
package/src/index.ts DELETED
@@ -1,31 +0,0 @@
1
- import { config } from '~/src/config/index.js'
2
- import { createLogger } from '~/src/server/common/helpers/logging/logger.js'
3
- import { createServer } from '~/src/server/index.js'
4
-
5
- const logger = createLogger()
6
-
7
- process.on('unhandledRejection', (error) => {
8
- logger.info('Unhandled rejection')
9
- logger.error(error)
10
- throw error
11
- })
12
-
13
- /**
14
- * Main entrypoint to the application.
15
- */
16
- async function startServer() {
17
- const server = await createServer()
18
- await server.start()
19
-
20
- process.send?.('online')
21
-
22
- server.logger.info('Server started successfully')
23
- server.logger.info(
24
- `Access your frontend on http://localhost:${config.get('port')}`
25
- )
26
- }
27
-
28
- startServer().catch((error: unknown) => {
29
- logger.info('Server failed to start :(')
30
- logger.error(error)
31
- })
@@ -1,50 +0,0 @@
1
- import { getTraceId } from '@defra/hapi-tracing'
2
-
3
- import { loggerOptions } from '~/src/server/common/helpers/logging/logger-options.js'
4
-
5
- jest.mock('@defra/hapi-tracing', () => ({
6
- getTraceId: jest.fn()
7
- }))
8
-
9
- describe('logger-options', () => {
10
- beforeEach(() => {
11
- jest.clearAllMocks()
12
- })
13
-
14
- describe('configuration', () => {
15
- it('has the expected properties', () => {
16
- expect(loggerOptions).toHaveProperty('enabled')
17
- expect(loggerOptions).toHaveProperty('ignorePaths')
18
- expect(loggerOptions).toHaveProperty('redact')
19
- expect(loggerOptions).toHaveProperty('level')
20
- })
21
-
22
- it('ignores health endpoint', () => {
23
- expect(loggerOptions.ignorePaths).toContain('/health')
24
- })
25
-
26
- it('has redaction configuration', () => {
27
- expect(loggerOptions.redact).toBeDefined()
28
- })
29
- })
30
-
31
- describe('mixin function', () => {
32
- it('returns an empty object when no trace ID is available', () => {
33
- jest.mocked(getTraceId).mockReturnValue(null)
34
-
35
- const result = loggerOptions.mixin()
36
- expect(result).toEqual({})
37
- })
38
-
39
- it('includes trace ID when available', () => {
40
- jest.mocked(getTraceId).mockReturnValue('some-trace-id')
41
-
42
- const result = loggerOptions.mixin()
43
- expect(result).toEqual({
44
- trace: {
45
- id: 'some-trace-id'
46
- }
47
- })
48
- })
49
- })
50
- })
@@ -1,46 +0,0 @@
1
- import { getTraceId } from '@defra/hapi-tracing'
2
- import { ecsFormat } from '@elastic/ecs-pino-format'
3
- import { type Options } from 'hapi-pino'
4
- import { type LoggerOptions, type TransportSingleOptions } from 'pino'
5
-
6
- import { config } from '~/src/config/index.js'
7
-
8
- const logConfig = config.get('log')
9
- const serviceName = config.get('serviceName')
10
- const serviceVersion = config.get('serviceVersion')
11
-
12
- const formatters: {
13
- ecs: Omit<LoggerOptions, 'mixin' | 'transport'>
14
- 'pino-pretty': { transport: TransportSingleOptions }
15
- } = {
16
- ecs: {
17
- ...ecsFormat(),
18
- base: {
19
- service: {
20
- name: serviceName,
21
- type: 'nodeJs',
22
- version: serviceVersion
23
- }
24
- }
25
- },
26
- 'pino-pretty': { transport: { target: 'pino-pretty' } }
27
- }
28
-
29
- export const loggerOptions = {
30
- enabled: logConfig.enabled,
31
- ignorePaths: ['/health'],
32
- redact: {
33
- paths: logConfig.redact,
34
- remove: true
35
- },
36
- level: logConfig.level,
37
- ...formatters[logConfig.format],
38
- mixin() {
39
- const mixinValues: { trace?: { id: string } } = {}
40
- const traceId = getTraceId()
41
- if (traceId) {
42
- mixinValues.trace = { id: traceId }
43
- }
44
- return mixinValues
45
- }
46
- } satisfies Options
@@ -1,7 +0,0 @@
1
- import { pino } from 'pino'
2
-
3
- import { loggerOptions } from '~/src/server/common/helpers/logging/logger-options.js'
4
-
5
- export function createLogger() {
6
- return pino(loggerOptions)
7
- }
@@ -1,9 +0,0 @@
1
- import { type ServerRegisterPluginObject } from '@hapi/hapi'
2
- import hapiPino, { type Options } from 'hapi-pino'
3
-
4
- import { loggerOptions } from '~/src/server/common/helpers/logging/logger-options.js'
5
-
6
- export const requestLogger = {
7
- plugin: hapiPino,
8
- options: loggerOptions
9
- } satisfies ServerRegisterPluginObject<Options>
@@ -1,10 +0,0 @@
1
- import { tracing } from '@defra/hapi-tracing'
2
-
3
- import { config } from '~/src/config/index.js'
4
-
5
- // Explicitly declare the expected type
6
-
7
- export const requestTracing = {
8
- plugin: tracing,
9
- options: { tracingHeader: config.get('tracing').header }
10
- }
@@ -1,70 +0,0 @@
1
- import { Cluster, Redis } from 'ioredis'
2
-
3
- import { config } from '~/src/config/index.js'
4
- import { createLogger } from '~/src/server/common/helpers/logging/logger.js'
5
-
6
- /**
7
- * Setup Redis and provide a redis client
8
- *
9
- * Local development - 1 Redis instance
10
- * Out in the wild - Elasticache / Redis Cluster with username and password
11
- */
12
- export function buildRedisClient() {
13
- const logger = createLogger()
14
-
15
- const port = 6379
16
- const db = 0
17
- const redisConfig = config.get('redis')
18
- const keyPrefix = redisConfig.keyPrefix
19
- const host = redisConfig.host
20
- let redisClient
21
-
22
- if (!config.get('isProduction')) {
23
- logger.info('Connecting to Redis using single instance')
24
-
25
- redisClient = new Redis({
26
- port,
27
- host,
28
- db,
29
- keyPrefix
30
- })
31
- } else {
32
- logger.info('Connecting to Redis using cluster')
33
-
34
- redisClient = new Cluster(
35
- [
36
- {
37
- host,
38
- port
39
- }
40
- ],
41
- {
42
- keyPrefix,
43
- slotsRefreshTimeout: 2000,
44
- dnsLookup: (address, callback) => callback(null, address),
45
- redisOptions: {
46
- username: redisConfig.username,
47
- password: redisConfig.password,
48
- db,
49
- tls: {}
50
- }
51
- }
52
- )
53
- }
54
-
55
- redisClient.on('connect', () => {
56
- logger.info('Connected to Redis server')
57
- })
58
-
59
- redisClient.on('close', () => {
60
- logger.warn(
61
- 'Redis connection closed attempting reconnect with default behavior'
62
- )
63
- })
64
-
65
- redisClient.on('error', (error) => {
66
- logger.error(error, `Redis connection error ${error}.`)
67
- })
68
-
69
- return redisClient
70
- }
@@ -1 +0,0 @@
1
- export const PREVIEW_PATH_PREFIX = '/preview'
@@ -1,10 +0,0 @@
1
- # Pre-configured Forms
2
-
3
- This folder holds pre-configured form definitions that can be loaded by the runner:
4
-
5
- ```js
6
- const server = await createServer({
7
- formFileName: 'example.js',
8
- formFilePath: join(cwd(), 'server/forms'),
9
- })
10
- ```