@defra/forms-model 3.0.247 → 3.0.249

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 (88) hide show
  1. package/dist/module/components/component-types.js +0 -7
  2. package/dist/module/components/component-types.js.map +1 -1
  3. package/dist/module/components/enums.js +0 -1
  4. package/dist/module/components/enums.js.map +1 -1
  5. package/dist/module/components/helpers.js +2 -2
  6. package/dist/module/components/helpers.js.map +1 -1
  7. package/dist/module/components/types.js.map +1 -1
  8. package/dist/module/conditions/condition-abstract.js.map +1 -1
  9. package/dist/module/conditions/condition-field.js.map +1 -1
  10. package/dist/module/conditions/condition-group-def.js.map +1 -1
  11. package/dist/module/conditions/condition-group.js.map +1 -1
  12. package/dist/module/conditions/condition-model.js +4 -4
  13. package/dist/module/conditions/condition-model.js.map +1 -1
  14. package/dist/module/conditions/condition-operators.js +21 -25
  15. package/dist/module/conditions/condition-operators.js.map +1 -1
  16. package/dist/module/conditions/condition-ref.js.map +1 -1
  17. package/dist/module/conditions/condition-values.js +17 -54
  18. package/dist/module/conditions/condition-values.js.map +1 -1
  19. package/dist/module/conditions/condition.js.map +1 -1
  20. package/dist/module/conditions/enums.js +7 -1
  21. package/dist/module/conditions/enums.js.map +1 -1
  22. package/dist/module/conditions/helpers.js.map +1 -1
  23. package/dist/module/conditions/index.js +3 -3
  24. package/dist/module/conditions/index.js.map +1 -1
  25. package/dist/module/conditions/types.js.map +1 -1
  26. package/dist/module/form/form-definition/index.js +22 -29
  27. package/dist/module/form/form-definition/index.js.map +1 -1
  28. package/dist/module/form/form-definition/types.js.map +1 -1
  29. package/dist/module/form/form-metadata/types.js.map +1 -1
  30. package/dist/types/components/component-types.d.ts.map +1 -1
  31. package/dist/types/components/enums.d.ts +0 -1
  32. package/dist/types/components/enums.d.ts.map +1 -1
  33. package/dist/types/components/helpers.d.ts.map +1 -1
  34. package/dist/types/components/types.d.ts +7 -12
  35. package/dist/types/components/types.d.ts.map +1 -1
  36. package/dist/types/conditions/condition-abstract.d.ts +3 -3
  37. package/dist/types/conditions/condition-abstract.d.ts.map +1 -1
  38. package/dist/types/conditions/condition-field.d.ts +6 -8
  39. package/dist/types/conditions/condition-field.d.ts.map +1 -1
  40. package/dist/types/conditions/condition-group-def.d.ts +5 -3
  41. package/dist/types/conditions/condition-group-def.d.ts.map +1 -1
  42. package/dist/types/conditions/condition-group.d.ts +11 -10
  43. package/dist/types/conditions/condition-group.d.ts.map +1 -1
  44. package/dist/types/conditions/condition-model.d.ts +9 -17
  45. package/dist/types/conditions/condition-model.d.ts.map +1 -1
  46. package/dist/types/conditions/condition-operators.d.ts +8 -14
  47. package/dist/types/conditions/condition-operators.d.ts.map +1 -1
  48. package/dist/types/conditions/condition-ref.d.ts +4 -4
  49. package/dist/types/conditions/condition-ref.d.ts.map +1 -1
  50. package/dist/types/conditions/condition-values.d.ts +13 -30
  51. package/dist/types/conditions/condition-values.d.ts.map +1 -1
  52. package/dist/types/conditions/condition.d.ts +5 -5
  53. package/dist/types/conditions/condition.d.ts.map +1 -1
  54. package/dist/types/conditions/enums.d.ts +6 -1
  55. package/dist/types/conditions/enums.d.ts.map +1 -1
  56. package/dist/types/conditions/helpers.d.ts +5 -2
  57. package/dist/types/conditions/helpers.d.ts.map +1 -1
  58. package/dist/types/conditions/index.d.ts +3 -3
  59. package/dist/types/conditions/index.d.ts.map +1 -1
  60. package/dist/types/conditions/types.d.ts +36 -37
  61. package/dist/types/conditions/types.d.ts.map +1 -1
  62. package/dist/types/form/form-definition/index.d.ts +0 -5
  63. package/dist/types/form/form-definition/index.d.ts.map +1 -1
  64. package/dist/types/form/form-definition/types.d.ts +6 -10
  65. package/dist/types/form/form-definition/types.d.ts.map +1 -1
  66. package/dist/types/form/form-metadata/types.d.ts +5 -0
  67. package/dist/types/form/form-metadata/types.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. package/src/components/component-types.ts +0 -8
  70. package/src/components/enums.ts +0 -1
  71. package/src/components/helpers.ts +1 -2
  72. package/src/components/types.ts +7 -17
  73. package/src/conditions/condition-abstract.ts +5 -5
  74. package/src/conditions/condition-field.ts +6 -4
  75. package/src/conditions/condition-group-def.ts +7 -3
  76. package/src/conditions/condition-group.ts +11 -10
  77. package/src/conditions/condition-model.ts +27 -25
  78. package/src/conditions/condition-operators.ts +29 -49
  79. package/src/conditions/condition-ref.ts +3 -3
  80. package/src/conditions/condition-values.ts +31 -89
  81. package/src/conditions/condition.ts +5 -5
  82. package/src/conditions/enums.ts +7 -1
  83. package/src/conditions/helpers.ts +10 -2
  84. package/src/conditions/index.ts +4 -6
  85. package/src/conditions/types.ts +47 -24
  86. package/src/form/form-definition/index.ts +47 -51
  87. package/src/form/form-definition/types.ts +6 -13
  88. package/src/form/form-metadata/types.ts +6 -0
