@defra/forms-engine-plugin 0.1.10 → 0.1.12

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 (247) hide show
  1. package/.public/javascripts/file-upload.min.js +1 -1
  2. package/.public/javascripts/file-upload.min.js.map +1 -1
  3. package/.public/stylesheets/application.min.css +1 -1
  4. package/.public/stylesheets/application.min.css.map +1 -1
  5. package/.server/client/javascripts/file-upload.js +45 -4
  6. package/.server/client/javascripts/file-upload.js.map +1 -1
  7. package/.server/client/stylesheets/application.scss +10 -0
  8. package/.server/config/index.js +3 -14
  9. package/.server/config/index.js.map +1 -1
  10. package/.server/server/constants.js +2 -0
  11. package/.server/server/constants.js.map +1 -1
  12. package/.server/server/devserver/dxt-devtool-baselayout.html +71 -0
  13. package/.server/server/forms/register-as-a-unicorn-breeder.json +393 -0
  14. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +251 -0
  15. package/.server/server/index.js +12 -17
  16. package/.server/server/index.js.map +1 -1
  17. package/.server/server/plugins/engine/components/AutocompleteField.js +2 -0
  18. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  19. package/.server/server/plugins/engine/components/CheckboxesField.js +3 -4
  20. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  21. package/.server/server/plugins/engine/components/ComponentCollection.js +37 -16
  22. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  23. package/.server/server/plugins/engine/components/DatePartsField.js +36 -2
  24. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  25. package/.server/server/plugins/engine/components/EmailAddressField.js +19 -3
  26. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  27. package/.server/server/plugins/engine/components/FileUploadField.js +44 -4
  28. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  29. package/.server/server/plugins/engine/components/FormComponent.js +14 -2
  30. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  31. package/.server/server/plugins/engine/components/ListFormComponent.js +16 -3
  32. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
  33. package/.server/server/plugins/engine/components/Markdown.js +24 -0
  34. package/.server/server/plugins/engine/components/Markdown.js.map +1 -0
  35. package/.server/server/plugins/engine/components/MonthYearField.js +30 -2
  36. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  37. package/.server/server/plugins/engine/components/MultilineTextField.js +32 -3
  38. package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -1
  39. package/.server/server/plugins/engine/components/NumberField.js +28 -3
  40. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  41. package/.server/server/plugins/engine/components/SelectionControlField.js +14 -0
  42. package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -1
  43. package/.server/server/plugins/engine/components/TelephoneNumberField.js +19 -3
  44. package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
  45. package/.server/server/plugins/engine/components/TextField.js +22 -3
  46. package/.server/server/plugins/engine/components/TextField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/UkAddressField.js +29 -0
  48. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  49. package/.server/server/plugins/engine/components/YesNoField.js +18 -0
  50. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  51. package/.server/server/plugins/engine/components/helpers.js +16 -0
  52. package/.server/server/plugins/engine/components/helpers.js.map +1 -1
  53. package/.server/server/plugins/engine/components/index.js +1 -0
  54. package/.server/server/plugins/engine/components/index.js.map +1 -1
  55. package/.server/server/plugins/engine/configureEnginePlugin.js +19 -3
  56. package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
  57. package/.server/server/plugins/engine/helpers.js +38 -18
  58. package/.server/server/plugins/engine/helpers.js.map +1 -1
  59. package/.server/server/plugins/engine/models/FormModel.js +60 -2
  60. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  61. package/.server/server/plugins/engine/models/SummaryViewModel.js +3 -2
  62. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  63. package/.server/server/plugins/engine/outputFormatters/human/v1.js +1 -1
  64. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  65. package/.server/server/plugins/engine/pageControllers/PageController.js +13 -5
  66. package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -1
  67. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +2 -2
  68. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  69. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +19 -5
  70. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  71. package/.server/server/plugins/engine/pageControllers/validationOptions.js +6 -11
  72. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  73. package/.server/server/plugins/engine/plugin.js +32 -20
  74. package/.server/server/plugins/engine/plugin.js.map +1 -1
  75. package/.server/server/plugins/engine/services/formsService.js +15 -29
  76. package/.server/server/plugins/engine/services/formsService.js.map +1 -1
  77. package/.server/server/plugins/engine/services/localFormsService.js +52 -0
  78. package/.server/server/plugins/engine/services/localFormsService.js.map +1 -0
  79. package/.server/server/plugins/engine/services/notifyService.js +1 -4
  80. package/.server/server/plugins/engine/services/notifyService.js.map +1 -1
  81. package/.server/server/plugins/engine/services/uploadService.js +5 -3
  82. package/.server/server/plugins/engine/services/uploadService.js.map +1 -1
  83. package/.server/server/plugins/engine/types.js.map +1 -1
  84. package/.server/server/plugins/engine/views/components/html.html +1 -1
  85. package/.server/server/plugins/engine/views/components/markdown.html +5 -0
  86. package/.server/server/plugins/engine/views/confirmation.html +1 -1
  87. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  88. package/.server/server/plugins/engine/views/index.html +1 -1
  89. package/.server/server/plugins/engine/views/item-delete.html +1 -1
  90. package/.server/server/plugins/engine/views/repeat-list-summary.html +1 -1
  91. package/.server/server/plugins/engine/views/summary.html +8 -2
  92. package/.server/server/plugins/errorPages.js +4 -26
  93. package/.server/server/plugins/errorPages.js.map +1 -1
  94. package/.server/server/plugins/nunjucks/context.js +43 -33
  95. package/.server/server/plugins/nunjucks/context.js.map +1 -1
  96. package/.server/server/plugins/nunjucks/context.test.js +23 -28
  97. package/.server/server/plugins/nunjucks/context.test.js.map +1 -1
  98. package/.server/server/plugins/nunjucks/enviroment.test.js +6 -3
  99. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
  100. package/.server/server/plugins/nunjucks/types.js +3 -4
  101. package/.server/server/plugins/nunjucks/types.js.map +1 -1
  102. package/.server/server/routes/index.js +0 -1
  103. package/.server/server/routes/index.js.map +1 -1
  104. package/.server/server/utils/type-utils.js +8 -0
  105. package/.server/server/utils/type-utils.js.map +1 -0
  106. package/.server/typings/hapi/index.d.js.map +1 -1
  107. package/.server/typings/joi/index.d.js.map +1 -1
  108. package/package.json +4 -3
  109. package/src/client/javascripts/file-upload.js +60 -4
  110. package/src/client/stylesheets/application.scss +10 -0
  111. package/src/config/index.ts +4 -17
  112. package/src/server/constants.js +2 -0
  113. package/src/server/devserver/dxt-devtool-baselayout.html +71 -0
  114. package/src/server/forms/register-as-a-unicorn-breeder.json +393 -0
  115. package/src/server/forms/register-as-a-unicorn-breeder.yaml +251 -0
  116. package/src/server/index.test.ts +38 -66
  117. package/src/server/index.ts +15 -17
  118. package/src/server/plugins/engine/components/AutocompleteField.test.ts +71 -3
  119. package/src/server/plugins/engine/components/AutocompleteField.ts +6 -2
  120. package/src/server/plugins/engine/components/CheckboxesField.test.ts +40 -8
  121. package/src/server/plugins/engine/components/CheckboxesField.ts +7 -3
  122. package/src/server/plugins/engine/components/ComponentCollection.ts +45 -18
  123. package/src/server/plugins/engine/components/DatePartsField.test.ts +13 -4
  124. package/src/server/plugins/engine/components/DatePartsField.ts +29 -8
  125. package/src/server/plugins/engine/components/EmailAddressField.test.ts +51 -1
  126. package/src/server/plugins/engine/components/EmailAddressField.ts +17 -2
  127. package/src/server/plugins/engine/components/FileUploadField.test.ts +53 -0
  128. package/src/server/plugins/engine/components/FileUploadField.ts +52 -3
  129. package/src/server/plugins/engine/components/FormComponent.ts +24 -2
  130. package/src/server/plugins/engine/components/ListFormComponent.ts +16 -2
  131. package/src/server/plugins/engine/components/Markdown.test.ts +48 -0
  132. package/src/server/plugins/engine/components/Markdown.ts +29 -0
  133. package/src/server/plugins/engine/components/MonthYearField.test.ts +35 -0
  134. package/src/server/plugins/engine/components/MonthYearField.ts +34 -9
  135. package/src/server/plugins/engine/components/MultilineTextField.test.ts +83 -5
  136. package/src/server/plugins/engine/components/MultilineTextField.ts +37 -2
  137. package/src/server/plugins/engine/components/NumberField.test.ts +24 -2
  138. package/src/server/plugins/engine/components/NumberField.ts +23 -3
  139. package/src/server/plugins/engine/components/RadiosField.test.ts +10 -1
  140. package/src/server/plugins/engine/components/SelectField.test.ts +2 -1
  141. package/src/server/plugins/engine/components/SelectionControlField.ts +14 -0
  142. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +30 -2
  143. package/src/server/plugins/engine/components/TelephoneNumberField.ts +17 -2
  144. package/src/server/plugins/engine/components/TextField.test.ts +33 -1
  145. package/src/server/plugins/engine/components/TextField.ts +17 -2
  146. package/src/server/plugins/engine/components/UkAddressField.test.ts +46 -3
  147. package/src/server/plugins/engine/components/UkAddressField.ts +28 -0
  148. package/src/server/plugins/engine/components/YesNoField.test.ts +9 -1
  149. package/src/server/plugins/engine/components/YesNoField.ts +24 -0
  150. package/src/server/plugins/engine/components/helpers.test.ts +24 -0
  151. package/src/server/plugins/engine/components/helpers.ts +39 -0
  152. package/src/server/plugins/engine/components/index.ts +1 -0
  153. package/src/server/plugins/engine/configureEnginePlugin.ts +32 -4
  154. package/src/server/plugins/engine/helpers.test.ts +71 -20
  155. package/src/server/plugins/engine/helpers.ts +46 -19
  156. package/src/server/plugins/engine/models/FormModel.test.ts +91 -1
  157. package/src/server/plugins/engine/models/FormModel.ts +86 -3
  158. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +46 -7
  159. package/src/server/plugins/engine/models/SummaryViewModel.ts +7 -3
  160. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +1 -2
  161. package/src/server/plugins/engine/outputFormatters/human/v1.ts +1 -1
  162. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +1 -0
  163. package/src/server/plugins/engine/pageControllers/PageController.test.ts +9 -6
  164. package/src/server/plugins/engine/pageControllers/PageController.ts +15 -5
  165. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +2 -2
  166. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +21 -6
  167. package/src/server/plugins/engine/pageControllers/validationOptions.ts +31 -17
  168. package/src/server/plugins/engine/plugin.ts +52 -22
  169. package/src/server/plugins/engine/services/formsService.js +17 -35
  170. package/src/server/plugins/engine/services/localFormsService.js +49 -0
  171. package/src/server/plugins/engine/services/notifyService.ts +1 -2
  172. package/src/server/plugins/engine/services/uploadService.js +10 -6
  173. package/src/server/plugins/engine/types.ts +10 -1
  174. package/src/server/plugins/engine/views/components/html.html +1 -1
  175. package/src/server/plugins/engine/views/components/markdown.html +5 -0
  176. package/src/server/plugins/engine/views/confirmation.html +1 -1
  177. package/src/server/plugins/engine/views/file-upload.html +1 -1
  178. package/src/server/plugins/engine/views/index.html +1 -1
  179. package/src/server/plugins/engine/views/item-delete.html +1 -1
  180. package/src/server/plugins/engine/views/repeat-list-summary.html +1 -1
  181. package/src/server/plugins/engine/views/summary.html +8 -2
  182. package/src/server/plugins/errorPages.ts +4 -26
  183. package/src/server/plugins/nunjucks/context.js +44 -34
  184. package/src/server/plugins/nunjucks/context.test.js +24 -27
  185. package/src/server/plugins/nunjucks/enviroment.test.js +9 -3
  186. package/src/server/plugins/nunjucks/types.js +3 -4
  187. package/src/server/routes/index.ts +0 -1
  188. package/src/server/utils/type-utils.ts +15 -0
  189. package/src/typings/hapi/index.d.ts +3 -9
  190. package/src/typings/joi/index.d.ts +8 -0
  191. package/.server/common/cookies.js +0 -55
  192. package/.server/common/cookies.js.map +0 -1
  193. package/.server/common/cookies.test.js +0 -15
  194. package/.server/common/cookies.test.js.map +0 -1
  195. package/.server/common/types.js +0 -6
  196. package/.server/common/types.js.map +0 -1
  197. package/.server/server/forms/README.md +0 -10
  198. package/.server/server/forms/report-a-terrorist.json +0 -270
  199. package/.server/server/forms/runner-components-test.json +0 -365
  200. package/.server/server/forms/test.json +0 -581
  201. package/.server/server/forms/test.yaml +0 -363
  202. package/.server/server/plugins/blankie.js +0 -29
  203. package/.server/server/plugins/blankie.js.map +0 -1
  204. package/.server/server/plugins/engine/services/formsService.test.js +0 -71
  205. package/.server/server/plugins/engine/services/formsService.test.js.map +0 -1
  206. package/.server/server/plugins/engine/views/layout.html +0 -199
  207. package/.server/server/plugins/router.js +0 -169
  208. package/.server/server/plugins/router.js.map +0 -1
  209. package/.server/server/routes/health.js +0 -15
  210. package/.server/server/routes/health.js.map +0 -1
  211. package/.server/server/routes/health.test.js +0 -32
  212. package/.server/server/routes/health.test.js.map +0 -1
  213. package/.server/server/utils/file-form-service.test.js +0 -52
  214. package/.server/server/utils/file-form-service.test.js.map +0 -1
  215. package/.server/server/views/404.html +0 -16
  216. package/.server/server/views/500.html +0 -19
  217. package/.server/server/views/help/accessibility-statement.html +0 -58
  218. package/.server/server/views/help/cookie-preferences.html +0 -57
  219. package/.server/server/views/help/cookies.html +0 -71
  220. package/.server/server/views/help/get-support.html +0 -37
  221. package/.server/server/views/help/privacy-notice.html +0 -68
  222. package/.server/server/views/help/terms-and-conditions.html +0 -83
  223. package/src/common/cookies.js +0 -58
  224. package/src/common/cookies.test.js +0 -23
  225. package/src/common/types.js +0 -5
  226. package/src/server/forms/README.md +0 -10
  227. package/src/server/forms/report-a-terrorist.json +0 -270
  228. package/src/server/forms/runner-components-test.json +0 -365
  229. package/src/server/forms/test.json +0 -581
  230. package/src/server/forms/test.yaml +0 -363
  231. package/src/server/plugins/blankie.test.ts +0 -73
  232. package/src/server/plugins/blankie.ts +0 -48
  233. package/src/server/plugins/engine/services/formsService.test.js +0 -90
  234. package/src/server/plugins/engine/views/layout.html +0 -199
  235. package/src/server/plugins/router.ts +0 -201
  236. package/src/server/routes/health.js +0 -13
  237. package/src/server/routes/health.test.js +0 -35
  238. package/src/server/routes/index.test.ts +0 -125
  239. package/src/server/utils/file-form-service.test.js +0 -79
  240. package/src/server/views/404.html +0 -16
  241. package/src/server/views/500.html +0 -19
  242. package/src/server/views/help/accessibility-statement.html +0 -58
  243. package/src/server/views/help/cookie-preferences.html +0 -57
  244. package/src/server/views/help/cookies.html +0 -71
  245. package/src/server/views/help/get-support.html +0 -37
  246. package/src/server/views/help/privacy-notice.html +0 -68
  247. package/src/server/views/help/terms-and-conditions.html +0 -83
