@defra/forms-model 3.0.494 → 3.0.496

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.
@@ -4,6 +4,8 @@ import { v4 as uuidV4 } from 'uuid';
4
4
  import { ComponentType } from "../../components/enums.js";
5
5
  import { ConditionType, OperatorName } from "../../conditions/enums.js";
6
6
  import { SchemaVersion } from "./types.js";
7
+ import { checkErrors } from "../form-manager/errors.js";
8
+ import { FormDefinitionError } from "../form-manager/types.js";
7
9
  import { ControllerType } from "../../pages/enums.js";
8
10
  import { hasComponents } from "../../pages/helpers.js";
9
11
  const Joi = JoiBase.extend(JoiDate);
@@ -44,11 +46,11 @@ const conditionListItemRefDataSchemaV2 = Joi.object().description('List item ref
44
46
  listId: Joi.string().trim().required().when('/lists', {
45
47
  is: Joi.exist(),
46
48
  then: Joi.valid(listIdRef)
47
- }).description('The id of the list'),
49
+ }).description('The id of the list').error(checkErrors(FormDefinitionError.RefConditionListId)),
48
50
  itemId: Joi.string().trim().when('/lists', {
49
51
  is: Joi.exist(),
50
52
  then: Joi.valid(listItemIdRef)
51
- }).required().description('The id of the list item')
53
+ }).required().description('The id of the list item').error(checkErrors(FormDefinitionError.RefConditionItemId))
52
54
  });
53
55
  const relativeDateValueDataSchemaV2 = Joi.object().description('Relative date specification for date-based conditions').keys({
54
56
  period: Joi.number().integer().positive().required().description('Numeric amount of the time period, as a string'),
@@ -71,7 +73,7 @@ const conditionRefDataSchemaV2 = Joi.object().description('Reference to a named
71
73
  conditionId: Joi.string().trim().required().when('/conditions', {
72
74
  is: Joi.exist(),
73
75
  then: Joi.valid(conditionIdRef)
74
- }).description('Name of the referenced condition')
76
+ }).description('Name of the referenced condition').error(checkErrors(FormDefinitionError.RefConditionConditionId))
75
77
  });