@@ -1,15 +1,12 @@
1
1
  import { ConditionValueAbstract } from '~/src/conditions/condition-value-abstract.js'
2
2
  import { ConditionType, DateDirections } from '~/src/conditions/enums.js'
3
+ import { type DateUnits } from '~/src/conditions/enums.js'
3
4
  import {
4
- type DateTimeUnitValues,
5
- type DateUnits,
6
- type TimeUnits
5
+ type ConditionValueData,
6
+ type RelativeDateValueData
7
7
  } from '~/src/conditions/types.js'
8
8
 
9
- export class ConditionValue
10
- extends ConditionValueAbstract
11
- implements ConditionValueFrom
12
- {
9
+ export class ConditionValue extends ConditionValueAbstract {
13
10
  type: ConditionType.Value
14
11
  value: string
15
12
  display: string
@@ -38,7 +35,7 @@ export class ConditionValue
38
35
  return this.value
39
36
  }
40
37
 
41
- static from(obj: ConditionValue | ConditionValueFrom) {
38
+ static from(obj: ConditionValue | ConditionValueData) {
42
39
  return new ConditionValue(obj.value, obj.display)
43
40
  }
44
41
 
@@ -47,120 +44,65 @@ export class ConditionValue
47
44
  }
48
45
  }
49
46
 
