@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,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
- ```