@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
@@ -0,0 +1,251 @@
1
+ ---
2
+ name: Register as a unicorn breeder
3
+ pages:
4
+ - path: '/whats-your-name'
5
+ title: What's your name?
6
+ components:
7
+ - type: TextField
8
+ name: textField
9
+ title: Name
10
+ hint:
11
+ This is a single line text box. We use it to ask for information that's
12
+ likely to be 1 sentence
13
+ options:
14
+ required: true
15
+ schema: {}
16
+ next:
17
+ - path: '/whats-your-email-address'
18
+ section: section
19
+ - title: Summary
20
+ path: '/summary'
21
+ controller: './pages/summary.js'
22
+ components: []
23
+ next: []
24
+ - path: '/whats-your-email-address'
25
+ title: What's your email address?
26
+ components:
27
+ - name: MaTzaT
28
+ options:
29
+ required: true
30
+ type: EmailAddressField
31
+ title: Email adress
32
+ schema: {}
33
+ hint: This is an email address. An email address must contain an at sign @
34
+ next:
35
+ - path: '/whats-your-phone-number'
36
+ section: section
37
+ - path: '/whats-your-phone-number'
38
+ title: What's your phone number?
39
+ components:
40
+ - name: BdKgCe
41
+ options:
42
+ required: true
43
+ type: TelephoneNumberField
44
+ title: Phone number
45
+ schema: {}
46
+ hint:
47
+ This is a telephone number. This field can only contain numbers and the
48
+ + symbol
49
+ next:
50
+ - path: '/whats-your-address'
51
+ section: section
52
+ - path: '/whats-your-address'
53
+ title: What's your address?
54
+ components:
55
+ - name: wZLWPy
56
+ options:
57
+ required: true
58
+ type: UkAddressField
59
+ title: Address
60
+ schema: {}
61
+ hint: This is a UK address. Users must enter address line 1, town and a postcode
62
+ next:
63
+ - path: '/do-you-want-your-unicorn-breeder-certificate-sent-to-this-address'
64
+ section: section
65
+ - path: '/do-you-want-your-unicorn-breeder-certificate-sent-to-this-address'
66
+ title: Do you want your unicorn breeder certificate sent to this address?
67
+ components:
68
+ - name: dBfuID
69
+ options: {}
70
+ type: YesNoField
71
+ title: Send certificate to same address
72
+ schema: {}
73
+ hint:
74
+ This is a yes or no question. We can branch to different questions based
75
+ on the answer
76
+ values:
77
+ type: listRef
78
+ next:
79
+ - path: '/what-address-do-you-want-the-certificate-sent-to'
80
+ condition: oyGPwP
81
+ - path: '/when-does-your-unicorn-insurance-policy-start'
82
+ condition: ''
83
+ section: section
84
+ - path: '/what-address-do-you-want-the-certificate-sent-to'
85
+ title: What address do you want the certificate sent to?
86
+ components:
87
+ - name: AegFro
88
+ options: {}
89
+ type: UkAddressField
90
+ title: Address to send certificate
91
+ schema: {}
92
+ hint:
93
+ This is a simple branch to an extra question - it's shown to users who select
94
+ 'no' when asked if this is the address where the certificate should be sent
95
+ next:
96
+ - path: '/when-does-your-unicorn-insurance-policy-start'
97
+ section: section
98
+ - title: When does your unicorn insurance policy start?
99
+ path: '/when-does-your-unicorn-insurance-policy-start'
100
+ section: Regnsa
101
+ next:
102
+ - path: '/upload-your-insurance-certificate'
103
+ components:
104
+ - name: mjAccr
105
+ options: {}
106
+ type: DatePartsField
107
+ title: Unicorn insurance policy start date
108
+ schema: {}
109
+ hint:
110
+ This is a date. We can add custom validation to the field based on your
111
+ requirements. For example, the date entered must be before or after a certain
112
+ date
113
+ - title: How many unicorns do you expect to breed each year?
114
+ path: '/how-many-unicorns-do-you-expect-to-breed-each-year'
115
+ section: susaYr
116
+ next:
117
+ - path: '/what-type-of-unicorns-will-you-breed'
118
+ components:
119
+ - name: aitzzV
120
+ options: {}
121
+ type: RadiosField
122
+ list: IeFOkf
123
+ title: Number of unicorns
124
+ schema: {}
125
+ hint: This is a radio button. Users can only select one option from the list
126
+ values:
127
+ type: listRef
128
+ - title: What type of unicorns will you breed?
129
+ path: '/what-type-of-unicorns-will-you-breed'
130
+ section: susaYr
131
+ next:
132
+ - path: '/where-will-you-keep-the-unicorns'
133
+ components:
134
+ - name: DyfjJC
135
+ options: {}
136
+ type: CheckboxesField
137
+ list: fXiZrL
138
+ title: Type of unicorn
139
+ schema: {}
140
+ hint: This is a check box. Users can select more than one option
141
+ values:
142
+ type: listRef
143
+ - title: Where will you keep the unicorns?
144
+ path: '/where-will-you-keep-the-unicorns'
145
+ section: susaYr
146
+ next:
147
+ - path: '/how-many-members-of-staff-will-look-after-the-unicorns'
148
+ components:
149
+ - name: bClCvo
150
+ options: {}
151
+ schema: {}
152
+ type: MultilineTextField
153
+ title: Where you keep the unicorn
154
+ hint:
155
+ This is a multi-line text box. We use it when you expect the response to
156
+ be more than 1 sentence long
157
+ - title: How many members of staff will look after the unicorns?
158
+ path: '/how-many-members-of-staff-will-look-after-the-unicorns'
159
+ section: susaYr
160
+ next:
161
+ - path: '/summary'
162
+ components:
163
+ - name: zhJMaM
164
+ options:
165
+ classes: govuk-!-width-one-quarter
166
+ type: NumberField
167
+ title: Number of staff
168
+ schema: {}
169
+ hint:
170
+ This is a number field. The answer must be a number. We can use custom validation
171
+ to set decimal places, minimum and maximum values
172
+ - title: Upload your insurance certificate
173
+ path: '/upload-your-insurance-certificate'
174
+ controller: FileUploadPageController
175
+ section: Regnsa
176
+ next:
177
+ - path: '/how-many-unicorns-do-you-expect-to-breed-each-year'
178
+ components:
179
+ - name: dLzALM
180
+ title: Documents
181
+ type: FileUploadField
182
+ hint: We can specify the format and number of uploaded files
183
+ options:
184
+ required: false
185
+ schema:
186
+ min: 1
187
+ max: 3
188
+ conditions:
189
+ - displayName: Address is different
190
+ name: IrVmYz
191
+ value:
192
+ name: Address is different
193
+ conditions:
194
+ - field:
195
+ name: dBfuID
196
+ type: YesNoField
197
+ display: 'Contact details: Send certificate to same address'
198
+ operator: is
199
+ value:
200
+ type: Value
201
+ value: 'false'
202
+ display: 'false'
203
+ - displayName: Address is not the same
204
+ name: oyGPwP
205
+ value:
206
+ name: Address is not the same
207
+ conditions:
208
+ - field:
209
+ name: dBfuID
210
+ type: YesNoField
211
+ display: 'Contact details: Send certificate to same address'
212
+ operator: is
213
+ value:
214
+ type: Value
215
+ value: 'false'
216
+ display: 'No'
217
+ sections:
218
+ - name: section
219
+ title: Contact details
220
+ hideTitle: false
221
+ - title: Unicorn details
222
+ name: susaYr
223
+ hideTitle: false
224
+ - title: Insurance details
225
+ name: Regnsa
226
+ hideTitle: false
227
+ lists:
228
+ - title: number of unicorns
229
+ name: IeFOkf
230
+ type: string
231
+ items:
232
+ - text: 1 to 5
233
+ value: 1 to 5
234
+ - text: 6 to 10
235
+ value: 6 to 10
236
+ - text: 11 or more
237
+ value: 11 or more
238
+ - title: Type of unicorn
239
+ name: fXiZrL
240
+ type: string
241
+ items:
242
+ - text: Flying
243
+ value: Flying
244
+ - text: Fire breathing
245
+ value: Fire breathing
246
+ - text: Aquatic
247
+ value: Aquatic
248
+ - text: Rainbow
249
+ value: Rainbow
250
+ outputEmail: defraforms@defra.gov.uk
251
+ startPage: '/whats-your-name'
@@ -1,11 +1,13 @@
1
1
  import { type Server } from '@hapi/hapi'
