@defra/forms-engine-plugin 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (615) hide show
  1. package/.browserslistrc +16 -0
  2. package/.editorconfig +9 -0
  3. package/.eslintrc.cjs +266 -0
  4. package/.github/dependabot.yml +85 -0
  5. package/.github/workflows/check-pull-request.yml +209 -0
  6. package/.github/workflows/pr-notifier.yml +98 -0
  7. package/.github/workflows/publish.yml +111 -0
  8. package/.husky/pre-commit +1 -0
  9. package/.lintstagedrc.js +4 -0
  10. package/.nvmrc +1 -0
  11. package/.prettierignore +8 -0
  12. package/.prettierrc.cjs +26 -0
  13. package/.server/client/javascripts/application.js +68 -0
  14. package/.server/client/javascripts/application.js.map +1 -0
  15. package/.server/client/javascripts/file-upload.js +292 -0
  16. package/.server/client/javascripts/file-upload.js.map +1 -0
  17. package/.server/client/stylesheets/_code.scss +33 -0
  18. package/.server/client/stylesheets/_govuk-frontend.scss +4 -0
  19. package/.server/client/stylesheets/_prose.scss +56 -0
  20. package/.server/client/stylesheets/_service-banner.scss +24 -0
  21. package/.server/client/stylesheets/_summary-list.scss +28 -0
  22. package/.server/client/stylesheets/_tag-env.scss +24 -0
  23. package/.server/client/stylesheets/application.scss +14 -0
  24. package/.server/common/cookies.js +55 -0
  25. package/.server/common/cookies.js.map +1 -0
  26. package/.server/common/cookies.test.js +15 -0
  27. package/.server/common/cookies.test.js.map +1 -0
  28. package/.server/common/types.js +6 -0
  29. package/.server/common/types.js.map +1 -0
  30. package/.server/config/index.js +241 -0
  31. package/.server/config/index.js.map +1 -0
  32. package/.server/index.js +25 -0
  33. package/.server/index.js.map +1 -0
  34. package/.server/server/common/helpers/logging/logger-options.js +44 -0
  35. package/.server/server/common/helpers/logging/logger-options.js.map +1 -0
  36. package/.server/server/common/helpers/logging/logger.js +6 -0
  37. package/.server/server/common/helpers/logging/logger.js.map +1 -0
  38. package/.server/server/common/helpers/logging/request-logger.js +7 -0
  39. package/.server/server/common/helpers/logging/request-logger.js.map +1 -0
  40. package/.server/server/common/helpers/logging/request-tracing.js +12 -0
  41. package/.server/server/common/helpers/logging/request-tracing.js.map +1 -0
  42. package/.server/server/common/helpers/redis-client.js +55 -0
  43. package/.server/server/common/helpers/redis-client.js.map +1 -0
  44. package/.server/server/constants.js +2 -0
  45. package/.server/server/constants.js.map +1 -0
  46. package/.server/server/forms/README.md +10 -0
  47. package/.server/server/forms/components.json +1015 -0
  48. package/.server/server/forms/report-a-terrorist.json +270 -0
  49. package/.server/server/forms/runner-components-test.json +365 -0
  50. package/.server/server/forms/test.json +581 -0
  51. package/.server/server/index.js +116 -0
  52. package/.server/server/index.js.map +1 -0
  53. package/.server/server/plugins/blankie.js +29 -0
  54. package/.server/server/plugins/blankie.js.map +1 -0
  55. package/.server/server/plugins/crumb.js +15 -0
  56. package/.server/server/plugins/crumb.js.map +1 -0
  57. package/.server/server/plugins/engine/README.md +87 -0
  58. package/.server/server/plugins/engine/components/AutocompleteField.js +37 -0
  59. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -0
  60. package/.server/server/plugins/engine/components/CheckboxesField.js +79 -0
  61. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -0
  62. package/.server/server/plugins/engine/components/ComponentBase.js +55 -0
  63. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -0
  64. package/.server/server/plugins/engine/components/ComponentCollection.js +198 -0
  65. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -0
  66. package/.server/server/plugins/engine/components/DatePartsField.js +208 -0
  67. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -0
  68. package/.server/server/plugins/engine/components/Details.js +26 -0
  69. package/.server/server/plugins/engine/components/Details.js.map +1 -0
  70. package/.server/server/plugins/engine/components/EmailAddressField.js +40 -0
  71. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -0
  72. package/.server/server/plugins/engine/components/FileUploadField.js +195 -0
  73. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -0
  74. package/.server/server/plugins/engine/components/FormComponent.js +210 -0
  75. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -0
  76. package/.server/server/plugins/engine/components/Html.js +24 -0
  77. package/.server/server/plugins/engine/components/Html.js.map +1 -0
  78. package/.server/server/plugins/engine/components/InsetText.js +22 -0
  79. package/.server/server/plugins/engine/components/InsetText.js.map +1 -0
  80. package/.server/server/plugins/engine/components/List.js +65 -0
  81. package/.server/server/plugins/engine/components/List.js.map +1 -0
  82. package/.server/server/plugins/engine/components/ListFormComponent.js +87 -0
  83. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -0
  84. package/.server/server/plugins/engine/components/MonthYearField.js +172 -0
  85. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -0
  86. package/.server/server/plugins/engine/components/MultilineTextField.js +115 -0
  87. package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -0
  88. package/.server/server/plugins/engine/components/NumberField.js +137 -0
  89. package/.server/server/plugins/engine/components/NumberField.js.map +1 -0
  90. package/.server/server/plugins/engine/components/RadiosField.js +18 -0
  91. package/.server/server/plugins/engine/components/RadiosField.js.map +1 -0
  92. package/.server/server/plugins/engine/components/SelectField.js +33 -0
  93. package/.server/server/plugins/engine/components/SelectField.js.map +1 -0
  94. package/.server/server/plugins/engine/components/SelectionControlField.js +43 -0
  95. package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -0
  96. package/.server/server/plugins/engine/components/TelephoneNumberField.js +43 -0
  97. package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -0
  98. package/.server/server/plugins/engine/components/TextField.js +63 -0
  99. package/.server/server/plugins/engine/components/TextField.js.map +1 -0
  100. package/.server/server/plugins/engine/components/UkAddressField.js +130 -0
  101. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -0
  102. package/.server/server/plugins/engine/components/YesNoField.js +28 -0
  103. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -0
  104. package/.server/server/plugins/engine/components/constants.js +2 -0
  105. package/.server/server/plugins/engine/components/constants.js.map +1 -0
  106. package/.server/server/plugins/engine/components/helpers.js +219 -0
  107. package/.server/server/plugins/engine/components/helpers.js.map +1 -0
  108. package/.server/server/plugins/engine/components/index.js +25 -0
  109. package/.server/server/plugins/engine/components/index.js.map +1 -0
  110. package/.server/server/plugins/engine/components/types.js +2 -0
  111. package/.server/server/plugins/engine/components/types.js.map +1 -0
  112. package/.server/server/plugins/engine/configureEnginePlugin.js +44 -0
  113. package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -0
  114. package/.server/server/plugins/engine/helpers.js +268 -0
  115. package/.server/server/plugins/engine/helpers.js.map +1 -0
  116. package/.server/server/plugins/engine/index.js +6 -0
  117. package/.server/server/plugins/engine/index.js.map +1 -0
  118. package/.server/server/plugins/engine/models/FormModel.js +363 -0
  119. package/.server/server/plugins/engine/models/FormModel.js.map +1 -0
  120. package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.js +2 -0
  121. package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.js.map +1 -0
  122. package/.server/server/plugins/engine/models/Section.js +2 -0
  123. package/.server/server/plugins/engine/models/Section.js.map +1 -0
  124. package/.server/server/plugins/engine/models/SummaryViewModel.js +183 -0
  125. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -0
  126. package/.server/server/plugins/engine/models/index.js +3 -0
  127. package/.server/server/plugins/engine/models/index.js.map +1 -0
  128. package/.server/server/plugins/engine/models/types.js +2 -0
  129. package/.server/server/plugins/engine/models/types.js.map +1 -0
  130. package/.server/server/plugins/engine/outputFormatters/human/v1.js +44 -0
  131. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -0
  132. package/.server/server/plugins/engine/outputFormatters/index.js +24 -0
  133. package/.server/server/plugins/engine/outputFormatters/index.js.map +1 -0
  134. package/.server/server/plugins/engine/outputFormatters/machine/v1.js +104 -0
  135. package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -0
  136. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +110 -0
  137. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -0
  138. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +401 -0
  139. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -0
  140. package/.server/server/plugins/engine/pageControllers/PageController.js +133 -0
  141. package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -0
  142. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +482 -0
  143. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -0
  144. package/.server/server/plugins/engine/pageControllers/README.md +28 -0
  145. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +372 -0
  146. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -0
  147. package/.server/server/plugins/engine/pageControllers/StartPageController.js +16 -0
  148. package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -0
  149. package/.server/server/plugins/engine/pageControllers/StatusPageController.js +43 -0
  150. package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -0
  151. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +195 -0
  152. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -0
  153. package/.server/server/plugins/engine/pageControllers/TerminalPageController.js +8 -0
  154. package/.server/server/plugins/engine/pageControllers/TerminalPageController.js.map +1 -0
  155. package/.server/server/plugins/engine/pageControllers/helpers.js +69 -0
  156. package/.server/server/plugins/engine/pageControllers/helpers.js.map +1 -0
  157. package/.server/server/plugins/engine/pageControllers/index.js +10 -0
  158. package/.server/server/plugins/engine/pageControllers/index.js.map +1 -0
  159. package/.server/server/plugins/engine/pageControllers/validationOptions.js +78 -0
  160. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -0
  161. package/.server/server/plugins/engine/plugin.js +562 -0
  162. package/.server/server/plugins/engine/plugin.js.map +1 -0
  163. package/.server/server/plugins/engine/services/formSubmissionService.js +39 -0
  164. package/.server/server/plugins/engine/services/formSubmissionService.js.map +1 -0
  165. package/.server/server/plugins/engine/services/formsService.js +41 -0
  166. package/.server/server/plugins/engine/services/formsService.js.map +1 -0
  167. package/.server/server/plugins/engine/services/formsService.test.js +71 -0
  168. package/.server/server/plugins/engine/services/formsService.test.js.map +1 -0
  169. package/.server/server/plugins/engine/services/index.js +4 -0
  170. package/.server/server/plugins/engine/services/index.js.map +1 -0
  171. package/.server/server/plugins/engine/services/notifyService.js +45 -0
  172. package/.server/server/plugins/engine/services/notifyService.js.map +1 -0
  173. package/.server/server/plugins/engine/services/uploadService.js +51 -0
  174. package/.server/server/plugins/engine/services/uploadService.js.map +1 -0
  175. package/.server/server/plugins/engine/types.js +53 -0
  176. package/.server/server/plugins/engine/types.js.map +1 -0
  177. package/.server/server/plugins/engine/views/components/autocompletefield.html +5 -0
  178. package/.server/server/plugins/engine/views/components/checkboxesfield.html +5 -0
  179. package/.server/server/plugins/engine/views/components/datepartsfield.html +5 -0
  180. package/.server/server/plugins/engine/views/components/details.html +6 -0
  181. package/.server/server/plugins/engine/views/components/emailaddressfield.html +5 -0
  182. package/.server/server/plugins/engine/views/components/fileuploadfield-key.html +8 -0
  183. package/.server/server/plugins/engine/views/components/fileuploadfield-value.html +3 -0
  184. package/.server/server/plugins/engine/views/components/fileuploadfield.html +24 -0
  185. package/.server/server/plugins/engine/views/components/html.html +3 -0
  186. package/.server/server/plugins/engine/views/components/insettext.html +7 -0
  187. package/.server/server/plugins/engine/views/components/list.html +36 -0
  188. package/.server/server/plugins/engine/views/components/monthyearfield.html +5 -0
  189. package/.server/server/plugins/engine/views/components/multilinetextfield.html +10 -0
  190. package/.server/server/plugins/engine/views/components/numberfield.html +5 -0
  191. package/.server/server/plugins/engine/views/components/radiosfield.html +5 -0
  192. package/.server/server/plugins/engine/views/components/selectfield.html +5 -0
  193. package/.server/server/plugins/engine/views/components/telephonenumberfield.html +5 -0
  194. package/.server/server/plugins/engine/views/components/textfield.html +5 -0
  195. package/.server/server/plugins/engine/views/components/ukaddressfield.html +25 -0
  196. package/.server/server/plugins/engine/views/components/yesnofield.html +5 -0
  197. package/.server/server/plugins/engine/views/file-upload.html +45 -0
  198. package/.server/server/plugins/engine/views/index.html +39 -0
  199. package/.server/server/plugins/engine/views/item-delete.html +56 -0
  200. package/.server/server/plugins/engine/views/partials/components.html +6 -0
  201. package/.server/server/plugins/engine/views/partials/conditional-components.html +3 -0
  202. package/.server/server/plugins/engine/views/partials/debug.html +44 -0
  203. package/.server/server/plugins/engine/views/partials/form.html +15 -0
  204. package/.server/server/plugins/engine/views/partials/heading.html +16 -0
  205. package/.server/server/plugins/engine/views/partials/preview-banner.html +32 -0
  206. package/.server/server/plugins/engine/views/partials/preview-banner.test.js +108 -0
  207. package/.server/server/plugins/engine/views/partials/preview-banner.test.js.map +1 -0
  208. package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +10 -0
  209. package/.server/server/plugins/engine/views/repeat-list-summary.html +53 -0
  210. package/.server/server/plugins/errorPages.js +49 -0
  211. package/.server/server/plugins/errorPages.js.map +1 -0
  212. package/.server/server/plugins/nunjucks/context.js +79 -0
  213. package/.server/server/plugins/nunjucks/context.js.map +1 -0
  214. package/.server/server/plugins/nunjucks/context.test.js +134 -0
  215. package/.server/server/plugins/nunjucks/context.test.js.map +1 -0
  216. package/.server/server/plugins/nunjucks/enviroment.test.js +166 -0
  217. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -0
  218. package/.server/server/plugins/nunjucks/environment.js +95 -0
  219. package/.server/server/plugins/nunjucks/environment.js.map +1 -0
  220. package/.server/server/plugins/nunjucks/filters/answer.js +26 -0
  221. package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -0
  222. package/.server/server/plugins/nunjucks/filters/answer.test.js +70 -0
  223. package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -0
  224. package/.server/server/plugins/nunjucks/filters/evaluate.js +22 -0
  225. package/.server/server/plugins/nunjucks/filters/evaluate.js.map +1 -0
  226. package/.server/server/plugins/nunjucks/filters/field.js +26 -0
  227. package/.server/server/plugins/nunjucks/filters/field.js.map +1 -0
  228. package/.server/server/plugins/nunjucks/filters/field.test.js +64 -0
  229. package/.server/server/plugins/nunjucks/filters/field.test.js.map +1 -0
  230. package/.server/server/plugins/nunjucks/filters/highlight.js +14 -0
  231. package/.server/server/plugins/nunjucks/filters/highlight.js.map +1 -0
  232. package/.server/server/plugins/nunjucks/filters/href.js +28 -0
  233. package/.server/server/plugins/nunjucks/filters/href.js.map +1 -0
  234. package/.server/server/plugins/nunjucks/filters/href.test.js +63 -0
  235. package/.server/server/plugins/nunjucks/filters/href.test.js.map +1 -0
  236. package/.server/server/plugins/nunjucks/filters/index.js +9 -0
  237. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -0
  238. package/.server/server/plugins/nunjucks/filters/inspect.js +16 -0
  239. package/.server/server/plugins/nunjucks/filters/inspect.js.map +1 -0
  240. package/.server/server/plugins/nunjucks/filters/page.js +23 -0
  241. package/.server/server/plugins/nunjucks/filters/page.js.map +1 -0
  242. package/.server/server/plugins/nunjucks/filters/page.test.js +51 -0
  243. package/.server/server/plugins/nunjucks/filters/page.test.js.map +1 -0
  244. package/.server/server/plugins/nunjucks/index.js +4 -0
  245. package/.server/server/plugins/nunjucks/index.js.map +1 -0
  246. package/.server/server/plugins/nunjucks/plugin.js +38 -0
  247. package/.server/server/plugins/nunjucks/plugin.js.map +1 -0
  248. package/.server/server/plugins/nunjucks/render.js +41 -0
  249. package/.server/server/plugins/nunjucks/render.js.map +1 -0
  250. package/.server/server/plugins/nunjucks/types.js +41 -0
  251. package/.server/server/plugins/nunjucks/types.js.map +1 -0
  252. package/.server/server/plugins/pulse.js +8 -0
  253. package/.server/server/plugins/pulse.js.map +1 -0
  254. package/.server/server/plugins/router.js +169 -0
  255. package/.server/server/plugins/router.js.map +1 -0
  256. package/.server/server/plugins/session.js +28 -0
  257. package/.server/server/plugins/session.js.map +1 -0
  258. package/.server/server/routes/health.js +15 -0
  259. package/.server/server/routes/health.js.map +1 -0
  260. package/.server/server/routes/health.test.js +32 -0
  261. package/.server/server/routes/health.test.js.map +1 -0
  262. package/.server/server/routes/index.js +3 -0
  263. package/.server/server/routes/index.js.map +1 -0
  264. package/.server/server/routes/public.js +37 -0
  265. package/.server/server/routes/public.js.map +1 -0
  266. package/.server/server/routes/types.js +14 -0
  267. package/.server/server/routes/types.js.map +1 -0
  268. package/.server/server/schemas/index.js +15 -0
  269. package/.server/server/schemas/index.js.map +1 -0
  270. package/.server/server/secure-context.js +36 -0
  271. package/.server/server/secure-context.js.map +1 -0
  272. package/.server/server/services/cacheService.js +85 -0
  273. package/.server/server/services/cacheService.js.map +1 -0
  274. package/.server/server/services/httpService.js +44 -0
  275. package/.server/server/services/httpService.js.map +1 -0
  276. package/.server/server/services/httpService.test.js +504 -0
  277. package/.server/server/services/httpService.test.js.map +1 -0
  278. package/.server/server/services/index.js +2 -0
  279. package/.server/server/services/index.js.map +1 -0
  280. package/.server/server/types.js +2 -0
  281. package/.server/server/types.js.map +1 -0
  282. package/.server/server/utils/notify.js +40 -0
  283. package/.server/server/utils/notify.js.map +1 -0
  284. package/.server/server/utils/secure-context/get-trust-store-certs.js +7 -0
  285. package/.server/server/utils/secure-context/get-trust-store-certs.js.map +1 -0
  286. package/.server/server/utils/secure-context/get-trust-store-certs.test.js +14 -0
  287. package/.server/server/utils/secure-context/get-trust-store-certs.test.js.map +1 -0
  288. package/.server/server/utils/utils.js +20 -0
  289. package/.server/server/utils/utils.js.map +1 -0
  290. package/.server/server/utils/utils.test.js +49 -0
  291. package/.server/server/utils/utils.test.js.map +1 -0
  292. package/.server/server/views/404.html +16 -0
  293. package/.server/server/views/500.html +19 -0
  294. package/.server/server/views/components/debug/macro.njk +3 -0
  295. package/.server/server/views/components/debug/template.njk +13 -0
  296. package/.server/server/views/components/service-banner/macro.njk +3 -0
  297. package/.server/server/views/components/service-banner/template.njk +20 -0
  298. package/.server/server/views/components/service-banner/template.test.js +36 -0
  299. package/.server/server/views/components/service-banner/template.test.js.map +1 -0
  300. package/.server/server/views/components/tag-env/macro.njk +3 -0
  301. package/.server/server/views/components/tag-env/template.njk +30 -0
  302. package/.server/server/views/components/tag-env/template.test.js +59 -0
  303. package/.server/server/views/components/tag-env/template.test.js.map +1 -0
  304. package/.server/server/views/confirmation.html +19 -0
  305. package/.server/server/views/help/accessibility-statement.html +58 -0
  306. package/.server/server/views/help/cookie-preferences.html +57 -0
  307. package/.server/server/views/help/cookies.html +71 -0
  308. package/.server/server/views/help/get-support.html +37 -0
  309. package/.server/server/views/help/privacy-notice.html +68 -0
  310. package/.server/server/views/help/terms-and-conditions.html +83 -0
  311. package/.server/server/views/layout.html +199 -0
  312. package/.server/server/views/summary.html +50 -0
  313. package/.server/typings/hapi/index.d.js +2 -0
  314. package/.server/typings/hapi/index.d.js.map +1 -0
  315. package/.server/typings/hapi-tracing/index.d.js +2 -0
  316. package/.server/typings/hapi-tracing/index.d.js.map +1 -0
  317. package/.server/typings/index.d.js +2 -0
  318. package/.server/typings/index.d.js.map +1 -0
  319. package/.server/typings/joi/index.d.js +2 -0
  320. package/.server/typings/joi/index.d.js.map +1 -0
  321. package/Dockerfile +61 -0
  322. package/LICENCE +8 -0
  323. package/Procfile +1 -0
  324. package/README.md +87 -0
  325. package/babel.config.cjs +55 -0
  326. package/compose/aws.env +4 -0
  327. package/compose/start-localstack.sh +26 -0
  328. package/docker-compose.yaml +86 -0
  329. package/globals.d.ts +1 -0
  330. package/jest.config.cjs +54 -0
  331. package/jest.environment.js +4 -0
  332. package/jest.setup.cjs +14 -0
  333. package/package.json +163 -0
  334. package/postcss.config.js +26 -0
  335. package/sonar-project.properties +17 -0
  336. package/src/client/javascripts/application.js +87 -0
  337. package/src/client/javascripts/file-upload.js +386 -0
  338. package/src/client/stylesheets/_code.scss +33 -0
  339. package/src/client/stylesheets/_govuk-frontend.scss +4 -0
  340. package/src/client/stylesheets/_prose.scss +56 -0
  341. package/src/client/stylesheets/_service-banner.scss +24 -0
  342. package/src/client/stylesheets/_summary-list.scss +28 -0
  343. package/src/client/stylesheets/_tag-env.scss +24 -0
  344. package/src/client/stylesheets/application.scss +14 -0
  345. package/src/common/cookies.js +58 -0
  346. package/src/common/cookies.test.js +23 -0
  347. package/src/common/types.js +5 -0
  348. package/src/config/index.ts +271 -0
  349. package/src/index.ts +31 -0
  350. package/src/server/common/helpers/logging/logger-options.test.ts +50 -0
  351. package/src/server/common/helpers/logging/logger-options.ts +46 -0
  352. package/src/server/common/helpers/logging/logger.ts +7 -0
  353. package/src/server/common/helpers/logging/request-logger.ts +9 -0
  354. package/src/server/common/helpers/logging/request-tracing.js +10 -0
  355. package/src/server/common/helpers/redis-client.js +70 -0
  356. package/src/server/constants.js +1 -0
  357. package/src/server/forms/README.md +10 -0
  358. package/src/server/forms/components.json +1015 -0
  359. package/src/server/forms/report-a-terrorist.json +270 -0
  360. package/src/server/forms/runner-components-test.json +365 -0
  361. package/src/server/forms/test.json +581 -0
  362. package/src/server/index.test.ts +582 -0
  363. package/src/server/index.ts +140 -0
  364. package/src/server/plugins/blankie.test.ts +73 -0
  365. package/src/server/plugins/blankie.ts +48 -0
  366. package/src/server/plugins/crumb.ts +20 -0
  367. package/src/server/plugins/engine/README.md +87 -0
  368. package/src/server/plugins/engine/components/AutocompleteField.test.ts +294 -0
  369. package/src/server/plugins/engine/components/AutocompleteField.ts +49 -0
  370. package/src/server/plugins/engine/components/CheckboxesField.test.ts +379 -0
  371. package/src/server/plugins/engine/components/CheckboxesField.ts +106 -0
  372. package/src/server/plugins/engine/components/ComponentBase.ts +97 -0
  373. package/src/server/plugins/engine/components/ComponentCollection.ts +278 -0
  374. package/src/server/plugins/engine/components/DatePartsField.test.ts +822 -0
  375. package/src/server/plugins/engine/components/DatePartsField.ts +264 -0
  376. package/src/server/plugins/engine/components/Details.test.ts +49 -0
  377. package/src/server/plugins/engine/components/Details.ts +30 -0
  378. package/src/server/plugins/engine/components/EmailAddressField.test.ts +395 -0
  379. package/src/server/plugins/engine/components/EmailAddressField.ts +55 -0
  380. package/src/server/plugins/engine/components/FileUploadField.test.ts +778 -0
  381. package/src/server/plugins/engine/components/FileUploadField.ts +262 -0
  382. package/src/server/plugins/engine/components/FormComponent.ts +249 -0
  383. package/src/server/plugins/engine/components/Html.test.ts +48 -0
  384. package/src/server/plugins/engine/components/Html.ts +29 -0
  385. package/src/server/plugins/engine/components/InsetText.test.ts +48 -0
  386. package/src/server/plugins/engine/components/InsetText.ts +27 -0
  387. package/src/server/plugins/engine/components/List.test.ts +76 -0
  388. package/src/server/plugins/engine/components/List.ts +72 -0
  389. package/src/server/plugins/engine/components/ListFormComponent.ts +140 -0
  390. package/src/server/plugins/engine/components/MonthYearField.test.ts +567 -0
  391. package/src/server/plugins/engine/components/MonthYearField.ts +222 -0
  392. package/src/server/plugins/engine/components/MultilineTextField.test.ts +558 -0
  393. package/src/server/plugins/engine/components/MultilineTextField.ts +138 -0
  394. package/src/server/plugins/engine/components/NumberField.test.ts +701 -0
  395. package/src/server/plugins/engine/components/NumberField.ts +163 -0
  396. package/src/server/plugins/engine/components/RadiosField.test.ts +288 -0
  397. package/src/server/plugins/engine/components/RadiosField.ts +24 -0
  398. package/src/server/plugins/engine/components/SelectField.test.ts +288 -0
  399. package/src/server/plugins/engine/components/SelectField.ts +47 -0
  400. package/src/server/plugins/engine/components/SelectionControlField.ts +43 -0
  401. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +356 -0
  402. package/src/server/plugins/engine/components/TelephoneNumberField.ts +67 -0
  403. package/src/server/plugins/engine/components/TextField.test.ts +489 -0
  404. package/src/server/plugins/engine/components/TextField.ts +96 -0
  405. package/src/server/plugins/engine/components/UkAddressField.test.ts +623 -0
  406. package/src/server/plugins/engine/components/UkAddressField.ts +172 -0
  407. package/src/server/plugins/engine/components/YesNoField.test.ts +248 -0
  408. package/src/server/plugins/engine/components/YesNoField.ts +31 -0
  409. package/src/server/plugins/engine/components/constants.ts +1 -0
  410. package/src/server/plugins/engine/components/helpers.ts +330 -0
  411. package/src/server/plugins/engine/components/index.ts +24 -0
  412. package/src/server/plugins/engine/components/types.ts +117 -0
  413. package/src/server/plugins/engine/configureEnginePlugin.ts +47 -0
  414. package/src/server/plugins/engine/helpers.test.ts +791 -0
  415. package/src/server/plugins/engine/helpers.ts +379 -0
  416. package/src/server/plugins/engine/index.ts +7 -0
  417. package/src/server/plugins/engine/models/FormModel.test.ts +42 -0
  418. package/src/server/plugins/engine/models/FormModel.ts +443 -0
  419. package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
  420. package/src/server/plugins/engine/models/Section.ts +0 -0
  421. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +209 -0
  422. package/src/server/plugins/engine/models/SummaryViewModel.ts +220 -0
  423. package/src/server/plugins/engine/models/index.ts +2 -0
  424. package/src/server/plugins/engine/models/types.ts +114 -0
  425. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +143 -0
  426. package/src/server/plugins/engine/outputFormatters/human/v1.ts +73 -0
  427. package/src/server/plugins/engine/outputFormatters/index.test.ts +17 -0
  428. package/src/server/plugins/engine/outputFormatters/index.ts +44 -0
  429. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +229 -0
  430. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +140 -0
  431. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +229 -0
  432. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +153 -0
  433. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +1108 -0
  434. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +446 -0
  435. package/src/server/plugins/engine/pageControllers/PageController.test.ts +205 -0
  436. package/src/server/plugins/engine/pageControllers/PageController.ts +176 -0
  437. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +1264 -0
  438. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +561 -0
  439. package/src/server/plugins/engine/pageControllers/README.md +28 -0
  440. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +264 -0
  441. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +458 -0
  442. package/src/server/plugins/engine/pageControllers/StartPageController.ts +18 -0
  443. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +50 -0
  444. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +261 -0
  445. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +28 -0
  446. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +19 -0
  447. package/src/server/plugins/engine/pageControllers/helpers.test.ts +198 -0
  448. package/src/server/plugins/engine/pageControllers/helpers.ts +101 -0
  449. package/src/server/plugins/engine/pageControllers/index.ts +10 -0
  450. package/src/server/plugins/engine/pageControllers/validationOptions.ts +89 -0
  451. package/src/server/plugins/engine/plugin.ts +673 -0
  452. package/src/server/plugins/engine/services/formSubmissionService.js +46 -0
  453. package/src/server/plugins/engine/services/formsService.js +46 -0
  454. package/src/server/plugins/engine/services/formsService.test.js +90 -0
  455. package/src/server/plugins/engine/services/index.js +3 -0
  456. package/src/server/plugins/engine/services/notifyService.test.ts +132 -0
  457. package/src/server/plugins/engine/services/notifyService.ts +64 -0
  458. package/src/server/plugins/engine/services/uploadService.js +60 -0
  459. package/src/server/plugins/engine/types.ts +315 -0
  460. package/src/server/plugins/engine/views/components/autocompletefield.html +5 -0
  461. package/src/server/plugins/engine/views/components/checkboxesfield.html +5 -0
  462. package/src/server/plugins/engine/views/components/datepartsfield.html +5 -0
  463. package/src/server/plugins/engine/views/components/details.html +6 -0
  464. package/src/server/plugins/engine/views/components/emailaddressfield.html +5 -0
  465. package/src/server/plugins/engine/views/components/fileuploadfield-key.html +8 -0
  466. package/src/server/plugins/engine/views/components/fileuploadfield-value.html +3 -0
  467. package/src/server/plugins/engine/views/components/fileuploadfield.html +24 -0
  468. package/src/server/plugins/engine/views/components/html.html +3 -0
  469. package/src/server/plugins/engine/views/components/insettext.html +7 -0
  470. package/src/server/plugins/engine/views/components/list.html +36 -0
  471. package/src/server/plugins/engine/views/components/monthyearfield.html +5 -0
  472. package/src/server/plugins/engine/views/components/multilinetextfield.html +10 -0
  473. package/src/server/plugins/engine/views/components/numberfield.html +5 -0
  474. package/src/server/plugins/engine/views/components/radiosfield.html +5 -0
  475. package/src/server/plugins/engine/views/components/selectfield.html +5 -0
  476. package/src/server/plugins/engine/views/components/telephonenumberfield.html +5 -0
  477. package/src/server/plugins/engine/views/components/textfield.html +5 -0
  478. package/src/server/plugins/engine/views/components/ukaddressfield.html +25 -0
  479. package/src/server/plugins/engine/views/components/yesnofield.html +5 -0
  480. package/src/server/plugins/engine/views/file-upload.html +45 -0
  481. package/src/server/plugins/engine/views/index.html +39 -0
  482. package/src/server/plugins/engine/views/item-delete.html +56 -0
  483. package/src/server/plugins/engine/views/partials/components.html +6 -0
  484. package/src/server/plugins/engine/views/partials/conditional-components.html +3 -0
  485. package/src/server/plugins/engine/views/partials/debug.html +44 -0
  486. package/src/server/plugins/engine/views/partials/form.html +15 -0
  487. package/src/server/plugins/engine/views/partials/heading.html +16 -0
  488. package/src/server/plugins/engine/views/partials/preview-banner.html +32 -0
  489. package/src/server/plugins/engine/views/partials/preview-banner.test.js +122 -0
  490. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +10 -0
  491. package/src/server/plugins/engine/views/repeat-list-summary.html +53 -0
  492. package/src/server/plugins/errorPages.ts +58 -0
  493. package/src/server/plugins/nunjucks/context.js +88 -0
  494. package/src/server/plugins/nunjucks/context.test.js +142 -0
  495. package/src/server/plugins/nunjucks/enviroment.test.js +201 -0
  496. package/src/server/plugins/nunjucks/environment.js +116 -0
  497. package/src/server/plugins/nunjucks/filters/answer.js +27 -0
  498. package/src/server/plugins/nunjucks/filters/answer.test.js +89 -0
  499. package/src/server/plugins/nunjucks/filters/evaluate.js +21 -0
  500. package/src/server/plugins/nunjucks/filters/field.js +28 -0
  501. package/src/server/plugins/nunjucks/filters/field.test.js +75 -0
  502. package/src/server/plugins/nunjucks/filters/highlight.js +11 -0
  503. package/src/server/plugins/nunjucks/filters/href.js +30 -0
  504. package/src/server/plugins/nunjucks/filters/href.test.js +80 -0
  505. package/src/server/plugins/nunjucks/filters/index.js +8 -0
  506. package/src/server/plugins/nunjucks/filters/inspect.js +15 -0
  507. package/src/server/plugins/nunjucks/filters/page.js +24 -0
  508. package/src/server/plugins/nunjucks/filters/page.test.js +65 -0
  509. package/src/server/plugins/nunjucks/index.js +3 -0
  510. package/src/server/plugins/nunjucks/plugin.js +40 -0
  511. package/src/server/plugins/nunjucks/render.js +42 -0
  512. package/src/server/plugins/nunjucks/types.js +40 -0
  513. package/src/server/plugins/pulse.ts +11 -0
  514. package/src/server/plugins/router.ts +201 -0
  515. package/src/server/plugins/session.ts +28 -0
  516. package/src/server/routes/health.js +13 -0
  517. package/src/server/routes/health.test.js +35 -0
  518. package/src/server/routes/index.test.ts +125 -0
  519. package/src/server/routes/index.ts +2 -0
  520. package/src/server/routes/public.ts +47 -0
  521. package/src/server/routes/types.ts +48 -0
  522. package/src/server/schemas/index.ts +34 -0
  523. package/src/server/secure-context.js +43 -0
  524. package/src/server/services/cacheService.test.ts +276 -0
  525. package/src/server/services/cacheService.ts +131 -0
  526. package/src/server/services/httpService.test.js +491 -0
  527. package/src/server/services/httpService.ts +50 -0
  528. package/src/server/services/index.ts +1 -0
  529. package/src/server/types.ts +54 -0
  530. package/src/server/utils/notify.test.ts +37 -0
  531. package/src/server/utils/notify.ts +50 -0
  532. package/src/server/utils/secure-context/get-trust-store-certs.js +11 -0
  533. package/src/server/utils/secure-context/get-trust-store-certs.test.js +19 -0
  534. package/src/server/utils/utils.js +24 -0
  535. package/src/server/utils/utils.test.js +54 -0
  536. package/src/server/views/404.html +16 -0
  537. package/src/server/views/500.html +19 -0
  538. package/src/server/views/components/debug/macro.njk +3 -0
  539. package/src/server/views/components/debug/template.njk +13 -0
  540. package/src/server/views/components/service-banner/macro.njk +3 -0
  541. package/src/server/views/components/service-banner/template.njk +20 -0
  542. package/src/server/views/components/service-banner/template.test.js +43 -0
  543. package/src/server/views/components/tag-env/macro.njk +3 -0
  544. package/src/server/views/components/tag-env/template.njk +30 -0
  545. package/src/server/views/components/tag-env/template.test.js +66 -0
  546. package/src/server/views/confirmation.html +19 -0
  547. package/src/server/views/help/accessibility-statement.html +58 -0
  548. package/src/server/views/help/cookie-preferences.html +57 -0
  549. package/src/server/views/help/cookies.html +71 -0
  550. package/src/server/views/help/get-support.html +37 -0
  551. package/src/server/views/help/privacy-notice.html +68 -0
  552. package/src/server/views/help/terms-and-conditions.html +83 -0
  553. package/src/server/views/layout.html +199 -0
  554. package/src/server/views/summary.html +50 -0
  555. package/src/typings/hapi/index.d.ts +95 -0
  556. package/src/typings/hapi-tracing/index.d.ts +6 -0
  557. package/src/typings/index.d.ts +3 -0
  558. package/src/typings/joi/index.d.ts +22 -0
  559. package/stylelint.config.js +10 -0
  560. package/test/client/javascripts/file-upload.test.js +1197 -0
  561. package/test/condition/checkboxes.test.js +112 -0
  562. package/test/condition/radios.test.js +112 -0
  563. package/test/condition/text.test.js +103 -0
  564. package/test/fixtures/assets-manifest.json +4 -0
  565. package/test/fixtures/form.js +86 -0
  566. package/test/fixtures/index.js +2 -0
  567. package/test/fixtures/list.js +92 -0
  568. package/test/form/cookies.test.js +338 -0
  569. package/test/form/csrf.test.js +87 -0
  570. package/test/form/definitions/basic.js +101 -0
  571. package/test/form/definitions/blank.js +10 -0
  572. package/test/form/definitions/checkboxes.json +88 -0
  573. package/test/form/definitions/components.json +452 -0
  574. package/test/form/definitions/conditional-reveal.js +140 -0
  575. package/test/form/definitions/conditions-basic.js +187 -0
  576. package/test/form/definitions/conditions-complex.js +338 -0
  577. package/test/form/definitions/conditions-dates.js +78 -0
  578. package/test/form/definitions/conditions-escaping.js +143 -0
  579. package/test/form/definitions/demo-cph-number.js +3099 -0
  580. package/test/form/definitions/feedback.json +45 -0
  581. package/test/form/definitions/fields-optional.js +402 -0
  582. package/test/form/definitions/fields-required.js +402 -0
  583. package/test/form/definitions/file-upload-basic.js +44 -0
  584. package/test/form/definitions/file-upload.js +66 -0
  585. package/test/form/definitions/minimal.js +39 -0
  586. package/test/form/definitions/phase-alpha.json +33 -0
  587. package/test/form/definitions/phase-default.json +26 -0
  588. package/test/form/definitions/radios.json +88 -0
  589. package/test/form/definitions/repeat-mixed.js +54 -0
  590. package/test/form/definitions/repeat.js +70 -0
  591. package/test/form/definitions/status.json +126 -0
  592. package/test/form/definitions/templates.js +183 -0
  593. package/test/form/definitions/test.json +581 -0
  594. package/test/form/definitions/text.json +75 -0
  595. package/test/form/definitions/titles.json +170 -0
  596. package/test/form/definitions.test.js +47 -0
  597. package/test/form/exit-page.test.js +210 -0
  598. package/test/form/feedback.test.js +68 -0
  599. package/test/form/fields-optional.test.js +237 -0
  600. package/test/form/fields-required.test.js +294 -0
  601. package/test/form/file-upload.test.js +313 -0
  602. package/test/form/govuk-notify.test.js +449 -0
  603. package/test/form/journey-basic.test.js +444 -0
  604. package/test/form/persist-files.test.js +227 -0
  605. package/test/form/phase-banner.test.js +71 -0
  606. package/test/form/repeat.test.js +628 -0
  607. package/test/form/summary-submission-email.test.js +95 -0
  608. package/test/form/template.test.js +288 -0
  609. package/test/form/titles.test.js +204 -0
  610. package/test/helpers/component-helpers.js +74 -0
  611. package/test/utils/get-cookie.js +42 -0
  612. package/test/utils/get-form-definitions.js +18 -0
  613. package/tmp.pdf +1 -0
  614. package/tsconfig.json +28 -0
  615. package/webpack.config.js +208 -0
