@defra/forms-engine-plugin 0.0.1

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 (615) hide show
  1. package/.browserslistrc +16 -0
  2. package/.editorconfig +9 -0
  3. package/.eslintrc.cjs +266 -0
  4. package/.github/dependabot.yml +85 -0
  5. package/.github/workflows/check-pull-request.yml +209 -0
  6. package/.github/workflows/pr-notifier.yml +98 -0
  7. package/.github/workflows/publish.yml +111 -0
  8. package/.husky/pre-commit +1 -0
  9. package/.lintstagedrc.js +4 -0
  10. package/.nvmrc +1 -0
  11. package/.prettierignore +8 -0
  12. package/.prettierrc.cjs +26 -0
  13. package/.server/client/javascripts/application.js +68 -0
  14. package/.server/client/javascripts/application.js.map +1 -0
  15. package/.server/client/javascripts/file-upload.js +292 -0
  16. package/.server/client/javascripts/file-upload.js.map +1 -0
  17. package/.server/client/stylesheets/_code.scss +33 -0
  18. package/.server/client/stylesheets/_govuk-frontend.scss +4 -0
  19. package/.server/client/stylesheets/_prose.scss +56 -0
  20. package/.server/client/stylesheets/_service-banner.scss +24 -0
  21. package/.server/client/stylesheets/_summary-list.scss +28 -0
  22. package/.server/client/stylesheets/_tag-env.scss +24 -0
  23. package/.server/client/stylesheets/application.scss +14 -0
  24. package/.server/common/cookies.js +55 -0
  25. package/.server/common/cookies.js.map +1 -0
  26. package/.server/common/cookies.test.js +15 -0
  27. package/.server/common/cookies.test.js.map +1 -0
  28. package/.server/common/types.js +6 -0
  29. package/.server/common/types.js.map +1 -0
  30. package/.server/config/index.js +241 -0
  31. package/.server/config/index.js.map +1 -0
  32. package/.server/index.js +25 -0
  33. package/.server/index.js.map +1 -0
  34. package/.server/server/common/helpers/logging/logger-options.js +44 -0
  35. package/.server/server/common/helpers/logging/logger-options.js.map +1 -0
  36. package/.server/server/common/helpers/logging/logger.js +6 -0
  37. package/.server/server/common/helpers/logging/logger.js.map +1 -0
  38. package/.server/server/common/helpers/logging/request-logger.js +7 -0
  39. package/.server/server/common/helpers/logging/request-logger.js.map +1 -0
  40. package/.server/server/common/helpers/logging/request-tracing.js +12 -0
  41. package/.server/server/common/helpers/logging/request-tracing.js.map +1 -0
  42. package/.server/server/common/helpers/redis-client.js +55 -0
  43. package/.server/server/common/helpers/redis-client.js.map +1 -0
  44. package/.server/server/constants.js +2 -0
  45. package/.server/server/constants.js.map +1 -0
  46. package/.server/server/forms/README.md +10 -0
  47. package/.server/server/forms/components.json +1015 -0
  48. package/.server/server/forms/report-a-terrorist.json +270 -0
  49. package/.server/server/forms/runner-components-test.json +365 -0
  50. package/.server/server/forms/test.json +581 -0
  51. package/.server/server/index.js +116 -0
  52. package/.server/server/index.js.map +1 -0
  53. package/.server/server/plugins/blankie.js +29 -0
  54. package/.server/server/plugins/blankie.js.map +1 -0
  55. package/.server/server/plugins/crumb.js +15 -0
  56. package/.server/server/plugins/crumb.js.map +1 -0
  57. package/.server/server/plugins/engine/README.md +87 -0
  58. package/.server/server/plugins/engine/components/AutocompleteField.js +37 -0
  59. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -0
  60. package/.server/server/plugins/engine/components/CheckboxesField.js +79 -0
  61. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -0
  62. package/.server/server/plugins/engine/components/ComponentBase.js +55 -0
  63. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -0
  64. package/.server/server/plugins/engine/components/ComponentCollection.js +198 -0
  65. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -0
  66. package/.server/server/plugins/engine/components/DatePartsField.js +208 -0
  67. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -0
  68. package/.server/server/plugins/engine/components/Details.js +26 -0
  69. package/.server/server/plugins/engine/components/Details.js.map +1 -0
  70. package/.server/server/plugins/engine/components/EmailAddressField.js +40 -0
  71. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -0
  72. package/.server/server/plugins/engine/components/FileUploadField.js +195 -0
  73. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -0
  74. package/.server/server/plugins/engine/components/FormComponent.js +210 -0
  75. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -0
  76. package/.server/server/plugins/engine/components/Html.js +24 -0
  77. package/.server/server/plugins/engine/components/Html.js.map +1 -0
  78. package/.server/server/plugins/engine/components/InsetText.js +22 -0
  79. package/.server/server/plugins/engine/components/InsetText.js.map +1 -0
  80. package/.server/server/plugins/engine/components/List.js +65 -0
  81. package/.server/server/plugins/engine/components/List.js.map +1 -0
  82. package/.server/server/plugins/engine/components/ListFormComponent.js +87 -0
  83. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -0
  84. package/.server/server/plugins/engine/components/MonthYearField.js +172 -0
  85. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -0
  86. package/.server/server/plugins/engine/components/MultilineTextField.js +115 -0
  87. package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -0
  88. package/.server/server/plugins/engine/components/NumberField.js +137 -0
  89. package/.server/server/plugins/engine/components/NumberField.js.map +1 -0
  90. package/.server/server/plugins/engine/components/RadiosField.js +18 -0
  91. package/.server/server/plugins/engine/components/RadiosField.js.map +1 -0
  92. package/.server/server/plugins/engine/components/SelectField.js +33 -0
  93. package/.server/server/plugins/engine/components/SelectField.js.map +1 -0
  94. package/.server/server/plugins/engine/components/SelectionControlField.js +43 -0
  95. package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -0
  96. package/.server/server/plugins/engine/components/TelephoneNumberField.js +43 -0
  97. package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -0
  98. package/.server/server/plugins/engine/components/TextField.js +63 -0
  99. package/.server/server/plugins/engine/components/TextField.js.map +1 -0
  100. package/.server/server/plugins/engine/components/UkAddressField.js +130 -0
  101. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -0
  102. package/.server/server/plugins/engine/components/YesNoField.js +28 -0
  103. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -0
  104. package/.server/server/plugins/engine/components/constants.js +2 -0
  105. package/.server/server/plugins/engine/components/constants.js.map +1 -0
  106. package/.server/server/plugins/engine/components/helpers.js +219 -0
  107. package/.server/server/plugins/engine/components/helpers.js.map +1 -0
  108. package/.server/server/plugins/engine/components/index.js +25 -0
  109. package/.server/server/plugins/engine/components/index.js.map +1 -0
  110. package/.server/server/plugins/engine/components/types.js +2 -0
  111. package/.server/server/plugins/engine/components/types.js.map +1 -0
  112. package/.server/server/plugins/engine/configureEnginePlugin.js +44 -0
  113. package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -0
  114. package/.server/server/plugins/engine/helpers.js +268 -0
  115. package/.server/server/plugins/engine/helpers.js.map +1 -0
  116. package/.server/server/plugins/engine/index.js +6 -0
  117. package/.server/server/plugins/engine/index.js.map +1 -0
  118. package/.server/server/plugins/engine/models/FormModel.js +363 -0
  119. package/.server/server/plugins/engine/models/FormModel.js.map +1 -0
  120. package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.js +2 -0
  121. package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.js.map +1 -0
  122. package/.server/server/plugins/engine/models/Section.js +2 -0
  123. package/.server/server/plugins/engine/models/Section.js.map +1 -0
  124. package/.server/server/plugins/engine/models/SummaryViewModel.js +183 -0
  125. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -0
  126. package/.server/server/plugins/engine/models/index.js +3 -0
  127. package/.server/server/plugins/engine/models/index.js.map +1 -0
  128. package/.server/server/plugins/engine/models/types.js +2 -0
  129. package/.server/server/plugins/engine/models/types.js.map +1 -0
  130. package/.server/server/plugins/engine/outputFormatters/human/v1.js +44 -0
  131. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -0
  132. package/.server/server/plugins/engine/outputFormatters/index.js +24 -0
  133. package/.server/server/plugins/engine/outputFormatters/index.js.map +1 -0
  134. package/.server/server/plugins/engine/outputFormatters/machine/v1.js +104 -0
  135. package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -0
  136. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +110 -0
  137. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -0
  138. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +401 -0
  139. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -0
  140. package/.server/server/plugins/engine/pageControllers/PageController.js +133 -0
  141. package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -0
  142. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +482 -0
  143. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -0
  144. package/.server/server/plugins/engine/pageControllers/README.md +28 -0
  145. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +372 -0
  146. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -0
  147. package/.server/server/plugins/engine/pageControllers/StartPageController.js +16 -0
  148. package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -0
  149. package/.server/server/plugins/engine/pageControllers/StatusPageController.js +43 -0
  150. package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -0
  151. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +195 -0
  152. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -0
  153. package/.server/server/plugins/engine/pageControllers/TerminalPageController.js +8 -0
  154. package/.server/server/plugins/engine/pageControllers/TerminalPageController.js.map +1 -0
  155. package/.server/server/plugins/engine/pageControllers/helpers.js +69 -0
  156. package/.server/server/plugins/engine/pageControllers/helpers.js.map +1 -0
  157. package/.server/server/plugins/engine/pageControllers/index.js +10 -0
  158. package/.server/server/plugins/engine/pageControllers/index.js.map +1 -0
  159. package/.server/server/plugins/engine/pageControllers/validationOptions.js +78 -0
  160. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -0
  161. package/.server/server/plugins/engine/plugin.js +562 -0
  162. package/.server/server/plugins/engine/plugin.js.map +1 -0
  163. package/.server/server/plugins/engine/services/formSubmissionService.js +39 -0
  164. package/.server/server/plugins/engine/services/formSubmissionService.js.map +1 -0
  165. package/.server/server/plugins/engine/services/formsService.js +41 -0
  166. package/.server/server/plugins/engine/services/formsService.js.map +1 -0
  167. package/.server/server/plugins/engine/services/formsService.test.js +71 -0
  168. package/.server/server/plugins/engine/services/formsService.test.js.map +1 -0
  169. package/.server/server/plugins/engine/services/index.js +4 -0
  170. package/.server/server/plugins/engine/services/index.js.map +1 -0
  171. package/.server/server/plugins/engine/services/notifyService.js +45 -0
  172. package/.server/server/plugins/engine/services/notifyService.js.map +1 -0
  173. package/.server/server/plugins/engine/services/uploadService.js +51 -0
  174. package/.server/server/plugins/engine/services/uploadService.js.map +1 -0
  175. package/.server/server/plugins/engine/types.js +53 -0
  176. package/.server/server/plugins/engine/types.js.map +1 -0
  177. package/.server/server/plugins/engine/views/components/autocompletefield.html +5 -0
  178. package/.server/server/plugins/engine/views/components/checkboxesfield.html +5 -0
  179. package/.server/server/plugins/engine/views/components/datepartsfield.html +5 -0
  180. package/.server/server/plugins/engine/views/components/details.html +6 -0
  181. package/.server/server/plugins/engine/views/components/emailaddressfield.html +5 -0
  182. package/.server/server/plugins/engine/views/components/fileuploadfield-key.html +8 -0
  183. package/.server/server/plugins/engine/views/components/fileuploadfield-value.html +3 -0
  184. package/.server/server/plugins/engine/views/components/fileuploadfield.html +24 -0
  185. package/.server/server/plugins/engine/views/components/html.html +3 -0
  186. package/.server/server/plugins/engine/views/components/insettext.html +7 -0
  187. package/.server/server/plugins/engine/views/components/list.html +36 -0
  188. package/.server/server/plugins/engine/views/components/monthyearfield.html +5 -0
  189. package/.server/server/plugins/engine/views/components/multilinetextfield.html +10 -0
  190. package/.server/server/plugins/engine/views/components/numberfield.html +5 -0
  191. package/.server/server/plugins/engine/views/components/radiosfield.html +5 -0
  192. package/.server/server/plugins/engine/views/components/selectfield.html +5 -0
  193. package/.server/server/plugins/engine/views/components/telephonenumberfield.html +5 -0
  194. package/.server/server/plugins/engine/views/components/textfield.html +5 -0
  195. package/.server/server/plugins/engine/views/components/ukaddressfield.html +25 -0
  196. package/.server/server/plugins/engine/views/components/yesnofield.html +5 -0
  197. package/.server/server/plugins/engine/views/file-upload.html +45 -0
  198. package/.server/server/plugins/engine/views/index.html +39 -0
  199. package/.server/server/plugins/engine/views/item-delete.html +56 -0
  200. package/.server/server/plugins/engine/views/partials/components.html +6 -0
  201. package/.server/server/plugins/engine/views/partials/conditional-components.html +3 -0
  202. package/.server/server/plugins/engine/views/partials/debug.html +44 -0
  203. package/.server/server/plugins/engine/views/partials/form.html +15 -0
  204. package/.server/server/plugins/engine/views/partials/heading.html +16 -0
  205. package/.server/server/plugins/engine/views/partials/preview-banner.html +32 -0
  206. package/.server/server/plugins/engine/views/partials/preview-banner.test.js +108 -0
  207. package/.server/server/plugins/engine/views/partials/preview-banner.test.js.map +1 -0
  208. package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +10 -0
  209. package/.server/server/plugins/engine/views/repeat-list-summary.html +53 -0
  210. package/.server/server/plugins/errorPages.js +49 -0
  211. package/.server/server/plugins/errorPages.js.map +1 -0
  212. package/.server/server/plugins/nunjucks/context.js +79 -0
  213. package/.server/server/plugins/nunjucks/context.js.map +1 -0
  214. package/.server/server/plugins/nunjucks/context.test.js +134 -0
  215. package/.server/server/plugins/nunjucks/context.test.js.map +1 -0
  216. package/.server/server/plugins/nunjucks/enviroment.test.js +166 -0
  217. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -0
  218. package/.server/server/plugins/nunjucks/environment.js +95 -0
  219. package/.server/server/plugins/nunjucks/environment.js.map +1 -0
  220. package/.server/server/plugins/nunjucks/filters/answer.js +26 -0
  221. package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -0
  222. package/.server/server/plugins/nunjucks/filters/answer.test.js +70 -0
  223. package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -0
  224. package/.server/server/plugins/nunjucks/filters/evaluate.js +22 -0
  225. package/.server/server/plugins/nunjucks/filters/evaluate.js.map +1 -0
  226. package/.server/server/plugins/nunjucks/filters/field.js +26 -0
  227. package/.server/server/plugins/nunjucks/filters/field.js.map +1 -0
  228. package/.server/server/plugins/nunjucks/filters/field.test.js +64 -0
  229. package/.server/server/plugins/nunjucks/filters/field.test.js.map +1 -0
  230. package/.server/server/plugins/nunjucks/filters/highlight.js +14 -0
  231. package/.server/server/plugins/nunjucks/filters/highlight.js.map +1 -0
  232. package/.server/server/plugins/nunjucks/filters/href.js +28 -0
  233. package/.server/server/plugins/nunjucks/filters/href.js.map +1 -0
  234. package/.server/server/plugins/nunjucks/filters/href.test.js +63 -0
  235. package/.server/server/plugins/nunjucks/filters/href.test.js.map +1 -0
  236. package/.server/server/plugins/nunjucks/filters/index.js +9 -0
  237. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -0
  238. package/.server/server/plugins/nunjucks/filters/inspect.js +16 -0
  239. package/.server/server/plugins/nunjucks/filters/inspect.js.map +1 -0
  240. package/.server/server/plugins/nunjucks/filters/page.js +23 -0
  241. package/.server/server/plugins/nunjucks/filters/page.js.map +1 -0
  242. package/.server/server/plugins/nunjucks/filters/page.test.js +51 -0
  243. package/.server/server/plugins/nunjucks/filters/page.test.js.map +1 -0
  244. package/.server/server/plugins/nunjucks/index.js +4 -0
  245. package/.server/server/plugins/nunjucks/index.js.map +1 -0
  246. package/.server/server/plugins/nunjucks/plugin.js +38 -0
  247. package/.server/server/plugins/nunjucks/plugin.js.map +1 -0
  248. package/.server/server/plugins/nunjucks/render.js +41 -0
  249. package/.server/server/plugins/nunjucks/render.js.map +1 -0
  250. package/.server/server/plugins/nunjucks/types.js +41 -0
  251. package/.server/server/plugins/nunjucks/types.js.map +1 -0
  252. package/.server/server/plugins/pulse.js +8 -0
  253. package/.server/server/plugins/pulse.js.map +1 -0
  254. package/.server/server/plugins/router.js +169 -0
  255. package/.server/server/plugins/router.js.map +1 -0
  256. package/.server/server/plugins/session.js +28 -0
  257. package/.server/server/plugins/session.js.map +1 -0
  258. package/.server/server/routes/health.js +15 -0
  259. package/.server/server/routes/health.js.map +1 -0
  260. package/.server/server/routes/health.test.js +32 -0
  261. package/.server/server/routes/health.test.js.map +1 -0
  262. package/.server/server/routes/index.js +3 -0
  263. package/.server/server/routes/index.js.map +1 -0
  264. package/.server/server/routes/public.js +37 -0
  265. package/.server/server/routes/public.js.map +1 -0
  266. package/.server/server/routes/types.js +14 -0
  267. package/.server/server/routes/types.js.map +1 -0
  268. package/.server/server/schemas/index.js +15 -0
  269. package/.server/server/schemas/index.js.map +1 -0
  270. package/.server/server/secure-context.js +36 -0
  271. package/.server/server/secure-context.js.map +1 -0
  272. package/.server/server/services/cacheService.js +85 -0
  273. package/.server/server/services/cacheService.js.map +1 -0
  274. package/.server/server/services/httpService.js +44 -0
  275. package/.server/server/services/httpService.js.map +1 -0
  276. package/.server/server/services/httpService.test.js +504 -0
  277. package/.server/server/services/httpService.test.js.map +1 -0
  278. package/.server/server/services/index.js +2 -0
  279. package/.server/server/services/index.js.map +1 -0
  280. package/.server/server/types.js +2 -0
  281. package/.server/server/types.js.map +1 -0
  282. package/.server/server/utils/notify.js +40 -0
  283. package/.server/server/utils/notify.js.map +1 -0
  284. package/.server/server/utils/secure-context/get-trust-store-certs.js +7 -0
  285. package/.server/server/utils/secure-context/get-trust-store-certs.js.map +1 -0
  286. package/.server/server/utils/secure-context/get-trust-store-certs.test.js +14 -0
  287. package/.server/server/utils/secure-context/get-trust-store-certs.test.js.map +1 -0
  288. package/.server/server/utils/utils.js +20 -0
  289. package/.server/server/utils/utils.js.map +1 -0
  290. package/.server/server/utils/utils.test.js +49 -0
  291. package/.server/server/utils/utils.test.js.map +1 -0
  292. package/.server/server/views/404.html +16 -0
  293. package/.server/server/views/500.html +19 -0
  294. package/.server/server/views/components/debug/macro.njk +3 -0
  295. package/.server/server/views/components/debug/template.njk +13 -0
  296. package/.server/server/views/components/service-banner/macro.njk +3 -0
  297. package/.server/server/views/components/service-banner/template.njk +20 -0
  298. package/.server/server/views/components/service-banner/template.test.js +36 -0
  299. package/.server/server/views/components/service-banner/template.test.js.map +1 -0
  300. package/.server/server/views/components/tag-env/macro.njk +3 -0
  301. package/.server/server/views/components/tag-env/template.njk +30 -0
  302. package/.server/server/views/components/tag-env/template.test.js +59 -0
  303. package/.server/server/views/components/tag-env/template.test.js.map +1 -0
  304. package/.server/server/views/confirmation.html +19 -0
  305. package/.server/server/views/help/accessibility-statement.html +58 -0
  306. package/.server/server/views/help/cookie-preferences.html +57 -0
  307. package/.server/server/views/help/cookies.html +71 -0
  308. package/.server/server/views/help/get-support.html +37 -0
  309. package/.server/server/views/help/privacy-notice.html +68 -0
  310. package/.server/server/views/help/terms-and-conditions.html +83 -0
  311. package/.server/server/views/layout.html +199 -0
  312. package/.server/server/views/summary.html +50 -0
  313. package/.server/typings/hapi/index.d.js +2 -0
  314. package/.server/typings/hapi/index.d.js.map +1 -0
  315. package/.server/typings/hapi-tracing/index.d.js +2 -0
  316. package/.server/typings/hapi-tracing/index.d.js.map +1 -0
  317. package/.server/typings/index.d.js +2 -0
  318. package/.server/typings/index.d.js.map +1 -0
  319. package/.server/typings/joi/index.d.js +2 -0
  320. package/.server/typings/joi/index.d.js.map +1 -0
  321. package/Dockerfile +61 -0
  322. package/LICENCE +8 -0
  323. package/Procfile +1 -0
  324. package/README.md +87 -0
  325. package/babel.config.cjs +55 -0
  326. package/compose/aws.env +4 -0
  327. package/compose/start-localstack.sh +26 -0
  328. package/docker-compose.yaml +86 -0
  329. package/globals.d.ts +1 -0
  330. package/jest.config.cjs +54 -0
  331. package/jest.environment.js +4 -0
  332. package/jest.setup.cjs +14 -0
  333. package/package.json +163 -0
  334. package/postcss.config.js +26 -0
  335. package/sonar-project.properties +17 -0
  336. package/src/client/javascripts/application.js +87 -0
  337. package/src/client/javascripts/file-upload.js +386 -0
  338. package/src/client/stylesheets/_code.scss +33 -0
  339. package/src/client/stylesheets/_govuk-frontend.scss +4 -0
  340. package/src/client/stylesheets/_prose.scss +56 -0
  341. package/src/client/stylesheets/_service-banner.scss +24 -0
  342. package/src/client/stylesheets/_summary-list.scss +28 -0
  343. package/src/client/stylesheets/_tag-env.scss +24 -0
  344. package/src/client/stylesheets/application.scss +14 -0
  345. package/src/common/cookies.js +58 -0
  346. package/src/common/cookies.test.js +23 -0
  347. package/src/common/types.js +5 -0
  348. package/src/config/index.ts +271 -0
  349. package/src/index.ts +31 -0
  350. package/src/server/common/helpers/logging/logger-options.test.ts +50 -0
  351. package/src/server/common/helpers/logging/logger-options.ts +46 -0
  352. package/src/server/common/helpers/logging/logger.ts +7 -0
  353. package/src/server/common/helpers/logging/request-logger.ts +9 -0
  354. package/src/server/common/helpers/logging/request-tracing.js +10 -0
  355. package/src/server/common/helpers/redis-client.js +70 -0
  356. package/src/server/constants.js +1 -0
  357. package/src/server/forms/README.md +10 -0
  358. package/src/server/forms/components.json +1015 -0
  359. package/src/server/forms/report-a-terrorist.json +270 -0
  360. package/src/server/forms/runner-components-test.json +365 -0
  361. package/src/server/forms/test.json +581 -0
  362. package/src/server/index.test.ts +582 -0
  363. package/src/server/index.ts +140 -0
  364. package/src/server/plugins/blankie.test.ts +73 -0
  365. package/src/server/plugins/blankie.ts +48 -0
  366. package/src/server/plugins/crumb.ts +20 -0
  367. package/src/server/plugins/engine/README.md +87 -0
  368. package/src/server/plugins/engine/components/AutocompleteField.test.ts +294 -0
  369. package/src/server/plugins/engine/components/AutocompleteField.ts +49 -0
  370. package/src/server/plugins/engine/components/CheckboxesField.test.ts +379 -0
  371. package/src/server/plugins/engine/components/CheckboxesField.ts +106 -0
  372. package/src/server/plugins/engine/components/ComponentBase.ts +97 -0
  373. package/src/server/plugins/engine/components/ComponentCollection.ts +278 -0
  374. package/src/server/plugins/engine/components/DatePartsField.test.ts +822 -0
  375. package/src/server/plugins/engine/components/DatePartsField.ts +264 -0
  376. package/src/server/plugins/engine/components/Details.test.ts +49 -0
  377. package/src/server/plugins/engine/components/Details.ts +30 -0
  378. package/src/server/plugins/engine/components/EmailAddressField.test.ts +395 -0
  379. package/src/server/plugins/engine/components/EmailAddressField.ts +55 -0
  380. package/src/server/plugins/engine/components/FileUploadField.test.ts +778 -0
  381. package/src/server/plugins/engine/components/FileUploadField.ts +262 -0
  382. package/src/server/plugins/engine/components/FormComponent.ts +249 -0
  383. package/src/server/plugins/engine/components/Html.test.ts +48 -0
  384. package/src/server/plugins/engine/components/Html.ts +29 -0
  385. package/src/server/plugins/engine/components/InsetText.test.ts +48 -0
  386. package/src/server/plugins/engine/components/InsetText.ts +27 -0
  387. package/src/server/plugins/engine/components/List.test.ts +76 -0
  388. package/src/server/plugins/engine/components/List.ts +72 -0
  389. package/src/server/plugins/engine/components/ListFormComponent.ts +140 -0
  390. package/src/server/plugins/engine/components/MonthYearField.test.ts +567 -0
  391. package/src/server/plugins/engine/components/MonthYearField.ts +222 -0
  392. package/src/server/plugins/engine/components/MultilineTextField.test.ts +558 -0
  393. package/src/server/plugins/engine/components/MultilineTextField.ts +138 -0
  394. package/src/server/plugins/engine/components/NumberField.test.ts +701 -0
  395. package/src/server/plugins/engine/components/NumberField.ts +163 -0
  396. package/src/server/plugins/engine/components/RadiosField.test.ts +288 -0
  397. package/src/server/plugins/engine/components/RadiosField.ts +24 -0
  398. package/src/server/plugins/engine/components/SelectField.test.ts +288 -0
  399. package/src/server/plugins/engine/components/SelectField.ts +47 -0
  400. package/src/server/plugins/engine/components/SelectionControlField.ts +43 -0
  401. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +356 -0
  402. package/src/server/plugins/engine/components/TelephoneNumberField.ts +67 -0
  403. package/src/server/plugins/engine/components/TextField.test.ts +489 -0
  404. package/src/server/plugins/engine/components/TextField.ts +96 -0
  405. package/src/server/plugins/engine/components/UkAddressField.test.ts +623 -0
  406. package/src/server/plugins/engine/components/UkAddressField.ts +172 -0
  407. package/src/server/plugins/engine/components/YesNoField.test.ts +248 -0
  408. package/src/server/plugins/engine/components/YesNoField.ts +31 -0
  409. package/src/server/plugins/engine/components/constants.ts +1 -0
  410. package/src/server/plugins/engine/components/helpers.ts +330 -0
  411. package/src/server/plugins/engine/components/index.ts +24 -0
  412. package/src/server/plugins/engine/components/types.ts +117 -0
  413. package/src/server/plugins/engine/configureEnginePlugin.ts +47 -0
  414. package/src/server/plugins/engine/helpers.test.ts +791 -0
  415. package/src/server/plugins/engine/helpers.ts +379 -0
  416. package/src/server/plugins/engine/index.ts +7 -0
  417. package/src/server/plugins/engine/models/FormModel.test.ts +42 -0
  418. package/src/server/plugins/engine/models/FormModel.ts +443 -0
  419. package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
  420. package/src/server/plugins/engine/models/Section.ts +0 -0
  421. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +209 -0
  422. package/src/server/plugins/engine/models/SummaryViewModel.ts +220 -0
  423. package/src/server/plugins/engine/models/index.ts +2 -0
  424. package/src/server/plugins/engine/models/types.ts +114 -0
  425. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +143 -0
  426. package/src/server/plugins/engine/outputFormatters/human/v1.ts +73 -0
  427. package/src/server/plugins/engine/outputFormatters/index.test.ts +17 -0
  428. package/src/server/plugins/engine/outputFormatters/index.ts +44 -0
  429. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +229 -0
  430. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +140 -0
  431. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +229 -0
  432. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +153 -0
  433. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +1108 -0
  434. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +446 -0
  435. package/src/server/plugins/engine/pageControllers/PageController.test.ts +205 -0
  436. package/src/server/plugins/engine/pageControllers/PageController.ts +176 -0
  437. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +1264 -0
  438. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +561 -0
  439. package/src/server/plugins/engine/pageControllers/README.md +28 -0
  440. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +264 -0
  441. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +458 -0
  442. package/src/server/plugins/engine/pageControllers/StartPageController.ts +18 -0
  443. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +50 -0
  444. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +261 -0
  445. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +28 -0
  446. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +19 -0
  447. package/src/server/plugins/engine/pageControllers/helpers.test.ts +198 -0
  448. package/src/server/plugins/engine/pageControllers/helpers.ts +101 -0
  449. package/src/server/plugins/engine/pageControllers/index.ts +10 -0
  450. package/src/server/plugins/engine/pageControllers/validationOptions.ts +89 -0
  451. package/src/server/plugins/engine/plugin.ts +673 -0
  452. package/src/server/plugins/engine/services/formSubmissionService.js +46 -0
  453. package/src/server/plugins/engine/services/formsService.js +46 -0
  454. package/src/server/plugins/engine/services/formsService.test.js +90 -0
  455. package/src/server/plugins/engine/services/index.js +3 -0
  456. package/src/server/plugins/engine/services/notifyService.test.ts +132 -0
  457. package/src/server/plugins/engine/services/notifyService.ts +64 -0
  458. package/src/server/plugins/engine/services/uploadService.js +60 -0
  459. package/src/server/plugins/engine/types.ts +315 -0
  460. package/src/server/plugins/engine/views/components/autocompletefield.html +5 -0
  461. package/src/server/plugins/engine/views/components/checkboxesfield.html +5 -0
  462. package/src/server/plugins/engine/views/components/datepartsfield.html +5 -0
  463. package/src/server/plugins/engine/views/components/details.html +6 -0
  464. package/src/server/plugins/engine/views/components/emailaddressfield.html +5 -0
  465. package/src/server/plugins/engine/views/components/fileuploadfield-key.html +8 -0
  466. package/src/server/plugins/engine/views/components/fileuploadfield-value.html +3 -0
  467. package/src/server/plugins/engine/views/components/fileuploadfield.html +24 -0
  468. package/src/server/plugins/engine/views/components/html.html +3 -0
  469. package/src/server/plugins/engine/views/components/insettext.html +7 -0
  470. package/src/server/plugins/engine/views/components/list.html +36 -0
  471. package/src/server/plugins/engine/views/components/monthyearfield.html +5 -0
  472. package/src/server/plugins/engine/views/components/multilinetextfield.html +10 -0
  473. package/src/server/plugins/engine/views/components/numberfield.html +5 -0
  474. package/src/server/plugins/engine/views/components/radiosfield.html +5 -0
  475. package/src/server/plugins/engine/views/components/selectfield.html +5 -0
  476. package/src/server/plugins/engine/views/components/telephonenumberfield.html +5 -0
  477. package/src/server/plugins/engine/views/components/textfield.html +5 -0
  478. package/src/server/plugins/engine/views/components/ukaddressfield.html +25 -0
  479. package/src/server/plugins/engine/views/components/yesnofield.html +5 -0
  480. package/src/server/plugins/engine/views/file-upload.html +45 -0
  481. package/src/server/plugins/engine/views/index.html +39 -0
  482. package/src/server/plugins/engine/views/item-delete.html +56 -0
  483. package/src/server/plugins/engine/views/partials/components.html +6 -0
  484. package/src/server/plugins/engine/views/partials/conditional-components.html +3 -0
  485. package/src/server/plugins/engine/views/partials/debug.html +44 -0
  486. package/src/server/plugins/engine/views/partials/form.html +15 -0
  487. package/src/server/plugins/engine/views/partials/heading.html +16 -0
  488. package/src/server/plugins/engine/views/partials/preview-banner.html +32 -0
  489. package/src/server/plugins/engine/views/partials/preview-banner.test.js +122 -0
  490. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +10 -0
  491. package/src/server/plugins/engine/views/repeat-list-summary.html +53 -0
  492. package/src/server/plugins/errorPages.ts +58 -0
  493. package/src/server/plugins/nunjucks/context.js +88 -0
  494. package/src/server/plugins/nunjucks/context.test.js +142 -0
  495. package/src/server/plugins/nunjucks/enviroment.test.js +201 -0
  496. package/src/server/plugins/nunjucks/environment.js +116 -0
  497. package/src/server/plugins/nunjucks/filters/answer.js +27 -0
  498. package/src/server/plugins/nunjucks/filters/answer.test.js +89 -0
  499. package/src/server/plugins/nunjucks/filters/evaluate.js +21 -0
  500. package/src/server/plugins/nunjucks/filters/field.js +28 -0
  501. package/src/server/plugins/nunjucks/filters/field.test.js +75 -0
  502. package/src/server/plugins/nunjucks/filters/highlight.js +11 -0
  503. package/src/server/plugins/nunjucks/filters/href.js +30 -0
  504. package/src/server/plugins/nunjucks/filters/href.test.js +80 -0
  505. package/src/server/plugins/nunjucks/filters/index.js +8 -0
  506. package/src/server/plugins/nunjucks/filters/inspect.js +15 -0
  507. package/src/server/plugins/nunjucks/filters/page.js +24 -0
  508. package/src/server/plugins/nunjucks/filters/page.test.js +65 -0
  509. package/src/server/plugins/nunjucks/index.js +3 -0
  510. package/src/server/plugins/nunjucks/plugin.js +40 -0
  511. package/src/server/plugins/nunjucks/render.js +42 -0
  512. package/src/server/plugins/nunjucks/types.js +40 -0
  513. package/src/server/plugins/pulse.ts +11 -0
  514. package/src/server/plugins/router.ts +201 -0
  515. package/src/server/plugins/session.ts +28 -0
  516. package/src/server/routes/health.js +13 -0
  517. package/src/server/routes/health.test.js +35 -0
  518. package/src/server/routes/index.test.ts +125 -0
  519. package/src/server/routes/index.ts +2 -0
  520. package/src/server/routes/public.ts +47 -0
  521. package/src/server/routes/types.ts +48 -0
  522. package/src/server/schemas/index.ts +34 -0
  523. package/src/server/secure-context.js +43 -0
  524. package/src/server/services/cacheService.test.ts +276 -0
  525. package/src/server/services/cacheService.ts +131 -0
  526. package/src/server/services/httpService.test.js +491 -0
  527. package/src/server/services/httpService.ts +50 -0
  528. package/src/server/services/index.ts +1 -0
  529. package/src/server/types.ts +54 -0
  530. package/src/server/utils/notify.test.ts +37 -0
  531. package/src/server/utils/notify.ts +50 -0
  532. package/src/server/utils/secure-context/get-trust-store-certs.js +11 -0
  533. package/src/server/utils/secure-context/get-trust-store-certs.test.js +19 -0
  534. package/src/server/utils/utils.js +24 -0
  535. package/src/server/utils/utils.test.js +54 -0
  536. package/src/server/views/404.html +16 -0
  537. package/src/server/views/500.html +19 -0
  538. package/src/server/views/components/debug/macro.njk +3 -0
  539. package/src/server/views/components/debug/template.njk +13 -0
  540. package/src/server/views/components/service-banner/macro.njk +3 -0
  541. package/src/server/views/components/service-banner/template.njk +20 -0
  542. package/src/server/views/components/service-banner/template.test.js +43 -0
  543. package/src/server/views/components/tag-env/macro.njk +3 -0
  544. package/src/server/views/components/tag-env/template.njk +30 -0
  545. package/src/server/views/components/tag-env/template.test.js +66 -0
  546. package/src/server/views/confirmation.html +19 -0
  547. package/src/server/views/help/accessibility-statement.html +58 -0
  548. package/src/server/views/help/cookie-preferences.html +57 -0
  549. package/src/server/views/help/cookies.html +71 -0
  550. package/src/server/views/help/get-support.html +37 -0
  551. package/src/server/views/help/privacy-notice.html +68 -0
  552. package/src/server/views/help/terms-and-conditions.html +83 -0
  553. package/src/server/views/layout.html +199 -0
  554. package/src/server/views/summary.html +50 -0
  555. package/src/typings/hapi/index.d.ts +95 -0
  556. package/src/typings/hapi-tracing/index.d.ts +6 -0
  557. package/src/typings/index.d.ts +3 -0
  558. package/src/typings/joi/index.d.ts +22 -0
  559. package/stylelint.config.js +10 -0
  560. package/test/client/javascripts/file-upload.test.js +1197 -0
  561. package/test/condition/checkboxes.test.js +112 -0
  562. package/test/condition/radios.test.js +112 -0
  563. package/test/condition/text.test.js +103 -0
  564. package/test/fixtures/assets-manifest.json +4 -0
  565. package/test/fixtures/form.js +86 -0
  566. package/test/fixtures/index.js +2 -0
  567. package/test/fixtures/list.js +92 -0
  568. package/test/form/cookies.test.js +338 -0
  569. package/test/form/csrf.test.js +87 -0
  570. package/test/form/definitions/basic.js +101 -0
  571. package/test/form/definitions/blank.js +10 -0
  572. package/test/form/definitions/checkboxes.json +88 -0
  573. package/test/form/definitions/components.json +452 -0
  574. package/test/form/definitions/conditional-reveal.js +140 -0
  575. package/test/form/definitions/conditions-basic.js +187 -0
  576. package/test/form/definitions/conditions-complex.js +338 -0
  577. package/test/form/definitions/conditions-dates.js +78 -0
  578. package/test/form/definitions/conditions-escaping.js +143 -0
  579. package/test/form/definitions/demo-cph-number.js +3099 -0
  580. package/test/form/definitions/feedback.json +45 -0
  581. package/test/form/definitions/fields-optional.js +402 -0
  582. package/test/form/definitions/fields-required.js +402 -0
  583. package/test/form/definitions/file-upload-basic.js +44 -0
  584. package/test/form/definitions/file-upload.js +66 -0
  585. package/test/form/definitions/minimal.js +39 -0
  586. package/test/form/definitions/phase-alpha.json +33 -0
  587. package/test/form/definitions/phase-default.json +26 -0
  588. package/test/form/definitions/radios.json +88 -0
  589. package/test/form/definitions/repeat-mixed.js +54 -0
  590. package/test/form/definitions/repeat.js +70 -0
  591. package/test/form/definitions/status.json +126 -0
  592. package/test/form/definitions/templates.js +183 -0
  593. package/test/form/definitions/test.json +581 -0
  594. package/test/form/definitions/text.json +75 -0
  595. package/test/form/definitions/titles.json +170 -0
  596. package/test/form/definitions.test.js +47 -0
  597. package/test/form/exit-page.test.js +210 -0
  598. package/test/form/feedback.test.js +68 -0
  599. package/test/form/fields-optional.test.js +237 -0
  600. package/test/form/fields-required.test.js +294 -0
  601. package/test/form/file-upload.test.js +313 -0
  602. package/test/form/govuk-notify.test.js +449 -0
  603. package/test/form/journey-basic.test.js +444 -0
  604. package/test/form/persist-files.test.js +227 -0
  605. package/test/form/phase-banner.test.js +71 -0
  606. package/test/form/repeat.test.js +628 -0
  607. package/test/form/summary-submission-email.test.js +95 -0
  608. package/test/form/template.test.js +288 -0
  609. package/test/form/titles.test.js +204 -0
  610. package/test/helpers/component-helpers.js +74 -0
  611. package/test/utils/get-cookie.js +42 -0
  612. package/test/utils/get-form-definitions.js +18 -0
  613. package/tmp.pdf +1 -0
  614. package/tsconfig.json +28 -0
  615. package/webpack.config.js +208 -0