76
78
  const conditionSchema = Joi.object().description('Condition definition specifying a logical comparison').keys({
77
79
  field: conditionFieldSchema.description('The form field being evaluated in this condition'),
@@ -84,7 +86,7 @@ export const conditionDataSchemaV2 = Joi.object().description('Condition definit
84
86
  componentId: Joi.string().trim().required().when('/pages', {
85
87
  is: Joi.exist(),
86
88
  then: Joi.valid(componentIdRefSchema)
87
- }).description('Reference to the component id being evaluated in this condition'),
89
+ }).description('Reference to the component id being evaluated in this condition').error(checkErrors(FormDefinitionError.RefConditionComponentId)),
88
90
  operator: Joi.string().trim().valid(...Object.values(OperatorName)).required().description('Comparison operator (equals, greaterThan, contains, etc.)'),
89
91
  type: Joi.string().trim().valid(...Object.values(ConditionType)).required().description('Type of the condition value'),
90
92
  value: Joi.any().required().description('The actual value to compare against').when('type', {
@@ -169,7 +171,7 @@ export const componentSchemaV2 = componentSchema.keys({
169
171
  list: Joi.string().when('/lists', {
170
172
  is: Joi.exist(),
171
173
  then: Joi.valid(listIdRef)
172
- }).optional().description('List id reference to a predefined list of options for select components')
174
+ }).optional().description('List id reference to a predefined list of options for select components').error(checkErrors(FormDefinitionError.RefPageComponentList))
173
175
  }).description('Component schema for V2 forms');
174
176
  export const componentPayloadSchemaV2 = componentSchema.keys({
175
177
  id: idSchema.description('Unique identifier for the component'),
@@ -211,7 +213,7 @@ const eventsSchema = Joi.object().description('Collection of event handlers for
211
213
  onLoad: eventSchema.optional().description('Event handler triggered when the page is loaded'),
212
214
  onSave: eventSchema.optional().description('Event handler triggered when the page data is saved')
213
215
  });
214
- export const pageUploadComponentsSchema = Joi.array().items(fileUploadComponentSchema.required(), contentComponentSchema.optional()).unique('name').unique('id').min(1).max(2).description('Components allowed on Page Upload schema');
216
+ export const pageUploadComponentsSchema = Joi.array().items(fileUploadComponentSchema.required(), contentComponentSchema.optional()).unique('id').unique('name').min(1).max(2).description('Components allowed on Page Upload schema');
215
217
 
216
218
  /**
217
219
  * `/status` is a special route for providing a user's application status.
@@ -246,12 +248,12 @@ export const pageSchemaV2 = pageSchema.append({
246
248
  is: Joi.string().trim().valid(ControllerType.FileUpload).required(),
247
249
  then: pageUploadComponentsSchema
248
250
  }],
249
- otherwise: Joi.array().items(componentSchemaV2).unique('name').unique('id').description('Components schema for V2 forms')
251
+ otherwise: Joi.array().items(componentSchemaV2).unique('id').unique('name').description('Components schema for V2 forms').error(checkErrors([FormDefinitionError.UniquePageComponentId, FormDefinitionError.UniquePageComponentName]))
250
252
  }),
251
253
  condition: Joi.string().trim().when('/conditions', {
252
254
  is: Joi.exist(),
253
255
  then: Joi.valid(conditionIdRef)
254
- }).optional().description('Optional condition that determines if this page is shown')
256
+ }).optional().description('Optional condition that determines if this page is shown').error(checkErrors(FormDefinitionError.RefPageCondition))
255
257
  }).description('Page schema for V2 forms');
256
258
  export const pagePayloadSchemaV2 = pageSchemaV2.append({
257
259
  components: Joi.when('controller', {
@@ -259,7 +261,7 @@ export const pagePayloadSchemaV2 = pageSchemaV2.append({
259
261
  is: Joi.string().trim().valid(ControllerType.FileUpload).required(),
260
262
  then: pageUploadComponentsSchema
261
263
  }],
262
- otherwise: Joi.array().items(componentPayloadSchemaV2).unique('name').unique('id').description('Components schema for V2 forms')
264
+ otherwise: Joi.array().items(componentPayloadSchemaV2).unique('id').unique('name').description('Components schema for V2 forms')
263
265
  })
264
266
  }).description('Payload Page schema for V2 forms');
265
267
  const baseListItemSchema = Joi.object().description('Base schema for list items with common properties').keys({
@@ -288,8 +290,8 @@ export const listSchema = Joi.object().description('Reusable list of options for
288
290
  type: Joi.string().trim().required().valid('string', 'number').description('Data type for list values (string or number)'),
289
291
  items: Joi.when('type', {
290
292
  is: 'string',
291
- then: Joi.array().items(stringListItemSchema).unique('id').unique('text').unique('value').description('Array of items with string values'),
292
- otherwise: Joi.array().items(numberListItemSchema).unique('id').unique('text').unique('value').description('Array of items with numeric values')
293
+ then: Joi.array().items(stringListItemSchema).unique('id').unique('text').unique('value').description('Array of items with string values').error(checkErrors([FormDefinitionError.UniqueListItemId, FormDefinitionError.UniqueListItemText, FormDefinitionError.UniqueListItemValue])),
294
+ otherwise: Joi.array().items(numberListItemSchema).unique('id').unique('text').unique('value').description('Array of items with numeric values').error(checkErrors([FormDefinitionError.UniqueListItemId, FormDefinitionError.UniqueListItemText, FormDefinitionError.UniqueListItemValue]))
293
295
  })
294
296
  });
295
297
 
@@ -330,7 +332,7 @@ export const formDefinitionSchema = Joi.object().description('Complete form defi
330
332
  feedback: feedbackSchema.optional().description('Feedback mechanism configuration'),
331
333
  startPage: Joi.string().trim().optional().description('Path of the first page to show when starting the form'),
332
334
  pages: Joi.array().required().items(pageSchema).description('Pages schema for V1 forms').unique('path'),
333
- sections: Joi.array().items(sectionsSchema).unique('name').unique('title').required().description('Sections grouping related pages together'),
335
+ sections: Joi.array().items(sectionsSchema).unique('name').unique('title').required().description('Sections grouping related pages together').error(checkErrors([FormDefinitionError.UniqueSectionName, FormDefinitionError.UniqueSectionTitle])),
334
336
  conditions: Joi.array().items(conditionWrapperSchema).unique('name').unique('displayName').description('Named conditions used for form logic'),
335
337
  lists: Joi.array().items(listSchema).unique('name').unique('title').description('Reusable lists of options for select components'),
336
338
  metadata: Joi.object({
@@ -348,9 +350,9 @@ export const formDefinitionSchema = Joi.object().description('Complete form defi
348
350
  });
349
351
  export const formDefinitionV2Schema = formDefinitionSchema.keys({
350
352
  schema: Joi.number().integer().valid(SchemaVersion.V2).description('Form schema version to use (2)'),
351
- pages: Joi.array().items(pageSchemaV2).required().unique('path').unique('id').description('Pages schema for V2 forms'),
352
- lists: Joi.array().items(listSchemaV2).unique('name').unique('title').unique('id').description('Lists schema for V2 forms'),
353
- conditions: Joi.array().items(conditionWrapperSchemaV2).unique('id').unique('displayName').description('Named conditions used for form logic')
353
+ pages: Joi.array().items(pageSchemaV2).required().unique('id').unique('path').description('Pages schema for V2 forms').error(checkErrors([FormDefinitionError.UniquePageId, FormDefinitionError.UniquePagePath])),
354
+ lists: Joi.array().items(listSchemaV2).unique('id').unique('name').unique('title').description('Lists schema for V2 forms').error(checkErrors([FormDefinitionError.UniqueListId, FormDefinitionError.UniqueListName, FormDefinitionError.UniqueListTitle])),
355
+ conditions: Joi.array().items(conditionWrapperSchemaV2).unique('id').unique('displayName').description('Named conditions used for form logic').error(checkErrors([FormDefinitionError.UniqueConditionId, FormDefinitionError.UniqueConditionDisplayName]))
354
356
  }).description('Form definition schema for V2');
355
357
 
356
358
  // Maintain compatibility with legacy named export
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["JoiDate","JoiBase","v4","uuidV4","ComponentType","ConditionType","OperatorName","SchemaVersion","ControllerType","hasComponents","Joi","extend","idSchemaOptional","string","uuid","idSchema","default","conditionIdRef","ref","in","adjust","conditions","map","condition","id","componentIdRefSchema","pages","flatMap","page","components","filter","component","listIdRef","lists","list","listItemIdRef","items","item","sectionsSchema","object","description","keys","name","trim","required","title","hideTitle","boolean","optional","conditionFieldSchema","type","display","conditionValueSchema","value","conditionListItemRefDataSchemaV2","listId","when","is","exist","then","valid","itemId","relativeDateValueDataSchemaV2","period","number","integer","positive","unit","direction","relativeDateValueDataSchema","conditionRefSchema","conditionName","conditionDisplayName","coordinator","conditionRefDataSchemaV2","conditionId","conditionSchema","field","operator","alternatives","try","conditionDataSchemaV2","componentId","Object","values","any","switch","BooleanValue","StringValue","NumberValue","DateValue","date","format","raw","ListItemRef","RelativeDate","conditionGroupSchema","array","link","conditionsModelSchema","conditionWrapperSchema","displayName","conditionWrapperSchemaV2","min","conditional","otherwise","max","componentSchema","shortDescription","Details","Html","InsetText","Markdown","pattern","allow","hint","options","rows","empty","maxWords","maxDaysInPast","maxDaysInFuture","customValidationMessage","customValidationMessages","unknown","schema","length","componentSchemaV2","componentPayloadSchemaV2","fileUploadComponentSchema","FileUploadField","contentComponentSchema","List","nextSchema","path","redirect","repeatOptions","repeatSchema","pageRepeatSchema","eventSchema","method","url","uri","scheme","eventsSchema","onLoad","onSave","pageUploadComponentsSchema","unique","pageSchema","disallow","section","controller","repeat","strip","next","events","view","pageSchemaV2","append","FileUpload","pagePayloadSchemaV2","baseListItemSchema","text","stringListItemSchema","numberListItemSchema","listSchema","listSchemaV2","feedbackSchema","feedbackForm","emailAddress","email","tlds","phaseBannerSchema","phase","outputSchema","audience","version","formDefinitionSchema","engine","V1","feedback","startPage","sections","metadata","a","declaration","skipSummary","phaseBanner","outputEmail","output","formDefinitionV2Schema","V2","Schema"],"sources":["../../../../src/form/form-definition/index.ts"],"sourcesContent":["import JoiDate from '@joi/date'\nimport JoiBase, { type LanguageMessages } from 'joi'\nimport { v4 as uuidV4 } from 'uuid'\n\nimport { ComponentType } from '~/src/components/enums.js'\nimport {\n type ComponentDef,\n type ContentComponentsDef,\n type FileUploadFieldComponent\n} from '~/src/components/types.js'\nimport { ConditionType, OperatorName } from '~/src/conditions/enums.js'\nimport {\n type ConditionData,\n type ConditionDataV2,\n type ConditionFieldData,\n type ConditionGroupData,\n type ConditionGroupDataV2,\n type ConditionListItemRefValueDataV2,\n type ConditionRefData,\n type ConditionRefDataV2,\n type ConditionValueData,\n type ConditionsModelData,\n type RelativeDateValueData,\n type RelativeDateValueDataV2\n} from '~/src/conditions/types.js'\nimport {\n SchemaVersion,\n type ConditionWrapper,\n type ConditionWrapperV2,\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'\nimport { ControllerType } from '~/src/pages/enums.js'\nimport { hasComponents } from '~/src/pages/helpers.js'\n\nconst Joi = JoiBase.extend(JoiDate) as JoiBase.Root\n\nconst idSchemaOptional = Joi.string().uuid()\n\nconst idSchema = idSchemaOptional.default(() => uuidV4())\n\nconst conditionIdRef = Joi.ref('/conditions', {\n in: true,\n adjust: (conditions: ConditionWrapperV2[]) =>\n conditions.map((condition) => condition.id)\n})\n\nconst componentIdRefSchema = Joi.ref('/pages', {\n in: true,\n adjust: (pages: Page[]) =>\n pages.flatMap((page) =>\n hasComponents(page)\n ? page.components\n .filter((component) => component.id)\n .map((component) => component.id)\n : []\n )\n})\n\nconst listIdRef = Joi.ref('/lists', {\n in: true,\n adjust: (lists: List[]) =>\n lists.filter((list) => list.id).map((list) => list.id)\n})\n\nconst listItemIdRef = Joi.ref('/lists', {\n in: true,\n adjust: (lists: List[]) =>\n lists.flatMap((list) =>\n list.items.filter((item) => item.id).map((item) => item.id)\n )\n})\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 conditionListItemRefDataSchemaV2 =\n Joi.object<ConditionListItemRefValueDataV2>()\n .description('List item ref specification for a condition')\n .keys({\n listId: Joi.string()\n .trim()\n .required()\n .when('/lists', {\n is: Joi.exist(),\n then: Joi.valid(listIdRef)\n })\n .description('The id of the list'),\n itemId: Joi.string()\n .trim()\n .when('/lists', {\n is: Joi.exist(),\n then: Joi.valid(listItemIdRef)\n })\n .required()\n .description('The id of the list item')\n })\n\nconst relativeDateValueDataSchemaV2 = Joi.object<RelativeDateValueDataV2>()\n .description('Relative date specification for date-based conditions')\n .keys({\n period: Joi.number()\n .integer()\n .positive()\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 relativeDateValueDataSchema = Joi.object<RelativeDateValueData>()\n .description('Relative date specification for date-based conditions')\n .keys({\n type: Joi.string()\n .trim()\n .valid('RelativeDate')\n .required()\n .description('Type of the condition value, 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 conditionRefDataSchemaV2 = Joi.object<ConditionRefDataV2>()\n .description('Reference to a named condition defined elsewhere')\n .keys({\n id: idSchema.description('Unique identifier for the referenced condition'),\n conditionId: Joi.string()\n .trim()\n .required()\n .when('/conditions', {\n is: Joi.exist(),\n then: Joi.valid(conditionIdRef)\n })\n .description('Name of the referenced condition')\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, relativeDateValueDataSchema)\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\nexport const conditionDataSchemaV2 = Joi.object<ConditionDataV2>()\n .description('Condition definition')\n .keys({\n id: idSchema.description(\n 'Unique identifier used to reference this condition'\n ),\n componentId: Joi.string()\n .trim()\n .required()\n .when('/pages', {\n is: Joi.exist(),\n then: Joi.valid(componentIdRefSchema)\n })\n .description(\n 'Reference to the component id being evaluated in this condition'\n ),\n operator: Joi.string()\n .trim()\n .valid(...Object.values(OperatorName))\n .required()\n .description('Comparison operator (equals, greaterThan, contains, etc.)'),\n type: Joi.string()\n .trim()\n .valid(...Object.values(ConditionType))\n .required()\n .description('Type of the condition value'),\n value: Joi.any()\n .required()\n .description('The actual value to compare against')\n .when('type', {\n switch: [\n { is: ConditionType.BooleanValue, then: Joi.boolean() },\n { is: ConditionType.StringValue, then: Joi.string() },\n { is: ConditionType.NumberValue, then: Joi.number() },\n {\n is: ConditionType.DateValue,\n then: Joi.date().format('YYYY-MM-DD').raw()\n },\n {\n is: ConditionType.ListItemRef,\n then: conditionListItemRefDataSchemaV2\n },\n {\n is: ConditionType.RelativeDate,\n then: relativeDateValueDataSchemaV2\n }\n ]\n })\n .description(\n 'Value to compare the field against, either fixed or relative date'\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 conditionWrapperSchemaV2 = Joi.object<ConditionWrapperV2>()\n .description('Container for a named condition with its definition')\n .keys({\n id: idSchema.description('Unique identifier for the condition'),\n displayName: Joi.string()\n .trim()\n .description('Human-readable name for display in the UI'),\n coordinator: Joi.string()\n .optional()\n .when('items', { is: Joi.array().min(2), then: Joi.required() })\n .description(\n 'Logical operator connecting this condition with others (AND, OR)'\n ),\n items: Joi.array<ConditionGroupDataV2>()\n .items(\n Joi.alternatives().conditional('.componentId', {\n is: Joi.exist(),\n then: conditionDataSchemaV2,\n otherwise: conditionRefDataSchemaV2\n })\n )\n .min(1)\n .max(15)\n .description('Array of conditions or condition references')\n })\n .description('Condition schema for V2 forms')\n\nexport const componentSchema = Joi.object<ComponentDef>()\n .description('Form component definition specifying UI element behavior')\n .keys({\n id: idSchemaOptional.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: idSchema.description('Unique identifier for the component'),\n list: Joi.string()\n .when('/lists', {\n is: Joi.exist(),\n then: Joi.valid(listIdRef)\n })\n .optional()\n .description(\n 'List id reference to a predefined list of options for select components'\n )\n })\n .description('Component schema for V2 forms')\n\nexport const componentPayloadSchemaV2 = componentSchema\n .keys({\n id: idSchema.description('Unique identifier for the component'),\n list: Joi.string()\n .optional()\n .description(\n 'List id reference to a predefined list of options for select components'\n )\n })\n .description('Payload schema for component for V2 forms')\n\nexport const fileUploadComponentSchema = componentSchemaV2.keys({\n type: Joi.string<ComponentType.FileUploadField>()\n .trim()\n .valid(ComponentType.FileUploadField)\n .required()\n .description('Component that can only be a FileUploadField')\n})\n\nexport const contentComponentSchema = componentSchemaV2.keys({\n type: Joi.string<ComponentType>()\n .trim()\n .valid(ComponentType.Details)\n .valid(ComponentType.Html)\n .valid(ComponentType.Markdown)\n .valid(ComponentType.InsetText)\n .valid(ComponentType.List)\n .required()\n .description('Content only component type (Details, Html, Markdown, etc.)')\n})\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\nexport const 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\nexport const pageUploadComponentsSchema = Joi.array<\n FileUploadFieldComponent | ContentComponentsDef\n>()\n .items(\n fileUploadComponentSchema.required(),\n contentComponentSchema.optional()\n )\n .unique('name')\n .unique('id')\n .min(1)\n .max(2)\n .description('Components allowed on Page Upload schema')\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: idSchemaOptional.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 id: idSchema.description('Unique identifier for the page'),\n title: Joi.string()\n .trim()\n .allow('')\n .required()\n .description(\n 'Page title displayed at the top of the page (with support for empty titles in V2)'\n ),\n components: Joi.when('controller', {\n switch: [\n {\n is: Joi.string().trim().valid(ControllerType.FileUpload).required(),\n then: pageUploadComponentsSchema\n }\n ],\n otherwise: Joi.array<ComponentDef>()\n .items(componentSchemaV2)\n .unique('name')\n .unique('id')\n .description('Components schema for V2 forms')\n }),\n condition: Joi.string()\n .trim()\n .when('/conditions', {\n is: Joi.exist(),\n then: Joi.valid(conditionIdRef)\n })\n .optional()\n .description('Optional condition that determines if this page is shown')\n })\n .description('Page schema for V2 forms')\n\nexport const pagePayloadSchemaV2 = pageSchemaV2\n .append({\n components: Joi.when('controller', {\n switch: [\n {\n is: Joi.string().trim().valid(ControllerType.FileUpload).required(),\n then: pageUploadComponentsSchema\n }\n ],\n otherwise: Joi.array<ComponentDef>()\n .items(componentPayloadSchemaV2)\n .unique('name')\n .unique('id')\n .description('Components schema for V2 forms')\n })\n })\n .description('Payload Page schema for V2 forms')\n\nconst baseListItemSchema = Joi.object<Item>()\n .description('Base schema for list items with common properties')\n .keys({\n id: idSchema.description('Unique identifier for the list item'),\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: idSchema,\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: idSchemaOptional.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('id')\n .unique('text')\n .unique('value')\n .description('Array of items with string values'),\n otherwise: Joi.array()\n .items(numberListItemSchema)\n .unique('id')\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: idSchema.description('Unique identifier for the list')\n })\n .description('List schema for V2 forms')\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 schema: Joi.number()\n .integer()\n .valid(SchemaVersion.V1)\n .default(SchemaVersion.V1)\n .description('Form schema version to use (1 or 2)'),\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 .items(pageSchema)\n .description('Pages schema for V1 forms')\n .unique('path'),\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 formDefinitionV2Schema = formDefinitionSchema\n .keys({\n schema: Joi.number()\n .integer()\n .valid(SchemaVersion.V2)\n .description('Form schema version to use (2)'),\n pages: Joi.array<Page>()\n .items(pageSchemaV2)\n .required()\n .unique('path')\n .unique('id')\n .description('Pages schema for V2 forms'),\n lists: Joi.array<List>()\n .items(listSchemaV2)\n .unique('name')\n .unique('title')\n .unique('id')\n .description('Lists schema for V2 forms'),\n conditions: Joi.array<ConditionWrapperV2>()\n .items(conditionWrapperSchemaV2)\n .unique('id')\n .unique('displayName')\n .description('Named conditions used for form logic')\n })\n .description('Form definition schema for V2')\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
+ {"version":3,"file":"index.js","names":["JoiDate","JoiBase","v4","uuidV4","ComponentType","ConditionType","OperatorName","SchemaVersion","checkErrors","FormDefinitionError","ControllerType","hasComponents","Joi","extend","idSchemaOptional","string","uuid","idSchema","default","conditionIdRef","ref","in","adjust","conditions","map","condition","id","componentIdRefSchema","pages","flatMap","page","components","filter","component","listIdRef","lists","list","listItemIdRef","items","item","sectionsSchema","object","description","keys","name","trim","required","title","hideTitle","boolean","optional","conditionFieldSchema","type","display","conditionValueSchema","value","conditionListItemRefDataSchemaV2","listId","when","is","exist","then","valid","error","RefConditionListId","itemId","RefConditionItemId","relativeDateValueDataSchemaV2","period","number","integer","positive","unit","direction","relativeDateValueDataSchema","conditionRefSchema","conditionName","conditionDisplayName","coordinator","conditionRefDataSchemaV2","conditionId","RefConditionConditionId","conditionSchema","field","operator","alternatives","try","conditionDataSchemaV2","componentId","RefConditionComponentId","Object","values","any","switch","BooleanValue","StringValue","NumberValue","DateValue","date","format","raw","ListItemRef","RelativeDate","conditionGroupSchema","array","link","conditionsModelSchema","conditionWrapperSchema","displayName","conditionWrapperSchemaV2","min","conditional","otherwise","max","componentSchema","shortDescription","Details","Html","InsetText","Markdown","pattern","allow","hint","options","rows","empty","maxWords","maxDaysInPast","maxDaysInFuture","customValidationMessage","customValidationMessages","unknown","schema","length","componentSchemaV2","RefPageComponentList","componentPayloadSchemaV2","fileUploadComponentSchema","FileUploadField","contentComponentSchema","List","nextSchema","path","redirect","repeatOptions","repeatSchema","pageRepeatSchema","eventSchema","method","url","uri","scheme","eventsSchema","onLoad","onSave","pageUploadComponentsSchema","unique","pageSchema","disallow","section","controller","repeat","strip","next","events","view","pageSchemaV2","append","FileUpload","UniquePageComponentId","UniquePageComponentName","RefPageCondition","pagePayloadSchemaV2","baseListItemSchema","text","stringListItemSchema","numberListItemSchema","listSchema","UniqueListItemId","UniqueListItemText","UniqueListItemValue","listSchemaV2","feedbackSchema","feedbackForm","emailAddress","email","tlds","phaseBannerSchema","phase","outputSchema","audience","version","formDefinitionSchema","engine","V1","feedback","startPage","sections","UniqueSectionName","UniqueSectionTitle","metadata","a","declaration","skipSummary","phaseBanner","outputEmail","output","formDefinitionV2Schema","V2","UniquePageId","UniquePagePath","UniqueListId","UniqueListName","UniqueListTitle","UniqueConditionId","UniqueConditionDisplayName","Schema"],"sources":["../../../../src/form/form-definition/index.ts"],"sourcesContent":["import JoiDate from '@joi/date'\nimport JoiBase, { type LanguageMessages } from 'joi'\nimport { v4 as uuidV4 } from 'uuid'\n\nimport { ComponentType } from '~/src/components/enums.js'\nimport {\n type ComponentDef,\n type ContentComponentsDef,\n type FileUploadFieldComponent\n} from '~/src/components/types.js'\nimport { ConditionType, OperatorName } from '~/src/conditions/enums.js'\nimport {\n type ConditionData,\n type ConditionDataV2,\n type ConditionFieldData,\n type ConditionGroupData,\n type ConditionGroupDataV2,\n type ConditionListItemRefValueDataV2,\n type ConditionRefData,\n type ConditionRefDataV2,\n type ConditionValueData,\n type ConditionsModelData,\n type RelativeDateValueData,\n type RelativeDateValueDataV2\n} from '~/src/conditions/types.js'\nimport {\n SchemaVersion,\n type ConditionWrapper,\n type ConditionWrapperV2,\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'\nimport { checkErrors } from '~/src/form/form-manager/errors.js'\nimport { FormDefinitionError } from '~/src/form/form-manager/types.js'\nimport { ControllerType } from '~/src/pages/enums.js'\nimport { hasComponents } from '~/src/pages/helpers.js'\n\nconst Joi = JoiBase.extend(JoiDate) as JoiBase.Root\n\nconst idSchemaOptional = Joi.string().uuid()\n\nconst idSchema = idSchemaOptional.default(() => uuidV4())\n\nconst conditionIdRef = Joi.ref('/conditions', {\n in: true,\n adjust: (conditions: ConditionWrapperV2[]) =>\n conditions.map((condition) => condition.id)\n})\n\nconst componentIdRefSchema = Joi.ref('/pages', {\n in: true,\n adjust: (pages: Page[]) =>\n pages.flatMap((page) =>\n hasComponents(page)\n ? page.components\n .filter((component) => component.id)\n .map((component) => component.id)\n : []\n )\n})\n\nconst listIdRef = Joi.ref('/lists', {\n in: true,\n adjust: (lists: List[]) =>\n lists.filter((list) => list.id).map((list) => list.id)\n})\n\nconst listItemIdRef = Joi.ref('/lists', {\n in: true,\n adjust: (lists: List[]) =>\n lists.flatMap((list) =>\n list.items.filter((item) => item.id).map((item) => item.id)\n )\n})\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 conditionListItemRefDataSchemaV2 =\n Joi.object<ConditionListItemRefValueDataV2>()\n .description('List item ref specification for a condition')\n .keys({\n listId: Joi.string()\n .trim()\n .required()\n .when('/lists', {\n is: Joi.exist(),\n then: Joi.valid(listIdRef)\n })\n .description('The id of the list')\n .error(checkErrors(FormDefinitionError.RefConditionListId)),\n itemId: Joi.string()\n .trim()\n .when('/lists', {\n is: Joi.exist(),\n then: Joi.valid(listItemIdRef)\n })\n .required()\n .description('The id of the list item')\n .error(checkErrors(FormDefinitionError.RefConditionItemId))\n })\n\nconst relativeDateValueDataSchemaV2 = Joi.object<RelativeDateValueDataV2>()\n .description('Relative date specification for date-based conditions')\n .keys({\n period: Joi.number()\n .integer()\n .positive()\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 relativeDateValueDataSchema = Joi.object<RelativeDateValueData>()\n .description('Relative date specification for date-based conditions')\n .keys({\n type: Joi.string()\n .trim()\n .valid('RelativeDate')\n .required()\n .description('Type of the condition value, 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 conditionRefDataSchemaV2 = Joi.object<ConditionRefDataV2>()\n .description('Reference to a named condition defined elsewhere')\n .keys({\n id: idSchema.description('Unique identifier for the referenced condition'),\n conditionId: Joi.string()\n .trim()\n .required()\n .when('/conditions', {\n is: Joi.exist(),\n then: Joi.valid(conditionIdRef)\n })\n .description('Name of the referenced condition')\n .error(checkErrors(FormDefinitionError.RefConditionConditionId))\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, relativeDateValueDataSchema)\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\nexport const conditionDataSchemaV2 = Joi.object<ConditionDataV2>()\n .description('Condition definition')\n .keys({\n id: idSchema.description(\n 'Unique identifier used to reference this condition'\n ),\n componentId: Joi.string()\n .trim()\n .required()\n .when('/pages', {\n is: Joi.exist(),\n then: Joi.valid(componentIdRefSchema)\n })\n .description(\n 'Reference to the component id being evaluated in this condition'\n )\n .error(checkErrors(FormDefinitionError.RefConditionComponentId)),\n operator: Joi.string()\n .trim()\n .valid(...Object.values(OperatorName))\n .required()\n .description('Comparison operator (equals, greaterThan, contains, etc.)'),\n type: Joi.string()\n .trim()\n .valid(...Object.values(ConditionType))\n .required()\n .description('Type of the condition value'),\n value: Joi.any()\n .required()\n .description('The actual value to compare against')\n .when('type', {\n switch: [\n { is: ConditionType.BooleanValue, then: Joi.boolean() },\n { is: ConditionType.StringValue, then: Joi.string() },\n { is: ConditionType.NumberValue, then: Joi.number() },\n {\n is: ConditionType.DateValue,\n then: Joi.date().format('YYYY-MM-DD').raw()\n },\n {\n is: ConditionType.ListItemRef,\n then: conditionListItemRefDataSchemaV2\n },\n {\n is: ConditionType.RelativeDate,\n then: relativeDateValueDataSchemaV2\n }\n ]\n })\n .description(\n 'Value to compare the field against, either fixed or relative date'\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 conditionWrapperSchemaV2 = Joi.object<ConditionWrapperV2>()\n .description('Container for a named condition with its definition')\n .keys({\n id: idSchema.description('Unique identifier for the condition'),\n displayName: Joi.string()\n .trim()\n .description('Human-readable name for display in the UI'),\n coordinator: Joi.string()\n .optional()\n .when('items', { is: Joi.array().min(2), then: Joi.required() })\n .description(\n 'Logical operator connecting this condition with others (AND, OR)'\n ),\n items: Joi.array<ConditionGroupDataV2>()\n .items(\n Joi.alternatives().conditional('.componentId', {\n is: Joi.exist(),\n then: conditionDataSchemaV2,\n otherwise: conditionRefDataSchemaV2\n })\n )\n .min(1)\n .max(15)\n .description('Array of conditions or condition references')\n })\n .description('Condition schema for V2 forms')\n\nexport const componentSchema = Joi.object<ComponentDef>()\n .description('Form component definition specifying UI element behavior')\n .keys({\n id: idSchemaOptional.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: idSchema.description('Unique identifier for the component'),\n list: Joi.string()\n .when('/lists', {\n is: Joi.exist(),\n then: Joi.valid(listIdRef)\n })\n .optional()\n .description(\n 'List id reference to a predefined list of options for select components'\n )\n .error(checkErrors(FormDefinitionError.RefPageComponentList))\n })\n .description('Component schema for V2 forms')\n\nexport const componentPayloadSchemaV2 = componentSchema\n .keys({\n id: idSchema.description('Unique identifier for the component'),\n list: Joi.string()\n .optional()\n .description(\n 'List id reference to a predefined list of options for select components'\n )\n })\n .description('Payload schema for component for V2 forms')\n\nexport const fileUploadComponentSchema = componentSchemaV2.keys({\n type: Joi.string<ComponentType.FileUploadField>()\n .trim()\n .valid(ComponentType.FileUploadField)\n .required()\n .description('Component that can only be a FileUploadField')\n})\n\nexport const contentComponentSchema = componentSchemaV2.keys({\n type: Joi.string<ComponentType>()\n .trim()\n .valid(ComponentType.Details)\n .valid(ComponentType.Html)\n .valid(ComponentType.Markdown)\n .valid(ComponentType.InsetText)\n .valid(ComponentType.List)\n .required()\n .description('Content only component type (Details, Html, Markdown, etc.)')\n})\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\nexport const 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\nexport const pageUploadComponentsSchema = Joi.array<\n FileUploadFieldComponent | ContentComponentsDef\n>()\n .items(\n fileUploadComponentSchema.required(),\n contentComponentSchema.optional()\n )\n .unique('id')\n .unique('name')\n .min(1)\n .max(2)\n .description('Components allowed on Page Upload schema')\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: idSchemaOptional.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 id: idSchema.description('Unique identifier for the page'),\n title: Joi.string()\n .trim()\n .allow('')\n .required()\n .description(\n 'Page title displayed at the top of the page (with support for empty titles in V2)'\n ),\n components: Joi.when('controller', {\n switch: [\n {\n is: Joi.string().trim().valid(ControllerType.FileUpload).required(),\n then: pageUploadComponentsSchema\n }\n ],\n otherwise: Joi.array<ComponentDef>()\n .items(componentSchemaV2)\n .unique('id')\n .unique('name')\n .description('Components schema for V2 forms')\n .error(\n checkErrors([\n FormDefinitionError.UniquePageComponentId,\n FormDefinitionError.UniquePageComponentName\n ])\n )\n }),\n condition: Joi.string()\n .trim()\n .when('/conditions', {\n is: Joi.exist(),\n then: Joi.valid(conditionIdRef)\n })\n .optional()\n .description('Optional condition that determines if this page is shown')\n .error(checkErrors(FormDefinitionError.RefPageCondition))\n })\n .description('Page schema for V2 forms')\n\nexport const pagePayloadSchemaV2 = pageSchemaV2\n .append({\n components: Joi.when('controller', {\n switch: [\n {\n is: Joi.string().trim().valid(ControllerType.FileUpload).required(),\n then: pageUploadComponentsSchema\n }\n ],\n otherwise: Joi.array<ComponentDef>()\n .items(componentPayloadSchemaV2)\n .unique('id')\n .unique('name')\n .description('Components schema for V2 forms')\n })\n })\n .description('Payload Page schema for V2 forms')\n\nconst baseListItemSchema = Joi.object<Item>()\n .description('Base schema for list items with common properties')\n .keys({\n id: idSchema.description('Unique identifier for the list item'),\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: idSchema,\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: idSchemaOptional.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('id')\n .unique('text')\n .unique('value')\n .description('Array of items with string values')\n .error(\n checkErrors([\n FormDefinitionError.UniqueListItemId,\n FormDefinitionError.UniqueListItemText,\n FormDefinitionError.UniqueListItemValue\n ])\n ),\n otherwise: Joi.array()\n .items(numberListItemSchema)\n .unique('id')\n .unique('text')\n .unique('value')\n .description('Array of items with numeric values')\n .error(\n checkErrors([\n FormDefinitionError.UniqueListItemId,\n FormDefinitionError.UniqueListItemText,\n FormDefinitionError.UniqueListItemValue\n ])\n )\n })\n })\n\n/**\n * V2 Joi schema for Lists\n */\nexport const listSchemaV2 = listSchema\n .keys({\n id: idSchema.description('Unique identifier for the list')\n })\n .description('List schema for V2 forms')\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 schema: Joi.number()\n .integer()\n .valid(SchemaVersion.V1)\n .default(SchemaVersion.V1)\n .description('Form schema version to use (1 or 2)'),\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 .items(pageSchema)\n .description('Pages schema for V1 forms')\n .unique('path'),\n sections: Joi.array<Section>()\n .items(sectionsSchema)\n .unique('name')\n .unique('title')\n .required()\n .description('Sections grouping related pages together')\n .error(\n checkErrors([\n FormDefinitionError.UniqueSectionName,\n FormDefinitionError.UniqueSectionTitle\n ])\n ),\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 formDefinitionV2Schema = formDefinitionSchema\n .keys({\n schema: Joi.number()\n .integer()\n .valid(SchemaVersion.V2)\n .description('Form schema version to use (2)'),\n pages: Joi.array<Page>()\n .items(pageSchemaV2)\n .required()\n .unique('id')\n .unique('path')\n .description('Pages schema for V2 forms')\n .error(\n checkErrors([\n FormDefinitionError.UniquePageId,\n FormDefinitionError.UniquePagePath\n ])\n ),\n lists: Joi.array<List>()\n .items(listSchemaV2)\n .unique('id')\n .unique('name')\n .unique('title')\n .description('Lists schema for V2 forms')\n .error(\n checkErrors([\n FormDefinitionError.UniqueListId,\n FormDefinitionError.UniqueListName,\n FormDefinitionError.UniqueListTitle\n ])\n ),\n conditions: Joi.array<ConditionWrapperV2>()\n .items(conditionWrapperSchemaV2)\n .unique('id')\n .unique('displayName')\n .description('Named conditions used for form logic')\n .error(\n checkErrors([\n FormDefinitionError.UniqueConditionId,\n FormDefinitionError.UniqueConditionDisplayName\n ])\n )\n })\n .description('Form definition schema for V2')\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":[]}
@@ -0,0 +1,73 @@
1
+ import { FormDefinitionError, FormDefinitionErrorType, formDefinitionErrors } from "./types.js";
2
+
3
+ /**
4
+ * Checks and applies an `errorType` and also an `errorCode` for known errors
5
+ */
6
+ export const checkErrors = formErrors => {
7
+ const possibleErrors = Array.isArray(formErrors) ? formErrors : [formErrors];
8
+ return function (errors) {
9
+ errors.forEach(err => {
10
+ if (err.local.errorType) {
11
+ return;
12
+ }
13
+ for (const formError of possibleErrors) {
14
+ const errorDetails = formDefinitionErrors[formError];
15
+
16
+ // Joi's `context.key` will be the index for arrays
17
+ // in which case use the path, otherwise use the key
18
+ const keyMatch = typeof err.local.key === 'number' ? err.local.path : err.local.key;
19
+ if (errorDetails.type === FormDefinitionErrorType.Unique && err.code === 'array.unique' && keyMatch === errorDetails.key) {
20
+ err.local.errorCode = formError;
21
+ err.local.errorType = FormDefinitionErrorType.Unique;
22
+ return;
23
+ }
24
+ if (errorDetails.type === FormDefinitionErrorType.Ref && err.code === 'any.only' && keyMatch === errorDetails.key) {
25
+ err.local.errorCode = formError;
26
+ err.local.errorType = FormDefinitionErrorType.Ref;
27
+ return;
28
+ }
29
+ err.local.errorType = FormDefinitionErrorType.Type;
30
+ }
31
+ });
32
+ return errors;
33
+ };
34
+ };
35
+
36
+ /**
37
+ * Get the custom errors from a form definition joi validation error
38
+ */
39
+ export function getErrors(validationError) {
40
+ return validationError?.details.map(detail => {
41
+ if (detail.context?.errorType === FormDefinitionErrorType.Unique && detail.context.errorCode) {
42
+ return {
43
+ id: /** @type {FormDefinitionError} */detail.context.errorCode,
44
+ type: FormDefinitionErrorType.Unique,
45
+ message: detail.message,
46
+ detail: {
47
+ path: detail.path,
48
+ pos: detail.context.pos,
49
+ dupePos: detail.context.dupePos
50
+ }
51
+ };
52
+ }
53
+ if (detail.context?.errorType === FormDefinitionErrorType.Ref && detail.context.errorCode) {
54
+ return {
55
+ id: /** @type {FormDefinitionError} */detail.context.errorCode,
56
+ type: FormDefinitionErrorType.Ref,
57
+ message: detail.message,
58
+ detail: {
59
+ path: detail.path
60
+ }
61
+ };
62
+ }
63
+
64
+ // Catch all others
65
+ return {
66
+ id: FormDefinitionError.Other,
67
+ type: FormDefinitionErrorType.Type,
68
+ message: detail.message,
69
+ detail: detail.context
70
+ };
71
+ }) ?? [];
72
+ }
73
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","names":["FormDefinitionError","FormDefinitionErrorType","formDefinitionErrors","checkErrors","formErrors","possibleErrors","Array","isArray","errors","forEach","err","local","errorType","formError","errorDetails","keyMatch","key","path","type","Unique","code","errorCode","Ref","Type","getErrors","validationError","details","map","detail","context","id","message","pos","dupePos","Other"],"sources":["../../../../src/form/form-manager/errors.ts"],"sourcesContent":["import type Joi from 'joi'\nimport { type ValidationError } from 'joi'\n\nimport {\n FormDefinitionError,\n FormDefinitionErrorType,\n formDefinitionErrors,\n type FormDefinitionErrorCause\n} from '~/src/form/form-manager/types.js'\n\n/**\n * Checks and applies an `errorType` and also an `errorCode` for known errors\n */\nexport const checkErrors = (\n formErrors: FormDefinitionError | FormDefinitionError[]\n) => {\n const possibleErrors = Array.isArray(formErrors) ? formErrors : [formErrors]\n\n return function (errors: Joi.ErrorReport[]) {\n errors.forEach((err) => {\n if (err.local.errorType) {\n return\n }\n\n for (const formError of possibleErrors) {\n const errorDetails = formDefinitionErrors[formError]\n\n // Joi's `context.key` will be the index for arrays\n // in which case use the path, otherwise use the key\n const keyMatch =\n typeof err.local.key === 'number' ? err.local.path : err.local.key\n\n if (\n errorDetails.type === FormDefinitionErrorType.Unique &&\n err.code === 'array.unique' &&\n keyMatch === errorDetails.key\n ) {\n err.local.errorCode = formError\n err.local.errorType = FormDefinitionErrorType.Unique\n return\n }\n\n if (\n errorDetails.type === FormDefinitionErrorType.Ref &&\n err.code === 'any.only' &&\n keyMatch === errorDetails.key\n ) {\n err.local.errorCode = formError\n err.local.errorType = FormDefinitionErrorType.Ref\n return\n }\n\n err.local.errorType = FormDefinitionErrorType.Type\n }\n })\n return errors\n }\n}\n\n/**\n * Get the custom errors from a form definition joi validation error\n */\nexport function getErrors(\n validationError: ValidationError | undefined\n): FormDefinitionErrorCause[] {\n return (\n validationError?.details.map((detail) => {\n if (\n detail.context?.errorType === FormDefinitionErrorType.Unique &&\n detail.context.errorCode\n ) {\n return {\n id: /** @type {FormDefinitionError} */ detail.context.errorCode,\n type: FormDefinitionErrorType.Unique,\n message: detail.message,\n detail: {\n path: detail.path,\n pos: detail.context.pos,\n dupePos: detail.context.dupePos\n }\n }\n }\n\n if (\n detail.context?.errorType === FormDefinitionErrorType.Ref &&\n detail.context.errorCode\n ) {\n return {\n id: /** @type {FormDefinitionError} */ detail.context.errorCode,\n type: FormDefinitionErrorType.Ref,\n message: detail.message,\n detail: {\n path: detail.path\n }\n }\n }\n\n // Catch all others\n return {\n id: FormDefinitionError.Other,\n type: FormDefinitionErrorType.Type,\n message: detail.message,\n detail: detail.context\n }\n }) ?? []\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,8 +8,8 @@ export let FormDefinitionErrorType = /*#__PURE__*/function (FormDefinitionErrorT
8
8
 
9
9
  // Enum for errors that can exist in a form definition
10
10
  export let FormDefinitionError = /*#__PURE__*/function (FormDefinitionError) {
11
- FormDefinitionError["UniquePagePath"] = "unique_page_path";
12
11
  FormDefinitionError["UniquePageId"] = "unique_page_id";
12
+ FormDefinitionError["UniquePagePath"] = "unique_page_path";
13
13
  FormDefinitionError["UniquePageComponentId"] = "unique_page_component_id";
14
14
  FormDefinitionError["UniquePageComponentName"] = "unique_page_component_name";
15
15
  FormDefinitionError["UniqueSectionName"] = "unique_section_name";
@@ -31,111 +31,89 @@ export let FormDefinitionError = /*#__PURE__*/function (FormDefinitionError) {
31
31
  FormDefinitionError["Other"] = "other";
32
32
  return FormDefinitionError;
33
33
  }({});
34
- export const N = Symbol('AnyNumber');
35
34
  // The errors that can exist in the form definition
36
35
  export const formDefinitionErrors = {
37
36
  [FormDefinitionError.UniquePagePath]: {
38
- path: ['pages', N],
39
37
  key: 'path',
40
38
  type: FormDefinitionErrorType.Unique
41
39
  },
42
40
  [FormDefinitionError.UniquePageId]: {
43
- path: ['pages', N],
44
41
  key: 'id',
45
42
  type: FormDefinitionErrorType.Unique
46
43
  },
47
44
  [FormDefinitionError.UniquePageComponentId]: {
48
- path: ['pages', N, 'components', N],
49
45
  key: 'id',
50
46
  type: FormDefinitionErrorType.Unique
51
47
  },
52
48
  [FormDefinitionError.UniquePageComponentName]: {
53
- path: ['pages', N, 'components', N],
54
49
  key: 'name',
55
50
  type: FormDefinitionErrorType.Unique
56
51
  },
57
52
  [FormDefinitionError.UniqueSectionName]: {
58
- path: ['sections', N],
59
53
  key: 'name',
60
54
  type: FormDefinitionErrorType.Unique
61
55
  },
62
56
  [FormDefinitionError.UniqueSectionTitle]: {
63
- path: ['sections', N],
64
57
  key: 'title',
65
58
  type: FormDefinitionErrorType.Unique
66
59
  },
67
60
  [FormDefinitionError.UniqueListId]: {
68
- path: ['lists', N],
69
61
  key: 'id',
70
62
  type: FormDefinitionErrorType.Unique
71
63
  },
72
64
  [FormDefinitionError.UniqueListTitle]: {
73
- path: ['lists', N],
74
65
  key: 'title',
75
66
  type: FormDefinitionErrorType.Unique
76
67
  },
77
68
  [FormDefinitionError.UniqueListName]: {
78
- path: ['lists', N],
79
69
  key: 'name',
80
70
  type: FormDefinitionErrorType.Unique
81
71
  },
82
72
  [FormDefinitionError.UniqueConditionDisplayName]: {
83
- path: ['conditions', N],
84
73
  key: 'displayName',
85
74
  type: FormDefinitionErrorType.Unique
86
75
  },
87
76
  [FormDefinitionError.UniqueConditionId]: {
88
- path: ['conditions', N],
89
77
  key: 'id',
90
78
  type: FormDefinitionErrorType.Unique
91
79
  },
92
80
  [FormDefinitionError.UniqueListItemId]: {
93
- path: ['lists', N, 'items', N],
94
81
  key: 'id',
95
82
  type: FormDefinitionErrorType.Unique
96
83
  },
97
84
  [FormDefinitionError.UniqueListItemText]: {
98
- path: ['lists', N, 'items', N],
99
85
  key: 'text',
100
86
  type: FormDefinitionErrorType.Unique
101
87
  },
102
88
  [FormDefinitionError.UniqueListItemValue]: {
103
- path: ['lists', N, 'items', N],
104
89
  key: 'value',
105
90
  type: FormDefinitionErrorType.Unique
106
91
  },
107
92
  [FormDefinitionError.RefPageCondition]: {
108
- path: ['pages', N, 'condition'],
109
93
  key: 'condition',
110
94
  type: FormDefinitionErrorType.Ref
111
95
  },
112
96
  [FormDefinitionError.RefConditionComponentId]: {
113
- path: ['conditions', N, 'items', N, 'componentId'],
114
97
  key: 'componentId',
115
98
  type: FormDefinitionErrorType.Ref
116
99
  },
117
100
  [FormDefinitionError.RefConditionListId]: {
118
- path: ['conditions', N, 'items', N, 'value', 'listId'],
119
101
  key: 'listId',
120
102
  type: FormDefinitionErrorType.Ref
121
103
  },
122
104
  [FormDefinitionError.RefConditionItemId]: {
123
- path: ['conditions', N, 'items', N, 'value', 'itemId'],
124
105
  key: 'itemId',
125
106
  type: FormDefinitionErrorType.Ref
126
107
  },
127
108
  [FormDefinitionError.RefConditionConditionId]: {
128
- path: ['conditions', N, 'items', N, 'conditionId'],
129
109
  key: 'conditionId',
130
110
  type: FormDefinitionErrorType.Ref
131
111
  },
132
112
  [FormDefinitionError.RefPageComponentList]: {
133
- path: ['pages', N, 'components', N, 'list'],
134
113
  key: 'list',
135
114
  type: FormDefinitionErrorType.Ref
136
115
  },
137
116
  [FormDefinitionError.Other]: {
138
- path: [],
139
117
  key: '',
140
118
  type: FormDefinitionErrorType.Type
141
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["FormDefinitionErrorType","FormDefinitionError","N","Symbol","formDefinitionErrors","UniquePagePath","path","key","type","Unique","UniquePageId","UniquePageComponentId","UniquePageComponentName","UniqueSectionName","UniqueSectionTitle","UniqueListId","UniqueListTitle","UniqueListName","UniqueConditionDisplayName","UniqueConditionId","UniqueListItemId","UniqueListItemText","UniqueListItemValue","RefPageCondition","Ref","RefConditionComponentId","RefConditionListId","RefConditionItemId","RefConditionConditionId","RefPageComponentList","Other","Type"],"sources":["../../../../src/form/form-manager/types.ts"],"sourcesContent":["import { type Context } from 'joi'\n\nimport { type ControllerType, type Repeat } from '~/src/index.js'\n\nexport interface PatchPageFields {\n title?: string\n path?: string\n controller?: ControllerType | null\n repeat?: Repeat\n condition?: string | null\n}\n\nexport interface AddComponentQueryOptions {\n prepend?: boolean\n}\n\n// Enum of error types that can be raised through validating the form definition\nexport enum FormDefinitionErrorType {\n Unique = 'unique', // Unique constraint\n Ref = 'ref', // Referential integrity\n Type = 'type' // General schema type error\n}\n\n// Enum for errors that can exist in a form definition\nexport enum FormDefinitionError {\n UniquePagePath = 'unique_page_path',\n UniquePageId = 'unique_page_id',\n UniquePageComponentId = 'unique_page_component_id',\n UniquePageComponentName = 'unique_page_component_name',\n UniqueSectionName = 'unique_section_name',\n UniqueSectionTitle = 'unique_section_title',\n UniqueListId = 'unique_list_id',\n UniqueListTitle = 'unique_list_title',\n UniqueListName = 'unique_list_name',\n UniqueConditionId = 'unique_condition_id',\n UniqueConditionDisplayName = 'unique_condition_displayname',\n UniqueListItemId = 'unique_list_item_id',\n UniqueListItemText = 'unique_list_item_text',\n UniqueListItemValue = 'unique_list_item_value',\n RefPageCondition = 'ref_page_condition',\n RefConditionComponentId = 'ref_condition_component_id',\n RefConditionListId = 'ref_condition_list_id',\n RefConditionItemId = 'ref_condition_item_id',\n RefConditionConditionId = 'ref_condition_condition_id',\n RefPageComponentList = 'ref_page_component_list',\n Other = 'other'\n}\n\nexport const N = Symbol('AnyNumber')\n\nexport type ErrorMatchPath = (string | typeof N)[]\nexport interface ErrorMatchValue {\n path: ErrorMatchPath\n key: string\n type: FormDefinitionErrorType\n}\n\nexport type FormDefinitionErrors = Record<FormDefinitionError, ErrorMatchValue>\n\n// The errors that can exist in the form definition\nexport const formDefinitionErrors: FormDefinitionErrors = {\n [FormDefinitionError.UniquePagePath]: {\n path: ['pages', N],\n key: 'path',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniquePageId]: {\n path: ['pages', N],\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniquePageComponentId]: {\n path: ['pages', N, 'components', N],\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniquePageComponentName]: {\n path: ['pages', N, 'components', N],\n key: 'name',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueSectionName]: {\n path: ['sections', N],\n key: 'name',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueSectionTitle]: {\n path: ['sections', N],\n key: 'title',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListId]: {\n path: ['lists', N],\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListTitle]: {\n path: ['lists', N],\n key: 'title',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListName]: {\n path: ['lists', N],\n key: 'name',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueConditionDisplayName]: {\n path: ['conditions', N],\n key: 'displayName',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueConditionId]: {\n path: ['conditions', N],\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListItemId]: {\n path: ['lists', N, 'items', N],\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListItemText]: {\n path: ['lists', N, 'items', N],\n key: 'text',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListItemValue]: {\n path: ['lists', N, 'items', N],\n key: 'value',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.RefPageCondition]: {\n path: ['pages', N, 'condition'],\n key: 'condition',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefConditionComponentId]: {\n path: ['conditions', N, 'items', N, 'componentId'],\n key: 'componentId',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefConditionListId]: {\n path: ['conditions', N, 'items', N, 'value', 'listId'],\n key: 'listId',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefConditionItemId]: {\n path: ['conditions', N, 'items', N, 'value', 'itemId'],\n key: 'itemId',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefConditionConditionId]: {\n path: ['conditions', N, 'items', N, 'conditionId'],\n key: 'conditionId',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefPageComponentList]: {\n path: ['pages', N, 'components', N, 'list'],\n key: 'list',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.Other]: {\n path: [],\n key: '',\n type: FormDefinitionErrorType.Type\n }\n}\n\nexport type FormDefinitionErrorCauseDetailPath = (string | number)[]\n\nexport interface FormDefinitionErrorCauseDetailUnique {\n path: FormDefinitionErrorCauseDetailPath\n pos: number\n dupePos: number\n}\n\nexport interface FormDefinitionErrorCauseDetailRef {\n path: FormDefinitionErrorCauseDetailPath\n}\n\nexport type FormDefinitionErrorCause =\n | {\n id: FormDefinitionError\n type: FormDefinitionErrorType.Unique\n message: string\n detail: FormDefinitionErrorCauseDetailUnique\n }\n | {\n id: FormDefinitionError\n type: FormDefinitionErrorType.Ref\n message: string\n detail: FormDefinitionErrorCauseDetailRef\n }\n | {\n id: FormDefinitionError\n type: FormDefinitionErrorType.Type\n message: string /* */\n detail: Context | undefined\n }\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":["FormDefinitionErrorType","FormDefinitionError","formDefinitionErrors","UniquePagePath","key","type","Unique","UniquePageId","UniquePageComponentId","UniquePageComponentName","UniqueSectionName","UniqueSectionTitle","UniqueListId","UniqueListTitle","UniqueListName","UniqueConditionDisplayName","UniqueConditionId","UniqueListItemId","UniqueListItemText","UniqueListItemValue","RefPageCondition","Ref","RefConditionComponentId","RefConditionListId","RefConditionItemId","RefConditionConditionId","RefPageComponentList","Other","Type"],"sources":["../../../../src/form/form-manager/types.ts"],"sourcesContent":["import { type Context } from 'joi'\n\nimport { type ControllerType, type Repeat } from '~/src/index.js'\n\nexport interface PatchPageFields {\n title?: string\n path?: string\n controller?: ControllerType | null\n repeat?: Repeat\n condition?: string | null\n}\n\nexport interface AddComponentQueryOptions {\n prepend?: boolean\n}\n\n// Enum of error types that can be raised through validating the form definition\nexport enum FormDefinitionErrorType {\n Unique = 'unique', // Unique constraint\n Ref = 'ref', // Referential integrity\n Type = 'type' // General schema type error\n}\n\n// Enum for errors that can exist in a form definition\nexport enum FormDefinitionError {\n UniquePageId = 'unique_page_id',\n UniquePagePath = 'unique_page_path',\n UniquePageComponentId = 'unique_page_component_id',\n UniquePageComponentName = 'unique_page_component_name',\n UniqueSectionName = 'unique_section_name',\n UniqueSectionTitle = 'unique_section_title',\n UniqueListId = 'unique_list_id',\n UniqueListTitle = 'unique_list_title',\n UniqueListName = 'unique_list_name',\n UniqueConditionId = 'unique_condition_id',\n UniqueConditionDisplayName = 'unique_condition_displayname',\n UniqueListItemId = 'unique_list_item_id',\n UniqueListItemText = 'unique_list_item_text',\n UniqueListItemValue = 'unique_list_item_value',\n RefPageCondition = 'ref_page_condition',\n RefConditionComponentId = 'ref_condition_component_id',\n RefConditionListId = 'ref_condition_list_id',\n RefConditionItemId = 'ref_condition_item_id',\n RefConditionConditionId = 'ref_condition_condition_id',\n RefPageComponentList = 'ref_page_component_list',\n Other = 'other'\n}\n\nexport interface ErrorMatchValue {\n key: string\n type: FormDefinitionErrorType\n}\n\nexport type FormDefinitionErrors = Record<FormDefinitionError, ErrorMatchValue>\n\n// The errors that can exist in the form definition\nexport const formDefinitionErrors: FormDefinitionErrors = {\n [FormDefinitionError.UniquePagePath]: {\n key: 'path',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniquePageId]: {\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniquePageComponentId]: {\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniquePageComponentName]: {\n key: 'name',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueSectionName]: {\n key: 'name',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueSectionTitle]: {\n key: 'title',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListId]: {\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListTitle]: {\n key: 'title',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListName]: {\n key: 'name',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueConditionDisplayName]: {\n key: 'displayName',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueConditionId]: {\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListItemId]: {\n key: 'id',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListItemText]: {\n key: 'text',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.UniqueListItemValue]: {\n key: 'value',\n type: FormDefinitionErrorType.Unique\n },\n [FormDefinitionError.RefPageCondition]: {\n key: 'condition',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefConditionComponentId]: {\n key: 'componentId',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefConditionListId]: {\n key: 'listId',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefConditionItemId]: {\n key: 'itemId',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefConditionConditionId]: {\n key: 'conditionId',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.RefPageComponentList]: {\n key: 'list',\n type: FormDefinitionErrorType.Ref\n },\n [FormDefinitionError.Other]: {\n key: '',\n type: FormDefinitionErrorType.Type\n }\n}\n\nexport type FormDefinitionErrorCauseDetailPath = (string | number)[]\n\nexport interface FormDefinitionErrorCauseDetailUnique {\n path: FormDefinitionErrorCauseDetailPath\n pos: number\n dupePos: number\n}\n\nexport interface FormDefinitionErrorCauseDetailRef {\n path: FormDefinitionErrorCauseDetailPath\n}\n\nexport type FormDefinitionErrorCause =\n | {\n id: FormDefinitionError\n type: FormDefinitionErrorType.Unique\n message: string\n detail: FormDefinitionErrorCauseDetailUnique\n }\n | {\n id: FormDefinitionError\n type: FormDefinitionErrorType.Ref\n message: string\n detail: FormDefinitionErrorCauseDetailRef\n }\n | {\n id: FormDefinitionError\n type: FormDefinitionErrorType.Type\n message: string /* */\n detail: Context | undefined\n }\n"],"mappings":"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","ignoreList":[]}
@@ -14,6 +14,7 @@ export * from "./form/utils/index.js";
14
14
  export * from "./form/form-editor/index.js";
15
15
  export * from "./form/form-editor/preview/index.js";
16
16
  export * from "./form/form-manager/types.js";
17
+ export * from "./form/form-manager/errors.js";
17
18
  export * from "./pages/index.js";
18
19
  export * from "./utils/helpers.js";
19
20
  export * from "./utils/markdown.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from '~/src/common/enums.js'\nexport * from '~/src/common/random-id.js'\nexport * from '~/src/common/schema.js'\nexport * from '~/src/common/pagination/index.js'\nexport * from '~/src/common/search/index.js'\nexport * from '~/src/common/sorting/index.js'\nexport * from '~/src/components/index.js'\nexport * from '~/src/conditions/index.js'\nexport * from '~/src/form/form-definition/index.js'\nexport * from '~/src/form/form-definition/types.js'\nexport * from '~/src/form/form-metadata/index.js'\nexport * from '~/src/form/form-submission/index.js'\nexport * from '~/src/form/utils/index.js'\nexport * from '~/src/form/form-editor/index.js'\nexport * from '~/src/form/form-editor/preview/index.js'\nexport * from '~/src/form/form-manager/types.js'\nexport * from '~/src/pages/index.js'\nexport * from '~/src/utils/helpers.js'\nexport * from '~/src/utils/markdown.js'\n\nexport type * from '~/src/common/types.js'\nexport type * from '~/src/common/pagination/types.js'\nexport type * from '~/src/common/search/types.js'\nexport type * from '~/src/common/sorting/types.js'\nexport type * from '~/src/components/types.js'\nexport type * from '~/src/conditions/types.js'\nexport type * from '~/src/form/form-definition/types.js'\nexport type * from '~/src/form/form-metadata/types.js'\nexport type * from '~/src/form/form-submission/types.js'\nexport type * from '~/src/form/form-editor/preview/types.js'\nexport type * from '~/src/form/form-editor/types.js'\nexport type * from '~/src/form/form-editor/macros/types.js'\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from '~/src/common/enums.js'\nexport * from '~/src/common/random-id.js'\nexport * from '~/src/common/schema.js'\nexport * from '~/src/common/pagination/index.js'\nexport * from '~/src/common/search/index.js'\nexport * from '~/src/common/sorting/index.js'\nexport * from '~/src/components/index.js'\nexport * from '~/src/conditions/index.js'\nexport * from '~/src/form/form-definition/index.js'\nexport * from '~/src/form/form-definition/types.js'\nexport * from '~/src/form/form-metadata/index.js'\nexport * from '~/src/form/form-submission/index.js'\nexport * from '~/src/form/utils/index.js'\nexport * from '~/src/form/form-editor/index.js'\nexport * from '~/src/form/form-editor/preview/index.js'\nexport * from '~/src/form/form-manager/types.js'\nexport * from '~/src/form/form-manager/errors.js'\nexport * from '~/src/pages/index.js'\nexport * from '~/src/utils/helpers.js'\nexport * from '~/src/utils/markdown.js'\n\nexport type * from '~/src/common/types.js'\nexport type * from '~/src/common/pagination/types.js'\nexport type * from '~/src/common/search/types.js'\nexport type * from '~/src/common/sorting/types.js'\nexport type * from '~/src/components/types.js'\nexport type * from '~/src/conditions/types.js'\nexport type * from '~/src/form/form-definition/types.js'\nexport type * from '~/src/form/form-metadata/types.js'\nexport type * from '~/src/form/form-submission/types.js'\nexport type * from '~/src/form/form-editor/preview/types.js'\nexport type * from '~/src/form/form-editor/types.js'\nexport type * from '~/src/form/form-editor/macros/types.js'\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-definition/index.ts"],"names":[],"mappings":"AACA,OAAO,OAAkC,MAAM,KAAK,CAAA;AAIpD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC9B,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAEL,KAAK,eAAe,EAWrB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAGL,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EAGnB,KAAK,IAAI,EACT,KAAK,IAAI,EAET,KAAK,MAAM,EAIZ,MAAM,qCAAqC,CAAA;AAuN5C,eAAO,MAAM,qBAAqB,uCAmD9B,CAAA;AAoDJ,eAAO,MAAM,wBAAwB,0CAyBU,CAAA;AAE/C,eAAO,MAAM,eAAe,oCAkGZ,CAAA;AAEhB,eAAO,MAAM,iBAAiB,oCAaiB,CAAA;AAE/C,eAAO,MAAM,wBAAwB,oCASsB,CAAA;AAE3D,eAAO,MAAM,yBAAyB,oCAMpC,CAAA;AAEF,eAAO,MAAM,sBAAsB,oCAUjC,CAAA;AAoDF,eAAO,MAAM,gBAAgB,8BASzB,CAAA;AAyCJ,eAAO,MAAM,0BAA0B,sEAWmB,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,UAAU,4BAmDnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,4BAgCiB,CAAA;AAE1C,eAAO,MAAM,mBAAmB,4BAgBkB,CAAA;AAwDlD,eAAO,MAAM,UAAU,4BAgCnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,4BAIiB,CAAA;AAsD1C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,sCAsE7B,CAAA;AAEJ,eAAO,MAAM,sBAAsB,sCAwBY,CAAA;AAI/C,eAAO,MAAM,MAAM,sCAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-definition/index.ts"],"names":[],"mappings":"AACA,OAAO,OAAkC,MAAM,KAAK,CAAA;AAIpD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC9B,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAEL,KAAK,eAAe,EAWrB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAGL,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EAGnB,KAAK,IAAI,EACT,KAAK,IAAI,EAET,KAAK,MAAM,EAIZ,MAAM,qCAAqC,CAAA;AA4N5C,eAAO,MAAM,qBAAqB,uCAoD9B,CAAA;AAoDJ,eAAO,MAAM,wBAAwB,0CAyBU,CAAA;AAE/C,eAAO,MAAM,eAAe,oCAkGZ,CAAA;AAEhB,eAAO,MAAM,iBAAiB,oCAciB,CAAA;AAE/C,eAAO,MAAM,wBAAwB,oCASsB,CAAA;AAE3D,eAAO,MAAM,yBAAyB,oCAMpC,CAAA;AAEF,eAAO,MAAM,sBAAsB,oCAUjC,CAAA;AAoDF,eAAO,MAAM,gBAAgB,8BASzB,CAAA;AAyCJ,eAAO,MAAM,0BAA0B,sEAWmB,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,UAAU,4BAmDnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,4BAuCiB,CAAA;AAE1C,eAAO,MAAM,mBAAmB,4BAgBkB,CAAA;AAwDlD,eAAO,MAAM,UAAU,4BA8CnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,4BAIiB,CAAA;AAsD1C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,sCA4E7B,CAAA;AAEJ,eAAO,MAAM,sBAAsB,sCA2CY,CAAA;AAI/C,eAAO,MAAM,MAAM,sCAAuB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type Joi from 'joi';
2
+ import { type ValidationError } from 'joi';
3
+ import { FormDefinitionError, type FormDefinitionErrorCause } from '../../form/form-manager/types.js';
4
+ /**
5
+ * Checks and applies an `errorType` and also an `errorCode` for known errors
6
+ */
7
+ export declare const checkErrors: (formErrors: FormDefinitionError | FormDefinitionError[]) => (errors: Joi.ErrorReport[]) => Joi.ErrorReport[];
8
+ /**
9
+ * Get the custom errors from a form definition joi validation error
10
+ */
11
+ export declare function getErrors(validationError: ValidationError | undefined): FormDefinitionErrorCause[];
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/form/form-manager/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,KAAK,CAAA;AAE1C,OAAO,EACL,mBAAmB,EAGnB,KAAK,wBAAwB,EAC9B,MAAM,kCAAkC,CAAA;AAEzC;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,YAAY,mBAAmB,GAAG,mBAAmB,EAAE,MAItC,QAAQ,GAAG,CAAC,WAAW,EAAE,sBAuC3C,CAAA;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,eAAe,EAAE,eAAe,GAAG,SAAS,GAC3C,wBAAwB,EAAE,CA0C5B"}
@@ -16,8 +16,8 @@ export declare enum FormDefinitionErrorType {
16
16
  Type = "type"
17
17
  }
18
18
  export declare enum FormDefinitionError {
19
- UniquePagePath = "unique_page_path",
20
19
  UniquePageId = "unique_page_id",
20
+ UniquePagePath = "unique_page_path",
21
21
  UniquePageComponentId = "unique_page_component_id",
22
22
  UniquePageComponentName = "unique_page_component_name",
23
23
  UniqueSectionName = "unique_section_name",
@@ -38,10 +38,7 @@ export declare enum FormDefinitionError {
38
38
  RefPageComponentList = "ref_page_component_list",
39
39
  Other = "other"
40
40
  }
41
- export declare const N: unique symbol;
42
- export type ErrorMatchPath = (string | typeof N)[];
43
41
  export interface ErrorMatchValue {
44
- path: ErrorMatchPath;
45
42
  key: string;
46
43
  type: FormDefinitionErrorType;
47
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/form/form-manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAA;AAElC,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEjE,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAGD,oBAAY,uBAAuB;IACjC,MAAM,WAAW,CAAE,oBAAoB;IACvC,GAAG,QAAQ,CAAE,wBAAwB;IACrC,IAAI,SAAS;CACd;AAGD,oBAAY,mBAAmB;IAC7B,cAAc,qBAAqB;IACnC,YAAY,mBAAmB;IAC/B,qBAAqB,6BAA6B;IAClD,uBAAuB,+BAA+B;IACtD,iBAAiB,wBAAwB;IACzC,kBAAkB,yBAAyB;IAC3C,YAAY,mBAAmB;IAC/B,eAAe,sBAAsB;IACrC,cAAc,qBAAqB;IACnC,iBAAiB,wBAAwB;IACzC,0BAA0B,iCAAiC;IAC3D,gBAAgB,wBAAwB;IACxC,kBAAkB,0BAA0B;IAC5C,mBAAmB,2BAA2B;IAC9C,gBAAgB,uBAAuB;IACvC,uBAAuB,+BAA+B;IACtD,kBAAkB,0BAA0B;IAC5C,kBAAkB,0BAA0B;IAC5C,uBAAuB,+BAA+B;IACtD,oBAAoB,4BAA4B;IAChD,KAAK,UAAU;CAChB;AAED,eAAO,MAAM,CAAC,eAAsB,CAAA;AAEpC,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAA;AAClD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,uBAAuB,CAAA;CAC9B;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAA;AAG/E,eAAO,MAAM,oBAAoB,EAAE,oBA0GlC,CAAA;AAED,MAAM,MAAM,kCAAkC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;AAEpE,MAAM,WAAW,oCAAoC;IACnD,IAAI,EAAE,kCAAkC,CAAA;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,kCAAkC,CAAA;CACzC;AAED,MAAM,MAAM,wBAAwB,GAChC;IACE,EAAE,EAAE,mBAAmB,CAAA;IACvB,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,oCAAoC,CAAA;CAC7C,GACD;IACE,EAAE,EAAE,mBAAmB,CAAA;IACvB,IAAI,EAAE,uBAAuB,CAAC,GAAG,CAAA;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,iCAAiC,CAAA;CAC1C,GACD;IACE,EAAE,EAAE,mBAAmB,CAAA;IACvB,IAAI,EAAE,uBAAuB,CAAC,IAAI,CAAA;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;CAC5B,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/form/form-manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAA;AAElC,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEjE,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAGD,oBAAY,uBAAuB;IACjC,MAAM,WAAW,CAAE,oBAAoB;IACvC,GAAG,QAAQ,CAAE,wBAAwB;IACrC,IAAI,SAAS;CACd;AAGD,oBAAY,mBAAmB;IAC7B,YAAY,mBAAmB;IAC/B,cAAc,qBAAqB;IACnC,qBAAqB,6BAA6B;IAClD,uBAAuB,+BAA+B;IACtD,iBAAiB,wBAAwB;IACzC,kBAAkB,yBAAyB;IAC3C,YAAY,mBAAmB;IAC/B,eAAe,sBAAsB;IACrC,cAAc,qBAAqB;IACnC,iBAAiB,wBAAwB;IACzC,0BAA0B,iCAAiC;IAC3D,gBAAgB,wBAAwB;IACxC,kBAAkB,0BAA0B;IAC5C,mBAAmB,2BAA2B;IAC9C,gBAAgB,uBAAuB;IACvC,uBAAuB,+BAA+B;IACtD,kBAAkB,0BAA0B;IAC5C,kBAAkB,0BAA0B;IAC5C,uBAAuB,+BAA+B;IACtD,oBAAoB,4BAA4B;IAChD,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,uBAAuB,CAAA;CAC9B;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAA;AAG/E,eAAO,MAAM,oBAAoB,EAAE,oBAqFlC,CAAA;AAED,MAAM,MAAM,kCAAkC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;AAEpE,MAAM,WAAW,oCAAoC;IACnD,IAAI,EAAE,kCAAkC,CAAA;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,kCAAkC,CAAA;CACzC;AAED,MAAM,MAAM,wBAAwB,GAChC;IACE,EAAE,EAAE,mBAAmB,CAAA;IACvB,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,oCAAoC,CAAA;CAC7C,GACD;IACE,EAAE,EAAE,mBAAmB,CAAA;IACvB,IAAI,EAAE,uBAAuB,CAAC,GAAG,CAAA;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,iCAAiC,CAAA;CAC1C,GACD;IACE,EAAE,EAAE,mBAAmB,CAAA;IACvB,IAAI,EAAE,uBAAuB,CAAC,IAAI,CAAA;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;CAC5B,CAAA"}
@@ -14,6 +14,7 @@ export * from './form/utils/index.js';
14
14
  export * from './form/form-editor/index.js';
15
15
  export * from './form/form-editor/preview/index.js';
16
16
  export * from './form/form-manager/types.js';
17
+ export * from './form/form-manager/errors.js';
17
18
  export * from './pages/index.js';
18
19
  export * from './utils/helpers.js';
19
20
  export * from './utils/markdown.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,kCAAkC,CAAA;AAChD,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qCAAqC,CAAA;AACnD,cAAc,qCAAqC,CAAA;AACnD,cAAc,mCAAmC,CAAA;AACjD,cAAc,qCAAqC,CAAA;AACnD,cAAc,2BAA2B,CAAA;AACzC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yCAAyC,CAAA;AACvD,cAAc,kCAAkC,CAAA;AAChD,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AAEvC,mBAAmB,uBAAuB,CAAA;AAC1C,mBAAmB,kCAAkC,CAAA;AACrD,mBAAmB,8BAA8B,CAAA;AACjD,mBAAmB,+BAA+B,CAAA;AAClD,mBAAmB,2BAA2B,CAAA;AAC9C,mBAAmB,2BAA2B,CAAA;AAC9C,mBAAmB,qCAAqC,CAAA;AACxD,mBAAmB,mCAAmC,CAAA;AACtD,mBAAmB,qCAAqC,CAAA;AACxD,mBAAmB,yCAAyC,CAAA;AAC5D,mBAAmB,iCAAiC,CAAA;AACpD,mBAAmB,wCAAwC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,kCAAkC,CAAA;AAChD,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qCAAqC,CAAA;AACnD,cAAc,qCAAqC,CAAA;AACnD,cAAc,mCAAmC,CAAA;AACjD,cAAc,qCAAqC,CAAA;AACnD,cAAc,2BAA2B,CAAA;AACzC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yCAAyC,CAAA;AACvD,cAAc,kCAAkC,CAAA;AAChD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AAEvC,mBAAmB,uBAAuB,CAAA;AAC1C,mBAAmB,kCAAkC,CAAA;AACrD,mBAAmB,8BAA8B,CAAA;AACjD,mBAAmB,+BAA+B,CAAA;AAClD,mBAAmB,2BAA2B,CAAA;AAC9C,mBAAmB,2BAA2B,CAAA;AAC9C,mBAAmB,qCAAqC,CAAA;AACxD,mBAAmB,mCAAmC,CAAA;AACtD,mBAAmB,qCAAqC,CAAA;AACxD,mBAAmB,yCAAyC,CAAA;AAC5D,mBAAmB,iCAAiC,CAAA;AACpD,mBAAmB,wCAAwC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-model",
3
- "version": "3.0.494",
3
+ "version": "3.0.496",
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
  "types": "dist/types/index.d.ts",
@@ -41,6 +41,8 @@ import {
41
41
  type RepeatSchema,
42
42
  type Section
43
43
  } from '~/src/form/form-definition/types.js'
44
+ import { checkErrors } from '~/src/form/form-manager/errors.js'
45
+ import { FormDefinitionError } from '~/src/form/form-manager/types.js'
44
46
  import { ControllerType } from '~/src/pages/enums.js'
45
47
  import { hasComponents } from '~/src/pages/helpers.js'
46
48
 
@@ -148,7 +150,8 @@ const conditionListItemRefDataSchemaV2 =
148
150
  is: Joi.exist(),
149
151
  then: Joi.valid(listIdRef)
150
152
  })
151
- .description('The id of the list'),
153
+ .description('The id of the list')
154
+ .error(checkErrors(FormDefinitionError.RefConditionListId)),
152
155
  itemId: Joi.string()
153
156
  .trim()
154
157
  .when('/lists', {
@@ -157,6 +160,7 @@ const conditionListItemRefDataSchemaV2 =
157
160
  })
158
161
  .required()
159
162
  .description('The id of the list item')
163
+ .error(checkErrors(FormDefinitionError.RefConditionItemId))
160
164
  })
161
165
 
162
166
  const relativeDateValueDataSchemaV2 = Joi.object<RelativeDateValueDataV2>()
@@ -230,6 +234,7 @@ const conditionRefDataSchemaV2 = Joi.object<ConditionRefDataV2>()
230
234
  then: Joi.valid(conditionIdRef)
231
235
  })
232
236
  .description('Name of the referenced condition')
237
+ .error(checkErrors(FormDefinitionError.RefConditionConditionId))
233
238
  })
234
239
 
235
240
  const conditionSchema = Joi.object<ConditionData>()
@@ -270,7 +275,8 @@ export const conditionDataSchemaV2 = Joi.object<ConditionDataV2>()
270
275
  })
