@defra/forms-engine-plugin 2.1.7 → 2.1.9

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 (50) hide show
  1. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +2 -0
  2. package/.server/server/plugins/engine/components/CheckboxesField.js +13 -7
  3. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  4. package/.server/server/plugins/engine/components/DatePartsField.d.ts +2 -0
  5. package/.server/server/plugins/engine/components/DatePartsField.js +11 -5
  6. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  7. package/.server/server/plugins/engine/components/FileUploadField.d.ts +2 -0
  8. package/.server/server/plugins/engine/components/FileUploadField.js +9 -3
  9. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  10. package/.server/server/plugins/engine/components/FormComponent.d.ts +2 -0
  11. package/.server/server/plugins/engine/components/FormComponent.js +11 -4
  12. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  13. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  14. package/.server/server/plugins/engine/components/ListFormComponent.js +6 -4
  15. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
  16. package/.server/server/plugins/engine/components/MonthYearField.d.ts +2 -0
  17. package/.server/server/plugins/engine/components/MonthYearField.js +9 -3
  18. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  19. package/.server/server/plugins/engine/components/UkAddressField.d.ts +3 -1
  20. package/.server/server/plugins/engine/components/UkAddressField.js +12 -5
  21. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  22. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +27 -12
  23. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  24. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +1 -4
  25. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +10 -9
  26. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  27. package/.server/server/plugins/engine/types/index.d.ts +0 -1
  28. package/.server/server/plugins/engine/types/index.js.map +1 -1
  29. package/.server/server/plugins/engine/types/schema.d.ts +2 -1
  30. package/.server/server/plugins/engine/types/schema.js +13 -2
  31. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  32. package/.server/server/plugins/engine/types.d.ts +24 -3
  33. package/.server/server/plugins/engine/types.js +4 -0
  34. package/.server/server/plugins/engine/types.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/server/plugins/engine/components/CheckboxesField.ts +18 -7
  37. package/src/server/plugins/engine/components/DatePartsField.ts +17 -6
  38. package/src/server/plugins/engine/components/FileUploadField.ts +14 -3
  39. package/src/server/plugins/engine/components/FormComponent.ts +17 -5
  40. package/src/server/plugins/engine/components/ListFormComponent.ts +10 -3
  41. package/src/server/plugins/engine/components/MonthYearField.ts +14 -4
  42. package/src/server/plugins/engine/components/UkAddressField.ts +16 -6
  43. package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +192 -2
  44. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +38 -12
  45. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +2 -0
  46. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +18 -28
  47. package/src/server/plugins/engine/types/index.ts +0 -2
  48. package/src/server/plugins/engine/types/schema.test.ts +68 -60
  49. package/src/server/plugins/engine/types/schema.ts +23 -2
  50. package/src/server/plugins/engine/types.ts +33 -3