@@ -0,0 +1,24 @@
1
+ @use "govuk-frontend" as *;
2
+
3
+ .app-service-banner {
4
+ display: block;
5
+ background: govuk-colour("yellow");
6
+ color: govuk-colour("black");
7
+
8
+ @include govuk-responsive-padding(2, "top");
9
+ @include govuk-responsive-padding(2, "bottom");
10
+
11
+ &__content {
12
+ margin: 0;
13
+ }
14
+
15
+ .govuk-warning-text__text {
16
+ font-weight: $govuk-font-weight-regular;
17
+ }
18
+
19
+ .govuk-skip-link:active + &,
20
+ .govuk-skip-link:focus + & {
21
+ // Ofset service banner from skip link
22
+ margin-top: $govuk-border-width + $govuk-focus-width;
23
+ }
24
+ }
@@ -0,0 +1,28 @@
1
+ @use "govuk-frontend" as *;
2
+
3
+ // Taken from https://github.com/hmrc/hmrc-frontend/blob/main/src/components/summary-list/_summary-list.scss
4
+ @include govuk-media-query($from: tablet) {
5
+ .govuk-summary-list.govuk-summary-list--long-key {
6
+ .govuk-summary-list__row {
7
+ display: flex;
8
+ justify-content: space-between;
9
+ flex-wrap: wrap;
10
+ }
11
+
12
+ .govuk-summary-list__key {
13
+ flex-grow: 1;
14
+ margin-bottom: 0;
15
+ }
16
+
17
+ .govuk-summary-list__actions {
18
+ width: auto;
19
+ margin-bottom: 0;
20
+ }
21
+ }
22
+
23
+ .govuk-summary-list.govuk-summary-list--long-actions {
24
+ .govuk-summary-list__actions {
25
+ width: auto;
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,24 @@
1
+ @use "govuk-frontend" as *;
2
+
3
+ .app-tag--env {
4
+ margin: -6px 0 0;
5
+ vertical-align: top;
6
+
7
+ // Override product name font size
8
+ @include govuk-font-size($size: 16);
9
+
10
+ // Align with product name
11
+ @include govuk-media-query($from: tablet) {
12
+ margin: -3px 0 0;
13
+ }
14
+
15
+ // Override service header alignment
16
+ .cross-service-header & {
17
+ margin: -2px 0 0 govuk-spacing(1);
18
+
19
+ // Align with product name
20
+ @include govuk-media-query($from: tablet) {
21
+ margin: 0 0 0 govuk-spacing(2);
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,14 @@
1
+ @use "govuk-frontend" as *;
2
+ @use "pkg:accessible-autocomplete";
3
+ @use "code";
4
+ @use "prose";
5
+ @use "service-banner";
6
+ @use "summary-list";
7
+ @use "tag-env";
8
+
9
+ // Use default GDS Transport font for autocomplete
10
+ .autocomplete__hint,
11
+ .autocomplete__input,
12
+ .autocomplete__option {
13
+ @include govuk-typography-common;
14
+ }
@@ -0,0 +1,55 @@
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
+ try {
17
+ const encodedValue = decodeURIComponent(value);
18
+
19
+ // eslint-disable-next-line -- Allow JSON type 'any'
20
+ const decodedValue = JSON.parse(encodedValue);
21
+ if (isValidConsent(decodedValue)) {
22
+ cookieConsent = decodedValue;
23
+ } else {
24
+ cookieConsent = defaultConsent;
25
+ }
26
+ } catch {
27
+ cookieConsent = defaultConsent;
28
+ }
29
+ return cookieConsent;
30
+ }
31
+
32
+ /**
33
+ * Serialises the cookie consent policy
34
+ * @param {CookieConsent} consent
35
+ * @returns {string} cookie value
36
+ */
37
+ export function serialiseCookieConsent(consent) {
38
+ return encodeURIComponent(JSON.stringify(consent));
39
+ }
40
+
41
+ /**
42
+ * @param {unknown} consent
43
+ * @returns {consent is CookieConsent}
44
+ */
45
+ function isValidConsent(consent) {
46
+ if (consent === null || Array.isArray(consent)) {
47
+ return false;
48
+ }
49
+ return typeof consent === 'object' && 'analytics' in consent;
50
+ }
51
+
52
+ /**
53
+ * @import {CookieConsent} from '~/src/common/types.js'
54
+ */
55
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","names":["defaultConsent","analytics","dismissed","parseCookieConsent","value","cookieConsent","encodedValue","decodeURIComponent","decodedValue","JSON","parse","isValidConsent","serialiseCookieConsent","consent","encodeURIComponent","stringify","Array","isArray"],"sources":["../../src/common/cookies.js"],"sourcesContent":["/**\n @type {CookieConsent}\n */\nexport const defaultConsent = {\n analytics: null,\n dismissed: false\n}\n\n/**\n * Parses the cookie consent policy\n * @param {string} value\n */\nexport function parseCookieConsent(value) {\n /** @type {CookieConsent} */\n let cookieConsent\n\n try {\n const encodedValue = decodeURIComponent(value)\n\n // eslint-disable-next-line -- Allow JSON type 'any'\n const decodedValue = JSON.parse(encodedValue)\n\n if (isValidConsent(decodedValue)) {\n cookieConsent = decodedValue\n } else {\n cookieConsent = defaultConsent\n }\n } catch {\n cookieConsent = defaultConsent\n }\n\n return cookieConsent\n}\n\n/**\n * Serialises the cookie consent policy\n * @param {CookieConsent} consent\n * @returns {string} cookie value\n */\nexport function serialiseCookieConsent(consent) {\n return encodeURIComponent(JSON.stringify(consent))\n}\n\n/**\n * @param {unknown} consent\n * @returns {consent is CookieConsent}\n */\nfunction isValidConsent(consent) {\n if (consent === null || Array.isArray(consent)) {\n return false\n }\n\n return typeof consent === 'object' && 'analytics' in consent\n}\n\n/**\n * @import {CookieConsent} from '~/src/common/types.js'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA,OAAO,MAAMA,cAAc,GAAG;EAC5BC,SAAS,EAAE,IAAI;EACfC,SAAS,EAAE;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAACC,KAAK,EAAE;EACxC;EACA,IAAIC,aAAa;EAEjB,IAAI;IACF,MAAMC,YAAY,GAAGC,kBAAkB,CAACH,KAAK,CAAC;;IAE9C;IACA,MAAMI,YAAY,GAAGC,IAAI,CAACC,KAAK,CAACJ,YAAY,CAAC;IAE7C,IAAIK,cAAc,CAACH,YAAY,CAAC,EAAE;MAChCH,aAAa,GAAGG,YAAY;IAC9B,CAAC,MAAM;MACLH,aAAa,GAAGL,cAAc;IAChC;EACF,CAAC,CAAC,MAAM;IACNK,aAAa,GAAGL,cAAc;EAChC;EAEA,OAAOK,aAAa;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASO,sBAAsBA,CAACC,OAAO,EAAE;EAC9C,OAAOC,kBAAkB,CAACL,IAAI,CAACM,SAAS,CAACF,OAAO,CAAC,CAAC;AACpD;;AAEA;AACA;AACA;AACA;AACA,SAASF,cAAcA,CAACE,OAAO,EAAE;EAC/B,IAAIA,OAAO,KAAK,IAAI,IAAIG,KAAK,CAACC,OAAO,CAACJ,OAAO,CAAC,EAAE;IAC9C,OAAO,KAAK;EACd;EAEA,OAAO,OAAOA,OAAO,KAAK,QAAQ,IAAI,WAAW,IAAIA,OAAO;AAC9D;;AAEA;AACA;AACA","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ import { parseCookieConsent } from "./cookies.js";
2
+ describe('cookies', () => {
3
+ it('parses a valid policy', () => {
4
+ expect(parseCookieConsent('{"analytics":true}')).toEqual({
5
+ analytics: true
6
+ });
7
+ });
8
+ it.each(["['not', 'an', 'object']", '{{ not: "an object" }}', '{ additional: AAA }', '{ marketing: 100 }', '', 'null'])('converts a malformed policy to the default', value => {
9
+ expect(parseCookieConsent(value)).toEqual({
10
+ analytics: null,
11
+ dismissed: false
12
+ });
13
+ });
14
+ });
15
+ //# sourceMappingURL=cookies.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.test.js","names":["parseCookieConsent","describe","it","expect","toEqual","analytics","each","value","dismissed"],"sources":["../../src/common/cookies.test.js"],"sourcesContent":["import { parseCookieConsent } from '~/src/common/cookies.js'\n\ndescribe('cookies', () => {\n it('parses a valid policy', () => {\n expect(parseCookieConsent('{\"analytics\":true}')).toEqual({\n analytics: true\n })\n })\n\n it.each([\n \"['not', 'an', 'object']\",\n '{{ not: \"an object\" }}',\n '{ additional: AAA }',\n '{ marketing: 100 }',\n '',\n 'null'\n ])('converts a malformed policy to the default', (value) => {\n expect(parseCookieConsent(value)).toEqual({\n analytics: null,\n dismissed: false\n })\n })\n})\n"],"mappings":"AAAA,SAASA,kBAAkB;AAE3BC,QAAQ,CAAC,SAAS,EAAE,MAAM;EACxBC,EAAE,CAAC,uBAAuB,EAAE,MAAM;IAChCC,MAAM,CAACH,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAACI,OAAO,CAAC;MACvDC,SAAS,EAAE;IACb,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFH,EAAE,CAACI,IAAI,CAAC,CACN,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,EAAE,EACF,MAAM,CACP,CAAC,CAAC,4CAA4C,EAAGC,KAAK,IAAK;IAC1DJ,MAAM,CAACH,kBAAkB,CAACO,KAAK,CAAC,CAAC,CAACH,OAAO,CAAC;MACxCC,SAAS,EAAE,IAAI;MACfG,SAAS,EAAE;IACb,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,6 @@
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
+ */
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/common/types.js"],"sourcesContent":["/**\n * @typedef CookieConsent\n * @property {boolean | null} analytics - whether analytics cookies are allowed\n * @property {boolean} dismissed - whether cookie banner has been dismissed\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA","ignoreList":[]}
@@ -0,0 +1,241 @@
1
+ import { resolve } from 'node:path';
2
+ import convict from 'convict';
3
+ import 'dotenv/config';
4
+ const isProduction = process.env.NODE_ENV === 'production';
5
+ const isDev = process.env.NODE_ENV !== 'production';
6
+ const isTest = process.env.NODE_ENV === 'test';
7
+ const oneMinute = 1000 * 60;
8
+ const oneHour = oneMinute * 60;
9
+ export const config = convict({
10
+ appDir: {
11
+ format: String,
12
+ default: resolve(import.meta.dirname, '../server')
13
+ },
14
+ publicDir: {
15
+ format: String,
16
+ default: isTest ? resolve(import.meta.dirname, '../../test/fixtures') : resolve(import.meta.dirname, '../../.public')
17
+ },
18
+ /**
19
+ * Server
20
+ */
21
+ port: {
22
+ format: 'port',
23
+ default: 3009,
24
+ env: 'PORT'
25
+ },
26
+ env: {
27
+ doc: 'The application environment.',
28
+ format: ['production', 'development', 'test'],
29
+ default: 'development',
30
+ env: 'NODE_ENV'
31
+ },
32
+ cdpEnvironment: {
33
+ doc: 'The CDP environment the app is currently in, with the addition of "local"',
34
+ format: ['local', 'infra-dev', 'management', 'dev', 'test', 'perf-test', 'ext-test', 'prod'],
35
+ default: 'local',
36
+ env: 'ENVIRONMENT'
37
+ },
38
+ enforceCsrf: {
39
+ format: Boolean,
40
+ default: isProduction,
41
+ env: 'ENFORCE_CSRF'
42
+ },
43
+ /**
44
+ * Helper flags
45
+ */
46
+ isProduction: {
47
+ doc: 'If this application running in the production environment',
48
+ format: Boolean,
49
+ default: isProduction
50
+ },
51
+ isDevelopment: {
52
+ doc: 'If this application running in the development environment',
53
+ format: Boolean,
54
+ default: isDev
55
+ },
56
+ isTest: {
57
+ doc: 'If this application running in the test environment',
58
+ format: Boolean,
59
+ default: isTest
60
+ },
61
+ /**
62
+ * Service
63
+ */
64
+ serviceName: {
65
+ doc: 'Applications Service Name',
66
+ format: String,
67
+ default: 'Submit a form to Defra'
68
+ },
69
+ serviceVersion: {
70
+ doc: 'The service version, this variable is injected into your docker container in CDP environments',
71
+ format: String,
72
+ nullable: true,
73
+ default: null,
74
+ env: 'SERVICE_VERSION'
75
+ },
76
+ feedbackLink: {
77
+ doc: 'Used in your phase banner. Can be a URL or more commonly mailto mailto:feedback@department.gov.uk',
78
+ format: String,
79
+ default: null,
80
+ env: 'FEEDBACK_LINK'
81
+ },
82
+ phaseTag: {
83
+ format: String,
84
+ default: 'beta',
85
+ // Accepts "alpha" |"beta" | ""
86
+ env: 'PHASE_TAG'
87
+ },
88
+ /**
89
+ * Session storage
90
+ * Redis integration is optional, but recommended for production environments.
91
+ */
92
+ sessionTimeout: {
93
+ format: Number,
94
+ default: oneHour * 24,
95
+ // 1 day
96
+ env: 'SESSION_TIMEOUT'
97
+ },
98
+ confirmationSessionTimeout: {
99
+ format: Number,
100
+ default: oneMinute * 20,
101
+ env: 'CONFIRMATION_SESSION_TIMEOUT'
102
+ },
103
+ sessionCookiePassword: {
104
+ format: String,
105
+ default: null,
106
+ sensitive: true,
107
+ env: 'SESSION_COOKIE_PASSWORD'
108
+ },
109
+ redis: {
110
+ host: {
111
+ doc: 'Redis cache host',
112
+ format: String,
113
+ default: null,
114
+ env: 'REDIS_HOST'
115
+ },
116
+ username: {
117
+ doc: 'Redis cache username',
118
+ format: String,
119
+ default: null,
120
+ env: 'REDIS_USERNAME'
121
+ },
122
+ password: {
123
+ doc: 'Redis cache password',
124
+ format: '*',
125
+ default: null,
126
+ sensitive: true,
127
+ env: 'REDIS_PASSWORD'
128
+ },
129
+ keyPrefix: {
130
+ doc: 'Redis cache key prefix name used to isolate the cached results across multiple clients',
131
+ format: String,
132
+ default: null,
133
+ env: 'REDIS_KEY_PREFIX'
134
+ }
135
+ },
136
+ tracing: {
137
+ header: {
138
+ doc: 'Tracing header name',
139
+ format: String,
140
+ default: 'x-cdp-request-id',
141
+ env: 'TRACING_HEADER'
142
+ }
143
+ },
144
+ /**
145
+ * Email outputs
146
+ * Email outputs will use notify to send an email to a single inbox.
147
+ */
148
+ notifyTemplateId: {
149
+ format: String,
150
+ default: null,
151
+ env: 'NOTIFY_TEMPLATE_ID'
152
+ },
153
+ notifyAPIKey: {
154
+ format: String,
155
+ default: null,
156
+ env: 'NOTIFY_API_KEY'
157
+ },
158
+ /**
159
+ * API integrations
160
+ */
161
+ managerUrl: {
162
+ format: String,
163
+ default: null,
164
+ env: 'MANAGER_URL'
165
+ },
166
+ designerUrl: {
167
+ format: String,
168
+ default: null,
169
+ env: 'DESIGNER_URL'
170
+ },
171
+ submissionUrl: {
172
+ format: String,
173
+ default: null,
174
+ env: 'SUBMISSION_URL'
175
+ },
176
+ uploaderUrl: {
177
+ format: String,
178
+ default: null,
179
+ env: 'UPLOADER_URL'
180
+ },
181
+ uploaderBucketName: {
182
+ format: String,
183
+ default: 'files',
184
+ env: 'UPLOADER_BUCKET_NAME'
185
+ },
186
+ /**
187
+ * Logging
188
+ */
189
+ log: {
190
+ enabled: {
191
+ doc: 'Is logging enabled',
192
+ format: Boolean,
193
+ default: !isTest,
194
+ env: 'LOG_ENABLED'
195
+ },
196
+ level: {
197
+ doc: 'Logging level',
198
+ format: ['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'],
199
+ default: 'info',
200
+ env: 'LOG_LEVEL'
201
+ },
202
+ format: {
203
+ doc: 'Format to output logs in.',
204
+ format: ['ecs', 'pino-pretty'],
205
+ default: isProduction ? 'ecs' : 'pino-pretty',
206
+ env: 'LOG_FORMAT'
207
+ },
208
+ redact: {
209
+ doc: 'Log paths to redact',
210
+ format: Array,
211
+ default: isProduction ? ['req.headers.authorization', 'req.headers.cookie', 'res.headers'] : ['req', 'res', 'responseTime']
212
+ }
213
+ },
214
+ safelist: {
215
+ format: Array,
216
+ default: ['61bca17e-fe74-40e0-9c15-a901ad120eca.mock.pstmn.io'],
217
+ env: 'SAFELIST'
218
+ },
219
+ stagingPrefix: {
220
+ doc: 'Prefix for staging files in S3',
221
+ format: String,
222
+ default: 'staging',
223
+ env: 'STAGING_PREFIX'
224
+ },
225
+ serviceBannerText: {
226
+ doc: 'Service banner text used to show a maintenance message on all pages when set',
227
+ format: String,
228
+ default: '',
229
+ env: 'SERVICE_BANNER_TEXT'
230
+ },
231
+ googleAnalyticsTrackingId: {
232
+ doc: 'Google analytics tracking ID to be used when a user has opted in to additional cookies',
233
+ format: String,
234
+ default: '',
235
+ env: 'GOOGLE_ANALYTICS_TRACKING_ID'
236
+ }
237
+ });
238
+ config.validate({
239
+ allowed: 'strict'
240
+ });
241
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["resolve","convict","isProduction","process","env","NODE_ENV","isDev","isTest","oneMinute","oneHour","config","appDir","format","String","default","import","meta","dirname","publicDir","port","doc","cdpEnvironment","enforceCsrf","Boolean","isDevelopment","serviceName","serviceVersion","nullable","feedbackLink","phaseTag","sessionTimeout","Number","confirmationSessionTimeout","sessionCookiePassword","sensitive","redis","host","username","password","keyPrefix","tracing","header","notifyTemplateId","notifyAPIKey","managerUrl","designerUrl","submissionUrl","uploaderUrl","uploaderBucketName","log","enabled","level","redact","Array","safelist","stagingPrefix","serviceBannerText","googleAnalyticsTrackingId","validate","allowed"],"sources":["../../src/config/index.ts"],"sourcesContent":["import { resolve } from 'node:path'\n\nimport convict, { type SchemaObj } from 'convict'\nimport { type LevelWithSilent } from 'pino'\n\nimport 'dotenv/config'\n\nconst isProduction = process.env.NODE_ENV === 'production'\nconst isDev = process.env.NODE_ENV !== 'production'\nconst isTest = process.env.NODE_ENV === 'test'\n\nconst oneMinute = 1000 * 60\nconst oneHour = oneMinute * 60\n\nexport const config = convict({\n appDir: {\n format: String,\n default: resolve(import.meta.dirname, '../server')\n },\n publicDir: {\n format: String,\n default: isTest\n ? resolve(import.meta.dirname, '../../test/fixtures')\n : resolve(import.meta.dirname, '../../.public')\n },\n\n /**\n * Server\n */\n port: {\n format: 'port',\n default: 3009,\n env: 'PORT'\n },\n env: {\n doc: 'The application environment.',\n format: ['production', 'development', 'test'],\n default: 'development',\n env: 'NODE_ENV'\n },\n cdpEnvironment: {\n doc: 'The CDP environment the app is currently in, with the addition of \"local\"',\n format: [\n 'local',\n 'infra-dev',\n 'management',\n 'dev',\n 'test',\n 'perf-test',\n 'ext-test',\n 'prod'\n ],\n default: 'local',\n env: 'ENVIRONMENT'\n },\n enforceCsrf: {\n format: Boolean,\n default: isProduction,\n env: 'ENFORCE_CSRF'\n },\n\n /**\n * Helper flags\n */\n isProduction: {\n doc: 'If this application running in the production environment',\n format: Boolean,\n default: isProduction\n },\n isDevelopment: {\n doc: 'If this application running in the development environment',\n format: Boolean,\n default: isDev\n },\n isTest: {\n doc: 'If this application running in the test environment',\n format: Boolean,\n default: isTest\n },\n\n /**\n * Service\n */\n serviceName: {\n doc: 'Applications Service Name',\n format: String,\n default: 'Submit a form to Defra'\n },\n serviceVersion: {\n doc: 'The service version, this variable is injected into your docker container in CDP environments',\n format: String,\n nullable: true,\n default: null,\n env: 'SERVICE_VERSION'\n } as SchemaObj<string>,\n feedbackLink: {\n doc: 'Used in your phase banner. Can be a URL or more commonly mailto mailto:feedback@department.gov.uk',\n format: String,\n default: null,\n env: 'FEEDBACK_LINK'\n } as SchemaObj<string>,\n phaseTag: {\n format: String,\n default: 'beta', // Accepts \"alpha\" |\"beta\" | \"\"\n env: 'PHASE_TAG'\n },\n\n /**\n * Session storage\n * Redis integration is optional, but recommended for production environments.\n */\n sessionTimeout: {\n format: Number,\n default: oneHour * 24, // 1 day\n env: 'SESSION_TIMEOUT'\n },\n confirmationSessionTimeout: {\n format: Number,\n default: oneMinute * 20,\n env: 'CONFIRMATION_SESSION_TIMEOUT'\n },\n sessionCookiePassword: {\n format: String,\n default: null,\n sensitive: true,\n env: 'SESSION_COOKIE_PASSWORD'\n } as SchemaObj<string>,\n redis: {\n host: {\n doc: 'Redis cache host',\n format: String,\n default: null,\n env: 'REDIS_HOST'\n } as SchemaObj<string>,\n username: {\n doc: 'Redis cache username',\n format: String,\n default: null,\n env: 'REDIS_USERNAME'\n } as SchemaObj<string>,\n password: {\n doc: 'Redis cache password',\n format: '*',\n default: null,\n sensitive: true,\n env: 'REDIS_PASSWORD'\n } as SchemaObj<string>,\n keyPrefix: {\n doc: 'Redis cache key prefix name used to isolate the cached results across multiple clients',\n format: String,\n default: null,\n env: 'REDIS_KEY_PREFIX'\n } as SchemaObj<string>\n },\n tracing: {\n header: {\n doc: 'Tracing header name',\n format: String,\n default: 'x-cdp-request-id',\n env: 'TRACING_HEADER'\n } as SchemaObj<string>\n },\n\n /**\n * Email outputs\n * Email outputs will use notify to send an email to a single inbox.\n */\n notifyTemplateId: {\n format: String,\n default: null,\n env: 'NOTIFY_TEMPLATE_ID'\n } as SchemaObj<string>,\n notifyAPIKey: {\n format: String,\n default: null,\n env: 'NOTIFY_API_KEY'\n } as SchemaObj<string>,\n\n /**\n * API integrations\n */\n managerUrl: {\n format: String,\n default: null,\n env: 'MANAGER_URL'\n } as SchemaObj<string>,\n\n designerUrl: {\n format: String,\n default: null,\n env: 'DESIGNER_URL'\n } as SchemaObj<string>,\n\n submissionUrl: {\n format: String,\n default: null,\n env: 'SUBMISSION_URL'\n } as SchemaObj<string>,\n\n uploaderUrl: {\n format: String,\n default: null,\n env: 'UPLOADER_URL'\n } as SchemaObj<string>,\n\n uploaderBucketName: {\n format: String,\n default: 'files',\n env: 'UPLOADER_BUCKET_NAME'\n },\n\n /**\n * Logging\n */\n log: {\n enabled: {\n doc: 'Is logging enabled',\n format: Boolean,\n default: !isTest,\n env: 'LOG_ENABLED'\n },\n level: {\n doc: 'Logging level',\n format: ['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'],\n default: 'info',\n env: 'LOG_LEVEL'\n } as SchemaObj<LevelWithSilent>,\n format: {\n doc: 'Format to output logs in.',\n format: ['ecs', 'pino-pretty'],\n default: isProduction ? 'ecs' : 'pino-pretty',\n env: 'LOG_FORMAT'\n } as SchemaObj<'ecs' | 'pino-pretty'>,\n redact: {\n doc: 'Log paths to redact',\n format: Array,\n default: isProduction\n ? ['req.headers.authorization', 'req.headers.cookie', 'res.headers']\n : ['req', 'res', 'responseTime']\n }\n },\n\n safelist: {\n format: Array,\n default: ['61bca17e-fe74-40e0-9c15-a901ad120eca.mock.pstmn.io'],\n env: 'SAFELIST'\n },\n\n stagingPrefix: {\n doc: 'Prefix for staging files in S3',\n format: String,\n default: 'staging',\n env: 'STAGING_PREFIX'\n },\n\n serviceBannerText: {\n doc: 'Service banner text used to show a maintenance message on all pages when set',\n format: String,\n default: '',\n env: 'SERVICE_BANNER_TEXT'\n },\n\n googleAnalyticsTrackingId: {\n doc: 'Google analytics tracking ID to be used when a user has opted in to additional cookies',\n format: String,\n default: '',\n env: 'GOOGLE_ANALYTICS_TRACKING_ID'\n }\n})\n\nconfig.validate({ allowed: 'strict' })\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ import { config } from "./config/index.js";
2
+ import { createLogger } from "./server/common/helpers/logging/logger.js";
3
+ import { createServer } from "./server/index.js";
4
+ const logger = createLogger();
5
+ process.on('unhandledRejection', error => {
6
+ logger.info('Unhandled rejection');
7
+ logger.error(error);
8
+ throw error;
9
+ });
10
+
11
+ /**
12
+ * Main entrypoint to the application.
13
+ */
14
+ async function startServer() {
15
+ const server = await createServer();
16
+ await server.start();
17
+ process.send?.('online');
18
+ server.logger.info('Server started successfully');
19
+ server.logger.info(`Access your frontend on http://localhost:${config.get('port')}`);
20
+ }
21
+ startServer().catch(error => {
22
+ logger.info('Server failed to start :(');
23
+ logger.error(error);
24
+ });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["config","createLogger","createServer","logger","process","on","error","info","startServer","server","start","send","get","catch"],"sources":["../src/index.ts"],"sourcesContent":["import { config } from '~/src/config/index.js'\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport { createServer } from '~/src/server/index.js'\n\nconst logger = createLogger()\n\nprocess.on('unhandledRejection', (error) => {\n logger.info('Unhandled rejection')\n logger.error(error)\n throw error\n})\n\n/**\n * Main entrypoint to the application.\n */\nasync function startServer() {\n const server = await createServer()\n await server.start()\n\n process.send?.('online')\n\n server.logger.info('Server started successfully')\n server.logger.info(\n `Access your frontend on http://localhost:${config.get('port')}`\n )\n}\n\nstartServer().catch((error: unknown) => {\n logger.info('Server failed to start :(')\n logger.error(error)\n})\n"],"mappings":"AAAA,SAASA,MAAM;AACf,SAASC,YAAY;AACrB,SAASC,YAAY;AAErB,MAAMC,MAAM,GAAGF,YAAY,CAAC,CAAC;AAE7BG,OAAO,CAACC,EAAE,CAAC,oBAAoB,EAAGC,KAAK,IAAK;EAC1CH,MAAM,CAACI,IAAI,CAAC,qBAAqB,CAAC;EAClCJ,MAAM,CAACG,KAAK,CAACA,KAAK,CAAC;EACnB,MAAMA,KAAK;AACb,CAAC,CAAC;;AAEF;AACA;AACA;AACA,eAAeE,WAAWA,CAAA,EAAG;EAC3B,MAAMC,MAAM,GAAG,MAAMP,YAAY,CAAC,CAAC;EACnC,MAAMO,MAAM,CAACC,KAAK,CAAC,CAAC;EAEpBN,OAAO,CAACO,IAAI,GAAG,QAAQ,CAAC;EAExBF,MAAM,CAACN,MAAM,CAACI,IAAI,CAAC,6BAA6B,CAAC;EACjDE,MAAM,CAACN,MAAM,CAACI,IAAI,CAChB,4CAA4CP,MAAM,CAACY,GAAG,CAAC,MAAM,CAAC,EAChE,CAAC;AACH;AAEAJ,WAAW,CAAC,CAAC,CAACK,KAAK,CAAEP,KAAc,IAAK;EACtCH,MAAM,CAACI,IAAI,CAAC,2BAA2B,CAAC;EACxCJ,MAAM,CAACG,KAAK,CAACA,KAAK,CAAC;AACrB,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,44 @@
1
+ import { getTraceId } from '@defra/hapi-tracing';
2
+ import { ecsFormat } from '@elastic/ecs-pino-format';
3
+ import { config } from "../../../../config/index.js";
4
+ const logConfig = config.get('log');
5
+ const serviceName = config.get('serviceName');
6
+ const serviceVersion = config.get('serviceVersion');
7
+ const formatters = {
8
+ ecs: {
9
+ ...ecsFormat(),
10
+ base: {
11
+ service: {
12
+ name: serviceName,
13
+ type: 'nodeJs',
14
+ version: serviceVersion
15
+ }
16
+ }
17
+ },
18
+ 'pino-pretty': {
19
+ transport: {
20
+ target: 'pino-pretty'
21
+ }
22
+ }
23
+ };
24
+ export const loggerOptions = {
25
+ enabled: logConfig.enabled,
26
+ ignorePaths: ['/health'],
27
+ redact: {
28
+ paths: logConfig.redact,
29
+ remove: true
30
+ },
31
+ level: logConfig.level,
32
+ ...formatters[logConfig.format],
33
+ mixin() {
34
+ const mixinValues = {};
35
+ const traceId = getTraceId();
36
+ if (traceId) {
37
+ mixinValues.trace = {
38
+ id: traceId
39
+ };
40
+ }
41
+ return mixinValues;
42
+ }
43
+ };
44
+ //# sourceMappingURL=logger-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-options.js","names":["getTraceId","ecsFormat","config","logConfig","get","serviceName","serviceVersion","formatters","ecs","base","service","name","type","version","transport","target","loggerOptions","enabled","ignorePaths","redact","paths","remove","level","format","mixin","mixinValues","traceId","trace","id"],"sources":["../../../../../src/server/common/helpers/logging/logger-options.ts"],"sourcesContent":["import { getTraceId } from '@defra/hapi-tracing'\nimport { ecsFormat } from '@elastic/ecs-pino-format'\nimport { type Options } from 'hapi-pino'\nimport { type LoggerOptions, type TransportSingleOptions } from 'pino'\n\nimport { config } from '~/src/config/index.js'\n\nconst logConfig = config.get('log')\nconst serviceName = config.get('serviceName')\nconst serviceVersion = config.get('serviceVersion')\n\nconst formatters: {\n ecs: Omit<LoggerOptions, 'mixin' | 'transport'>\n 'pino-pretty': { transport: TransportSingleOptions }\n} = {\n ecs: {\n ...ecsFormat(),\n base: {\n service: {\n name: serviceName,\n type: 'nodeJs',\n version: serviceVersion\n }\n }\n },\n 'pino-pretty': { transport: { target: 'pino-pretty' } }\n}\n\nexport const loggerOptions = {\n enabled: logConfig.enabled,\n ignorePaths: ['/health'],\n redact: {\n paths: logConfig.redact,\n remove: true\n },\n level: logConfig.level,\n ...formatters[logConfig.format],\n mixin() {\n const mixinValues: { trace?: { id: string } } = {}\n const traceId = getTraceId()\n if (traceId) {\n mixinValues.trace = { id: traceId }\n }\n return mixinValues\n }\n} satisfies Options\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,qBAAqB;AAChD,SAASC,SAAS,QAAQ,0BAA0B;AAIpD,SAASC,MAAM;AAEf,MAAMC,SAAS,GAAGD,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;AACnC,MAAMC,WAAW,GAAGH,MAAM,CAACE,GAAG,CAAC,aAAa,CAAC;AAC7C,MAAME,cAAc,GAAGJ,MAAM,CAACE,GAAG,CAAC,gBAAgB,CAAC;AAEnD,MAAMG,UAGL,GAAG;EACFC,GAAG,EAAE;IACH,GAAGP,SAAS,CAAC,CAAC;IACdQ,IAAI,EAAE;MACJC,OAAO,EAAE;QACPC,IAAI,EAAEN,WAAW;QACjBO,IAAI,EAAE,QAAQ;QACdC,OAAO,EAAEP;MACX;IACF;EACF,CAAC;EACD,aAAa,EAAE;IAAEQ,SAAS,EAAE;MAAEC,MAAM,EAAE;IAAc;EAAE;AACxD,CAAC;AAED,OAAO,MAAMC,aAAa,GAAG;EAC3BC,OAAO,EAAEd,SAAS,CAACc,OAAO;EAC1BC,WAAW,EAAE,CAAC,SAAS,CAAC;EACxBC,MAAM,EAAE;IACNC,KAAK,EAAEjB,SAAS,CAACgB,MAAM;IACvBE,MAAM,EAAE;EACV,CAAC;EACDC,KAAK,EAAEnB,SAAS,CAACmB,KAAK;EACtB,GAAGf,UAAU,CAACJ,SAAS,CAACoB,MAAM,CAAC;EAC/BC,KAAKA,CAAA,EAAG;IACN,MAAMC,WAAuC,GAAG,CAAC,CAAC;IAClD,MAAMC,OAAO,GAAG1B,UAAU,CAAC,CAAC;IAC5B,IAAI0B,OAAO,EAAE;MACXD,WAAW,CAACE,KAAK,GAAG;QAAEC,EAAE,EAAEF;MAAQ,CAAC;IACrC;IACA,OAAOD,WAAW;EACpB;AACF,CAAmB","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ import { pino } from 'pino';
2
+ import { loggerOptions } from "./logger-options.js";
3
+ export function createLogger() {
4
+ return pino(loggerOptions);
5
+ }
6
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","names":["pino","loggerOptions","createLogger"],"sources":["../../../../../src/server/common/helpers/logging/logger.ts"],"sourcesContent":["import { pino } from 'pino'\n\nimport { loggerOptions } from '~/src/server/common/helpers/logging/logger-options.js'\n\nexport function createLogger() {\n return pino(loggerOptions)\n}\n"],"mappings":"AAAA,SAASA,IAAI,QAAQ,MAAM;AAE3B,SAASC,aAAa;AAEtB,OAAO,SAASC,YAAYA,CAAA,EAAG;EAC7B,OAAOF,IAAI,CAACC,aAAa,CAAC;AAC5B","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import hapiPino from 'hapi-pino';
2
+ import { loggerOptions } from "./logger-options.js";
3
+ export const requestLogger = {
4
+ plugin: hapiPino,
5
+ options: loggerOptions
6
+ };
7
+ //# sourceMappingURL=request-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-logger.js","names":["hapiPino","loggerOptions","requestLogger","plugin","options"],"sources":["../../../../../src/server/common/helpers/logging/request-logger.ts"],"sourcesContent":["import { type ServerRegisterPluginObject } from '@hapi/hapi'\nimport hapiPino, { type Options } from 'hapi-pino'\n\nimport { loggerOptions } from '~/src/server/common/helpers/logging/logger-options.js'\n\nexport const requestLogger = {\n plugin: hapiPino,\n options: loggerOptions\n} satisfies ServerRegisterPluginObject<Options>\n"],"mappings":"AACA,OAAOA,QAAQ,MAAwB,WAAW;AAElD,SAASC,aAAa;AAEtB,OAAO,MAAMC,aAAa,GAAG;EAC3BC,MAAM,EAAEH,QAAQ;EAChBI,OAAO,EAAEH;AACX,CAA+C","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import { tracing } from '@defra/hapi-tracing';
2
+ import { config } from "../../../../config/index.js";
3
+
4
+ // Explicitly declare the expected type
5
+
6
+ export const requestTracing = {
7
+ plugin: tracing,
8
+ options: {
9
+ tracingHeader: config.get('tracing').header
10
+ }
11
+ };
12
+ //# sourceMappingURL=request-tracing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-tracing.js","names":["tracing","config","requestTracing","plugin","options","tracingHeader","get","header"],"sources":["../../../../../src/server/common/helpers/logging/request-tracing.js"],"sourcesContent":["import { tracing } from '@defra/hapi-tracing'\n\nimport { config } from '~/src/config/index.js'\n\n// Explicitly declare the expected type\n\nexport const requestTracing = {\n plugin: tracing,\n options: { tracingHeader: config.get('tracing').header }\n}\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,qBAAqB;AAE7C,SAASC,MAAM;;AAEf;;AAEA,OAAO,MAAMC,cAAc,GAAG;EAC5BC,MAAM,EAAEH,OAAO;EACfI,OAAO,EAAE;IAAEC,aAAa,EAAEJ,MAAM,CAACK,GAAG,CAAC,SAAS,CAAC,CAACC;EAAO;AACzD,CAAC","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ import { Cluster, Redis } from 'ioredis';
2
+ import { config } from "../../../config/index.js";
3
+ import { createLogger } from "./logging/logger.js";
4
+
5
+ /**
6
+ * Setup Redis and provide a redis client
7
+ *
8
+ * Local development - 1 Redis instance
9
+ * Out in the wild - Elasticache / Redis Cluster with username and password
10
+ */
11
+ export function buildRedisClient() {
12
+ const logger = createLogger();
13
+ const port = 6379;
14
+ const db = 0;
15
+ const redisConfig = config.get('redis');
16
+ const keyPrefix = redisConfig.keyPrefix;
17
+ const host = redisConfig.host;
18
+ let redisClient;
19
+ if (!config.get('isProduction')) {
20
+ logger.info('Connecting to Redis using single instance');
21
+ redisClient = new Redis({
22
+ port,
23
+ host,
24
+ db,
25
+ keyPrefix
26
+ });
27
+ } else {
28
+ logger.info('Connecting to Redis using cluster');
29
+ redisClient = new Cluster([{
30
+ host,
31
+ port
32
+ }], {
33
+ keyPrefix,
34
+ slotsRefreshTimeout: 2000,
35
+ dnsLookup: (address, callback) => callback(null, address),
36
+ redisOptions: {
37
+ username: redisConfig.username,
38
+ password: redisConfig.password,
39
+ db,
40
+ tls: {}
41
+ }
42
+ });
43
+ }
44
+ redisClient.on('connect', () => {
45
+ logger.info('Connected to Redis server');
46
+ });
47
+ redisClient.on('close', () => {
48
+ logger.warn('Redis connection closed attempting reconnect with default behavior');
49
+ });
50
+ redisClient.on('error', error => {
51
+ logger.error(error, `Redis connection error ${error}.`);
52
+ });
53
+ return redisClient;
54
+ }
55
+ //# sourceMappingURL=redis-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-client.js","names":["Cluster","Redis","config","createLogger","buildRedisClient","logger","port","db","redisConfig","get","keyPrefix","host","redisClient","info","slotsRefreshTimeout","dnsLookup","address","callback","redisOptions","username","password","tls","on","warn","error"],"sources":["../../../../src/server/common/helpers/redis-client.js"],"sourcesContent":["import { Cluster, Redis } from 'ioredis'\n\nimport { config } from '~/src/config/index.js'\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\n\n/**\n * Setup Redis and provide a redis client\n *\n * Local development - 1 Redis instance\n * Out in the wild - Elasticache / Redis Cluster with username and password\n */\nexport function buildRedisClient() {\n const logger = createLogger()\n\n const port = 6379\n const db = 0\n const redisConfig = config.get('redis')\n const keyPrefix = redisConfig.keyPrefix\n const host = redisConfig.host\n let redisClient\n\n if (!config.get('isProduction')) {\n logger.info('Connecting to Redis using single instance')\n\n redisClient = new Redis({\n port,\n host,\n db,\n keyPrefix\n })\n } else {\n logger.info('Connecting to Redis using cluster')\n\n redisClient = new Cluster(\n [\n {\n host,\n port\n }\n ],\n {\n keyPrefix,\n slotsRefreshTimeout: 2000,\n dnsLookup: (address, callback) => callback(null, address),\n redisOptions: {\n username: redisConfig.username,\n password: redisConfig.password,\n db,\n tls: {}\n }\n }\n )\n }\n\n redisClient.on('connect', () => {\n logger.info('Connected to Redis server')\n })\n\n redisClient.on('close', () => {\n logger.warn(\n 'Redis connection closed attempting reconnect with default behavior'\n )\n })\n\n redisClient.on('error', (error) => {\n logger.error(error, `Redis connection error ${error}.`)\n })\n\n return redisClient\n}\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,KAAK,QAAQ,SAAS;AAExC,SAASC,MAAM;AACf,SAASC,YAAY;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAAA,EAAG;EACjC,MAAMC,MAAM,GAAGF,YAAY,CAAC,CAAC;EAE7B,MAAMG,IAAI,GAAG,IAAI;EACjB,MAAMC,EAAE,GAAG,CAAC;EACZ,MAAMC,WAAW,GAAGN,MAAM,CAACO,GAAG,CAAC,OAAO,CAAC;EACvC,MAAMC,SAAS,GAAGF,WAAW,CAACE,SAAS;EACvC,MAAMC,IAAI,GAAGH,WAAW,CAACG,IAAI;EAC7B,IAAIC,WAAW;EAEf,IAAI,CAACV,MAAM,CAACO,GAAG,CAAC,cAAc,CAAC,EAAE;IAC/BJ,MAAM,CAACQ,IAAI,CAAC,2CAA2C,CAAC;IAExDD,WAAW,GAAG,IAAIX,KAAK,CAAC;MACtBK,IAAI;MACJK,IAAI;MACJJ,EAAE;MACFG;IACF,CAAC,CAAC;EACJ,CAAC,MAAM;IACLL,MAAM,CAACQ,IAAI,CAAC,mCAAmC,CAAC;IAEhDD,WAAW,GAAG,IAAIZ,OAAO,CACvB,CACE;MACEW,IAAI;MACJL;IACF,CAAC,CACF,EACD;MACEI,SAAS;MACTI,mBAAmB,EAAE,IAAI;MACzBC,SAAS,EAAEA,CAACC,OAAO,EAAEC,QAAQ,KAAKA,QAAQ,CAAC,IAAI,EAAED,OAAO,CAAC;MACzDE,YAAY,EAAE;QACZC,QAAQ,EAAEX,WAAW,CAACW,QAAQ;QAC9BC,QAAQ,EAAEZ,WAAW,CAACY,QAAQ;QAC9Bb,EAAE;QACFc,GAAG,EAAE,CAAC;MACR;IACF,CACF,CAAC;EACH;EAEAT,WAAW,CAACU,EAAE,CAAC,SAAS,EAAE,MAAM;IAC9BjB,MAAM,CAACQ,IAAI,CAAC,2BAA2B,CAAC;EAC1C,CAAC,CAAC;EAEFD,WAAW,CAACU,EAAE,CAAC,OAAO,EAAE,MAAM;IAC5BjB,MAAM,CAACkB,IAAI,CACT,oEACF,CAAC;EACH,CAAC,CAAC;EAEFX,WAAW,CAACU,EAAE,CAAC,OAAO,EAAGE,KAAK,IAAK;IACjCnB,MAAM,CAACmB,KAAK,CAACA,KAAK,EAAE,0BAA0BA,KAAK,GAAG,CAAC;EACzD,CAAC,CAAC;EAEF,OAAOZ,WAAW;AACpB","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export const PREVIEW_PATH_PREFIX = '/preview';
2
+ //# sourceMappingURL=constants.js.map