hof 22.9.0-beta → 22.9.0-beta.v2

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 (313) hide show
  1. package/package.json +1 -1
  2. package/hof-22.9.0.tgz +0 -0
  3. package/package/.eslintignore +0 -1
  4. package/package/CHANGELOG.md +0 -232
  5. package/package/LICENSE +0 -21
  6. package/package/README.md +0 -1887
  7. package/package/bin/hof-build +0 -10
  8. package/package/bin/hof-transpiler +0 -12
  9. package/package/build/helpers/importer.js +0 -29
  10. package/package/build/helpers/local.js +0 -35
  11. package/package/build/helpers/resolver/import.js +0 -32
  12. package/package/build/helpers/resolver/nearest-package-root.js +0 -33
  13. package/package/build/helpers/resolver/package.js +0 -29
  14. package/package/build/helpers/resolver.js +0 -16
  15. package/package/build/index.js +0 -49
  16. package/package/build/lib/env.js +0 -36
  17. package/package/build/lib/mkdir.js +0 -9
  18. package/package/build/lib/run.js +0 -17
  19. package/package/build/lib/spawn.js +0 -18
  20. package/package/build/tasks/browserify/compress.js +0 -15
  21. package/package/build/tasks/browserify/index.js +0 -48
  22. package/package/build/tasks/build/index.js +0 -6
  23. package/package/build/tasks/images/index.js +0 -27
  24. package/package/build/tasks/index.js +0 -8
  25. package/package/build/tasks/sass/index.js +0 -67
  26. package/package/build/tasks/translate/index.js +0 -20
  27. package/package/build/tasks/watch/index.js +0 -161
  28. package/package/components/address-lookup/default-model.js +0 -76
  29. package/package/components/address-lookup/defaults.js +0 -25
  30. package/package/components/address-lookup/index.js +0 -251
  31. package/package/components/address-lookup/templates/address-lookup.html +0 -14
  32. package/package/components/address-lookup/templates/address.html +0 -22
  33. package/package/components/address-lookup/templates/postcode.html +0 -9
  34. package/package/components/clear-session/Readme.md +0 -46
  35. package/package/components/clear-session/index.js +0 -26
  36. package/package/components/combine-and-loop-fields/Readme.md +0 -42
  37. package/package/components/combine-and-loop-fields/index.js +0 -156
  38. package/package/components/date/fields.js +0 -16
  39. package/package/components/date/index.js +0 -172
  40. package/package/components/date/templates/date.html +0 -20
  41. package/package/components/emailer/assets/images/govuk_logotype_email.png +0 -0
  42. package/package/components/emailer/assets/images/ho_crest_27px.png +0 -0
  43. package/package/components/emailer/assets/images/spacer.gif +0 -0
  44. package/package/components/emailer/email-service.js +0 -51
  45. package/package/components/emailer/emailer.js +0 -53
  46. package/package/components/emailer/index.js +0 -74
  47. package/package/components/emailer/transports/debug.js +0 -74
  48. package/package/components/emailer/transports/index.js +0 -8
  49. package/package/components/emailer/transports/ses.js +0 -36
  50. package/package/components/emailer/transports/smtp.js +0 -26
  51. package/package/components/emailer/transports/stub.js +0 -5
  52. package/package/components/emailer/views/layout.html +0 -63
  53. package/package/components/homeoffice-countries/index.js +0 -22
  54. package/package/components/index.js +0 -13
  55. package/package/components/notify/index.js +0 -62
  56. package/package/components/notify/notify.js +0 -51
  57. package/package/components/session-timeout-warning/index.js +0 -67
  58. package/package/components/summary/index.js +0 -237
  59. package/package/config/builder-defaults.js +0 -45
  60. package/package/config/component-defaults.js +0 -13
  61. package/package/config/hof-defaults.js +0 -65
  62. package/package/config/rate-limits.js +0 -20
  63. package/package/config/sanitisation-rules.js +0 -32
  64. package/package/controller/base-controller.js +0 -296
  65. package/package/controller/behaviour-hooks.js +0 -51
  66. package/package/controller/behaviour-session.js +0 -64
  67. package/package/controller/controller.js +0 -258
  68. package/package/controller/deprecate-error.js +0 -10
  69. package/package/controller/formatting/formatters.js +0 -70
  70. package/package/controller/formatting/index.js +0 -32
  71. package/package/controller/index.js +0 -17
  72. package/package/controller/validation/email.js +0 -30
  73. package/package/controller/validation/index.js +0 -101
  74. package/package/controller/validation/validators.js +0 -181
  75. package/package/controller/validation-error.js +0 -14
  76. package/package/frontend/govuk-template/build/config.js +0 -24
  77. package/package/frontend/govuk-template/build/govuk_template.html +0 -102
  78. package/package/frontend/govuk-template/build/index.js +0 -23
  79. package/package/frontend/govuk-template/govuk_template_generated.html +0 -102
  80. package/package/frontend/govuk-template/index.js +0 -29
  81. package/package/frontend/index.js +0 -9
  82. package/package/frontend/template-mixins/mixins/helpers.js +0 -103
  83. package/package/frontend/template-mixins/mixins/index.js +0 -37
  84. package/package/frontend/template-mixins/mixins/render.js +0 -12
  85. package/package/frontend/template-mixins/mixins/template-mixins.js +0 -520
  86. package/package/frontend/template-mixins/partials/forms/checkbox-group.html +0 -47
  87. package/package/frontend/template-mixins/partials/forms/checkbox.html +0 -16
  88. package/package/frontend/template-mixins/partials/forms/input-submit.html +0 -1
  89. package/package/frontend/template-mixins/partials/forms/input-text-date.html +0 -37
  90. package/package/frontend/template-mixins/partials/forms/input-text-group.html +0 -45
  91. package/package/frontend/template-mixins/partials/forms/option-group.html +0 -43
  92. package/package/frontend/template-mixins/partials/forms/select.html +0 -17
  93. package/package/frontend/template-mixins/partials/forms/textarea-group.html +0 -37
  94. package/package/frontend/template-mixins/partials/mixins/panel.html +0 -4
  95. package/package/frontend/template-partials/index.js +0 -9
  96. package/package/frontend/template-partials/translations/index.js +0 -26
  97. package/package/frontend/template-partials/translations/src/cy/base.json +0 -4
  98. package/package/frontend/template-partials/translations/src/cy/buttons.json +0 -6
  99. package/package/frontend/template-partials/translations/src/cy/cookies.json +0 -104
  100. package/package/frontend/template-partials/translations/src/cy/errorlist.json +0 -6
  101. package/package/frontend/template-partials/translations/src/cy/errors.json +0 -18
  102. package/package/frontend/template-partials/translations/src/cy/terms.json +0 -28
  103. package/package/frontend/template-partials/translations/src/en/accessibility.json +0 -43
  104. package/package/frontend/template-partials/translations/src/en/base.json +0 -5
  105. package/package/frontend/template-partials/translations/src/en/buttons.json +0 -10
  106. package/package/frontend/template-partials/translations/src/en/cookies.json +0 -116
  107. package/package/frontend/template-partials/translations/src/en/errorlist.json +0 -7
  108. package/package/frontend/template-partials/translations/src/en/errors.json +0 -35
  109. package/package/frontend/template-partials/translations/src/en/exit.json +0 -5
  110. package/package/frontend/template-partials/translations/src/en/fields.json +0 -5
  111. package/package/frontend/template-partials/translations/src/en/journey.json +0 -6
  112. package/package/frontend/template-partials/translations/src/en/save-and-exit.json +0 -4
  113. package/package/frontend/template-partials/translations/src/en/terms.json +0 -28
  114. package/package/frontend/template-partials/views/404.html +0 -9
  115. package/package/frontend/template-partials/views/accessibility.html +0 -55
  116. package/package/frontend/template-partials/views/confirm.html +0 -8
  117. package/package/frontend/template-partials/views/confirmation.html +0 -19
  118. package/package/frontend/template-partials/views/content/en/what-happens-next.md +0 -0
  119. package/package/frontend/template-partials/views/cookie-error.html +0 -1
  120. package/package/frontend/template-partials/views/cookies.html +0 -84
  121. package/package/frontend/template-partials/views/email/data-row.html +0 -4
  122. package/package/frontend/template-partials/views/email/formatted.html +0 -12
  123. package/package/frontend/template-partials/views/email/layout.html +0 -63
  124. package/package/frontend/template-partials/views/email/raw.html +0 -11
  125. package/package/frontend/template-partials/views/email/section-row.html +0 -3
  126. package/package/frontend/template-partials/views/error.html +0 -20
  127. package/package/frontend/template-partials/views/exit.html +0 -9
  128. package/package/frontend/template-partials/views/feedback-submitted.html +0 -11
  129. package/package/frontend/template-partials/views/layout.html +0 -55
  130. package/package/frontend/template-partials/views/partials/analytics-table.html +0 -25
  131. package/package/frontend/template-partials/views/partials/back.html +0 -5
  132. package/package/frontend/template-partials/views/partials/bullet-list.html +0 -7
  133. package/package/frontend/template-partials/views/partials/confirmation-alert.html +0 -6
  134. package/package/frontend/template-partials/views/partials/continue.html +0 -5
  135. package/package/frontend/template-partials/views/partials/cookie-banner.html +0 -29
  136. package/package/frontend/template-partials/views/partials/cookie-notification.html +0 -4
  137. package/package/frontend/template-partials/views/partials/cookie-settings-button.html +0 -1
  138. package/package/frontend/template-partials/views/partials/cookie-settings-radio.html +0 -8
  139. package/package/frontend/template-partials/views/partials/details-summary.html +0 -8
  140. package/package/frontend/template-partials/views/partials/external-link.html +0 -1
  141. package/package/frontend/template-partials/views/partials/form.html +0 -10
  142. package/package/frontend/template-partials/views/partials/gatag.html +0 -60
  143. package/package/frontend/template-partials/views/partials/head.html +0 -31
  144. package/package/frontend/template-partials/views/partials/heading.html +0 -11
  145. package/package/frontend/template-partials/views/partials/items-table.html +0 -32
  146. package/package/frontend/template-partials/views/partials/maincontent-left.html +0 -10
  147. package/package/frontend/template-partials/views/partials/navigation.html +0 -8
  148. package/package/frontend/template-partials/views/partials/page.html +0 -23
  149. package/package/frontend/template-partials/views/partials/panel-indent.html +0 -3
  150. package/package/frontend/template-partials/views/partials/session-cookies-table.html +0 -28
  151. package/package/frontend/template-partials/views/partials/session-timeout-warning.html +0 -38
  152. package/package/frontend/template-partials/views/partials/summary-table-row.html +0 -14
  153. package/package/frontend/template-partials/views/partials/summary-table.html +0 -8
  154. package/package/frontend/template-partials/views/partials/table.html +0 -18
  155. package/package/frontend/template-partials/views/partials/validation-list.html +0 -3
  156. package/package/frontend/template-partials/views/partials/validation-summary.html +0 -25
  157. package/package/frontend/template-partials/views/partials/warn.html +0 -7
  158. package/package/frontend/template-partials/views/rate-limit-error.html +0 -10
  159. package/package/frontend/template-partials/views/save-and-exit.html +0 -17
  160. package/package/frontend/template-partials/views/service-unavailable.html +0 -13
  161. package/package/frontend/template-partials/views/session-timeout.html +0 -7
  162. package/package/frontend/template-partials/views/step.html +0 -14
  163. package/package/frontend/template-partials/views/terms.html +0 -26
  164. package/package/frontend/themes/gov-uk/client-js/cookieSettings.js +0 -145
  165. package/package/frontend/themes/gov-uk/client-js/govuk-cookies.js +0 -121
  166. package/package/frontend/themes/gov-uk/client-js/index.js +0 -27
  167. package/package/frontend/themes/gov-uk/client-js/session-timeout-dialog.js +0 -348
  168. package/package/frontend/themes/gov-uk/client-js/skip-to-main.js +0 -19
  169. package/package/frontend/themes/gov-uk/index.js +0 -9
  170. package/package/frontend/themes/gov-uk/styles/_base.scss +0 -17
  171. package/package/frontend/themes/gov-uk/styles/_check_your_answers.scss +0 -155
  172. package/package/frontend/themes/gov-uk/styles/_cookie-banner.scss +0 -111
  173. package/package/frontend/themes/gov-uk/styles/_cookie-settings.scss +0 -33
  174. package/package/frontend/themes/gov-uk/styles/_govuk_frontend_toolkit.scss +0 -23
  175. package/package/frontend/themes/gov-uk/styles/_helpers.scss +0 -5
  176. package/package/frontend/themes/gov-uk/styles/_layout.scss +0 -125
  177. package/package/frontend/themes/gov-uk/styles/_panel-indent.scss +0 -27
  178. package/package/frontend/themes/gov-uk/styles/_pdf.scss +0 -42
  179. package/package/frontend/themes/gov-uk/styles/_session-timeout-dialog.scss +0 -121
  180. package/package/frontend/themes/gov-uk/styles/_typography.scss +0 -27
  181. package/package/frontend/themes/gov-uk/styles/_variables.scss +0 -11
  182. package/package/frontend/themes/gov-uk/styles/govuk.scss +0 -43
  183. package/package/frontend/themes/gov-uk/styles/mixins.scss +0 -16
  184. package/package/frontend/themes/gov-uk/styles/modules/_alerts.scss +0 -73
  185. package/package/frontend/themes/gov-uk/styles/modules/_buttons.scss +0 -5
  186. package/package/frontend/themes/gov-uk/styles/modules/_character-count.scss +0 -8
  187. package/package/frontend/themes/gov-uk/styles/modules/_confirm-page.scss +0 -20
  188. package/package/frontend/themes/gov-uk/styles/modules/_lists.scss +0 -5
  189. package/package/frontend/themes/gov-uk/styles/modules/_progressive-reveal.scss +0 -17
  190. package/package/frontend/themes/gov-uk/styles/modules/_validation.scss +0 -51
  191. package/package/frontend/themes/index.js +0 -5
  192. package/package/frontend/toolkit/assets/images/passports/new-window-link-blue.png +0 -0
  193. package/package/frontend/toolkit/assets/images/passports/new-window-link.png +0 -0
  194. package/package/frontend/toolkit/assets/images/spinner.gif +0 -0
  195. package/package/frontend/toolkit/assets/javascript/character-count.js +0 -99
  196. package/package/frontend/toolkit/assets/javascript/form-focus.js +0 -101
  197. package/package/frontend/toolkit/assets/javascript/helpers.js +0 -177
  198. package/package/frontend/toolkit/assets/javascript/progressive-reveal.js +0 -72
  199. package/package/frontend/toolkit/assets/javascript/validation.js +0 -71
  200. package/package/frontend/toolkit/assets/javascript/vendor/details.polyfill.js +0 -189
  201. package/package/frontend/toolkit/assets/javascript/vendor/indexof.polyfill.js +0 -39
  202. package/package/frontend/toolkit/assets/javascript/vendor/safari-cachebuster.js +0 -6
  203. package/package/frontend/toolkit/assets/stylesheets/_base.scss +0 -17
  204. package/package/frontend/toolkit/assets/stylesheets/_helpers.scss +0 -5
  205. package/package/frontend/toolkit/assets/stylesheets/_layout.scss +0 -118
  206. package/package/frontend/toolkit/assets/stylesheets/_typography.scss +0 -27
  207. package/package/frontend/toolkit/assets/stylesheets/_variables.scss +0 -11
  208. package/package/frontend/toolkit/assets/stylesheets/app.scss +0 -30
  209. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_buttons.scss +0 -47
  210. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_details.scss +0 -38
  211. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_elements-typography.scss +0 -175
  212. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_forms.scss +0 -167
  213. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_helpers.scss +0 -39
  214. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_layout.scss +0 -67
  215. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_lists.scss +0 -40
  216. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_panels.scss +0 -29
  217. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_reset.scss +0 -33
  218. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_tables.scss +0 -33
  219. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/forms/_form-block-labels.scss +0 -63
  220. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/forms/_form-date.scss +0 -39
  221. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/forms/_form-validation.scss +0 -63
  222. package/package/frontend/toolkit/assets/stylesheets/mixins.scss +0 -16
  223. package/package/frontend/toolkit/assets/stylesheets/modules/_alerts.scss +0 -73
  224. package/package/frontend/toolkit/assets/stylesheets/modules/_buttons.scss +0 -5
  225. package/package/frontend/toolkit/assets/stylesheets/modules/_confirm-page.scss +0 -20
  226. package/package/frontend/toolkit/assets/stylesheets/modules/_lists.scss +0 -5
  227. package/package/frontend/toolkit/assets/stylesheets/modules/_progressive-reveal.scss +0 -17
  228. package/package/frontend/toolkit/assets/stylesheets/modules/_validation.scss +0 -51
  229. package/package/frontend/toolkit/index.js +0 -10
  230. package/package/index.js +0 -351
  231. package/package/lib/deindex.js +0 -18
  232. package/package/lib/encryption.js +0 -23
  233. package/package/lib/ga-tag.js +0 -89
  234. package/package/lib/health.js +0 -26
  235. package/package/lib/helpers.js +0 -66
  236. package/package/lib/logger.js +0 -65
  237. package/package/lib/markdown.js +0 -46
  238. package/package/lib/router.js +0 -111
  239. package/package/lib/serve-static.js +0 -12
  240. package/package/lib/sessions.js +0 -82
  241. package/package/lib/settings.js +0 -74
  242. package/package/lib/which.js +0 -28
  243. package/package/middleware/cookies.js +0 -43
  244. package/package/middleware/deep-translate.js +0 -32
  245. package/package/middleware/errors.js +0 -119
  246. package/package/middleware/index.js +0 -10
  247. package/package/middleware/not-found.js +0 -38
  248. package/package/middleware/rate-limiter.js +0 -98
  249. package/package/middleware/service-unavailable.js +0 -64
  250. package/package/model/apis/axios-settings.js +0 -21
  251. package/package/model/apis/html-to-pdf-converter.js +0 -35
  252. package/package/model/apis/index.js +0 -5
  253. package/package/model/index.js +0 -348
  254. package/package/package.json +0 -147
  255. package/package/sandbox/README.md +0 -66
  256. package/package/sandbox/apps/sandbox/behaviours/clear-session.js +0 -8
  257. package/package/sandbox/apps/sandbox/behaviours/country-select.js +0 -10
  258. package/package/sandbox/apps/sandbox/behaviours/international-number.js +0 -22
  259. package/package/sandbox/apps/sandbox/fields.js +0 -128
  260. package/package/sandbox/apps/sandbox/index.js +0 -99
  261. package/package/sandbox/apps/sandbox/lib/staticAppealStages.js +0 -189
  262. package/package/sandbox/apps/sandbox/sections/summary-data-sections.js +0 -43
  263. package/package/sandbox/apps/sandbox/translations/src/en/errors.json +0 -5
  264. package/package/sandbox/apps/sandbox/translations/src/en/exit.json +0 -4
  265. package/package/sandbox/apps/sandbox/translations/src/en/fields.json +0 -101
  266. package/package/sandbox/apps/sandbox/translations/src/en/journey.json +0 -7
  267. package/package/sandbox/apps/sandbox/translations/src/en/pages.json +0 -72
  268. package/package/sandbox/apps/sandbox/translations/src/en/validation.json +0 -54
  269. package/package/sandbox/apps/sandbox/views/form-guidance-link.html +0 -8
  270. package/package/sandbox/apps/sandbox/views/save-and-exit.html +0 -19
  271. package/package/sandbox/assets/images/icons/icon-caret-left.png +0 -0
  272. package/package/sandbox/assets/images/icons/icon-complete.png +0 -0
  273. package/package/sandbox/assets/images/icons/icon-cross-remove-sign.png +0 -0
  274. package/package/sandbox/assets/js/index.js +0 -70
  275. package/package/sandbox/assets/scss/app.scss +0 -27
  276. package/package/sandbox/codecept.conf.js +0 -15
  277. package/package/sandbox/config.js +0 -17
  278. package/package/sandbox/package.json +0 -26
  279. package/package/sandbox/server.js +0 -23
  280. package/package/sandbox/yarn.lock +0 -262
  281. package/package/transpiler/index.js +0 -2
  282. package/package/transpiler/lib/aggregate.js +0 -32
  283. package/package/transpiler/lib/build.js +0 -15
  284. package/package/transpiler/lib/compile.js +0 -12
  285. package/package/transpiler/lib/expand-dirs.js +0 -14
  286. package/package/transpiler/lib/write-files.js +0 -24
  287. package/package/utilities/autofill/index.js +0 -189
  288. package/package/utilities/autofill/inputs.js +0 -60
  289. package/package/utilities/countries.js +0 -12
  290. package/package/utilities/helpers/index.js +0 -189
  291. package/package/utilities/index.js +0 -9
  292. package/package/utilities/reqres/index.js +0 -18
  293. package/package/utilities/test-data/data/domain.json +0 -7
  294. package/package/utilities/test-data/data/firstname.json +0 -16
  295. package/package/utilities/test-data/data/lastname.json +0 -10
  296. package/package/utilities/test-data/data/postcode.json +0 -12
  297. package/package/utilities/test-data/data/streetname.json +0 -8
  298. package/package/utilities/test-data/data/streetsuffix.json +0 -7
  299. package/package/utilities/test-data/data/town.json +0 -9
  300. package/package/utilities/test-data/index.js +0 -67
  301. package/package/wizard/behaviours/complete.js +0 -20
  302. package/package/wizard/behaviours/index.js +0 -5
  303. package/package/wizard/index.js +0 -124
  304. package/package/wizard/middleware/back-links.js +0 -68
  305. package/package/wizard/middleware/check-complete.js +0 -13
  306. package/package/wizard/middleware/check-progress.js +0 -139
  307. package/package/wizard/middleware/check-session.js +0 -17
  308. package/package/wizard/middleware/csrf.js +0 -47
  309. package/package/wizard/middleware/session-model.js +0 -11
  310. package/package/wizard/middleware/session.js +0 -9
  311. package/package/wizard/model.js +0 -29
  312. package/package/wizard/util/constants.js +0 -5
  313. package/package/wizard/util/helpers.js +0 -19