@@ -9,10 +9,56 @@ import {
9
9
  import {
10
10
  type FormAdapterSubmissionMessageData,
11
11
  type FormAdapterSubmissionMessageMeta,
12
- type FormAdapterSubmissionMessagePayload
12
+ type FormAdapterSubmissionMessagePayload,
13
+ type RichFormValue
13
14
  } from '~/src/server/plugins/engine/types.js'
14
15
 
15
16
  describe('Schema validation', () => {
17
+ const main: Record<string, RichFormValue> = {
18
+ QMwMir: 'Roman Pizza',
19
+ duOEvZ: 'Small',
20
+ DzEODf: ['Mozzarella'],
21
+ juiCfC: ['Pepperoni', 'Sausage', 'Onions', 'Basil'],
22
+ YEpypP: 'None',
23
+ JumNVc: 'Joe Bloggs',
24
+ ALNehP: '+441234567890',
25
+ vAqTmg: {
26
+ addressLine1: '1 Anywhere Street',
27
+ town: 'Anywhereville',
28
+ postcode: 'AN1 2WH'
29
+ },
30
+ IbXVGY: {
31
+ day: 22,
32
+ month: 8,
33
+ year: 2025
34
+ },
35
+ HGBWLt: ['Garlic sauce']
36
+ }
37
+
38
+ const value1: Record<string, RichFormValue> = {
39
+ IEKzko: 'dsfsdfsdf'
40
+ }
41
+ const value2: Record<string, RichFormValue> = {
42
+ IEKzko: 'dfghfgh'
43
+ }
44
+
45
+ const validData: FormAdapterSubmissionMessageData = {
46
+ main,
47
+ repeaters: {
48
+ qLVLgb: [value1, value2]
49
+ },
50
+ files: {
51
+ dLzALM: [
52
+ {
53
+ fileId: '489ecc1b-a145-4618-ba5a-b4a0d5ee2dbd',
54
+ fileName: 'file-name.json',
55
+ userDownloadLink:
56
+ 'http://localhost:3005/file-download/489ecc1b-a145-4618-ba5a-b4a0d5ee2dbd'
57
+ }
58
+ ]
59
+ }
60
+ }
61
+
16
62
  describe('formAdapterSubmissionMessageMetaSchema', () => {
17
63
  const validMeta: FormAdapterSubmissionMessageMeta = {
18
64
  schemaVersion: FormAdapterSubmissionSchemaVersion.V1,
@@ -49,31 +95,6 @@ describe('Schema validation', () => {
49
95
  })
50
96
 
51
97
  describe('formAdapterSubmissionMessageDataSchema', () => {
52
- const validData: FormAdapterSubmissionMessageData = {
53
- main: {
54
- QMwMir: 'Roman Pizza',
55
- duOEvZ: 'Small',
56
- DzEODf: ['Mozzarella'],
57
- juiCfC: ['Pepperoni', 'Sausage', 'Onions', 'Basil'],
58
- YEpypP: 'None',
59
- JumNVc: 'Joe Bloggs',
60
- ALNehP: '+441234567890',
61
- vAqTmg: {
62
- addressLine1: '1 Anywhere Street',
63
- town: 'Anywhereville',
64
- postcode: 'AN1 2WH'
65
- },
66
- IbXVGY: {
67
- day: 22,
68
- month: 8,
69
- year: 2025
70
- },
71
- HGBWLt: ['Garlic sauce']
72
- },
73
- repeaters: {},
74
- files: {}
75
- }
76
-
77
98
  it('should validate valid data object', () => {
78
99
  const { error } =
79
100
  formAdapterSubmissionMessageDataSchema.validate(validData)
@@ -89,41 +110,28 @@ describe('Schema validation', () => {
89
110
  })
90
111
 
91
112
  describe('formAdapterSubmissionMessagePayloadSchema', () => {
113
+ const meta: FormAdapterSubmissionMessageMeta = {
114
+ schemaVersion: FormAdapterSubmissionSchemaVersion.V1,
115
+ timestamp: new Date('2025-08-22T18:15:10.785Z'),
116
+ referenceNumber: '576-225-943',
117
+ formName: 'Order a pizza',
118
+ formId: '68a8b0449ab460290c28940a',
119
+ formSlug: 'order-a-pizza',
120
+ status: FormStatus.Live,
121
+ isPreview: false,
122
+ notificationEmail: 'info@example.com'
123
+ }
124
+
92
125
  const validPayload: FormAdapterSubmissionMessagePayload = {
93
- meta: {
94
- schemaVersion: FormAdapterSubmissionSchemaVersion.V1,
95
- timestamp: new Date('2025-08-22T18:15:10.785Z'),
96
- referenceNumber: '576-225-943',
97
- formName: 'Order a pizza',
98
- formId: '68a8b0449ab460290c28940a',
99
- formSlug: 'order-a-pizza',
100
- status: FormStatus.Live,
101
- isPreview: false,
102
- notificationEmail: 'info@example.com'
103
- },
104
- data: {
105
- main: {
106
- QMwMir: 'Roman Pizza',
107
- duOEvZ: 'Small',
108
- DzEODf: ['Mozzarella'],
109
- juiCfC: ['Pepperoni', 'Sausage', 'Onions', 'Basil'],
110
- YEpypP: 'None',
111
- JumNVc: 'Joe Bloggs',
112
- ALNehP: '+441234567890',
113
- vAqTmg: {
114
- addressLine1: '1 Anywhere Street',
115
- town: 'Anywhereville',
116
- postcode: 'AN1 2WH'
117
- },
118
- IbXVGY: {
119
- day: 22,
120
- month: 8,
121
- year: 2025
122
- },
123
- HGBWLt: ['Garlic sauce']
124
- },
125
- repeaters: {},
126
- files: {}
126
+ meta,
127
+ data: validData,
128
+ result: {
129
+ files: {
130
+ main: '3d289230-83a3-4852-a68a-cb3569e9b0fe',
131
+ repeaters: {
132
+ ImxIOP: 'Joe Bloggs'
133
+ }
134
+ }
127
135
  }
128
136
  }
129
137
 
@@ -11,7 +11,8 @@ import { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/
11
11
  import {
12
12
  type FormAdapterSubmissionMessageData,
13
13
  type FormAdapterSubmissionMessageMeta,
14
- type FormAdapterSubmissionMessagePayload
14
+ type FormAdapterSubmissionMessagePayload,
15
+ type FormAdapterSubmissionMessageResult
15
16
  } from '~/src/server/plugins/engine/types.js'
16
17
 
17
18
  export const formAdapterSubmissionMessageMetaSchema =
@@ -35,11 +36,31 @@ export const formAdapterSubmissionMessageDataSchema =
35
36
  Joi.object<FormAdapterSubmissionMessageData>().keys({
36
37
  main: Joi.object(),
37
38
  repeaters: Joi.object(),
39
+ files: Joi.object().pattern(
40
+ Joi.string(),
41
+ Joi.array().items(
42
+ Joi.object().keys({
43
+ fileName: Joi.string().required(),
44
+ fileId: Joi.string().required(),
45
+ userDownloadLink: Joi.string().required()
46
+ })
47
+ )
48
+ )
49
+ })
50
+
51
+ export const formAdapterSubmissionMessageResultSchema =
52
+ Joi.object<FormAdapterSubmissionMessageResult>().keys({
38
53
  files: Joi.object()
54
+ .keys({
55
+ main: Joi.string().required(),
56
+ repeaters: Joi.object()
57
+ })
58
+ .required()
39
59
  })
40
60
 
41
61
  export const formAdapterSubmissionMessagePayloadSchema =
42
62
  Joi.object<FormAdapterSubmissionMessagePayload>().keys({
43
63
  meta: formAdapterSubmissionMessageMetaSchema.required(),
44
- data: formAdapterSubmissionMessageDataSchema.required()
64
+ data: formAdapterSubmissionMessageDataSchema.required(),
65
+ result: formAdapterSubmissionMessageResultSchema.required()
45
66
  })
@@ -11,14 +11,18 @@ import { type PluginProperties, type Request } from '@hapi/hapi'
11
11
  import { type JoiExpression, type ValidationErrorItem } from 'joi'
12
12
 
13
13
  import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'
14
+ import { type UkAddressState } from '~/src/server/plugins/engine/components/UkAddressField.js'
14
15
  import { type Component } from '~/src/server/plugins/engine/components/helpers/components.js'
16
+ import { type FileUploadField } from '~/src/server/plugins/engine/components/index.js'
15
17
  import {
16
18
  type BackLink,
17
19
  type ComponentText,
18
- type ComponentViewModel
20
+ type ComponentViewModel,
21
+ type DatePartsState,
22
+ type MonthYearState
19
23
  } from '~/src/server/plugins/engine/components/types.js'
20
24
  import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
21
- import { type RichFormValue } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
25
+ import { type DetailItemField } from '~/src/server/plugins/engine/models/types.js'
22
26
  import { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'
23
27
  import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
24
28
  import {
@@ -405,16 +409,42 @@ export type FormAdapterSubmissionMessageMetaSerialised = Omit<
405
409
  status: string
406
410
  timestamp: string
407
411
  }
412
+ export interface FormAdapterFile {
413
+ fileName: string
414
+ fileId: string
415
+ userDownloadLink: string
416
+ }
417
+
418
+ export interface FormAdapterSubmissionMessageResult {
419
+ files: {
420
+ main: string
421
+ repeaters: Record<string, string>
422
+ }
423
+ }
424
+
425
+ /**
426
+ * A detail item specifically for files
427
+ */
428
+ export type FileUploadFieldDetailitem = Omit<DetailItemField, 'field'> & {
429
+ field: FileUploadField
430
+ }
431
+ export type RichFormValue =
432
+ | FormValue
433
+ | FormPayload
434
+ | DatePartsState
435
+ | MonthYearState
436
+ | UkAddressState
408
437
 
409
438
  export interface FormAdapterSubmissionMessageData {
410
439
  main: Record<string, RichFormValue>
411
440
  repeaters: Record<string, Record<string, RichFormValue>[]>
412
- files: Record<string, Record<string, string>[]>
441
+ files: Record<string, FormAdapterFile[]>
413
442
  }
414
443
 
415
444
  export interface FormAdapterSubmissionMessagePayload {
416
445
  meta: FormAdapterSubmissionMessageMeta
417
446
  data: FormAdapterSubmissionMessageData
447
+ result: FormAdapterSubmissionMessageResult
418
448
  }
419
449
 
420
450
  export interface FormAdapterSubmissionMessage