271
276
  .description(
272
277
  'Reference to the component id being evaluated in this condition'
273
- ),
278
+ )
279
+ .error(checkErrors(FormDefinitionError.RefConditionComponentId)),
274
280
  operator: Joi.string()
275
281
  .trim()
276
282
  .valid(...Object.values(OperatorName))
@@ -497,6 +503,7 @@ export const componentSchemaV2 = componentSchema
497
503
  .description(
498
504
  'List id reference to a predefined list of options for select components'
499
505
  )
506
+ .error(checkErrors(FormDefinitionError.RefPageComponentList))
500
507
  })
501
508
  .description('Component schema for V2 forms')
502
509
 
@@ -638,8 +645,8 @@ export const pageUploadComponentsSchema = Joi.array<
638
645
  fileUploadComponentSchema.required(),
639
646
  contentComponentSchema.optional()
640
647
  )
641
- .unique('name')
642
648
  .unique('id')
649
+ .unique('name')
643
650
  .min(1)
644
651
  .max(2)
645
652
  .description('Components allowed on Page Upload schema')
@@ -723,9 +730,15 @@ export const pageSchemaV2 = pageSchema
723
730
  ],
724
731
  otherwise: Joi.array<ComponentDef>()
725
732
  .items(componentSchemaV2)
726
- .unique('name')
727
733
  .unique('id')
