@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
@@ -21,7 +21,7 @@ for (const [name, nunjucksFilter] of Object.entries(filters)) {
21
21
  * @this {NunjucksContext}
22
22
  * @param {FormSubmissionError[]} errors
23
23
  */
24
- function checkErrorTemplates(errors) {
24
+ export function checkErrorTemplates(errors) {
25
25
  const {
26
26
  context
27
27
  } = this.ctx;
@@ -39,7 +39,7 @@ environment.addGlobal('checkErrorTemplates', checkErrorTemplates);
39
39
  * @this {NunjucksContext}
40
40
  * @param {ComponentViewModel} component
41
41
  */
42
- function checkComponentTemplates(component) {
42
+ export function checkComponentTemplates(component) {
43
43
  const {
44
44
  context
45
45
  } = this.ctx;
@@ -79,7 +79,7 @@ environment.addGlobal('checkComponentTemplates', checkComponentTemplates);
79
79
  * @this {NunjucksContext}
80
80
  * @param {string} template
81
81
  */
82
- function evaluate(template) {
82
+ export function evaluate(template) {
83
83
  const {
84
84
  context
85
85
  } = this.ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nfunction checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nfunction checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nfunction evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "main": ".server/server/plugins/engine/index.js",
7
+ "files": [
8
+ ".server",
9
+ ".public"
10
+ ],
7
11
  "scripts": {
8
12
  "build": "npm run build:server && npm run build:client",
9
13
  "build:client": "NODE_ENV=${NODE_ENV:-production} webpack",
@@ -78,6 +82,7 @@
78
82
  "lodash": "^4.17.21",
79
83
  "marked": "^15.0.6",
80
84
  "nunjucks": "^3.2.3",
85
+ "outdent": "^0.8.0",
81
86
  "pino": "^9.6.0",
82
87
  "pino-pretty": "^13.0.0",
83
88
  "proxy-agent": "^6.5.0",
@@ -142,7 +147,6 @@
142
147
  "jest-extended": "^4.0.2",
143
148
  "jsdom": "^25.0.1",
144
149
  "lint-staged": "^15.3.0",
145
- "outdent": "^0.8.0",
146
150
  "postcss": "^8.4.49",
147
151
  "postcss-load-config": "^6.0.1",
148
152
  "postcss-loader": "^8.1.1",
package/.browserslistrc DELETED
@@ -1,16 +0,0 @@
1
- [javascripts]
2
- supports es6-module
3
-
4
- [stylesheets]
5
- > 0.1% in GB and not dead
6
- last 6 Chrome versions
7
- last 6 Firefox versions
8
- last 6 Edge versions
9
- last 2 Samsung versions
10
- Firefox ESR
11
- Safari >= 11
12
- iOS >= 11
13
- ie 11
14
-
15
- [node]
16
- node 22
package/.editorconfig DELETED
@@ -1,9 +0,0 @@
1
- root = true
2
-
3
- [*]
4
- charset = utf-8
5
- indent_style = space
6
- indent_size = 2
7
- end_of_line = lf
8
- insert_final_newline = true
9
- trim_trailing_whitespace = true
package/.eslintrc.cjs DELETED
@@ -1,266 +0,0 @@
1
- /**
2
- * ESLint config
3
- * @type {import('eslint').ESLint.ConfigData}
4
- */
5
- module.exports = {
6
- ignorePatterns: ['.public', '.server', 'coverage'],
7
- overrides: [
8
- {
9
- extends: [
10
- 'standard',
11
- 'eslint:recommended',
12
- 'plugin:import/recommended',
13
- 'plugin:import/typescript',
14
- 'plugin:jsdoc/recommended',
15
- 'plugin:n/recommended',
16
- 'plugin:promise/recommended',
17
- 'plugin:@typescript-eslint/strict-type-checked',
18
- 'plugin:@typescript-eslint/stylistic-type-checked',
19
- 'prettier'
20
- ],
21
- files: ['**/*.{cjs,js,mjs,ts}'],
22
- parser: '@typescript-eslint/parser',
23
- parserOptions: {
24
- ecmaVersion: 'latest',
25
- projectService: true,
26
- tsconfigRootDir: __dirname
27
- },
28
- plugins: ['@typescript-eslint', 'import', 'jsdoc', 'n', 'promise'],
29
- rules: {
30
- 'no-console': 'error',
31
- 'no-irregular-whitespace': [
32
- 'error',
33
- {
34
- skipTemplates: true
35
- }
36
- ],
37
-
38
- // Check type imports are identified
39
- '@typescript-eslint/consistent-type-imports': [
40
- 'error',
41
- {
42
- fixStyle: 'inline-type-imports'
43
- }
44
- ],
45
-
46
- // Allow void return shorthand in arrow functions
47
- '@typescript-eslint/no-confusing-void-expression': [
48
- 'error',
49
- {
50
- ignoreArrowShorthand: true
51
- }
52
- ],
53
-
54
- // Only show warnings for missing types
55
- '@typescript-eslint/no-unsafe-argument': 'warn',
56
- '@typescript-eslint/no-unsafe-assignment': 'warn',
57
- '@typescript-eslint/no-unsafe-call': 'warn',
58
- '@typescript-eslint/no-unsafe-member-access': 'warn',
59
- '@typescript-eslint/no-unsafe-return': 'warn',
60
-
61
- // Check type support for template string implicit `.toString()`
62
- '@typescript-eslint/restrict-template-expressions': [
63
- 'error',
64
- {
65
- allowBoolean: true,
66
- allowNumber: true
67
- }
68
- ],
69
-
70
- // Skip warnings for `this` in static methods
71
- '@typescript-eslint/unbound-method': [
72
- 'warn',
73
- {
74
- ignoreStatic: true
75
- }
76
- ],
77
-
78
- // Skip rules handled by TypeScript compiler
79
- 'import/default': 'off',
80
- 'import/extensions': 'off',
81
- 'import/named': 'off',
82
- 'import/namespace': 'off',
83
- 'import/no-named-as-default': 'off',
84
- 'import/no-named-as-default-member': 'off',
85
- 'import/no-unresolved': 'off',
86
-
87
- // Check type imports are annotated inline
88
- 'import/consistent-type-specifier-style': ['error', 'prefer-inline'],
89
-
90
- // Check import or require statements are A-Z ordered
91
- 'import/order': [
92
- 'error',
93
- {
94
- alphabetize: { order: 'asc' },
95
- named: {
96
- enabled: true,
97
- types: 'types-last'
98
- },
99
- 'newlines-between': 'always'
100
- }
101
- ],
102
-
103
- // Check relative import paths use aliases
104
- 'no-restricted-imports': [
105
- 'error',
106
- {
107
- patterns: [
108
- {
109
- group: ['./', '../'],
110
- message: "Please use '~/*' import alias instead."
111
- }
112
- ]
113
- }
114
- ],
115
-
116
- // Check for valid formatting
117
- 'jsdoc/check-line-alignment': [
118
- 'warn',
119
- 'never',
120
- {
121
- tags: ['param', 'property', 'typedef', 'returns']
122
- }
123
- ],
124
-
125
- // Require hyphens before param description
126
- // Aligns with TSDoc style: https://tsdoc.org/pages/tags/param/
127
- 'jsdoc/require-hyphen-before-param-description': [
128
- 'warn',
129
- 'always',
130
- {
131
- tags: {
132
- param: 'always',
133
- property: 'always',
134
- returns: 'never'
135
- }
136
- }
137
- ],
138
-
139
- // JSDoc blocks are optional but must be valid
140
- 'jsdoc/require-jsdoc': [
141
- 'error',
142
- {
143
- enableFixer: false,
144
- require: {
145
- FunctionDeclaration: false
146
- }
147
- }
148
- ],
149
-
150
- // JSDoc @param is optional
151
- 'jsdoc/require-param-description': 'off',
152
- 'jsdoc/require-param-type': 'off',
153
- 'jsdoc/require-param': 'off',
154
-
155
- // JSDoc @returns is optional
156
- 'jsdoc/require-returns-description': 'off',
157
- 'jsdoc/require-returns-type': 'off',
158
- 'jsdoc/require-returns': 'off',
159
-
160
- // Skip rules handled by TypeScript compiler
161
- 'n/no-extraneous-require': 'off',
162
- 'n/no-extraneous-import': 'off',
163
- 'n/no-missing-require': 'off',
164
- 'n/no-missing-import': 'off',
165
-
166
- // Prefer rules that are type aware
167
- 'no-unused-vars': 'off',
168
- 'no-use-before-define': 'off',
169
- '@typescript-eslint/no-unused-vars': [
170
- 'error',
171
- { argsIgnorePattern: '^_' }
172
- ],
173
- '@typescript-eslint/no-use-before-define': ['error', 'nofunc']
174
- },
175
- settings: {
176
- 'import/parsers': {
177
- '@typescript-eslint/parser': ['.cjs', '.js', '.mjs', '.ts']
178
- },
179
- 'import/resolver': {
180
- node: true,
181
- typescript: true
182
- }
183
- }
184
- },
185
- {
186
- extends: ['plugin:jsdoc/recommended-typescript-flavor'],
187
- files: ['**/*.{cjs,js,mjs}'],
188
- plugins: ['jsdoc'],
189
- rules: {
190
- // Promise.prototype.catch() errors cannot be typed in JavaScript
191
- '@typescript-eslint/use-unknown-in-catch-callback-variable': 'off',
192
-
193
- // JSDoc blocks are optional but must be valid
194
- 'jsdoc/require-jsdoc': [
195
- 'error',
196
- {
197
- enableFixer: false,
198
- require: {
199
- FunctionDeclaration: false
200
- }
201
- }
202
- ],
203
-
204
- // JSDoc @param types are mandatory for JavaScript
205
- 'jsdoc/require-param-description': 'off',
206
- 'jsdoc/require-param-type': 'error',
207
- 'jsdoc/require-param': 'off',
208
-
209
- // JSDoc @returns is optional
210
- 'jsdoc/require-returns-description': 'off',
211
- 'jsdoc/require-returns-type': 'off',
212
- 'jsdoc/require-returns': 'off'
213
- }
214
- },
215
- {
216
- files: ['**/*.cjs'],
217
- rules: {
218
- '@typescript-eslint/no-var-requires': 'off'
219
- }
220
- },
221
- {
222
- files: ['**/*.{js,mjs}'],
223
- parserOptions: {
224
- sourceType: 'module'
225
- }
226
- },
227
- {
228
- env: {
229
- browser: true,
230
- node: false
231
- },
232
- files: ['src/client/**/*.js'],
233
- rules: {
234
- // Turn off warnings for unavailable types
235
- // https://github.com/alphagov/govuk-frontend/issues/2835
236
- '@typescript-eslint/no-unsafe-argument': 'off',
237
- '@typescript-eslint/no-unsafe-assignment': 'off',
238
- '@typescript-eslint/no-unsafe-call': 'off',
239
- '@typescript-eslint/no-unsafe-member-access': 'off',
240
- '@typescript-eslint/no-unsafe-return': 'off',
241
-
242
- // Allow floating promises for lazy loading
243
- '@typescript-eslint/no-floating-promises': 'off',
244
- 'promise/always-return': 'off'
245
- }
246
- },
247
- {
248
- env: {
249
- 'jest/globals': true
250
- },
251
- extends: ['plugin:jest/recommended', 'plugin:jest/style'],
252
- files: ['**/*.test.{cjs,js,mjs,ts}'],
253
- plugins: ['jest'],
254
- rules: {
255
- // Turn off warnings for jest.Expect 'any' types
256
- '@typescript-eslint/no-unsafe-assignment': 'off',
257
- '@typescript-eslint/no-unsafe-argument': 'off',
258
-
259
- // Allow Jest to assert on mocked unbound methods
260
- '@typescript-eslint/unbound-method': 'off',
261
- 'jest/unbound-method': 'error'
262
- }
263
- }
264
- ],
265
- root: true
266
- }
@@ -1,85 +0,0 @@
1
- version: 2
2
-
3
- updates:
4
- # Update npm packages
5
- - package-ecosystem: npm
6
- directory: /
7
- open-pull-requests-limit: 10
8
-
9
- # Group into shared PRs
10
- groups:
11
- build:
12
- patterns:
13
- - '*-loader'
14
- - '*-webpack-plugin'
15
- - '@babel/*'
16
- - 'autoprefixer'
17
- - 'babel-*'
18
- - 'core-js'
19
- - 'cssnano'
20
- - 'cssnano-*'
21
- - 'postcss'
22
- - 'postcss-*'
23
- - 'sass-embedded'
24
- - 'tsc-alias'
25
- - 'typescript'
26
- - 'webpack'
27
- - 'webpack-*'
28
-
29
- # Exclude packages in other groups
30
- exclude-patterns:
31
- - 'postcss-scss'
32
-
33
- lint:
34
- patterns:
35
- - '@typescript-eslint/*'
36
- - 'editorconfig-checker'
37
- - 'eslint'
38
- - 'eslint-*'
39
- - 'husky'
40
- - 'lint-staged'
41
- - 'postcss-scss'
42
- - 'prettier'
43
- - 'stylelint'
44
- - 'stylelint-*'
45
-
46
- logging:
47
- patterns:
48
- - '*-pino'
49
- - '*-pino-format'
50
- - 'pino'
51
- - 'pino-*'
52
-
53
- tools:
54
- patterns:
55
- - 'concurrently'
56
- - 'global-jsdom'
57
- - 'jest'
58
- - 'jsdom'
59
- - 'tsx'
60
-
61
- types:
62
- patterns:
63
- - '@types/*'
64
-
65
- # Schedule run every Monday, local time
66
- schedule:
67
- interval: weekly
68
- time: '10:30'
69
- timezone: 'Europe/London'
70
-
71
- versioning-strategy: increase
72
-
73
- allow:
74
- # Include direct package.json updates
75
- - dependency-type: direct
76
-
77
- # Update GitHub Actions
78
- - package-ecosystem: github-actions
79
- directory: /
80
-
81
- # Schedule run every Monday, local time
82
- schedule:
83
- interval: weekly
84
- time: '10:30'
85
- timezone: 'Europe/London'
@@ -1,209 +0,0 @@
1
- name: Check Pull Request
2
-
3
- on:
4
- pull_request:
5
-
6
- push:
7
- branches:
8
- - main
9
- - 'releases/**'
10
-
11
- workflow_dispatch:
12
-
13
- concurrency:
14
- group: ${{ github.workflow }}-${{ github.ref }}
15
- cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
16
-
17
- jobs:
18
- build:
19
- name: Build
20
- runs-on: ubuntu-24.04
21
-
22
- strategy:
23
- fail-fast: false
24
-
25
- steps:
26
- - name: Check out code
27
- uses: actions/checkout@v4
28
-
29
- - name: Cache dependencies
30
- uses: actions/cache@v4
31
- id: npm-install-cache
32
- with:
33
- enableCrossOsArchive: true
34
- key: npm-install-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
35
- path: node_modules
36
-
37
- - name: Cache build
38
- uses: actions/cache@v4
39
- with:
40
- enableCrossOsArchive: true
41
- key: npm-build-${{ runner.os }}-${{ github.sha }}
42
- path: |
43
- .public
44
- .server
45
-
46
- - name: Setup Node.js
47
- uses: actions/setup-node@v4
48
- with:
49
- node-version-file: .nvmrc
50
-
51
- - name: Install dependencies
52
- if: steps.npm-install-cache.outputs.cache-hit != 'true'
53
- run: npm ci
54
-
55
- - name: Run build
56
- run: npm run build
57
-
58
- lint:
59
- name: ${{ matrix.task.description }}
60
- runs-on: ubuntu-24.04
61
- needs: [build]
62
-
63
- env:
64
- # Authorise GitHub API requests for EditorConfig checker binary
65
- # https://www.npmjs.com/package/editorconfig-checker
66
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
67
-
68
- strategy:
69
- fail-fast: false
70
-
71
- matrix:
72
- task:
73
- - description: Prettier
74
- name: lint-prettier
75
- run: npm run format:check
76
- cache: .cache/prettier
77
-
78
- - description: EditorConfig
79
- name: lint-editorconfig
80
- run: npm run lint:editorconfig
81
-
82
- - description: ESLint
83
- name: lint-js
84
- run: npm run lint:js
85
- cache: .cache/eslint
86
-
87
- - description: Stylelint
88
- run: npm run lint:scss
89
- cache: .cache/stylelint
90
-
91
- - description: TypeScript compiler
92
- name: lint-types
93
- run: npm run lint:types -- --incremental --pretty
94
- cache: '**/*.tsbuildinfo'
95
-
96
- steps:
97
- - name: Checkout
98
- uses: actions/checkout@v4
99
-
100
- - name: Restore dependencies
101
- uses: actions/cache/restore@v4
102
- with:
103
- enableCrossOsArchive: true
104
- fail-on-cache-miss: true
105
- key: npm-install-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
106
- path: node_modules
107
-
108
- - name: Cache task
109
- if: ${{ matrix.task.cache }}
110
- uses: actions/cache@v4
111
- with:
112
- enableCrossOsArchive: true
113
- key: ${{ matrix.task.name }}-${{ runner.os }}
114
- path: ${{ matrix.task.cache }}
115
-
116
- - name: Setup Node.js
117
- uses: actions/setup-node@v4
118
- with:
119
- node-version-file: .nvmrc
120
-
121
- - name: Run lint task
122
- run: ${{ matrix.task.run }}
123
-
124
- tasks:
125
- name: ${{ matrix.task.description }}
126
- runs-on: ubuntu-24.04
127
- needs: [build]
128
-
129
- strategy:
130
- fail-fast: false
131
-
132
- matrix:
133
- task:
134
- - description: Unit tests
135
- name: test-unit
136
- run: npm run test
137
- cache: coverage
138
-
139
- steps:
140
- - name: Checkout
141
- uses: actions/checkout@v4
142
-
143
- - name: Restore dependencies
144
- uses: actions/cache/restore@v4
145
- with:
146
- enableCrossOsArchive: true
147
- fail-on-cache-miss: true
148
- key: npm-install-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
149
- path: node_modules
150
-
151
- - name: Restore build
152
- uses: actions/cache/restore@v4
153
- with:
154
- enableCrossOsArchive: true
155
- fail-on-cache-miss: true
156
- key: npm-build-${{ runner.os }}-${{ github.sha }}
157
- path: |
158
- .public
159
- .server
160
-
161
- - name: Setup Node.js
162
- uses: actions/setup-node@v4
163
- with:
164
- node-version-file: .nvmrc
165
-
166
- - name: Cache task
167
- if: ${{ matrix.task.cache }}
168
- uses: actions/cache@v4
169
- with:
170
- enableCrossOsArchive: true
171
- key: ${{ matrix.task.name }}-${{ runner.os }}-${{ github.sha }}
172
- path: ${{ matrix.task.cache }}
173
-
174
- - name: Run task
175
- run: ${{ matrix.task.run }}
176
-
177
- - name: Save test coverage
178
- if: ${{ always() }}
179
- uses: actions/upload-artifact@v4
180
- with:
181
- name: ${{ matrix.task.description }} coverage
182
- path: coverage
183
- if-no-files-found: ignore
184
-
185
- analysis:
186
- name: Analysis
187
- if: ${{ always() }}
188
- runs-on: ubuntu-24.04
189
- needs: [build, tasks]
190
-
191
- steps:
192
- - name: Check out code
193
- uses: actions/checkout@v4
194
- with:
195
- fetch-depth: 0
196
-
197
- - name: Restore unit test coverage
198
- uses: actions/cache/restore@v4
199
- with:
200
- enableCrossOsArchive: true
201
- fail-on-cache-miss: true
202
- key: test-unit-${{ runner.os }}-${{ github.sha }}
203
- path: coverage
204
-
205
- - name: SonarCloud Scan
206
- uses: SonarSource/sonarqube-scan-action@v4.2.1
207
- env:
208
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
209
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}