@defra/forms-model 3.0.442 → 3.0.443

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.
@@ -2,70 +2,70 @@ import Joi from 'joi';
2
2
  import { v4 as uuidV4 } from 'uuid';
3
3
  import { ComponentType } from "../../components/enums.js";
4
4
  const sectionsSchema = Joi.object().description('A form section grouping related pages together').keys({
5
- name: Joi.string().required().description('Unique identifier for the section, used in code and page references'),
6
- title: Joi.string().required().description('Human-readable section title displayed to users'),
5
+ name: Joi.string().trim().required().description('Unique identifier for the section, used in code and page references'),
6
+ title: Joi.string().trim().required().description('Human-readable section title displayed to users'),
7
7
  hideTitle: Joi.boolean().optional().default(false).description('When true, the section title will not be displayed in the UI')
8
8
  });
9
9
  const conditionFieldSchema = Joi.object().description('Field reference used in a condition').keys({
10
- name: Joi.string().required().description('Component name referenced by this condition'),
11
- type: Joi.string().required().description('Data type of the field (e.g., string, number, date)'),
12
- display: Joi.string().required().description('Human-readable name of the field for display purposes')
10
+ name: Joi.string().trim().required().description('Component name referenced by this condition'),
11
+ type: Joi.string().trim().required().description('Data type of the field (e.g., string, number, date)'),
12
+ display: Joi.string().trim().required().description('Human-readable name of the field for display purposes')
13
13
  });
14
14
  const conditionValueSchema = Joi.object().description('Value specification for a condition').keys({
15
- type: Joi.string().required().description('Data type of the value (e.g., string, number, date)'),
16
- value: Joi.string().required().description('The actual value to compare against'),
17
- display: Joi.string().required().description('Human-readable version of the value for display purposes')
15
+ type: Joi.string().trim().required().description('Data type of the value (e.g., string, number, date)'),
16
+ value: Joi.string().trim().required().description('The actual value to compare against'),
17
+ display: Joi.string().trim().required().description('Human-readable version of the value for display purposes')
18
18
  });
19
19
  const relativeDateValueSchema = Joi.object().description('Relative date specification for date-based conditions').keys({
20
- type: Joi.string().required().description('Data type identifier, should be "RelativeDate"'),
21
- period: Joi.string().required().description('Numeric amount of the time period, as a string'),
22
- unit: Joi.string().required().description('Time unit (e.g., days, weeks, months, years)'),
23
- direction: Joi.string().required().description('Temporal direction, either "past" or "future"')
20
+ type: Joi.string().trim().required().description('Data type identifier, should be "RelativeDate"'),
21
+ period: Joi.string().trim().required().description('Numeric amount of the time period, as a string'),
22
+ unit: Joi.string().trim().required().description('Time unit (e.g., days, weeks, months, years)'),
23
+ direction: Joi.string().trim().required().description('Temporal direction, either "past" or "future"')
24
24
  });
25
25
  const conditionRefSchema = Joi.object().description('Reference to a named condition defined elsewhere').keys({
26
- conditionName: Joi.string().required().description('Name of the referenced condition'),
27
- conditionDisplayName: Joi.string().required().description('Human-readable name of the condition for display purposes'),
28
- coordinator: Joi.string().optional().description('Logical operator connecting this condition with others (AND, OR)')
26
+ conditionName: Joi.string().trim().required().description('Name of the referenced condition'),
27
+ conditionDisplayName: Joi.string().trim().required().description('Human-readable name of the condition for display purposes'),
28
+ coordinator: Joi.string().trim().optional().description('Logical operator connecting this condition with others (AND, OR)')
29
29
  });
30
30
  const conditionSchema = Joi.object().description('Condition definition specifying a logical comparison').keys({
31
31
  field: conditionFieldSchema.description('The form field being evaluated in this condition'),
32
- operator: Joi.string().required().description('Comparison operator (equals, greaterThan, contains, etc.)'),
32
+ operator: Joi.string().trim().required().description('Comparison operator (equals, greaterThan, contains, etc.)'),
33
33
  value: Joi.alternatives().try(conditionValueSchema, relativeDateValueSchema).description('Value to compare the field against, either fixed or relative date'),
34
- coordinator: Joi.string().optional().description('Logical operator connecting this condition with others (AND, OR)')
34
+ coordinator: Joi.string().trim().optional().description('Logical operator connecting this condition with others (AND, OR)')
35
35
  });
36
36
  const conditionGroupSchema = Joi.object().description('Group of conditions combined with logical operators').keys({
37
37
  conditions: Joi.array().items(Joi.alternatives().try(conditionSchema, conditionRefSchema, Joi.link('#conditionGroupSchema'))).description('Array of conditions or condition references in this group')
38
38
  }).id('conditionGroupSchema');
39
39
  const conditionsModelSchema = Joi.object().description('Complete condition model with name and condition set').keys({
40
- name: Joi.string().required().description('Unique identifier for the condition set'),
40
+ name: Joi.string().trim().required().description('Unique identifier for the condition set'),
41
41
  conditions: Joi.array().items(Joi.alternatives().try(conditionSchema, conditionRefSchema, conditionGroupSchema)).description('Array of conditions, condition references, or condition groups')
42
42
  });
43
43
  const conditionWrapperSchema = Joi.object().description('Container for a named condition with its definition').keys({
44
- name: Joi.string().required().description('Unique identifier used to reference this condition'),
45
- displayName: Joi.string().description('Human-readable name for display in the UI'),
44
+ name: Joi.string().trim().required().description('Unique identifier used to reference this condition'),
45
+ displayName: Joi.string().trim().description('Human-readable name for display in the UI'),
46
46
  value: conditionsModelSchema.required().description('The complete condition definition')
47
47
  });