734
+ .unique('name')
728
735
  .description('Components schema for V2 forms')
736
+ .error(
737
+ checkErrors([
738
+ FormDefinitionError.UniquePageComponentId,
739
+ FormDefinitionError.UniquePageComponentName
740
+ ])
741
+ )
729
742
  }),
730
743
  condition: Joi.string()
731
744
  .trim()
@@ -735,6 +748,7 @@ export const pageSchemaV2 = pageSchema
735
748
  })
736
749
  .optional()
737
750
  .description('Optional condition that determines if this page is shown')
751
+ .error(checkErrors(FormDefinitionError.RefPageCondition))
738
752
  })
739
753
  .description('Page schema for V2 forms')
740
754
 
@@ -749,8 +763,8 @@ export const pagePayloadSchemaV2 = pageSchemaV2
749
763
  ],
750
764
  otherwise: Joi.array<ComponentDef>()
751
765
  .items(componentPayloadSchemaV2)
752
- .unique('name')
753
766
  .unique('id')
767
+ .unique('name')
754
768
  .description('Components schema for V2 forms')
755
769
  })
756
770
  })
@@ -834,13 +848,27 @@ export const listSchema = Joi.object<List>()
834
848
  .unique('id')
835
849
  .unique('text')
836
850
  .unique('value')