@@ -1,5 +1,3 @@
1
- import { StatusCodes } from 'http-status-codes';
2
-
3
1
  /*
4
2
  * Add an `onPreResponse` listener to return error pages
5
3
  */
@@ -13,33 +11,13 @@ export default {
13
11
  // An error was raised during
14
12
  // processing the request
15
13
  const statusCode = response.output.statusCode;
16
-
17
- // Check for a form model on the request
18
- // and use it to set the correct service name
19
- // and start page path. In the event of a error
20
- // happening inside a "form" level request, the header
21
- // then displays the contextual form text and href
22
- const model = request.app.model;
23
- const viewModel = model ? {
24
- name: model.name,
25
- serviceUrl: `/${model.basePath}`
26
- } : undefined;
27
-
28
- // In the event of 404
29
- // return the `404` view
30
- if (statusCode === StatusCodes.NOT_FOUND.valueOf()) {
31
- return h.view('404', viewModel).code(statusCode);
32
- }
33
- request.log('error', {
14
+ const error = {
34
15
  statusCode,
35
- data: response.data,
36
16
  message: response.message,
37
17
  stack: response.stack
38
- });
39
- request.logger.error(response.stack);
40
-
41
- // The return the `500` view
42
- return h.view('500', viewModel).code(statusCode);
18
+ };
19
+ request.log('error', error);
20
+ return h.response(error).code(statusCode);
43
21
  }
44
22
  return h.continue;
45
23
  });
