@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.
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +2 -0
- package/.server/server/plugins/engine/components/CheckboxesField.js +13 -7
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +2 -0
- package/.server/server/plugins/engine/components/DatePartsField.js +11 -5
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +2 -0
- package/.server/server/plugins/engine/components/FileUploadField.js +9 -3
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +2 -0
- package/.server/server/plugins/engine/components/FormComponent.js +11 -4
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
- package/.server/server/plugins/engine/components/ListFormComponent.js +6 -4
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +2 -0
- package/.server/server/plugins/engine/components/MonthYearField.js +9 -3
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +3 -1
- package/.server/server/plugins/engine/components/UkAddressField.js +12 -5
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +27 -12
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +1 -4
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +10 -9
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
- package/.server/server/plugins/engine/types/index.d.ts +0 -1
- package/.server/server/plugins/engine/types/index.js.map +1 -1
- package/.server/server/plugins/engine/types/schema.d.ts +2 -1
- package/.server/server/plugins/engine/types/schema.js +13 -2
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +24 -3
- package/.server/server/plugins/engine/types.js +4 -0
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/package.json +1 -1
- package/src/server/plugins/engine/components/CheckboxesField.ts +18 -7
- package/src/server/plugins/engine/components/DatePartsField.ts +17 -6
- package/src/server/plugins/engine/components/FileUploadField.ts +14 -3
- package/src/server/plugins/engine/components/FormComponent.ts +17 -5
- package/src/server/plugins/engine/components/ListFormComponent.ts +10 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +14 -4
- package/src/server/plugins/engine/components/UkAddressField.ts +16 -6
- package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +192 -2
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +38 -12
- package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +2 -0
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +18 -28
- package/src/server/plugins/engine/types/index.ts +0 -2
- package/src/server/plugins/engine/types/schema.test.ts +68 -60
- package/src/server/plugins/engine/types/schema.ts +23 -2
- 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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
|
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,
|
|
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
|