837
- .description('Array of items with string values'),
851
+ .description('Array of items with string values')
852
+ .error(
853
+ checkErrors([
854
+ FormDefinitionError.UniqueListItemId,
855
+ FormDefinitionError.UniqueListItemText,
856
+ FormDefinitionError.UniqueListItemValue
857
+ ])
858
+ ),
838
859
  otherwise: Joi.array()
839
860
  .items(numberListItemSchema)
840
861
  .unique('id')
841
862
  .unique('text')
842
863
  .unique('value')
843
864
  .description('Array of items with numeric values')
865
+ .error(
866
+ checkErrors([
867
+ FormDefinitionError.UniqueListItemId,
868
+ FormDefinitionError.UniqueListItemText,
869
+ FormDefinitionError.UniqueListItemValue
870
+ ])
871
+ )
844
872
  })
845
873
  })
846
874
 
@@ -945,7 +973,13 @@ export const formDefinitionSchema = Joi.object<FormDefinition>()
945
973
  .unique('name')
946
974
  .unique('title')
947
975
  .required()
948
- .description('Sections grouping related pages together'),
976
+ .description('Sections grouping related pages together')
977
+ .error(
978
+ checkErrors([
979
+ FormDefinitionError.UniqueSectionName,
980
+ FormDefinitionError.UniqueSectionTitle
981
+ ])
982
+ ),
949
983
  conditions: Joi.array<ConditionWrapper>()