50
- export interface ConditionValueFrom {
51
- value: string
52
- display?: string
53
- }
47
+ export class RelativeDateValue extends ConditionValueAbstract {
48
+ type: ConditionType.RelativeDate
49
+ period
50
+ unit
51
+ direction
54
52
 
55
- export const dateUnits: DateUnits = {
56
- YEARS: { display: 'year(s)', value: 'years' },
57
- MONTHS: { display: 'month(s)', value: 'months' },
58
- DAYS: { display: 'day(s)', value: 'days' }
59
- } as const
60
-
61
- export const timeUnits: TimeUnits = {
62
- HOURS: { display: 'hour(s)', value: 'hours' },
63
- MINUTES: { display: 'minute(s)', value: 'minutes' },
64
- SECONDS: { display: 'second(s)', value: 'seconds' }
65
- } as const
66
-
67
- export const dateTimeUnits: DateUnits & TimeUnits = {
68
- ...dateUnits,
69
- ...timeUnits
70
- } as const
71
-
72
- export class RelativeTimeValue
73
- extends ConditionValueAbstract
74
- implements RelativeTimeValueFrom
75
- {
76
- type: ConditionType.RelativeTime
77
- timePeriod: string
78
- timeUnit: DateTimeUnitValues
79
- direction: DateDirections
80
- timeOnly: boolean
81
-
82
- constructor(
83
- timePeriod: string,
84
- timeUnit: DateTimeUnitValues,
85
- direction: DateDirections,
86
- timeOnly = false
87
- ) {
88
- if (typeof timePeriod !== 'string') {
89
- throw new Error("RelativeTimeValue param 'timePeriod' must be a string")
90
- }
91
-
92
- if (
93
- !Object.values(dateTimeUnits)
94
- .map((unit) => unit.value)
95
- .includes(timeUnit)
96
- ) {
97
- throw new Error(
98
- "RelativeTimeValue param 'dateTimeUnits' must only include DateTimeUnitValues keys"
99
- )
53
+ constructor(period: string, unit: DateUnits, direction: DateDirections) {
54
+ if (typeof period !== 'string') {
55
+ throw new Error("RelativeDateValue param 'period' must be a string")
100
56
  }
101
57
 
102
58
  if (!Object.values(DateDirections).includes(direction)) {
103
59
  throw new Error(
104
- "RelativeTimeValue param 'direction' must be from enum DateDirections"
60
+ "RelativeDateValue param 'direction' must be from enum DateDirections"
105
61
  )
106
62
  }
107
63
 
108
64
  super()
109
65
 
110
- this.type = ConditionType.RelativeTime
111
- this.timePeriod = timePeriod
112
- this.timeUnit = timeUnit
66
+ this.type = ConditionType.RelativeDate
67
+ this.period = period
68
+ this.unit = unit
113
69
  this.direction = direction
114
- this.timeOnly = timeOnly
115
70
  }
116
71
 
117
72
  toPresentationString() {
118
- return `${this.timePeriod} ${this.timeUnit} ${this.direction}`
73
+ return `${this.period} ${this.unit} ${this.direction}`
119
74
  }
120
75
 
121
76
  toExpression(): string {
122
- const timePeriod =
77
+ const period =
123
78
  this.direction === DateDirections.PAST
124
- ? 0 - Number(this.timePeriod)
125
- : this.timePeriod
126
- return this.timeOnly
127
- ? `timeForComparison(${timePeriod}, '${this.timeUnit}')`
128
- : `dateForComparison(${timePeriod}, '${this.timeUnit}')`
79
+ ? 0 - Number(this.period)
80
+ : this.period
81
+
82
+ return `dateForComparison(${period}, '${this.unit}')`
129
83
  }
130
84
 
131
- static from(obj: RelativeTimeValue | RelativeTimeValueFrom) {
132
- return new RelativeTimeValue(
133
- obj.timePeriod,
134
- obj.timeUnit,
135
- obj.direction,
136
- obj.timeOnly
137
- )
85
+ static from(obj: RelativeDateValue | RelativeDateValueData) {
86
+ return new RelativeDateValue(obj.period, obj.unit, obj.direction)
138
87
  }
139
88
 
140
89
  clone() {
141
- return RelativeTimeValue.from(this)
90
+ return RelativeDateValue.from(this)
142
91
  }
143
92
  }
144
93
 
145
- export interface RelativeTimeValueFrom {
146
- timePeriod: string
147
- timeUnit: DateTimeUnitValues
148
- direction: DateDirections
149
- timeOnly: boolean
150
- }
151
-
152
94
  export function conditionValueFrom(
153
95
  obj:
154
96
  | ConditionValue
155
- | RelativeTimeValue
156
- | ({ type: ConditionType.Value } & ConditionValueFrom)
157
- | ({ type: ConditionType.RelativeTime } & RelativeTimeValueFrom)
97
+ | ConditionValueData
98
+ | RelativeDateValue
99
+ | RelativeDateValueData
158
100
  ) {
159
101
  switch (obj.type) {
160
102
  case ConditionType.Value:
161
103
  return ConditionValue.from(obj)
162
104
 
163
- case ConditionType.RelativeTime:
164
- return RelativeTimeValue.from(obj)
105
+ case ConditionType.RelativeDate:
106
+ return RelativeDateValue.from(obj)
165
107
  }
166
108
  }
@@ -4,19 +4,19 @@ import { getExpression } from '~/src/conditions/condition-operators.js'
4
4
  import { ConditionValueAbstract } from '~/src/conditions/condition-value-abstract.js'
5
5
  import {
6
6
  type ConditionValue,
7
- type RelativeTimeValue
7
+ type RelativeDateValue
8
8
  } from '~/src/conditions/condition-values.js'
9
9
  import { type Coordinator, type OperatorName } from '~/src/conditions/enums.js'
10
10
 
11
11
  export class Condition extends ConditionAbstract {
12
- field
13
- operator
14
- value
12
+ field: ConditionField
13
+ operator: OperatorName
14
+ value: ConditionValue | RelativeDateValue
15
15
 
16
16
  constructor(
17
17
  field?: ConditionField,
18
18
  operator?: OperatorName,
19
- value?: ConditionValue | RelativeTimeValue,
19
+ value?: ConditionValue | RelativeDateValue,
20
20
  coordinator?: Coordinator
21
21
  ) {
22
22
  if (!(field instanceof ConditionField)) {
@@ -1,6 +1,6 @@
1
1
  export enum ConditionType {
2
2
  Value = 'Value',
3
- RelativeTime = 'RelativeTime'
3
+ RelativeDate = 'RelativeDate'
4
4
  }
5
5
 
6
6
  export enum Coordinator {
@@ -38,3 +38,9 @@ export enum DateDirections {
38
38
  FUTURE = 'in the future',
39
39
  PAST = 'in the past'
40
40
  }
41
+
42
+ export enum DateUnits {
43
+ YEARS = 'years',
44
+ MONTHS = 'months',
45
+ DAYS = 'days'
46
+ }
@@ -1,7 +1,15 @@
1
- export function toPresentationString(condition) {
1
+ import { type ConditionGroup } from '~/src/conditions/condition-group.js'
2
+ import { type ConditionRef } from '~/src/conditions/condition-ref.js'
3
+ import { type Condition } from '~/src/conditions/condition.js'
4
+
5
+ export function toPresentationString(
6
+ condition: Condition | ConditionRef | ConditionGroup
7
+ ) {
2
8
  return `${condition.coordinatorString()}${condition.conditionString()}`
3
9
  }
4
10
 
5
- export function toExpression(condition) {
11
+ export function toExpression(
12
+ condition: Condition | ConditionRef | ConditionGroup
13
+ ) {
6
14
  return `${condition.coordinatorString()}${condition.conditionExpression()}`
7
15
  }
@@ -2,16 +2,13 @@ export {
2
2
  getExpression,
3
3
  getOperatorConfig,
4
4
  getOperatorNames,
5
- absoluteDateOrTimeOperatorNames,
6
- relativeDateOrTimeOperatorNames
5
+ absoluteDateOperatorNames,
6
+ relativeDateOperatorNames
7
7
  } from '~/src/conditions/condition-operators.js'
8
8
 
9
9
  export {
10
- timeUnits,
11
- dateUnits,
12
- dateTimeUnits,
13
10
  ConditionValue,
14
- RelativeTimeValue,
11
+ RelativeDateValue,
15
12
  conditionValueFrom
16
13
  } from '~/src/conditions/condition-values.js'
17
14
 
@@ -27,6 +24,7 @@ export {
27
24
  ConditionType,
28
25
  Coordinator,
29
26
  DateDirections,
27
+ DateUnits,
30
28
  Operator,
31
29
  OperatorName
32
30
  } from '~/src/conditions/enums.js'
@@ -1,40 +1,63 @@
1
- import { type ComponentDef } from '~/src/components/types.js'
2
- import { type ConditionGroup } from '~/src/conditions/condition-group.js'
3
- import { type ConditionRef } from '~/src/conditions/condition-ref.js'
1
+ import {
2
+ type ComponentDef,
3
+ type ConditionalComponentType
4
+ } from '~/src/components/types.js'
4
5
  import {
5
6
  type ConditionValue,
6
- type RelativeTimeValue
7
+ type RelativeDateValue
7
8
  } from '~/src/conditions/condition-values.js'
8
- import { type Condition } from '~/src/conditions/condition.js'
9
- import { type OperatorName } from '~/src/conditions/enums.js'
9
+ import {
10
+ type ConditionType,
11
+ type Coordinator,
12
+ type DateDirections,
13
+ type DateUnits,
14
+ type OperatorName
15
+ } from '~/src/conditions/enums.js'
16
+
17
+ export interface ConditionValueData {
18
+ type: ConditionType.Value
19
+ value: string
20
+ display: string
21
+ }
22
+
23
+ export interface RelativeDateValueData {
24
+ type: ConditionType.RelativeDate
25
+ period: string
26
+ unit: DateUnits
27
+ direction: DateDirections
28
+ }
10
29
 
11
- export type ConditionsArray = (Condition | ConditionGroup | ConditionRef)[]
30
+ export interface ConditionFieldData {
31
+ name: string
32
+ type: ConditionalComponentType
33
+ display: string
34
+ }
12
35
 
13
- export type DateTimeUnitValues =
14
- | 'years'
15
- | 'months'
16
- | 'days'
17
- | 'hours'
18
- | 'minutes'
19
- | 'seconds'
36
+ export interface ConditionData {
37
+ field: ConditionFieldData
38
+ operator: OperatorName
39
+ value: ConditionValueData | RelativeDateValueData
40
+ coordinator?: Coordinator
41
+ }
42
+
43
+ export interface ConditionRefData {
44
+ conditionName: string
45
+ conditionDisplayName: string
46
+ coordinator?: Coordinator
47
+ }
20
48
 
21
- export interface DateUnits {
22
- YEARS: { display: 'year(s)'; value: 'years' }
23
- MONTHS: { display: 'month(s)'; value: 'months' }
24
- DAYS: { display: 'day(s)'; value: 'days' }
49
+ export interface ConditionGroupData {
50
+ conditions: (ConditionData | ConditionRefData | ConditionGroupData)[]
25
51
  }
26
52
 
27
- export interface TimeUnits {
28
- HOURS: { display: 'hour(s)'; value: 'hours' }
29
- MINUTES: { display: 'minute(s)'; value: 'minutes' }
30
- SECONDS: { display: 'second(s)'; value: 'seconds' }
53
+ export interface ConditionsModelData extends ConditionGroupData {
54
+ name: string
31
55
  }
32
56
 
33
57
  export interface OperatorDefinition {
34
- units?: DateUnits | TimeUnits
35
58
  expression: (
36
59
  component: Pick<ComponentDef, 'type' | 'name'>,
37
- conditionValue: ConditionValue | RelativeTimeValue
60
+ conditionValue: ConditionValue | RelativeDateValue
38
61
  ) => string
39
62
  }
40
63
 
@@ -3,8 +3,16 @@ import Joi from 'joi'
3
3
  import { type ComponentType } from '~/src/components/enums.js'
4
4
  import { type ComponentDef } from '~/src/components/types.js'
5
5
  import {
6
- type ConditionRawData,
7
- type ConditionWrapperValue,
6
+ type ConditionData,
7
+ type ConditionFieldData,
8
+ type ConditionGroupData,
9
+ type ConditionRefData,
10
+ type ConditionsModelData,
11
+ type ConditionValueData,
12
+ type RelativeDateValueData
13
+ } from '~/src/conditions/types.js'
14
+ import {
15
+ type ConditionWrapper,
8
16
  type FormDefinition,
9
17
  type Item,
10
18
  type Link,
@@ -14,95 +22,84 @@ import {
14
22
  type Section
15
23
  } from '~/src/form/form-definition/types.js'
16
24
 
17
- /**
18
- * If an optional key is added, CURRENT_VERSION does not need to be incremented.
19
- * Only breaking changes will require an increment, as well as a migration script.
20
- */
21
- export const CURRENT_VERSION = 2
22
-
23
25
  const sectionsSchema = Joi.object<Section>().keys({
24
26
  name: Joi.string().required(),
25
27
  title: Joi.string().required(),
26
28
  hideTitle: Joi.boolean().optional().default(false)
27
29
  })
28
30
 
29
- const conditionFieldSchema = Joi.object().keys({
31
+ const conditionFieldSchema = Joi.object<ConditionFieldData>().keys({
30
32
  name: Joi.string().required(),
31
33
  type: Joi.string().required(),
32
34
  display: Joi.string().required()
33
35
  })
34
36
 
35
- const conditionValueSchema = Joi.object().keys({
37
+ const conditionValueSchema = Joi.object<ConditionValueData>().keys({
36
38
  type: Joi.string().required(),
37
39
  value: Joi.string().required(),
38
40
  display: Joi.string().required()
39
41
  })
40
42
 
41
- const relativeTimeValueSchema = Joi.object().keys({
43
+ const relativeDateValueSchema = Joi.object<RelativeDateValueData>().keys({
42
44
  type: Joi.string().required(),
43
- timePeriod: Joi.string().required(),
44
- timeUnit: Joi.string().required(),
45
- direction: Joi.string().required(),
46
- timeOnly: Joi.boolean().required()
45
+ period: Joi.string().required(),
46
+ unit: Joi.string().required(),
47
+ direction: Joi.string().required()
47
48
  })
48
49
 
49
- const conditionRefSchema = Joi.object().keys({
50
+ const conditionRefSchema = Joi.object<ConditionRefData>().keys({
50
51
  conditionName: Joi.string().required(),
51
52
  conditionDisplayName: Joi.string().required(),
52
53
  coordinator: Joi.string().optional()
53
54
  })
54
55
 
55
- const conditionSchema = Joi.object().keys({
56
+ const conditionSchema = Joi.object<ConditionData>().keys({
56
57
  field: conditionFieldSchema,
57
58
  operator: Joi.string().required(),
58
- value: Joi.alternatives().try(conditionValueSchema, relativeTimeValueSchema),
59
+ value: Joi.alternatives().try(conditionValueSchema, relativeDateValueSchema),
59
60
  coordinator: Joi.string().optional()
60
61
  })
61
62
 
62
- const conditionGroupSchema = Joi.object().keys({
63
- conditions: Joi.array().items(
64
- Joi.alternatives().try(
65
- conditionSchema,
66
- conditionRefSchema,
67
- Joi.any() /** Should be a joi.link('#conditionGroupSchema') */
68
- )
69
- )
70
- })
71
-
72
- const conditionsModelSchema = Joi.alternatives<ConditionWrapperValue>().try(
73
- Joi.string(),
74
- Joi.object().keys({
75
- name: Joi.string().required(),
63
+ const conditionGroupSchema = Joi.object<ConditionGroupData>()
64
+ .keys({
76
65
  conditions: Joi.array().items(
77
66
  Joi.alternatives().try(
78
67
  conditionSchema,
79
68
  conditionRefSchema,
80
- conditionGroupSchema
69
+ Joi.link('#conditionGroupSchema')
81
70
  )
82
71
  )
83
72
  })
84
- )
73
+ .id('conditionGroupSchema')
85
74
 
86
- const conditionsSchema = Joi.object<ConditionRawData>().keys({
75
+ const conditionsModelSchema = Joi.object<ConditionsModelData>().keys({
76
+ name: Joi.string().required(),
77
+ conditions: Joi.array().items(
78
+ Joi.alternatives().try(
79
+ conditionSchema,
80
+ conditionRefSchema,
81
+ conditionGroupSchema
82
+ )
83
+ )
84
+ })
85
+
86
+ const conditionWrapperSchema = Joi.object<ConditionWrapper>().keys({
87
87
  name: Joi.string().required(),
88
88
  displayName: Joi.string(),
89
89
  value: conditionsModelSchema.required()
90
90
  })
91
91
 
92
- const localisedString = Joi.alternatives().try(
93
- Joi.object({ a: Joi.any() }).unknown(),
94
- Joi.string().allow('')
95
- )
96
-
97
92
  export const componentSchema = Joi.object<ComponentDef>()
98
93
  .keys({
99
94
  type: Joi.string<ComponentType>().required(),
100
95
  name: Joi.string(),
101
- title: localisedString,
102
- hint: localisedString.optional(),
96
+ title: Joi.string().allow(''),
97
+ hint: Joi.string().allow('').optional(),
103
98
  options: Joi.object({
104
99
  rows: Joi.number().empty(''),
105
100
  maxWords: Joi.number().empty(''),
101
+ maxDaysInPast: Joi.number().empty(''),
102
+ maxDaysInFuture: Joi.number().empty(''),
106
103
  customValidationMessage: Joi.string().allow('')
107
104
  })
108
105
  .default({})
@@ -130,7 +127,7 @@ const nextSchema = Joi.object<Link>().keys({
130
127
  */
131
128
  const pageSchema = Joi.object<Page>().keys({
132
129
  path: Joi.string().required().disallow('/status'),
133
- title: localisedString,
130
+ title: Joi.string().allow(''),
134
131
  section: Joi.string(),
135
132
  controller: Joi.string().optional(),
136
133
  components: Joi.array<ComponentDef>().items(componentSchema),
@@ -138,8 +135,8 @@ const pageSchema = Joi.object<Page>().keys({
138
135
  })
139
136
 
140
137
  const baseListItemSchema = Joi.object<Item>().keys({
141
- text: localisedString,
142
- description: localisedString.optional(),
138
+ text: Joi.string().allow(''),
139
+ description: Joi.string().allow('').optional(),
143
140
  conditional: Joi.object<Item['conditional']>()
144
141
  .keys({
145
142
  components: Joi.array<ComponentDef>()
@@ -147,9 +144,8 @@ const baseListItemSchema = Joi.object<Item>().keys({
147
144
  .items(componentSchema.unknown(true))
148
145
  .unique('name')
149
146
  })
150
- .allow(null)
151
147
  .optional(),
152
- condition: Joi.string().allow(null, '').optional()
148
+ condition: Joi.string().allow('').optional()
153
149
  })
154
150
 
155
151
  const stringListItemSchema = baseListItemSchema.append({
@@ -162,7 +158,7 @@ const numberListItemSchema = baseListItemSchema.append({
162
158
 
163
159
  const listSchema = Joi.object<List>().keys({
164
160
  name: Joi.string().required(),
165
- title: localisedString,
161
+ title: Joi.string().allow(''),
166
162
  type: Joi.string().required().valid('string', 'number'),
167
163
  items: Joi.when('type', {
168
164
  is: 'string',
@@ -203,7 +199,7 @@ const phaseBannerSchema = Joi.object<PhaseBanner>().keys({
203
199
  export const formDefinitionSchema = Joi.object<FormDefinition>()
204
200
  .required()
205
201
  .keys({
206
- name: localisedString.optional(),
202
+ name: Joi.string().allow('').optional(),
207
203
  feedback: feedbackSchema.optional(),
208
204
  startPage: Joi.string().optional(),
209
205
  pages: Joi.array<Page>().required().items(pageSchema).unique('path'),
@@ -211,8 +207,8 @@ export const formDefinitionSchema = Joi.object<FormDefinition>()
211
207
  .items(sectionsSchema)
212
208
  .unique('name')
213
209
  .required(),
214
- conditions: Joi.array<ConditionRawData>()
215
- .items(conditionsSchema)
210
+ conditions: Joi.array<ConditionWrapper>()
211
+ .items(conditionWrapperSchema)
216
212
  .unique('name'),
217
213
  lists: Joi.array<List>().items(listSchema).unique('name'),
218
214
  metadata: Joi.object({ a: Joi.any() }).unknown().optional(),
@@ -1,5 +1,5 @@
1
1
  import { type ComponentDef } from '~/src/components/types.js'
2
- import { type Condition } from '~/src/conditions/condition.js'
2
+ import { type ConditionsModelData } from '~/src/conditions/types.js'
3
3
  import { formDefinitionSchema } from '~/src/form/form-definition/index.js'
4
4
 
5
5
  export interface Link {
@@ -27,8 +27,8 @@ export interface Item {
27
27
  text: string
28
28
  value: string | number | boolean
29
29
  description?: string
30
- conditional?: { components: ComponentDef[] } | null
31
- condition?: string | null
30
+ conditional?: { components: ComponentDef[] }
31
+ condition?: string
32
32
  }
33
33
 
34
34
  export interface List {
@@ -49,17 +49,10 @@ export interface PhaseBanner {
49
49
  feedbackUrl?: string
50
50
  }
51
51
 
52
- export type ConditionWrapperValue =
53
- | string
54
- | {
55
- name: string
56
- conditions: Condition[]
57
- }
58
-
59
- export interface ConditionRawData {
52
+ export interface ConditionWrapper {
60
53
  name: string
61
54
  displayName: string
62
- value: ConditionWrapperValue
55
+ value: ConditionsModelData
63
56
  }
64
57
 
65
58
  /**
@@ -68,7 +61,7 @@ export interface ConditionRawData {
68
61
  */
69
62
  export interface FormDefinition {
70
63
  pages: Page[]
71
- conditions: ConditionRawData[]
64
+ conditions: ConditionWrapper[]
72
65
  lists: List[]
73
66
  sections: Section[]
74
67
  startPage?: Page['path']
@@ -113,3 +113,9 @@ export type FormMetadataInput = Pick<
113
113
  FormMetadata,
114
114
  'title' | 'organisation' | 'teamName' | 'teamEmail'
115
115
  >
116
+
117
+ export interface FormResponse {
118
+ id: FormMetadata['id']
119
+ slug: FormMetadata['slug']
120
+ status: string
121
+ }