@@ -0,0 +1,68 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% set pageTitle = config.serviceName + " privacy notice" %}
4
+
5
+ {% block content %}
6
+ <div class="govuk-grid-row">
7
+ <div class="govuk-grid-column-two-thirds">
8
+ <h1 class="govuk-heading-l">{{ config.serviceName }} privacy notice</h1>
9
+ <p class="govuk-body">The {{ form.title }} form was created using ‘{{ config.serviceName }}’. This service is owned and operated by the Department for Environment, Food & Rural Affairs (Defra).</p>
10
+
11
+ <h2 class="govuk-heading-m">Who collects your personal data</h2>
12
+ <p class="govuk-body">The organisation that created the {{ form.title }} form using ‘{{ config.serviceName }}’ is the data controller of personal data they collect. If the data controller is outside the Defra legal entity, then Defra is the data processor.</p>
13
+ <p class="govuk-body">Read the <a href="{{ form.privacyNoticeUrl }}" class="govuk-link">specific privacy notice for the {{ form.title }} form</a>.</p>
14
+ <p class="govuk-body">Defra also collects some data as a data controller. This privacy notice explains what personal data Defra collects and processes as a data controller through forms made with ‘{{ config.serviceName }}’.</p>
15
+ <p class="govuk-body">If you need further information about how Defra uses your personal data, email <a href="mailto:defraforms@defra.gov.uk" class="govuk-link">defraforms@defra.gov.uk</a>.</p>
16
+ <p class="govuk-body">If you want information and your associated rights you can email: <a href="mailto:data.protection@defra.gov.uk" class="govuk-link">data.protection@defra.gov.uk</a>.</p>
17
+ <p class="govuk-body">The data protection officer for Defra is responsible for checking that Defra complies with legislation. You can contact them at <a href="mailto:DefraGroupDataProtectionOfficer@defra.gov.uk" class="govuk-link">Defra<wbr>Group<wbr>Data<wbr>Protection<wbr>Officer@defra.gov.uk</a>.</p>
18
+
19
+ <h2 class="govuk-heading-m">Data we collect from you and what we do with it</h2>
20
+ <p class="govuk-body">If you give your consent, we use Google Analytics cookies to collect information about how you use ‘{{ config.serviceName }}’. Read the <a href="https://support.google.com/analytics/topic/2919631" class="govuk-link">data privacy and security policy for Google Analytics</a>.</p>
21
+ <p class="govuk-body">Google Analytics processes information about:</p>
22
+ <ul class="govuk-list govuk-list--bullet">
23
+ <li>your IP address</li>
24
+ <li>the pages you visit on ‘{{ config.serviceName }}’</li>
25
+ <li>how long you spend on each ‘{{ config.serviceName }}’ page</li>
26
+ <li>how you got to the site</li>
27
+ <li>what you select while you’re visiting the site</li>
28
+ </ul>
29
+ <p class="govuk-body">Defra will make sure you cannot be directly identified by Google Analytics data. We do this by using <a href="https://support.google.com/analytics/answer/2763052" class="govuk-link">Google Analytics’ IP address anonymisation</a> feature and by removing any other personal data from the titles or URLs of the pages you visit.</p>
30
+ <p class="govuk-body">Defra will not combine analytics information with other data sets in a way that would directly identify who you are.</p>
31
+ <p class="govuk-body">We use system logs to collect information about the usage of forms. The logs are stored in Amazon Web Services based in London.</p>
32
+ <p class="govuk-body">We use the system logs and Google Analytics data to create anonymised reports about the performance of forms that use ‘{{ config.serviceName }}’. We use this data to improve forms, for example, if we discover a high number of drops offs at a certain point within a form. We may share this information with the data controller of the form.</p>
33
+ <p class="govuk-body">If you email us feedback about a form that uses ‘{{ config.serviceName }}’, we’ll send your email address and any other personal information you choose to include in your email to the data controller for review. The data controller may use your personal information to reply to your query to update a form based on your feedback where it is appropriate.</p>
34
+
35
+ <h2 class="govuk-heading-m">Lawful basis for processing your personal data</h2>
36
+ <p class="govuk-body">The lawful basis for processing your personal data is your consent.</p>
37
+
38
+ <h2 class="govuk-heading-m">Cookies</h2>
39
+ <p class="govuk-body">We use cookies to make this form work. Read about the <a href="/help/cookies" class="govuk-link">cookies we use to make this form work</a>.</p>
40
+
41
+ <h2 class="govuk-heading-m">How long we keep your data</h2>
42
+ <p class="govuk-body">Defra will keep tracking cookies on your device for up to 1 year.</p>
43
+
44
+ <h2 class="govuk-heading-m">Transfer of your personal data outside of the UK</h2>
45
+ <p class="govuk-body">We will only transfer your personal data to another country that is deemed adequate for data protection purposes.</p>
46
+
47
+ <h2 class="govuk-heading-m">What are your rights</h2>
48
+ <p class="govuk-body">Based on the lawful processing above, your individual rights are:</p>
49
+ <ul class="govuk-list govuk-list--bullet">
50
+ <li>the right to be informed</li>
51
+ <li>the right of access</li>
52
+ <li>the right to rectification</li>
53
+ <li>the right to erasure</li>
54
+ <li>the right to restrict processing</li>
55
+ <li>the right to data portability</li>
56
+ <li>rights in relation to automated decision making and profiling</li>
57
+ </ul>
58
+ <p class="govuk-body">Get more information about your <a href="https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/individual-rights/" class="govuk-link">individual rights</a> under the UK General Data Protection Regulation (UK GDPR) and the Data Protection Act 2018 (DPA 2018).</p>
59
+
60
+ <h2 class="govuk-heading-m">Complaints</h2>
61
+ <p class="govuk-body">You have the right to <a href="https://ico.org.uk/make-a-complaint/" class="govuk-link">make a complaint</a> to the Information Commissioner’s Office at any time.</p>
62
+
63
+ <h2 class="govuk-heading-m">Personal information charter</h2>
64
+ <p class="govuk-body">Our <a href="https://www.gov.uk/government/organisations/department-for-environment-food-rural-affairs/about/personal-information-charter" class="govuk-link">personal information charter</a> explains more about your rights over your personal data.</p>
65
+ <p class="govuk-body">Last updated: 24 December 2024</p>
66
+ </div>
67
+ </div>
68
+ {% endblock %}
@@ -0,0 +1,83 @@
1
+ {% extends 'layout.html' %}
2
+
3
+ {% block content %}
4
+ <div class="govuk-grid-row">
5
+ <div class="govuk-grid-column-two-thirds">
6
+ <h1 class="govuk-heading-l">Terms and conditions</h1>
7
+ <p class="govuk-body">By using this digital service you agree to our <a rel=noopener
8
+ href="https://www.gov.uk/government/publications/foreign-and-commonwealth-office-privacy-notice-consular-services-in-the-uk-and-at-british-embassies-high-commissions-and-consulates-overseas/foreign-and-commonwealth-office-privacy-notice-consular-services-in-the-uk-and-missions-overseas">
9
+ privacy policy</a> and to these terms and conditions. Read them carefully.
10
+ </p>
11
+ <h2 class="govuk-heading-l">General</h2>
12
+ <p class="govuk-body">These terms and conditions affect your rights and liabilities under
13
+ the law. They govern your use of, and relationship with, the service. They don’t apply to other services
14
+ provided by the Foreign &amp; Commonwealth Office, or to any other department or service which is linked
15
+ to in this service.</p>
16
+ <p class="govuk-body">You agree to use this site only for lawful purposes, and in a
17
+ manner that does not infringe the rights of, or restrict or inhibit the use and enjoyment of, this site
18
+ by any third party.</p>
19
+ <p class="govuk-body">We may occasionally update these terms and conditions. This might happen if there’s a change in the law or to the way this service works. Check these terms and conditions regularly, as continued use of the service after a change has been made is your acceptance of the change. If you don't agree to the terms and conditions and </span><a
20
+ rel=noopener href="https://www.gov.uk/government/publications/foreign-and-commonwealth-office-privacy-notice-consular-services-in-the-uk-and-at-british-embassies-high-commissions-and-consulates-overseas/foreign-and-commonwealth-office-privacy-notice-consular-services-in-the-uk-and-missions-overseas">
21
+ privacy policy</a>, you should not use this service.</p>
22
+ <h2 class="govuk-heading-l">Applicable law</h2>
23
+ <p class="govuk-body">Your use of this service and any dispute arising from its use will
24
+ be governed by and construed in accordance with the laws of England and Wales, including but not limited
25
+ to the:</p>
26
+ <ul class="govuk-list">
27
+ <li>Computer Misuse Act 1990</li>
28
+ <li>Data Protection Act</li>
29
+ <li>Mental Capacity Act 2005</li>
30
+ </ul>
31
+ <h2 class="govuk-heading-l">How to use this service responsibly</h2>
32
+ <p class="govuk-body">You must provide us with enough information for us to assess the
33
+ case fairly and if appropriate to provide the service. We also need these details to provide information
34
+ about the appointment, including rescheduling and cancellation when necessary, so you must provide
35
+ accurate details where we can reliably contact you.</p>
36
+ <p class="govuk-body">When attending their appointment the person requiring an emergency
37
+ travel document will have to pass through Security checks. They should expect their belongings to be
38
+ checked, and will have to leave their mobile phone and other belongings with the Security Officer. Do
39
+ not bring laptops or other electronic devices. Arrive in advance of the appointment. If you need to
40
+ cancel or modify your booking, you will be able to do so by following the link in the confirmation
41
+ email.</p>
42
+ <p class="govuk-body">There are risks in using a shared computer, such as in an internet
43
+ café, to use this digital service. It’s your responsibility to be aware of these risks and to avoid
44
+ using any computer which may leave your personal information accessible to others. You are responsible
45
+ if you choose to leave a computer unprotected while in the process of using the service.</p>
46
+ <p class="govuk-body">We make every effort to check and test this service whenever we
47
+ amend or update it. However, you must take your own precautions to ensure that the way you access this
48
+ service does not expose you to the risk of viruses, malicious computer code or other forms of
49
+ interference which may damage your own computer system.</p>
50
+ <p class="govuk-body">You must not misuse our service by knowingly introducing viruses,
51
+ trojans, worms, logic bombs or other material which is malicious or technologically harmful. You must
52
+ not attempt to gain unauthorised access to our service, the system on which our service is stored or any
53
+ server, computer or database connected to our service. You must not attack our site via a
54
+ denial-of-service attack or a distributed denial-of-service attack.</p>
55
+ <h1 class="govuk-heading-l">Disclaimer</h1>
56
+ <p class="govuk-body">While we make every effort to keep this service up to date, we
57
+ don’t provide any guarantees, conditions or warranties as to the accuracy of the information on the
58
+ site.</p>
59
+ <p class="govuk-body">While Consular staff will give you as much advice as they can, it
60
+ is your responsibility to ensure that you are obtaining the correct service and that you bring all the
61
+ necessary documentation for the service. If you are unsure, you may wish to take legal advice before
62
+ booking the service </p>
63
+ <p class="govuk-body">Our consular fees are not refundable, and are subject to change without notice. Check the relevant <a
64
+ href="https://www.gov.uk/search?q=consular+fees" target="_blank" rel="noopener noreferrer">consular fees list</a> for the latest information.</p>
65
+ <p class="govuk-body">We don’t accept liability for loss or damage incurred by users of
66
+ this service, whether direct, indirect or consequential, whether caused by tort, breach of contract or
67
+ otherwise. This includes loss of income or revenue, business, profits or contracts, anticipated savings,
68
+ data, goodwill, tangible property or wasted time in connection with this service or any websites linked
69
+ to it and any materials posted on it. This condition shall not prevent claims for loss of or damage to
70
+ your tangible property or any other claims for direct financial loss that are not excluded by any of the
71
+ categories set out above.</p>
72
+ <p class="govuk-body">This does not affect our liability for death or personal injury
73
+ arising from our negligence, nor our liability for fraudulent misrepresentation or misrepresentation as
74
+ to a fundamental matter, nor any other liability which cannot be excluded or limited under applicable
75
+ law. </p>
76
+ <h2 class="govuk-heading-l">Information provided by this service</h2>
77
+ <p class="govuk-body"> We work hard to ensure that information within this service is
78
+ accurate. However, we can’t guarantee the accuracy and completeness of any information at all times.
79
+ While we make every effort to ensure this service is accessible at all times, we are not liable if it is
80
+ unavailable for any period of time. </p>
81
+ </div>
82
+ </div>
83
+ {% endblock %}
@@ -0,0 +1,199 @@
1
+ {% extends "govuk/template.njk" %}
2
+
3
+ {% from "govuk/components/back-link/macro.njk" import govukBackLink -%}
4
+ {% from "govuk/components/footer/macro.njk" import govukFooter -%}
5
+ {% from "govuk/components/phase-banner/macro.njk" import govukPhaseBanner -%}
6
+ {% from "govuk/components/skip-link/macro.njk" import govukSkipLink -%}
7
+ {% from "govuk/macros/attributes.njk" import govukAttributes -%}
8
+ {% from "components/service-banner/macro.njk" import appServiceBanner -%}
9
+ {% from "components/tag-env/macro.njk" import appTagEnv -%}
10
+ {% from "govuk/components/cookie-banner/macro.njk" import govukCookieBanner -%}
11
+ {% from "govuk/components/notification-banner/macro.njk" import govukNotificationBanner -%}
12
+
13
+ {% set productName %}
14
+ {% if config.cdpEnvironment !== "prod" %}
15
+ {{ appTagEnv({ env: config.cdpEnvironment }) }}
16
+ {% endif %}
17
+ {% endset %}
18
+
19
+ {% block head %}
20
+ <meta name="application-name" content="@defra/forms-runner" {{- govukAttributes({
21
+ "data-environment": {
22
+ value: config.cdpEnvironment,
23
+ optional: true
24
+ },
25
+ "data-version": {
26
+ value: config.serviceVersion,
27
+ optional: true
28
+ }
29
+ }) }}>
30
+
31
+ <link rel="preload" as="font" href="{{ assetPath }}/fonts/bold-b542beb274-v2.woff2" type="font/woff2" crossorigin="anonymous">
32
+ <link rel="preload" as="font" href="{{ assetPath }}/fonts/light-94a07e06a1-v2.woff2" type="font/woff2" crossorigin="anonymous">
33
+ <link rel="stylesheet" href="{{ getAssetPath("stylesheets/application.scss") }}">
34
+ {% endblock %}
35
+
36
+ {% block pageTitle -%}
37
+ {{ "Error: " if errors | length }}{{ pageTitle | evaluate }} - {{ name if name else config.serviceName }} - GOV.UK
38
+ {%- endblock %}
39
+
40
+ {% block skipLink %}
41
+ {{ govukSkipLink({
42
+ href: '#main-content',
43
+ text: 'Skip to main content'
44
+ }) }}
45
+ {% endblock %}
46
+
47
+ {% block header %}
48
+ {% if config.googleAnalyticsTrackingId and slug %}
49
+ <form method="post" action="/help/cookie-preferences/{{ slug }}?returnUrl={{ currentPath | urlencode }}">
50
+ <input type="hidden" name="crumb" value="{{ crumb }}">
51
+
52
+ {% set acceptHtml %}
53
+ <p class="govuk-body">You’ve accepted analytics cookies. You can <a class="govuk-link" href="/help/cookies/{{ slug }}">change your cookie settings</a> at any time.</p>
54
+ {% endset %}
55
+
56
+ {% set rejectedHtml %}
57
+ <p class="govuk-body">You’ve rejected analytics cookies. You can <a class="govuk-link" href="/help/cookies/{{ slug }}">change your cookie settings</a> at any time.</p>
58
+ {% endset %}
59
+
60
+ {% if cookieConsent.analytics !== true and cookieConsent.analytics !== false and cookieConsent.dismissed !== true %}
61
+ {% set html %}
62
+ <p class="govuk-body">We use some essential cookies to make this service work.</p>
63
+ <p class="govuk-body">We’d like to set analytics cookies so we can understand how people use the service and make improvements.</p>
64
+ {% endset %}
65
+
66
+ {{ govukCookieBanner({
67
+ ariaLabel: "Cookies on " + config.serviceName,
68
+ messages: [
69
+ {
70
+ headingText: config.serviceName,
71
+ html: html,
72
+ actions: [
73
+ {
74
+ text: "Accept analytics cookies",
75
+ type: "submit",
76
+ name: "cookies[analytics]",
77
+ value: "yes"
78
+ },
79
+ {
80
+ text: "Reject analytics cookies",
81
+ type: "submit",
82
+ name: "cookies[analytics]",
83
+ value: "no"
84
+ },
85
+ {
86
+ text: "View cookies",
87
+ href: "/help/cookies/" + slug
88
+ }
89
+ ]
90
+ }
91
+ ]
92
+ }) }}
93
+ {% elif cookieConsent.dismissed === false %}
94
+ {{ govukCookieBanner({
95
+ ariaLabel: "Cookies on " + config.serviceName,
96
+ messages: [
97
+ {
98
+ html: acceptHtml if cookieConsent.analytics === true else rejectedHtml,
99
+ actions: [
100
+ {
101
+ text: "Hide cookie message",
102
+ type: "submit",
103
+ name: "cookies[dismissed]",
104
+ value: "yes"
105
+ }
106
+ ]
107
+ }
108
+ ]
109
+ }) }}
110
+ {% endif %}
111
+
112
+ </form>
113
+ {% endif %}
114
+
115
+ {% if config.serviceBannerText | length %}
116
+ {{ appServiceBanner({
117
+ title: "Service status",
118
+ text: config.serviceBannerText
119
+ }) }}
120
+ {% endif %}
121
+
122
+ {{ govukHeader({
123
+ homepageUrl: currentPath if context.isForceAccess else "https://www.gov.uk",
124
+ containerClasses: "govuk-width-container",
125
+ productName: productName | safe | trim,
126
+ serviceName: name if name else config.serviceName,
127
+ serviceUrl: currentPath if context.isForceAccess else serviceUrl
128
+ }) }}
129
+ {% endblock %}
130
+
131
+ {% block beforeContent %}
132
+ {% set feedbackLink = feedbackLink or config.feedbackLink -%}
133
+ {% set phaseTag = phaseTag or config.phaseTag -%}
134
+
135
+ {% if phaseTag %}
136
+ {% set feedbackLinkHtml -%}
137
+ <a href="{{ currentPath if context.isForceAccess else feedbackLink }}" class="govuk-link" {%- if not context.isForceAccess %} target="_blank" rel="noopener noreferrer" {%- endif %}>
138
+ {%- if "mailto:" in feedbackLink -%}
139
+ give your feedback by email
140
+ {%- else -%}
141
+ give your feedback (opens in new tab)
142
+ {%- endif -%}
143
+ </a>
144
+ {%- endset %}
145
+
146
+ {{ govukPhaseBanner({
147
+ tag: { text: phaseTag | capitalize },
148
+ html: "This is a new service. Help us improve it and " + feedbackLinkHtml | safe + "."
149
+ }) }}
150
+ {% endif %}
151
+ {% if backLink %}
152
+ {{ govukBackLink(backLink) }}
153
+ {% endif %}
154
+ {% endblock %}
155
+
156
+ {% block content %}
157
+ <h1 class="govuk-heading-l">Default page template</h1>
158
+ {% endblock %}
159
+
160
+ {% block bodyEnd %}
161
+ <script type="module" nonce="{{ cspNonce }}" src="{{ getAssetPath("application.js") }}"></script>
162
+
163
+ {% if config.googleAnalyticsTrackingId and cookieConsent.analytics === true %}
164
+ <script id="ga-tag-js-main" nonce="{{ cspNonce }}" src="https://www.googletagmanager.com/gtag/js?id={{ config.googleAnalyticsTrackingId }}" defer></script>
165
+ <script id="ga-tag-js-init" nonce="{{ cspNonce }}">
166
+ window.dataLayer = window.dataLayer || [];
167
+ function gtag(){dataLayer.push(arguments);}
168
+ gtag('js', new Date());
169
+ gtag('config', '{{ config.googleAnalyticsTrackingId }}');
170
+ </script>
171
+ {% endif %}
172
+ {% endblock %}
173
+
174
+ {% block footer %}
175
+ {% set meta = {
176
+ items: [
177
+ {
178
+ href: '/help/get-support/' + slug,
179
+ text: 'Get help with this form'
180
+ },
181
+ {
182
+ href: '/help/privacy/' + slug,
183
+ text: 'Privacy'
184
+ },
185
+ {
186
+ href: '/help/cookies/' + slug,
187
+ text: 'Cookies'
188
+ },
189
+ {
190
+ href: '/help/accessibility-statement/' + slug,
191
+ text: 'Accessibility Statement'
192
+ }
193
+ ]
194
+ } if slug %}
195
+
196
+ {% if not context.isForceAccess %}
197
+ {{ govukFooter({ meta: meta }) }}
198
+ {% endif %}
199
+ {% endblock %}
@@ -0,0 +1,50 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %}
4
+ {% from "govuk/components/summary-list/macro.njk" import govukSummaryList %}
5
+
6
+ {% block content %}
7
+ <div class="govuk-grid-row">
8
+ <div class="govuk-grid-column-two-thirds">
9
+ {% if previewMode %}
10
+ {% include "partials/preview-banner.html" %}
11
+ {% endif %}
12
+
13
+ {% if hasMissingNotificationEmail %}
14
+ {% include "partials/warn-missing-notification-email.html" %}
15
+ {% endif %}
16
+
17
+ <h1 class="govuk-heading-l">
18
+ {{ pageTitle }}
19
+ </h1>
20
+
21
+ {% for section in checkAnswers %}
22
+ {% if section.title.text %}
23
+ <h2 class="govuk-heading-m">
24
+ {{ section.title.text }}
25
+ </h2>
26
+ {% endif %}
27
+
28
+ {{ govukSummaryList(section.summaryList) }}
29
+ {% endfor %}
30
+
31
+ <form method="post" novalidate>
32
+ <input type="hidden" name="crumb" value="{{ crumb }}">
33
+ <input type="hidden" name="action" value="send">
34
+
35
+ {% if declaration %}
36
+ <h2 class="govuk-heading-m" id="declaration">Declaration</h2>
37
+ {{ declaration | safe }}
38
+ {% endif %}
39
+
40
+ <button data-prevent-double-click="true" class="govuk-button" data-module="govuk-button">
41
+ {{ "Accept and send" if declaration else "Send" }}
42
+ </button>
43
+ </form>
44
+ </div>
45
+ </div>
46
+
47
+ {% if config.cdpEnvironment == 'local' and context | length and not context.isForceAccess %}
48
+ {% include "partials/debug.html" %}
49
+ {% endif %}
50
+ {% endblock %}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/unified-signatures */\n\nimport { type Plugin } from '@hapi/hapi'\nimport { type ServerYar, type Yar } from '@hapi/yar'\nimport { type Logger } from 'pino'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n type FormRequest,\n type FormRequestPayload\n} from '~/src/server/routes/types.js'\nimport { type CacheService } from '~/src/server/services/index.js'\n\ndeclare module '@hapi/hapi' {\n // Here we are decorating Hapi interface types with\n // props from plugins which doesn't export @types\n interface PluginProperties {\n crumb: {\n generate?: (request: Request | FormRequest | FormRequestPayload) => string\n }\n }\n\n interface PluginsStates {\n blankie?: {\n nonces?: {\n script?: string\n style?: string\n }\n }\n }\n\n interface Request {\n logger: Logger\n yar: Yar\n }\n\n interface RequestApplicationState {\n model?: FormModel\n }\n\n interface Server {\n logger: Logger\n yar: ServerYar\n }\n\n interface ServerApplicationState {\n model?: FormModel\n models: Map<string, { model: FormModel; updatedAt: Date }>\n }\n}\n\ndeclare module '@hapipal/schmervice' {\n interface RegisteredServices {\n cacheService: CacheService\n }\n\n interface SchmerviceDecorator {\n (all?: boolean): RegisteredServices\n (namespace?: string[]): RegisteredServices\n }\n}\n\ndeclare module '@hapi/scooter' {\n declare const hapiScooter: {\n plugin: Plugin\n }\n\n export = hapiScooter\n}\n\ndeclare module 'blankie' {\n declare const blankie: {\n plugin: Plugin<Record<string, boolean | string | string[]>>\n }\n\n export = blankie\n}\n\ndeclare module 'blipp' {\n declare const blipp: {\n plugin: Plugin\n }\n\n export = blipp\n}\n\ndeclare module 'hapi-pulse' {\n declare const hapiPulse: {\n plugin: Plugin<{\n timeout: number\n }>\n }\n\n export = hapiPulse\n}\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=index.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi-tracing/index.d.ts"],"sourcesContent":["declare module '@defra/hapi-tracing' {\n import { type Plugin } from '@hapi/hapi'\n\n export const tracing: Plugin<unknown>\n export function getTraceId(): string | null\n}\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=index.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../src/typings/index.d.ts"],"sourcesContent":["declare module '@hapi/scooter'\ndeclare module 'blankie'\ndeclare module 'blipp'\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/joi/index.d.ts"],"sourcesContent":["import { type FormPayload } from '~/src/server/plugins/engine/types.ts'\n\ndeclare module 'joi' {\n interface Context {\n present?: string[]\n presentWithLabels?: string[]\n missing?: string[]\n missingWithLabels?: string[]\n }\n\n /**\n * Add context types for `object.and` error reports\n * {@link https://joi.dev/api/?v=17.13.3#objectand}\n */\n interface ErrorReportCollection extends ErrorReport {\n local: Context & {\n value: FormPayload\n label?: string\n title?: string\n }\n }\n}\n"],"mappings":"","ignoreList":[]}
package/Dockerfile ADDED
@@ -0,0 +1,61 @@
1
+ ARG PARENT_VERSION=latest-22
2
+ ARG PORT=3000
3
+ ARG PORT_DEBUG=9229
4
+
5
+ FROM defradigital/node-development:${PARENT_VERSION} AS development
6
+
7
+ ENV TZ="Europe/London"
8
+
9
+ ARG PARENT_VERSION
10
+ LABEL uk.gov.defra.ffc.parent-image=defradigital/node-development:${PARENT_VERSION}
11
+
12
+ ARG PORT
13
+ ARG PORT_DEBUG
14
+ ENV PORT ${PORT}
15
+ EXPOSE ${PORT} ${PORT_DEBUG}
16
+
17
+ WORKDIR /home/node/app
18
+
19
+ COPY --chown=node:node packag*.json ./
20
+
21
+ RUN npm ci
22
+
23
+ COPY --chown=node:node ./ ./
24
+
25
+ CMD [ "npm", "run", "dev" ]
26
+
27
+ FROM development as productionBuild
28
+
29
+ WORKDIR /home/node/app
30
+
31
+ ENV NODE_ENV production
32
+
33
+ RUN npm run build
34
+
35
+ FROM defradigital/node:${PARENT_VERSION} AS production
36
+
37
+ ENV TZ="Europe/London"
38
+
39
+ # Add curl to template.
40
+ # CDP PLATFORM HEALTHCHECK REQUIREMENT
41
+ USER root
42
+ RUN apk update && \
43
+ apk add curl
44
+ USER node
45
+
46
+ ARG PARENT_VERSION
47
+ LABEL uk.gov.defra.ffc.parent-image=defradigital/node:${PARENT_VERSION}
48
+
49
+ WORKDIR /home/node/app
50
+
51
+ COPY --from=productionBuild /home/node/app/package*.json ./
52
+ COPY --from=productionBuild /home/node/app/.public ./.public
53
+ COPY --from=productionBuild /home/node/app/.server ./.server
54
+
55
+ RUN npm ci --omit=dev
56
+
57
+ ARG PORT
58
+ ENV PORT ${PORT}
59
+ EXPOSE ${PORT}
60
+
61
+ CMD [ "npm", "start", "--ignore-scripts" ]
package/LICENCE ADDED
@@ -0,0 +1,8 @@
1
+ The Open Government Licence (OGL) Version 3
2
+
3
+ Copyright (c) 2023 Defra
4
+
5
+ This source code is licensed under the Open Government Licence v3.0. To view this
6
+ licence, visit www.nationalarchives.gov.uk/doc/open-government-licence/version/3
7
+ or write to the Information Policy Team, The National Archives, Kew, Richmond,
8
+ Surrey, TW9 4DU.
package/Procfile ADDED
@@ -0,0 +1 @@
1
+ web: npm run start
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # forms-engine
2
+
3
+ Form hapi-plugin
4
+
5
+ ...
6
+
7
+ ## Templates
8
+
9
+ The following elements support [LiquidJS templates](https://liquidjs.com/):
10
+
11
+ - Page **title**
12
+ - Form component **titles**
13
+ - Support for fieldset legend text or label text
14
+ - This includes when the title is used in **error messages**
15
+ - Html (guidance) component **content**
16
+ - Summary component **row** key title (check answers and repeater summary)
17
+
18
+ ### Template data
19
+
20
+ The data the templates are evaluated against is the raw answers the user has provided up to the page they're currently on.
21
+ For example, given a YesNoField component called `TKsWbP`, the template `{{ TKsWbP }}` would render "true" or "false" depending on how the user answered the question.
22
+
23
+ The current FormContext is also available as `context` in the templates. This allows access to the full data including the path the user has taken in their journey and any miscellaneous data returned from `Page event`s in `context.data`.
24
+
25
+ ### Liquid Filters
26
+
27
+ There are a number of `LiquidJS` filters available to you from within the templates:
28
+
29
+ - `page` - returns the page definition for the given path
30
+ - `field` - returns the component definition for the given name
31
+ - `href` - returns the page href for the given page path
32
+ - `answer` - returns the user's answer for a given component
33
+ - `evaluate` - evaluates and returns a Liquid template using the current context
34
+
35
+ ### Examples
36
+
37
+ ```json
38
+ "pages": [
39
+ {
40
+ "title": "What's your name?",
41
+ "path": "/full-name",
42
+ "components": [
43
+ {
44
+ "name": "WmHfSb",
45
+ "title": "What's your full name?",
46
+ "type": "TextField"
47
+ }
48
+ ]
49
+ },
50
+ // This example shows how a component can use an answer to a previous question (What's your full name) in it's title
51
+ {
52
+ "title": "Are you in England?",
53
+ "path": "/are-you-in-england",
54
+ "components": [
55
+ {
56
+ "name": "TKsWbP",
57
+ "title": "Are you in England, {{ WmHfSb }}?",
58
+ "type": "YesNoField"
59
+ }
60
+ ]
61
+ },
62
+ // This example shows how a Html (guidance) component can use the available filters to get the form definition and user answers and display them
63
+ {
64
+ "title": "Template example for {{ WmHfSb }}?",
65
+ "path": "/example",
66
+ "components": [
67
+ {
68
+ "title": "Html",
69
+ "type": "Html",
70
+ "content": "<p class=\"govuk-body\">
71
+ // Use Liquid's `assign` to create a variable that holds reference to the \"/are-you-in-england\" page
72
+ {%- assign inEngland = \"/are-you-in-england\" | page -%}
73
+
74
+ // Use the reference to `evaluate` the title
75
+ {{ inEngland.title | evaluate }}<br>
76
+
77
+ // Use the href filter to display the full page path
78
+ {{ \"/are-you-in-england\" | href }}<br>
79
+
80
+ // Use the `answer` filter to render the user provided answer to a question
81
+ {{ 'TKsWbP' | answer }}
82
+ </p>\n"
83
+ }
84
+ ]
85
+ }
86
+ ]
87
+ ```
@@ -0,0 +1,55 @@
1
+ const { NODE_ENV } = process.env
2
+
3
+ /**
4
+ * Babel config
5
+ * @satisfies {import('@babel/core').TransformOptions}
6
+ */
7
+ module.exports = {
8
+ browserslistEnv: 'node',
9
+ plugins: [
10
+ [
11
+ 'module-resolver',
12
+ {
13
+ root: ['./'],
14
+ alias: {
15
+ '~': '.'
16
+ }
17
+ }
18
+ ],
19
+ '@babel/plugin-syntax-import-attributes'
20
+ ],
21
+ presets: [
22
+ [
23
+ '@babel/preset-env',
24
+ {
25
+ // Apply bug fixes to avoid transforms
26
+ bugfixes: true,
27
+
28
+ // Apply ES module transforms for Jest
29
+ // https://jestjs.io/docs/ecmascript-modules
30
+ modules: NODE_ENV === 'test' ? 'auto' : false
31
+ }
32
+ ],
33
+ [
34
+ '@babel/preset-typescript',
35
+ {
36
+ allowDeclareFields: true
37
+ }
38
+ ]
39
+ ],
40
+ env: {
41
+ test: {
42
+ plugins: [
43
+ [
44
+ 'replace-import-extension',
45
+ {
46
+ extMapping: {
47
+ '.cjs': '',
48
+ '.js': ''
49
+ }
50
+ }
51
+ ]
52
+ ]
53
+ }
54
+ }
55
+ }