2
2
  import { StatusCodes } from 'http-status-codes'
3
3
 
4
+ import { FORM_PREFIX } from '~/src/server/constants.js'
4
5
  import { createServer } from '~/src/server/index.js'
5
6
  import {
6
7
  getFormDefinition,
7
8
  getFormMetadata
8
9
  } from '~/src/server/plugins/engine/services/formsService.js'
10
+ import * as defaultServices from '~/src/server/plugins/engine/services/index.js'
9
11
  import { getUploadStatus } from '~/src/server/plugins/engine/services/uploadService.js'
10
12
  import {
11
13
  FileStatus,
@@ -30,7 +32,9 @@ describe('Model cache', () => {
30
32
  }
31
33
 
32
34
  beforeAll(async () => {
33
- server = await createServer()
35
+ server = await createServer({
36
+ services: defaultServices
37
+ })
34
38
  await server.initialize()
35
39
  })
36
40
 
@@ -54,13 +58,13 @@ describe('Model cache', () => {
54
58
 
55
59
  const options = {
56
60
  method: 'GET',
57
- url: '/slug'
61
+ url: `${FORM_PREFIX}/slug`
58
62
  }
59
63
 
60
64
  const res = await server.inject(options)
61
65
 
62
66
  expect(res.statusCode).toBe(StatusCodes.MOVED_TEMPORARILY)
63
- expect(res.headers.location).toBe('/slug/page-one')
67
+ expect(res.headers.location).toBe(`${FORM_PREFIX}/slug/page-one`)
64
68
  expect(getCacheSize()).toBe(1)
65
69
  })
66
70
 
@@ -74,13 +78,15 @@ describe('Model cache', () => {
74
78
 
75
79
  const options = {
76
80
  method: 'GET',
77
- url: '/preview/live/slug'
81
+ url: `${FORM_PREFIX}/preview/live/slug`
78
82
  }
79
83
 
80
84
  const res = await server.inject(options)
81
85
 
82
86
  expect(res.statusCode).toBe(StatusCodes.MOVED_TEMPORARILY)
83
- expect(res.headers.location).toBe('/preview/live/slug/page-one')
87
+ expect(res.headers.location).toBe(
88
+ `${FORM_PREFIX}/preview/live/slug/page-one`
89
+ )
84
90
  expect(getCacheSize()).toBe(1)
85
91
  })
86
92
 
@@ -94,13 +100,15 @@ describe('Model cache', () => {
94
100
 
95
101
  const options = {
96
102
  method: 'GET',
97
- url: '/preview/draft/slug'
103
+ url: `${FORM_PREFIX}/preview/draft/slug`
98
104
  }
99
105
 
100
106
  const res = await server.inject(options)
101
107
 
102
108
  expect(res.statusCode).toBe(StatusCodes.MOVED_TEMPORARILY)
103
- expect(res.headers.location).toBe('/preview/draft/slug/page-one')
109
+ expect(res.headers.location).toBe(
110
+ `${FORM_PREFIX}/preview/draft/slug/page-one`
111
+ )
104
112
  expect(getCacheSize()).toBe(1)
105
113
  })
106
114
 
@@ -114,7 +122,7 @@ describe('Model cache', () => {
114
122
 
115
123
  const options = {
116
124
  method: 'GET',
117
- url: '/slug/page-one'
125
+ url: `${FORM_PREFIX}/slug/page-one`
118
126
  }
119
127
 
120
128
  const res = await server.inject(options)
@@ -133,7 +141,7 @@ describe('Model cache', () => {
133
141
 
134
142
  const options = {
135
143
  method: 'GET',
136
- url: '/preview/live/slug/page-one'
144
+ url: `${FORM_PREFIX}/preview/live/slug/page-one`
137
145
  }
138
146
 
139
147
  const res = await server.inject(options)
@@ -152,7 +160,7 @@ describe('Model cache', () => {
152
160
 
153
161
  const options = {
154
162
  method: 'GET',
155
- url: '/preview/draft/slug/page-one'
163
+ url: `${FORM_PREFIX}/preview/draft/slug/page-one`
156
164
  }
157
165
 
158
166
  const res = await server.inject(options)
@@ -171,7 +179,7 @@ describe('Model cache', () => {
171
179
 
172
180
  const options = {
173
181
  method: 'GET',
174
- url: '/slug/page-one'
182
+ url: `${FORM_PREFIX}/slug/page-one`
175
183
  }
176
184
 
177
185
  const res = await server.inject(options)
@@ -192,7 +200,7 @@ describe('Model cache', () => {
192
200
  // Populate live/live cache item
193
201
  const options1 = {
194
202
  method: 'GET',
195
- url: '/slug/page-one'
203
+ url: `${FORM_PREFIX}/slug/page-one`
196
204
  }
197
205
 
198
206
  const res1 = await server.inject(options1)
@@ -203,7 +211,7 @@ describe('Model cache', () => {
203
211
  // Populate live/preview cache item
204
212
  const options2 = {
205
213
  method: 'GET',
206
- url: '/preview/live/slug/page-one'
214
+ url: `${FORM_PREFIX}/preview/live/slug/page-one`
207
215
  }
208
216
 
209
217
  const res2 = await server.inject(options2)
@@ -214,7 +222,7 @@ describe('Model cache', () => {
214
222
  // Populate draft/preview cache item
215
223
  const options3 = {
216
224
  method: 'GET',
217
- url: '/preview/draft/slug/page-one'
225
+ url: `${FORM_PREFIX}/preview/draft/slug/page-one`
218
226
  }
219
227
 
220
228
  const res3 = await server.inject(options3)
@@ -266,7 +274,7 @@ describe('Model cache', () => {
266
274
 
267
275
  const options = {
268
276
  method: 'GET',
269
- url: '/slug'
277
+ url: `${FORM_PREFIX}/slug`
270
278
  }
271
279
 
272
280
  const res = await server.inject(options)
@@ -280,7 +288,7 @@ describe('Model cache', () => {
280
288
 
281
289
  const options = {
282
290
  method: 'GET',
283
- url: '/preview/draft/slug'
291
+ url: `${FORM_PREFIX}/preview/draft/slug`
284
292
  }
285
293
 
286
294
  const res = await server.inject(options)
@@ -294,7 +302,7 @@ describe('Model cache', () => {
294
302
 
295
303
  const options = {
296
304
  method: 'GET',
297
- url: '/preview/live/slug'
305
+ url: `${FORM_PREFIX}/preview/live/slug`
298
306
  }
299
307
 
300
308
  const res = await server.inject(options)
@@ -312,7 +320,7 @@ describe('Model cache', () => {
312
320
 
313
321
  const options = {
314
322
  method: 'GET',
315
- url: '/slug'
323
+ url: `${FORM_PREFIX}/slug`
316
324
  }
317
325
 
318
326
  const res = await server.inject(options)
@@ -330,7 +338,7 @@ describe('Model cache', () => {
330
338
 
331
339
  const options = {
332
340
  method: 'GET',
333
- url: '/preview/draft/slug'
341
+ url: `${FORM_PREFIX}/preview/draft/slug`
334
342
  }
335
343
 
336
344
  const res = await server.inject(options)
@@ -348,7 +356,7 @@ describe('Model cache', () => {
348
356
 
349
357
  const options = {
350
358
  method: 'GET',
351
- url: '/preview/live/slug'
359
+ url: `${FORM_PREFIX}/preview/live/slug`
352
360
  }
353
361
 
354
362
  const res = await server.inject(options)
@@ -362,7 +370,7 @@ describe('Model cache', () => {
362
370
 
363
371
  const options = {
364
372
  method: 'GET',
365
- url: '/slug/page-one'
373
+ url: `${FORM_PREFIX}/slug/page-one`
366
374
  }
367
375
 
368
376
  const res = await server.inject(options)
@@ -376,7 +384,7 @@ describe('Model cache', () => {
376
384
 
377
385
  const options = {
378
386
  method: 'GET',
379
- url: '/preview/draft/slug/page-one'
387
+ url: `${FORM_PREFIX}/preview/draft/slug/page-one`
380
388
  }
381
389
 
382
390
  const res = await server.inject(options)
@@ -390,7 +398,7 @@ describe('Model cache', () => {
390
398
 
391
399
  const options = {
392
400
  method: 'GET',
393
- url: '/preview/live/slug/page-one'
401
+ url: `${FORM_PREFIX}/preview/live/slug/page-one`
394
402
  }
395
403
 
396
404
  const res = await server.inject(options)
@@ -408,7 +416,7 @@ describe('Model cache', () => {
408
416
 
409
417
  const options = {
410
418
  method: 'GET',
411
- url: '/slug/page-one'
419
+ url: `${FORM_PREFIX}/slug/page-one`
412
420
  }
413
421
 
414
422
  const res = await server.inject(options)
@@ -426,7 +434,7 @@ describe('Model cache', () => {
426
434
 
427
435
  const options = {
428
436
  method: 'GET',
429
- url: '/preview/draft/slug/page-one'
437
+ url: `${FORM_PREFIX}/preview/draft/slug/page-one`
430
438
  }
431
439
 
432
440
  const res = await server.inject(options)
@@ -444,7 +452,7 @@ describe('Model cache', () => {
444
452
 
445
453
  const options = {
446
454
  method: 'GET',
447
- url: '/preview/live/slug/page-one'
455
+ url: `${FORM_PREFIX}/preview/live/slug/page-one`
448
456
  }
449
457
 
450
458
  const res = await server.inject(options)
@@ -453,42 +461,6 @@ describe('Model cache', () => {
453
461
  expect(getCacheSize()).toBe(0)
454
462
  })
455
463
  })
456
-
457
- describe('Help pages', () => {
458
- test('Contextual help page returns 200', async () => {
459
- jest.mocked(getFormMetadata).mockResolvedValue({
460
- ...fixtures.form.metadata,
461
- draft: fixtures.form.state,
462
- live: fixtures.form.state
463
- })
464
-
465
- const options = {
466
- method: 'GET',
467
- url: '/help/get-support/slug'
468
- }
469
-
470
- const res = await server.inject(options)
471
-
472
- expect(res.statusCode).toBe(StatusCodes.OK)
473
- })
474
-
475
- test('Privacy notice page returns 200', async () => {
476
- jest.mocked(getFormMetadata).mockResolvedValue({
477
- ...fixtures.form.metadata,
478
- draft: fixtures.form.state,
479
- live: fixtures.form.state
480
- })
481
-
482
- const options = {
483
- method: 'GET',
484
- url: '/help/privacy/slug'
485
- }
486
-
487
- const res = await server.inject(options)
488
-
489
- expect(res.statusCode).toBe(StatusCodes.OK)
490
- })
491
- })
492
464
  })
493
465
 
494
466
  describe('Upload status route', () => {
@@ -527,7 +499,7 @@ describe('Upload status route', () => {
527
499
 
528
500
  const options = {
529
501
  method: 'GET',
530
- url: '/upload-status/123e4567-e89b-12d3-a456-426614174000'
502
+ url: `${FORM_PREFIX}/upload-status/123e4567-e89b-12d3-a456-426614174000`
531
503
  }
532
504
 
533
505
  const res = await server.inject(options)
@@ -544,7 +516,7 @@ describe('Upload status route', () => {
544
516
 
545
517
  const options = {
546
518
  method: 'GET',
547
- url: '/upload-status/123e4567-e89b-12d3-a456-426614174000'
519
+ url: `${FORM_PREFIX}/upload-status/123e4567-e89b-12d3-a456-426614174000`
548
520
  }
549
521
 
550
522
  const res = await server.inject(options)
@@ -560,7 +532,7 @@ describe('Upload status route', () => {
560
532
 
561
533
  const options = {
562
534
  method: 'GET',
563
- url: '/upload-status/123e4567-e89b-12d3-a456-426614174000'
535
+ url: `${FORM_PREFIX}/upload-status/123e4567-e89b-12d3-a456-426614174000`
564
536
  }
565
537
 
566
538
  const res = await server.inject(options)
@@ -572,7 +544,7 @@ describe('Upload status route', () => {
572
544
  test('GET /upload-status/{uploadId} returns 400 for invalid uploadId format', async () => {
573
545
  const options = {
574
546
  method: 'GET',
575
- url: '/upload-status/not-a-valid-guid'
547
+ url: `${FORM_PREFIX}/upload-status/not-a-valid-guid`
576
548
  }
577
549
 
578
550
  const res = await server.inject(options)
@@ -15,14 +15,13 @@ import { config } from '~/src/config/index.js'
15
15
  import { requestLogger } from '~/src/server/common/helpers/logging/request-logger.js'
16
16
  import { requestTracing } from '~/src/server/common/helpers/logging/request-tracing.js'
17
17
  import { buildRedisClient } from '~/src/server/common/helpers/redis-client.js'
18
- import { configureBlankiePlugin } from '~/src/server/plugins/blankie.js'
19
18
  import { configureCrumbPlugin } from '~/src/server/plugins/crumb.js'
20
- import { configureEnginePlugin } from '~/src/server/plugins/engine/index.js'
19
+ import { configureEnginePlugin } from '~/src/server/plugins/engine/configureEnginePlugin.js'
21
20
  import pluginErrorPages from '~/src/server/plugins/errorPages.js'
22
21
  import { plugin as pluginViews } from '~/src/server/plugins/nunjucks/index.js'
23
22
  import pluginPulse from '~/src/server/plugins/pulse.js'
24
- import pluginRouter from '~/src/server/plugins/router.js'
25
23
  import pluginSession from '~/src/server/plugins/session.js'
24
+ import { publicRoutes } from '~/src/server/routes/index.js'
26
25
  import { prepareSecureContext } from '~/src/server/secure-context.js'
27
26
  import { type RouteConfig } from '~/src/server/types.js'
28
27
 
@@ -82,17 +81,17 @@ export async function createServer(routeConfig?: RouteConfig) {
82
81
  prepareSecureContext(server)
83
82
  }
84
83
 
85
- const pluginEngine = await configureEnginePlugin(routeConfig)
86
84
  const pluginCrumb = configureCrumbPlugin(routeConfig)
87
- const pluginBlankie = configureBlankiePlugin()
85
+ const pluginEngine = await configureEnginePlugin(routeConfig)
88
86
 
89
87
  await server.register(pluginSession)
90
88
  await server.register(pluginPulse)
91
89
  await server.register(inert)
92
90
  await server.register(Scooter)
93
- await server.register(pluginBlankie)
94
91
  await server.register(pluginCrumb)
95
92
 
93
+ await server.register(pluginEngine)
94
+
96
95
  server.ext('onPreResponse', (request: Request, h: ResponseToolkit) => {
97
96
  const { response } = request
98
97
 
@@ -116,20 +115,19 @@ export async function createServer(routeConfig?: RouteConfig) {
116
115
  })
117
116
 
118
117
  await server.register(pluginViews)
119
- await server.register(pluginEngine)
120
- await server.register(pluginRouter)
118
+
119
+ await server.register({
120
+ plugin: {
121
+ name: 'router',
122
+ register: (server) => {
123
+ server.route(publicRoutes)
124
+ }
125
+ }
126
+ })
127
+
121
128
  await server.register(pluginErrorPages)
122
129
  await server.register(blipp)
123
130
  await server.register(requestTracing)
124
131
 
125
- server.state('cookieConsent', {
126
- ttl: 365 * 24 * 60 * 60 * 1000, // 1 year in ms
127
- clearInvalid: true,
128
- isHttpOnly: false,
129
- isSecure: config.get('isProduction'),
130
- path: '/',
131
- encoding: 'none' // handle this inside the application so we can share frontend/backend cookie modification
132
- })
133
-
134
132
  return server
135
133
  }