950
984
  .items(conditionWrapperSchema)
951
985
  .unique('name')
@@ -990,20 +1024,39 @@ export const formDefinitionV2Schema = formDefinitionSchema
990
1024
  pages: Joi.array<Page>()
991
1025
  .items(pageSchemaV2)
992
1026
  .required()
993
- .unique('path')
994
1027
  .unique('id')
995
- .description('Pages schema for V2 forms'),
1028
+ .unique('path')
1029
+ .description('Pages schema for V2 forms')
1030
+ .error(
1031
+ checkErrors([
1032
+ FormDefinitionError.UniquePageId,
1033
+ FormDefinitionError.UniquePagePath
1034
+ ])
1035
+ ),
996
1036
  lists: Joi.array<List>()
997
1037
  .items(listSchemaV2)
1038
+ .unique('id')
998
1039
  .unique('name')
999
1040
  .unique('title')
1000
- .unique('id')
1001
- .description('Lists schema for V2 forms'),
1041
+ .description('Lists schema for V2 forms')
1042
+ .error(
1043
+ checkErrors([
1044
+ FormDefinitionError.UniqueListId,
1045
+ FormDefinitionError.UniqueListName,
1046
+ FormDefinitionError.UniqueListTitle
1047
+ ])
1048
+ ),
1002
1049
  conditions: Joi.array<ConditionWrapperV2>()
