@defra/forms-engine-plugin 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/.public/assets/fonts/bold-affa96571d-v2.woff +0 -0
  2. package/.public/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
  3. package/.public/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
  4. package/.public/assets/fonts/light-f591b13f7d-v2.woff +0 -0
  5. package/.public/assets/images/favicon.ico +0 -0
  6. package/.public/assets/images/favicon.svg +1 -0
  7. package/.public/assets/images/govuk-crest.svg +1 -0
  8. package/.public/assets/images/govuk-icon-180.png +0 -0
  9. package/.public/assets/images/govuk-icon-192.png +0 -0
  10. package/.public/assets/images/govuk-icon-512.png +0 -0
  11. package/.public/assets/images/govuk-icon-mask.svg +1 -0
  12. package/.public/assets/images/govuk-opengraph-image.png +0 -0
  13. package/.public/assets/manifest.json +39 -0
  14. package/.public/assets-manifest.json +24 -0
  15. package/.public/javascripts/application.0fd8c18.min.js +3 -0
  16. package/.public/javascripts/application.0fd8c18.min.js.LICENSE.txt +58 -0
  17. package/.public/javascripts/application.0fd8c18.min.js.map +1 -0
  18. package/.public/javascripts/file-upload.b2f18f5.min.js +2 -0
  19. package/.public/javascripts/file-upload.b2f18f5.min.js.map +1 -0
  20. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js +2 -0
  21. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js.map +1 -0
  22. package/.public/stylesheets/application.e340021.min.css +14 -0
  23. package/.public/stylesheets/application.e340021.min.css.map +1 -0
  24. package/.server/server/plugins/nunjucks/environment.js +3 -3
  25. package/.server/server/plugins/nunjucks/environment.js.map +1 -1
  26. package/package.json +6 -2
  27. package/.browserslistrc +0 -16
  28. package/.editorconfig +0 -9
  29. package/.eslintrc.cjs +0 -266
  30. package/.github/dependabot.yml +0 -85
  31. package/.github/workflows/check-pull-request.yml +0 -209
  32. package/.github/workflows/pr-notifier.yml +0 -98
  33. package/.github/workflows/publish.yml +0 -111
  34. package/.husky/pre-commit +0 -1
  35. package/.lintstagedrc.js +0 -4
  36. package/.nvmrc +0 -1
  37. package/.prettierignore +0 -8
  38. package/.prettierrc.cjs +0 -26
  39. package/Dockerfile +0 -61
  40. package/Procfile +0 -1
  41. package/babel.config.cjs +0 -55
  42. package/compose/aws.env +0 -4
  43. package/compose/start-localstack.sh +0 -26
  44. package/docker-compose.yaml +0 -86
  45. package/globals.d.ts +0 -1
  46. package/jest.config.cjs +0 -54
  47. package/jest.environment.js +0 -4
  48. package/jest.setup.cjs +0 -14
  49. package/postcss.config.js +0 -26
  50. package/sonar-project.properties +0 -17
  51. package/src/client/javascripts/application.js +0 -87
  52. package/src/client/javascripts/file-upload.js +0 -386
  53. package/src/client/stylesheets/_code.scss +0 -33
  54. package/src/client/stylesheets/_govuk-frontend.scss +0 -4
  55. package/src/client/stylesheets/_prose.scss +0 -56
  56. package/src/client/stylesheets/_service-banner.scss +0 -24
  57. package/src/client/stylesheets/_summary-list.scss +0 -28
  58. package/src/client/stylesheets/_tag-env.scss +0 -24
  59. package/src/client/stylesheets/application.scss +0 -14
  60. package/src/common/cookies.js +0 -58
  61. package/src/common/cookies.test.js +0 -23
  62. package/src/common/types.js +0 -5
  63. package/src/config/index.ts +0 -271
  64. package/src/index.ts +0 -31
  65. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  66. package/src/server/common/helpers/logging/logger-options.ts +0 -46
  67. package/src/server/common/helpers/logging/logger.ts +0 -7
  68. package/src/server/common/helpers/logging/request-logger.ts +0 -9
  69. package/src/server/common/helpers/logging/request-tracing.js +0 -10
  70. package/src/server/common/helpers/redis-client.js +0 -70
  71. package/src/server/constants.js +0 -1
  72. package/src/server/forms/README.md +0 -10
  73. package/src/server/forms/components.json +0 -1015
  74. package/src/server/forms/report-a-terrorist.json +0 -270
  75. package/src/server/forms/runner-components-test.json +0 -365
  76. package/src/server/forms/test.json +0 -581
  77. package/src/server/index.test.ts +0 -582
  78. package/src/server/index.ts +0 -140
  79. package/src/server/plugins/blankie.test.ts +0 -73
  80. package/src/server/plugins/blankie.ts +0 -48
  81. package/src/server/plugins/crumb.ts +0 -20
  82. package/src/server/plugins/engine/README.md +0 -87
  83. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -294
  84. package/src/server/plugins/engine/components/AutocompleteField.ts +0 -49
  85. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -379
  86. package/src/server/plugins/engine/components/CheckboxesField.ts +0 -106
  87. package/src/server/plugins/engine/components/ComponentBase.ts +0 -97
  88. package/src/server/plugins/engine/components/ComponentCollection.ts +0 -278
  89. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -822
  90. package/src/server/plugins/engine/components/DatePartsField.ts +0 -264
  91. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  92. package/src/server/plugins/engine/components/Details.ts +0 -30
  93. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -395
  94. package/src/server/plugins/engine/components/EmailAddressField.ts +0 -55
  95. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -778
  96. package/src/server/plugins/engine/components/FileUploadField.ts +0 -262
  97. package/src/server/plugins/engine/components/FormComponent.ts +0 -249
  98. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  99. package/src/server/plugins/engine/components/Html.ts +0 -29
  100. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  101. package/src/server/plugins/engine/components/InsetText.ts +0 -27
  102. package/src/server/plugins/engine/components/List.test.ts +0 -76
  103. package/src/server/plugins/engine/components/List.ts +0 -72
  104. package/src/server/plugins/engine/components/ListFormComponent.ts +0 -140
  105. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -567
  106. package/src/server/plugins/engine/components/MonthYearField.ts +0 -222
  107. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -558
  108. package/src/server/plugins/engine/components/MultilineTextField.ts +0 -138
  109. package/src/server/plugins/engine/components/NumberField.test.ts +0 -701
  110. package/src/server/plugins/engine/components/NumberField.ts +0 -163
  111. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -288
  112. package/src/server/plugins/engine/components/RadiosField.ts +0 -24
  113. package/src/server/plugins/engine/components/SelectField.test.ts +0 -288
  114. package/src/server/plugins/engine/components/SelectField.ts +0 -47
  115. package/src/server/plugins/engine/components/SelectionControlField.ts +0 -43
  116. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -356
  117. package/src/server/plugins/engine/components/TelephoneNumberField.ts +0 -67
  118. package/src/server/plugins/engine/components/TextField.test.ts +0 -489
  119. package/src/server/plugins/engine/components/TextField.ts +0 -96
  120. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -623
  121. package/src/server/plugins/engine/components/UkAddressField.ts +0 -172
  122. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -248
  123. package/src/server/plugins/engine/components/YesNoField.ts +0 -31
  124. package/src/server/plugins/engine/components/constants.ts +0 -1
  125. package/src/server/plugins/engine/components/helpers.ts +0 -330
  126. package/src/server/plugins/engine/components/index.ts +0 -24
  127. package/src/server/plugins/engine/components/types.ts +0 -117
  128. package/src/server/plugins/engine/configureEnginePlugin.ts +0 -47
  129. package/src/server/plugins/engine/helpers.test.ts +0 -791
  130. package/src/server/plugins/engine/helpers.ts +0 -379
  131. package/src/server/plugins/engine/index.ts +0 -7
  132. package/src/server/plugins/engine/models/FormModel.test.ts +0 -42
  133. package/src/server/plugins/engine/models/FormModel.ts +0 -443
  134. package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
  135. package/src/server/plugins/engine/models/Section.ts +0 -0
  136. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -209
  137. package/src/server/plugins/engine/models/SummaryViewModel.ts +0 -220
  138. package/src/server/plugins/engine/models/index.ts +0 -2
  139. package/src/server/plugins/engine/models/types.ts +0 -114
  140. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -143
  141. package/src/server/plugins/engine/outputFormatters/human/v1.ts +0 -73
  142. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  143. package/src/server/plugins/engine/outputFormatters/index.ts +0 -44
  144. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -229
  145. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +0 -140
  146. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -229
  147. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +0 -153
  148. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1108
  149. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +0 -446
  150. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -205
  151. package/src/server/plugins/engine/pageControllers/PageController.ts +0 -176
  152. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1264
  153. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +0 -561
  154. package/src/server/plugins/engine/pageControllers/README.md +0 -28
  155. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -264
  156. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +0 -458
  157. package/src/server/plugins/engine/pageControllers/StartPageController.ts +0 -18
  158. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +0 -50
  159. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +0 -261
  160. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -28
  161. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +0 -19
  162. package/src/server/plugins/engine/pageControllers/helpers.test.ts +0 -198
  163. package/src/server/plugins/engine/pageControllers/helpers.ts +0 -101
  164. package/src/server/plugins/engine/pageControllers/index.ts +0 -10
  165. package/src/server/plugins/engine/pageControllers/validationOptions.ts +0 -89
  166. package/src/server/plugins/engine/plugin.ts +0 -673
  167. package/src/server/plugins/engine/services/formSubmissionService.js +0 -46
  168. package/src/server/plugins/engine/services/formsService.js +0 -46
  169. package/src/server/plugins/engine/services/formsService.test.js +0 -90
  170. package/src/server/plugins/engine/services/index.js +0 -3
  171. package/src/server/plugins/engine/services/notifyService.test.ts +0 -132
  172. package/src/server/plugins/engine/services/notifyService.ts +0 -64
  173. package/src/server/plugins/engine/services/uploadService.js +0 -60
  174. package/src/server/plugins/engine/types.ts +0 -315
  175. package/src/server/plugins/engine/views/components/autocompletefield.html +0 -5
  176. package/src/server/plugins/engine/views/components/checkboxesfield.html +0 -5
  177. package/src/server/plugins/engine/views/components/datepartsfield.html +0 -5
  178. package/src/server/plugins/engine/views/components/details.html +0 -6
  179. package/src/server/plugins/engine/views/components/emailaddressfield.html +0 -5
  180. package/src/server/plugins/engine/views/components/fileuploadfield-key.html +0 -8
  181. package/src/server/plugins/engine/views/components/fileuploadfield-value.html +0 -3
  182. package/src/server/plugins/engine/views/components/fileuploadfield.html +0 -24
  183. package/src/server/plugins/engine/views/components/html.html +0 -3
  184. package/src/server/plugins/engine/views/components/insettext.html +0 -7
  185. package/src/server/plugins/engine/views/components/list.html +0 -36
  186. package/src/server/plugins/engine/views/components/monthyearfield.html +0 -5
  187. package/src/server/plugins/engine/views/components/multilinetextfield.html +0 -10
  188. package/src/server/plugins/engine/views/components/numberfield.html +0 -5
  189. package/src/server/plugins/engine/views/components/radiosfield.html +0 -5
  190. package/src/server/plugins/engine/views/components/selectfield.html +0 -5
  191. package/src/server/plugins/engine/views/components/telephonenumberfield.html +0 -5
  192. package/src/server/plugins/engine/views/components/textfield.html +0 -5
  193. package/src/server/plugins/engine/views/components/ukaddressfield.html +0 -25
  194. package/src/server/plugins/engine/views/components/yesnofield.html +0 -5
  195. package/src/server/plugins/engine/views/file-upload.html +0 -45
  196. package/src/server/plugins/engine/views/index.html +0 -39
  197. package/src/server/plugins/engine/views/item-delete.html +0 -56
  198. package/src/server/plugins/engine/views/partials/components.html +0 -6
  199. package/src/server/plugins/engine/views/partials/conditional-components.html +0 -3
  200. package/src/server/plugins/engine/views/partials/debug.html +0 -44
  201. package/src/server/plugins/engine/views/partials/form.html +0 -15
  202. package/src/server/plugins/engine/views/partials/heading.html +0 -16
  203. package/src/server/plugins/engine/views/partials/preview-banner.html +0 -32
  204. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  205. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +0 -10
  206. package/src/server/plugins/engine/views/repeat-list-summary.html +0 -53
  207. package/src/server/plugins/errorPages.ts +0 -58
  208. package/src/server/plugins/nunjucks/context.js +0 -88
  209. package/src/server/plugins/nunjucks/context.test.js +0 -142
  210. package/src/server/plugins/nunjucks/enviroment.test.js +0 -201
  211. package/src/server/plugins/nunjucks/environment.js +0 -116
  212. package/src/server/plugins/nunjucks/filters/answer.js +0 -27
  213. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -89
  214. package/src/server/plugins/nunjucks/filters/evaluate.js +0 -21
  215. package/src/server/plugins/nunjucks/filters/field.js +0 -28
  216. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  217. package/src/server/plugins/nunjucks/filters/highlight.js +0 -11
  218. package/src/server/plugins/nunjucks/filters/href.js +0 -30
  219. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  220. package/src/server/plugins/nunjucks/filters/index.js +0 -8
  221. package/src/server/plugins/nunjucks/filters/inspect.js +0 -15
  222. package/src/server/plugins/nunjucks/filters/page.js +0 -24
  223. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  224. package/src/server/plugins/nunjucks/index.js +0 -3
  225. package/src/server/plugins/nunjucks/plugin.js +0 -40
  226. package/src/server/plugins/nunjucks/render.js +0 -42
  227. package/src/server/plugins/nunjucks/types.js +0 -40
  228. package/src/server/plugins/pulse.ts +0 -11
  229. package/src/server/plugins/router.ts +0 -201
  230. package/src/server/plugins/session.ts +0 -28
  231. package/src/server/routes/health.js +0 -13
  232. package/src/server/routes/health.test.js +0 -35
  233. package/src/server/routes/index.test.ts +0 -125
  234. package/src/server/routes/index.ts +0 -2
  235. package/src/server/routes/public.ts +0 -47
  236. package/src/server/routes/types.ts +0 -48
  237. package/src/server/schemas/index.ts +0 -34
  238. package/src/server/secure-context.js +0 -43
  239. package/src/server/services/cacheService.test.ts +0 -276
  240. package/src/server/services/cacheService.ts +0 -131
  241. package/src/server/services/httpService.test.js +0 -491
  242. package/src/server/services/httpService.ts +0 -50
  243. package/src/server/services/index.ts +0 -1
  244. package/src/server/types.ts +0 -54
  245. package/src/server/utils/notify.test.ts +0 -37
  246. package/src/server/utils/notify.ts +0 -50
  247. package/src/server/utils/secure-context/get-trust-store-certs.js +0 -11
  248. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  249. package/src/server/utils/utils.js +0 -24
  250. package/src/server/utils/utils.test.js +0 -54
  251. package/src/server/views/404.html +0 -16
  252. package/src/server/views/500.html +0 -19
  253. package/src/server/views/components/debug/macro.njk +0 -3
  254. package/src/server/views/components/debug/template.njk +0 -13
  255. package/src/server/views/components/service-banner/macro.njk +0 -3
  256. package/src/server/views/components/service-banner/template.njk +0 -20
  257. package/src/server/views/components/service-banner/template.test.js +0 -43
  258. package/src/server/views/components/tag-env/macro.njk +0 -3
  259. package/src/server/views/components/tag-env/template.njk +0 -30
  260. package/src/server/views/components/tag-env/template.test.js +0 -66
  261. package/src/server/views/confirmation.html +0 -19
  262. package/src/server/views/help/accessibility-statement.html +0 -58
  263. package/src/server/views/help/cookie-preferences.html +0 -57
  264. package/src/server/views/help/cookies.html +0 -71
  265. package/src/server/views/help/get-support.html +0 -37
  266. package/src/server/views/help/privacy-notice.html +0 -68
  267. package/src/server/views/help/terms-and-conditions.html +0 -83
  268. package/src/server/views/layout.html +0 -199
  269. package/src/server/views/summary.html +0 -50
  270. package/src/typings/hapi/index.d.ts +0 -95
  271. package/src/typings/hapi-tracing/index.d.ts +0 -6
  272. package/src/typings/index.d.ts +0 -3
  273. package/src/typings/joi/index.d.ts +0 -22
  274. package/stylelint.config.js +0 -10
  275. package/test/client/javascripts/file-upload.test.js +0 -1197
  276. package/test/condition/checkboxes.test.js +0 -112
  277. package/test/condition/radios.test.js +0 -112
  278. package/test/condition/text.test.js +0 -103
  279. package/test/fixtures/assets-manifest.json +0 -4
  280. package/test/fixtures/form.js +0 -86
  281. package/test/fixtures/index.js +0 -2
  282. package/test/fixtures/list.js +0 -92
  283. package/test/form/cookies.test.js +0 -338
  284. package/test/form/csrf.test.js +0 -87
  285. package/test/form/definitions/basic.js +0 -101
  286. package/test/form/definitions/blank.js +0 -10
  287. package/test/form/definitions/checkboxes.json +0 -88
  288. package/test/form/definitions/components.json +0 -452
  289. package/test/form/definitions/conditional-reveal.js +0 -140
  290. package/test/form/definitions/conditions-basic.js +0 -187
  291. package/test/form/definitions/conditions-complex.js +0 -338
  292. package/test/form/definitions/conditions-dates.js +0 -78
  293. package/test/form/definitions/conditions-escaping.js +0 -143
  294. package/test/form/definitions/demo-cph-number.js +0 -3099
  295. package/test/form/definitions/feedback.json +0 -45
  296. package/test/form/definitions/fields-optional.js +0 -402
  297. package/test/form/definitions/fields-required.js +0 -402
  298. package/test/form/definitions/file-upload-basic.js +0 -44
  299. package/test/form/definitions/file-upload.js +0 -66
  300. package/test/form/definitions/minimal.js +0 -39
  301. package/test/form/definitions/phase-alpha.json +0 -33
  302. package/test/form/definitions/phase-default.json +0 -26
  303. package/test/form/definitions/radios.json +0 -88
  304. package/test/form/definitions/repeat-mixed.js +0 -54
  305. package/test/form/definitions/repeat.js +0 -70
  306. package/test/form/definitions/status.json +0 -126
  307. package/test/form/definitions/templates.js +0 -183
  308. package/test/form/definitions/test.json +0 -581
  309. package/test/form/definitions/text.json +0 -75
  310. package/test/form/definitions/titles.json +0 -170
  311. package/test/form/definitions.test.js +0 -47
  312. package/test/form/exit-page.test.js +0 -210
  313. package/test/form/feedback.test.js +0 -68
  314. package/test/form/fields-optional.test.js +0 -237
  315. package/test/form/fields-required.test.js +0 -294
  316. package/test/form/file-upload.test.js +0 -313
  317. package/test/form/govuk-notify.test.js +0 -449
  318. package/test/form/journey-basic.test.js +0 -444
  319. package/test/form/persist-files.test.js +0 -227
  320. package/test/form/phase-banner.test.js +0 -71
  321. package/test/form/repeat.test.js +0 -628
  322. package/test/form/summary-submission-email.test.js +0 -95
  323. package/test/form/template.test.js +0 -288
  324. package/test/form/titles.test.js +0 -204
  325. package/test/helpers/component-helpers.js +0 -74
  326. package/test/utils/get-cookie.js +0 -42
  327. package/test/utils/get-form-definitions.js +0 -18
  328. package/tmp.pdf +0 -1
  329. package/tsconfig.json +0 -28
  330. package/webpack.config.js +0 -208
