@defra/forms-engine-plugin 0.0.3 → 0.0.4

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