hof 22.8.4 → 22.9.0-beta.v1

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 (325) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +30 -0
  3. package/config/hof-defaults.js +6 -1
  4. package/frontend/govuk-template/govuk_template_generated.html +102 -0
  5. package/frontend/template-partials/views/layout.html +2 -8
  6. package/frontend/themes/gov-uk/styles/_cookie-banner.scss +0 -3
  7. package/lib/settings.js +1 -0
  8. package/package/.eslintignore +1 -0
  9. package/package/CHANGELOG.md +232 -0
  10. package/package/LICENSE +21 -0
  11. package/package/README.md +1887 -0
  12. package/package/bin/hof-build +10 -0
  13. package/package/bin/hof-transpiler +12 -0
  14. package/package/build/helpers/importer.js +29 -0
  15. package/package/build/helpers/local.js +35 -0
  16. package/package/build/helpers/resolver/import.js +32 -0
  17. package/package/build/helpers/resolver/nearest-package-root.js +33 -0
  18. package/package/build/helpers/resolver/package.js +29 -0
  19. package/package/build/helpers/resolver.js +16 -0
  20. package/package/build/index.js +49 -0
  21. package/package/build/lib/env.js +36 -0
  22. package/package/build/lib/mkdir.js +9 -0
  23. package/package/build/lib/run.js +17 -0
  24. package/package/build/lib/spawn.js +18 -0
  25. package/package/build/tasks/browserify/compress.js +15 -0
  26. package/package/build/tasks/browserify/index.js +48 -0
  27. package/package/build/tasks/build/index.js +6 -0
  28. package/package/build/tasks/images/index.js +27 -0
  29. package/package/build/tasks/index.js +8 -0
  30. package/package/build/tasks/sass/index.js +67 -0
  31. package/package/build/tasks/translate/index.js +20 -0
  32. package/package/build/tasks/watch/index.js +161 -0
  33. package/package/components/address-lookup/default-model.js +76 -0
  34. package/package/components/address-lookup/defaults.js +25 -0
  35. package/package/components/address-lookup/index.js +251 -0
  36. package/package/components/address-lookup/templates/address-lookup.html +14 -0
  37. package/package/components/address-lookup/templates/address.html +22 -0
  38. package/package/components/address-lookup/templates/postcode.html +9 -0
  39. package/package/components/clear-session/Readme.md +46 -0
  40. package/package/components/clear-session/index.js +26 -0
  41. package/package/components/combine-and-loop-fields/Readme.md +42 -0
  42. package/package/components/combine-and-loop-fields/index.js +156 -0
  43. package/package/components/date/fields.js +16 -0
  44. package/package/components/date/index.js +172 -0
  45. package/package/components/date/templates/date.html +20 -0
  46. package/package/components/emailer/assets/images/govuk_logotype_email.png +0 -0
  47. package/package/components/emailer/assets/images/ho_crest_27px.png +0 -0
  48. package/package/components/emailer/assets/images/spacer.gif +0 -0
  49. package/package/components/emailer/email-service.js +51 -0
  50. package/package/components/emailer/emailer.js +53 -0
  51. package/package/components/emailer/index.js +74 -0
  52. package/package/components/emailer/transports/debug.js +74 -0
  53. package/package/components/emailer/transports/index.js +8 -0
  54. package/package/components/emailer/transports/ses.js +36 -0
  55. package/package/components/emailer/transports/smtp.js +26 -0
  56. package/package/components/emailer/transports/stub.js +5 -0
  57. package/package/components/emailer/views/layout.html +63 -0
  58. package/package/components/homeoffice-countries/index.js +22 -0
  59. package/package/components/index.js +13 -0
  60. package/package/components/notify/index.js +62 -0
  61. package/package/components/notify/notify.js +51 -0
  62. package/package/components/session-timeout-warning/index.js +67 -0
  63. package/package/components/summary/index.js +237 -0
  64. package/package/config/builder-defaults.js +45 -0
  65. package/package/config/component-defaults.js +13 -0
  66. package/package/config/hof-defaults.js +65 -0
  67. package/package/config/rate-limits.js +20 -0
  68. package/package/config/sanitisation-rules.js +32 -0
  69. package/package/controller/base-controller.js +296 -0
  70. package/package/controller/behaviour-hooks.js +51 -0
  71. package/package/controller/behaviour-session.js +64 -0
  72. package/package/controller/controller.js +258 -0
  73. package/package/controller/deprecate-error.js +10 -0
  74. package/package/controller/formatting/formatters.js +70 -0
  75. package/package/controller/formatting/index.js +32 -0
  76. package/package/controller/index.js +17 -0
  77. package/package/controller/validation/email.js +30 -0
  78. package/package/controller/validation/index.js +101 -0
  79. package/package/controller/validation/validators.js +181 -0
  80. package/package/controller/validation-error.js +14 -0
  81. package/package/frontend/govuk-template/build/config.js +24 -0
  82. package/package/frontend/govuk-template/build/govuk_template.html +102 -0
  83. package/package/frontend/govuk-template/build/index.js +23 -0
  84. package/package/frontend/govuk-template/govuk_template_generated.html +102 -0
  85. package/package/frontend/govuk-template/index.js +29 -0
  86. package/package/frontend/index.js +9 -0
  87. package/package/frontend/template-mixins/mixins/helpers.js +103 -0
  88. package/package/frontend/template-mixins/mixins/index.js +37 -0
  89. package/package/frontend/template-mixins/mixins/render.js +12 -0
  90. package/package/frontend/template-mixins/mixins/template-mixins.js +520 -0
  91. package/package/frontend/template-mixins/partials/forms/checkbox-group.html +47 -0
  92. package/package/frontend/template-mixins/partials/forms/checkbox.html +16 -0
  93. package/package/frontend/template-mixins/partials/forms/input-submit.html +1 -0
  94. package/package/frontend/template-mixins/partials/forms/input-text-date.html +37 -0
  95. package/package/frontend/template-mixins/partials/forms/input-text-group.html +45 -0
  96. package/package/frontend/template-mixins/partials/forms/option-group.html +43 -0
  97. package/package/frontend/template-mixins/partials/forms/select.html +17 -0
  98. package/package/frontend/template-mixins/partials/forms/textarea-group.html +37 -0
  99. package/package/frontend/template-mixins/partials/mixins/panel.html +4 -0
  100. package/package/frontend/template-partials/index.js +9 -0
  101. package/package/frontend/template-partials/translations/index.js +26 -0
  102. package/package/frontend/template-partials/translations/src/cy/base.json +4 -0
  103. package/package/frontend/template-partials/translations/src/cy/buttons.json +6 -0
  104. package/package/frontend/template-partials/translations/src/cy/cookies.json +104 -0
  105. package/package/frontend/template-partials/translations/src/cy/errorlist.json +6 -0
  106. package/package/frontend/template-partials/translations/src/cy/errors.json +18 -0
  107. package/package/frontend/template-partials/translations/src/cy/terms.json +28 -0
  108. package/package/frontend/template-partials/translations/src/en/accessibility.json +43 -0
  109. package/package/frontend/template-partials/translations/src/en/base.json +5 -0
  110. package/package/frontend/template-partials/translations/src/en/buttons.json +10 -0
  111. package/package/frontend/template-partials/translations/src/en/cookies.json +116 -0
  112. package/package/frontend/template-partials/translations/src/en/errorlist.json +7 -0
  113. package/package/frontend/template-partials/translations/src/en/errors.json +35 -0
  114. package/package/frontend/template-partials/translations/src/en/exit.json +5 -0
  115. package/package/frontend/template-partials/translations/src/en/fields.json +5 -0
  116. package/package/frontend/template-partials/translations/src/en/journey.json +6 -0
  117. package/package/frontend/template-partials/translations/src/en/save-and-exit.json +4 -0
  118. package/package/frontend/template-partials/translations/src/en/terms.json +28 -0
  119. package/package/frontend/template-partials/views/404.html +9 -0
  120. package/package/frontend/template-partials/views/accessibility.html +55 -0
  121. package/package/frontend/template-partials/views/confirm.html +8 -0
  122. package/package/frontend/template-partials/views/confirmation.html +19 -0
  123. package/package/frontend/template-partials/views/content/en/what-happens-next.md +0 -0
  124. package/package/frontend/template-partials/views/cookie-error.html +1 -0
  125. package/package/frontend/template-partials/views/cookies.html +84 -0
  126. package/package/frontend/template-partials/views/email/data-row.html +4 -0
  127. package/package/frontend/template-partials/views/email/formatted.html +12 -0
  128. package/package/frontend/template-partials/views/email/layout.html +63 -0
  129. package/package/frontend/template-partials/views/email/raw.html +11 -0
  130. package/package/frontend/template-partials/views/email/section-row.html +3 -0
  131. package/package/frontend/template-partials/views/error.html +20 -0
  132. package/package/frontend/template-partials/views/exit.html +9 -0
  133. package/package/frontend/template-partials/views/feedback-submitted.html +11 -0
  134. package/package/frontend/template-partials/views/layout.html +55 -0
  135. package/package/frontend/template-partials/views/partials/analytics-table.html +25 -0
  136. package/package/frontend/template-partials/views/partials/back.html +5 -0
  137. package/package/frontend/template-partials/views/partials/bullet-list.html +7 -0
  138. package/package/frontend/template-partials/views/partials/confirmation-alert.html +6 -0
  139. package/package/frontend/template-partials/views/partials/continue.html +5 -0
  140. package/package/frontend/template-partials/views/partials/cookie-banner.html +29 -0
  141. package/package/frontend/template-partials/views/partials/cookie-notification.html +4 -0
  142. package/package/frontend/template-partials/views/partials/cookie-settings-button.html +1 -0
  143. package/package/frontend/template-partials/views/partials/cookie-settings-radio.html +8 -0
  144. package/package/frontend/template-partials/views/partials/details-summary.html +8 -0
  145. package/package/frontend/template-partials/views/partials/external-link.html +1 -0
  146. package/package/frontend/template-partials/views/partials/form.html +10 -0
  147. package/package/frontend/template-partials/views/partials/gatag.html +60 -0
  148. package/package/frontend/template-partials/views/partials/head.html +31 -0
  149. package/package/frontend/template-partials/views/partials/heading.html +11 -0
  150. package/package/frontend/template-partials/views/partials/items-table.html +32 -0
  151. package/package/frontend/template-partials/views/partials/maincontent-left.html +10 -0
  152. package/package/frontend/template-partials/views/partials/navigation.html +8 -0
  153. package/package/frontend/template-partials/views/partials/page.html +23 -0
  154. package/package/frontend/template-partials/views/partials/panel-indent.html +3 -0
  155. package/package/frontend/template-partials/views/partials/session-cookies-table.html +28 -0
  156. package/package/frontend/template-partials/views/partials/session-timeout-warning.html +38 -0
  157. package/package/frontend/template-partials/views/partials/summary-table-row.html +14 -0
  158. package/package/frontend/template-partials/views/partials/summary-table.html +8 -0
  159. package/package/frontend/template-partials/views/partials/table.html +18 -0
  160. package/package/frontend/template-partials/views/partials/validation-list.html +3 -0
  161. package/package/frontend/template-partials/views/partials/validation-summary.html +25 -0
  162. package/package/frontend/template-partials/views/partials/warn.html +7 -0
  163. package/package/frontend/template-partials/views/rate-limit-error.html +10 -0
  164. package/package/frontend/template-partials/views/save-and-exit.html +17 -0
  165. package/package/frontend/template-partials/views/service-unavailable.html +13 -0
  166. package/package/frontend/template-partials/views/session-timeout.html +7 -0
  167. package/package/frontend/template-partials/views/step.html +14 -0
  168. package/package/frontend/template-partials/views/terms.html +26 -0
  169. package/package/frontend/themes/gov-uk/client-js/cookieSettings.js +145 -0
  170. package/package/frontend/themes/gov-uk/client-js/govuk-cookies.js +121 -0
  171. package/package/frontend/themes/gov-uk/client-js/index.js +27 -0
  172. package/package/frontend/themes/gov-uk/client-js/session-timeout-dialog.js +348 -0
  173. package/package/frontend/themes/gov-uk/client-js/skip-to-main.js +19 -0
  174. package/package/frontend/themes/gov-uk/index.js +9 -0
  175. package/package/frontend/themes/gov-uk/styles/_base.scss +17 -0
  176. package/package/frontend/themes/gov-uk/styles/_check_your_answers.scss +155 -0
  177. package/package/frontend/themes/gov-uk/styles/_cookie-banner.scss +111 -0
  178. package/package/frontend/themes/gov-uk/styles/_cookie-settings.scss +33 -0
  179. package/package/frontend/themes/gov-uk/styles/_govuk_frontend_toolkit.scss +23 -0
  180. package/package/frontend/themes/gov-uk/styles/_helpers.scss +5 -0
  181. package/package/frontend/themes/gov-uk/styles/_layout.scss +125 -0
  182. package/package/frontend/themes/gov-uk/styles/_panel-indent.scss +27 -0
  183. package/package/frontend/themes/gov-uk/styles/_pdf.scss +42 -0
  184. package/package/frontend/themes/gov-uk/styles/_session-timeout-dialog.scss +121 -0
  185. package/package/frontend/themes/gov-uk/styles/_typography.scss +27 -0
  186. package/package/frontend/themes/gov-uk/styles/_variables.scss +11 -0
  187. package/package/frontend/themes/gov-uk/styles/govuk.scss +43 -0
  188. package/package/frontend/themes/gov-uk/styles/mixins.scss +16 -0
  189. package/package/frontend/themes/gov-uk/styles/modules/_alerts.scss +73 -0
  190. package/package/frontend/themes/gov-uk/styles/modules/_buttons.scss +5 -0
  191. package/package/frontend/themes/gov-uk/styles/modules/_character-count.scss +8 -0
  192. package/package/frontend/themes/gov-uk/styles/modules/_confirm-page.scss +20 -0
  193. package/package/frontend/themes/gov-uk/styles/modules/_lists.scss +5 -0
  194. package/package/frontend/themes/gov-uk/styles/modules/_progressive-reveal.scss +17 -0
  195. package/package/frontend/themes/gov-uk/styles/modules/_validation.scss +51 -0
  196. package/package/frontend/themes/index.js +5 -0
  197. package/package/frontend/toolkit/assets/images/passports/new-window-link-blue.png +0 -0
  198. package/package/frontend/toolkit/assets/images/passports/new-window-link.png +0 -0
  199. package/package/frontend/toolkit/assets/images/spinner.gif +0 -0
  200. package/package/frontend/toolkit/assets/javascript/character-count.js +99 -0
  201. package/package/frontend/toolkit/assets/javascript/form-focus.js +101 -0
  202. package/package/frontend/toolkit/assets/javascript/helpers.js +177 -0
  203. package/package/frontend/toolkit/assets/javascript/progressive-reveal.js +72 -0
  204. package/package/frontend/toolkit/assets/javascript/validation.js +71 -0
  205. package/package/frontend/toolkit/assets/javascript/vendor/details.polyfill.js +189 -0
  206. package/package/frontend/toolkit/assets/javascript/vendor/indexof.polyfill.js +39 -0
  207. package/package/frontend/toolkit/assets/javascript/vendor/safari-cachebuster.js +6 -0
  208. package/package/frontend/toolkit/assets/stylesheets/_base.scss +17 -0
  209. package/package/frontend/toolkit/assets/stylesheets/_helpers.scss +5 -0
  210. package/package/frontend/toolkit/assets/stylesheets/_layout.scss +118 -0
  211. package/package/frontend/toolkit/assets/stylesheets/_typography.scss +27 -0
  212. package/package/frontend/toolkit/assets/stylesheets/_variables.scss +11 -0
  213. package/package/frontend/toolkit/assets/stylesheets/app.scss +30 -0
  214. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_buttons.scss +47 -0
  215. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_details.scss +38 -0
  216. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_elements-typography.scss +175 -0
  217. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_forms.scss +167 -0
  218. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_helpers.scss +39 -0
  219. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_layout.scss +67 -0
  220. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_lists.scss +40 -0
  221. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_panels.scss +29 -0
  222. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_reset.scss +33 -0
  223. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/_tables.scss +33 -0
  224. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/forms/_form-block-labels.scss +63 -0
  225. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/forms/_form-date.scss +39 -0
  226. package/package/frontend/toolkit/assets/stylesheets/govuk-elements/forms/_form-validation.scss +63 -0
  227. package/package/frontend/toolkit/assets/stylesheets/mixins.scss +16 -0
  228. package/package/frontend/toolkit/assets/stylesheets/modules/_alerts.scss +73 -0
  229. package/package/frontend/toolkit/assets/stylesheets/modules/_buttons.scss +5 -0
  230. package/package/frontend/toolkit/assets/stylesheets/modules/_confirm-page.scss +20 -0
  231. package/package/frontend/toolkit/assets/stylesheets/modules/_lists.scss +5 -0
  232. package/package/frontend/toolkit/assets/stylesheets/modules/_progressive-reveal.scss +17 -0
  233. package/package/frontend/toolkit/assets/stylesheets/modules/_validation.scss +51 -0
  234. package/package/frontend/toolkit/index.js +10 -0
  235. package/package/index.js +351 -0
  236. package/package/lib/deindex.js +18 -0
  237. package/package/lib/encryption.js +23 -0
  238. package/package/lib/ga-tag.js +89 -0
  239. package/package/lib/health.js +26 -0
  240. package/package/lib/helpers.js +66 -0
  241. package/package/lib/logger.js +65 -0
  242. package/package/lib/markdown.js +46 -0
  243. package/package/lib/router.js +111 -0
  244. package/package/lib/serve-static.js +12 -0
  245. package/package/lib/sessions.js +82 -0
  246. package/package/lib/settings.js +74 -0
  247. package/package/lib/which.js +28 -0
  248. package/package/middleware/cookies.js +43 -0
  249. package/package/middleware/deep-translate.js +32 -0
  250. package/package/middleware/errors.js +119 -0
  251. package/package/middleware/index.js +10 -0
  252. package/package/middleware/not-found.js +38 -0
  253. package/package/middleware/rate-limiter.js +98 -0
  254. package/package/middleware/service-unavailable.js +64 -0
  255. package/package/model/apis/axios-settings.js +21 -0
  256. package/package/model/apis/html-to-pdf-converter.js +35 -0
  257. package/package/model/apis/index.js +5 -0
  258. package/package/model/index.js +348 -0
  259. package/package/package.json +147 -0
  260. package/package/sandbox/README.md +66 -0
  261. package/package/sandbox/apps/sandbox/behaviours/clear-session.js +8 -0
  262. package/package/sandbox/apps/sandbox/behaviours/country-select.js +10 -0
  263. package/package/sandbox/apps/sandbox/behaviours/international-number.js +22 -0
  264. package/package/sandbox/apps/sandbox/fields.js +128 -0
  265. package/package/sandbox/apps/sandbox/index.js +99 -0
  266. package/package/sandbox/apps/sandbox/lib/staticAppealStages.js +189 -0
  267. package/package/sandbox/apps/sandbox/sections/summary-data-sections.js +43 -0
  268. package/package/sandbox/apps/sandbox/translations/src/en/errors.json +5 -0
  269. package/package/sandbox/apps/sandbox/translations/src/en/exit.json +4 -0
  270. package/package/sandbox/apps/sandbox/translations/src/en/fields.json +101 -0
  271. package/package/sandbox/apps/sandbox/translations/src/en/journey.json +7 -0
  272. package/package/sandbox/apps/sandbox/translations/src/en/pages.json +72 -0
  273. package/package/sandbox/apps/sandbox/translations/src/en/validation.json +54 -0
  274. package/package/sandbox/apps/sandbox/views/form-guidance-link.html +8 -0
  275. package/package/sandbox/apps/sandbox/views/save-and-exit.html +19 -0
  276. package/package/sandbox/assets/images/icons/icon-caret-left.png +0 -0
  277. package/package/sandbox/assets/images/icons/icon-complete.png +0 -0
  278. package/package/sandbox/assets/images/icons/icon-cross-remove-sign.png +0 -0
  279. package/package/sandbox/assets/js/index.js +70 -0
  280. package/package/sandbox/assets/scss/app.scss +27 -0
  281. package/package/sandbox/codecept.conf.js +15 -0
  282. package/package/sandbox/config.js +17 -0
  283. package/package/sandbox/package.json +26 -0
  284. package/package/sandbox/server.js +23 -0
  285. package/package/sandbox/yarn.lock +262 -0
  286. package/package/transpiler/index.js +2 -0
  287. package/package/transpiler/lib/aggregate.js +32 -0
  288. package/package/transpiler/lib/build.js +15 -0
  289. package/package/transpiler/lib/compile.js +12 -0
  290. package/package/transpiler/lib/expand-dirs.js +14 -0
  291. package/package/transpiler/lib/write-files.js +24 -0
  292. package/package/utilities/autofill/index.js +189 -0
  293. package/package/utilities/autofill/inputs.js +60 -0
  294. package/package/utilities/countries.js +12 -0
  295. package/package/utilities/helpers/index.js +189 -0
  296. package/package/utilities/index.js +9 -0
  297. package/package/utilities/reqres/index.js +18 -0
  298. package/package/utilities/test-data/data/domain.json +7 -0
  299. package/package/utilities/test-data/data/firstname.json +16 -0
  300. package/package/utilities/test-data/data/lastname.json +10 -0
  301. package/package/utilities/test-data/data/postcode.json +12 -0
  302. package/package/utilities/test-data/data/streetname.json +8 -0
  303. package/package/utilities/test-data/data/streetsuffix.json +7 -0
  304. package/package/utilities/test-data/data/town.json +9 -0
  305. package/package/utilities/test-data/index.js +67 -0
  306. package/package/wizard/behaviours/complete.js +20 -0
  307. package/package/wizard/behaviours/index.js +5 -0
  308. package/package/wizard/index.js +124 -0
  309. package/package/wizard/middleware/back-links.js +68 -0
  310. package/package/wizard/middleware/check-complete.js +13 -0
  311. package/package/wizard/middleware/check-progress.js +139 -0
  312. package/package/wizard/middleware/check-session.js +17 -0
  313. package/package/wizard/middleware/csrf.js +47 -0
  314. package/package/wizard/middleware/session-model.js +11 -0
  315. package/package/wizard/middleware/session.js +9 -0
  316. package/package/wizard/model.js +29 -0
  317. package/package/wizard/util/constants.js +5 -0
  318. package/package/wizard/util/helpers.js +19 -0
  319. package/package.json +5 -6
  320. package/.editorconfig +0 -10
  321. package/.github/workflows/automate-publish.yml +0 -38
  322. package/.github/workflows/automate-tag.yml +0 -78
  323. package/.istanbul.yml +0 -20
  324. package/codeReviewChecklist.md +0 -22
  325. package/pull_request_template.md +0 -16