48
48
  export const componentSchema = Joi.object().description('Form component definition specifying UI element behavior').keys({
49
- id: Joi.string().uuid().optional().description('Unique identifier for the component'),
50
- type: Joi.string().required().description('Component type (TextField, RadioButtons, DateField, etc.)'),
51
- shortDescription: Joi.string().optional().description('Brief description of the component purpose'),
49
+ id: Joi.string().trim().uuid().optional().description('Unique identifier for the component'),
50
+ type: Joi.string().trim().required().description('Component type (TextField, RadioButtons, DateField, etc.)'),
51
+ shortDescription: Joi.string().trim().optional().description('Brief description of the component purpose'),
52
52
  name: Joi.when('type', {
53
53
  is: Joi.string().valid(ComponentType.Details, ComponentType.Html, ComponentType.InsetText, ComponentType.Markdown),
54
- then: Joi.string().pattern(/^[a-zA-Z]+$/).optional().description('Optional identifier for display-only components'),
55
- otherwise: Joi.string().pattern(/^[a-zA-Z]+$/).description('Unique identifier for the component, used in form data')
54
+ then: Joi.string().trim().pattern(/^[a-zA-Z]+$/).optional().description('Optional identifier for display-only components'),
55
+ otherwise: Joi.string().trim().pattern(/^[a-zA-Z]+$/).description('Unique identifier for the component, used in form data')
56
56
  }),
57
57
  title: Joi.when('type', {
58
58
  is: Joi.string().valid(ComponentType.Details, ComponentType.Html, ComponentType.InsetText, ComponentType.Markdown),
59
- then: Joi.string().optional().description('Optional title for display-only components'),
60
- otherwise: Joi.string().allow('').description('Label displayed above the component')
59
+ then: Joi.string().trim().optional().description('Optional title for display-only components'),
60
+ otherwise: Joi.string().trim().allow('').description('Label displayed above the component')
61
61
  }),
62
- hint: Joi.string().allow('').optional().description('Additional guidance text displayed below the component title'),
62
+ hint: Joi.string().trim().allow('').optional().description('Additional guidance text displayed below the component title'),
63
63
  options: Joi.object({
64
64
  rows: Joi.number().empty('').description('Number of rows for textarea components'),
65
65
  maxWords: Joi.number().empty('').description('Maximum number of words allowed in text inputs'),
66
66
  maxDaysInPast: Joi.number().empty('').description('Maximum days in the past allowed for date inputs'),
67
67
  maxDaysInFuture: Joi.number().empty('').description('Maximum days in the future allowed for date inputs'),
68
- customValidationMessage: Joi.string().allow('').description('Custom error message for validation failures'),
68
+ customValidationMessage: Joi.string().trim().allow('').description('Custom error message for validation failures'),
69
69
  customValidationMessages: Joi.object().unknown(true).optional().description('Custom error messages keyed by validation rule name')
70
70
  }).default({}).unknown(true).description('Component-specific configuration options'),
71
71
  schema: Joi.object({
@@ -73,19 +73,19 @@ export const componentSchema = Joi.object().description('Form component definiti
73
73
  max: Joi.number().empty('').description('Maximum value or length for validation'),
74
74
  length: Joi.number().empty('').description('Exact length required for validation')
75
75
  }).unknown(true).default({}).description('Validation rules for the component'),
76
- list: Joi.string().optional().description('Reference to a predefined list of options for select components')
76
+ list: Joi.string().trim().optional().description('Reference to a predefined list of options for select components')
77
77
  }).unknown(true);
78
78
  export const componentSchemaV2 = componentSchema.keys({
79
- id: Joi.string().uuid().default(() => uuidV4()).description('Auto-generated unique identifier for the component')
79
+ id: Joi.string().trim().uuid().default(() => uuidV4()).description('Auto-generated unique identifier for the component')
80
80
  }).description('Enhanced component schema for V2 forms with auto-generated IDs');
81
81
  const nextSchema = Joi.object().description('Navigation link defining where to go after completing a page').keys({
82
- path: Joi.string().required().description('The target page path to navigate to'),
83
- condition: Joi.string().allow('').optional().description('Optional condition that determines if this path should be taken'),
84
- redirect: Joi.string().optional().description('Optional external URL to redirect to instead of an internal page')
82
+ path: Joi.string().trim().required().description('The target page path to navigate to'),
83
+ condition: Joi.string().trim().allow('').optional().description('Optional condition that determines if this path should be taken'),
84
+ redirect: Joi.string().trim().optional().description('Optional external URL to redirect to instead of an internal page')
85
85
  });
86
86
  const repeatOptions = Joi.object().description('Configuration options for a repeatable page section').keys({
87
- name: Joi.string().required().description('Identifier for the repeatable section, used in data structure'),
88
- title: Joi.string().required().description('Title displayed for each repeatable item')
87
+ name: Joi.string().trim().required().description('Identifier for the repeatable section, used in data structure'),
88
+ title: Joi.string().trim().required().description('Title displayed for each repeatable item')
89
89
  });
90
90
  const repeatSchema = Joi.object().description('Validation rules for a repeatable section').keys({
91
91
  min: Joi.number().empty('').required().description('Minimum number of repetitions required'),
@@ -96,10 +96,10 @@ const pageRepeatSchema = Joi.object().description('Complete configuration for a
96
96
  schema: repeatSchema.required().description('Validation constraints for the number of repetitions')
97
97
  });
98
98
  const eventSchema = Joi.object().description('Event handler configuration for page lifecycle events').keys({
99
- type: Joi.string().allow('http').required().description('Type of the event handler (currently only "http" supported)'),
99
+ type: Joi.string().trim().allow('http').required().description('Type of the event handler (currently only "http" supported)'),
100
100
  options: Joi.object().description('Options specific to the event handler type').keys({
101
- method: Joi.string().allow('POST').required().description('HTTP method to use for the request'),
102
- url: Joi.string().uri({
101
+ method: Joi.string().trim().allow('POST').required().description('HTTP method to use for the request'),
102
+ url: Joi.string().trim().uri({
103
103
  scheme: ['http', 'https']
104
104
  }).required().description('URL endpoint to call when the event fires')
105
105
  })
@@ -114,59 +114,59 @@ const eventsSchema = Joi.object().description('Collection of event handlers for
114
114
  * It should not be configured via the designer.
115
115
  */
116
116
  export const pageSchema = Joi.object().description('Form page definition specifying content and behavior').keys({
117
- id: Joi.string().uuid().optional().description('Unique identifier for the page'),
118
- path: Joi.string().required().disallow('/status').description('URL path for this page, must not be the reserved "/status" path'),
119
- title: Joi.string().required().description('Page title displayed at the top of the page'),
120
- section: Joi.string().description('Section this page belongs to'),
121
- controller: Joi.string().optional().description('Custom controller class name for special page behavior'),
117
+ id: Joi.string().trim().uuid().optional().description('Unique identifier for the page'),
118
+ path: Joi.string().trim().required().disallow('/status').description('URL path for this page, must not be the reserved "/status" path'),
119
+ title: Joi.string().trim().required().description('Page title displayed at the top of the page'),
120
+ section: Joi.string().trim().description('Section this page belongs to'),
121
+ controller: Joi.string().trim().optional().description('Custom controller class name for special page behavior'),
122
122
  components: Joi.array().items(componentSchema).unique('name').description('UI components displayed on this page'),
123
123
  repeat: Joi.when('controller', {
124
- is: Joi.string().valid('RepeatPageController').required(),
124
+ is: Joi.string().trim().valid('RepeatPageController').required(),
125
125
  then: pageRepeatSchema.required().description('Configuration for repeatable pages, required when using RepeatPageController'),
126
126
  otherwise: Joi.any().strip()
127
127
  }),
128
- condition: Joi.string().allow('').optional().description('Optional condition that determines if this page is shown'),
128
+ condition: Joi.string().trim().allow('').optional().description('Optional condition that determines if this page is shown'),
129
129
  next: Joi.array().items(nextSchema).default([]).description('Possible navigation paths after this page'),
130
130
  events: eventsSchema.optional().description('Event handlers for page lifecycle events'),
131
- view: Joi.string().optional().description('Optional custom view template to use for rendering this page')
131
+ view: Joi.string().trim().optional().description('Optional custom view template to use for rendering this page')
132
132
  });
133
133
 
134
134
  /**
135
135
  * V2 engine schema - used with new editor
136
136
  */
137
137
  export const pageSchemaV2 = pageSchema.append({
138
- title: Joi.string().allow('').required().description('Page title with enhanced support for empty titles in V2')
138
+ title: Joi.string().trim().allow('').required().description('Page title with enhanced support for empty titles in V2')
139
139
  }).description('Enhanced page schema for V2 forms with support for empty titles');
140
140
  export const pageSchemaPayloadV2 = pageSchemaV2.keys({
141
- id: Joi.string().uuid().default(() => uuidV4()).description('Auto-generated unique identifier for the page'),
141
+ id: Joi.string().trim().uuid().default(() => uuidV4()).description('Auto-generated unique identifier for the page'),
142
142
  components: Joi.array().items(componentSchemaV2).unique('name').unique('id', {
143
143
  ignoreUndefined: true
144
144
  }).description('Components with auto-generated IDs')
145
145
  }).description('Page schema for payload data with auto-generated IDs for pages and components');
146
146
  const baseListItemSchema = Joi.object().description('Base schema for list items with common properties').keys({
147
- id: Joi.string().uuid().default(() => uuidV4()),
148
- text: Joi.string().allow('').description('Display text shown to the user'),
149
- description: Joi.string().allow('').optional().description('Optional additional descriptive text for the item'),
147
+ id: Joi.string().trim().uuid().default(() => uuidV4()),
148
+ text: Joi.string().trim().allow('').description('Display text shown to the user'),
149
+ description: Joi.string().trim().allow('').optional().description('Optional additional descriptive text for the item'),
150
150
  conditional: Joi.object().description('Optional components to show when this item is selected').keys({
151
151
  components: Joi.array().required().items(componentSchema.unknown(true)).unique('name').description('Components to display conditionally')
152
152
  }).optional(),
153
- condition: Joi.string().allow('').optional().description('Condition that determines if this item is shown'),
153
+ condition: Joi.string().trim().allow('').optional().description('Condition that determines if this item is shown'),
154
154
  hint: Joi.object().optional().keys({
155
- id: Joi.string().uuid().default(() => uuidV4()),
156
- text: Joi.string()
155
+ id: Joi.string().trim().uuid().default(() => uuidV4()),
156
+ text: Joi.string().trim()
157
157
  }).description('Optional hint text to be shown on list item')
158
158
  });
159
159
  const stringListItemSchema = baseListItemSchema.append({
160
- value: Joi.string().required().description('String value stored when this item is selected')
160
+ value: Joi.string().trim().required().description('String value stored when this item is selected')
161
161
  }).description('List item with string value');
162
162
  const numberListItemSchema = baseListItemSchema.append({
163
163
  value: Joi.number().required().description('Numeric value stored when this item is selected')
164
164
  }).description('List item with numeric value');
165
165
  export const listSchema = Joi.object().description('Reusable list of options for select components').keys({
166
- id: Joi.string().uuid().optional().description('Unique identifier for the list'),
167
- name: Joi.string().required().description('Name used to reference this list from components'),
168
- title: Joi.string().required().description('Human-readable title for the list'),
169
- type: Joi.string().required().valid('string', 'number').description('Data type for list values (string or number)'),
166
+ id: Joi.string().trim().uuid().optional().description('Unique identifier for the list'),
167
+ name: Joi.string().trim().required().description('Name used to reference this list from components'),
168
+ title: Joi.string().trim().required().description('Human-readable title for the list'),
169
+ type: Joi.string().trim().required().valid('string', 'number').description('Data type for list values (string or number)'),
170
170
  items: Joi.when('type', {
171
171
  is: 'string',
172
172
  then: Joi.array().items(stringListItemSchema).unique('text').unique('value').description('Array of items with string values'),
@@ -178,26 +178,26 @@ export const listSchema = Joi.object().description('Reusable list of options for
178
178
  * v2 Joi schema for Lists
179
179
  */
180
180
  export const listSchemaV2 = listSchema.keys({
181
- id: Joi.string().uuid().default(() => uuidV4()).description('Auto-generated unique identifier for the list')
181
+ id: Joi.string().trim().uuid().default(() => uuidV4()).description('Auto-generated unique identifier for the list')
182
182
  }).description('Enhanced list schema for V2 forms with auto-generated IDs');
183
183
  const feedbackSchema = Joi.object().description('Feedback configuration for the form').keys({
184
184
  feedbackForm: Joi.boolean().default(false).description('Whether to show the built-in feedback form'),
185
185
  url: Joi.when('feedbackForm', {
186
186
  is: Joi.boolean().valid(false),
187
- then: Joi.string().optional().allow('').description('URL to an external feedback form when not using built-in feedback')
187
+ then: Joi.string().trim().optional().allow('').description('URL to an external feedback form when not using built-in feedback')
188
188
  }),
189
- emailAddress: Joi.string().email({
189
+ emailAddress: Joi.string().trim().email({
190
190
  tlds: {
191
191
  allow: false
192
192
  }
193
193
  }).optional().description('Email address where feedback is sent')
194
194
  });
195
195
  const phaseBannerSchema = Joi.object().description('Phase banner configuration showing development status').keys({
196
- phase: Joi.string().valid('alpha', 'beta').description('Development phase of the service (alpha or beta)')
196
+ phase: Joi.string().trim().valid('alpha', 'beta').description('Development phase of the service (alpha or beta)')
197
197
  });
198
198
  const outputSchema = Joi.object().description('Configuration for form submission output').keys({
199
- audience: Joi.string().valid('human', 'machine').required().description('Target audience for the output (human readable or machine processable)'),
200
- version: Joi.string().required().description('Version identifier for the output format')
199
+ audience: Joi.string().trim().valid('human', 'machine').required().description('Target audience for the output (human readable or machine processable)'),
200
+ version: Joi.string().trim().required().description('Version identifier for the output format')
201
201
  });
202
202
 
203
203
  /**
@@ -205,10 +205,10 @@ const outputSchema = Joi.object().description('Configuration for form submission
205
205
  * @see {@link FormDefinition}
206
206
  */
207
207
  export const formDefinitionSchema = Joi.object().description('Complete form definition describing all aspects of a form').required().keys({
208
- engine: Joi.string().allow('V1', 'V2').default('V1').description('Form engine version to use (V1 or V2)'),
209
- name: Joi.string().allow('').optional().description('Unique name identifying the form'),
208
+ engine: Joi.string().trim().allow('V1', 'V2').default('V1').description('Form engine version to use (V1 or V2)'),
209
+ name: Joi.string().trim().allow('').optional().description('Unique name identifying the form'),
210
210
  feedback: feedbackSchema.optional().description('Feedback mechanism configuration'),
211
- startPage: Joi.string().optional().description('Path of the first page to show when starting the form'),
211
+ startPage: Joi.string().trim().optional().description('Path of the first page to show when starting the form'),
212
212
  pages: Joi.array().required().when('engine', {
213
213
  is: 'V2',
214
214
  then: Joi.array().items(pageSchemaV2).description('Pages using V2 schema with enhanced features'),
@@ -222,14 +222,14 @@ export const formDefinitionSchema = Joi.object().description('Complete form defi
222
222
  metadata: Joi.object({
223
223
  a: Joi.any()
224
224
  }).unknown().optional().description('Custom metadata for the form'),
225
- declaration: Joi.string().allow('').optional().description('Declaration text shown on the summary page'),
225
+ declaration: Joi.string().trim().allow('').optional().description('Declaration text shown on the summary page'),
226
226
  skipSummary: Joi.any().strip().description('option to skip the summary page'),
227
227
  phaseBanner: phaseBannerSchema.optional().description('Phase banner configuration'),
228
- outputEmail: Joi.string().email({
228
+ outputEmail: Joi.string().trim().email({
229
229
  tlds: {
230
230
  allow: ['uk']
231
231
  }
232
- }).trim().optional().description('Email address where form submissions are sent'),
232
+ }).optional().description('Email address where form submissions are sent'),
233
233
  output: outputSchema.optional().description('Configuration for submission output format')
234
234
  });
235
235
  export const formDefinitionV2PayloadSchema = formDefinitionSchema.keys({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Joi","v4","uuidV4","ComponentType","sectionsSchema","object","description","keys","name","string","required","title","hideTitle","boolean","optional","default","conditionFieldSchema","type","display","conditionValueSchema","value","relativeDateValueSchema","period","unit","direction","conditionRefSchema","conditionName","conditionDisplayName","coordinator","conditionSchema","field","operator","alternatives","try","conditionGroupSchema","conditions","array","items","link","id","conditionsModelSchema","conditionWrapperSchema","displayName","componentSchema","uuid","shortDescription","when","is","valid","Details","Html","InsetText","Markdown","then","pattern","otherwise","allow","hint","options","rows","number","empty","maxWords","maxDaysInPast","maxDaysInFuture","customValidationMessage","customValidationMessages","unknown","schema","min","max","length","list","componentSchemaV2","nextSchema","path","condition","redirect","repeatOptions","repeatSchema","pageRepeatSchema","eventSchema","method","url","uri","scheme","eventsSchema","onLoad","onSave","pageSchema","disallow","section","controller","components","unique","repeat","any","strip","next","events","view","pageSchemaV2","append","pageSchemaPayloadV2","ignoreUndefined","baseListItemSchema","text","conditional","stringListItemSchema","numberListItemSchema","listSchema","listSchemaV2","feedbackSchema","feedbackForm","emailAddress","email","tlds","phaseBannerSchema","phase","outputSchema","audience","version","formDefinitionSchema","engine","feedback","startPage","pages","sections","lists","metadata","a","declaration","skipSummary","phaseBanner","outputEmail","trim","output","formDefinitionV2PayloadSchema","Schema"],"sources":["../../../../src/form/form-definition/index.ts"],"sourcesContent":["import Joi, { type LanguageMessages } from 'joi'\nimport { v4 as uuidV4 } from 'uuid'\n\nimport { ComponentType } from '~/src/components/enums.js'\nimport { type ComponentDef } from '~/src/components/types.js'\nimport {\n type ConditionData,\n type ConditionFieldData,\n type ConditionGroupData,\n type ConditionRefData,\n type ConditionValueData,\n type ConditionsModelData,\n type RelativeDateValueData\n} from '~/src/conditions/types.js'\nimport {\n type ConditionWrapper,\n type Event,\n type EventOptions,\n type Events,\n type FormDefinition,\n type Item,\n type Link,\n type List,\n type Page,\n type PhaseBanner,\n type Repeat,\n type RepeatOptions,\n type RepeatSchema,\n type Section\n} from '~/src/form/form-definition/types.js'\n\nconst sectionsSchema = Joi.object<Section>()\n .description('A form section grouping related pages together')\n .keys({\n name: Joi.string()\n .required()\n .description(\n 'Unique identifier for the section, used in code and page references'\n ),\n title: Joi.string()\n .required()\n .description('Human-readable section title displayed to users'),\n hideTitle: Joi.boolean()\n .optional()\n .default(false)\n .description(\n 'When true, the section title will not be displayed in the UI'\n )\n })\n\nconst conditionFieldSchema = Joi.object<ConditionFieldData>()\n .description('Field reference used in a condition')\n .keys({\n name: Joi.string()\n .required()\n .description('Component name referenced by this condition'),\n type: Joi.string()\n .required()\n .description('Data type of the field (e.g., string, number, date)'),\n display: Joi.string()\n .required()\n .description('Human-readable name of the field for display purposes')\n })\n\nconst conditionValueSchema = Joi.object<ConditionValueData>()\n .description('Value specification for a condition')\n .keys({\n type: Joi.string()\n .required()\n .description('Data type of the value (e.g., string, number, date)'),\n value: Joi.string()\n .required()\n .description('The actual value to compare against'),\n display: Joi.string()\n .required()\n .description('Human-readable version of the value for display purposes')\n })\n\nconst relativeDateValueSchema = Joi.object<RelativeDateValueData>()\n .description('Relative date specification for date-based conditions')\n .keys({\n type: Joi.string()\n .required()\n .description('Data type identifier, should be \"RelativeDate\"'),\n period: Joi.string()\n .required()\n .description('Numeric amount of the time period, as a string'),\n unit: Joi.string()\n .required()\n .description('Time unit (e.g., days, weeks, months, years)'),\n direction: Joi.string()\n .required()\n .description('Temporal direction, either \"past\" or \"future\"')\n })\n\nconst conditionRefSchema = Joi.object<ConditionRefData>()\n .description('Reference to a named condition defined elsewhere')\n .keys({\n conditionName: Joi.string()\n .required()\n .description('Name of the referenced condition'),\n conditionDisplayName: Joi.string()\n .required()\n .description('Human-readable name of the condition for display purposes'),\n coordinator: Joi.string()\n .optional()\n .description(\n 'Logical operator connecting this condition with others (AND, OR)'\n )\n })\n\nconst conditionSchema = Joi.object<ConditionData>()\n .description('Condition definition specifying a logical comparison')\n .keys({\n field: conditionFieldSchema.description(\n 'The form field being evaluated in this condition'\n ),\n operator: Joi.string()\n .required()\n .description('Comparison operator (equals, greaterThan, contains, etc.)'),\n value: Joi.alternatives()\n .try(conditionValueSchema, relativeDateValueSchema)\n .description(\n 'Value to compare the field against, either fixed or relative date'\n ),\n coordinator: Joi.string()\n .optional()\n .description(\n 'Logical operator connecting this condition with others (AND, OR)'\n )\n })\n\nconst conditionGroupSchema = Joi.object<ConditionGroupData>()\n .description('Group of conditions combined with logical operators')\n .keys({\n conditions: Joi.array()\n .items(\n Joi.alternatives().try(\n conditionSchema,\n conditionRefSchema,\n Joi.link('#conditionGroupSchema')\n )\n )\n .description('Array of conditions or condition references in this group')\n })\n .id('conditionGroupSchema')\n\nconst conditionsModelSchema = Joi.object<ConditionsModelData>()\n .description('Complete condition model with name and condition set')\n .keys({\n name: Joi.string()\n .required()\n .description('Unique identifier for the condition set'),\n conditions: Joi.array()\n .items(\n Joi.alternatives().try(\n conditionSchema,\n conditionRefSchema,\n conditionGroupSchema\n )\n )\n .description(\n 'Array of conditions, condition references, or condition groups'\n )\n })\n\nconst conditionWrapperSchema = Joi.object<ConditionWrapper>()\n .description('Container for a named condition with its definition')\n .keys({\n name: Joi.string()\n .required()\n .description('Unique identifier used to reference this condition'),\n displayName: Joi.string().description(\n 'Human-readable name for display in the UI'\n ),\n value: conditionsModelSchema\n .required()\n .description('The complete condition definition')\n })\n\nexport const componentSchema = Joi.object<ComponentDef>()\n .description('Form component definition specifying UI element behavior')\n .keys({\n id: Joi.string()\n .uuid()\n .optional()\n .description('Unique identifier for the component'),\n type: Joi.string<ComponentType>()\n .required()\n .description('Component type (TextField, RadioButtons, DateField, etc.)'),\n shortDescription: Joi.string()\n .optional()\n .description('Brief description of the component purpose'),\n name: Joi.when('type', {\n is: Joi.string().valid(\n ComponentType.Details,\n ComponentType.Html,\n ComponentType.InsetText,\n ComponentType.Markdown\n ),\n then: Joi.string()\n .pattern(/^[a-zA-Z]+$/)\n .optional()\n .description('Optional identifier for display-only components'),\n otherwise: Joi.string()\n .pattern(/^[a-zA-Z]+$/)\n .description('Unique identifier for the component, used in form data')\n }),\n title: Joi.when('type', {\n is: Joi.string().valid(\n ComponentType.Details,\n ComponentType.Html,\n ComponentType.InsetText,\n ComponentType.Markdown\n ),\n then: Joi.string()\n .optional()\n .description('Optional title for display-only components'),\n otherwise: Joi.string()\n .allow('')\n .description('Label displayed above the component')\n }),\n hint: Joi.string()\n .allow('')\n .optional()\n .description(\n 'Additional guidance text displayed below the component title'\n ),\n options: Joi.object({\n rows: Joi.number()\n .empty('')\n .description('Number of rows for textarea components'),\n maxWords: Joi.number()\n .empty('')\n .description('Maximum number of words allowed in text inputs'),\n maxDaysInPast: Joi.number()\n .empty('')\n .description('Maximum days in the past allowed for date inputs'),\n maxDaysInFuture: Joi.number()\n .empty('')\n .description('Maximum days in the future allowed for date inputs'),\n customValidationMessage: Joi.string()\n .allow('')\n .description('Custom error message for validation failures'),\n customValidationMessages: Joi.object<LanguageMessages>()\n .unknown(true)\n .optional()\n .description('Custom error messages keyed by validation rule name')\n })\n .default({})\n .unknown(true)\n .description('Component-specific configuration options'),\n schema: Joi.object({\n min: Joi.number()\n .empty('')\n .description('Minimum value or length for validation'),\n max: Joi.number()\n .empty('')\n .description('Maximum value or length for validation'),\n length: Joi.number()\n .empty('')\n .description('Exact length required for validation')\n })\n .unknown(true)\n .default({})\n .description('Validation rules for the component'),\n list: Joi.string()\n .optional()\n .description(\n 'Reference to a predefined list of options for select components'\n )\n })\n .unknown(true)\n\nexport const componentSchemaV2 = componentSchema\n .keys({\n id: Joi.string()\n .uuid()\n .default(() => uuidV4())\n .description('Auto-generated unique identifier for the component')\n })\n .description('Enhanced component schema for V2 forms with auto-generated IDs')\n\nconst nextSchema = Joi.object<Link>()\n .description('Navigation link defining where to go after completing a page')\n .keys({\n path: Joi.string()\n .required()\n .description('The target page path to navigate to'),\n condition: Joi.string()\n .allow('')\n .optional()\n .description(\n 'Optional condition that determines if this path should be taken'\n ),\n redirect: Joi.string()\n .optional()\n .description(\n 'Optional external URL to redirect to instead of an internal page'\n )\n })\n\nconst repeatOptions = Joi.object<RepeatOptions>()\n .description('Configuration options for a repeatable page section')\n .keys({\n name: Joi.string()\n .required()\n .description(\n 'Identifier for the repeatable section, used in data structure'\n ),\n title: Joi.string()\n .required()\n .description('Title displayed for each repeatable item')\n })\n\nconst repeatSchema = Joi.object<RepeatSchema>()\n .description('Validation rules for a repeatable section')\n .keys({\n min: Joi.number()\n .empty('')\n .required()\n .description('Minimum number of repetitions required'),\n max: Joi.number()\n .empty('')\n .required()\n .description('Maximum number of repetitions allowed')\n })\n\nconst pageRepeatSchema = Joi.object<Repeat>()\n .description('Complete configuration for a repeatable page')\n .keys({\n options: repeatOptions\n .required()\n .description('Display and identification options for the repetition'),\n schema: repeatSchema\n .required()\n .description('Validation constraints for the number of repetitions')\n })\n\nconst eventSchema = Joi.object<Event>()\n .description('Event handler configuration for page lifecycle events')\n .keys({\n type: Joi.string()\n .allow('http')\n .required()\n .description(\n 'Type of the event handler (currently only \"http\" supported)'\n ),\n options: Joi.object<EventOptions>()\n .description('Options specific to the event handler type')\n .keys({\n method: Joi.string()\n .allow('POST')\n .required()\n .description('HTTP method to use for the request'),\n url: Joi.string()\n .uri({ scheme: ['http', 'https'] })\n .required()\n .description('URL endpoint to call when the event fires')\n })\n })\n\nconst eventsSchema = Joi.object<Events>()\n .description(\n 'Collection of event handlers for different page lifecycle events'\n )\n .keys({\n onLoad: eventSchema\n .optional()\n .description('Event handler triggered when the page is loaded'),\n onSave: eventSchema\n .optional()\n .description('Event handler triggered when the page data is saved')\n })\n\n/**\n * `/status` is a special route for providing a user's application status.\n * It should not be configured via the designer.\n */\nexport const pageSchema = Joi.object<Page>()\n .description('Form page definition specifying content and behavior')\n .keys({\n id: Joi.string()\n .uuid()\n .optional()\n .description('Unique identifier for the page'),\n path: Joi.string()\n .required()\n .disallow('/status')\n .description(\n 'URL path for this page, must not be the reserved \"/status\" path'\n ),\n title: Joi.string()\n .required()\n .description('Page title displayed at the top of the page'),\n section: Joi.string().description('Section this page belongs to'),\n controller: Joi.string()\n .optional()\n .description('Custom controller class name for special page behavior'),\n components: Joi.array<ComponentDef>()\n .items(componentSchema)\n .unique('name')\n .description('UI components displayed on this page'),\n repeat: Joi.when('controller', {\n is: Joi.string().valid('RepeatPageController').required(),\n then: pageRepeatSchema\n .required()\n .description(\n 'Configuration for repeatable pages, required when using RepeatPageController'\n ),\n otherwise: Joi.any().strip()\n }),\n condition: Joi.string()\n .allow('')\n .optional()\n .description('Optional condition that determines if this page is shown'),\n next: Joi.array<Link>()\n .items(nextSchema)\n .default([])\n .description('Possible navigation paths after this page'),\n events: eventsSchema\n .optional()\n .description('Event handlers for page lifecycle events'),\n view: Joi.string()\n .optional()\n .description(\n 'Optional custom view template to use for rendering this page'\n )\n })\n\n/**\n * V2 engine schema - used with new editor\n */\nexport const pageSchemaV2 = pageSchema\n .append({\n title: Joi.string()\n .allow('')\n .required()\n .description('Page title with enhanced support for empty titles in V2')\n })\n .description(\n 'Enhanced page schema for V2 forms with support for empty titles'\n )\n\nexport const pageSchemaPayloadV2 = pageSchemaV2\n .keys({\n id: Joi.string()\n .uuid()\n .default(() => uuidV4())\n .description('Auto-generated unique identifier for the page'),\n components: Joi.array<ComponentDef>()\n .items(componentSchemaV2)\n .unique('name')\n .unique('id', { ignoreUndefined: true })\n .description('Components with auto-generated IDs')\n })\n .description(\n 'Page schema for payload data with auto-generated IDs for pages and components'\n )\n\nconst baseListItemSchema = Joi.object<Item>()\n .description('Base schema for list items with common properties')\n .keys({\n id: Joi.string()\n .uuid()\n .default(() => uuidV4()),\n text: Joi.string().allow('').description('Display text shown to the user'),\n description: Joi.string()\n .allow('')\n .optional()\n .description('Optional additional descriptive text for the item'),\n conditional: Joi.object<Item['conditional']>()\n .description('Optional components to show when this item is selected')\n .keys({\n components: Joi.array<ComponentDef>()\n .required()\n .items(componentSchema.unknown(true))\n .unique('name')\n .description('Components to display conditionally')\n })\n .optional(),\n condition: Joi.string()\n .allow('')\n .optional()\n .description('Condition that determines if this item is shown'),\n hint: Joi.object<Item['hint']>()\n .optional()\n .keys({\n id: Joi.string()\n .uuid()\n .default(() => uuidV4()),\n text: Joi.string()\n })\n .description('Optional hint text to be shown on list item')\n })\n\nconst stringListItemSchema = baseListItemSchema\n .append({\n value: Joi.string()\n .required()\n .description('String value stored when this item is selected')\n })\n .description('List item with string value')\n\nconst numberListItemSchema = baseListItemSchema\n .append({\n value: Joi.number()\n .required()\n .description('Numeric value stored when this item is selected')\n })\n .description('List item with numeric value')\n\nexport const listSchema = Joi.object<List>()\n .description('Reusable list of options for select components')\n .keys({\n id: Joi.string()\n .uuid()\n .optional()\n .description('Unique identifier for the list'),\n name: Joi.string()\n .required()\n .description('Name used to reference this list from components'),\n title: Joi.string()\n .required()\n .description('Human-readable title for the list'),\n type: Joi.string()\n .required()\n .valid('string', 'number')\n .description('Data type for list values (string or number)'),\n items: Joi.when('type', {\n is: 'string',\n then: Joi.array()\n .items(stringListItemSchema)\n .unique('text')\n .unique('value')\n .description('Array of items with string values'),\n otherwise: Joi.array()\n .items(numberListItemSchema)\n .unique('text')\n .unique('value')\n .description('Array of items with numeric values')\n })\n })\n\n/**\n * v2 Joi schema for Lists\n */\nexport const listSchemaV2 = listSchema\n .keys({\n id: Joi.string()\n .uuid()\n .default(() => uuidV4())\n .description('Auto-generated unique identifier for the list')\n })\n .description('Enhanced list schema for V2 forms with auto-generated IDs')\n\nconst feedbackSchema = Joi.object<FormDefinition['feedback']>()\n .description('Feedback configuration for the form')\n .keys({\n feedbackForm: Joi.boolean()\n .default(false)\n .description('Whether to show the built-in feedback form'),\n url: Joi.when('feedbackForm', {\n is: Joi.boolean().valid(false),\n then: Joi.string()\n .optional()\n .allow('')\n .description(\n 'URL to an external feedback form when not using built-in feedback'\n )\n }),\n emailAddress: Joi.string()\n .email({\n tlds: {\n allow: false\n }\n })\n .optional()\n .description('Email address where feedback is sent')\n })\n\nconst phaseBannerSchema = Joi.object<PhaseBanner>()\n .description('Phase banner configuration showing development status')\n .keys({\n phase: Joi.string()\n .valid('alpha', 'beta')\n .description('Development phase of the service (alpha or beta)')\n })\n\nconst outputSchema = Joi.object<FormDefinition['output']>()\n .description('Configuration for form submission output')\n .keys({\n audience: Joi.string()\n .valid('human', 'machine')\n .required()\n .description(\n 'Target audience for the output (human readable or machine processable)'\n ),\n version: Joi.string()\n .required()\n .description('Version identifier for the output format')\n })\n\n/**\n * Joi schema for `FormDefinition` interface\n * @see {@link FormDefinition}\n */\nexport const formDefinitionSchema = Joi.object<FormDefinition>()\n .description('Complete form definition describing all aspects of a form')\n .required()\n .keys({\n engine: Joi.string()\n .allow('V1', 'V2')\n .default('V1')\n .description('Form engine version to use (V1 or V2)'),\n name: Joi.string()\n .allow('')\n .optional()\n .description('Unique name identifying the form'),\n feedback: feedbackSchema\n .optional()\n .description('Feedback mechanism configuration'),\n startPage: Joi.string()\n .optional()\n .description('Path of the first page to show when starting the form'),\n pages: Joi.array<Page>()\n .required()\n .when('engine', {\n is: 'V2',\n then: Joi.array<Page>()\n .items(pageSchemaV2)\n .description('Pages using V2 schema with enhanced features'),\n otherwise: Joi.array<Page>()\n .items(pageSchema)\n .description('Pages using standard V1 schema')\n })\n .unique('path')\n .unique('id', { ignoreUndefined: true })\n .description('All pages within the form'),\n sections: Joi.array<Section>()\n .items(sectionsSchema)\n .unique('name')\n .unique('title')\n .required()\n .description('Sections grouping related pages together'),\n conditions: Joi.array<ConditionWrapper>()\n .items(conditionWrapperSchema)\n .unique('name')\n .unique('displayName')\n .description('Named conditions used for form logic'),\n lists: Joi.array<List>()\n .items(listSchema)\n .unique('name')\n .unique('title')\n .description('Reusable lists of options for select components'),\n metadata: Joi.object({ a: Joi.any() })\n .unknown()\n .optional()\n .description('Custom metadata for the form'),\n declaration: Joi.string()\n .allow('')\n .optional()\n .description('Declaration text shown on the summary page'),\n skipSummary: Joi.any()\n .strip()\n .description('option to skip the summary page'),\n phaseBanner: phaseBannerSchema\n .optional()\n .description('Phase banner configuration'),\n outputEmail: Joi.string()\n .email({ tlds: { allow: ['uk'] } })\n .trim()\n .optional()\n .description('Email address where form submissions are sent'),\n output: outputSchema\n .optional()\n .description('Configuration for submission output format')\n })\n\nexport const formDefinitionV2PayloadSchema = formDefinitionSchema\n .keys({\n pages: Joi.array<Page>()\n .items(pageSchemaPayloadV2)\n .required()\n .unique('path')\n .unique('id', { ignoreUndefined: true })\n .description('Pages with auto-generated IDs for V2 forms'),\n lists: Joi.array<List>()\n .items(listSchemaV2)\n .unique('name')\n .unique('title')\n .unique('id', { ignoreUndefined: true })\n .description('Lists with auto-generated IDs for V2 forms')\n })\n .description(\n 'Enhanced form definition schema for V2 payloads with auto-generated IDs'\n )\n\n// Maintain compatibility with legacy named export\n// E.g. `import { Schema } from '@defra/forms-model'`\nexport const Schema = formDefinitionSchema\n"],"mappings":"AAAA,OAAOA,GAAG,MAAiC,KAAK;AAChD,SAASC,EAAE,IAAIC,MAAM,QAAQ,MAAM;AAEnC,SAASC,aAAa;AA4BtB,MAAMC,cAAc,GAAGJ,GAAG,CAACK,MAAM,CAAU,CAAC,CACzCC,WAAW,CAAC,gDAAgD,CAAC,CAC7DC,IAAI,CAAC;EACJC,IAAI,EAAER,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CACV,qEACF,CAAC;EACHK,KAAK,EAAEX,GAAG,CAACS,MAAM,CAAC,CAAC,CAChBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,iDAAiD,CAAC;EACjEM,SAAS,EAAEZ,GAAG,CAACa,OAAO,CAAC,CAAC,CACrBC,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC,KAAK,CAAC,CACdT,WAAW,CACV,8DACF;AACJ,CAAC,CAAC;AAEJ,MAAMU,oBAAoB,GAAGhB,GAAG,CAACK,MAAM,CAAqB,CAAC,CAC1DC,WAAW,CAAC,qCAAqC,CAAC,CAClDC,IAAI,CAAC;EACJC,IAAI,EAAER,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,6CAA6C,CAAC;EAC7DW,IAAI,EAAEjB,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,qDAAqD,CAAC;EACrEY,OAAO,EAAElB,GAAG,CAACS,MAAM,CAAC,CAAC,CAClBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,uDAAuD;AACxE,CAAC,CAAC;AAEJ,MAAMa,oBAAoB,GAAGnB,GAAG,CAACK,MAAM,CAAqB,CAAC,CAC1DC,WAAW,CAAC,qCAAqC,CAAC,CAClDC,IAAI,CAAC;EACJU,IAAI,EAAEjB,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,qDAAqD,CAAC;EACrEc,KAAK,EAAEpB,GAAG,CAACS,MAAM,CAAC,CAAC,CAChBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,qCAAqC,CAAC;EACrDY,OAAO,EAAElB,GAAG,CAACS,MAAM,CAAC,CAAC,CAClBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,0DAA0D;AAC3E,CAAC,CAAC;AAEJ,MAAMe,uBAAuB,GAAGrB,GAAG,CAACK,MAAM,CAAwB,CAAC,CAChEC,WAAW,CAAC,uDAAuD,CAAC,CACpEC,IAAI,CAAC;EACJU,IAAI,EAAEjB,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,gDAAgD,CAAC;EAChEgB,MAAM,EAAEtB,GAAG,CAACS,MAAM,CAAC,CAAC,CACjBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,gDAAgD,CAAC;EAChEiB,IAAI,EAAEvB,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,8CAA8C,CAAC;EAC9DkB,SAAS,EAAExB,GAAG,CAACS,MAAM,CAAC,CAAC,CACpBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,+CAA+C;AAChE,CAAC,CAAC;AAEJ,MAAMmB,kBAAkB,GAAGzB,GAAG,CAACK,MAAM,CAAmB,CAAC,CACtDC,WAAW,CAAC,kDAAkD,CAAC,CAC/DC,IAAI,CAAC;EACJmB,aAAa,EAAE1B,GAAG,CAACS,MAAM,CAAC,CAAC,CACxBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,kCAAkC,CAAC;EAClDqB,oBAAoB,EAAE3B,GAAG,CAACS,MAAM,CAAC,CAAC,CAC/BC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,2DAA2D,CAAC;EAC3EsB,WAAW,EAAE5B,GAAG,CAACS,MAAM,CAAC,CAAC,CACtBK,QAAQ,CAAC,CAAC,CACVR,WAAW,CACV,kEACF;AACJ,CAAC,CAAC;AAEJ,MAAMuB,eAAe,GAAG7B,GAAG,CAACK,MAAM,CAAgB,CAAC,CAChDC,WAAW,CAAC,sDAAsD,CAAC,CACnEC,IAAI,CAAC;EACJuB,KAAK,EAAEd,oBAAoB,CAACV,WAAW,CACrC,kDACF,CAAC;EACDyB,QAAQ,EAAE/B,GAAG,CAACS,MAAM,CAAC,CAAC,CACnBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,2DAA2D,CAAC;EAC3Ec,KAAK,EAAEpB,GAAG,CAACgC,YAAY,CAAC,CAAC,CACtBC,GAAG,CAACd,oBAAoB,EAAEE,uBAAuB,CAAC,CAClDf,WAAW,CACV,mEACF,CAAC;EACHsB,WAAW,EAAE5B,GAAG,CAACS,MAAM,CAAC,CAAC,CACtBK,QAAQ,CAAC,CAAC,CACVR,WAAW,CACV,kEACF;AACJ,CAAC,CAAC;AAEJ,MAAM4B,oBAAoB,GAAGlC,GAAG,CAACK,MAAM,CAAqB,CAAC,CAC1DC,WAAW,CAAC,qDAAqD,CAAC,CAClEC,IAAI,CAAC;EACJ4B,UAAU,EAAEnC,GAAG,CAACoC,KAAK,CAAC,CAAC,CACpBC,KAAK,CACJrC,GAAG,CAACgC,YAAY,CAAC,CAAC,CAACC,GAAG,CACpBJ,eAAe,EACfJ,kBAAkB,EAClBzB,GAAG,CAACsC,IAAI,CAAC,uBAAuB,CAClC,CACF,CAAC,CACAhC,WAAW,CAAC,2DAA2D;AAC5E,CAAC,CAAC,CACDiC,EAAE,CAAC,sBAAsB,CAAC;AAE7B,MAAMC,qBAAqB,GAAGxC,GAAG,CAACK,MAAM,CAAsB,CAAC,CAC5DC,WAAW,CAAC,sDAAsD,CAAC,CACnEC,IAAI,CAAC;EACJC,IAAI,EAAER,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,yCAAyC,CAAC;EACzD6B,UAAU,EAAEnC,GAAG,CAACoC,KAAK,CAAC,CAAC,CACpBC,KAAK,CACJrC,GAAG,CAACgC,YAAY,CAAC,CAAC,CAACC,GAAG,CACpBJ,eAAe,EACfJ,kBAAkB,EAClBS,oBACF,CACF,CAAC,CACA5B,WAAW,CACV,gEACF;AACJ,CAAC,CAAC;AAEJ,MAAMmC,sBAAsB,GAAGzC,GAAG,CAACK,MAAM,CAAmB,CAAC,CAC1DC,WAAW,CAAC,qDAAqD,CAAC,CAClEC,IAAI,CAAC;EACJC,IAAI,EAAER,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,oDAAoD,CAAC;EACpEoC,WAAW,EAAE1C,GAAG,CAACS,MAAM,CAAC,CAAC,CAACH,WAAW,CACnC,2CACF,CAAC;EACDc,KAAK,EAAEoB,qBAAqB,CACzB9B,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,mCAAmC;AACpD,CAAC,CAAC;AAEJ,OAAO,MAAMqC,eAAe,GAAG3C,GAAG,CAACK,MAAM,CAAe,CAAC,CACtDC,WAAW,CAAC,0DAA0D,CAAC,CACvEC,IAAI,CAAC;EACJgC,EAAE,EAAEvC,GAAG,CAACS,MAAM,CAAC,CAAC,CACbmC,IAAI,CAAC,CAAC,CACN9B,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,qCAAqC,CAAC;EACrDW,IAAI,EAAEjB,GAAG,CAACS,MAAM,CAAgB,CAAC,CAC9BC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,2DAA2D,CAAC;EAC3EuC,gBAAgB,EAAE7C,GAAG,CAACS,MAAM,CAAC,CAAC,CAC3BK,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,4CAA4C,CAAC;EAC5DE,IAAI,EAAER,GAAG,CAAC8C,IAAI,CAAC,MAAM,EAAE;IACrBC,EAAE,EAAE/C,GAAG,CAACS,MAAM,CAAC,CAAC,CAACuC,KAAK,CACpB7C,aAAa,CAAC8C,OAAO,EACrB9C,aAAa,CAAC+C,IAAI,EAClB/C,aAAa,CAACgD,SAAS,EACvBhD,aAAa,CAACiD,QAChB,CAAC;IACDC,IAAI,EAAErD,GAAG,CAACS,MAAM,CAAC,CAAC,CACf6C,OAAO,CAAC,aAAa,CAAC,CACtBxC,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,iDAAiD,CAAC;IACjEiD,SAAS,EAAEvD,GAAG,CAACS,MAAM,CAAC,CAAC,CACpB6C,OAAO,CAAC,aAAa,CAAC,CACtBhD,WAAW,CAAC,wDAAwD;EACzE,CAAC,CAAC;EACFK,KAAK,EAAEX,GAAG,CAAC8C,IAAI,CAAC,MAAM,EAAE;IACtBC,EAAE,EAAE/C,GAAG,CAACS,MAAM,CAAC,CAAC,CAACuC,KAAK,CACpB7C,aAAa,CAAC8C,OAAO,EACrB9C,aAAa,CAAC+C,IAAI,EAClB/C,aAAa,CAACgD,SAAS,EACvBhD,aAAa,CAACiD,QAChB,CAAC;IACDC,IAAI,EAAErD,GAAG,CAACS,MAAM,CAAC,CAAC,CACfK,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,4CAA4C,CAAC;IAC5DiD,SAAS,EAAEvD,GAAG,CAACS,MAAM,CAAC,CAAC,CACpB+C,KAAK,CAAC,EAAE,CAAC,CACTlD,WAAW,CAAC,qCAAqC;EACtD,CAAC,CAAC;EACFmD,IAAI,EAAEzD,GAAG,CAACS,MAAM,CAAC,CAAC,CACf+C,KAAK,CAAC,EAAE,CAAC,CACT1C,QAAQ,CAAC,CAAC,CACVR,WAAW,CACV,8DACF,CAAC;EACHoD,OAAO,EAAE1D,GAAG,CAACK,MAAM,CAAC;IAClBsD,IAAI,EAAE3D,GAAG,CAAC4D,MAAM,CAAC,CAAC,CACfC,KAAK,CAAC,EAAE,CAAC,CACTvD,WAAW,CAAC,wCAAwC,CAAC;IACxDwD,QAAQ,EAAE9D,GAAG,CAAC4D,MAAM,CAAC,CAAC,CACnBC,KAAK,CAAC,EAAE,CAAC,CACTvD,WAAW,CAAC,gDAAgD,CAAC;IAChEyD,aAAa,EAAE/D,GAAG,CAAC4D,MAAM,CAAC,CAAC,CACxBC,KAAK,CAAC,EAAE,CAAC,CACTvD,WAAW,CAAC,kDAAkD,CAAC;IAClE0D,eAAe,EAAEhE,GAAG,CAAC4D,MAAM,CAAC,CAAC,CAC1BC,KAAK,CAAC,EAAE,CAAC,CACTvD,WAAW,CAAC,oDAAoD,CAAC;IACpE2D,uBAAuB,EAAEjE,GAAG,CAACS,MAAM,CAAC,CAAC,CAClC+C,KAAK,CAAC,EAAE,CAAC,CACTlD,WAAW,CAAC,8CAA8C,CAAC;IAC9D4D,wBAAwB,EAAElE,GAAG,CAACK,MAAM,CAAmB,CAAC,CACrD8D,OAAO,CAAC,IAAI,CAAC,CACbrD,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,qDAAqD;EACtE,CAAC,CAAC,CACCS,OAAO,CAAC,CAAC,CAAC,CAAC,CACXoD,OAAO,CAAC,IAAI,CAAC,CACb7D,WAAW,CAAC,0CAA0C,CAAC;EAC1D8D,MAAM,EAAEpE,GAAG,CAACK,MAAM,CAAC;IACjBgE,GAAG,EAAErE,GAAG,CAAC4D,MAAM,CAAC,CAAC,CACdC,KAAK,CAAC,EAAE,CAAC,CACTvD,WAAW,CAAC,wCAAwC,CAAC;IACxDgE,GAAG,EAAEtE,GAAG,CAAC4D,MAAM,CAAC,CAAC,CACdC,KAAK,CAAC,EAAE,CAAC,CACTvD,WAAW,CAAC,wCAAwC,CAAC;IACxDiE,MAAM,EAAEvE,GAAG,CAAC4D,MAAM,CAAC,CAAC,CACjBC,KAAK,CAAC,EAAE,CAAC,CACTvD,WAAW,CAAC,sCAAsC;EACvD,CAAC,CAAC,CACC6D,OAAO,CAAC,IAAI,CAAC,CACbpD,OAAO,CAAC,CAAC,CAAC,CAAC,CACXT,WAAW,CAAC,oCAAoC,CAAC;EACpDkE,IAAI,EAAExE,GAAG,CAACS,MAAM,CAAC,CAAC,CACfK,QAAQ,CAAC,CAAC,CACVR,WAAW,CACV,iEACF;AACJ,CAAC,CAAC,CACD6D,OAAO,CAAC,IAAI,CAAC;AAEhB,OAAO,MAAMM,iBAAiB,GAAG9B,eAAe,CAC7CpC,IAAI,CAAC;EACJgC,EAAE,EAAEvC,GAAG,CAACS,MAAM,CAAC,CAAC,CACbmC,IAAI,CAAC,CAAC,CACN7B,OAAO,CAAC,MAAMb,MAAM,CAAC,CAAC,CAAC,CACvBI,WAAW,CAAC,oDAAoD;AACrE,CAAC,CAAC,CACDA,WAAW,CAAC,gEAAgE,CAAC;AAEhF,MAAMoE,UAAU,GAAG1E,GAAG,CAACK,MAAM,CAAO,CAAC,CAClCC,WAAW,CAAC,8DAA8D,CAAC,CAC3EC,IAAI,CAAC;EACJoE,IAAI,EAAE3E,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,qCAAqC,CAAC;EACrDsE,SAAS,EAAE5E,GAAG,CAACS,MAAM,CAAC,CAAC,CACpB+C,KAAK,CAAC,EAAE,CAAC,CACT1C,QAAQ,CAAC,CAAC,CACVR,WAAW,CACV,iEACF,CAAC;EACHuE,QAAQ,EAAE7E,GAAG,CAACS,MAAM,CAAC,CAAC,CACnBK,QAAQ,CAAC,CAAC,CACVR,WAAW,CACV,kEACF;AACJ,CAAC,CAAC;AAEJ,MAAMwE,aAAa,GAAG9E,GAAG,CAACK,MAAM,CAAgB,CAAC,CAC9CC,WAAW,CAAC,qDAAqD,CAAC,CAClEC,IAAI,CAAC;EACJC,IAAI,EAAER,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CACV,+DACF,CAAC;EACHK,KAAK,EAAEX,GAAG,CAACS,MAAM,CAAC,CAAC,CAChBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,0CAA0C;AAC3D,CAAC,CAAC;AAEJ,MAAMyE,YAAY,GAAG/E,GAAG,CAACK,MAAM,CAAe,CAAC,CAC5CC,WAAW,CAAC,2CAA2C,CAAC,CACxDC,IAAI,CAAC;EACJ8D,GAAG,EAAErE,GAAG,CAAC4D,MAAM,CAAC,CAAC,CACdC,KAAK,CAAC,EAAE,CAAC,CACTnD,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,wCAAwC,CAAC;EACxDgE,GAAG,EAAEtE,GAAG,CAAC4D,MAAM,CAAC,CAAC,CACdC,KAAK,CAAC,EAAE,CAAC,CACTnD,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,uCAAuC;AACxD,CAAC,CAAC;AAEJ,MAAM0E,gBAAgB,GAAGhF,GAAG,CAACK,MAAM,CAAS,CAAC,CAC1CC,WAAW,CAAC,8CAA8C,CAAC,CAC3DC,IAAI,CAAC;EACJmD,OAAO,EAAEoB,aAAa,CACnBpE,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,uDAAuD,CAAC;EACvE8D,MAAM,EAAEW,YAAY,CACjBrE,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,sDAAsD;AACvE,CAAC,CAAC;AAEJ,MAAM2E,WAAW,GAAGjF,GAAG,CAACK,MAAM,CAAQ,CAAC,CACpCC,WAAW,CAAC,uDAAuD,CAAC,CACpEC,IAAI,CAAC;EACJU,IAAI,EAAEjB,GAAG,CAACS,MAAM,CAAC,CAAC,CACf+C,KAAK,CAAC,MAAM,CAAC,CACb9C,QAAQ,CAAC,CAAC,CACVJ,WAAW,CACV,6DACF,CAAC;EACHoD,OAAO,EAAE1D,GAAG,CAACK,MAAM,CAAe,CAAC,CAChCC,WAAW,CAAC,4CAA4C,CAAC,CACzDC,IAAI,CAAC;IACJ2E,MAAM,EAAElF,GAAG,CAACS,MAAM,CAAC,CAAC,CACjB+C,KAAK,CAAC,MAAM,CAAC,CACb9C,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,oCAAoC,CAAC;IACpD6E,GAAG,EAAEnF,GAAG,CAACS,MAAM,CAAC,CAAC,CACd2E,GAAG,CAAC;MAAEC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO;IAAE,CAAC,CAAC,CAClC3E,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,2CAA2C;EAC5D,CAAC;AACL,CAAC,CAAC;AAEJ,MAAMgF,YAAY,GAAGtF,GAAG,CAACK,MAAM,CAAS,CAAC,CACtCC,WAAW,CACV,kEACF,CAAC,CACAC,IAAI,CAAC;EACJgF,MAAM,EAAEN,WAAW,CAChBnE,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,iDAAiD,CAAC;EACjEkF,MAAM,EAAEP,WAAW,CAChBnE,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,qDAAqD;AACtE,CAAC,CAAC;;AAEJ;AACA;AACA;AACA;AACA,OAAO,MAAMmF,UAAU,GAAGzF,GAAG,CAACK,MAAM,CAAO,CAAC,CACzCC,WAAW,CAAC,sDAAsD,CAAC,CACnEC,IAAI,CAAC;EACJgC,EAAE,EAAEvC,GAAG,CAACS,MAAM,CAAC,CAAC,CACbmC,IAAI,CAAC,CAAC,CACN9B,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,gCAAgC,CAAC;EAChDqE,IAAI,EAAE3E,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVgF,QAAQ,CAAC,SAAS,CAAC,CACnBpF,WAAW,CACV,iEACF,CAAC;EACHK,KAAK,EAAEX,GAAG,CAACS,MAAM,CAAC,CAAC,CAChBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,6CAA6C,CAAC;EAC7DqF,OAAO,EAAE3F,GAAG,CAACS,MAAM,CAAC,CAAC,CAACH,WAAW,CAAC,8BAA8B,CAAC;EACjEsF,UAAU,EAAE5F,GAAG,CAACS,MAAM,CAAC,CAAC,CACrBK,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,wDAAwD,CAAC;EACxEuF,UAAU,EAAE7F,GAAG,CAACoC,KAAK,CAAe,CAAC,CAClCC,KAAK,CAACM,eAAe,CAAC,CACtBmD,MAAM,CAAC,MAAM,CAAC,CACdxF,WAAW,CAAC,sCAAsC,CAAC;EACtDyF,MAAM,EAAE/F,GAAG,CAAC8C,IAAI,CAAC,YAAY,EAAE;IAC7BC,EAAE,EAAE/C,GAAG,CAACS,MAAM,CAAC,CAAC,CAACuC,KAAK,CAAC,sBAAsB,CAAC,CAACtC,QAAQ,CAAC,CAAC;IACzD2C,IAAI,EAAE2B,gBAAgB,CACnBtE,QAAQ,CAAC,CAAC,CACVJ,WAAW,CACV,8EACF,CAAC;IACHiD,SAAS,EAAEvD,GAAG,CAACgG,GAAG,CAAC,CAAC,CAACC,KAAK,CAAC;EAC7B,CAAC,CAAC;EACFrB,SAAS,EAAE5E,GAAG,CAACS,MAAM,CAAC,CAAC,CACpB+C,KAAK,CAAC,EAAE,CAAC,CACT1C,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,0DAA0D,CAAC;EAC1E4F,IAAI,EAAElG,GAAG,CAACoC,KAAK,CAAO,CAAC,CACpBC,KAAK,CAACqC,UAAU,CAAC,CACjB3D,OAAO,CAAC,EAAE,CAAC,CACXT,WAAW,CAAC,2CAA2C,CAAC;EAC3D6F,MAAM,EAAEb,YAAY,CACjBxE,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,0CAA0C,CAAC;EAC1D8F,IAAI,EAAEpG,GAAG,CAACS,MAAM,CAAC,CAAC,CACfK,QAAQ,CAAC,CAAC,CACVR,WAAW,CACV,8DACF;AACJ,CAAC,CAAC;;AAEJ;AACA;AACA;AACA,OAAO,MAAM+F,YAAY,GAAGZ,UAAU,CACnCa,MAAM,CAAC;EACN3F,KAAK,EAAEX,GAAG,CAACS,MAAM,CAAC,CAAC,CAChB+C,KAAK,CAAC,EAAE,CAAC,CACT9C,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,yDAAyD;AAC1E,CAAC,CAAC,CACDA,WAAW,CACV,iEACF,CAAC;AAEH,OAAO,MAAMiG,mBAAmB,GAAGF,YAAY,CAC5C9F,IAAI,CAAC;EACJgC,EAAE,EAAEvC,GAAG,CAACS,MAAM,CAAC,CAAC,CACbmC,IAAI,CAAC,CAAC,CACN7B,OAAO,CAAC,MAAMb,MAAM,CAAC,CAAC,CAAC,CACvBI,WAAW,CAAC,+CAA+C,CAAC;EAC/DuF,UAAU,EAAE7F,GAAG,CAACoC,KAAK,CAAe,CAAC,CAClCC,KAAK,CAACoC,iBAAiB,CAAC,CACxBqB,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,IAAI,EAAE;IAAEU,eAAe,EAAE;EAAK,CAAC,CAAC,CACvClG,WAAW,CAAC,oCAAoC;AACrD,CAAC,CAAC,CACDA,WAAW,CACV,+EACF,CAAC;AAEH,MAAMmG,kBAAkB,GAAGzG,GAAG,CAACK,MAAM,CAAO,CAAC,CAC1CC,WAAW,CAAC,mDAAmD,CAAC,CAChEC,IAAI,CAAC;EACJgC,EAAE,EAAEvC,GAAG,CAACS,MAAM,CAAC,CAAC,CACbmC,IAAI,CAAC,CAAC,CACN7B,OAAO,CAAC,MAAMb,MAAM,CAAC,CAAC,CAAC;EAC1BwG,IAAI,EAAE1G,GAAG,CAACS,MAAM,CAAC,CAAC,CAAC+C,KAAK,CAAC,EAAE,CAAC,CAAClD,WAAW,CAAC,gCAAgC,CAAC;EAC1EA,WAAW,EAAEN,GAAG,CAACS,MAAM,CAAC,CAAC,CACtB+C,KAAK,CAAC,EAAE,CAAC,CACT1C,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,mDAAmD,CAAC;EACnEqG,WAAW,EAAE3G,GAAG,CAACK,MAAM,CAAsB,CAAC,CAC3CC,WAAW,CAAC,wDAAwD,CAAC,CACrEC,IAAI,CAAC;IACJsF,UAAU,EAAE7F,GAAG,CAACoC,KAAK,CAAe,CAAC,CAClC1B,QAAQ,CAAC,CAAC,CACV2B,KAAK,CAACM,eAAe,CAACwB,OAAO,CAAC,IAAI,CAAC,CAAC,CACpC2B,MAAM,CAAC,MAAM,CAAC,CACdxF,WAAW,CAAC,qCAAqC;EACtD,CAAC,CAAC,CACDQ,QAAQ,CAAC,CAAC;EACb8D,SAAS,EAAE5E,GAAG,CAACS,MAAM,CAAC,CAAC,CACpB+C,KAAK,CAAC,EAAE,CAAC,CACT1C,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,iDAAiD,CAAC;EACjEmD,IAAI,EAAEzD,GAAG,CAACK,MAAM,CAAe,CAAC,CAC7BS,QAAQ,CAAC,CAAC,CACVP,IAAI,CAAC;IACJgC,EAAE,EAAEvC,GAAG,CAACS,MAAM,CAAC,CAAC,CACbmC,IAAI,CAAC,CAAC,CACN7B,OAAO,CAAC,MAAMb,MAAM,CAAC,CAAC,CAAC;IAC1BwG,IAAI,EAAE1G,GAAG,CAACS,MAAM,CAAC;EACnB,CAAC,CAAC,CACDH,WAAW,CAAC,6CAA6C;AAC9D,CAAC,CAAC;AAEJ,MAAMsG,oBAAoB,GAAGH,kBAAkB,CAC5CH,MAAM,CAAC;EACNlF,KAAK,EAAEpB,GAAG,CAACS,MAAM,CAAC,CAAC,CAChBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,gDAAgD;AACjE,CAAC,CAAC,CACDA,WAAW,CAAC,6BAA6B,CAAC;AAE7C,MAAMuG,oBAAoB,GAAGJ,kBAAkB,CAC5CH,MAAM,CAAC;EACNlF,KAAK,EAAEpB,GAAG,CAAC4D,MAAM,CAAC,CAAC,CAChBlD,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,iDAAiD;AAClE,CAAC,CAAC,CACDA,WAAW,CAAC,8BAA8B,CAAC;AAE9C,OAAO,MAAMwG,UAAU,GAAG9G,GAAG,CAACK,MAAM,CAAO,CAAC,CACzCC,WAAW,CAAC,gDAAgD,CAAC,CAC7DC,IAAI,CAAC;EACJgC,EAAE,EAAEvC,GAAG,CAACS,MAAM,CAAC,CAAC,CACbmC,IAAI,CAAC,CAAC,CACN9B,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,gCAAgC,CAAC;EAChDE,IAAI,EAAER,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,kDAAkD,CAAC;EAClEK,KAAK,EAAEX,GAAG,CAACS,MAAM,CAAC,CAAC,CAChBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,mCAAmC,CAAC;EACnDW,IAAI,EAAEjB,GAAG,CAACS,MAAM,CAAC,CAAC,CACfC,QAAQ,CAAC,CAAC,CACVsC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACzB1C,WAAW,CAAC,8CAA8C,CAAC;EAC9D+B,KAAK,EAAErC,GAAG,CAAC8C,IAAI,CAAC,MAAM,EAAE;IACtBC,EAAE,EAAE,QAAQ;IACZM,IAAI,EAAErD,GAAG,CAACoC,KAAK,CAAC,CAAC,CACdC,KAAK,CAACuE,oBAAoB,CAAC,CAC3Bd,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,OAAO,CAAC,CACfxF,WAAW,CAAC,mCAAmC,CAAC;IACnDiD,SAAS,EAAEvD,GAAG,CAACoC,KAAK,CAAC,CAAC,CACnBC,KAAK,CAACwE,oBAAoB,CAAC,CAC3Bf,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,OAAO,CAAC,CACfxF,WAAW,CAAC,oCAAoC;EACrD,CAAC;AACH,CAAC,CAAC;;AAEJ;AACA;AACA;AACA,OAAO,MAAMyG,YAAY,GAAGD,UAAU,CACnCvG,IAAI,CAAC;EACJgC,EAAE,EAAEvC,GAAG,CAACS,MAAM,CAAC,CAAC,CACbmC,IAAI,CAAC,CAAC,CACN7B,OAAO,CAAC,MAAMb,MAAM,CAAC,CAAC,CAAC,CACvBI,WAAW,CAAC,+CAA+C;AAChE,CAAC,CAAC,CACDA,WAAW,CAAC,2DAA2D,CAAC;AAE3E,MAAM0G,cAAc,GAAGhH,GAAG,CAACK,MAAM,CAA6B,CAAC,CAC5DC,WAAW,CAAC,qCAAqC,CAAC,CAClDC,IAAI,CAAC;EACJ0G,YAAY,EAAEjH,GAAG,CAACa,OAAO,CAAC,CAAC,CACxBE,OAAO,CAAC,KAAK,CAAC,CACdT,WAAW,CAAC,4CAA4C,CAAC;EAC5D6E,GAAG,EAAEnF,GAAG,CAAC8C,IAAI,CAAC,cAAc,EAAE;IAC5BC,EAAE,EAAE/C,GAAG,CAACa,OAAO,CAAC,CAAC,CAACmC,KAAK,CAAC,KAAK,CAAC;IAC9BK,IAAI,EAAErD,GAAG,CAACS,MAAM,CAAC,CAAC,CACfK,QAAQ,CAAC,CAAC,CACV0C,KAAK,CAAC,EAAE,CAAC,CACTlD,WAAW,CACV,mEACF;EACJ,CAAC,CAAC;EACF4G,YAAY,EAAElH,GAAG,CAACS,MAAM,CAAC,CAAC,CACvB0G,KAAK,CAAC;IACLC,IAAI,EAAE;MACJ5D,KAAK,EAAE;IACT;EACF,CAAC,CAAC,CACD1C,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,sCAAsC;AACvD,CAAC,CAAC;AAEJ,MAAM+G,iBAAiB,GAAGrH,GAAG,CAACK,MAAM,CAAc,CAAC,CAChDC,WAAW,CAAC,uDAAuD,CAAC,CACpEC,IAAI,CAAC;EACJ+G,KAAK,EAAEtH,GAAG,CAACS,MAAM,CAAC,CAAC,CAChBuC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CACtB1C,WAAW,CAAC,kDAAkD;AACnE,CAAC,CAAC;AAEJ,MAAMiH,YAAY,GAAGvH,GAAG,CAACK,MAAM,CAA2B,CAAC,CACxDC,WAAW,CAAC,0CAA0C,CAAC,CACvDC,IAAI,CAAC;EACJiH,QAAQ,EAAExH,GAAG,CAACS,MAAM,CAAC,CAAC,CACnBuC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CACzBtC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CACV,wEACF,CAAC;EACHmH,OAAO,EAAEzH,GAAG,CAACS,MAAM,CAAC,CAAC,CAClBC,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,0CAA0C;AAC3D,CAAC,CAAC;;AAEJ;AACA;AACA;AACA;AACA,OAAO,MAAMoH,oBAAoB,GAAG1H,GAAG,CAACK,MAAM,CAAiB,CAAC,CAC7DC,WAAW,CAAC,2DAA2D,CAAC,CACxEI,QAAQ,CAAC,CAAC,CACVH,IAAI,CAAC;EACJoH,MAAM,EAAE3H,GAAG,CAACS,MAAM,CAAC,CAAC,CACjB+C,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CACjBzC,OAAO,CAAC,IAAI,CAAC,CACbT,WAAW,CAAC,uCAAuC,CAAC;EACvDE,IAAI,EAAER,GAAG,CAACS,MAAM,CAAC,CAAC,CACf+C,KAAK,CAAC,EAAE,CAAC,CACT1C,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,kCAAkC,CAAC;EAClDsH,QAAQ,EAAEZ,cAAc,CACrBlG,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,kCAAkC,CAAC;EAClDuH,SAAS,EAAE7H,GAAG,CAACS,MAAM,CAAC,CAAC,CACpBK,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,uDAAuD,CAAC;EACvEwH,KAAK,EAAE9H,GAAG,CAACoC,KAAK,CAAO,CAAC,CACrB1B,QAAQ,CAAC,CAAC,CACVoC,IAAI,CAAC,QAAQ,EAAE;IACdC,EAAE,EAAE,IAAI;IACRM,IAAI,EAAErD,GAAG,CAACoC,KAAK,CAAO,CAAC,CACpBC,KAAK,CAACgE,YAAY,CAAC,CACnB/F,WAAW,CAAC,8CAA8C,CAAC;IAC9DiD,SAAS,EAAEvD,GAAG,CAACoC,KAAK,CAAO,CAAC,CACzBC,KAAK,CAACoD,UAAU,CAAC,CACjBnF,WAAW,CAAC,gCAAgC;EACjD,CAAC,CAAC,CACDwF,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,IAAI,EAAE;IAAEU,eAAe,EAAE;EAAK,CAAC,CAAC,CACvClG,WAAW,CAAC,2BAA2B,CAAC;EAC3CyH,QAAQ,EAAE/H,GAAG,CAACoC,KAAK,CAAU,CAAC,CAC3BC,KAAK,CAACjC,cAAc,CAAC,CACrB0F,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,OAAO,CAAC,CACfpF,QAAQ,CAAC,CAAC,CACVJ,WAAW,CAAC,0CAA0C,CAAC;EAC1D6B,UAAU,EAAEnC,GAAG,CAACoC,KAAK,CAAmB,CAAC,CACtCC,KAAK,CAACI,sBAAsB,CAAC,CAC7BqD,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,aAAa,CAAC,CACrBxF,WAAW,CAAC,sCAAsC,CAAC;EACtD0H,KAAK,EAAEhI,GAAG,CAACoC,KAAK,CAAO,CAAC,CACrBC,KAAK,CAACyE,UAAU,CAAC,CACjBhB,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,OAAO,CAAC,CACfxF,WAAW,CAAC,iDAAiD,CAAC;EACjE2H,QAAQ,EAAEjI,GAAG,CAACK,MAAM,CAAC;IAAE6H,CAAC,EAAElI,GAAG,CAACgG,GAAG,CAAC;EAAE,CAAC,CAAC,CACnC7B,OAAO,CAAC,CAAC,CACTrD,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,8BAA8B,CAAC;EAC9C6H,WAAW,EAAEnI,GAAG,CAACS,MAAM,CAAC,CAAC,CACtB+C,KAAK,CAAC,EAAE,CAAC,CACT1C,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,4CAA4C,CAAC;EAC5D8H,WAAW,EAAEpI,GAAG,CAACgG,GAAG,CAAC,CAAC,CACnBC,KAAK,CAAC,CAAC,CACP3F,WAAW,CAAC,iCAAiC,CAAC;EACjD+H,WAAW,EAAEhB,iBAAiB,CAC3BvG,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,4BAA4B,CAAC;EAC5CgI,WAAW,EAAEtI,GAAG,CAACS,MAAM,CAAC,CAAC,CACtB0G,KAAK,CAAC;IAAEC,IAAI,EAAE;MAAE5D,KAAK,EAAE,CAAC,IAAI;IAAE;EAAE,CAAC,CAAC,CAClC+E,IAAI,CAAC,CAAC,CACNzH,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,+CAA+C,CAAC;EAC/DkI,MAAM,EAAEjB,YAAY,CACjBzG,QAAQ,CAAC,CAAC,CACVR,WAAW,CAAC,4CAA4C;AAC7D,CAAC,CAAC;AAEJ,OAAO,MAAMmI,6BAA6B,GAAGf,oBAAoB,CAC9DnH,IAAI,CAAC;EACJuH,KAAK,EAAE9H,GAAG,CAACoC,KAAK,CAAO,CAAC,CACrBC,KAAK,CAACkE,mBAAmB,CAAC,CAC1B7F,QAAQ,CAAC,CAAC,CACVoF,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,IAAI,EAAE;IAAEU,eAAe,EAAE;EAAK,CAAC,CAAC,CACvClG,WAAW,CAAC,4CAA4C,CAAC;EAC5D0H,KAAK,EAAEhI,GAAG,CAACoC,KAAK,CAAO,CAAC,CACrBC,KAAK,CAAC0E,YAAY,CAAC,CACnBjB,MAAM,CAAC,MAAM,CAAC,CACdA,MAAM,CAAC,OAAO,CAAC,CACfA,MAAM,CAAC,IAAI,EAAE;IAAEU,eAAe,EAAE;EAAK,CAAC,CAAC,CACvClG,WAAW,CAAC,4CAA4C;AAC7D,CAAC,CAAC,CACDA,WAAW,CACV,yEACF,CAAC;;AAEH;AACA;AACA,OAAO,MAAMoI,MAAM,GAAGhB,oBAAoB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Joi","v4","uuidV4","ComponentType","sectionsSchema","object","description","keys","name","string","trim","required","title","hideTitle","boolean","optional","default","conditionFieldSchema","type","display","conditionValueSchema","value","relativeDateValueSchema","period","unit","direction","conditionRefSchema","conditionName","conditionDisplayName","coordinator","conditionSchema","field","operator","alternatives","try","conditionGroupSchema","conditions","array","items","link","id","conditionsModelSchema","conditionWrapperSchema","displayName","componentSchema","uuid","shortDescription","when","is","valid","Details","Html","InsetText","Markdown","then","pattern","otherwise","allow","hint","options","rows","number","empty","maxWords","maxDaysInPast","maxDaysInFuture","customValidationMessage","customValidationMessages","unknown","schema","min","max","length","list","componentSchemaV2","nextSchema","path","condition","redirect","repeatOptions","repeatSchema","pageRepeatSchema","eventSchema","method","url","uri","scheme","eventsSchema","onLoad","onSave","pageSchema","disallow","section","controller","components","unique","repeat","any","strip","next","events","view","pageSchemaV2","append","pageSchemaPayloadV2","ignoreUndefined","baseListItemSchema","text","conditional","stringListItemSchema","numberListItemSchema","listSchema","listSchemaV2","feedbackSchema","feedbackForm","emailAddress","email","tlds","phaseBannerSchema","phase","outputSchema","audience","version","formDefinitionSchema","engine","feedback","startPage","pages","sections","lists","metadata","a","declaration","skipSummary","phaseBanner","outputEmail","output","formDefinitionV2PayloadSchema","Schema"],"sources":["../../../../src/form/form-definition/index.ts"],"sourcesContent":["import Joi, { type LanguageMessages } from 'joi'\nimport { v4 as uuidV4 } from 'uuid'\n\nimport { ComponentType } from '~/src/components/enums.js'\nimport { type ComponentDef } from '~/src/components/types.js'\nimport {\n type ConditionData,\n type ConditionFieldData,\n type ConditionGroupData,\n type ConditionRefData,\n type ConditionValueData,\n type ConditionsModelData,\n type RelativeDateValueData\n} from '~/src/conditions/types.js'\nimport {\n type ConditionWrapper,\n type Event,\n type EventOptions,\n type Events,\n type FormDefinition,\n type Item,\n type Link,\n type List,\n type Page,\n type PhaseBanner,\n type Repeat,\n type RepeatOptions,\n type RepeatSchema,\n type Section\n} from '~/src/form/form-definition/types.js'\n\nconst sectionsSchema = Joi.object<Section>()\n .description('A form section grouping related pages together')\n .keys({\n name: Joi.string()\n .trim()\n .required()\n .description(\n 'Unique identifier for the section, used in code and page references'\n ),\n title: Joi.string()\n .trim()\n .required()\n .description('Human-readable section title displayed to users'),\n hideTitle: Joi.boolean()\n .optional()\n .default(false)\n .description(\n 'When true, the section title will not be displayed in the UI'\n )\n })\n\nconst conditionFieldSchema = Joi.object<ConditionFieldData>()\n .description('Field reference used in a condition')\n .keys({\n name: Joi.string()\n .trim()\n .required()\n .description('Component name referenced by this condition'),\n type: Joi.string()\n .trim()\n .required()\n .description('Data type of the field (e.g., string, number, date)'),\n display: Joi.string()\n .trim()\n .required()\n .description('Human-readable name of the field for display purposes')\n })\n\nconst conditionValueSchema = Joi.object<ConditionValueData>()\n .description('Value specification for a condition')\n .keys({\n type: Joi.string()\n .trim()\n .required()\n .description('Data type of the value (e.g., string, number, date)'),\n value: Joi.string()\n .trim()\n .required()\n .description('The actual value to compare against'),\n display: Joi.string()\n .trim()\n .required()\n .description('Human-readable version of the value for display purposes')\n })\n\nconst relativeDateValueSchema = Joi.object<RelativeDateValueData>()\n .description('Relative date specification for date-based conditions')\n .keys({\n type: Joi.string()\n .trim()\n .required()\n .description('Data type identifier, should be \"RelativeDate\"'),\n period: Joi.string()\n .trim()\n .required()\n .description('Numeric amount of the time period, as a string'),\n unit: Joi.string()\n .trim()\n .required()\n .description('Time unit (e.g., days, weeks, months, years)'),\n direction: Joi.string()\n .trim()\n .required()\n .description('Temporal direction, either \"past\" or \"future\"')\n })\n\nconst conditionRefSchema = Joi.object<ConditionRefData>()\n .description('Reference to a named condition defined elsewhere')\n .keys({\n conditionName: Joi.string()\n .trim()\n .required()\n .description('Name of the referenced condition'),\n conditionDisplayName: Joi.string()\n .trim()\n .required()\n .description('Human-readable name of the condition for display purposes'),\n coordinator: Joi.string()\n .trim()\n .optional()\n .description(\n 'Logical operator connecting this condition with others (AND, OR)'\n )\n })\n\nconst conditionSchema = Joi.object<ConditionData>()\n .description('Condition definition specifying a logical comparison')\n .keys({\n field: conditionFieldSchema.description(\n 'The form field being evaluated in this condition'\n ),\n operator: Joi.string()\n .trim()\n .required()\n .description('Comparison operator (equals, greaterThan, contains, etc.)'),\n value: Joi.alternatives()\n .try(conditionValueSchema, relativeDateValueSchema)\n .description(\n 'Value to compare the field against, either fixed or relative date'\n ),\n coordinator: Joi.string()\n .trim()\n .optional()\n .description(\n 'Logical operator connecting this condition with others (AND, OR)'\n )\n })\n\nconst conditionGroupSchema = Joi.object<ConditionGroupData>()\n .description('Group of conditions combined with logical operators')\n .keys({\n conditions: Joi.array()\n .items(\n Joi.alternatives().try(\n conditionSchema,\n conditionRefSchema,\n Joi.link('#conditionGroupSchema')\n )\n )\n .description('Array of conditions or condition references in this group')\n })\n .id('conditionGroupSchema')\n\nconst conditionsModelSchema = Joi.object<ConditionsModelData>()\n .description('Complete condition model with name and condition set')\n .keys({\n name: Joi.string()\n .trim()\n .required()\n .description('Unique identifier for the condition set'),\n conditions: Joi.array()\n .items(\n Joi.alternatives().try(\n conditionSchema,\n conditionRefSchema,\n conditionGroupSchema\n )\n )\n .description(\n 'Array of conditions, condition references, or condition groups'\n )\n })\n\nconst conditionWrapperSchema = Joi.object<ConditionWrapper>()\n .description('Container for a named condition with its definition')\n .keys({\n name: Joi.string()\n .trim()\n .required()\n .description('Unique identifier used to reference this condition'),\n displayName: Joi.string()\n .trim()\n .description('Human-readable name for display in the UI'),\n value: conditionsModelSchema\n .required()\n .description('The complete condition definition')\n })\n\nexport const componentSchema = Joi.object<ComponentDef>()\n .description('Form component definition specifying UI element behavior')\n .keys({\n id: Joi.string()\n .trim()\n .uuid()\n .optional()\n .description('Unique identifier for the component'),\n type: Joi.string<ComponentType>()\n .trim()\n .required()\n .description('Component type (TextField, RadioButtons, DateField, etc.)'),\n shortDescription: Joi.string()\n .trim()\n .optional()\n .description('Brief description of the component purpose'),\n name: Joi.when('type', {\n is: Joi.string().valid(\n ComponentType.Details,\n ComponentType.Html,\n ComponentType.InsetText,\n ComponentType.Markdown\n ),\n then: Joi.string()\n .trim()\n .pattern(/^[a-zA-Z]+$/)\n .optional()\n .description('Optional identifier for display-only components'),\n otherwise: Joi.string()\n .trim()\n .pattern(/^[a-zA-Z]+$/)\n .description('Unique identifier for the component, used in form data')\n }),\n title: Joi.when('type', {\n is: Joi.string().valid(\n ComponentType.Details,\n ComponentType.Html,\n ComponentType.InsetText,\n ComponentType.Markdown\n ),\n then: Joi.string()\n .trim()\n .optional()\n .description('Optional title for display-only components'),\n otherwise: Joi.string()\n .trim()\n .allow('')\n .description('Label displayed above the component')\n }),\n hint: Joi.string()\n .trim()\n .allow('')\n .optional()\n .description(\n 'Additional guidance text displayed below the component title'\n ),\n options: Joi.object({\n rows: Joi.number()\n .empty('')\n .description('Number of rows for textarea components'),\n maxWords: Joi.number()\n .empty('')\n .description('Maximum number of words allowed in text inputs'),\n maxDaysInPast: Joi.number()\n .empty('')\n .description('Maximum days in the past allowed for date inputs'),\n maxDaysInFuture: Joi.number()\n .empty('')\n .description('Maximum days in the future allowed for date inputs'),\n customValidationMessage: Joi.string()\n .trim()\n .allow('')\n .description('Custom error message for validation failures'),\n customValidationMessages: Joi.object<LanguageMessages>()\n .unknown(true)\n .optional()\n .description('Custom error messages keyed by validation rule name')\n })\n .default({})\n .unknown(true)\n .description('Component-specific configuration options'),\n schema: Joi.object({\n min: Joi.number()\n .empty('')\n .description('Minimum value or length for validation'),\n max: Joi.number()\n .empty('')\n .description('Maximum value or length for validation'),\n length: Joi.number()\n .empty('')\n .description('Exact length required for validation')\n })\n .unknown(true)\n .default({})\n .description('Validation rules for the component'),\n list: Joi.string()\n .trim()\n .optional()\n .description(\n 'Reference to a predefined list of options for select components'\n )\n })\n .unknown(true)\n\nexport const componentSchemaV2 = componentSchema\n .keys({\n id: Joi.string()\n .trim()\n .uuid()\n .default(() => uuidV4())\n .description('Auto-generated unique identifier for the component')\n })\n .description('Enhanced component schema for V2 forms with auto-generated IDs')\n\nconst nextSchema = Joi.object<Link>()\n .description('Navigation link defining where to go after completing a page')\n .keys({\n path: Joi.string()\n .trim()\n .required()\n .description('The target page path to navigate to'),\n condition: Joi.string()\n .trim()\n .allow('')\n .optional()\n .description(\n 'Optional condition that determines if this path should be taken'\n ),\n redirect: Joi.string()\n .trim()\n .optional()\n .description(\n 'Optional external URL to redirect to instead of an internal page'\n )\n })\n\nconst repeatOptions = Joi.object<RepeatOptions>()\n .description('Configuration options for a repeatable page section')\n .keys({\n name: Joi.string()\n .trim()\n .required()\n .description(\n 'Identifier for the repeatable section, used in data structure'\n ),\n title: Joi.string()\n .trim()\n .required()\n .description('Title displayed for each repeatable item')\n })\n\nconst repeatSchema = Joi.object<RepeatSchema>()\n .description('Validation rules for a repeatable section')\n .keys({\n min: Joi.number()\n .empty('')\n .required()\n .description('Minimum number of repetitions required'),\n max: Joi.number()\n .empty('')\n .required()\n .description('Maximum number of repetitions allowed')\n })\n\nconst pageRepeatSchema = Joi.object<Repeat>()\n .description('Complete configuration for a repeatable page')\n .keys({\n options: repeatOptions\n .required()\n .description('Display and identification options for the repetition'),\n schema: repeatSchema\n .required()\n .description('Validation constraints for the number of repetitions')\n })\n\nconst eventSchema = Joi.object<Event>()\n .description('Event handler configuration for page lifecycle events')\n .keys({\n type: Joi.string()\n .trim()\n .allow('http')\n .required()\n .description(\n 'Type of the event handler (currently only \"http\" supported)'\n ),\n options: Joi.object<EventOptions>()\n .description('Options specific to the event handler type')\n .keys({\n method: Joi.string()\n .trim()\n .allow('POST')\n .required()\n .description('HTTP method to use for the request'),\n url: Joi.string()\n .trim()\n .uri({ scheme: ['http', 'https'] })\n .required()\n .description('URL endpoint to call when the event fires')\n })\n })\n\nconst eventsSchema = Joi.object<Events>()\n .description(\n 'Collection of event handlers for different page lifecycle events'\n )\n .keys({\n onLoad: eventSchema\n .optional()\n .description('Event handler triggered when the page is loaded'),\n onSave: eventSchema\n .optional()\n .description('Event handler triggered when the page data is saved')\n })\n\n/**\n * `/status` is a special route for providing a user's application status.\n * It should not be configured via the designer.\n */\nexport const pageSchema = Joi.object<Page>()\n .description('Form page definition specifying content and behavior')\n .keys({\n id: Joi.string()\n .trim()\n .uuid()\n .optional()\n .description('Unique identifier for the page'),\n path: Joi.string()\n .trim()\n .required()\n .disallow('/status')\n .description(\n 'URL path for this page, must not be the reserved \"/status\" path'\n ),\n title: Joi.string()\n .trim()\n .required()\n .description('Page title displayed at the top of the page'),\n section: Joi.string().trim().description('Section this page belongs to'),\n controller: Joi.string()\n .trim()\n .optional()\n .description('Custom controller class name for special page behavior'),\n components: Joi.array<ComponentDef>()\n .items(componentSchema)\n .unique('name')\n .description('UI components displayed on this page'),\n repeat: Joi.when('controller', {\n is: Joi.string().trim().valid('RepeatPageController').required(),\n then: pageRepeatSchema\n .required()\n .description(\n 'Configuration for repeatable pages, required when using RepeatPageController'\n ),\n otherwise: Joi.any().strip()\n }),\n condition: Joi.string()\n .trim()\n .allow('')\n .optional()\n .description('Optional condition that determines if this page is shown'),\n next: Joi.array<Link>()\n .items(nextSchema)\n .default([])\n .description('Possible navigation paths after this page'),\n events: eventsSchema\n .optional()\n .description('Event handlers for page lifecycle events'),\n view: Joi.string()\n .trim()\n .optional()\n .description(\n 'Optional custom view template to use for rendering this page'\n )\n })\n\n/**\n * V2 engine schema - used with new editor\n */\nexport const pageSchemaV2 = pageSchema\n .append({\n title: Joi.string()\n .trim()\n .allow('')\n .required()\n .description('Page title with enhanced support for empty titles in V2')\n })\n .description(\n 'Enhanced page schema for V2 forms with support for empty titles'\n )\n\nexport const pageSchemaPayloadV2 = pageSchemaV2\n .keys({\n id: Joi.string()\n .trim()\n .uuid()\n .default(() => uuidV4())\n .description('Auto-generated unique identifier for the page'),\n components: Joi.array<ComponentDef>()\n .items(componentSchemaV2)\n .unique('name')\n .unique('id', { ignoreUndefined: true })\n .description('Components with auto-generated IDs')\n })\n .description(\n 'Page schema for payload data with auto-generated IDs for pages and components'\n )\n\nconst baseListItemSchema = Joi.object<Item>()\n .description('Base schema for list items with common properties')\n .keys({\n id: Joi.string()\n .trim()\n .uuid()\n .default(() => uuidV4()),\n text: Joi.string()\n .trim()\n .allow('')\n .description('Display text shown to the user'),\n description: Joi.string()\n .trim()\n .allow('')\n .optional()\n .description('Optional additional descriptive text for the item'),\n conditional: Joi.object<Item['conditional']>()\n .description('Optional components to show when this item is selected')\n .keys({\n components: Joi.array<ComponentDef>()\n .required()\n .items(componentSchema.unknown(true))\n .unique('name')\n .description('Components to display conditionally')\n })\n .optional(),\n condition: Joi.string()\n .trim()\n .allow('')\n .optional()\n .description('Condition that determines if this item is shown'),\n hint: Joi.object<Item['hint']>()\n .optional()\n .keys({\n id: Joi.string()\n .trim()\n .uuid()\n .default(() => uuidV4()),\n text: Joi.string().trim()\n })\n .description('Optional hint text to be shown on list item')\n })\n\nconst stringListItemSchema = baseListItemSchema\n .append({\n value: Joi.string()\n .trim()\n .required()\n .description('String value stored when this item is selected')\n })\n .description('List item with string value')\n\nconst numberListItemSchema = baseListItemSchema\n .append({\n value: Joi.number()\n .required()\n .description('Numeric value stored when this item is selected')\n })\n .description('List item with numeric value')\n\nexport const listSchema = Joi.object<List>()\n .description('Reusable list of options for select components')\n .keys({\n id: Joi.string()\n .trim()\n .uuid()\n .optional()\n .description('Unique identifier for the list'),\n name: Joi.string()\n .trim()\n .required()\n .description('Name used to reference this list from components'),\n title: Joi.string()\n .trim()\n .required()\n .description('Human-readable title for the list'),\n type: Joi.string()\n .trim()\n .required()\n .valid('string', 'number')\n .description('Data type for list values (string or number)'),\n items: Joi.when('type', {\n is: 'string',\n then: Joi.array()\n .items(stringListItemSchema)\n .unique('text')\n .unique('value')\n .description('Array of items with string values'),\n otherwise: Joi.array()\n .items(numberListItemSchema)\n .unique('text')\n .unique('value')\n .description('Array of items with numeric values')\n })\n })\n\n/**\n * v2 Joi schema for Lists\n */\nexport const listSchemaV2 = listSchema\n .keys({\n id: Joi.string()\n .trim()\n .uuid()\n .default(() => uuidV4())\n .description('Auto-generated unique identifier for the list')\n })\n .description('Enhanced list schema for V2 forms with auto-generated IDs')\n\nconst feedbackSchema = Joi.object<FormDefinition['feedback']>()\n .description('Feedback configuration for the form')\n .keys({\n feedbackForm: Joi.boolean()\n .default(false)\n .description('Whether to show the built-in feedback form'),\n url: Joi.when('feedbackForm', {\n is: Joi.boolean().valid(false),\n then: Joi.string()\n .trim()\n .optional()\n .allow('')\n .description(\n 'URL to an external feedback form when not using built-in feedback'\n )\n }),\n emailAddress: Joi.string()\n .trim()\n .email({\n tlds: {\n allow: false\n }\n })\n .optional()\n .description('Email address where feedback is sent')\n })\n\nconst phaseBannerSchema = Joi.object<PhaseBanner>()\n .description('Phase banner configuration showing development status')\n .keys({\n phase: Joi.string()\n .trim()\n .valid('alpha', 'beta')\n .description('Development phase of the service (alpha or beta)')\n })\n\nconst outputSchema = Joi.object<FormDefinition['output']>()\n .description('Configuration for form submission output')\n .keys({\n audience: Joi.string()\n .trim()\n .valid('human', 'machine')\n .required()\n .description(\n 'Target audience for the output (human readable or machine processable)'\n ),\n version: Joi.string()\n .trim()\n .required()\n .description('Version identifier for the output format')\n })\n\n/**\n * Joi schema for `FormDefinition` interface\n * @see {@link FormDefinition}\n */\nexport const formDefinitionSchema = Joi.object<FormDefinition>()\n .description('Complete form definition describing all aspects of a form')\n .required()\n .keys({\n engine: Joi.string()\n .trim()\n .allow('V1', 'V2')\n .default('V1')\n .description('Form engine version to use (V1 or V2)'),\n name: Joi.string()\n .trim()\n .allow('')\n .optional()\n .description('Unique name identifying the form'),\n feedback: feedbackSchema\n .optional()\n .description('Feedback mechanism configuration'),\n startPage: Joi.string()\n .trim()\n .optional()\n .description('Path of the first page to show when starting the form'),\n pages: Joi.array<Page>()\n .required()\n .when('engine', {\n is: 'V2',\n then: Joi.array<Page>()\n .items(pageSchemaV2)\n .description('Pages using V2 schema with enhanced features'),\n otherwise: Joi.array<Page>()\n .items(pageSchema)\n .description('Pages using standard V1 schema')\n })\n .unique('path')\n .unique('id', { ignoreUndefined: true })\n .description('All pages within the form'),\n sections: Joi.array<Section>()\n .items(sectionsSchema)\n .unique('name')\n .unique('title')\n .required()\n .description('Sections grouping related pages together'),\n conditions: Joi.array<ConditionWrapper>()\n .items(conditionWrapperSchema)\n .unique('name')\n .unique('displayName')\n .description('Named conditions used for form logic'),\n lists: Joi.array<List>()\n .items(listSchema)\n .unique('name')\n .unique('title')\n .description('Reusable lists of options for select components'),\n metadata: Joi.object({ a: Joi.any() })\n .unknown()\n .optional()\n .description('Custom metadata for the form'),\n declaration: Joi.string()\n .trim()\n .allow('')\n .optional()\n .description('Declaration text shown on the summary page'),\n skipSummary: Joi.any()\n .strip()\n .description('option to skip the summary page'),\n phaseBanner: phaseBannerSchema\n .optional()\n .description('Phase banner configuration'),\n outputEmail: Joi.string()\n .trim()\n .email({ tlds: { allow: ['uk'] } })\n .optional()\n .description('Email address where form submissions are sent'),\n output: outputSchema\n .optional()\n .description('Configuration for submission output format')\n })\n\nexport const formDefinitionV2PayloadSchema = formDefinitionSchema\n .keys({\n pages: Joi.array<Page>()\n .items(pageSchemaPayloadV2)\n .required()\n .unique('path')\n .unique('id', { ignoreUndefined: true })\n .description('Pages with auto-generated IDs for V2 forms'),\n lists: Joi.array<List>()\n .items(listSchemaV2)\n .unique('name')\n .unique('title')\n .unique('id', { ignoreUndefined: true })\n .description('Lists with auto-generated IDs for V2 forms')\n })\n .description(\n 'Enhanced form definition schema for V2 payloads with auto-generated IDs'\n )\n\n// Maintain compatibility with legacy named export\n// E.g. `import { Schema } from '@defra/forms-model'`\nexport const Schema = formDefinitionSchema\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-definition/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAA8B,MAAM,KAAK,CAAA;AAIhD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAU7D,OAAO,EAKL,KAAK,cAAc,EAGnB,KAAK,IAAI,EACT,KAAK,IAAI,EAMV,MAAM,qCAAqC,CAAA;AAuJ5C,eAAO,MAAM,eAAe,gCA4FZ,CAAA;AAEhB,eAAO,MAAM,iBAAiB,gCAOkD,CAAA;AA8FhF;;;GAGG;AACH,eAAO,MAAM,UAAU,wBAiDnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,wBAStB,CAAA;AAEH,eAAO,MAAM,mBAAmB,wBAc7B,CAAA;AAsDH,eAAO,MAAM,UAAU,wBA8BnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,wBAOkD,CAAA;AAiD3E;;;GAGG;AACH,eAAO,MAAM,oBAAoB,kCAsE7B,CAAA;AAEJ,eAAO,MAAM,6BAA6B,kCAiBvC,CAAA;AAIH,eAAO,MAAM,MAAM,kCAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-definition/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAA8B,MAAM,KAAK,CAAA;AAIhD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAU7D,OAAO,EAKL,KAAK,cAAc,EAGnB,KAAK,IAAI,EACT,KAAK,IAAI,EAMV,MAAM,qCAAqC,CAAA;AA0K5C,eAAO,MAAM,eAAe,gCAsGZ,CAAA;AAEhB,eAAO,MAAM,iBAAiB,gCAQkD,CAAA;AAsGhF;;;GAGG;AACH,eAAO,MAAM,UAAU,wBAuDnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,wBAUtB,CAAA;AAEH,eAAO,MAAM,mBAAmB,wBAe7B,CAAA;AA8DH,eAAO,MAAM,UAAU,wBAkCnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,wBAQkD,CAAA;AAsD3E;;;GAGG;AACH,eAAO,MAAM,oBAAoB,kCA0E7B,CAAA;AAEJ,eAAO,MAAM,6BAA6B,kCAiBvC,CAAA;AAIH,eAAO,MAAM,MAAM,kCAAuB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-model",
3
- "version": "3.0.442",
3
+ "version": "3.0.443",
4
4
  "description": "A hapi plugin providing the model for Defra forms",
5
5
  "homepage": "https://github.com/DEFRA/forms-designer/tree/main/model#readme",
6
6
  "repository": {
@@ -22,7 +22,7 @@
22
22
  "test:watch": "jest --color --watch"
23
23
  },
24
24
  "dependencies": {
25
- "marked": "^15.0.7",
25
+ "marked": "^15.0.9",
26
26
  "nanoid": "^5.0.7",
27
27
  "slug": "^10.0.0",
28
28
  "uuid": "^11.1.0"
@@ -33,11 +33,13 @@ const sectionsSchema = Joi.object<Section>()
33
33
  .description('A form section grouping related pages together')
34
34
  .keys({
35
35
  name: Joi.string()
36
+ .trim()
36
37
  .required()
37
38
  .description(
38
39
  'Unique identifier for the section, used in code and page references'
39
40
  ),
40
41
  title: Joi.string()
42
+ .trim()
41
43
  .required()
42
44
  .description('Human-readable section title displayed to users'),
43
45
  hideTitle: Joi.boolean()
@@ -52,12 +54,15 @@ const conditionFieldSchema = Joi.object<ConditionFieldData>()
52
54
  .description('Field reference used in a condition')
53
55
  .keys({
54
56
  name: Joi.string()
57
+ .trim()
55
58
  .required()
56
59
  .description('Component name referenced by this condition'),
57
60
  type: Joi.string()
61
+ .trim()
58
62
  .required()
59
63
  .description('Data type of the field (e.g., string, number, date)'),
60
64
  display: Joi.string()
65
+ .trim()
61
66
  .required()
62
67
  .description('Human-readable name of the field for display purposes')
63
68
  })
@@ -66,12 +71,15 @@ const conditionValueSchema = Joi.object<ConditionValueData>()
66
71
  .description('Value specification for a condition')
67
72
  .keys({
68
73
  type: Joi.string()
74
+ .trim()
69
75
  .required()
70
76
  .description('Data type of the value (e.g., string, number, date)'),
71
77
  value: Joi.string()
78
+ .trim()
72
79
  .required()
73
80
  .description('The actual value to compare against'),
74
81
  display: Joi.string()
82
+ .trim()
75
83
  .required()
76
84
  .description('Human-readable version of the value for display purposes')
77
85
  })
@@ -80,15 +88,19 @@ const relativeDateValueSchema = Joi.object<RelativeDateValueData>()
80
88
  .description('Relative date specification for date-based conditions')
81
89
  .keys({
82
90
  type: Joi.string()
91
+ .trim()
83
92
  .required()
84
93
  .description('Data type identifier, should be "RelativeDate"'),
85
94
  period: Joi.string()
95
+ .trim()
86
96
  .required()
87
97
  .description('Numeric amount of the time period, as a string'),
88
98
  unit: Joi.string()
99
+ .trim()
89
100
  .required()
90
101
  .description('Time unit (e.g., days, weeks, months, years)'),
91
102
  direction: Joi.string()
103
+ .trim()
92
104
  .required()
93
105
  .description('Temporal direction, either "past" or "future"')
94
106
  })
@@ -97,12 +109,15 @@ const conditionRefSchema = Joi.object<ConditionRefData>()
97
109
  .description('Reference to a named condition defined elsewhere')
98
110
  .keys({
99
111
  conditionName: Joi.string()
112
+ .trim()
100
113
  .required()
101
114
  .description('Name of the referenced condition'),
102
115
  conditionDisplayName: Joi.string()
116
+ .trim()
103
117
  .required()
104
118
  .description('Human-readable name of the condition for display purposes'),
105
119
  coordinator: Joi.string()
120
+ .trim()
106
121
  .optional()
107
122
  .description(
108
123
  'Logical operator connecting this condition with others (AND, OR)'
@@ -116,6 +131,7 @@ const conditionSchema = Joi.object<ConditionData>()
116
131
  'The form field being evaluated in this condition'
117
132
  ),
118
133
  operator: Joi.string()
134
+ .trim()
119
135
  .required()
120
136
  .description('Comparison operator (equals, greaterThan, contains, etc.)'),
121
137
  value: Joi.alternatives()
@@ -124,6 +140,7 @@ const conditionSchema = Joi.object<ConditionData>()
124
140
  'Value to compare the field against, either fixed or relative date'
125
141
  ),
126
142
  coordinator: Joi.string()
143
+ .trim()
127
144
  .optional()
128
145
  .description(
129
146
  'Logical operator connecting this condition with others (AND, OR)'
@@ -149,6 +166,7 @@ const conditionsModelSchema = Joi.object<ConditionsModelData>()
149
166
  .description('Complete condition model with name and condition set')
150
167
  .keys({
151
168
  name: Joi.string()
169
+ .trim()
152
170
  .required()
153
171
  .description('Unique identifier for the condition set'),
154
172
  conditions: Joi.array()
@@ -168,11 +186,12 @@ const conditionWrapperSchema = Joi.object<ConditionWrapper>()
168
186
  .description('Container for a named condition with its definition')
169
187
  .keys({
170
188
  name: Joi.string()
189
+ .trim()
171
190
  .required()
172
191
  .description('Unique identifier used to reference this condition'),
173
- displayName: Joi.string().description(
174
- 'Human-readable name for display in the UI'
175
- ),
192
+ displayName: Joi.string()
193
+ .trim()
194
+ .description('Human-readable name for display in the UI'),
176
195
  value: conditionsModelSchema
177
196
  .required()
178
197
  .description('The complete condition definition')
@@ -182,13 +201,16 @@ export const componentSchema = Joi.object<ComponentDef>()
182
201
  .description('Form component definition specifying UI element behavior')
183
202
  .keys({
184
203
  id: Joi.string()
204
+ .trim()
185
205
  .uuid()
186
206
  .optional()
187
207
  .description('Unique identifier for the component'),
188
208
  type: Joi.string<ComponentType>()
209
+ .trim()
189
210
  .required()
190
211
  .description('Component type (TextField, RadioButtons, DateField, etc.)'),
191
212
  shortDescription: Joi.string()
213
+ .trim()
192
214
  .optional()
193
215
  .description('Brief description of the component purpose'),
194
216
  name: Joi.when('type', {
@@ -199,10 +221,12 @@ export const componentSchema = Joi.object<ComponentDef>()
199
221
  ComponentType.Markdown
200
222
  ),
201
223
  then: Joi.string()
224
+ .trim()
202
225
  .pattern(/^[a-zA-Z]+$/)
203
226
  .optional()
204
227
  .description('Optional identifier for display-only components'),
205
228
  otherwise: Joi.string()
229
+ .trim()
206
230
  .pattern(/^[a-zA-Z]+$/)
207
231
  .description('Unique identifier for the component, used in form data')
208
232
  }),
@@ -214,13 +238,16 @@ export const componentSchema = Joi.object<ComponentDef>()
214
238
  ComponentType.Markdown
215
239
  ),
216
240
  then: Joi.string()
241
+ .trim()
217
242
  .optional()
218
243
  .description('Optional title for display-only components'),
219
244
  otherwise: Joi.string()
245
+ .trim()
220
246
  .allow('')
221
247
  .description('Label displayed above the component')
222
248
  }),
223
249
  hint: Joi.string()
250
+ .trim()
224
251
  .allow('')
225
252
  .optional()
226
253
  .description(
@@ -240,6 +267,7 @@ export const componentSchema = Joi.object<ComponentDef>()
240
267
  .empty('')
241
268
  .description('Maximum days in the future allowed for date inputs'),
242
269
  customValidationMessage: Joi.string()
270
+ .trim()
243
271
  .allow('')
244
272
  .description('Custom error message for validation failures'),
245
273
  customValidationMessages: Joi.object<LanguageMessages>()
@@ -265,6 +293,7 @@ export const componentSchema = Joi.object<ComponentDef>()
265
293
  .default({})
266
294
  .description('Validation rules for the component'),
267
295
  list: Joi.string()
296
+ .trim()
268
297
  .optional()
269
298
  .description(
270
299
  'Reference to a predefined list of options for select components'
@@ -275,6 +304,7 @@ export const componentSchema = Joi.object<ComponentDef>()
275
304
  export const componentSchemaV2 = componentSchema
276
305
  .keys({
277
306
  id: Joi.string()
307
+ .trim()
278
308
  .uuid()
279
309
  .default(() => uuidV4())
280
310
  .description('Auto-generated unique identifier for the component')
@@ -285,15 +315,18 @@ const nextSchema = Joi.object<Link>()
285
315
  .description('Navigation link defining where to go after completing a page')
286
316
  .keys({
287
317
  path: Joi.string()
318
+ .trim()
288
319
  .required()
289
320
  .description('The target page path to navigate to'),
290
321
  condition: Joi.string()
322
+ .trim()
291
323
  .allow('')
292
324
  .optional()
293
325
  .description(
294
326
  'Optional condition that determines if this path should be taken'
295
327
  ),
296
328
  redirect: Joi.string()
329
+ .trim()
297
330
  .optional()
298
331
  .description(
299
332
  'Optional external URL to redirect to instead of an internal page'
@@ -304,11 +337,13 @@ const repeatOptions = Joi.object<RepeatOptions>()
304
337
  .description('Configuration options for a repeatable page section')
305
338
  .keys({
306
339
  name: Joi.string()
340
+ .trim()
307
341
  .required()
308
342
  .description(
309
343
  'Identifier for the repeatable section, used in data structure'
310
344
  ),
311
345
  title: Joi.string()
346
+ .trim()
312
347
  .required()
313
348
  .description('Title displayed for each repeatable item')
314
349
  })
@@ -341,6 +376,7 @@ const eventSchema = Joi.object<Event>()
341
376
  .description('Event handler configuration for page lifecycle events')
342
377
  .keys({
343
378
  type: Joi.string()
379
+ .trim()
344
380
  .allow('http')
345
381
  .required()
346
382
  .description(
@@ -350,10 +386,12 @@ const eventSchema = Joi.object<Event>()
350
386
  .description('Options specific to the event handler type')
351
387
  .keys({
352
388
  method: Joi.string()
389
+ .trim()
353
390
  .allow('POST')
354
391
  .required()
355
392
  .description('HTTP method to use for the request'),
356
393
  url: Joi.string()
394
+ .trim()
357
395
  .uri({ scheme: ['http', 'https'] })
358
396
  .required()
359
397
  .description('URL endpoint to call when the event fires')
@@ -381,20 +419,24 @@ export const pageSchema = Joi.object<Page>()
381
419
  .description('Form page definition specifying content and behavior')
382
420
  .keys({
383
421
  id: Joi.string()
422
+ .trim()
384
423
  .uuid()
385
424
  .optional()
386
425
  .description('Unique identifier for the page'),
387
426
  path: Joi.string()
427
+ .trim()
388
428
  .required()
389
429
  .disallow('/status')
390
430
  .description(
391
431
  'URL path for this page, must not be the reserved "/status" path'
392
432
  ),
393
433
  title: Joi.string()
434
+ .trim()
394
435
  .required()
395
436
  .description('Page title displayed at the top of the page'),
396
- section: Joi.string().description('Section this page belongs to'),
437
+ section: Joi.string().trim().description('Section this page belongs to'),
397
438
  controller: Joi.string()
439
+ .trim()
398
440
  .optional()
399
441
  .description('Custom controller class name for special page behavior'),
400
442
  components: Joi.array<ComponentDef>()
@@ -402,7 +444,7 @@ export const pageSchema = Joi.object<Page>()
402
444
  .unique('name')
403
445
  .description('UI components displayed on this page'),
404
446
  repeat: Joi.when('controller', {
405
- is: Joi.string().valid('RepeatPageController').required(),
447
+ is: Joi.string().trim().valid('RepeatPageController').required(),
406
448
  then: pageRepeatSchema
407
449
  .required()
408
450
  .description(
@@ -411,6 +453,7 @@ export const pageSchema = Joi.object<Page>()
411
453
  otherwise: Joi.any().strip()
412
454
  }),
413
455
  condition: Joi.string()
456
+ .trim()
414
457
  .allow('')
415
458
  .optional()
416
459
  .description('Optional condition that determines if this page is shown'),
@@ -422,6 +465,7 @@ export const pageSchema = Joi.object<Page>()
422
465
  .optional()
423
466
  .description('Event handlers for page lifecycle events'),
424
467
  view: Joi.string()
468
+ .trim()
425
469
  .optional()
426
470
  .description(
427
471
  'Optional custom view template to use for rendering this page'
@@ -434,6 +478,7 @@ export const pageSchema = Joi.object<Page>()
434
478
  export const pageSchemaV2 = pageSchema
435
479
  .append({
436
480
  title: Joi.string()
481
+ .trim()
437
482
  .allow('')
438
483
  .required()
439
484
  .description('Page title with enhanced support for empty titles in V2')
@@ -445,6 +490,7 @@ export const pageSchemaV2 = pageSchema
445
490
  export const pageSchemaPayloadV2 = pageSchemaV2
446
491
  .keys({
447
492
  id: Joi.string()
493
+ .trim()
448
494
  .uuid()
449
495
  .default(() => uuidV4())
450
496
  .description('Auto-generated unique identifier for the page'),
@@ -462,10 +508,15 @@ const baseListItemSchema = Joi.object<Item>()
462
508
  .description('Base schema for list items with common properties')
463
509
  .keys({
464
510
  id: Joi.string()
511
+ .trim()
465
512
  .uuid()
466
513
  .default(() => uuidV4()),
467
- text: Joi.string().allow('').description('Display text shown to the user'),
514
+ text: Joi.string()
515
+ .trim()
516
+ .allow('')
517
+ .description('Display text shown to the user'),
468
518
  description: Joi.string()
519
+ .trim()
469
520
  .allow('')
470
521
  .optional()
471
522
  .description('Optional additional descriptive text for the item'),
@@ -480,6 +531,7 @@ const baseListItemSchema = Joi.object<Item>()
480
531
  })
481
532
  .optional(),
482
533
  condition: Joi.string()
534
+ .trim()
483
535
  .allow('')
484
536
  .optional()
485
537
  .description('Condition that determines if this item is shown'),
@@ -487,9 +539,10 @@ const baseListItemSchema = Joi.object<Item>()
487
539
  .optional()
488
540
  .keys({
489
541
  id: Joi.string()
542
+ .trim()
490
543
  .uuid()
491
544
  .default(() => uuidV4()),
492
- text: Joi.string()
545
+ text: Joi.string().trim()
493
546
  })
494
547
  .description('Optional hint text to be shown on list item')
495
548
  })
@@ -497,6 +550,7 @@ const baseListItemSchema = Joi.object<Item>()
497
550
  const stringListItemSchema = baseListItemSchema
498
551
  .append({
499
552
  value: Joi.string()
553
+ .trim()
500
554
  .required()
501
555
  .description('String value stored when this item is selected')
502
556
  })
@@ -514,16 +568,20 @@ export const listSchema = Joi.object<List>()
514
568
  .description('Reusable list of options for select components')
515
569
  .keys({
516
570
  id: Joi.string()
571
+ .trim()
517
572
  .uuid()
518
573
  .optional()
519
574
  .description('Unique identifier for the list'),
520
575
  name: Joi.string()
576
+ .trim()
521
577
  .required()
522
578
  .description('Name used to reference this list from components'),
523
579
  title: Joi.string()
580
+ .trim()
524
581
  .required()
525
582
  .description('Human-readable title for the list'),
526
583
  type: Joi.string()
584
+ .trim()
527
585
  .required()
528
586
  .valid('string', 'number')
529
587
  .description('Data type for list values (string or number)'),
@@ -548,6 +606,7 @@ export const listSchema = Joi.object<List>()
548
606
  export const listSchemaV2 = listSchema
549
607
  .keys({
550
608
  id: Joi.string()
609
+ .trim()
551
610
  .uuid()
552
611
  .default(() => uuidV4())
553
612
  .description('Auto-generated unique identifier for the list')
@@ -563,6 +622,7 @@ const feedbackSchema = Joi.object<FormDefinition['feedback']>()
563
622
  url: Joi.when('feedbackForm', {
564
623
  is: Joi.boolean().valid(false),
565
624
  then: Joi.string()
625
+ .trim()
566
626
  .optional()
567
627
  .allow('')
568
628
  .description(
@@ -570,6 +630,7 @@ const feedbackSchema = Joi.object<FormDefinition['feedback']>()
570
630
  )
571
631
  }),
572
632
  emailAddress: Joi.string()
633
+ .trim()
573
634
  .email({
574
635
  tlds: {
575
636
  allow: false
@@ -583,6 +644,7 @@ const phaseBannerSchema = Joi.object<PhaseBanner>()
583
644
  .description('Phase banner configuration showing development status')
584
645
  .keys({
585
646
  phase: Joi.string()
647
+ .trim()
586
648
  .valid('alpha', 'beta')
587
649
  .description('Development phase of the service (alpha or beta)')
588
650
  })
@@ -591,12 +653,14 @@ const outputSchema = Joi.object<FormDefinition['output']>()
591
653
  .description('Configuration for form submission output')
592
654
  .keys({
593
655
  audience: Joi.string()
656
+ .trim()
594
657
  .valid('human', 'machine')
595
658
  .required()
596
659
  .description(
597
660
  'Target audience for the output (human readable or machine processable)'
598
661
  ),
599
662
  version: Joi.string()
663
+ .trim()
600
664
  .required()
601
665
  .description('Version identifier for the output format')
602
666
  })
@@ -610,10 +674,12 @@ export const formDefinitionSchema = Joi.object<FormDefinition>()
610
674
  .required()
611
675
  .keys({
612
676
  engine: Joi.string()
677
+ .trim()
613
678
  .allow('V1', 'V2')
614
679
  .default('V1')
615
680
  .description('Form engine version to use (V1 or V2)'),
616
681
  name: Joi.string()
682
+ .trim()
617
683
  .allow('')
618
684
  .optional()
619
685
  .description('Unique name identifying the form'),
@@ -621,6 +687,7 @@ export const formDefinitionSchema = Joi.object<FormDefinition>()
621
687
  .optional()
622
688
  .description('Feedback mechanism configuration'),
623
689
  startPage: Joi.string()
690
+ .trim()
624
691
  .optional()
625
692
  .description('Path of the first page to show when starting the form'),
626
693
  pages: Joi.array<Page>()
@@ -658,6 +725,7 @@ export const formDefinitionSchema = Joi.object<FormDefinition>()
658
725
  .optional()
659
726
  .description('Custom metadata for the form'),
660
727
  declaration: Joi.string()
728
+ .trim()
661
729
  .allow('')
662
730
  .optional()
663
731
  .description('Declaration text shown on the summary page'),
@@ -668,8 +736,8 @@ export const formDefinitionSchema = Joi.object<FormDefinition>()
668
736
  .optional()
669
737
  .description('Phase banner configuration'),
670
738
  outputEmail: Joi.string()
671
- .email({ tlds: { allow: ['uk'] } })
672
739
  .trim()
740
+ .email({ tlds: { allow: ['uk'] } })
673
741
  .optional()
674
742
  .description('Email address where form submissions are sent'),
675
743
  output: outputSchema