@@ -1 +1 @@
1
- {"version":3,"file":"errorPages.js","names":["StatusCodes","plugin","name","register","server","ext","request","h","response","isBoom","statusCode","output","model","app","viewModel","serviceUrl","basePath","undefined","NOT_FOUND","valueOf","view","code","log","data","message","stack","logger","error","continue"],"sources":["../../../src/server/plugins/errorPages.ts"],"sourcesContent":["import {\n type Request,\n type ResponseToolkit,\n type ServerRegisterPluginObject\n} from '@hapi/hapi'\nimport { StatusCodes } from 'http-status-codes'\n\n/*\n * Add an `onPreResponse` listener to return error pages\n */\nexport default {\n plugin: {\n name: 'error-pages',\n register(server) {\n server.ext('onPreResponse', (request: Request, h: ResponseToolkit) => {\n const response = request.response\n\n if ('isBoom' in response && response.isBoom) {\n // An error was raised during\n // processing the request\n const statusCode = response.output.statusCode\n\n // Check for a form model on the request\n // and use it to set the correct service name\n // and start page path. In the event of a error\n // happening inside a \"form\" level request, the header\n // then displays the contextual form text and href\n const model = request.app.model\n const viewModel = model\n ? {\n name: model.name,\n serviceUrl: `/${model.basePath}`\n }\n : undefined\n\n // In the event of 404\n // return the `404` view\n if (statusCode === StatusCodes.NOT_FOUND.valueOf()) {\n return h.view('404', viewModel).code(statusCode)\n }\n\n request.log('error', {\n statusCode,\n data: response.data,\n message: response.message,\n stack: response.stack\n })\n\n request.logger.error(response.stack)\n\n // The return the `500` view\n return h.view('500', viewModel).code(statusCode)\n }\n return h.continue\n })\n }\n }\n} satisfies ServerRegisterPluginObject<void>\n"],"mappings":"AAKA,SAASA,WAAW,QAAQ,mBAAmB;;AAE/C;AACA;AACA;AACA,eAAe;EACbC,MAAM,EAAE;IACNC,IAAI,EAAE,aAAa;IACnBC,QAAQA,CAACC,MAAM,EAAE;MACfA,MAAM,CAACC,GAAG,CAAC,eAAe,EAAE,CAACC,OAAgB,EAAEC,CAAkB,KAAK;QACpE,MAAMC,QAAQ,GAAGF,OAAO,CAACE,QAAQ;QAEjC,IAAI,QAAQ,IAAIA,QAAQ,IAAIA,QAAQ,CAACC,MAAM,EAAE;UAC3C;UACA;UACA,MAAMC,UAAU,GAAGF,QAAQ,CAACG,MAAM,CAACD,UAAU;;UAE7C;UACA;UACA;UACA;UACA;UACA,MAAME,KAAK,GAAGN,OAAO,CAACO,GAAG,CAACD,KAAK;UAC/B,MAAME,SAAS,GAAGF,KAAK,GACnB;YACEV,IAAI,EAAEU,KAAK,CAACV,IAAI;YAChBa,UAAU,EAAE,IAAIH,KAAK,CAACI,QAAQ;UAChC,CAAC,GACDC,SAAS;;UAEb;UACA;UACA,IAAIP,UAAU,KAAKV,WAAW,CAACkB,SAAS,CAACC,OAAO,CAAC,CAAC,EAAE;YAClD,OAAOZ,CAAC,CAACa,IAAI,CAAC,KAAK,EAAEN,SAAS,CAAC,CAACO,IAAI,CAACX,UAAU,CAAC;UAClD;UAEAJ,OAAO,CAACgB,GAAG,CAAC,OAAO,EAAE;YACnBZ,UAAU;YACVa,IAAI,EAAEf,QAAQ,CAACe,IAAI;YACnBC,OAAO,EAAEhB,QAAQ,CAACgB,OAAO;YACzBC,KAAK,EAAEjB,QAAQ,CAACiB;UAClB,CAAC,CAAC;UAEFnB,OAAO,CAACoB,MAAM,CAACC,KAAK,CAACnB,QAAQ,CAACiB,KAAK,CAAC;;UAEpC;UACA,OAAOlB,CAAC,CAACa,IAAI,CAAC,KAAK,EAAEN,SAAS,CAAC,CAACO,IAAI,CAACX,UAAU,CAAC;QAClD;QACA,OAAOH,CAAC,CAACqB,QAAQ;MACnB,CAAC,CAAC;IACJ;EACF;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"errorPages.js","names":["plugin","name","register","server","ext","request","h","response","isBoom","statusCode","output","error","message","stack","log","code","continue"],"sources":["../../../src/server/plugins/errorPages.ts"],"sourcesContent":["import {\n type Request,\n type ResponseToolkit,\n type ServerRegisterPluginObject\n} from '@hapi/hapi'\n\n/*\n * Add an `onPreResponse` listener to return error pages\n */\nexport default {\n plugin: {\n name: 'error-pages',\n register(server) {\n server.ext('onPreResponse', (request: Request, h: ResponseToolkit) => {\n const response = request.response\n\n if ('isBoom' in response && response.isBoom) {\n // An error was raised during\n // processing the request\n const statusCode = response.output.statusCode\n\n const error = {\n statusCode,\n message: response.message,\n stack: response.stack\n }\n\n request.log('error', error)\n\n return h.response(error).code(statusCode)\n }\n return h.continue\n })\n }\n }\n} satisfies ServerRegisterPluginObject<void>\n"],"mappings":"AAMA;AACA;AACA;AACA,eAAe;EACbA,MAAM,EAAE;IACNC,IAAI,EAAE,aAAa;IACnBC,QAAQA,CAACC,MAAM,EAAE;MACfA,MAAM,CAACC,GAAG,CAAC,eAAe,EAAE,CAACC,OAAgB,EAAEC,CAAkB,KAAK;QACpE,MAAMC,QAAQ,GAAGF,OAAO,CAACE,QAAQ;QAEjC,IAAI,QAAQ,IAAIA,QAAQ,IAAIA,QAAQ,CAACC,MAAM,EAAE;UAC3C;UACA;UACA,MAAMC,UAAU,GAAGF,QAAQ,CAACG,MAAM,CAACD,UAAU;UAE7C,MAAME,KAAK,GAAG;YACZF,UAAU;YACVG,OAAO,EAAEL,QAAQ,CAACK,OAAO;YACzBC,KAAK,EAAEN,QAAQ,CAACM;UAClB,CAAC;UAEDR,OAAO,CAACS,GAAG,CAAC,OAAO,EAAEH,KAAK,CAAC;UAE3B,OAAOL,CAAC,CAACC,QAAQ,CAACI,KAAK,CAAC,CAACI,IAAI,CAACN,UAAU,CAAC;QAC3C;QACA,OAAOH,CAAC,CAACU,QAAQ;MACnB,CAAC,CAAC;IACJ;EACF;AACF,CAAC","ignoreList":[]}
@@ -3,11 +3,9 @@ import { basename, join } from 'node:path';
3
3
  import Boom from '@hapi/boom';
4
4
  import { StatusCodes } from 'http-status-codes';
5
5
  import pkg from "../../../../package.json" with { type: 'json' };
6
- import { parseCookieConsent } from "../../../common/cookies.js";
7
6
  import { config } from "../../../config/index.js";
8
7
  import { createLogger } from "../../common/helpers/logging/logger.js";
9
- import { PREVIEW_PATH_PREFIX } from "../../constants.js";
10
- import { encodeUrl, safeGenerateCrumb } from "../engine/helpers.js";
8
+ import { checkFormStatus, encodeUrl, safeGenerateCrumb } from "../engine/helpers.js";
11
9
  const logger = createLogger();
12
10
 
13
11
  /** @type {Record<string, string> | undefined} */
@@ -17,62 +15,74 @@ let webpackManifest;
17
15
  * @param {FormRequest | FormRequestPayload | null} request
18
16
  */
19
17
  export function context(request) {
20
- const manifestPath = join(config.get('publicDir'), 'assets-manifest.json');
21
- if (!webpackManifest) {
22
- try {
23
- // eslint-disable-next-line -- Allow JSON type 'any'
24
- webpackManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
25
- } catch {
26
- logger.error(`Webpack ${basename(manifestPath)} not found`);
27
- }
28
- }
29
18
  const {
30
19
  params,
31
- path,
32
- query = {},
33
- response,
34
- state
20
+ response
35
21
  } = request ?? {};
36
- const isForceAccess = 'force' in query;
37
- const isPreviewMode = path?.startsWith(PREVIEW_PATH_PREFIX);
22
+ const {
23
+ isPreview: isPreviewMode,
24
+ state: formState
25
+ } = checkFormStatus(params);
38
26
 
39
27
  // Only add the slug in to the context if the response is OK.
40
28
  // Footer meta links are not rendered when the slug is missing.
41
29
  const isResponseOK = !Boom.isBoom(response) && response?.statusCode === StatusCodes.OK;
30
+ const pluginStorage = request?.server.plugins['forms-engine-plugin'];
31
+ let consumerViewContext = {};
32
+ if (!pluginStorage) {
33
+ throw Error('context called before plugin registered');
34
+ }
35
+ if (!pluginStorage.baseLayoutPath) {
36
+ throw Error('Missing baseLayoutPath in plugin.options.nunjucks');
37
+ }
38
+ if ('viewContext' in pluginStorage) {
39
+ consumerViewContext = pluginStorage.viewContext(request);
40
+ }
42
41
 
43
42
  /** @type {ViewContext} */
44
43
  const ctx = {
44
+ // take consumers props first so we can override it
45
+ ...consumerViewContext,
46
+ baseLayoutPath: pluginStorage.baseLayoutPath,
45
47
  appVersion: pkg.version,
46
- assetPath: '/assets',
47
48
  config: {
48
49
  cdpEnvironment: config.get('cdpEnvironment'),
49
50
  designerUrl: config.get('designerUrl'),
50
51
  feedbackLink: encodeUrl(config.get('feedbackLink')),
51
52
  phaseTag: config.get('phaseTag'),
52
- serviceBannerText: config.get('serviceBannerText'),
53
53
  serviceName: config.get('serviceName'),
54
54
  serviceVersion: config.get('serviceVersion')
55
55
  },
56
56
  crumb: safeGenerateCrumb(request),
57
- cspNonce: request?.plugins.blankie?.nonces?.script,
58
- currentPath: request ? `${request.path}${request.url.search}` : undefined,
59
- previewMode: isPreviewMode ? params?.state : undefined,
60
- slug: isResponseOK ? params?.slug : undefined,
61
- getAssetPath: (asset = '') => {
62
- return `/${webpackManifest?.[asset] ?? asset}`;
63
- }
57
+ currentPath: `${request.path}${request.url.search}`,
58
+ previewMode: isPreviewMode ? formState : undefined,
59
+ slug: isResponseOK ? params?.slug : undefined
64
60
  };
65
- if (!isForceAccess) {
66
- ctx.config.googleAnalyticsTrackingId = config.get('googleAnalyticsTrackingId');
67
- if (typeof state?.cookieConsent === 'string') {
68
- ctx.cookieConsent = parseCookieConsent(state.cookieConsent);
61
+ return ctx;
62
+ }
63
+
64
+ /**
65
+ * Returns the context for the devtool. Consumers won't have access to this.
66
+ */
67
+ export function devtoolContext() {
68
+ const manifestPath = join(config.get('publicDir'), 'assets-manifest.json');
69
+ if (!webpackManifest) {
70
+ try {
71
+ // eslint-disable-next-line -- Allow JSON type 'any'
72
+ webpackManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
73
+ } catch {
74
+ logger.error(`Webpack ${basename(manifestPath)} not found`);
69
75
  }
70
76
  }
71
- return ctx;
77
+ return {
78
+ assetPath: '/assets',
79
+ getDxtAssetPath: (asset = '') => {
80
+ return `/${webpackManifest?.[asset] ?? asset}`;
81
+ }
82
+ };
72
83
  }
73
84
 
74
85
  /**
75
- * @import { CookieConsent } from '~/src/common/types.js'
76
86
  * @import { ViewContext } from '~/src/server/plugins/nunjucks/types.js'
77
87
  * @import { FormRequest, FormRequestPayload } from '~/src/server/routes/types.js'
78
88
  */
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":["readFileSync","basename","join","Boom","StatusCodes","pkg","type","parseCookieConsent","config","createLogger","PREVIEW_PATH_PREFIX","encodeUrl","safeGenerateCrumb","logger","webpackManifest","context","request","manifestPath","get","JSON","parse","error","params","path","query","response","state","isForceAccess","isPreviewMode","startsWith","isResponseOK","isBoom","statusCode","OK","ctx","appVersion","version","assetPath","cdpEnvironment","designerUrl","feedbackLink","phaseTag","serviceBannerText","serviceName","serviceVersion","crumb","cspNonce","plugins","blankie","nonces","script","currentPath","url","search","undefined","previewMode","slug","getAssetPath","asset","googleAnalyticsTrackingId","cookieConsent"],"sources":["../../../../src/server/plugins/nunjucks/context.js"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { basename, join } from 'node:path'\n\nimport Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\n\nimport pkg from '~/package.json' with { type: 'json' }\nimport { parseCookieConsent } from '~/src/common/cookies.js'\nimport { config } from '~/src/config/index.js'\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport { PREVIEW_PATH_PREFIX } from '~/src/server/constants.js'\nimport {\n encodeUrl,\n safeGenerateCrumb\n} from '~/src/server/plugins/engine/helpers.js'\n\nconst logger = createLogger()\n\n/** @type {Record<string, string> | undefined} */\nlet webpackManifest\n\n/**\n * @param {FormRequest | FormRequestPayload | null} request\n */\nexport function context(request) {\n const manifestPath = join(config.get('publicDir'), 'assets-manifest.json')\n\n if (!webpackManifest) {\n try {\n // eslint-disable-next-line -- Allow JSON type 'any'\n webpackManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n logger.error(`Webpack ${basename(manifestPath)} not found`)\n }\n }\n\n const { params, path, query = {}, response, state } = request ?? {}\n\n const isForceAccess = 'force' in query\n const isPreviewMode = path?.startsWith(PREVIEW_PATH_PREFIX)\n\n // Only add the slug in to the context if the response is OK.\n // Footer meta links are not rendered when the slug is missing.\n const isResponseOK =\n !Boom.isBoom(response) && response?.statusCode === StatusCodes.OK\n\n /** @type {ViewContext} */\n const ctx = {\n appVersion: pkg.version,\n assetPath: '/assets',\n config: {\n cdpEnvironment: config.get('cdpEnvironment'),\n designerUrl: config.get('designerUrl'),\n feedbackLink: encodeUrl(config.get('feedbackLink')),\n phaseTag: config.get('phaseTag'),\n serviceBannerText: config.get('serviceBannerText'),\n serviceName: config.get('serviceName'),\n serviceVersion: config.get('serviceVersion')\n },\n crumb: safeGenerateCrumb(request),\n cspNonce: request?.plugins.blankie?.nonces?.script,\n currentPath: request ? `${request.path}${request.url.search}` : undefined,\n previewMode: isPreviewMode ? params?.state : undefined,\n slug: isResponseOK ? params?.slug : undefined,\n\n getAssetPath: (asset = '') => {\n return `/${webpackManifest?.[asset] ?? asset}`\n }\n }\n\n if (!isForceAccess) {\n ctx.config.googleAnalyticsTrackingId = config.get(\n 'googleAnalyticsTrackingId'\n )\n\n if (typeof state?.cookieConsent === 'string') {\n ctx.cookieConsent = parseCookieConsent(state.cookieConsent)\n }\n }\n\n return ctx\n}\n\n/**\n * @import { CookieConsent } from '~/src/common/types.js'\n * @import { ViewContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormRequest, FormRequestPayload } from '~/src/server/routes/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"context.js","names":["readFileSync","basename","join","Boom","StatusCodes","pkg","type","config","createLogger","checkFormStatus","encodeUrl","safeGenerateCrumb","logger","webpackManifest","context","request","params","response","isPreview","isPreviewMode","state","formState","isResponseOK","isBoom","statusCode","OK","pluginStorage","server","plugins","consumerViewContext","Error","baseLayoutPath","viewContext","ctx","appVersion","version","cdpEnvironment","get","designerUrl","feedbackLink","phaseTag","serviceName","serviceVersion","crumb","currentPath","path","url","search","previewMode","undefined","slug","devtoolContext","manifestPath","JSON","parse","error","assetPath","getDxtAssetPath","asset"],"sources":["../../../../src/server/plugins/nunjucks/context.js"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { basename, join } from 'node:path'\n\nimport Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\n\nimport pkg from '~/package.json' with { type: 'json' }\nimport { config } from '~/src/config/index.js'\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport {\n checkFormStatus,\n encodeUrl,\n safeGenerateCrumb\n} from '~/src/server/plugins/engine/helpers.js'\n\nconst logger = createLogger()\n\n/** @type {Record<string, string> | undefined} */\nlet webpackManifest\n\n/**\n * @param {FormRequest | FormRequestPayload | null} request\n */\nexport function context(request) {\n const { params, response } = request ?? {}\n\n const { isPreview: isPreviewMode, state: formState } = checkFormStatus(params)\n\n // Only add the slug in to the context if the response is OK.\n // Footer meta links are not rendered when the slug is missing.\n const isResponseOK =\n !Boom.isBoom(response) && response?.statusCode === StatusCodes.OK\n\n const pluginStorage = request?.server.plugins['forms-engine-plugin']\n let consumerViewContext = {}\n\n if (!pluginStorage) {\n throw Error('context called before plugin registered')\n }\n\n if (!pluginStorage.baseLayoutPath) {\n throw Error('Missing baseLayoutPath in plugin.options.nunjucks')\n }\n\n if ('viewContext' in pluginStorage) {\n consumerViewContext = pluginStorage.viewContext(request)\n }\n\n /** @type {ViewContext} */\n const ctx = {\n // take consumers props first so we can override it\n ...consumerViewContext,\n baseLayoutPath: pluginStorage.baseLayoutPath,\n appVersion: pkg.version,\n config: {\n cdpEnvironment: config.get('cdpEnvironment'),\n designerUrl: config.get('designerUrl'),\n feedbackLink: encodeUrl(config.get('feedbackLink')),\n phaseTag: config.get('phaseTag'),\n serviceName: config.get('serviceName'),\n serviceVersion: config.get('serviceVersion')\n },\n crumb: safeGenerateCrumb(request),\n currentPath: `${request.path}${request.url.search}`,\n previewMode: isPreviewMode ? formState : undefined,\n slug: isResponseOK ? params?.slug : undefined\n }\n\n return ctx\n}\n\n/**\n * Returns the context for the devtool. Consumers won't have access to this.\n */\nexport function devtoolContext() {\n const manifestPath = join(config.get('publicDir'), 'assets-manifest.json')\n\n if (!webpackManifest) {\n try {\n // eslint-disable-next-line -- Allow JSON type 'any'\n webpackManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n logger.error(`Webpack ${basename(manifestPath)} not found`)\n }\n }\n\n return {\n assetPath: '/assets',\n getDxtAssetPath: (asset = '') => {\n return `/${webpackManifest?.[asset] ?? asset}`\n }\n }\n}\n\n/**\n * @import { ViewContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormRequest, FormRequestPayload } from '~/src/server/routes/types.js'\n */\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,SAAS;AACtC,SAASC,QAAQ,EAAEC,IAAI,QAAQ,WAAW;AAE1C,OAAOC,IAAI,MAAM,YAAY;AAC7B,SAASC,WAAW,QAAQ,mBAAmB;AAE/C,OAAOC,GAAG,wCAA8BC,IAAI,EAAE,MAAM;AACpD,SAASC,MAAM;AACf,SAASC,YAAY;AACrB,SACEC,eAAe,EACfC,SAAS,EACTC,iBAAiB;AAGnB,MAAMC,MAAM,GAAGJ,YAAY,CAAC,CAAC;;AAE7B;AACA,IAAIK,eAAe;;AAEnB;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAACC,OAAO,EAAE;EAC/B,MAAM;IAAEC,MAAM;IAAEC;EAAS,CAAC,GAAGF,OAAO,IAAI,CAAC,CAAC;EAE1C,MAAM;IAAEG,SAAS,EAAEC,aAAa;IAAEC,KAAK,EAAEC;EAAU,CAAC,GAAGZ,eAAe,CAACO,MAAM,CAAC;;EAE9E;EACA;EACA,MAAMM,YAAY,GAChB,CAACnB,IAAI,CAACoB,MAAM,CAACN,QAAQ,CAAC,IAAIA,QAAQ,EAAEO,UAAU,KAAKpB,WAAW,CAACqB,EAAE;EAEnE,MAAMC,aAAa,GAAGX,OAAO,EAAEY,MAAM,CAACC,OAAO,CAAC,qBAAqB,CAAC;EACpE,IAAIC,mBAAmB,GAAG,CAAC,CAAC;EAE5B,IAAI,CAACH,aAAa,EAAE;IAClB,MAAMI,KAAK,CAAC,yCAAyC,CAAC;EACxD;EAEA,IAAI,CAACJ,aAAa,CAACK,cAAc,EAAE;IACjC,MAAMD,KAAK,CAAC,mDAAmD,CAAC;EAClE;EAEA,IAAI,aAAa,IAAIJ,aAAa,EAAE;IAClCG,mBAAmB,GAAGH,aAAa,CAACM,WAAW,CAACjB,OAAO,CAAC;EAC1D;;EAEA;EACA,MAAMkB,GAAG,GAAG;IACV;IACA,GAAGJ,mBAAmB;IACtBE,cAAc,EAAEL,aAAa,CAACK,cAAc;IAC5CG,UAAU,EAAE7B,GAAG,CAAC8B,OAAO;IACvB5B,MAAM,EAAE;MACN6B,cAAc,EAAE7B,MAAM,CAAC8B,GAAG,CAAC,gBAAgB,CAAC;MAC5CC,WAAW,EAAE/B,MAAM,CAAC8B,GAAG,CAAC,aAAa,CAAC;MACtCE,YAAY,EAAE7B,SAAS,CAACH,MAAM,CAAC8B,GAAG,CAAC,cAAc,CAAC,CAAC;MACnDG,QAAQ,EAAEjC,MAAM,CAAC8B,GAAG,CAAC,UAAU,CAAC;MAChCI,WAAW,EAAElC,MAAM,CAAC8B,GAAG,CAAC,aAAa,CAAC;MACtCK,cAAc,EAAEnC,MAAM,CAAC8B,GAAG,CAAC,gBAAgB;IAC7C,CAAC;IACDM,KAAK,EAAEhC,iBAAiB,CAACI,OAAO,CAAC;IACjC6B,WAAW,EAAE,GAAG7B,OAAO,CAAC8B,IAAI,GAAG9B,OAAO,CAAC+B,GAAG,CAACC,MAAM,EAAE;IACnDC,WAAW,EAAE7B,aAAa,GAAGE,SAAS,GAAG4B,SAAS;IAClDC,IAAI,EAAE5B,YAAY,GAAGN,MAAM,EAAEkC,IAAI,GAAGD;EACtC,CAAC;EAED,OAAOhB,GAAG;AACZ;;AAEA;AACA;AACA;AACA,OAAO,SAASkB,cAAcA,CAAA,EAAG;EAC/B,MAAMC,YAAY,GAAGlD,IAAI,CAACK,MAAM,CAAC8B,GAAG,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;EAE1E,IAAI,CAACxB,eAAe,EAAE;IACpB,IAAI;MACF;MACAA,eAAe,GAAGwC,IAAI,CAACC,KAAK,CAACtD,YAAY,CAACoD,YAAY,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC,MAAM;MACNxC,MAAM,CAAC2C,KAAK,CAAC,WAAWtD,QAAQ,CAACmD,YAAY,CAAC,YAAY,CAAC;IAC7D;EACF;EAEA,OAAO;IACLI,SAAS,EAAE,SAAS;IACpBC,eAAe,EAAEA,CAACC,KAAK,GAAG,EAAE,KAAK;MAC/B,OAAO,IAAI7C,eAAe,GAAG6C,KAAK,CAAC,IAAIA,KAAK,EAAE;IAChD;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -1,24 +1,22 @@
1
1
  import { tmpdir } from 'node:os';
2
- import { config } from "../../../config/index.js";
3
- import { encodeUrl } from "../engine/helpers.js";
4
- import { context } from "./context.js";
2
+ import { context, devtoolContext } from "./context.js";
5
3
  describe('Nunjucks context', () => {
6
4
  beforeEach(() => jest.resetModules());
7
5
  describe('Asset path', () => {
8
6
  it("should include 'assetPath' for GOV.UK Frontend icons", () => {
9
7
  const {
10
8
  assetPath
11
- } = context(null);
9
+ } = devtoolContext();
12
10
  expect(assetPath).toBe('/assets');
13
11
  });
14
12
  });
15
13
  describe('Asset helper', () => {
16
14
  it("should locate 'assets-manifest.json' assets", () => {
17
15
  const {
18
- getAssetPath
19
- } = context(null);
20
- expect(getAssetPath('example.scss')).toBe('/stylesheets/example.xxxxxxx.min.css');
21
- expect(getAssetPath('example.mjs')).toBe('/javascripts/example.xxxxxxx.min.js');
16
+ getDxtAssetPath
17
+ } = devtoolContext();
18
+ expect(getDxtAssetPath('example.scss')).toBe('/stylesheets/example.xxxxxxx.min.css');
19
+ expect(getDxtAssetPath('example.mjs')).toBe('/javascripts/example.xxxxxxx.min.js');
22
20
  });
23
21
  it("should return path when 'assets-manifest.json' is missing", async () => {
24
22
  await jest.isolateModulesAsync(async () => {
@@ -28,41 +26,32 @@ describe('Nunjucks context', () => {
28
26
 
29
27
  // Import when isolated to avoid cache
30
28
  const {
31
- context
29
+ devtoolContext
32
30
  } = await import("./context.js");
33
31
 
34
32
  // Update config for missing manifest
35
33
  config.set('publicDir', tmpdir());
36
34
  const {
37
- getAssetPath
38
- } = context(null);
35
+ getDxtAssetPath
36
+ } = devtoolContext();
39
37
 
40
38
  // Uses original paths when missing
41
- expect(getAssetPath('example.scss')).toBe('/example.scss');
42
- expect(getAssetPath('example.mjs')).toBe('/example.mjs');
39
+ expect(getDxtAssetPath('example.scss')).toBe('/example.scss');
40
+ expect(getDxtAssetPath('example.mjs')).toBe('/example.mjs');
43
41
  });
44
42
  });
45
43
  it('should return path to unknown assets', () => {
46
44
  const {
47
- getAssetPath
48
- } = context(null);
49
- expect(getAssetPath()).toBe('/');
50
- expect(getAssetPath('example.jpg')).toBe('/example.jpg');
51
- expect(getAssetPath('example.gif')).toBe('/example.gif');
45
+ getDxtAssetPath
46
+ } = devtoolContext();
47
+ expect(getDxtAssetPath()).toBe('/');
48
+ expect(getDxtAssetPath('example.jpg')).toBe('/example.jpg');
49
+ expect(getDxtAssetPath('example.gif')).toBe('/example.gif');
52
50
  });
53
51
  });
54
52
  describe('Config', () => {
55
53
  it('should include environment, phase tag and service info', () => {
56
- const ctx = context(null);
57
- expect(ctx.config).toEqual(expect.objectContaining({
58
- cdpEnvironment: config.get('cdpEnvironment'),
59
- feedbackLink: encodeUrl(config.get('feedbackLink')),
60
- googleAnalyticsTrackingId: config.get('googleAnalyticsTrackingId'),
61
- phaseTag: config.get('phaseTag'),
62
- serviceBannerText: config.get('serviceBannerText'),
63
- serviceName: config.get('serviceName'),
64
- serviceVersion: config.get('serviceVersion')
65
- }));
54
+ expect(() => context(null)).toThrow('context called before plugin registered');
66
55
  });
67
56
  });
68
57
  describe('Crumb', () => {
@@ -75,6 +64,9 @@ describe('Nunjucks context', () => {
75
64
  plugins: {
76
65
  crumb: {
77
66
  generate: jest.fn()
67
+ },
68
+ 'forms-engine-plugin': {
69
+ baseLayoutPath: 'randomValue'
78
70
  }
79
71
  }
80
72
  },
@@ -104,6 +96,9 @@ describe('Nunjucks context', () => {
104
96
  plugins: {
105
97
  crumb: {
106
98
  generate: jest.fn().mockReturnValue(mockCrumb)
99
+ },
100
+ 'forms-engine-plugin': {
101
+ baseLayoutPath: 'randomValue'
107
102
  }
108
103
  }
109
104
  },
@@ -1 +1 @@
1
- {"version":3,"file":"context.test.js","names":["tmpdir","config","encodeUrl","context","describe","beforeEach","jest","resetModules","it","assetPath","expect","toBe","getAssetPath","isolateModulesAsync","set","ctx","toEqual","objectContaining","cdpEnvironment","get","feedbackLink","googleAnalyticsTrackingId","phaseTag","serviceBannerText","serviceName","serviceVersion","malformedRequest","server","plugins","crumb","generate","fn","route","settings","path","url","search","toBeUndefined","not","toHaveBeenCalled","mockCrumb","validRequest","mockReturnValue","state","toHaveBeenCalledWith"],"sources":["../../../../src/server/plugins/nunjucks/context.test.js"],"sourcesContent":["import { tmpdir } from 'node:os'\n\nimport { config } from '~/src/config/index.js'\nimport { encodeUrl } from '~/src/server/plugins/engine/helpers.js'\nimport { context } from '~/src/server/plugins/nunjucks/context.js'\n\ndescribe('Nunjucks context', () => {\n beforeEach(() => jest.resetModules())\n\n describe('Asset path', () => {\n it(\"should include 'assetPath' for GOV.UK Frontend icons\", () => {\n const { assetPath } = context(null)\n expect(assetPath).toBe('/assets')\n })\n })\n\n describe('Asset helper', () => {\n it(\"should locate 'assets-manifest.json' assets\", () => {\n const { getAssetPath } = context(null)\n\n expect(getAssetPath('example.scss')).toBe(\n '/stylesheets/example.xxxxxxx.min.css'\n )\n\n expect(getAssetPath('example.mjs')).toBe(\n '/javascripts/example.xxxxxxx.min.js'\n )\n })\n\n it(\"should return path when 'assets-manifest.json' is missing\", async () => {\n await jest.isolateModulesAsync(async () => {\n const { config } = await import('~/src/config/index.js')\n\n // Import when isolated to avoid cache\n const { context } = await import(\n '~/src/server/plugins/nunjucks/context.js'\n )\n\n // Update config for missing manifest\n config.set('publicDir', tmpdir())\n const { getAssetPath } = context(null)\n\n // Uses original paths when missing\n expect(getAssetPath('example.scss')).toBe('/example.scss')\n expect(getAssetPath('example.mjs')).toBe('/example.mjs')\n })\n })\n\n it('should return path to unknown assets', () => {\n const { getAssetPath } = context(null)\n\n expect(getAssetPath()).toBe('/')\n expect(getAssetPath('example.jpg')).toBe('/example.jpg')\n expect(getAssetPath('example.gif')).toBe('/example.gif')\n })\n })\n\n describe('Config', () => {\n it('should include environment, phase tag and service info', () => {\n const ctx = context(null)\n\n expect(ctx.config).toEqual(\n expect.objectContaining({\n cdpEnvironment: config.get('cdpEnvironment'),\n feedbackLink: encodeUrl(config.get('feedbackLink')),\n googleAnalyticsTrackingId: config.get('googleAnalyticsTrackingId'),\n phaseTag: config.get('phaseTag'),\n serviceBannerText: config.get('serviceBannerText'),\n serviceName: config.get('serviceName'),\n serviceVersion: config.get('serviceVersion')\n })\n )\n })\n })\n\n describe('Crumb', () => {\n it('should handle malformed requests with missing state', () => {\n // While state should always exist in a valid Hapi request (it holds cookies),\n // we've seen malformed requests in production where it's missing\n const malformedRequest = /** @type {FormRequest} */ (\n /** @type {unknown} */ ({\n server: {\n plugins: {\n crumb: {\n generate: jest.fn()\n }\n }\n },\n plugins: {},\n route: {\n settings: {\n plugins: {}\n }\n },\n path: '/test',\n url: { search: '' }\n // state intentionally omitted to test real malformed requests\n })\n )\n\n const { crumb } = context(malformedRequest)\n expect(crumb).toBeUndefined()\n expect(\n malformedRequest.server.plugins.crumb.generate\n ).not.toHaveBeenCalled()\n })\n\n it('should generate crumb when state exists', () => {\n const mockCrumb = 'generated-crumb-value'\n const validRequest = /** @type {FormRequest} */ (\n /** @type {unknown} */ ({\n server: {\n plugins: {\n crumb: {\n generate: jest.fn().mockReturnValue(mockCrumb)\n }\n }\n },\n plugins: {},\n route: {\n settings: {\n plugins: {}\n }\n },\n path: '/test',\n url: { search: '' },\n state: {}\n })\n )\n\n const { crumb } = context(validRequest)\n expect(crumb).toBe(mockCrumb)\n expect(validRequest.server.plugins.crumb.generate).toHaveBeenCalledWith(\n validRequest\n )\n })\n })\n})\n\n/**\n * @import { FormRequest } from '~/src/server/routes/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"context.test.js","names":["tmpdir","context","devtoolContext","describe","beforeEach","jest","resetModules","it","assetPath","expect","toBe","getDxtAssetPath","isolateModulesAsync","config","set","toThrow","malformedRequest","server","plugins","crumb","generate","fn","baseLayoutPath","route","settings","path","url","search","toBeUndefined","not","toHaveBeenCalled","mockCrumb","validRequest","mockReturnValue","state","toHaveBeenCalledWith"],"sources":["../../../../src/server/plugins/nunjucks/context.test.js"],"sourcesContent":["import { tmpdir } from 'node:os'\n\nimport {\n context,\n devtoolContext\n} from '~/src/server/plugins/nunjucks/context.js'\n\ndescribe('Nunjucks context', () => {\n beforeEach(() => jest.resetModules())\n\n describe('Asset path', () => {\n it(\"should include 'assetPath' for GOV.UK Frontend icons\", () => {\n const { assetPath } = devtoolContext()\n expect(assetPath).toBe('/assets')\n })\n })\n\n describe('Asset helper', () => {\n it(\"should locate 'assets-manifest.json' assets\", () => {\n const { getDxtAssetPath } = devtoolContext()\n\n expect(getDxtAssetPath('example.scss')).toBe(\n '/stylesheets/example.xxxxxxx.min.css'\n )\n\n expect(getDxtAssetPath('example.mjs')).toBe(\n '/javascripts/example.xxxxxxx.min.js'\n )\n })\n\n it(\"should return path when 'assets-manifest.json' is missing\", async () => {\n await jest.isolateModulesAsync(async () => {\n const { config } = await import('~/src/config/index.js')\n\n // Import when isolated to avoid cache\n const { devtoolContext } = await import(\n '~/src/server/plugins/nunjucks/context.js'\n )\n\n // Update config for missing manifest\n config.set('publicDir', tmpdir())\n const { getDxtAssetPath } = devtoolContext()\n\n // Uses original paths when missing\n expect(getDxtAssetPath('example.scss')).toBe('/example.scss')\n expect(getDxtAssetPath('example.mjs')).toBe('/example.mjs')\n })\n })\n\n it('should return path to unknown assets', () => {\n const { getDxtAssetPath } = devtoolContext()\n\n expect(getDxtAssetPath()).toBe('/')\n expect(getDxtAssetPath('example.jpg')).toBe('/example.jpg')\n expect(getDxtAssetPath('example.gif')).toBe('/example.gif')\n })\n })\n\n describe('Config', () => {\n it('should include environment, phase tag and service info', () => {\n expect(() => context(null)).toThrow(\n 'context called before plugin registered'\n )\n })\n })\n\n describe('Crumb', () => {\n it('should handle malformed requests with missing state', () => {\n // While state should always exist in a valid Hapi request (it holds cookies),\n // we've seen malformed requests in production where it's missing\n const malformedRequest = /** @type {FormRequest} */ (\n /** @type {unknown} */ ({\n server: {\n plugins: {\n crumb: {\n generate: jest.fn()\n },\n 'forms-engine-plugin': {\n baseLayoutPath: 'randomValue'\n }\n }\n },\n plugins: {},\n route: {\n settings: {\n plugins: {}\n }\n },\n path: '/test',\n url: { search: '' }\n // state intentionally omitted to test real malformed requests\n })\n )\n\n const { crumb } = context(malformedRequest)\n expect(crumb).toBeUndefined()\n expect(\n malformedRequest.server.plugins.crumb.generate\n ).not.toHaveBeenCalled()\n })\n\n it('should generate crumb when state exists', () => {\n const mockCrumb = 'generated-crumb-value'\n const validRequest = /** @type {FormRequest} */ (\n /** @type {unknown} */ ({\n server: {\n plugins: {\n crumb: {\n generate: jest.fn().mockReturnValue(mockCrumb)\n },\n 'forms-engine-plugin': {\n baseLayoutPath: 'randomValue'\n }\n }\n },\n plugins: {},\n route: {\n settings: {\n plugins: {}\n }\n },\n path: '/test',\n url: { search: '' },\n state: {}\n })\n )\n\n const { crumb } = context(validRequest)\n expect(crumb).toBe(mockCrumb)\n expect(validRequest.server.plugins.crumb.generate).toHaveBeenCalledWith(\n validRequest\n )\n })\n })\n})\n\n/**\n * @import { FormRequest } from '~/src/server/routes/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -75,7 +75,8 @@ describe('Nunjucks environment', () => {
75
75
  content: 'Some {{ context.someData }} content'
76
76
  }
77
77
  };
78
- const result = checkComponentTemplates.call(nunjucksCtx, component);
78
+ const result = /** @type {{ model: { content: string } }} */
79
+ checkComponentTemplates.call(nunjucksCtx, component);
79
80
  expect(helpers.evaluateTemplate).toHaveBeenCalledWith('Some {{ context.someData }} content', formContext);
80
81
  expect(result.model.content).toBe('evaluated-Some {{ context.someData }} content');
81
82
  });
@@ -98,7 +99,8 @@ describe('Nunjucks environment', () => {
98
99
  content: nonStringContent
99
100
  }
100
101
  };
101
- const result = checkComponentTemplates.call(nunjucksCtx, component);
102
+ const result = /** @type {{ model: { content: string } }} */
103
+ checkComponentTemplates.call(nunjucksCtx, component);
102
104
  expect(helpers.evaluateTemplate).not.toHaveBeenCalled();
103
105
  expect(result.model.content).toBe(nonStringContent);
104
106
  });
@@ -119,7 +121,8 @@ describe('Nunjucks environment', () => {
119
121
  }
120
122
  }
121
123
  };
122
- const result = checkComponentTemplates.call(nunjucksCtx, component);
124
+ const result = /** @type {{ model: { label?: { text: string } } }} */
125
+ checkComponentTemplates.call(nunjucksCtx, component);
123
126
  expect(helpers.evaluateTemplate).toHaveBeenCalledWith('Label with {{ context.someData }}', formContext);
124
127
  expect(result.model.label?.text).toBe('evaluated-Label with {{ context.someData }}');
125
128
  });
@@ -1 +1 @@
1
- {"version":3,"file":"enviroment.test.js","names":["helpers","environment","describe","checkErrorTemplates","beforeEach","getGlobal","jest","spyOn","mockImplementation","text","afterEach","restoreAllMocks","test","nunjucksCtx","ctx","errors","result","call","expect","toBe","evaluateTemplate","not","toHaveBeenCalled","formContext","someData","context","toHaveBeenCalledTimes","toHaveBeenCalledWith","toEqual","checkComponentTemplates","component","type","isFormComponent","model","content","nonStringContent","some","label","evaluateFunc","template"],"sources":["../../../../src/server/plugins/nunjucks/enviroment.test.js"],"sourcesContent":["import * as helpers from '~/src/server/plugins/engine/helpers.js'\nimport { environment } from '~/src/server/plugins/nunjucks/environment.js'\n\ndescribe('Nunjucks environment', () => {\n describe('checkErrorTemplates function', () => {\n /** @type {Function} */\n let checkErrorTemplates\n\n beforeEach(() => {\n checkErrorTemplates = environment.getGlobal('checkErrorTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('returns errors unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(result).toBe(errors)\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n })\n\n test('evaluates error texts when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledTimes(2)\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 1',\n formContext\n )\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 2',\n formContext\n )\n\n expect(result).toEqual([\n { text: 'evaluated-Error 1' },\n { text: 'evaluated-Error 2' }\n ])\n })\n })\n\n describe('checkComponentTemplates function', () => {\n /** @type {Function} */\n let checkComponentTemplates\n\n beforeEach(() => {\n checkComponentTemplates = environment.getGlobal('checkComponentTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: 'Some {{ context.someData }} content'\n }\n }\n\n const result = checkComponentTemplates.call(nunjucksCtx, component)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Some {{ context.someData }} content',\n formContext\n )\n expect(result.model.content).toBe(\n 'evaluated-Some {{ context.someData }} content'\n )\n })\n\n test('does not evaluate non-string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const nonStringContent = { some: 'object' }\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: nonStringContent\n }\n }\n\n const result = checkComponentTemplates.call(nunjucksCtx, component)\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result.model.content).toBe(nonStringContent)\n })\n\n test('evaluates label text for form components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n isFormComponent: true,\n model: {\n label: {\n text: 'Label with {{ context.someData }}'\n }\n }\n }\n\n const result = checkComponentTemplates.call(nunjucksCtx, component)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Label with {{ context.someData }}',\n formContext\n )\n\n expect(result.model.label?.text).toBe(\n 'evaluated-Label with {{ context.someData }}'\n )\n })\n })\n\n describe('evaluate function', () => {\n /** @type {Function} */\n let evaluateFunc\n\n beforeEach(() => {\n evaluateFunc = environment.getGlobal('evaluate')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates template when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n template,\n formContext\n )\n expect(result).toBe('evaluated-Template with {{ context.someData }}')\n })\n\n test('returns template unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result).toBe(template)\n })\n })\n})\n\n/*\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"enviroment.test.js","names":["helpers","environment","describe","checkErrorTemplates","beforeEach","getGlobal","jest","spyOn","mockImplementation","text","afterEach","restoreAllMocks","test","nunjucksCtx","ctx","errors","result","call","expect","toBe","evaluateTemplate","not","toHaveBeenCalled","formContext","someData","context","toHaveBeenCalledTimes","toHaveBeenCalledWith","toEqual","checkComponentTemplates","component","type","isFormComponent","model","content","nonStringContent","some","label","evaluateFunc","template"],"sources":["../../../../src/server/plugins/nunjucks/enviroment.test.js"],"sourcesContent":["import * as helpers from '~/src/server/plugins/engine/helpers.js'\nimport { environment } from '~/src/server/plugins/nunjucks/environment.js'\n\ndescribe('Nunjucks environment', () => {\n describe('checkErrorTemplates function', () => {\n /** @type {Function} */\n let checkErrorTemplates\n\n beforeEach(() => {\n checkErrorTemplates = environment.getGlobal('checkErrorTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('returns errors unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(result).toBe(errors)\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n })\n\n test('evaluates error texts when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledTimes(2)\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 1',\n formContext\n )\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 2',\n formContext\n )\n\n expect(result).toEqual([\n { text: 'evaluated-Error 1' },\n { text: 'evaluated-Error 2' }\n ])\n })\n })\n\n describe('checkComponentTemplates function', () => {\n /** @type {Function} */\n let checkComponentTemplates\n\n beforeEach(() => {\n checkComponentTemplates = environment.getGlobal('checkComponentTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: 'Some {{ context.someData }} content'\n }\n }\n\n const result = /** @type {{ model: { content: string } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Some {{ context.someData }} content',\n formContext\n )\n expect(result.model.content).toBe(\n 'evaluated-Some {{ context.someData }} content'\n )\n })\n\n test('does not evaluate non-string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const nonStringContent = { some: 'object' }\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: nonStringContent\n }\n }\n\n const result = /** @type {{ model: { content: string } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result.model.content).toBe(nonStringContent)\n })\n\n test('evaluates label text for form components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n isFormComponent: true,\n model: {\n label: {\n text: 'Label with {{ context.someData }}'\n }\n }\n }\n\n const result = /** @type {{ model: { label?: { text: string } } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Label with {{ context.someData }}',\n formContext\n )\n\n expect(result.model.label?.text).toBe(\n 'evaluated-Label with {{ context.someData }}'\n )\n })\n })\n\n describe('evaluate function', () => {\n /** @type {Function} */\n let evaluateFunc\n\n beforeEach(() => {\n evaluateFunc = environment.getGlobal('evaluate')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates template when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n template,\n formContext\n )\n expect(result).toBe('evaluated-Template with {{ context.someData }}')\n })\n\n test('returns template unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result).toBe(template)\n })\n })\n})\n\n/*\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -12,16 +12,15 @@
12
12
  /**
13
13
  * @typedef {object} ViewContext - Nunjucks view context
14
14
  * @property {string} appVersion - Application version
15
- * @property {string} assetPath - Asset path
15
+ * @property {string} [baseLayoutPath] - Base layout path
16
16
  * @property {Partial<Config>} config - Application config properties
17
- * @property {CookieConsent} [cookieConsent] - Cookie consent preferences
18
17
  * @property {string} [crumb] - Cross-Site Request Forgery (CSRF) token
19
18
  * @property {string} [cspNonce] - Content Security Policy (CSP) nonce
20
19
  * @property {string} [currentPath] - Current path
21
20
  * @property {string} [previewMode] - Preview mode
22
21
  * @property {string} [slug] - Form slug
23
- * @property {(asset?: string) => string} getAssetPath - Asset path resolver
24
22
  * @property {FormContext} [context] - the current form context
23
+ * @property {PluginOptions['viewContext']} [injectedViewContext] - the current form context
25
24
  */
26
25
 
27
26
  /**
@@ -34,8 +33,8 @@
34
33
  */
35
34
 
36
35
  /**
37
- * @import { CookieConsent } from '~/src/common/types.js'
38
36
  * @import { config } from '~/src/config/index.js'
39
37
  * @import { FormContext } from '~/src/server/plugins/engine/types.js'
38
+ * @import { PluginOptions } from '~/src/server/plugins/engine/plugin.js'
40
39
  */
41
40
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/nunjucks/types.js"],"sourcesContent":["/**\n * @typedef {object} MacroOptions\n * @property {string} [callBlock] - Nunjucks call block content\n * @property {object} [params] - Nunjucks macro params\n */\n\n/**\n * @typedef {object} RenderOptions\n * @property {object} [context] - Nunjucks render context\n */\n\n/**\n * @typedef {object} ViewContext - Nunjucks view context\n * @property {string} appVersion - Application version\n * @property {string} assetPath - Asset path\n * @property {Partial<Config>} config - Application config properties\n * @property {CookieConsent} [cookieConsent] - Cookie consent preferences\n * @property {string} [crumb] - Cross-Site Request Forgery (CSRF) token\n * @property {string} [cspNonce] - Content Security Policy (CSP) nonce\n * @property {string} [currentPath] - Current path\n * @property {string} [previewMode] - Preview mode\n * @property {string} [slug] - Form slug\n * @property {(asset?: string) => string} getAssetPath - Asset path resolver\n * @property {FormContext} [context] - the current form context\n */\n\n/**\n * @typedef {ReturnType<typeof config['getProperties']>} Config - Application config properties\n */\n\n/**\n * @typedef NunjucksContext\n * @property {ViewContext} ctx - the current nunjucks view context\n */\n\n/**\n * @import { CookieConsent } from '~/src/common/types.js'\n * @import { config } from '~/src/config/index.js'\n * @import { FormContext } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/nunjucks/types.js"],"sourcesContent":["/**\n * @typedef {object} MacroOptions\n * @property {string} [callBlock] - Nunjucks call block content\n * @property {object} [params] - Nunjucks macro params\n */\n\n/**\n * @typedef {object} RenderOptions\n * @property {object} [context] - Nunjucks render context\n */\n\n/**\n * @typedef {object} ViewContext - Nunjucks view context\n * @property {string} appVersion - Application version\n * @property {string} [baseLayoutPath] - Base layout path\n * @property {Partial<Config>} config - Application config properties\n * @property {string} [crumb] - Cross-Site Request Forgery (CSRF) token\n * @property {string} [cspNonce] - Content Security Policy (CSP) nonce\n * @property {string} [currentPath] - Current path\n * @property {string} [previewMode] - Preview mode\n * @property {string} [slug] - Form slug\n * @property {FormContext} [context] - the current form context\n * @property {PluginOptions['viewContext']} [injectedViewContext] - the current form context\n */\n\n/**\n * @typedef {ReturnType<typeof config['getProperties']>} Config - Application config properties\n */\n\n/**\n * @typedef NunjucksContext\n * @property {ViewContext} ctx - the current nunjucks view context\n */\n\n/**\n * @import { config } from '~/src/config/index.js'\n * @import { FormContext } from '~/src/server/plugins/engine/types.js'\n * @import { PluginOptions } from '~/src/server/plugins/engine/plugin.js'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","ignoreList":[]}
@@ -1,3 +1,2 @@
1
1
  export { default as publicRoutes } from "./public.js";
2
- export { default as healthRoute } from "./health.js";
3
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["default","publicRoutes","healthRoute"],"sources":["../../../src/server/routes/index.ts"],"sourcesContent":["export { default as publicRoutes } from '~/src/server/routes/public.js'\nexport { default as healthRoute } from '~/src/server/routes/health.js'\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY;AAChC,SAASD,OAAO,IAAIE,WAAW","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["default","publicRoutes"],"sources":["../../../src/server/routes/index.ts"],"sourcesContent":["export { default as publicRoutes } from '~/src/server/routes/public.js'\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,YAAY","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ import Joi from 'joi';
2
+ export function convertToLanguageMessages(extLanguageMessages) {
3
+ return extLanguageMessages;
4
+ }
5
+ export function createJoiExpression(expr) {
6
+ return Joi.expression(expr);
7
+ }
8
+ //# sourceMappingURL=type-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-utils.js","names":["Joi","convertToLanguageMessages","extLanguageMessages","createJoiExpression","expr","expression"],"sources":["../../../src/server/utils/type-utils.ts"],"sourcesContent":["import Joi, {\n type JoiExpression,\n type LanguageMessages,\n type LanguageMessagesExt\n} from 'joi'\n\nexport function convertToLanguageMessages(\n extLanguageMessages: LanguageMessagesExt\n): LanguageMessages {\n return extLanguageMessages as unknown as LanguageMessages\n}\n\nexport function createJoiExpression(expr: string): JoiExpression {\n return Joi.expression(expr) as unknown as JoiExpression\n}\n"],"mappings":"AAAA,OAAOA,GAAG,MAIH,KAAK;AAEZ,OAAO,SAASC,yBAAyBA,CACvCC,mBAAwC,EACtB;EAClB,OAAOA,mBAAmB;AAC5B;AAEA,OAAO,SAASC,mBAAmBA,CAACC,IAAY,EAAiB;EAC/D,OAAOJ,GAAG,CAACK,UAAU,CAACD,IAAI,CAAC;AAC7B","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/unified-signatures */\n\nimport { type Plugin } from '@hapi/hapi'\nimport { type ServerYar, type Yar } from '@hapi/yar'\nimport { type Logger } from 'pino'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n type FormRequest,\n type FormRequestPayload\n} from '~/src/server/routes/types.js'\nimport { type CacheService } from '~/src/server/services/index.js'\n\ndeclare module '@hapi/hapi' {\n // Here we are decorating Hapi interface types with\n // props from plugins which doesn't export @types\n interface PluginProperties {\n crumb: {\n generate?: (request: Request | FormRequest | FormRequestPayload) => string\n }\n 'forms-engine-plugin': {\n cacheService: CacheService\n }\n }\n\n interface PluginsStates {\n blankie?: {\n nonces?: {\n script?: string\n style?: string\n }\n }\n }\n\n interface Request {\n logger: Logger\n yar: Yar\n }\n\n interface RequestApplicationState {\n model?: FormModel\n }\n\n interface Server {\n logger: Logger\n yar: ServerYar\n }\n\n interface ServerApplicationState {\n model?: FormModel\n models: Map<string, { model: FormModel; updatedAt: Date }>\n }\n}\n\ndeclare module '@hapi/scooter' {\n declare const hapiScooter: {\n plugin: Plugin\n }\n\n export = hapiScooter\n}\n\ndeclare module 'blankie' {\n declare const blankie: {\n plugin: Plugin<Record<string, boolean | string | string[]>>\n }\n\n export = blankie\n}\n\ndeclare module 'blipp' {\n declare const blipp: {\n plugin: Plugin\n }\n\n export = blipp\n}\n\ndeclare module 'hapi-pulse' {\n declare const hapiPulse: {\n plugin: Plugin<{\n timeout: number\n }>\n }\n\n export = hapiPulse\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/unified-signatures */\n\nimport { type Plugin } from '@hapi/hapi'\nimport { type ServerYar, type Yar } from '@hapi/yar'\nimport { type Logger } from 'pino'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type context } from '~/src/server/plugins/engine/nunjucks.js'\nimport {\n type FormRequest,\n type FormRequestPayload\n} from '~/src/server/routes/types.js'\nimport { type CacheService } from '~/src/server/services/index.js'\n\ndeclare module '@hapi/hapi' {\n // Here we are decorating Hapi interface types with\n // props from plugins which doesn't export @types\n interface PluginProperties {\n crumb: {\n generate?: (request: Request | FormRequest | FormRequestPayload) => string\n }\n 'forms-engine-plugin': {\n baseLayoutPath: string\n cacheService: CacheService\n viewContext: context\n }\n }\n\n interface Request {\n logger: Logger\n yar: Yar\n }\n\n interface RequestApplicationState {\n model?: FormModel\n }\n\n interface Server {\n logger: Logger\n yar: ServerYar\n }\n\n interface ServerApplicationState {\n model?: FormModel\n models: Map<string, { model: FormModel; updatedAt: Date }>\n }\n}\n\ndeclare module '@hapi/scooter' {\n declare const hapiScooter: {\n plugin: Plugin\n }\n\n export = hapiScooter\n}\n\ndeclare module 'blankie' {\n declare const blankie: {\n plugin: Plugin<Record<string, boolean | string | string[]>>\n }\n\n export = blankie\n}\n\ndeclare module 'blipp' {\n declare const blipp: {\n plugin: Plugin\n }\n\n export = blipp\n}\n\ndeclare module 'hapi-pulse' {\n declare const hapiPulse: {\n plugin: Plugin<{\n timeout: number\n }>\n }\n\n export = hapiPulse\n}\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/joi/index.d.ts"],"sourcesContent":["import { type FormPayload } from '~/src/server/plugins/engine/types.ts'\n\ndeclare module 'joi' {\n interface Context {\n present?: string[]\n presentWithLabels?: string[]\n missing?: string[]\n missingWithLabels?: string[]\n }\n\n /**\n * Add context types for `object.and` error reports\n * {@link https://joi.dev/api/?v=17.13.3#objectand}\n */\n interface ErrorReportCollection extends ErrorReport {\n local: Context & {\n value: FormPayload\n label?: string\n title?: string\n }\n }\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/joi/index.d.ts"],"sourcesContent":["import { type FormPayload } from '~/src/server/plugins/engine/types.ts'\n\ndeclare module 'joi' {\n interface Context {\n present?: string[]\n presentWithLabels?: string[]\n missing?: string[]\n missingWithLabels?: string[]\n }\n\n /**\n * Add context types for `object.and` error reports\n * {@link https://joi.dev/api/?v=17.13.3#objectand}\n */\n interface ErrorReportCollection extends ErrorReport {\n local: Context & {\n value: FormPayload\n label?: string\n title?: string\n }\n }\n\n interface JoiExpressionReturn {\n render: (p1, p2, p3, p4, p5) => string\n }\n\n type JoiExpression = JoiExpressionReturn | string\n\n type LanguageMessagesExt = Record<string, JoiExpression>\n}\n"],"mappings":"","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "files": [
@@ -24,6 +24,7 @@
24
24
  "./file-form-service.js": "./.server/server/utils/file-form-service.js",
25
25
  "./controllers/*": "./.server/server/plugins/engine/pageControllers/*",
26
26
  "./services/*": "./.server/server/plugins/engine/services/*",
27
+ "./engine/*": "./.server/server/plugins/engine/*",
27
28
  "./package.json": "./package.json"
28
29
  },
29
30
  "scripts": {
@@ -62,7 +63,7 @@
62
63
  },
63
64
  "license": "SEE LICENSE IN LICENSE",
64
65
  "dependencies": {
65
- "@defra/forms-model": "^3.0.438",
66
+ "@defra/forms-model": "^3.0.441",
66
67
  "@defra/hapi-tracing": "^1.0.0",
67
68
  "@elastic/ecs-pino-format": "^1.5.0",
68
69
  "@hapi/boom": "^10.0.1",
@@ -177,7 +178,7 @@
177
178
  "stylelint": "^16.12.0",
178
179
  "stylelint-config-gds": "^2.0.0",
179
180
  "terser-webpack-plugin": "^5.3.11",
180
- "tsx": "^4.19.2",
181
+ "tsx": "^4.19.3",
181
182
  "typescript": "^5.7.2",
182
183
  "webpack": "^5.97.1",
183
184
  "webpack-assets-manifest": "^5.2.1",