@@ -1,156 +0,0 @@
1
-
2
- const _ = require('lodash');
3
- const uuid = require('uuid').v1;
4
- const path = require('path');
5
- const express = require('express');
6
-
7
- module.exports = config => {
8
- const { returnTo, groupName, fieldsToGroup, combineValuesToSingleField, removePrefix, groupOptional } = config;
9
-
10
- if (removePrefix && typeof removePrefix !== 'string') {
11
- throw new Error('removePrefix is a string and is optional for loops');
12
- }
13
-
14
- if (combineValuesToSingleField && typeof combineValuesToSingleField !== 'string') {
15
- throw new Error('combineValuesToSingleField is a string and is optional for loops');
16
- }
17
-
18
- if (!returnTo || typeof returnTo !== 'string') {
19
- throw new Error('returnTo is a string and is required for loops');
20
- }
21
-
22
- if (!groupName || typeof groupName !== 'string') {
23
- throw new Error('groupName is a string and is required for loops');
24
- }
25
-
26
- if (!fieldsToGroup ||
27
- !fieldsToGroup.length ||
28
- !Array.isArray(fieldsToGroup) ||
29
- _.some(fieldsToGroup, field => typeof field !== 'string')) {
30
- throw new Error('fieldsToGroup is an array of strings and is required for loops');
31
- }
32
-
33
- return superclass => class extends superclass {
34
- get(req, res, next) {
35
- if (req.query.delete) {
36
- const router = express.Router({ mergeParams: true });
37
- router.use([
38
- // eslint-disable-next-line no-underscore-dangle
39
- this._configure.bind(this),
40
- this.removeItem.bind(this),
41
- this.reload.bind(this)
42
- ]);
43
- return router.handle(req, res, next);
44
- }
45
- return super.get(req, res, next);
46
- }
47
-
48
- getLoopFields(req) {
49
- let loopedFields = _.pick(req.sessionModel.toJSON(), fieldsToGroup);
50
-
51
- if (removePrefix) {
52
- loopedFields = _.mapKeys(loopedFields, (value, key) => key.replace(removePrefix, ''));
53
- }
54
- return loopedFields;
55
- }
56
-
57
- removeItem(req, res, next) {
58
- const id = req.query.delete;
59
- const items = req.sessionModel.get(groupName).filter(item => item.id !== id);
60
- req.sessionModel.set(groupName, items);
61
- next();
62
- }
63
-
64
- // eslint-disable-next-line no-unused-vars
65
- reload(req, res, next) {
66
- const items = req.sessionModel.get(groupName);
67
- if (!items.length) {
68
- req.sessionModel.set(`${groupName}-saved`, false);
69
- fieldsToGroup.forEach(field => {
70
- req.sessionModel.unset(field);
71
- });
72
- }
73
-
74
- const target = (items.length || groupOptional) ? req.form.options.route : returnTo;
75
- const action = req.params.action || '';
76
- res.redirect(path.join(req.baseUrl, target, action));
77
- }
78
-
79
- configure(req, res, next) {
80
- const field = `${groupName}-add-another`;
81
- // add yes/no field
82
- req.form.options.fields[field] = Object.assign({
83
- mixin: 'radio-group',
84
- validate: ['required'],
85
- options: [
86
- 'yes', 'no'
87
- ],
88
- legend: {
89
- className: 'visuallyhidden'
90
- }
91
- }, req.form.options.fieldSettings);
92
-
93
- // add conditonal fork
94
- req.form.options.forks = req.form.options.forks || [];
95
- req.form.options.forks.push({
96
- target: returnTo,
97
- continueOnEdit: true,
98
- condition: {
99
- field: field,
100
- value: 'yes'
101
- }
102
- });
103
- next();
104
- }
105
-
106
- getValues(req, res, next) {
107
- const fieldsGroup = req.sessionModel.get(groupName) || [];
108
- const added = req.sessionModel.get(`${groupName}-saved`);
109
- return super.getValues(req, res, (err, values) => {
110
- if (err) {
111
- return next(err);
112
- }
113
- if (!added) {
114
- const fields = this.getLoopFields(req);
115
- if (!_.isEmpty(fields)) {
116
- const newField = Object.assign({id: uuid()}, fields);
117
-
118
- if (combineValuesToSingleField) {
119
- const combinedValues = _.filter(fieldsToGroup.map(field => req.sessionModel.get(field))).join(', ');
120
- newField[combineValuesToSingleField] = combinedValues;
121
- }
122
-
123
- fieldsGroup.push(newField);
124
- values[groupName] = fieldsGroup;
125
- fieldsToGroup.forEach(field => req.sessionModel.unset(field));
126
-
127
- req.sessionModel.set(groupName, fieldsGroup);
128
- req.sessionModel.set(`${groupName}-saved`, true);
129
- }
130
- }
131
- return next(null, values);
132
- });
133
- }
134
-
135
- locals(req, res) {
136
- const items = req.form.values[groupName] || [];
137
- return Object.assign({}, super.locals(req, res), {
138
- items,
139
- hasItems: items.length > 0,
140
- field: groupName
141
- });
142
- }
143
-
144
- saveValues(req, res, next) {
145
- // remove "yes" value from session so it is no pre-populated next time around
146
- super.saveValues(req, res, err => {
147
- const field = `${groupName}-add-another`;
148
- if (req.form.values[field] === 'yes') {
149
- req.sessionModel.unset(field);
150
- req.sessionModel.set(`${groupName}-saved`, false);
151
- }
152
- next(err);
153
- });
154
- }
155
- };
156
- };
@@ -1,16 +0,0 @@
1
- 'use strict';
2
-
3
- module.exports = key => ({
4
- [`${key}-day`]: {
5
- label: 'Day',
6
- autocomplete: 'bday-day'
7
- },
8
- [`${key}-month`]: {
9
- label: 'Month',
10
- autocomplete: 'bday-month'
11
- },
12
- [`${key}-year`]: {
13
- label: 'Year',
14
- autocomplete: 'bday-year'
15
- }
16
- });
@@ -1,172 +0,0 @@
1
- 'use strict';
2
-
3
- const _ = require('lodash');
4
- const path = require('path');
5
- const getFields = require('./fields');
6
-
7
- const TEMPLATE = path.resolve(__dirname, './templates/date.html');
8
-
9
- // utility function taking the req.body, fields and key,
10
- // returns a map of values in the format:
11
- // {
12
- // day: '01',
13
- // month: '01',
14
- // year: '2017'
15
- // }
16
- const getParts = (body, fields, key) =>
17
- _.mapKeys(_.pick(body, Object.keys(fields)), (value, fieldKey) =>
18
- fieldKey.replace(`${key}-`, '')
19
- );
20
-
21
- // accepts a date value in the format YYYY-MM-DD and fields config,
22
- // returns a map of key: value pairs for the intermedate fields
23
- const getPartsFromDate = (date, fields) =>
24
- date.split('-')
25
- .slice()
26
- .reverse()
27
- .reduce((obj, value, index) => Object.assign({}, obj, {
28
- [fields[index]]: value
29
- }), {});
30
-
31
- // preprend '0' if number is only a single digit
32
- const pad = num => num !== '' && num.length < 2 ? `0${num}` : num;
33
-
34
- const conditionalTranslate = (key, translate) => {
35
- let result = translate(key);
36
- if (result === key) {
37
- result = null;
38
- }
39
- return result;
40
- };
41
-
42
- const getLegendClassName = field => field && field.legend && field.legend.className || '';
43
- const getIsPageHeading = field => field && field.isPageHeading || '';
44
-
45
- module.exports = (key, opts) => {
46
- if (!key) {
47
- throw new Error('Key must be passed to date component');
48
- }
49
- const options = opts || {};
50
- const template = options.template ?
51
- path.resolve(__dirname, options.template) :
52
- TEMPLATE;
53
- const fields = getFields(key);
54
-
55
- options.validate = _.uniq(options.validate ? ['date'].concat(options.validate) : ['date']);
56
-
57
- let dayOptional = !!options.dayOptional;
58
- const monthOptional = !!options.monthOptional;
59
-
60
- if (monthOptional) {
61
- dayOptional = true;
62
- }
63
-
64
- // take the 3 date parts, padding or defaulting
65
- // to '01' if applic, then create a date value in the
66
- // format YYYY-MM-DD. Save to req.body for processing
67
- const preProcess = (req, res, next) => {
68
- const parts = getParts(req.body, fields, key);
69
- if (_.some(parts, part => part !== '')) {
70
- if (dayOptional && parts.day === '') {
71
- parts.day = '01';
72
- } else {
73
- parts.day = pad(parts.day);
74
- }
75
- if (monthOptional && parts.month === '') {
76
- parts.month = '01';
77
- } else {
78
- parts.month = pad(parts.month);
79
- }
80
- req.body[key] = `${parts.year}-${parts.month}-${parts.day}`;
81
- }
82
- next();
83
- };
84
-
85
- // defaultFormatters on the base controller replace '--' with '-' on the process step.
86
- // This ensures having the correct number of hyphens, so values do not jump from year to month.
87
- // This should only be done on a partially completed date field otherwise the validation messages break.
88
- const postProcess = (req, res, next) => {
89
- const value = req.form.values[key];
90
- if (value) {
91
- req.form.values[key] = req.body[key];
92
- }
93
- next();
94
- };
95
- // if date field is included in errorValues, extend
96
- // errorValues with the individual components
97
- const preGetErrors = (req, res, next) => {
98
- const errorValues = req.sessionModel.get('errorValues');
99
- if (errorValues && errorValues[key]) {
100
- req.sessionModel.set('errorValues',
101
- Object.assign({}, errorValues, getPartsFromDate(errorValues[key], Object.keys(fields)))
102
- );
103
- }
104
- next();
105
- };
106
-
107
- // if date field has any validation error, also add errors
108
- // for the three child components. null type as we don't want to show
109
- // duplicate messages
110
- const postGetErrors = (req, res, next) => {
111
- const errors = req.sessionModel.get('errors');
112
- if (errors && errors[key]) {
113
- Object.assign(req.form.errors, Object.keys(fields).reduce((obj, field) =>
114
- Object.assign({}, obj, { [field]: { type: null } })
115
- , {}));
116
- }
117
- next();
118
- };
119
-
120
- // if date value is set, split its parts and assign to req.form.values.
121
- // This is extended with errorValues if they are present
122
- const postGetValues = (req, res, next) => {
123
- const date = req.form.values[key];
124
- if (date) {
125
- Object.assign(
126
- req.form.values,
127
- getPartsFromDate(date, Object.keys(fields)),
128
- req.sessionModel.get('errorValues') || {}
129
- );
130
- }
131
- next();
132
- };
133
-
134
- // render the template to a string, assign the html output
135
- // to the date field in res.locals.fields
136
- const preRender = (req, res, next) => {
137
- Object.assign(req.form.options.fields, _.mapValues(fields, (v, k) => {
138
- const rawKey = k.replace(`${key}-`, '');
139
- const labelKey = `fields.${key}.parts.${rawKey}`;
140
- const label = req.translate(labelKey);
141
- return Object.assign({}, v, {
142
- label: label === labelKey ? v.label : label
143
- });
144
- }));
145
- const legend = conditionalTranslate(`fields.${key}.legend`, req.translate);
146
- const hint = conditionalTranslate(`fields.${key}.hint`, req.translate);
147
- const legendClassName = getLegendClassName(options);
148
- const isPageHeading = getIsPageHeading(options);
149
- const error = req.form.errors && req.form.errors[key];
150
- res.render(template, { key, legend, legendClassName, isPageHeading, hint, error }, (err, html) => {
151
- if (err) {
152
- next(err);
153
- } else {
154
- const field = res.locals.fields.find(f => f.key === key);
155
- Object.assign(field, { html });
156
- next();
157
- }
158
- });
159
- };
160
-
161
- // return config extended with hooks
162
- return Object.assign({}, options, {
163
- hooks: {
164
- 'pre-process': preProcess,
165
- 'post-process': postProcess,
166
- 'pre-getErrors': preGetErrors,
167
- 'post-getErrors': postGetErrors,
168
- 'post-getValues': postGetValues,
169
- 'pre-render': preRender
170
- }
171
- });
172
- };
@@ -1,20 +0,0 @@
1
- <div class="govuk-form-group {{#error}}govuk-form-group--error{{/error}}">
2
- <fieldset id="{{key}}-group" class="govuk-fieldset{{#className}} {{className}}{{/className}}" role="group">
3
- <legend class="govuk-fieldset__legend {{#isPageHeading}}govuk-fieldset__legend--l{{/isPageHeading}}{{#legendClassName}} {{legendClassName}}{{/legendClassName}}">
4
- {{#isPageHeading}}<h1 class="govuk-fieldset__heading">{{/isPageHeading}}
5
- {{legend}}
6
- {{#isPageHeading}}</h1>{{/isPageHeading}}
7
- </legend>
8
- {{#hint}}
9
- <span id="{{key}}-hint" class="govuk-hint">{{{hint}}}</span>
10
- {{/hint}}
11
- {{#error}}
12
- <p id="{{key}}-error" class="govuk-error-message">
13
- <span class="govuk-visually-hidden">Error:</span> {{error.message}}
14
- </p>
15
- {{/error}}
16
- <div id="{{key}}" class="govuk-date-input">
17
- {{#input-date}}{{key}}{{/input-date}}
18
- </div>
19
- </fieldset>
20
- </div>
@@ -1,51 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
- const Hogan = require('hogan.js');
6
- const debug = require('debug')('hof:emailer');
7
-
8
- const Emailer = require('./emailer');
9
-
10
- module.exports = class EmailService {
11
- constructor(opts) {
12
- const options = opts || {};
13
- this.layout = options.layout === undefined ? path.resolve(__dirname, './views/layout.html') : options.layout;
14
- this.emailer = new Emailer(options);
15
- }
16
-
17
- send(r, b, s) {
18
- let body = b;
19
- let subject = s;
20
- let recipient = r;
21
-
22
- if (arguments.length === 1 && recipient.recipient) {
23
- body = recipient.body;
24
- subject = recipient.subject;
25
- recipient = recipient.recipient;
26
- }
27
- return this.render(recipient, body, subject)
28
- .then(content => this.emailer.send(recipient, subject, content));
29
- }
30
-
31
- render(recipient, body, subject) {
32
- if (this.layout) {
33
- return this.template()
34
- .then(template => template.render({ recipient, body, subject }));
35
- }
36
- return Promise.resolve(body);
37
- }
38
-
39
- template() {
40
- debug(`Reading template file: ${this.layout}`);
41
- return new Promise((resolve, reject) => {
42
- fs.readFile(this.layout, (err, content) => {
43
- if (err) {
44
- reject(err);
45
- } else {
46
- resolve(Hogan.compile(content.toString('utf8')));
47
- }
48
- });
49
- });
50
- }
51
- };
@@ -1,53 +0,0 @@
1
- 'use strict';
2
-
3
- const path = require('path');
4
- const nodemailer = require('nodemailer');
5
- const transports = require('./transports');
6
-
7
- const debug = require('debug')('hof:emailer');
8
-
9
- module.exports = class Emailer {
10
- constructor(opts) {
11
- const options = opts || {};
12
- this.options = options;
13
-
14
- options.transport = options.transport || 'smtp';
15
- debug(`Using ${options.transport} transport`);
16
-
17
- if (options.transport !== 'stub' && !options.from && !options.replyTo) {
18
- throw new Error('At least one of `from` or `replyTo` options must be defined');
19
- }
20
-
21
- const transport = transports[options.transport](options.transportOptions || {});
22
-
23
- this.emailer = nodemailer.createTransport(transport);
24
- }
25
-
26
- send(to, subject, body) {
27
- debug(`Sending email to ${to} with subject ${subject}`);
28
- return new Promise((resolve, reject) => {
29
- this.emailer.sendMail({
30
- to,
31
- subject,
32
- from: this.options.from || this.options.replyTo,
33
- replyTo: this.options.replyTo || this.options.from,
34
- html: body,
35
- attachments: [{
36
- filename: 'govuk_logotype_email.png',
37
- path: path.resolve(__dirname, './assets/images/govuk_logotype_email.png'),
38
- cid: 'govuk_logotype_email'
39
- },
40
- {
41
- filename: 'ho_crest_27px.png',
42
- path: path.resolve(__dirname, './assets/images/ho_crest_27px.png'),
43
- cid: 'ho_crest_27px'
44
- },
45
- {
46
- filename: 'spacer.gif',
47
- path: path.resolve(__dirname, './assets/images/spacer.gif'),
48
- cid: 'spacer_image'
49
- }]
50
- }, (err, result) => err ? reject(err) : resolve(result));
51
- });
52
- }
53
- };
@@ -1,74 +0,0 @@
1
- 'use strict';
2
-
3
- const EmailService = require('./email-service');
4
- const Hogan = require('hogan.js');
5
- const fs = require('fs');
6
- const debug = require('debug')('hof:behaviour:emailer');
7
-
8
- module.exports = config => {
9
- const emailer = new EmailService(config);
10
- config.parse = config.parse || (data => data);
11
-
12
- if (!config.recipient) {
13
- throw new Error('hof-behaviour-emailer: email recipient must be defined');
14
- }
15
- if (typeof config.template !== 'string') {
16
- throw new Error('hof-behaviour-emailer: email template must be defined');
17
- }
18
-
19
- return superclass => class EmailBehaviour extends superclass {
20
- async successHandler(req, res, next) {
21
- req.sessionModel.unset('nodemailer-error');
22
-
23
- try {
24
- debug(`Loading email template from ${config.template}`);
25
-
26
- const template = await new Promise((resolve, reject) => {
27
- return fs.readFile(config.template, (err, resolvedTemplate) => {
28
- return err ? reject(err) : resolve(resolvedTemplate.toString('utf8'));
29
- });
30
- });
31
-
32
- debug('Rendering email content');
33
-
34
- const data = config.parse(req.sessionModel.toJSON(), req.translate);
35
-
36
- debug('Building email settings');
37
-
38
- const settings = { body: Hogan.compile(template).render(data) };
39
-
40
- if (typeof config.recipient === 'function') {
41
- settings.recipient = config.recipient(req.sessionModel.toJSON());
42
- } else {
43
- settings.recipient = req.sessionModel.get(config.recipient) || config.recipient;
44
- }
45
- if (typeof settings.recipient !== 'string' || !settings.recipient.includes('@')) {
46
- return next(new Error('hof-behaviour-emailer: invalid recipient'));
47
- }
48
-
49
- if (typeof config.subject === 'function') {
50
- settings.subject = config.subject(req.sessionModel.toJSON(), req.translate);
51
- } else {
52
- settings.subject = config.subject;
53
- }
54
-
55
- debug('Sending email', settings);
56
-
57
- await emailer.send(settings);
58
-
59
- debug('Email sent successfully');
60
-
61
- return super.successHandler(req, res, next);
62
- } catch (e) {
63
- if (config.emailerFallback) {
64
- req.log('error', e.message || e);
65
- req.sessionModel.set('nodemailer-error', true);
66
- return super.successHandler(req, res, next);
67
- }
68
- return next(e);
69
- }
70
- }
71
- };
72
- };
73
-
74
- module.exports.EmailService = EmailService;
@@ -1,74 +0,0 @@
1
- /* eslint-disable max-len, no-console */
2
- 'use strict';
3
-
4
- const fs = require('fs');
5
- const path = require('path');
6
- const cp = require('child_process');
7
-
8
- const mimes = {
9
- '.gif': 'image/gif',
10
- '.png': 'image/png'
11
- };
12
-
13
- const mkdir = dir => new Promise((resolve, reject) => {
14
- fs.mkdir(dir, {recursive: true}, err => err ? reject(err) : resolve());
15
- });
16
-
17
- const cidToBase64 = (h, attachments) => {
18
- let html = h;
19
- const list = attachments.reduce((p, attachment) => {
20
- const mimeType = mimes[path.extname(attachment.path)];
21
- return p
22
- .then(map => new Promise((resolve, reject) => fs.readFile(attachment.path, (err, buffer) => err ? reject(err) : resolve(buffer.toString('base64'))))
23
- .then(data => {
24
- map[attachment.cid] = `"data:${mimeType};base64,${data}"`;
25
- return map;
26
- }));
27
- }, Promise.resolve({}));
28
-
29
- return list.then(files => {
30
- Object.keys(files).forEach(cid => {
31
- html = html.replace(`"cid:${cid}"`, files[cid]);
32
- });
33
- return html;
34
- });
35
- };
36
-
37
- module.exports = options => {
38
- options.log = options.log !== false;
39
- return {
40
- name: 'debug',
41
- version: '1.0.0',
42
- send: (mail, callback) => {
43
- mail.resolveContent(mail.data, 'html', (err, html) => {
44
- if (err) {
45
- return callback(err);
46
- }
47
- const dir = options.dir || path.join(process.cwd(), '.emails');
48
- const messageId = options.filename || mail.message.messageId().split('@')[0].slice(1);
49
- const outfile = path.resolve(dir, `${messageId}.html`);
50
-
51
- return mkdir(dir)
52
- .then(() => cidToBase64(html, mail.data.attachments))
53
- .then(inlined => new Promise((resolve, reject) => {
54
- fs.writeFile(outfile, inlined, e => e ? reject(e) : resolve(inlined));
55
- }))
56
- .then(() => {
57
- if (options.log) {
58
- console.log('Email sent:');
59
- console.log(` to: ${mail.data.to}`);
60
- console.log(` subject: ${mail.data.subject}`);
61
- console.log(` html: ${outfile}`);
62
- }
63
- })
64
- .then(() => {
65
- if (options.open) {
66
- cp.execSync(`open ${outfile}`);
67
- }
68
- callback();
69
- })
70
- .catch(callback);
71
- });
72
- }
73
- };
74
- };
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- module.exports = {
4
- smtp: require('./smtp'),
5
- ses: require('./ses'),
6
- stub: require('./stub'),
7
- debug: require('./debug')
8
- };
@@ -1,36 +0,0 @@
1
- 'use strict';
2
-
3
- const ses = require('nodemailer-ses-transport');
4
-
5
- module.exports = options => {
6
- if (!options.accessKeyId) {
7
- throw new Error('Required option `accessKeyId` not found.');
8
- }
9
- if (!options.secretAccessKey) {
10
- throw new Error('Required option `secretAccessKey` not found.');
11
- }
12
-
13
- const opts = {
14
- accessKeyId: options.accessKeyId,
15
- secretAccessKey: options.secretAccessKey
16
- };
17
-
18
- opts.region = options.region || 'eu-west-1';
19
-
20
- if (options.sessionToken) {
21
- opts.sessionToken = options.sessionToken;
22
- }
23
-
24
- if (options.httpOptions) {
25
- opts.httpOptions = options.httpOptions;
26
- }
27
-
28
- if (options.rateLimit !== undefined) {
29
- opts.rateLimit = options.rateLimit;
30
- }
31
-
32
- if (options.maxConnections !== undefined) {
33
- opts.maxConnections = options.maxConnections;
34
- }
35
- return ses(opts);
36
- };