@defra/forms-engine-plugin 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.public/assets/fonts/bold-affa96571d-v2.woff +0 -0
  2. package/.public/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
  3. package/.public/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
  4. package/.public/assets/fonts/light-f591b13f7d-v2.woff +0 -0
  5. package/.public/assets/images/favicon.ico +0 -0
  6. package/.public/assets/images/favicon.svg +1 -0
  7. package/.public/assets/images/govuk-crest.svg +1 -0
  8. package/.public/assets/images/govuk-icon-180.png +0 -0
  9. package/.public/assets/images/govuk-icon-192.png +0 -0
  10. package/.public/assets/images/govuk-icon-512.png +0 -0
  11. package/.public/assets/images/govuk-icon-mask.svg +1 -0
  12. package/.public/assets/images/govuk-opengraph-image.png +0 -0
  13. package/.public/assets/manifest.json +39 -0
  14. package/.public/assets-manifest.json +24 -0
  15. package/.public/javascripts/application.0fd8c18.min.js +3 -0
  16. package/.public/javascripts/application.0fd8c18.min.js.LICENSE.txt +58 -0
  17. package/.public/javascripts/application.0fd8c18.min.js.map +1 -0
  18. package/.public/javascripts/file-upload.b2f18f5.min.js +2 -0
  19. package/.public/javascripts/file-upload.b2f18f5.min.js.map +1 -0
  20. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js +2 -0
  21. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js.map +1 -0
  22. package/.public/stylesheets/application.e340021.min.css +14 -0
  23. package/.public/stylesheets/application.e340021.min.css.map +1 -0
  24. package/package.json +6 -2
  25. package/.browserslistrc +0 -16
  26. package/.editorconfig +0 -9
  27. package/.eslintrc.cjs +0 -266
  28. package/.github/dependabot.yml +0 -85
  29. package/.github/workflows/check-pull-request.yml +0 -209
  30. package/.github/workflows/pr-notifier.yml +0 -98
  31. package/.github/workflows/publish.yml +0 -111
  32. package/.husky/pre-commit +0 -1
  33. package/.lintstagedrc.js +0 -4
  34. package/.nvmrc +0 -1
  35. package/.prettierignore +0 -8
  36. package/.prettierrc.cjs +0 -26
  37. package/Dockerfile +0 -61
  38. package/Procfile +0 -1
  39. package/babel.config.cjs +0 -55
  40. package/compose/aws.env +0 -4
  41. package/compose/start-localstack.sh +0 -26
  42. package/docker-compose.yaml +0 -86
  43. package/globals.d.ts +0 -1
  44. package/jest.config.cjs +0 -54
  45. package/jest.environment.js +0 -4
  46. package/jest.setup.cjs +0 -14
  47. package/postcss.config.js +0 -26
  48. package/sonar-project.properties +0 -17
  49. package/src/client/javascripts/application.js +0 -87
  50. package/src/client/javascripts/file-upload.js +0 -386
  51. package/src/client/stylesheets/_code.scss +0 -33
  52. package/src/client/stylesheets/_govuk-frontend.scss +0 -4
  53. package/src/client/stylesheets/_prose.scss +0 -56
  54. package/src/client/stylesheets/_service-banner.scss +0 -24
  55. package/src/client/stylesheets/_summary-list.scss +0 -28
  56. package/src/client/stylesheets/_tag-env.scss +0 -24
  57. package/src/client/stylesheets/application.scss +0 -14
  58. package/src/common/cookies.js +0 -58
  59. package/src/common/cookies.test.js +0 -23
  60. package/src/common/types.js +0 -5
  61. package/src/config/index.ts +0 -271
  62. package/src/index.ts +0 -31
  63. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  64. package/src/server/common/helpers/logging/logger-options.ts +0 -46
  65. package/src/server/common/helpers/logging/logger.ts +0 -7
  66. package/src/server/common/helpers/logging/request-logger.ts +0 -9
  67. package/src/server/common/helpers/logging/request-tracing.js +0 -10
  68. package/src/server/common/helpers/redis-client.js +0 -70
  69. package/src/server/constants.js +0 -1
  70. package/src/server/forms/README.md +0 -10
  71. package/src/server/forms/components.json +0 -1015
  72. package/src/server/forms/report-a-terrorist.json +0 -270
  73. package/src/server/forms/runner-components-test.json +0 -365
  74. package/src/server/forms/test.json +0 -581
  75. package/src/server/index.test.ts +0 -582
  76. package/src/server/index.ts +0 -140
  77. package/src/server/plugins/blankie.test.ts +0 -73
  78. package/src/server/plugins/blankie.ts +0 -48
  79. package/src/server/plugins/crumb.ts +0 -20
  80. package/src/server/plugins/engine/README.md +0 -87
  81. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -294
  82. package/src/server/plugins/engine/components/AutocompleteField.ts +0 -49
  83. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -379
  84. package/src/server/plugins/engine/components/CheckboxesField.ts +0 -106
  85. package/src/server/plugins/engine/components/ComponentBase.ts +0 -97
  86. package/src/server/plugins/engine/components/ComponentCollection.ts +0 -278
  87. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -822
  88. package/src/server/plugins/engine/components/DatePartsField.ts +0 -264
  89. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  90. package/src/server/plugins/engine/components/Details.ts +0 -30
  91. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -395
  92. package/src/server/plugins/engine/components/EmailAddressField.ts +0 -55
  93. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -778
  94. package/src/server/plugins/engine/components/FileUploadField.ts +0 -262
  95. package/src/server/plugins/engine/components/FormComponent.ts +0 -249
  96. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  97. package/src/server/plugins/engine/components/Html.ts +0 -29
  98. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  99. package/src/server/plugins/engine/components/InsetText.ts +0 -27
  100. package/src/server/plugins/engine/components/List.test.ts +0 -76
  101. package/src/server/plugins/engine/components/List.ts +0 -72
  102. package/src/server/plugins/engine/components/ListFormComponent.ts +0 -140
  103. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -567
  104. package/src/server/plugins/engine/components/MonthYearField.ts +0 -222
  105. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -558
  106. package/src/server/plugins/engine/components/MultilineTextField.ts +0 -138
  107. package/src/server/plugins/engine/components/NumberField.test.ts +0 -701
  108. package/src/server/plugins/engine/components/NumberField.ts +0 -163
  109. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -288
  110. package/src/server/plugins/engine/components/RadiosField.ts +0 -24
  111. package/src/server/plugins/engine/components/SelectField.test.ts +0 -288
  112. package/src/server/plugins/engine/components/SelectField.ts +0 -47
  113. package/src/server/plugins/engine/components/SelectionControlField.ts +0 -43
  114. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -356
  115. package/src/server/plugins/engine/components/TelephoneNumberField.ts +0 -67
  116. package/src/server/plugins/engine/components/TextField.test.ts +0 -489
  117. package/src/server/plugins/engine/components/TextField.ts +0 -96
  118. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -623
  119. package/src/server/plugins/engine/components/UkAddressField.ts +0 -172
  120. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -248
  121. package/src/server/plugins/engine/components/YesNoField.ts +0 -31
  122. package/src/server/plugins/engine/components/constants.ts +0 -1
  123. package/src/server/plugins/engine/components/helpers.ts +0 -330
  124. package/src/server/plugins/engine/components/index.ts +0 -24
  125. package/src/server/plugins/engine/components/types.ts +0 -117
  126. package/src/server/plugins/engine/configureEnginePlugin.ts +0 -47
  127. package/src/server/plugins/engine/helpers.test.ts +0 -791
  128. package/src/server/plugins/engine/helpers.ts +0 -379
  129. package/src/server/plugins/engine/index.ts +0 -7
  130. package/src/server/plugins/engine/models/FormModel.test.ts +0 -42
  131. package/src/server/plugins/engine/models/FormModel.ts +0 -443
  132. package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
  133. package/src/server/plugins/engine/models/Section.ts +0 -0
  134. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -209
  135. package/src/server/plugins/engine/models/SummaryViewModel.ts +0 -220
  136. package/src/server/plugins/engine/models/index.ts +0 -2
  137. package/src/server/plugins/engine/models/types.ts +0 -114
  138. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -143
  139. package/src/server/plugins/engine/outputFormatters/human/v1.ts +0 -73
  140. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  141. package/src/server/plugins/engine/outputFormatters/index.ts +0 -44
  142. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -229
  143. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +0 -140
  144. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -229
  145. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +0 -153
  146. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1108
  147. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +0 -446
  148. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -205
  149. package/src/server/plugins/engine/pageControllers/PageController.ts +0 -176
  150. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1264
  151. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +0 -561
  152. package/src/server/plugins/engine/pageControllers/README.md +0 -28
  153. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -264
  154. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +0 -458
  155. package/src/server/plugins/engine/pageControllers/StartPageController.ts +0 -18
  156. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +0 -50
  157. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +0 -261
  158. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -28
  159. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +0 -19
  160. package/src/server/plugins/engine/pageControllers/helpers.test.ts +0 -198
  161. package/src/server/plugins/engine/pageControllers/helpers.ts +0 -101
  162. package/src/server/plugins/engine/pageControllers/index.ts +0 -10
  163. package/src/server/plugins/engine/pageControllers/validationOptions.ts +0 -89
  164. package/src/server/plugins/engine/plugin.ts +0 -673
  165. package/src/server/plugins/engine/services/formSubmissionService.js +0 -46
  166. package/src/server/plugins/engine/services/formsService.js +0 -46
  167. package/src/server/plugins/engine/services/formsService.test.js +0 -90
  168. package/src/server/plugins/engine/services/index.js +0 -3
  169. package/src/server/plugins/engine/services/notifyService.test.ts +0 -132
  170. package/src/server/plugins/engine/services/notifyService.ts +0 -64
  171. package/src/server/plugins/engine/services/uploadService.js +0 -60
  172. package/src/server/plugins/engine/types.ts +0 -315
  173. package/src/server/plugins/engine/views/components/autocompletefield.html +0 -5
  174. package/src/server/plugins/engine/views/components/checkboxesfield.html +0 -5
  175. package/src/server/plugins/engine/views/components/datepartsfield.html +0 -5
  176. package/src/server/plugins/engine/views/components/details.html +0 -6
  177. package/src/server/plugins/engine/views/components/emailaddressfield.html +0 -5
  178. package/src/server/plugins/engine/views/components/fileuploadfield-key.html +0 -8
  179. package/src/server/plugins/engine/views/components/fileuploadfield-value.html +0 -3
  180. package/src/server/plugins/engine/views/components/fileuploadfield.html +0 -24
  181. package/src/server/plugins/engine/views/components/html.html +0 -3
  182. package/src/server/plugins/engine/views/components/insettext.html +0 -7
  183. package/src/server/plugins/engine/views/components/list.html +0 -36
  184. package/src/server/plugins/engine/views/components/monthyearfield.html +0 -5
  185. package/src/server/plugins/engine/views/components/multilinetextfield.html +0 -10
  186. package/src/server/plugins/engine/views/components/numberfield.html +0 -5
  187. package/src/server/plugins/engine/views/components/radiosfield.html +0 -5
  188. package/src/server/plugins/engine/views/components/selectfield.html +0 -5
  189. package/src/server/plugins/engine/views/components/telephonenumberfield.html +0 -5
  190. package/src/server/plugins/engine/views/components/textfield.html +0 -5
  191. package/src/server/plugins/engine/views/components/ukaddressfield.html +0 -25
  192. package/src/server/plugins/engine/views/components/yesnofield.html +0 -5
  193. package/src/server/plugins/engine/views/file-upload.html +0 -45
  194. package/src/server/plugins/engine/views/index.html +0 -39
  195. package/src/server/plugins/engine/views/item-delete.html +0 -56
  196. package/src/server/plugins/engine/views/partials/components.html +0 -6
  197. package/src/server/plugins/engine/views/partials/conditional-components.html +0 -3
  198. package/src/server/plugins/engine/views/partials/debug.html +0 -44
  199. package/src/server/plugins/engine/views/partials/form.html +0 -15
  200. package/src/server/plugins/engine/views/partials/heading.html +0 -16
  201. package/src/server/plugins/engine/views/partials/preview-banner.html +0 -32
  202. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  203. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +0 -10
  204. package/src/server/plugins/engine/views/repeat-list-summary.html +0 -53
  205. package/src/server/plugins/errorPages.ts +0 -58
  206. package/src/server/plugins/nunjucks/context.js +0 -88
  207. package/src/server/plugins/nunjucks/context.test.js +0 -142
  208. package/src/server/plugins/nunjucks/enviroment.test.js +0 -201
  209. package/src/server/plugins/nunjucks/environment.js +0 -116
  210. package/src/server/plugins/nunjucks/filters/answer.js +0 -27
  211. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -89
  212. package/src/server/plugins/nunjucks/filters/evaluate.js +0 -21
  213. package/src/server/plugins/nunjucks/filters/field.js +0 -28
  214. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  215. package/src/server/plugins/nunjucks/filters/highlight.js +0 -11
  216. package/src/server/plugins/nunjucks/filters/href.js +0 -30
  217. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  218. package/src/server/plugins/nunjucks/filters/index.js +0 -8
  219. package/src/server/plugins/nunjucks/filters/inspect.js +0 -15
  220. package/src/server/plugins/nunjucks/filters/page.js +0 -24
  221. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  222. package/src/server/plugins/nunjucks/index.js +0 -3
  223. package/src/server/plugins/nunjucks/plugin.js +0 -40
  224. package/src/server/plugins/nunjucks/render.js +0 -42
  225. package/src/server/plugins/nunjucks/types.js +0 -40
  226. package/src/server/plugins/pulse.ts +0 -11
  227. package/src/server/plugins/router.ts +0 -201
  228. package/src/server/plugins/session.ts +0 -28
  229. package/src/server/routes/health.js +0 -13
  230. package/src/server/routes/health.test.js +0 -35
  231. package/src/server/routes/index.test.ts +0 -125
  232. package/src/server/routes/index.ts +0 -2
  233. package/src/server/routes/public.ts +0 -47
  234. package/src/server/routes/types.ts +0 -48
  235. package/src/server/schemas/index.ts +0 -34
  236. package/src/server/secure-context.js +0 -43
  237. package/src/server/services/cacheService.test.ts +0 -276
  238. package/src/server/services/cacheService.ts +0 -131
  239. package/src/server/services/httpService.test.js +0 -491
  240. package/src/server/services/httpService.ts +0 -50
  241. package/src/server/services/index.ts +0 -1
  242. package/src/server/types.ts +0 -54
  243. package/src/server/utils/notify.test.ts +0 -37
  244. package/src/server/utils/notify.ts +0 -50
  245. package/src/server/utils/secure-context/get-trust-store-certs.js +0 -11
  246. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  247. package/src/server/utils/utils.js +0 -24
  248. package/src/server/utils/utils.test.js +0 -54
  249. package/src/server/views/404.html +0 -16
  250. package/src/server/views/500.html +0 -19
  251. package/src/server/views/components/debug/macro.njk +0 -3
  252. package/src/server/views/components/debug/template.njk +0 -13
  253. package/src/server/views/components/service-banner/macro.njk +0 -3
  254. package/src/server/views/components/service-banner/template.njk +0 -20
  255. package/src/server/views/components/service-banner/template.test.js +0 -43
  256. package/src/server/views/components/tag-env/macro.njk +0 -3
  257. package/src/server/views/components/tag-env/template.njk +0 -30
  258. package/src/server/views/components/tag-env/template.test.js +0 -66
  259. package/src/server/views/confirmation.html +0 -19
  260. package/src/server/views/help/accessibility-statement.html +0 -58
  261. package/src/server/views/help/cookie-preferences.html +0 -57
  262. package/src/server/views/help/cookies.html +0 -71
  263. package/src/server/views/help/get-support.html +0 -37
  264. package/src/server/views/help/privacy-notice.html +0 -68
  265. package/src/server/views/help/terms-and-conditions.html +0 -83
  266. package/src/server/views/layout.html +0 -199
  267. package/src/server/views/summary.html +0 -50
  268. package/src/typings/hapi/index.d.ts +0 -95
  269. package/src/typings/hapi-tracing/index.d.ts +0 -6
  270. package/src/typings/index.d.ts +0 -3
  271. package/src/typings/joi/index.d.ts +0 -22
  272. package/stylelint.config.js +0 -10
  273. package/test/client/javascripts/file-upload.test.js +0 -1197
  274. package/test/condition/checkboxes.test.js +0 -112
  275. package/test/condition/radios.test.js +0 -112
  276. package/test/condition/text.test.js +0 -103
  277. package/test/fixtures/assets-manifest.json +0 -4
  278. package/test/fixtures/form.js +0 -86
  279. package/test/fixtures/index.js +0 -2
  280. package/test/fixtures/list.js +0 -92
  281. package/test/form/cookies.test.js +0 -338
  282. package/test/form/csrf.test.js +0 -87
  283. package/test/form/definitions/basic.js +0 -101
  284. package/test/form/definitions/blank.js +0 -10
  285. package/test/form/definitions/checkboxes.json +0 -88
  286. package/test/form/definitions/components.json +0 -452
  287. package/test/form/definitions/conditional-reveal.js +0 -140
  288. package/test/form/definitions/conditions-basic.js +0 -187
  289. package/test/form/definitions/conditions-complex.js +0 -338
  290. package/test/form/definitions/conditions-dates.js +0 -78
  291. package/test/form/definitions/conditions-escaping.js +0 -143
  292. package/test/form/definitions/demo-cph-number.js +0 -3099
  293. package/test/form/definitions/feedback.json +0 -45
  294. package/test/form/definitions/fields-optional.js +0 -402
  295. package/test/form/definitions/fields-required.js +0 -402
  296. package/test/form/definitions/file-upload-basic.js +0 -44
  297. package/test/form/definitions/file-upload.js +0 -66
  298. package/test/form/definitions/minimal.js +0 -39
  299. package/test/form/definitions/phase-alpha.json +0 -33
  300. package/test/form/definitions/phase-default.json +0 -26
  301. package/test/form/definitions/radios.json +0 -88
  302. package/test/form/definitions/repeat-mixed.js +0 -54
  303. package/test/form/definitions/repeat.js +0 -70
  304. package/test/form/definitions/status.json +0 -126
  305. package/test/form/definitions/templates.js +0 -183
  306. package/test/form/definitions/test.json +0 -581
  307. package/test/form/definitions/text.json +0 -75
  308. package/test/form/definitions/titles.json +0 -170
  309. package/test/form/definitions.test.js +0 -47
  310. package/test/form/exit-page.test.js +0 -210
  311. package/test/form/feedback.test.js +0 -68
  312. package/test/form/fields-optional.test.js +0 -237
  313. package/test/form/fields-required.test.js +0 -294
  314. package/test/form/file-upload.test.js +0 -313
  315. package/test/form/govuk-notify.test.js +0 -449
  316. package/test/form/journey-basic.test.js +0 -444
  317. package/test/form/persist-files.test.js +0 -227
  318. package/test/form/phase-banner.test.js +0 -71
  319. package/test/form/repeat.test.js +0 -628
  320. package/test/form/summary-submission-email.test.js +0 -95
  321. package/test/form/template.test.js +0 -288
  322. package/test/form/titles.test.js +0 -204
  323. package/test/helpers/component-helpers.js +0 -74
  324. package/test/utils/get-cookie.js +0 -42
  325. package/test/utils/get-form-definitions.js +0 -18
  326. package/tmp.pdf +0 -1
  327. package/tsconfig.json +0 -28
  328. package/webpack.config.js +0 -208
@@ -1,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())