@defra/forms-engine-plugin 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/.public/assets/fonts/bold-affa96571d-v2.woff +0 -0
  2. package/.public/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
  3. package/.public/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
  4. package/.public/assets/fonts/light-f591b13f7d-v2.woff +0 -0
  5. package/.public/assets/images/favicon.ico +0 -0
  6. package/.public/assets/images/favicon.svg +1 -0
  7. package/.public/assets/images/govuk-crest.svg +1 -0
  8. package/.public/assets/images/govuk-icon-180.png +0 -0
  9. package/.public/assets/images/govuk-icon-192.png +0 -0
  10. package/.public/assets/images/govuk-icon-512.png +0 -0
  11. package/.public/assets/images/govuk-icon-mask.svg +1 -0
  12. package/.public/assets/images/govuk-opengraph-image.png +0 -0
  13. package/.public/assets/manifest.json +39 -0
  14. package/.public/assets-manifest.json +24 -0
  15. package/.public/javascripts/application.0fd8c18.min.js +3 -0
  16. package/.public/javascripts/application.0fd8c18.min.js.LICENSE.txt +58 -0
  17. package/.public/javascripts/application.0fd8c18.min.js.map +1 -0
  18. package/.public/javascripts/file-upload.b2f18f5.min.js +2 -0
  19. package/.public/javascripts/file-upload.b2f18f5.min.js.map +1 -0
  20. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js +2 -0
  21. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js.map +1 -0
  22. package/.public/stylesheets/application.e340021.min.css +14 -0
  23. package/.public/stylesheets/application.e340021.min.css.map +1 -0
  24. package/.server/server/plugins/nunjucks/environment.js +3 -3
  25. package/.server/server/plugins/nunjucks/environment.js.map +1 -1
  26. package/package.json +6 -2
  27. package/.browserslistrc +0 -16
  28. package/.editorconfig +0 -9
  29. package/.eslintrc.cjs +0 -266
  30. package/.github/dependabot.yml +0 -85
  31. package/.github/workflows/check-pull-request.yml +0 -209
  32. package/.github/workflows/pr-notifier.yml +0 -98
  33. package/.github/workflows/publish.yml +0 -111
  34. package/.husky/pre-commit +0 -1
  35. package/.lintstagedrc.js +0 -4
  36. package/.nvmrc +0 -1
  37. package/.prettierignore +0 -8
  38. package/.prettierrc.cjs +0 -26
  39. package/Dockerfile +0 -61
  40. package/Procfile +0 -1
  41. package/babel.config.cjs +0 -55
  42. package/compose/aws.env +0 -4
  43. package/compose/start-localstack.sh +0 -26
  44. package/docker-compose.yaml +0 -86
  45. package/globals.d.ts +0 -1
  46. package/jest.config.cjs +0 -54
  47. package/jest.environment.js +0 -4
  48. package/jest.setup.cjs +0 -14
  49. package/postcss.config.js +0 -26
  50. package/sonar-project.properties +0 -17
  51. package/src/client/javascripts/application.js +0 -87
  52. package/src/client/javascripts/file-upload.js +0 -386
  53. package/src/client/stylesheets/_code.scss +0 -33
  54. package/src/client/stylesheets/_govuk-frontend.scss +0 -4
  55. package/src/client/stylesheets/_prose.scss +0 -56
  56. package/src/client/stylesheets/_service-banner.scss +0 -24
  57. package/src/client/stylesheets/_summary-list.scss +0 -28
  58. package/src/client/stylesheets/_tag-env.scss +0 -24
  59. package/src/client/stylesheets/application.scss +0 -14
  60. package/src/common/cookies.js +0 -58
  61. package/src/common/cookies.test.js +0 -23
  62. package/src/common/types.js +0 -5
  63. package/src/config/index.ts +0 -271
  64. package/src/index.ts +0 -31
  65. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  66. package/src/server/common/helpers/logging/logger-options.ts +0 -46
  67. package/src/server/common/helpers/logging/logger.ts +0 -7
  68. package/src/server/common/helpers/logging/request-logger.ts +0 -9
  69. package/src/server/common/helpers/logging/request-tracing.js +0 -10
  70. package/src/server/common/helpers/redis-client.js +0 -70
  71. package/src/server/constants.js +0 -1
  72. package/src/server/forms/README.md +0 -10
  73. package/src/server/forms/components.json +0 -1015
  74. package/src/server/forms/report-a-terrorist.json +0 -270
  75. package/src/server/forms/runner-components-test.json +0 -365
  76. package/src/server/forms/test.json +0 -581
  77. package/src/server/index.test.ts +0 -582
  78. package/src/server/index.ts +0 -140
  79. package/src/server/plugins/blankie.test.ts +0 -73
  80. package/src/server/plugins/blankie.ts +0 -48
  81. package/src/server/plugins/crumb.ts +0 -20
  82. package/src/server/plugins/engine/README.md +0 -87
  83. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -294
  84. package/src/server/plugins/engine/components/AutocompleteField.ts +0 -49
  85. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -379
  86. package/src/server/plugins/engine/components/CheckboxesField.ts +0 -106
  87. package/src/server/plugins/engine/components/ComponentBase.ts +0 -97
  88. package/src/server/plugins/engine/components/ComponentCollection.ts +0 -278
  89. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -822
  90. package/src/server/plugins/engine/components/DatePartsField.ts +0 -264
  91. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  92. package/src/server/plugins/engine/components/Details.ts +0 -30
  93. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -395
  94. package/src/server/plugins/engine/components/EmailAddressField.ts +0 -55
  95. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -778
  96. package/src/server/plugins/engine/components/FileUploadField.ts +0 -262
  97. package/src/server/plugins/engine/components/FormComponent.ts +0 -249
  98. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  99. package/src/server/plugins/engine/components/Html.ts +0 -29
  100. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  101. package/src/server/plugins/engine/components/InsetText.ts +0 -27
  102. package/src/server/plugins/engine/components/List.test.ts +0 -76
  103. package/src/server/plugins/engine/components/List.ts +0 -72
  104. package/src/server/plugins/engine/components/ListFormComponent.ts +0 -140
  105. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -567
  106. package/src/server/plugins/engine/components/MonthYearField.ts +0 -222
  107. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -558
  108. package/src/server/plugins/engine/components/MultilineTextField.ts +0 -138
  109. package/src/server/plugins/engine/components/NumberField.test.ts +0 -701
  110. package/src/server/plugins/engine/components/NumberField.ts +0 -163
  111. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -288
  112. package/src/server/plugins/engine/components/RadiosField.ts +0 -24
  113. package/src/server/plugins/engine/components/SelectField.test.ts +0 -288
  114. package/src/server/plugins/engine/components/SelectField.ts +0 -47
  115. package/src/server/plugins/engine/components/SelectionControlField.ts +0 -43
  116. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -356
  117. package/src/server/plugins/engine/components/TelephoneNumberField.ts +0 -67
  118. package/src/server/plugins/engine/components/TextField.test.ts +0 -489
  119. package/src/server/plugins/engine/components/TextField.ts +0 -96
  120. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -623
  121. package/src/server/plugins/engine/components/UkAddressField.ts +0 -172
  122. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -248
  123. package/src/server/plugins/engine/components/YesNoField.ts +0 -31
  124. package/src/server/plugins/engine/components/constants.ts +0 -1
  125. package/src/server/plugins/engine/components/helpers.ts +0 -330
  126. package/src/server/plugins/engine/components/index.ts +0 -24
  127. package/src/server/plugins/engine/components/types.ts +0 -117
  128. package/src/server/plugins/engine/configureEnginePlugin.ts +0 -47
  129. package/src/server/plugins/engine/helpers.test.ts +0 -791
  130. package/src/server/plugins/engine/helpers.ts +0 -379
  131. package/src/server/plugins/engine/index.ts +0 -7
  132. package/src/server/plugins/engine/models/FormModel.test.ts +0 -42
  133. package/src/server/plugins/engine/models/FormModel.ts +0 -443
  134. package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
  135. package/src/server/plugins/engine/models/Section.ts +0 -0
  136. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -209
  137. package/src/server/plugins/engine/models/SummaryViewModel.ts +0 -220
  138. package/src/server/plugins/engine/models/index.ts +0 -2
  139. package/src/server/plugins/engine/models/types.ts +0 -114
  140. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -143
  141. package/src/server/plugins/engine/outputFormatters/human/v1.ts +0 -73
  142. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  143. package/src/server/plugins/engine/outputFormatters/index.ts +0 -44
  144. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -229
  145. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +0 -140
  146. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -229
  147. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +0 -153
  148. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1108
  149. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +0 -446
  150. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -205
  151. package/src/server/plugins/engine/pageControllers/PageController.ts +0 -176
  152. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1264
  153. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +0 -561
  154. package/src/server/plugins/engine/pageControllers/README.md +0 -28
  155. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -264
  156. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +0 -458
  157. package/src/server/plugins/engine/pageControllers/StartPageController.ts +0 -18
  158. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +0 -50
  159. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +0 -261
  160. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -28
  161. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +0 -19
  162. package/src/server/plugins/engine/pageControllers/helpers.test.ts +0 -198
  163. package/src/server/plugins/engine/pageControllers/helpers.ts +0 -101
  164. package/src/server/plugins/engine/pageControllers/index.ts +0 -10
  165. package/src/server/plugins/engine/pageControllers/validationOptions.ts +0 -89
  166. package/src/server/plugins/engine/plugin.ts +0 -673
  167. package/src/server/plugins/engine/services/formSubmissionService.js +0 -46
  168. package/src/server/plugins/engine/services/formsService.js +0 -46
  169. package/src/server/plugins/engine/services/formsService.test.js +0 -90
  170. package/src/server/plugins/engine/services/index.js +0 -3
  171. package/src/server/plugins/engine/services/notifyService.test.ts +0 -132
  172. package/src/server/plugins/engine/services/notifyService.ts +0 -64
  173. package/src/server/plugins/engine/services/uploadService.js +0 -60
  174. package/src/server/plugins/engine/types.ts +0 -315
  175. package/src/server/plugins/engine/views/components/autocompletefield.html +0 -5
  176. package/src/server/plugins/engine/views/components/checkboxesfield.html +0 -5
  177. package/src/server/plugins/engine/views/components/datepartsfield.html +0 -5
  178. package/src/server/plugins/engine/views/components/details.html +0 -6
  179. package/src/server/plugins/engine/views/components/emailaddressfield.html +0 -5
  180. package/src/server/plugins/engine/views/components/fileuploadfield-key.html +0 -8
  181. package/src/server/plugins/engine/views/components/fileuploadfield-value.html +0 -3
  182. package/src/server/plugins/engine/views/components/fileuploadfield.html +0 -24
  183. package/src/server/plugins/engine/views/components/html.html +0 -3
  184. package/src/server/plugins/engine/views/components/insettext.html +0 -7
  185. package/src/server/plugins/engine/views/components/list.html +0 -36
  186. package/src/server/plugins/engine/views/components/monthyearfield.html +0 -5
  187. package/src/server/plugins/engine/views/components/multilinetextfield.html +0 -10
  188. package/src/server/plugins/engine/views/components/numberfield.html +0 -5
  189. package/src/server/plugins/engine/views/components/radiosfield.html +0 -5
  190. package/src/server/plugins/engine/views/components/selectfield.html +0 -5
  191. package/src/server/plugins/engine/views/components/telephonenumberfield.html +0 -5
  192. package/src/server/plugins/engine/views/components/textfield.html +0 -5
  193. package/src/server/plugins/engine/views/components/ukaddressfield.html +0 -25
  194. package/src/server/plugins/engine/views/components/yesnofield.html +0 -5
  195. package/src/server/plugins/engine/views/file-upload.html +0 -45
  196. package/src/server/plugins/engine/views/index.html +0 -39
  197. package/src/server/plugins/engine/views/item-delete.html +0 -56
  198. package/src/server/plugins/engine/views/partials/components.html +0 -6
  199. package/src/server/plugins/engine/views/partials/conditional-components.html +0 -3
  200. package/src/server/plugins/engine/views/partials/debug.html +0 -44
  201. package/src/server/plugins/engine/views/partials/form.html +0 -15
  202. package/src/server/plugins/engine/views/partials/heading.html +0 -16
  203. package/src/server/plugins/engine/views/partials/preview-banner.html +0 -32
  204. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  205. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +0 -10
  206. package/src/server/plugins/engine/views/repeat-list-summary.html +0 -53
  207. package/src/server/plugins/errorPages.ts +0 -58
  208. package/src/server/plugins/nunjucks/context.js +0 -88
  209. package/src/server/plugins/nunjucks/context.test.js +0 -142
  210. package/src/server/plugins/nunjucks/enviroment.test.js +0 -201
  211. package/src/server/plugins/nunjucks/environment.js +0 -116
  212. package/src/server/plugins/nunjucks/filters/answer.js +0 -27
  213. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -89
  214. package/src/server/plugins/nunjucks/filters/evaluate.js +0 -21
  215. package/src/server/plugins/nunjucks/filters/field.js +0 -28
  216. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  217. package/src/server/plugins/nunjucks/filters/highlight.js +0 -11
  218. package/src/server/plugins/nunjucks/filters/href.js +0 -30
  219. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  220. package/src/server/plugins/nunjucks/filters/index.js +0 -8
  221. package/src/server/plugins/nunjucks/filters/inspect.js +0 -15
  222. package/src/server/plugins/nunjucks/filters/page.js +0 -24
  223. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  224. package/src/server/plugins/nunjucks/index.js +0 -3
  225. package/src/server/plugins/nunjucks/plugin.js +0 -40
  226. package/src/server/plugins/nunjucks/render.js +0 -42
  227. package/src/server/plugins/nunjucks/types.js +0 -40
  228. package/src/server/plugins/pulse.ts +0 -11
  229. package/src/server/plugins/router.ts +0 -201
  230. package/src/server/plugins/session.ts +0 -28
  231. package/src/server/routes/health.js +0 -13
  232. package/src/server/routes/health.test.js +0 -35
  233. package/src/server/routes/index.test.ts +0 -125
  234. package/src/server/routes/index.ts +0 -2
  235. package/src/server/routes/public.ts +0 -47
  236. package/src/server/routes/types.ts +0 -48
  237. package/src/server/schemas/index.ts +0 -34
  238. package/src/server/secure-context.js +0 -43
  239. package/src/server/services/cacheService.test.ts +0 -276
  240. package/src/server/services/cacheService.ts +0 -131
  241. package/src/server/services/httpService.test.js +0 -491
  242. package/src/server/services/httpService.ts +0 -50
  243. package/src/server/services/index.ts +0 -1
  244. package/src/server/types.ts +0 -54
  245. package/src/server/utils/notify.test.ts +0 -37
  246. package/src/server/utils/notify.ts +0 -50
  247. package/src/server/utils/secure-context/get-trust-store-certs.js +0 -11
  248. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  249. package/src/server/utils/utils.js +0 -24
  250. package/src/server/utils/utils.test.js +0 -54
  251. package/src/server/views/404.html +0 -16
  252. package/src/server/views/500.html +0 -19
  253. package/src/server/views/components/debug/macro.njk +0 -3
  254. package/src/server/views/components/debug/template.njk +0 -13
  255. package/src/server/views/components/service-banner/macro.njk +0 -3
  256. package/src/server/views/components/service-banner/template.njk +0 -20
  257. package/src/server/views/components/service-banner/template.test.js +0 -43
  258. package/src/server/views/components/tag-env/macro.njk +0 -3
  259. package/src/server/views/components/tag-env/template.njk +0 -30
  260. package/src/server/views/components/tag-env/template.test.js +0 -66
  261. package/src/server/views/confirmation.html +0 -19
  262. package/src/server/views/help/accessibility-statement.html +0 -58
  263. package/src/server/views/help/cookie-preferences.html +0 -57
  264. package/src/server/views/help/cookies.html +0 -71
  265. package/src/server/views/help/get-support.html +0 -37
  266. package/src/server/views/help/privacy-notice.html +0 -68
  267. package/src/server/views/help/terms-and-conditions.html +0 -83
  268. package/src/server/views/layout.html +0 -199
  269. package/src/server/views/summary.html +0 -50
  270. package/src/typings/hapi/index.d.ts +0 -95
  271. package/src/typings/hapi-tracing/index.d.ts +0 -6
  272. package/src/typings/index.d.ts +0 -3
  273. package/src/typings/joi/index.d.ts +0 -22
  274. package/stylelint.config.js +0 -10
  275. package/test/client/javascripts/file-upload.test.js +0 -1197
  276. package/test/condition/checkboxes.test.js +0 -112
  277. package/test/condition/radios.test.js +0 -112
  278. package/test/condition/text.test.js +0 -103
  279. package/test/fixtures/assets-manifest.json +0 -4
  280. package/test/fixtures/form.js +0 -86
  281. package/test/fixtures/index.js +0 -2
  282. package/test/fixtures/list.js +0 -92
  283. package/test/form/cookies.test.js +0 -338
  284. package/test/form/csrf.test.js +0 -87
  285. package/test/form/definitions/basic.js +0 -101
  286. package/test/form/definitions/blank.js +0 -10
  287. package/test/form/definitions/checkboxes.json +0 -88
  288. package/test/form/definitions/components.json +0 -452
  289. package/test/form/definitions/conditional-reveal.js +0 -140
  290. package/test/form/definitions/conditions-basic.js +0 -187
  291. package/test/form/definitions/conditions-complex.js +0 -338
  292. package/test/form/definitions/conditions-dates.js +0 -78
  293. package/test/form/definitions/conditions-escaping.js +0 -143
  294. package/test/form/definitions/demo-cph-number.js +0 -3099
  295. package/test/form/definitions/feedback.json +0 -45
  296. package/test/form/definitions/fields-optional.js +0 -402
  297. package/test/form/definitions/fields-required.js +0 -402
  298. package/test/form/definitions/file-upload-basic.js +0 -44
  299. package/test/form/definitions/file-upload.js +0 -66
  300. package/test/form/definitions/minimal.js +0 -39
  301. package/test/form/definitions/phase-alpha.json +0 -33
  302. package/test/form/definitions/phase-default.json +0 -26
  303. package/test/form/definitions/radios.json +0 -88
  304. package/test/form/definitions/repeat-mixed.js +0 -54
  305. package/test/form/definitions/repeat.js +0 -70
  306. package/test/form/definitions/status.json +0 -126
  307. package/test/form/definitions/templates.js +0 -183
  308. package/test/form/definitions/test.json +0 -581
  309. package/test/form/definitions/text.json +0 -75
  310. package/test/form/definitions/titles.json +0 -170
  311. package/test/form/definitions.test.js +0 -47
  312. package/test/form/exit-page.test.js +0 -210
  313. package/test/form/feedback.test.js +0 -68
  314. package/test/form/fields-optional.test.js +0 -237
  315. package/test/form/fields-required.test.js +0 -294
  316. package/test/form/file-upload.test.js +0 -313
  317. package/test/form/govuk-notify.test.js +0 -449
  318. package/test/form/journey-basic.test.js +0 -444
  319. package/test/form/persist-files.test.js +0 -227
  320. package/test/form/phase-banner.test.js +0 -71
  321. package/test/form/repeat.test.js +0 -628
  322. package/test/form/summary-submission-email.test.js +0 -95
  323. package/test/form/template.test.js +0 -288
  324. package/test/form/titles.test.js +0 -204
  325. package/test/helpers/component-helpers.js +0 -74
  326. package/test/utils/get-cookie.js +0 -42
  327. package/test/utils/get-form-definitions.js +0 -18
  328. package/tmp.pdf +0 -1
  329. package/tsconfig.json +0 -28
  330. package/webpack.config.js +0 -208