1003
1050
  .items(conditionWrapperSchemaV2)
1004
1051
  .unique('id')
1005
1052
  .unique('displayName')
1006
1053
  .description('Named conditions used for form logic')
1054
+ .error(
1055
+ checkErrors([
1056
+ FormDefinitionError.UniqueConditionId,
1057
+ FormDefinitionError.UniqueConditionDisplayName
1058
+ ])
1059
+ )
1007
1060
  })
1008
1061
  .description('Form definition schema for V2')
1009
1062
 
@@ -0,0 +1,107 @@
1
+ import type Joi from 'joi'
2
+ import { type ValidationError } from 'joi'
3
+
4
+ import {
5
+ FormDefinitionError,
6
+ FormDefinitionErrorType,
7
+ formDefinitionErrors,
8
+ type FormDefinitionErrorCause
9
+ } from '~/src/form/form-manager/types.js'
10
+
11
+ /**
12
+ * Checks and applies an `errorType` and also an `errorCode` for known errors
13
+ */
14
+ export const checkErrors = (
15
+ formErrors: FormDefinitionError | FormDefinitionError[]
16
+ ) => {
17
+ const possibleErrors = Array.isArray(formErrors) ? formErrors : [formErrors]
18
+
19
+ return function (errors: Joi.ErrorReport[]) {
20
+ errors.forEach((err) => {
21
+ if (err.local.errorType) {
22
+ return
23
+ }
24
+
25
+ for (const formError of possibleErrors) {
26
+ const errorDetails = formDefinitionErrors[formError]
27
+
28
+ // Joi's `context.key` will be the index for arrays
29
+ // in which case use the path, otherwise use the key
30
+ const keyMatch =
31
+ typeof err.local.key === 'number' ? err.local.path : err.local.key
32
+
33
+ if (
34
+ errorDetails.type === FormDefinitionErrorType.Unique &&
35
+ err.code === 'array.unique' &&
36
+ keyMatch === errorDetails.key
37
+ ) {
38
+ err.local.errorCode = formError
39
+ err.local.errorType = FormDefinitionErrorType.Unique
40
+ return
41
+ }
42
+
43
+ if (
44
+ errorDetails.type === FormDefinitionErrorType.Ref &&
45
+ err.code === 'any.only' &&
46
+ keyMatch === errorDetails.key
47
+ ) {
48
+ err.local.errorCode = formError
49
+ err.local.errorType = FormDefinitionErrorType.Ref
50
+ return
51
+ }
52
+
53
+ err.local.errorType = FormDefinitionErrorType.Type
54
+ }
55
+ })
56
+ return errors
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Get the custom errors from a form definition joi validation error
62
+ */
63
+ export function getErrors(
64
+ validationError: ValidationError | undefined
65
+ ): FormDefinitionErrorCause[] {
66
+ return (
67
+ validationError?.details.map((detail) => {
68
+ if (
69
+ detail.context?.errorType === FormDefinitionErrorType.Unique &&
70
+ detail.context.errorCode
71
+ ) {
72
+ return {
73
+ id: /** @type {FormDefinitionError} */ detail.context.errorCode,
74
+ type: FormDefinitionErrorType.Unique,
75
+ message: detail.message,
76
+ detail: {
77
+ path: detail.path,
78
+ pos: detail.context.pos,
79
+ dupePos: detail.context.dupePos
80
+ }
81
+ }
82
+ }
83
+
84
+ if (
85
+ detail.context?.errorType === FormDefinitionErrorType.Ref &&
86
+ detail.context.errorCode
87
+ ) {
88
+ return {
89
+ id: /** @type {FormDefinitionError} */ detail.context.errorCode,
90
+ type: FormDefinitionErrorType.Ref,
91
+ message: detail.message,
92
+ detail: {
93
+ path: detail.path
94
+ }
95
+ }
96
+ }
97
+
98
+ // Catch all others
99
+ return {
100
+ id: FormDefinitionError.Other,
101
+ type: FormDefinitionErrorType.Type,
102
+ message: detail.message,
103
+ detail: detail.context
104
+ }
105
+ }) ?? []
106
+ )
107
+ }
@@ -23,8 +23,8 @@ export enum FormDefinitionErrorType {
23
23
 
24
24
  // Enum for errors that can exist in a form definition
25
25
  export enum FormDefinitionError {
26
- UniquePagePath = 'unique_page_path',
27
26
  UniquePageId = 'unique_page_id',
27
+ UniquePagePath = 'unique_page_path',
28
28
  UniquePageComponentId = 'unique_page_component_id',
29
29
  UniquePageComponentName = 'unique_page_component_name',
30
30
  UniqueSectionName = 'unique_section_name',
@@ -46,11 +46,7 @@ export enum FormDefinitionError {
46
46
  Other = 'other'
47
47
  }
48
48
 
49
- export const N = Symbol('AnyNumber')
50
-
51
- export type ErrorMatchPath = (string | typeof N)[]
52
49
  export interface ErrorMatchValue {
53
- path: ErrorMatchPath
54
50
  key: string
55
51
  type: FormDefinitionErrorType
56
52
  }
@@ -60,107 +56,86 @@ export type FormDefinitionErrors = Record<FormDefinitionError, ErrorMatchValue>
60
56
  // The errors that can exist in the form definition
61
57
  export const formDefinitionErrors: FormDefinitionErrors = {
62
58
  [FormDefinitionError.UniquePagePath]: {
63
- path: ['pages', N],
64
59
  key: 'path',
65
60
  type: FormDefinitionErrorType.Unique
66
61
  },
67
62
  [FormDefinitionError.UniquePageId]: {
68
- path: ['pages', N],
69
63
  key: 'id',
70
64
  type: FormDefinitionErrorType.Unique
71
65
  },
72
66
  [FormDefinitionError.UniquePageComponentId]: {
73
- path: ['pages', N, 'components', N],
74
67
  key: 'id',
75
68
  type: FormDefinitionErrorType.Unique
76
69
  },
77
70
  [FormDefinitionError.UniquePageComponentName]: {
78
- path: ['pages', N, 'components', N],
79
71
  key: 'name',
80
72
  type: FormDefinitionErrorType.Unique
81
73
  },
82
74
  [FormDefinitionError.UniqueSectionName]: {
83
- path: ['sections', N],
84
75
  key: 'name',
85
76
  type: FormDefinitionErrorType.Unique
86
77
  },
87
78
  [FormDefinitionError.UniqueSectionTitle]: {
88
- path: ['sections', N],
89
79
  key: 'title',
90
80
  type: FormDefinitionErrorType.Unique
91
81
  },
92
82
  [FormDefinitionError.UniqueListId]: {
93
- path: ['lists', N],
94
83
  key: 'id',
95
84
  type: FormDefinitionErrorType.Unique
96
85
  },
97
86
  [FormDefinitionError.UniqueListTitle]: {
98
- path: ['lists', N],
99
87
  key: 'title',
100
88
  type: FormDefinitionErrorType.Unique
101
89
  },
102
90
  [FormDefinitionError.UniqueListName]: {
103
- path: ['lists', N],
104
91
  key: 'name',
105
92
  type: FormDefinitionErrorType.Unique
106
93
  },
107
94
  [FormDefinitionError.UniqueConditionDisplayName]: {
108
- path: ['conditions', N],
109
95
  key: 'displayName',
110
96
  type: FormDefinitionErrorType.Unique
111
97
  },
112
98
  [FormDefinitionError.UniqueConditionId]: {
113
- path: ['conditions', N],
114
99
  key: 'id',
115
100
  type: FormDefinitionErrorType.Unique
116
101
  },
117
102
  [FormDefinitionError.UniqueListItemId]: {
118
- path: ['lists', N, 'items', N],
119
103
  key: 'id',
120
104
  type: FormDefinitionErrorType.Unique
121
105
  },
122
106
  [FormDefinitionError.UniqueListItemText]: {
123
- path: ['lists', N, 'items', N],
124
107
  key: 'text',
125
108
  type: FormDefinitionErrorType.Unique
126
109
  },
127
110
  [FormDefinitionError.UniqueListItemValue]: {
128
- path: ['lists', N, 'items', N],
129
111
  key: 'value',
130
112
  type: FormDefinitionErrorType.Unique
131
113
  },
132
114
  [FormDefinitionError.RefPageCondition]: {
133
- path: ['pages', N, 'condition'],
134
115
  key: 'condition',
135
116
  type: FormDefinitionErrorType.Ref
136
117
  },
137
118
  [FormDefinitionError.RefConditionComponentId]: {
138
- path: ['conditions', N, 'items', N, 'componentId'],
139
119
  key: 'componentId',
140
120
  type: FormDefinitionErrorType.Ref
141
121
  },
142
122
  [FormDefinitionError.RefConditionListId]: {
143
- path: ['conditions', N, 'items', N, 'value', 'listId'],
144
123
  key: 'listId',
145
124
  type: FormDefinitionErrorType.Ref
146
125
  },
147
126
  [FormDefinitionError.RefConditionItemId]: {
148
- path: ['conditions', N, 'items', N, 'value', 'itemId'],
149
127
  key: 'itemId',
150
128
  type: FormDefinitionErrorType.Ref
151
129
  },
152
130
  [FormDefinitionError.RefConditionConditionId]: {
153
- path: ['conditions', N, 'items', N, 'conditionId'],
154
131
  key: 'conditionId',
155
132
  type: FormDefinitionErrorType.Ref
156
133
  },
157
134
  [FormDefinitionError.RefPageComponentList]: {
158
- path: ['pages', N, 'components', N, 'list'],
159
135
  key: 'list',
160
136
  type: FormDefinitionErrorType.Ref
161
137
  },
162
138
  [FormDefinitionError.Other]: {
163
- path: [],
164
139
  key: '',
165
140
  type: FormDefinitionErrorType.Type
166
141
  }
package/src/index.ts CHANGED
@@ -14,6 +14,7 @@ export * from '~/src/form/utils/index.js'
14
14
  export * from '~/src/form/form-editor/index.js'
15
15
  export * from '~/src/form/form-editor/preview/index.js'
16
16
  export * from '~/src/form/form-manager/types.js'
17
+ export * from '~/src/form/form-manager/errors.js'
17
18
  export * from '~/src/pages/index.js'
18
19
  export * from '~/src/utils/helpers.js'
19
20
  export * from '~/src/utils/markdown.js'