@@ -1,89 +0,0 @@
1
- import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
2
- import { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'
3
-
4
- jest.mock('~/src/server/plugins/engine/components/helpers.ts', () => ({
5
- getAnswer: jest.fn()
6
- }))
7
-
8
- describe('answer Nunjucks filter', () => {
9
- /** @type { NunjucksContext } */
10
- let mockThis
11
-
12
- beforeEach(() => {
13
- jest.clearAllMocks()
14
-
15
- mockThis = /** @type {NunjucksContext} */ (
16
- /** @type {unknown} */ ({
17
- ctx: {
18
- context: {
19
- componentMap: new Map(),
20
- relevantState: { someState: 'value' }
21
- }
22
- }
23
- })
24
- )
25
-
26
- jest.mocked(getAnswer).mockReturnValue('test answer')
27
- })
28
-
29
- describe('missing context', () => {
30
- it('returns undefined', () => {
31
- mockThis.ctx.context = undefined
32
-
33
- const result = answer.call(mockThis, 'componentName')
34
-
35
- expect(result).toBeUndefined()
36
- expect(getAnswer).not.toHaveBeenCalled()
37
- })
38
- })
39
-
40
- describe('component lookup', () => {
41
- it('returns undefined for non-existent component', () => {
42
- const result = answer.call(mockThis, 'nonExistentComponent')
43
-
44
- expect(result).toBeUndefined()
45
- expect(getAnswer).not.toHaveBeenCalled()
46
- })
47
- })
48
-
49
- describe('non-form component', () => {
50
- it('returns undefined', () => {
51
- mockThis.ctx.context?.componentMap.set(
52
- 'nonFormComponent',
53
- // @ts-expect-error - simplified mock component for testing
54
- { isFormComponent: false }
55
- )
56
-
57
- const result = answer.call(mockThis, 'nonFormComponent')
58
-
59
- expect(result).toBeUndefined()
60
- expect(getAnswer).not.toHaveBeenCalled()
61
- })
62
- })
63
-
64
- describe('valid form component', () => {
65
- it('returns the answer', () => {
66
- const mockFormComponent = {
67
- isFormComponent: true,
68
- someProperty: 'value'
69
- }
70
- mockThis.ctx.context?.componentMap.set(
71
- 'validFormComponent',
72
- // @ts-expect-error - simplified mock component for testing
73
- mockFormComponent
74
- )
75
-
76
- const result = answer.call(mockThis, 'validFormComponent')
77
-
78
- expect(getAnswer).toHaveBeenCalledWith(
79
- mockFormComponent,
80
- mockThis.ctx.context?.relevantState
81
- )
82
- expect(result).toBe('test answer')
83
- })
84
- })
85
- })
86
-
87
- /**
88
- * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
89
- */
@@ -1,21 +0,0 @@
1
- import { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'
2
-
3
- /**
4
- * Nunjucks filter to evaluate a liquid template.
5
- * Currently just used in `src/server/views/layout.html#LN37` for the pageTitle
6
- * @this {NunjucksContext}
7
- * @param {string} template
8
- */
9
- export function evaluate(template) {
10
- const { context } = this.ctx
11
-
12
- if (!context || typeof template !== 'string') {
13
- return template
14
- }
15
-
16
- return evaluateTemplate(template, context)
17
- }
18
-
19
- /**
20
- * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
21
- */
@@ -1,28 +0,0 @@
1
- /**
2
- * Nunjucks filter to get the answer for a component
3
- * @this {NunjucksContext}
4
- * @param {string} name - The name of the component
5
- */
6
- export function field(name) {
7
- if (typeof name !== 'string') {
8
- return undefined
9
- }
10
-
11
- const { context } = this.ctx
12
-
13
- if (!context) {
14
- return undefined
15
- }
16
-
17
- const component = context.componentMap.get(name)
18
-
19
- if (!component?.isFormComponent) {
20
- return undefined
21
- }
22
-
23
- return component
24
- }
25
-
26
- /**
27
- * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
28
- */
@@ -1,75 +0,0 @@
1
- import { field } from '~/src/server/plugins/nunjucks/filters/field.js'
2
-
3
- describe('field Nunjucks filter', () => {
4
- /** @type {NunjucksContext} */
5
- let mockThis
6
-
7
- beforeEach(() => {
8
- mockThis = /** @type {NunjucksContext} */ (
9
- /** @type {unknown} */ ({
10
- ctx: {
11
- context: {
12
- componentMap: new Map()
13
- }
14
- }
15
- })
16
- )
17
- })
18
-
19
- describe('invalid inputs', () => {
20
- it('returns undefined for non-string name parameter', () => {
21
- // @ts-expect-error - testing invalid input
22
- const result = field.call(mockThis, 123)
23
- expect(result).toBeUndefined()
24
- })
25
- })
26
-
27
- describe('missing context', () => {
28
- it('returns undefined', () => {
29
- mockThis.ctx.context = undefined
30
- const result = field.call(mockThis, 'componentName')
31
- expect(result).toBeUndefined()
32
- })
33
- })
34
-
35
- describe('component lookup', () => {
36
- it('returns undefined for non-existent component', () => {
37
- const result = field.call(mockThis, 'nonExistentComponent')
38
- expect(result).toBeUndefined()
39
- })
40
- })
41
-
42
- describe('non-form component', () => {
43
- it('returns undefined', () => {
44
- mockThis.ctx.context?.componentMap.set(
45
- 'nonFormComponent',
46
- // @ts-expect-error - simplified mock component for testing
47
- { isFormComponent: false }
48
- )
49
-
50
- const result = field.call(mockThis, 'nonFormComponent')
51
- expect(result).toBeUndefined()
52
- })
53
- })
54
-
55
- describe('valid form component', () => {
56
- it('returns the component', () => {
57
- const mockFormComponent = {
58
- isFormComponent: true,
59
- someProperty: 'value'
60
- }
61
- mockThis.ctx.context?.componentMap.set(
62
- 'validFormComponent',
63
- // @ts-expect-error - simplified mock component for testing
64
- mockFormComponent
65
- )
66
-
67
- const result = field.call(mockThis, 'validFormComponent')
68
- expect(result).toBe(mockFormComponent)
69
- })
70
- })
71
- })
72
-
73
- /**
74
- * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
75
- */
@@ -1,11 +0,0 @@
1
- import hljs from 'highlight.js'
2
-
3
- /**
4
- * Format code with syntax highlighting
5
- * @param {string} code - Code in plain text
6
- * @param {string} [language] - Code programming language
7
- * @returns {string} Code with syntax highlighting
8
- */
9
- export function highlight(code, language) {
10
- return hljs.highlight(code, { language: language ?? 'plaintext' }).value
11
- }
@@ -1,30 +0,0 @@
1
- import { getPageHref } from '~/src/server/plugins/engine/index.js'
2
-
3
- /**
4
- * Nunjucks filter to get the answer for a component
5
- * @this {NunjucksContext}
6
- * @param {string} path - The name of the component
7
- */
8
- export function href(path) {
9
- if (typeof path !== 'string') {
10
- return undefined
11
- }
12
-
13
- const { context } = this.ctx
14
-
15
- if (!context) {
16
- return undefined
17
- }
18
-
19
- const page = context.pageMap.get(path)
20
-
21
- if (page === undefined) {
22
- return undefined
23
- }
24
-
25
- return getPageHref(page)
26
- }
27
-
28
- /**
29
- * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
30
- */
@@ -1,80 +0,0 @@
1
- import { getPageHref } from '~/src/server/plugins/engine/index.js'
2
- import { href } from '~/src/server/plugins/nunjucks/filters/href.js'
3
-
4
- jest.mock('~/src/server/plugins/engine/index.ts', () => ({
5
- getPageHref: jest.fn()
6
- }))
7
-
8
- describe('href Nunjucks filter', () => {
9
- /** @type { NunjucksContext } */
10
- let mockThis
11
-
12
- beforeEach(() => {
13
- jest.clearAllMocks()
14
-
15
- mockThis = /** @type {NunjucksContext} */ (
16
- /** @type {unknown} */ ({
17
- ctx: {
18
- context: {
19
- pageMap: new Map()
20
- }
21
- }
22
- })
23
- )
24
-
25
- jest.mocked(getPageHref).mockReturnValue('/some-page')
26
- })
27
-
28
- describe('invalid inputs', () => {
29
- it('returns undefined for non-string path parameter', () => {
30
- // @ts-expect-error - testing invalid input
31
- const result = href.call(mockThis, 123)
32
-
33
- expect(result).toBeUndefined()
34
- expect(getPageHref).not.toHaveBeenCalled()
35
- })
36
- })
37
-
38
- describe('missing context', () => {
39
- it('returns undefined', () => {
40
- mockThis.ctx.context = undefined
41
-
42
- const result = href.call(mockThis, 'pagePath')
43
-
44
- expect(result).toBeUndefined()
45
- expect(getPageHref).not.toHaveBeenCalled()
46
- })
47
- })
48
-
49
- describe('page lookup', () => {
50
- it('returns undefined for non-existent page', () => {
51
- const result = href.call(mockThis, 'nonExistentPage')
52
-
53
- expect(result).toBeUndefined()
54
- expect(getPageHref).not.toHaveBeenCalled()
55
- })
56
- })
57
-
58
- describe('valid page', () => {
59
- it('returns the href for the page', () => {
60
- const mockPage = {
61
- path: '/some-page',
62
- someProperty: 'value'
63
- }
64
- mockThis.ctx.context?.pageMap.set(
65
- 'validPage',
66
- // @ts-expect-error - simplified mock page for testing
67
- mockPage
68
- )
69
-
70
- const result = href.call(mockThis, 'validPage')
71
-
72
- expect(getPageHref).toHaveBeenCalledWith(mockPage)
73
- expect(result).toBe('/some-page')
74
- })
75
- })
76
- })
77
-
78
- /**
79
- * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
80
- */
@@ -1,8 +0,0 @@
1
- export { markdownToHtml as markdown } from '@defra/forms-model'
2
- export { highlight } from '~/src/server/plugins/nunjucks/filters/highlight.js'
3
- export { inspect } from '~/src/server/plugins/nunjucks/filters/inspect.js'
4
- export { evaluate } from '~/src/server/plugins/nunjucks/filters/evaluate.js'
5
- export { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'
6
- export { href } from '~/src/server/plugins/nunjucks/filters/href.js'
7
- export { field } from '~/src/server/plugins/nunjucks/filters/field.js'
8
- export { page } from '~/src/server/plugins/nunjucks/filters/page.js'
@@ -1,15 +0,0 @@
1
- import util from 'util'
2
-
3
- /**
4
- * Format JavaScript objects as strings
5
- * @param {unknown} object - JavaScript object to format
6
- * @returns {string} Formatted string
7
- */
8
- export function inspect(object) {
9
- return util.inspect(object, {
10
- compact: false,
11
- depth: Infinity,
12
- maxArrayLength: Infinity,
13
- maxStringLength: Infinity
14
- })
15
- }
@@ -1,24 +0,0 @@
1
- /**
2
- * Nunjucks filter to get the page for a given path
3
- * @this {NunjucksContext}
4
- * @param {string} path - The path of the page
5
- */
6
- export function page(path) {
7
- if (typeof path !== 'string') {
8
- return undefined
9
- }
10
-
11
- const { context } = this.ctx
12
-
13
- if (!context) {
14
- return undefined
15
- }
16
-
17
- const foundPage = context.pageMap.get(path)
18
-
19
- return foundPage
20
- }
21
-
22
- /**
23
- * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
24
- */
@@ -1,65 +0,0 @@
1
- import { page } from '~/src/server/plugins/nunjucks/filters/page.js'
2
-
3
- describe('page Nunjucks filter', () => {
4
- /** @type { NunjucksContext } */
5
- let mockThis
6
-
7
- beforeEach(() => {
8
- mockThis = /** @type {NunjucksContext} */ (
9
- /** @type {unknown} */ ({
10
- ctx: {
11
- context: {
12
- pageMap: new Map()
13
- }
14
- }
15
- })
16
- )
17
- })
18
-
19
- describe('invalid inputs', () => {
20
- it('returns undefined for non-string path parameter', () => {
21
- // @ts-expect-error - testing invalid input
22
- const result = page.call(mockThis, 123)
23
-
24
- expect(result).toBeUndefined()
25
- })
26
- })
27
-
28
- describe('missing context', () => {
29
- it('returns undefined', () => {
30
- mockThis.ctx.context = undefined
31
-
32
- const result = page.call(mockThis, 'pagePath')
33
-
34
- expect(result).toBeUndefined()
35
- })
36
- })
37
-
38
- describe('page lookup', () => {
39
- it('returns undefined for non-existent page', () => {
40
- const result = page.call(mockThis, 'nonExistentPage')
41
-
42
- expect(result).toBeUndefined()
43
- })
44
-
45
- it('returns the page when found', () => {
46
- const mockPage = {
47
- path: '/some-page',
48
- someProperty: 'value'
49
- }
50
- mockThis.ctx.context?.pageMap.set(
51
- 'validPage',
52
- // @ts-expect-error - simplified mock page for testing
53
- mockPage
54
- )
55
-
56
- const result = page.call(mockThis, 'validPage')
57
-
58
- expect(result).toBe(mockPage)
59
- })
60
- })
61
- })
62
-
63
- /**
64
- * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
65
- */
@@ -1,3 +0,0 @@
1
- export * as render from '~/src/server/plugins/nunjucks/render.js'
2
- export { environment } from '~/src/server/plugins/nunjucks/environment.js'
3
- export { plugin } from '~/src/server/plugins/nunjucks/plugin.js'
@@ -1,40 +0,0 @@
1
- import vision from '@hapi/vision'
2
- import nunjucks from 'nunjucks'
3
-
4
- import { config } from '~/src/config/index.js'
5
- import { context } from '~/src/server/plugins/nunjucks/context.js'
6
- import {
7
- environment,
8
- paths
9
- } from '~/src/server/plugins/nunjucks/environment.js'
10
-
11
- /**
12
- * @type {ServerRegisterPluginObject<ServerViewsConfiguration>}
13
- */
14
- export const plugin = {
15
- plugin: vision,
16
- options: {
17
- engines: {
18
- html: {
19
- /**
20
- * @param {string} path
21
- * @param {{ environment: typeof environment }} compileOptions
22
- * @returns {(options: ReturnType<Awaited<typeof context>>) => string}
23
- */
24
- compile(path, compileOptions) {
25
- return (options) =>
26
- nunjucks.compile(path, compileOptions.environment).render(options)
27
- }
28
- }
29
- },
30
- path: paths,
31
- compileOptions: { environment },
32
- isCached: config.get('isProduction'),
33
- context
34
- }
35
- }
36
-
37
- /**
38
- * @import { ServerRegisterPluginObject } from '@hapi/hapi'
39
- * @import { ServerViewsConfiguration } from '@hapi/vision'
40
- */
@@ -1,42 +0,0 @@
1
- import { environment } from '~/src/server/plugins/nunjucks/environment.js'
2
-
3
- /**
4
- * Render Nunjucks macro
5
- * @param {string} macroName
6
- * @param {string} macroPath
7
- * @param {RenderOptions & MacroOptions} [options]
8
- */
9
- export function macro(macroName, macroPath, options) {
10
- const macroParams = JSON.stringify(options?.params, undefined, 2)
11
- let macroString = `{%- from "${macroPath}" import ${macroName} -%}`
12
-
13
- if (options?.callBlock) {
14
- macroString += `{%- call ${macroName}(${macroParams}) -%}${options.callBlock}{%- endcall -%}`
15
- } else {
16
- macroString += `{{- ${macroName}(${macroParams}) -}}`
17
- }
18
-
19
- return string(macroString, options)
20
- }
21
-
22
- /**
23
- * Render Nunjucks code
24
- * @param {string} viewString - Nunjucks string to render
25
- * @param {RenderOptions} [options]
26
- */
27
- export function string(viewString, options) {
28
- return environment.renderString(viewString, options?.context ?? {})
29
- }
30
-
31
- /**
32
- * Render Nunjucks view
33
- * @param {string} viewPath
34
- * @param {RenderOptions} [options]
35
- */
36
- export function view(viewPath, options) {
37
- return environment.render(viewPath, options?.context)
38
- }
39
-
40
- /**
41
- * @import { MacroOptions, RenderOptions } from '~/src/server/plugins/nunjucks/types.js'
42
- */
@@ -1,40 +0,0 @@
1
- /**
2
- * @typedef {object} MacroOptions
3
- * @property {string} [callBlock] - Nunjucks call block content
4
- * @property {object} [params] - Nunjucks macro params
5
- */
6
-
7
- /**
8
- * @typedef {object} RenderOptions
9
- * @property {object} [context] - Nunjucks render context
10
- */
11
-
12
- /**
13
- * @typedef {object} ViewContext - Nunjucks view context
14
- * @property {string} appVersion - Application version
15
- * @property {string} assetPath - Asset path
16
- * @property {Partial<Config>} config - Application config properties
17
- * @property {CookieConsent} [cookieConsent] - Cookie consent preferences
18
- * @property {string} [crumb] - Cross-Site Request Forgery (CSRF) token
19
- * @property {string} [cspNonce] - Content Security Policy (CSP) nonce
20
- * @property {string} [currentPath] - Current path
21
- * @property {string} [previewMode] - Preview mode
22
- * @property {string} [slug] - Form slug
23
- * @property {(asset?: string) => string} getAssetPath - Asset path resolver
24
- * @property {FormContext} [context] - the current form context
25
- */
26
-
27
- /**
28
- * @typedef {ReturnType<typeof config['getProperties']>} Config - Application config properties
29
- */
30
-
31
- /**
32
- * @typedef NunjucksContext
33
- * @property {ViewContext} ctx - the current nunjucks view context
34
- */
35
-
36
- /**
37
- * @import { CookieConsent } from '~/src/common/types.js'
38
- * @import { config } from '~/src/config/index.js'
39
- * @import { FormContext } from '~/src/server/plugins/engine/types.js'
40
- */
@@ -1,11 +0,0 @@
1
- import { type ServerRegisterPluginObject } from '@hapi/hapi'
2
- import pulse from 'hapi-pulse'
3
-
4
- export default {
5
- plugin: pulse,
6
- options: {
7
- timeout: 800
8
- }
9
- } satisfies ServerRegisterPluginObject<{
10
- timeout: number
11
- }>