@@ -1,491 +0,0 @@
1
- import { getTraceId } from '@defra/hapi-tracing'
2
- import Boom from '@hapi/boom'
3
- import Wreck from '@hapi/wreck'
4
- import { StatusCodes } from 'http-status-codes'
5
-
6
- import {
7
- get,
8
- getJson,
9
- post,
10
- postJson,
11
- put
12
- } from '~/src/server/services/httpService.js'
13
-
14
- jest.mock('@defra/hapi-tracing')
15
-
16
- describe('HTTP service', () => {
17
- /** @type {RequestOptions} */
18
- let authOptions
19
- /** @type {RequestOptions} */
20
- let blankOptions
21
- /** @type {RequestOptions} */
22
- let timeoutOptions
23
-
24
- beforeEach(() => {
25
- authOptions = {
26
- headers: { Authorization: 'Bearer ey56yDSASDFfbgcbc' }
27
- }
28
- blankOptions = {}
29
- timeoutOptions = {
30
- timeout: 5000
31
- }
32
- })
33
-
34
- describe('GET', () => {
35
- beforeEach(() => {
36
- jest.spyOn(Wreck, 'get').mockResolvedValue({
37
- res: /** @type {IncomingMessage} */ ({
38
- statusCode: StatusCodes.OK
39
- }),
40
- payload: undefined
41
- })
42
- })
43
-
44
- it('passes headers', async () => {
45
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
46
- await expect(get('/test', blankOptions)).resolves.toEqual({
47
- res: { statusCode: StatusCodes.OK }
48
- })
49
-
50
- expect(Wreck.get).toHaveBeenCalledWith('/test', {
51
- headers: { 'x-cdp-request-id': 'my-trace-id' }
52
- })
53
- })
54
-
55
- it('passes additional headers', async () => {
56
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
57
- await expect(get('/test', authOptions)).resolves.toEqual({
58
- res: { statusCode: StatusCodes.OK }
59
- })
60
-
61
- expect(Wreck.get).toHaveBeenCalledWith('/test', {
62
- headers: {
63
- Authorization: 'Bearer ey56yDSASDFfbgcbc',
64
- 'x-cdp-request-id': 'my-trace-id'
65
- }
66
- })
67
- })
68
-
69
- it('passes non headers options', async () => {
70
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
71
- await expect(get('/test', timeoutOptions)).resolves.toEqual({
72
- res: { statusCode: StatusCodes.OK }
73
- })
74
-
75
- expect(Wreck.get).toHaveBeenCalledWith('/test', {
76
- headers: {
77
- 'x-cdp-request-id': 'my-trace-id'
78
- },
79
- timeout: 5000
80
- })
81
- })
82
-
83
- it('sends request', async () => {
84
- await expect(get('/test', blankOptions)).resolves.toEqual({
85
- res: { statusCode: StatusCodes.OK }
86
- })
87
-
88
- expect(Wreck.get).toHaveBeenCalledWith('/test', {})
89
- })
90
-
91
- it('sends request as JSON', async () => {
92
- await expect(getJson('/test')).resolves.toEqual({
93
- res: { statusCode: StatusCodes.OK }
94
- })
95
-
96
- expect(Wreck.get).toHaveBeenCalledWith('/test', { json: true })
97
- })
98
- })
99
-
100
- describe('GET (with error)', () => {
101
- const error = Boom.notFound()
102
-
103
- beforeEach(() => {
104
- jest.spyOn(Wreck, 'get').mockResolvedValue({
105
- res: /** @type {IncomingMessage} */ ({
106
- statusCode: StatusCodes.NOT_FOUND
107
- }),
108
- payload: error
109
- })
110
- })
111
-
112
- it('passes headers', async () => {
113
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
114
- await expect(get('/error', blankOptions)).resolves.toEqual({
115
- res: { statusCode: StatusCodes.NOT_FOUND },
116
- error
117
- })
118
-
119
- expect(Wreck.get).toHaveBeenCalledWith('/error', {
120
- headers: { 'x-cdp-request-id': 'my-trace-id' }
121
- })
122
- })
123
-
124
- it('passes additional headers', async () => {
125
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
126
- await expect(get('/error', authOptions)).resolves.toEqual({
127
- res: { statusCode: StatusCodes.NOT_FOUND },
128
- error
129
- })
130
-
131
- expect(Wreck.get).toHaveBeenCalledWith('/error', {
132
- headers: {
133
- Authorization: 'Bearer ey56yDSASDFfbgcbc',
134
- 'x-cdp-request-id': 'my-trace-id'
135
- }
136
- })
137
- })
138
-
139
- it('passes non headers options', async () => {
140
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
141
- await expect(get('/error', timeoutOptions)).resolves.toEqual({
142
- res: { statusCode: StatusCodes.NOT_FOUND },
143
- error
144
- })
145
-
146
- expect(Wreck.get).toHaveBeenCalledWith('/error', {
147
- headers: {
148
- 'x-cdp-request-id': 'my-trace-id'
149
- },
150
- timeout: 5000
151
- })
152
- })
153
-
154
- it('sends request (with error)', async () => {
155
- await expect(get('/error', blankOptions)).resolves.toEqual({
156
- res: { statusCode: StatusCodes.NOT_FOUND },
157
- error
158
- })
159
-
160
- expect(Wreck.get).toHaveBeenCalledWith('/error', {})
161
- })
162
-
163
- it('sends request as JSON (with error)', async () => {
164
- await expect(getJson('/error')).resolves.toEqual({
165
- res: { statusCode: StatusCodes.NOT_FOUND },
166
- error
167
- })
168
-
169
- expect(Wreck.get).toHaveBeenCalledWith('/error', { json: true })
170
- })
171
-
172
- it('sends request (unknown error)', async () => {
173
- jest.spyOn(Wreck, 'get').mockResolvedValue({
174
- res: /** @type {IncomingMessage} */ ({
175
- statusCode: StatusCodes.NOT_FOUND
176
- }),
177
- payload: undefined
178
- })
179
-
180
- await expect(get('/error', blankOptions)).resolves.toEqual({
181
- res: { statusCode: StatusCodes.NOT_FOUND },
182
- error: new Error('Unknown error')
183
- })
184
-
185
- expect(Wreck.get).toHaveBeenCalledWith('/error', {})
186
- })
187
- })
188
-
189
- describe('POST', () => {
190
- beforeEach(() => {
191
- jest.spyOn(Wreck, 'post').mockResolvedValue({
192
- res: /** @type {IncomingMessage} */ ({
193
- statusCode: StatusCodes.OK
194
- }),
195
- payload: { reference: '1234' }
196
- })
197
- })
198
-
199
- it('passes headers', async () => {
200
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
201
- await expect(post('/test', blankOptions)).resolves.toEqual({
202
- res: { statusCode: StatusCodes.OK },
203
- payload: { reference: '1234' }
204
- })
205
-
206
- expect(Wreck.post).toHaveBeenCalledWith('/test', {
207
- headers: { 'x-cdp-request-id': 'my-trace-id' }
208
- })
209
- })
210
-
211
- it('passes additonal headers', async () => {
212
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
213
- await expect(post('/test', authOptions)).resolves.toEqual({
214
- res: { statusCode: StatusCodes.OK },
215
- payload: { reference: '1234' }
216
- })
217
-
218
- expect(Wreck.post).toHaveBeenCalledWith('/test', {
219
- headers: {
220
- Authorization: 'Bearer ey56yDSASDFfbgcbc',
221
- 'x-cdp-request-id': 'my-trace-id'
222
- }
223
- })
224
- })
225
-
226
- it('passes non headers options', async () => {
227
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
228
- await expect(post('/test', timeoutOptions)).resolves.toEqual({
229
- res: { statusCode: StatusCodes.OK },
230
- payload: { reference: '1234' }
231
- })
232
-
233
- expect(Wreck.post).toHaveBeenCalledWith('/test', {
234
- headers: {
235
- 'x-cdp-request-id': 'my-trace-id'
236
- },
237
- timeout: 5000
238
- })
239
- })
240
-
241
- it('sends request', async () => {
242
- await expect(post('/test', blankOptions)).resolves.toEqual({
243
- res: { statusCode: StatusCodes.OK },
244
- payload: { reference: '1234' }
245
- })
246
-
247
- expect(Wreck.post).toHaveBeenCalledWith('/test', {})
248
- })
249
-
250
- it('sends request as JSON', async () => {
251
- await expect(postJson('/test', blankOptions)).resolves.toEqual({
252
- res: { statusCode: StatusCodes.OK },
253
- payload: { reference: '1234' }
254
- })
255
-
256
- expect(Wreck.post).toHaveBeenCalledWith('/test', { json: true })
257
- })
258
- })
259
-
260
- describe('POST (with error)', () => {
261
- const error = Boom.notFound()
262
-
263
- beforeEach(() => {
264
- jest.spyOn(Wreck, 'post').mockResolvedValue({
265
- res: /** @type {IncomingMessage} */ ({
266
- statusCode: StatusCodes.NOT_FOUND
267
- }),
268
- payload: error
269
- })
270
- })
271
-
272
- it('passes headers', async () => {
273
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
274
- await expect(post('/error', blankOptions)).resolves.toEqual({
275
- res: { statusCode: StatusCodes.NOT_FOUND },
276
- error
277
- })
278
-
279
- expect(Wreck.post).toHaveBeenCalledWith('/error', {
280
- headers: { 'x-cdp-request-id': 'my-trace-id' }
281
- })
282
- })
283
-
284
- it('passes additional headers', async () => {
285
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
286
- await expect(post('/error', authOptions)).resolves.toEqual({
287
- res: { statusCode: StatusCodes.NOT_FOUND },
288
- error
289
- })
290
-
291
- expect(Wreck.post).toHaveBeenCalledWith('/error', {
292
- headers: {
293
- Authorization: 'Bearer ey56yDSASDFfbgcbc',
294
- 'x-cdp-request-id': 'my-trace-id'
295
- }
296
- })
297
- })
298
-
299
- it('passes non headers options', async () => {
300
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
301
- await expect(post('/error', timeoutOptions)).resolves.toEqual({
302
- res: { statusCode: StatusCodes.NOT_FOUND },
303
- error
304
- })
305
-
306
- expect(Wreck.post).toHaveBeenCalledWith('/error', {
307
- headers: {
308
- 'x-cdp-request-id': 'my-trace-id'
309
- },
310
- timeout: 5000
311
- })
312
- })
313
-
314
- it('sends request (with error)', async () => {
315
- await expect(post('/error', blankOptions)).resolves.toEqual({
316
- res: { statusCode: StatusCodes.NOT_FOUND },
317
- error
318
- })
319
-
320
- expect(Wreck.post).toHaveBeenCalledWith('/error', {})
321
- })
322
-
323
- it('sends request as JSON (with error)', async () => {
324
- await expect(postJson('/error', blankOptions)).resolves.toEqual({
325
- res: { statusCode: StatusCodes.NOT_FOUND },
326
- error
327
- })
328
-
329
- expect(Wreck.post).toHaveBeenCalledWith('/error', { json: true })
330
- })
331
-
332
- it('sends request (unknown error)', async () => {
333
- jest.spyOn(Wreck, 'post').mockResolvedValue({
334
- res: /** @type {IncomingMessage} */ ({
335
- statusCode: StatusCodes.NOT_FOUND
336
- }),
337
- payload: undefined
338
- })
339
-
340
- await expect(post('/error', blankOptions)).resolves.toEqual({
341
- res: { statusCode: StatusCodes.NOT_FOUND },
342
- error: new Error('Unknown error')
343
- })
344
-
345
- expect(Wreck.post).toHaveBeenCalledWith('/error', {})
346
- })
347
- })
348
-
349
- describe('PUT', () => {
350
- beforeEach(() => {
351
- jest.spyOn(Wreck, 'put').mockResolvedValue({
352
- res: /** @type {IncomingMessage} */ ({
353
- statusCode: StatusCodes.OK
354
- }),
355
- payload: undefined
356
- })
357
- })
358
-
359
- it('passes headers', async () => {
360
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
361
- await expect(put('/test', blankOptions)).resolves.toEqual({
362
- res: { statusCode: StatusCodes.OK }
363
- })
364
-
365
- expect(Wreck.put).toHaveBeenCalledWith('/test', {
366
- headers: { 'x-cdp-request-id': 'my-trace-id' }
367
- })
368
- })
369
-
370
- it('passes additional headers', async () => {
371
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
372
- await expect(put('/test', authOptions)).resolves.toEqual({
373
- res: { statusCode: StatusCodes.OK }
374
- })
375
-
376
- expect(Wreck.put).toHaveBeenCalledWith('/test', {
377
- headers: {
378
- Authorization: 'Bearer ey56yDSASDFfbgcbc',
379
- 'x-cdp-request-id': 'my-trace-id'
380
- }
381
- })
382
- })
383
-
384
- it('passes non headers options', async () => {
385
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
386
- await expect(put('/test', timeoutOptions)).resolves.toEqual({
387
- res: { statusCode: StatusCodes.OK }
388
- })
389
-
390
- expect(Wreck.put).toHaveBeenCalledWith('/test', {
391
- headers: {
392
- 'x-cdp-request-id': 'my-trace-id'
393
- },
394
- timeout: 5000
395
- })
396
- })
397
-
398
- it('sends request', async () => {
399
- await expect(put('/test', blankOptions)).resolves.toEqual({
400
- res: { statusCode: StatusCodes.OK }
401
- })
402
-
403
- expect(Wreck.put).toHaveBeenCalledWith('/test', {})
404
- })
405
- })
406
-
407
- describe('PUT (with error)', () => {
408
- const error = Boom.notFound()
409
-
410
- beforeEach(() => {
411
- jest.spyOn(Wreck, 'put').mockResolvedValue({
412
- res: /** @type {IncomingMessage} */ ({
413
- statusCode: StatusCodes.NOT_FOUND
414
- }),
415
- payload: error
416
- })
417
- })
418
-
419
- it('passes headers', async () => {
420
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
421
- await expect(put('/error', blankOptions)).resolves.toEqual({
422
- res: { statusCode: StatusCodes.NOT_FOUND },
423
- error
424
- })
425
-
426
- expect(Wreck.put).toHaveBeenCalledWith('/error', {
427
- headers: { 'x-cdp-request-id': 'my-trace-id' }
428
- })
429
- })
430
-
431
- it('passes additional headers', async () => {
432
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
433
- await expect(put('/error', authOptions)).resolves.toEqual({
434
- res: { statusCode: StatusCodes.NOT_FOUND },
435
- error
436
- })
437
-
438
- expect(Wreck.put).toHaveBeenCalledWith('/error', {
439
- headers: {
440
- Authorization: 'Bearer ey56yDSASDFfbgcbc',
441
- 'x-cdp-request-id': 'my-trace-id'
442
- }
443
- })
444
- })
445
-
446
- it('passes non headers options', async () => {
447
- jest.mocked(getTraceId).mockReturnValue('my-trace-id')
448
- await expect(put('/error', timeoutOptions)).resolves.toEqual({
449
- res: { statusCode: StatusCodes.NOT_FOUND },
450
- error
451
- })
452
-
453
- expect(Wreck.put).toHaveBeenCalledWith('/error', {
454
- headers: {
455
- 'x-cdp-request-id': 'my-trace-id'
456
- },
457
- timeout: 5000
458
- })
459
- })
460
-
461
- it('sends request (with error)', async () => {
462
- await expect(put('/error', blankOptions)).resolves.toEqual({
463
- res: { statusCode: StatusCodes.NOT_FOUND },
464
- error
465
- })
466
-
467
- expect(Wreck.put).toHaveBeenCalledWith('/error', {})
468
- })
469
-
470
- it('sends request (unknown error)', async () => {
471
- jest.spyOn(Wreck, 'put').mockResolvedValue({
472
- res: /** @type {IncomingMessage} */ ({
473
- statusCode: StatusCodes.NOT_FOUND
474
- }),
475
- payload: undefined
476
- })
477
-
478
- await expect(put('/error', blankOptions)).resolves.toEqual({
479
- res: { statusCode: StatusCodes.NOT_FOUND },
480
- error: new Error('Unknown error')
481
- })
482
-
483
- expect(Wreck.put).toHaveBeenCalledWith('/error', {})
484
- })
485
- })
486
- })
487
-
488
- /**
489
- * @import { IncomingMessage } from 'node:http'
490
- * @import { RequestOptions } from '~/src/server/services/httpService.js'
491
- */
@@ -1,50 +0,0 @@
1
- import Wreck from '@hapi/wreck'
2
-
3
- import { applyTraceHeaders } from '~/src/server/utils/utils.js'
4
-
5
- export type Method = keyof Pick<typeof Wreck, 'get' | 'post' | 'put' | 'delete'>
6
- export type RequestOptions = Parameters<typeof Wreck.defaults>[0]
7
-
8
- export const request = async <BodyType = Buffer>(
9
- method: Method,
10
- url: string,
11
- options?: RequestOptions
12
- ) => {
13
- const headers = applyTraceHeaders(options?.headers)
14
-
15
- const mergedOptions = { ...options, headers }
16
-
17
- const { res, payload } = await Wreck[method]<BodyType>(url, mergedOptions)
18
-
19
- if (!res.statusCode || res.statusCode < 200 || res.statusCode > 299) {
20
- return { res, error: payload || new Error('Unknown error') }
21
- }
22
-
23
- return { res, payload }
24
- }
25
-
26
- export const get = <BodyType>(url: string, options?: RequestOptions) => {
27
- return request<BodyType>('get', url, options)
28
- }
29
-
30
- export const getJson = <BodyType extends object>(url: string) => {
31
- return get<BodyType>(url, { json: true })
32
- }
33
-
34
- export const post = <BodyType>(url: string, options: RequestOptions) => {
35
- return request<BodyType>('post', url, options)
36
- }
37
-
38
- export const postJson = <BodyType extends object>(
39
- url: string,
40
- options: RequestOptions
41
- ) => {
42
- return post<BodyType>(url, {
43
- ...options,
44
- json: true
45
- })
46
- }
47
-
48
- export const put = <BodyType>(url: string, options: RequestOptions) => {
49
- return request<BodyType>('put', url, options)
50
- }
@@ -1 +0,0 @@
1
- export { CacheService } from '~/src/server/services/cacheService.js'
@@ -1,54 +0,0 @@
1
- import {
2
- type FormDefinition,
3
- type FormMetadata,
4
- type SubmitPayload,
5
- type SubmitResponsePayload
6
- } from '@defra/forms-model'
7
-
8
- import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
9
- import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
10
- import { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'
11
- import {
12
- type FormRequestPayload,
13
- type FormStatus
14
- } from '~/src/server/routes/types.js'
15
-
16
- export interface FormsService {
17
- getFormMetadata: (slug: string) => Promise<FormMetadata>
18
- getFormDefinition: (
19
- id: string,
20
- state: FormStatus
21
- ) => Promise<FormDefinition | undefined>
22
- }
23
-
24
- export interface FormSubmissionService {
25
- persistFiles: (
26
- files: { fileId: string; initiatedRetrievalKey: string }[],
27
- persistedRetrievalKey: string
28
- ) => Promise<object>
29
- submit: (data: SubmitPayload) => Promise<SubmitResponsePayload | undefined>
30
- }
31
-
32
- export interface Services {
33
- formsService: FormsService
34
- formSubmissionService: FormSubmissionService
35
- outputService: OutputService
36
- }
37
-
38
- export interface RouteConfig {
39
- formFileName?: string
40
- formFilePath?: string
41
- enforceCsrf?: boolean
42
- services?: Services
43
- controllers?: Record<string, typeof PageController>
44
- }
45
-
46
- export interface OutputService {
47
- submit: (
48
- request: FormRequestPayload,
49
- model: FormModel,
50
- emailAddress: string,
51
- items: DetailItem[],
52
- submitResponse: SubmitResponsePayload
53
- ) => Promise<void>
54
- }
@@ -1,37 +0,0 @@
1
- import { postJson } from '~/src/server/services/httpService.js'
2
- import { sendNotification } from '~/src/server/utils/notify.js'
3
-
4
- jest.mock('~/src/server/services/httpService')
5
-
6
- describe('Utils: Notify', () => {
7
- const templateId = 'example-template-id'
8
- const emailAddress = 'enrique.chase@defra.gov.uk'
9
- const personalisation = {
10
- subject: 'Hello',
11
- body: 'World'
12
- }
13
-
14
- describe('sendNotification', () => {
15
- it('calls postJson with personalised email payload', async () => {
16
- await sendNotification({
17
- templateId,
18
- emailAddress,
19
- personalisation
20
- })
21
-
22
- expect(postJson).toHaveBeenCalledWith(
23
- 'https://api.notifications.service.gov.uk/v2/notifications/email',
24
- {
25
- payload: {
26
- template_id: templateId,
27
- email_address: emailAddress,
28
- personalisation
29
- },
30
- headers: {
31
- Authorization: expect.stringMatching(/^Bearer /)
32
- }
33
- }
34
- )
35
- })
36
- })
37
- })
@@ -1,50 +0,0 @@
1
- import { token } from '@hapi/jwt'
2
-
3
- import { config } from '~/src/config/index.js'
4
- import { postJson } from '~/src/server/services/httpService.js'
5
-
6
- const notifyAPIKey = config.get('notifyAPIKey')
7
-
8
- // Extract the two uuids from the notifyApiKey
9
- // See https://github.com/alphagov/notifications-node-client/blob/main/client/api_client.js#L17
10
- // Needed until `https://github.com/alphagov/notifications-node-client/pull/200` is published
11
- const apiKeyId: string = notifyAPIKey.substring(
12
- notifyAPIKey.length - 36,
13
- notifyAPIKey.length
14
- )
15
- const serviceId: string = notifyAPIKey.substring(
16
- notifyAPIKey.length - 73,
17
- notifyAPIKey.length - 37
18
- )
19
-
20
- export interface SendNotificationArgs {
21
- templateId: string
22
- emailAddress: string
23
- personalisation: { subject: string; body: string }
24
- }
25
-
26
- function createToken(iss: string, secret: string) {
27
- const iat = Math.round(Date.now() / 1000)
28
-
29
- return token.generate({ iss, iat }, secret, {
30
- header: { typ: 'JWT', alg: 'HS256' }
31
- })
32
- }
33
-
34
- export async function sendNotification(args: SendNotificationArgs) {
35
- const { templateId, emailAddress, personalisation } = args
36
-
37
- return postJson(
38
- 'https://api.notifications.service.gov.uk/v2/notifications/email',
39
- {
40
- payload: {
41
- template_id: templateId,
42
- email_address: emailAddress,
43
- personalisation
44
- },
45
- headers: {
46
- Authorization: 'Bearer ' + createToken(serviceId, apiKeyId)
47
- }
48
- }
49
- )
50
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * Get base64 certs from all environment variables starting with TRUSTSTORE_
3
- * @param {NodeJS.ProcessEnv} envs - environment variables
4
- */
5
- export const getTrustStoreCerts = (envs) =>
6
- Object.entries(envs)
7
- .filter(
8
- /** @type { (env: [string, string?]) => env is [string, string] } */
9
- (([key, value]) => key.startsWith('TRUSTSTORE_') && !!value)
10
- )
11
- .map(([, value]) => Buffer.from(value, 'base64').toString().trim())