@@ -0,0 +1,147 @@
1
+ {
2
+ "name": "hof",
3
+ "description": "A bootstrap for HOF projects",
4
+ "version": "22.9.0",
5
+ "license": "MIT",
6
+ "main": "index.js",
7
+ "author": "HomeOffice",
8
+ "engines": {
9
+ "node": ">=10.22.1",
10
+ "npm": ">=6.14.0"
11
+ },
12
+ "bin": {
13
+ "hof-build": "./bin/hof-build",
14
+ "hof-transpiler": "./bin/hof-transpiler"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/UKHomeOfficeForms/hof.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/UKHomeOfficeForms/hof/issues"
22
+ },
23
+ "scripts": {
24
+ "test": "yarn run unit && yarn run test:jest && yarn run test:functional && yarn run test:client && yarn run test:lint",
25
+ "unit": "LOG_LEVEL=error nyc _mocha \"test/**/*.spec.js\" \"sandbox/test/**/*.spec.js\"",
26
+ "unit:nocov": "LOG_LEVEL=error mocha \"test/**/*.spec.js\" \"sandbox/test/**/*.spec.js\"",
27
+ "test:lint": "eslint . --config ./node_modules/eslint-config-hof/default.js",
28
+ "test:functional": "funkie mocha ./test/functional-tests --timeout 20000 --exit",
29
+ "test:client": "karma start test/frontend/toolkit/karma.conf.js",
30
+ "test:jest": "jest test/frontend/jest test/utilities/helpers/jest",
31
+ "test:acceptance": "TAGS=\"${TAGS:=@feature}\" yarn run test:cucumber",
32
+ "test:acceptance_browser": "ACCEPTANCE_WITH_BROWSER=true TAGS=\"${TAGS:=@feature}\" yarn run test:cucumber",
33
+ "test:cucumber": "cucumber-js -f @cucumber/pretty-formatter \"sandbox/test/_features/**/*.feature\" --require sandbox/test/_features/test.setup.js --require \"sandbox/test/_features/step_definitions/**/*.js\" --tags $TAGS",
34
+ "ci": "travis-conditions",
35
+ "postversion": "git push && git push --tags"
36
+ },
37
+ "dependencies": {
38
+ "aliasify": "^2.1.0",
39
+ "axios": "^1.11.0",
40
+ "bluebird": "^3.7.2",
41
+ "body-parser": "^1.15.1",
42
+ "browserify": "^17.0.0",
43
+ "callsite": "^1.0.0",
44
+ "chalk": "^2.0.0",
45
+ "chokidar": "^3.4.0",
46
+ "connect-redis": "^5.2.0",
47
+ "cookie-parser": "^1.4.6",
48
+ "cp": "^0.2.0",
49
+ "csrf": "^3.1.0",
50
+ "debug": "^4.3.1",
51
+ "deprecate": "^1.0.0",
52
+ "dialog-polyfill": "^0.5.6",
53
+ "dotenv": "^4.0.0",
54
+ "duplexify": "^3.5.0",
55
+ "exorcist": "^2.0.0",
56
+ "express": "^4.17.1",
57
+ "express-healthcheck": "^0.1.0",
58
+ "express-partial-templates": "^0.2.1",
59
+ "express-session": "^1.13.0",
60
+ "findup": "^0.1.5",
61
+ "glob": "^7.2.0",
62
+ "govuk-elements-sass": "^3.1.3",
63
+ "govuk-frontend": "3.15",
64
+ "govuk_template_mustache": "^0.26.0",
65
+ "helmet": "^3.22.0",
66
+ "hogan-express-strict": "^0.5.4",
67
+ "hogan.js": "^3.0.2",
68
+ "homeoffice-countries": "^0.1.0",
69
+ "i18n-future": "^2.0.0",
70
+ "i18n-lookup": "^0.1.0",
71
+ "is-pdf": "^1.0.0",
72
+ "jquery": "^3.6.0",
73
+ "libphonenumber-js": "^1.9.44",
74
+ "lodash": "^4.17.21",
75
+ "markdown-it": "^12.3.2",
76
+ "minimatch": "^3.0.7",
77
+ "minimist": "^1.2.6",
78
+ "mixwith": "^0.1.1",
79
+ "moment": "^2.29.4",
80
+ "morgan": "^1.10.0",
81
+ "mustache": "^4.2.0",
82
+ "nodemailer": "^6.6.3",
83
+ "nodemailer-ses-transport": "^1.5.1",
84
+ "nodemailer-stub-transport": "^1.1.0",
85
+ "notifications-node-client": "^8.2.1",
86
+ "redis": "^3.1.2",
87
+ "reqres": "^3.0.1",
88
+ "rimraf": "^3.0.2",
89
+ "sass": "^1.56.2",
90
+ "serve-static": "^1.14.1",
91
+ "uglify-js": "^3.14.3",
92
+ "underscore": "^1.13.7",
93
+ "urijs": "^1.19.11",
94
+ "uuid": "^8.3.2",
95
+ "winston": "^3.7.2"
96
+ },
97
+ "devDependencies": {
98
+ "@cucumber/cucumber": "^7.3.0",
99
+ "@cucumber/pretty-formatter": "^1.0.0-alpha.1",
100
+ "@types/jest": "^26.0.14",
101
+ "@xmldom/xmldom": "~0.8.4",
102
+ "chai": "^3.5.0",
103
+ "chai-as-promised": "^7.1.1",
104
+ "chai-subset": "^1.6.0",
105
+ "concat-stream": "^1.4.7",
106
+ "csv": "^5.3.2",
107
+ "eslint": "^8.57.0",
108
+ "eslint-config-hof": "^1.3.4",
109
+ "funkie": "0.0.5",
110
+ "funkie-phantom": "0.0.1",
111
+ "istanbul": "^0.4.3",
112
+ "jest": "^26.5.0",
113
+ "jquery": "^3.6.0",
114
+ "karma": "^6.3.4",
115
+ "karma-browserify": "^8.0.0",
116
+ "karma-chai": "^0.1.0",
117
+ "karma-cli": "^2.0.0",
118
+ "karma-mocha": "^2.0.1",
119
+ "karma-phantomjs-launcher": "^1.0.4",
120
+ "mocha": "^8.4.0",
121
+ "mocha-sandbox": "^1.0.0",
122
+ "node-mocks-http": "^1.6.2",
123
+ "npm-run-all": "^3.1.1",
124
+ "nyc": "^15.1.0",
125
+ "playwright": "^1.16.3",
126
+ "postcode": "0.2.2",
127
+ "proxyquire": "^1.7.11",
128
+ "release-it": "^16.2.1",
129
+ "sinon": "^11.1.1",
130
+ "sinon-chai": "^3.7.0",
131
+ "supertest": "^3.0.0",
132
+ "travis-conditions": "0.0.0",
133
+ "watchify": "^4.0.0",
134
+ "webdriverio": "^4.14.4"
135
+ },
136
+ "mocha": {
137
+ "reporter": "spec",
138
+ "require": "test/common.js",
139
+ "recursive": "true",
140
+ "timeout": "9000",
141
+ "exit": "true"
142
+ },
143
+ "resolutions": {
144
+ "cached-path-relative": "^1.1.0",
145
+ "shell-quote": "^1.7.3"
146
+ }
147
+ }
@@ -0,0 +1,66 @@
1
+ # HOF Sandbox App
2
+
3
+ The Home Office Forms (HOF) Sandbox app is used by developers to test out different components in the framework.
4
+
5
+ #### How to run the app locally
6
+
7
+ Install [Homebrew](https://brew.sh/), if it is not installed
8
+
9
+ Once Homebrew is installed run
10
+
11
+ ```bash
12
+ brew install nvm
13
+ ```
14
+ ```bash
15
+ source ~/.bash_profile
16
+ ```
17
+
18
+ Install the correct version of node
19
+
20
+ ```bash
21
+ nvm install 14.15.0
22
+ ```
23
+
24
+ Set the node version
25
+
26
+ ```bash
27
+ nvm use 14.15.0
28
+ ```
29
+
30
+ Clone the service locally
31
+
32
+ ```bash
33
+ git clone ...
34
+ ```
35
+
36
+ Install yarn
37
+
38
+ ```bash
39
+ npm i yarn -g
40
+ ```
41
+
42
+ Install the dependencies
43
+
44
+ ```bash
45
+ yarn
46
+ ```
47
+
48
+ Move into the sandbox folder
49
+
50
+ ```bash
51
+ cd sandbox
52
+ ```
53
+
54
+ Install any example app specific dependencies
55
+
56
+ ```bash
57
+ yarn
58
+ ```
59
+
60
+ Run in development mode
61
+
62
+ ```bash
63
+ yarn start:dev
64
+ ```
65
+
66
+ go to http://localhost:8082/
@@ -0,0 +1,8 @@
1
+ 'use strict';
2
+
3
+ module.exports = SuperClass => class extends SuperClass {
4
+ getValues(req, res, next) {
5
+ req.sessionModel.reset();
6
+ this.successHandler(req, res, next);
7
+ }
8
+ };
@@ -0,0 +1,10 @@
1
+ module.exports = superclass => class extends superclass {
2
+ configure(req, res, next) {
3
+ const homeOfficeCountries = [''].concat(require('homeoffice-countries').allCountries);
4
+ req.form.options.fields.countrySelect.options = homeOfficeCountries.map(country => {
5
+ const labelString = country !== '' ? country : 'Please select a country';
6
+ return { label: labelString, value: country };
7
+ });
8
+ next();
9
+ }
10
+ };
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ const validators = require('../../../../controller').validators;
4
+
5
+ module.exports = SuperClass => class extends SuperClass {
6
+ validateField(key, req) {
7
+ const code = req.sessionModel.get('countryCode');
8
+ const number = req.form.values['int-phone-number'];
9
+
10
+ const isValid = validators.internationalPhoneNumber(number, code);
11
+
12
+ if (!isValid) {
13
+ return new this.ValidationError('int-phone-number', {
14
+ key: 'int-phone-number',
15
+ type: 'internationalPhoneNumber',
16
+ redirect: undefined
17
+ });
18
+ }
19
+
20
+ return super.validateField(key, req);
21
+ }
22
+ };
@@ -0,0 +1,128 @@
1
+ /* eslint-disable */
2
+ 'use strict';
3
+
4
+ const dateComponent = require('../../../').components.date;
5
+ const staticAppealStages = require('./lib/staticAppealStages');
6
+
7
+ module.exports = {
8
+ 'landing-page-radio': {
9
+ mixin: 'radio-group',
10
+ validate: ['required'],
11
+ isPageHeading: true,
12
+ // Design system says to avoid in-line unless it's two options,
13
+ // so just added as an example below but by default it isn't
14
+ className: ['govuk-radios--inline'],
15
+ options: ['basic-form', 'complex-form', 'build-your-own-form']
16
+ },
17
+ name: {
18
+ validate: ['required', 'notUrl', { type: 'maxlength', arguments: 200 }],
19
+ },
20
+ 'dateOfBirth': dateComponent('dateOfBirth', {
21
+ mixin: 'input-date',
22
+ isPageHeading: 'true',
23
+ validate: [
24
+ 'required',
25
+ 'date',
26
+ { type: 'after', arguments: ['1900'] }
27
+ ]
28
+ }),
29
+ building: {
30
+ validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }]
31
+ },
32
+ street: {
33
+ validate: ['notUrl', { type: 'maxlength', arguments: 50 }],
34
+ labelClassName: 'visuallyhidden'
35
+ },
36
+ townOrCity: {
37
+ validate: ['required', 'notUrl',
38
+ { type: 'regex', arguments: /^([^0-9]*)$/ },
39
+ { type: 'maxlength', arguments: 100 }
40
+ ]
41
+ },
42
+ postcode: {
43
+ validate: ['required', 'postcode'],
44
+ formatter: ['removespaces', 'uppercase']
45
+ },
46
+ incomeTypes: {
47
+ isPageHeading: 'true',
48
+ mixin: 'checkbox-group',
49
+ labelClassName: 'visuallyhidden',
50
+ validate: ['required'],
51
+ options: [
52
+ 'salary',
53
+ 'universal_credit',
54
+ 'child_benefit',
55
+ 'housing_benefit',
56
+ 'other'
57
+ ]
58
+ },
59
+ countryOfHearing: {
60
+ isPageHeading: 'true',
61
+ mixin: 'radio-group',
62
+ validate: ['required'],
63
+ options: [
64
+ 'englandAndWales',
65
+ 'scotland',
66
+ 'northernIreland'
67
+ ]
68
+ },
69
+ email: {
70
+ validate: ['required', 'email']
71
+ },
72
+ phone: {
73
+ validate: ['required', 'internationalPhoneNumber']
74
+ },
75
+ 'int-phone-number': {
76
+ validate: ['required'],
77
+ labelClassName: 'visuallyhidden'
78
+ },
79
+ countrySelect: {
80
+ mixin: 'select',
81
+ isPageHeading: 'true',
82
+ className: ['typeahead'],
83
+ options:[''].concat(require('homeoffice-countries').allCountries),
84
+ legend: {
85
+ className: 'visuallyhidden'
86
+ },
87
+ validate: ['required']
88
+ },
89
+ complaintDetails: {
90
+ mixin: 'textarea',
91
+ // we want to ignore default formatters as we want
92
+ // to preserve white space
93
+ 'ignore-defaults': true,
94
+ // apply the other default formatters
95
+ formatter: ['trim', 'hyphens'],
96
+ isPageHeading: 'true',
97
+ // attributes here are passed to the field element
98
+ validate: ['required', { type: 'maxlength', arguments: 10 }],
99
+ attributes: [{
100
+ attribute: 'rows',
101
+ value: 8
102
+ }]
103
+ },
104
+ whatHappened: {
105
+ mixin: 'textarea',
106
+ // we want to ignore default formatters as we want
107
+ // to preserve white space
108
+ 'ignore-defaults': true,
109
+ // apply the other default formatters
110
+ formatter: ['trim', 'hyphens'],
111
+ isPageHeading: 'true',
112
+ // attributes here are passed to the field element
113
+ validate: ['required', { type: 'maxword', arguments: 10 }],
114
+ attributes: [{
115
+ attribute: 'rows',
116
+ value: 8
117
+ }]
118
+ },
119
+ appealStages: {
120
+ mixin: 'select',
121
+ isPageHeading: 'true',
122
+ validate: ['required'],
123
+ options: [{
124
+ value: '',
125
+ label: 'fields.appealStages.options.null'
126
+ }].concat(staticAppealStages.getstaticAppealStages())
127
+ }
128
+ }
@@ -0,0 +1,99 @@
1
+ /* eslint-disable */
2
+ 'use strict';
3
+
4
+ const CountrySelect = require('./behaviours/country-select')
5
+ const SummaryPageBehaviour = require('../../../').components.summary;
6
+ const InternationalPhoneNumber = require('./behaviours/international-number');
7
+
8
+ module.exports = {
9
+ name: 'sandbox',
10
+ steps: {
11
+ '/landing-page': {
12
+ fields: [
13
+ 'landing-page-radio'
14
+ ],
15
+ next: '/name',
16
+ forks: [{
17
+ target: '/build-your-own-form',
18
+ condition: {
19
+ field: 'landing-page-radio',
20
+ value: 'build-your-own-form'
21
+ }
22
+ }],
23
+ },
24
+ '/build-your-own-form': {
25
+ template: 'form-guidance-link'
26
+ },
27
+ '/name': {
28
+ fields: ['name'],
29
+ next: '/dob'
30
+ },
31
+ '/dob': {
32
+ fields: ['dateOfBirth'],
33
+ locals: { showSaveAndExit: true },
34
+ next: '/address'
35
+ },
36
+ '/address': {
37
+ fields: ['building', 'street', 'townOrCity', 'postcode'],
38
+ next: '/checkboxes'
39
+ },
40
+ '/checkboxes': {
41
+ fields: ['incomeTypes'],
42
+ next: '/radio'
43
+ },
44
+ '/radio':{
45
+ fields: ['countryOfHearing'],
46
+ forks: [{
47
+ target: '/country-select',
48
+ condition: {
49
+ field: 'landing-page-radio',
50
+ value: 'complex-form'
51
+ }
52
+ }],
53
+ next: '/email'
54
+ },
55
+ '/email': {
56
+ fields: ['email'],
57
+ next: '/phone-number'
58
+ },
59
+ '/phone-number': {
60
+ fields: ['phone'],
61
+ next: '/confirm'
62
+ },
63
+ '/country-select': {
64
+ behaviours: CountrySelect,
65
+ fields: ['countrySelect'],
66
+ next: '/text-input-area'
67
+ },
68
+ '/text-input-area': {
69
+ fields: ['complaintDetails'],
70
+ next: '/word-count'
71
+ },
72
+ '/word-count': {
73
+ fields: ['whatHappened'],
74
+ next: '/select'
75
+ },
76
+ '/select':{
77
+ fields: ['appealStages'],
78
+ next: '/confirm'
79
+ },
80
+ '/confirm': {
81
+ behaviours: [SummaryPageBehaviour, 'complete'],
82
+ sections: require('./sections/summary-data-sections'),
83
+ next: '/confirmation'
84
+ },
85
+ '/confirmation': {
86
+ backLink: false
87
+ },
88
+ '/international-phone-number': {
89
+ behaviours: InternationalPhoneNumber,
90
+ fields: [
91
+ 'int-phone-number'
92
+ ],
93
+ next: '/confirm'
94
+ },
95
+ '/session-timeout': {},
96
+ '/exit': {},
97
+ '/save-and-exit': {}
98
+ }
99
+ };
@@ -0,0 +1,189 @@
1
+ /* eslint max-len: 0 */
2
+
3
+ 'use strict';
4
+
5
+ module.exports = {
6
+ getstaticAppealStages: function () {
7
+ return [
8
+ { value: 'FT_IC',
9
+ label: '01. First Tier IAC Appeal - In Country Appeals',
10
+ timeLimit: {value: 14, type: 'calendar days'},
11
+ startDateLabel: 'Date refusal letter sent by HO',
12
+ rules: 'The Tribunal Procedure (First-tier tribunal) (Immigration and Asylum Chamber) Rules 2014',
13
+ ruleNumber: '19(2)',
14
+ adminAllowance: {value: 1, type: 'working day'},
15
+ country: 'All',
16
+ trigger: 'Refusal Notice',
17
+ sortCode: 10
18
+ },
19
+
20
+ { value: 'FT_OOC_1',
21
+ label: '02. First Tier IAC Appeal - Out of Country Appeals where the appellant must leave the UK before appealing',
22
+ timeLimit: {value: 28, type: 'calendar days'},
23
+ startDateLabel: 'Appellant\'s date of departure',
24
+ rules: 'The Tribunal Procedure (First-tier tribunal) (Immigration and Asylum Chamber) Rules 2014',
25
+ ruleNumber: '19(3)(a)',
26
+ adminAllowance: {value: 0, type: 'working days'},
27
+ country: 'All',
28
+ trigger: 'Refusal Notice',
29
+ sortCode: 20
30
+ },
31
+
32
+ { value: 'FT_OOC_2',
33
+ label: '03. First Tier IAC Appeal - Other out of Country Appeals (e.g Voluntary Departure)',
34
+ timeLimit: {value: 28, type: 'calendar days'},
35
+ startDateLabel: 'Date of receipt of the refusal letter',
36
+ rules: 'The Tribunal Procedure (First-tier tribunal) (Immigration and Asylum Chamber) Rules 2014',
37
+ ruleNumber: '19(3)(b)',
38
+ adminAllowance: {value: 1, type: 'working days'},
39
+ country: 'All',
40
+ trigger: 'Refusal Notice',
41
+ sortCode: 30
42
+ },
43
+
44
+ { value: 'FT_IC_FAST',
45
+ label: '04. First Tier IAC Appeal - In Country Detained Fast Track',
46
+ timeLimit: {value: 2, type: 'working days'},
47
+ startDateLabel: 'Date when appellant was provided notice of decision',
48
+ rules: 'The Tribunal Procedure (First-tier tribunal) (Immigration and Asylum Chamber) Rules 2014 Schedule The Fast Track Rules',
49
+ ruleNumber: '5(1)',
50
+ adminAllowance: {value: 1, type: 'working day'},
51
+ country: 'All',
52
+ trigger: 'Refusal Notice',
53
+ sortCode: 40
54
+ },
55
+
56
+ { value: 'FT_UT_IC',
57
+ label: '05. First Tier IAC PTA to the UT - In Country',
58
+ timeLimit: {value: 14, type: 'calendar days'},
59
+ startDateLabel: 'Date written reasons for the decision sent',
60
+ rules: 'The Tribunal Procedure (First-tier tribunal) (Immigration and Asylum Chamber) Rules 2014',
61
+ ruleNumber: '33(2)',
62
+ adminAllowance: {value: 1, type: 'working day'},
63
+ country: 'All',
64
+ trigger: 'IA60 first tier dismissed',
65
+ sortCode: 50
66
+ },
67
+
68
+ { value: 'FT_UT_OOC',
69
+ label: '06. First Tier IAC PTA to the UT - Out of Country',
70
+ timeLimit: {value: 28, type: 'calendar days'},
71
+ startDateLabel: 'Date written reasons for the decision sent',
72
+ rules: 'The Tribunal Procedure (First-tier tribunal) (Immigration and Asylum Chamber) Rules 2014',
73
+ ruleNumber: '33(3)',
74
+ adminAllowance: {value: 1, type: 'working day'},
75
+ country: 'All',
76
+ trigger: 'IA60 first tier dismissed',
77
+ sortCode: 60
78
+ },
79
+
80
+ { value: 'FT_UT_FAST',
81
+ label: '07. First Tier IAC PTA to the UT - Detained Fast Track',
82
+ timeLimit: {value: 3, type: 'working days'},
83
+ startDateLabel: 'Date when appellant was provided notice of decision',
84
+ rules: 'The Tribunal Procedure (First-tier tribunal) (Immigration and Asylum Chamber) Rules 2014 Schedule The Fast Track Rules',
85
+ ruleNumber: '11',
86
+ adminAllowance: {value: 1, type: 'working day'},
87
+ country: 'All',
88
+ trigger: 'IA60 first tier dismissed',
89
+ sortCode: 70
90
+ },
91
+
92
+ { value: 'UT_IC',
93
+ label: '08. Upper Tribunal IAC PTA - In Country',
94
+ timeLimit: {value: 14, type: 'calendar days'},
95
+ startDateLabel: 'Date when the FtT refused FTPA',
96
+ rules: 'The Tribunal Procedure (Upper Tribunal) Rules 2008',
97
+ ruleNumber: '21(3)(a)(aa)(i)',
98
+ adminAllowance: {value: 1, type: 'working day'},
99
+ country: 'All',
100
+ trigger: 'IA67 first tier permission to appeal refused',
101
+ sortCode: 80
102
+ },
103
+
104
+ { value: 'UT_OOC',
105
+ label: '09. Upper Tribunal IAC PTA - Out of Country',
106
+ timeLimit: {value: 1, type: 'calendar month'},
107
+ startDateLabel: 'Date when the FtT refused FTPA',
108
+ rules: 'The Tribunal Procedure (Upper Tribunal) Rules 2008',
109
+ ruleNumber: '21(3)(b)',
110
+ adminAllowance: {value: 1, type: 'working day'},
111
+ country: 'All',
112
+ trigger: 'IA67 first tier permission to appeal refused',
113
+ sortCode: 90
114
+ },
115
+
116
+ { value: 'UT_IAC_JR',
117
+ label: '10. Upper Tribunal IAC - Judicial Review',
118
+ timeLimit: {value: 3, type: 'calendar months'},
119
+ startDateLabel: 'Date of decision of the First Tier Tribunal or Home Office',
120
+ rules: 'The Tribunal Procedure (Upper Tribunal) Rules 2008',
121
+ ruleNumber: '28(2)',
122
+ adminAllowance: {value: 0, type: 'working days'},
123
+ country: 'All',
124
+ trigger: 'n/a',
125
+ sortCode: 100
126
+ },
127
+
128
+ { value: 'UT_IAC_IC',
129
+ label: '11. Upper Tribunal IAC - In Country PTA to review UT determination',
130
+ timeLimit: {value: 12, type: 'calendar days'},
131
+ startDateLabel: 'Date when appellant was sent notice of decision',
132
+ rules: 'The Tribunal Procedure (Upper Tribunal) Rules 2008',
133
+ ruleNumber: '44(3B)(a)(i)',
134
+ adminAllowance: {value: 1, type: 'working day'},
135
+ country: 'All',
136
+ trigger: 'IA150 - Upper Tier determination (dismissed)',
137
+ sortCode: 110
138
+ },
139
+
140
+ { value: 'UT_IAC_OOC',
141
+ label: '12. Upper Tribunal IAC - Out of Country PTA to review UT determination',
142
+ timeLimit: {value: 38, type: 'calendar days'},
143
+ startDateLabel: 'Date when appellant was sent notice of decision',
144
+ rules: 'The Tribunal Procedure (Upper Tribunal) Rules 2008',
145
+ ruleNumber: '44(3B)(b)',
146
+ adminAllowance: {value: 1, type: 'working day'},
147
+ country: 'All',
148
+ trigger: 'IA150 - Upper Tier determination (dismissed)',
149
+ sortCode: 120
150
+ },
151
+
152
+ { value: 'COA_IAC',
153
+ label: '13. Court of Appeal via IAC',
154
+ timeLimit: {value: 28 + 2, type: 'calendar days'},
155
+ startDateLabel: 'Date when appellant was sent notice of decision',
156
+ rules: 'Civil Procedure Rules',
157
+ ruleNumber: '52.4',
158
+ adminAllowance: {value: 1, type: 'working days'},
159
+ country: ['England & Wales'],
160
+ trigger: 'IA157 PTA to the CoA refused',
161
+ sortCode: 130
162
+ },
163
+
164
+ { value: 'COS_IAC',
165
+ label: '14. Court of Sessions via IAC',
166
+ timeLimit: {value: 42 + 1, type: 'calendar days'},
167
+ startDateLabel: 'Date when appellant was sent notice of decision',
168
+ rules: 'Civil Procedure Rules',
169
+ ruleNumber: 'Rule 41.20',
170
+ adminAllowance: {value: 1, type: 'working days'},
171
+ country: ['Scotland', 'Northern Ireland'],
172
+ trigger: 'IA157 PTA to the CoA refused',
173
+ sortCode: 140
174
+ },
175
+
176
+ { value: 'COA_DIRECT',
177
+ label: '15. Court of Appeal Direct',
178
+ timeLimit: {value: 7 + 2, type: 'calendar days'},
179
+ startDateLabel: 'Date when appellant was sent notice of decision',
180
+ rules: 'Civil Procedure Rules',
181
+ ruleNumber: '52.3',
182
+ adminAllowance: {value: 1, type: 'working days'},
183
+ country: 'All',
184
+ trigger: 'IA157 PTA to the CoA refused',
185
+ sortCode: 150
186
+ }
187
+ ];
188
+ }
189
+ };