@opencrvs/toolkit 1.8.0-rc.fd16d13 → 1.8.0-rc.fd31705

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +1 -1
  2. package/dist/commons/api/router.d.ts +6304 -12729
  3. package/dist/commons/conditionals/conditionals.d.ts +26 -3
  4. package/dist/commons/conditionals/validate.d.ts +12 -11
  5. package/dist/commons/events/ActionConfig.d.ts +1123 -2056
  6. package/dist/commons/events/ActionDocument.d.ts +8065 -452
  7. package/dist/commons/events/ActionInput.d.ts +3021 -594
  8. package/dist/commons/events/ActionType.d.ts +24 -11
  9. package/dist/commons/events/CompositeFieldValue.d.ts +52 -12
  10. package/dist/commons/events/Conditional.d.ts +21 -5
  11. package/dist/commons/events/Draft.d.ts +145 -61
  12. package/dist/commons/events/EventConfig.d.ts +551 -1206
  13. package/dist/commons/events/EventConfigInput.d.ts +6 -3
  14. package/dist/commons/events/EventDocument.d.ts +1565 -544
  15. package/dist/commons/events/EventIndex.d.ts +6 -3
  16. package/dist/commons/events/EventMetadata.d.ts +3 -0
  17. package/dist/commons/events/FieldConfig.d.ts +483 -76
  18. package/dist/commons/events/FieldType.d.ts +2 -1
  19. package/dist/commons/events/FieldTypeMapping.d.ts +57 -8
  20. package/dist/commons/events/FieldValue.d.ts +30 -10
  21. package/dist/commons/events/FormConfig.d.ts +633 -48
  22. package/dist/commons/events/PageConfig.d.ts +335 -0
  23. package/dist/commons/events/TemplateConfig.d.ts +2 -2
  24. package/dist/commons/events/defineConfig.d.ts +91 -216
  25. package/dist/commons/events/index.d.ts +2 -1
  26. package/dist/commons/events/test.utils.d.ts +87 -268
  27. package/dist/commons/events/utils.d.ts +90 -83
  28. package/dist/conditionals/index.js +166 -81
  29. package/dist/events/index.js +1188 -743
  30. package/package.json +1 -1
@@ -1,99 +1,57 @@
1
- import { TranslationConfig } from './TranslationConfig';
2
- import { ActionType } from './ActionType';
1
+ import { ActionType, DeclarationActionType } from './ActionType';
3
2
  import { EventConfig } from './EventConfig';
4
- import { EventConfigInput } from './EventConfigInput';
5
- import { EventMetadataKeys } from './EventMetadata';
6
3
  import { FieldConfig } from './FieldConfig';
7
4
  import { WorkqueueConfig } from './WorkqueueConfig';
8
- import { EventState } from './ActionDocument';
9
- import { FormConfig } from './FormConfig';
5
+ import { ActionUpdate, EventState } from './ActionDocument';
6
+ import { PageConfig, VerificationPageConfig } from './PageConfig';
10
7
  import { Draft } from './Draft';
11
8
  import { EventDocument } from './EventDocument';
12
- /**
13
- * @returns All the fields in the event configuration input.
14
- */
15
- export declare const findInputPageFields: (config: EventConfigInput) => {
16
- id: string;
17
- label: TranslationConfig;
18
- }[];
19
- /**
20
- * @returns All the fields in the event configuration.
21
- */
22
- export declare const findPageFields: (config: EventConfig) => FieldConfig[];
23
- /**
24
- *
25
- * @param pageFields - All the fields in the event configuration
26
- * @param refFields - The fields referencing values within the event configuration (e.g. summary fields) or within system provided metadata fields (e.g. createdAt, updatedBy)
27
- * @returns referenced fields with populated labels
28
- */
29
- export declare const resolveLabelsFromKnownFields: ({ pageFields, refFields }: {
30
- pageFields: {
31
- id: string;
32
- label: TranslationConfig;
33
- }[];
34
- refFields: {
35
- id: EventMetadataKeys | string;
36
- label?: TranslationConfig;
37
- }[];
38
- }) => {
39
- id: EventMetadataKeys | string;
40
- label?: TranslationConfig;
41
- }[];
42
- export declare function getAllFields(configuration: EventConfig): import("./FieldConfig").Inferred[];
43
- export declare function getAllPages(configuration: EventConfig): {
9
+ import { ActionConfig } from './ActionConfig';
10
+ import { FormConfig } from './FormConfig';
11
+ export declare function getDeclarationFields(configuration: EventConfig): FieldConfig[];
12
+ export declare function getDeclarationPages(configuration: EventConfig): {
13
+ type: "FORM";
44
14
  id: string;
45
- title: TranslationConfig;
15
+ title: import("./TranslationConfig").TranslationConfig;
46
16
  fields: import("./FieldConfig").Inferred[];
17
+ conditional?: import(".").JSONSchema | undefined;
47
18
  }[];
48
- export declare function validateWorkqueueConfig(workqueueConfigs: WorkqueueConfig[]): void;
49
- export declare const findActiveActionForm: (configuration: EventConfig, action: ActionType) => {
50
- active: boolean;
51
- version: {
52
- id: string;
53
- label: TranslationConfig;
54
- };
55
- label: TranslationConfig;
19
+ export declare function getDeclaration(configuration: EventConfig): {
20
+ label: import("./TranslationConfig").TranslationConfig;
56
21
  pages: {
22
+ type: "FORM";
57
23
  id: string;
58
- title: TranslationConfig;
24
+ title: import("./TranslationConfig").TranslationConfig;
59
25
  fields: import("./FieldConfig").Inferred[];
26
+ conditional?: import(".").JSONSchema | undefined;
60
27
  }[];
61
- review: {
62
- title: TranslationConfig;
63
- fields: import("./FieldConfig").Inferred[];
64
- };
65
- } | undefined;
66
- export declare const findActiveActionFormPages: (configuration: EventConfig, action: ActionType) => {
67
- id: string;
68
- title: TranslationConfig;
69
- fields: import("./FieldConfig").Inferred[];
70
- }[] | undefined;
71
- export declare const getFormFields: (formConfig: FormConfig) => import("./FieldConfig").Inferred[];
28
+ };
29
+ export declare const getActionAnnotationFields: (actionConfig: ActionConfig) => import("./FieldConfig").Inferred[];
30
+ export declare const getAllAnnotationFields: (config: EventConfig) => FieldConfig[];
72
31
  /**
73
- * Returns only form fields for the action type, if any, excluding review fields.
32
+ * @returns All the fields in the event configuration.
74
33
  */
75
- export declare const findActiveActionFormFields: (configuration: EventConfig, action: ActionType) => FieldConfig[] | undefined;
34
+ export declare const findAllFields: (config: EventConfig) => FieldConfig[];
76
35
  /**
77
- * Returns all fields for the action type, including review fields, if any.
36
+ * @TODO: Request correction should have same format as print certificate
78
37
  */
79
- export declare const findActiveActionFields: (configuration: EventConfig, action: ActionType) => FieldConfig[] | undefined;
80
- export declare const getActiveActionFormPages: (configuration: EventConfig, action: ActionType) => {
81
- id: string;
82
- title: TranslationConfig;
38
+ export declare const findRecordActionPages: (config: EventConfig, actionType: ActionType) => PageConfig[];
39
+ export declare function getActionReview(configuration: EventConfig, actionType: ActionType): {
40
+ title: import("./TranslationConfig").TranslationConfig;
83
41
  fields: import("./FieldConfig").Inferred[];
84
- }[];
85
- /**
86
- * Returns all fields for the action type, including review fields, or throws
87
- */
88
- export declare function getActiveActionFields(configuration: EventConfig, action: ActionType): FieldConfig[];
89
- export declare function getEventConfiguration(eventConfigurations: EventConfig[], type: string): EventConfig;
90
- export declare function stripHiddenFields(fields: FieldConfig[], data: EventState): import("lodash").Dictionary<string | number | boolean | {
42
+ };
43
+ export declare function getActionReviewFields(configuration: EventConfig, actionType: DeclarationActionType): import("./FieldConfig").Inferred[];
44
+ export declare function validateWorkqueueConfig(workqueueConfigs: WorkqueueConfig[]): void;
45
+ export declare function isPageVisible(page: PageConfig, formValues: ActionUpdate): boolean;
46
+ export declare const getVisiblePagesFormFields: (formConfig: FormConfig, formData: ActionUpdate) => import("./FieldConfig").Inferred[];
47
+ export declare function stripHiddenFields(fields: FieldConfig[], declaration: EventState): import("lodash").Dictionary<string | number | boolean | {
91
48
  type: string;
92
49
  filename: string;
93
50
  originalFilename: string;
94
51
  } | {
95
52
  country: string;
96
53
  district: string;
54
+ addressType: "DOMESTIC";
97
55
  province: string;
98
56
  urbanOrRural: "URBAN";
99
57
  number?: string | undefined;
@@ -104,12 +62,14 @@ export declare function stripHiddenFields(fields: FieldConfig[], data: EventStat
104
62
  } | {
105
63
  country: string;
106
64
  district: string;
65
+ addressType: "DOMESTIC";
107
66
  province: string;
108
67
  urbanOrRural: "RURAL";
109
68
  village?: string | undefined;
110
69
  } | {
111
70
  country: string;
112
71
  state: string;
72
+ addressType: "INTERNATIONAL";
113
73
  district2: string;
114
74
  cityOrTown?: string | undefined;
115
75
  addressLine1?: string | undefined;
@@ -121,21 +81,25 @@ export declare function stripHiddenFields(fields: FieldConfig[], data: EventStat
121
81
  option: string;
122
82
  filename: string;
123
83
  originalFilename: string;
124
- }[]>;
84
+ }[] | undefined>;
125
85
  export declare function findActiveDrafts(event: EventDocument, drafts: Draft[]): {
126
86
  id: string;
127
87
  createdAt: string;
128
88
  eventId: string;
129
89
  transactionId: string;
130
90
  action: {
131
- type: ActionType;
132
- data: Record<string, string | number | boolean | {
91
+ type: "DECLARE" | "REGISTER" | "VALIDATE" | "DELETE" | "CREATE" | "NOTIFY" | "DETECT_DUPLICATE" | "REJECT" | "MARKED_AS_DUPLICATE" | "ARCHIVE" | "PRINT_CERTIFICATE" | "REQUEST_CORRECTION" | "REJECT_CORRECTION" | "APPROVE_CORRECTION" | "READ" | "ASSIGN" | "UNASSIGN";
92
+ status: "Rejected" | "Requested" | "Accepted";
93
+ createdAt: string;
94
+ createdBy: string;
95
+ declaration: Record<string, string | number | boolean | {
133
96
  type: string;
134
97
  filename: string;
135
98
  originalFilename: string;
136
99
  } | {
137
100
  country: string;
138
101
  district: string;
102
+ addressType: "DOMESTIC";
139
103
  province: string;
140
104
  urbanOrRural: "URBAN";
141
105
  number?: string | null | undefined;
@@ -146,12 +110,14 @@ export declare function findActiveDrafts(event: EventDocument, drafts: Draft[]):
146
110
  } | {
147
111
  country: string;
148
112
  district: string;
113
+ addressType: "DOMESTIC";
149
114
  province: string;
150
115
  urbanOrRural: "RURAL";
151
116
  village?: string | null | undefined;
152
117
  } | {
153
118
  country: string;
154
119
  state: string;
120
+ addressType: "INTERNATIONAL";
155
121
  district2: string;
156
122
  cityOrTown?: string | null | undefined;
157
123
  addressLine1?: string | null | undefined;
@@ -163,17 +129,16 @@ export declare function findActiveDrafts(event: EventDocument, drafts: Draft[]):
163
129
  option: string;
164
130
  filename: string;
165
131
  originalFilename: string;
166
- }[]>;
167
- createdAt: string;
168
- createdBy: string;
132
+ }[] | undefined>;
169
133
  createdAtLocation: string;
170
- metadata?: Record<string, string | number | boolean | {
134
+ annotation?: Record<string, string | number | boolean | {
171
135
  type: string;
172
136
  filename: string;
173
137
  originalFilename: string;
174
138
  } | {
175
139
  country: string;
176
140
  district: string;
141
+ addressType: "DOMESTIC";
177
142
  province: string;
178
143
  urbanOrRural: "URBAN";
179
144
  number?: string | null | undefined;
@@ -184,12 +149,14 @@ export declare function findActiveDrafts(event: EventDocument, drafts: Draft[]):
184
149
  } | {
185
150
  country: string;
186
151
  district: string;
152
+ addressType: "DOMESTIC";
187
153
  province: string;
188
154
  urbanOrRural: "RURAL";
189
155
  village?: string | null | undefined;
190
156
  } | {
191
157
  country: string;
192
158
  state: string;
159
+ addressType: "INTERNATIONAL";
193
160
  district2: string;
194
161
  cityOrTown?: string | null | undefined;
195
162
  addressLine1?: string | null | undefined;
@@ -201,7 +168,8 @@ export declare function findActiveDrafts(event: EventDocument, drafts: Draft[]):
201
168
  option: string;
202
169
  filename: string;
203
170
  originalFilename: string;
204
- }[]> | undefined;
171
+ }[] | undefined> | undefined;
172
+ originalActionId?: string | undefined;
205
173
  };
206
174
  }[];
207
175
  export declare function createEmptyDraft(eventId: string, draftId: string, actionType: ActionType): {
@@ -211,11 +179,50 @@ export declare function createEmptyDraft(eventId: string, draftId: string, actio
211
179
  transactionId: import("../uuid").UUID;
212
180
  action: {
213
181
  type: ActionType;
214
- data: {};
215
- metadata: {};
182
+ declaration: {};
183
+ annotation: {};
216
184
  createdAt: string;
217
185
  createdBy: string;
218
186
  createdAtLocation: string;
219
187
  };
220
188
  };
189
+ export declare function isVerificationPage(page: PageConfig): page is VerificationPageConfig;
190
+ export declare function deepMerge(currentDocument: ActionUpdate, actionDocument: ActionUpdate): Record<string, string | number | boolean | {
191
+ type: string;
192
+ filename: string;
193
+ originalFilename: string;
194
+ } | {
195
+ country: string;
196
+ district: string;
197
+ addressType: "DOMESTIC";
198
+ province: string;
199
+ urbanOrRural: "URBAN";
200
+ number?: string | null | undefined;
201
+ town?: string | null | undefined;
202
+ residentialArea?: string | null | undefined;
203
+ street?: string | null | undefined;
204
+ zipCode?: string | null | undefined;
205
+ } | {
206
+ country: string;
207
+ district: string;
208
+ addressType: "DOMESTIC";
209
+ province: string;
210
+ urbanOrRural: "RURAL";
211
+ village?: string | null | undefined;
212
+ } | {
213
+ country: string;
214
+ state: string;
215
+ addressType: "INTERNATIONAL";
216
+ district2: string;
217
+ cityOrTown?: string | null | undefined;
218
+ addressLine1?: string | null | undefined;
219
+ addressLine2?: string | null | undefined;
220
+ addressLine3?: string | null | undefined;
221
+ postcodeOrZip?: string | null | undefined;
222
+ } | {
223
+ type: string;
224
+ option: string;
225
+ filename: string;
226
+ originalFilename: string;
227
+ }[] | undefined>;
221
228
  //# sourceMappingURL=utils.d.ts.map
@@ -23,8 +23,10 @@ __export(conditionals_exports, {
23
23
  alwaysTrue: () => alwaysTrue,
24
24
  and: () => and,
25
25
  defineConditional: () => defineConditional,
26
+ defineFormConditional: () => defineFormConditional,
26
27
  event: () => event,
27
28
  field: () => field,
29
+ never: () => never,
28
30
  not: () => not,
29
31
  or: () => or,
30
32
  user: () => user
@@ -35,6 +37,16 @@ module.exports = __toCommonJS(conditionals_exports);
35
37
  function defineConditional(schema) {
36
38
  return schema;
37
39
  }
40
+ function defineFormConditional(schema) {
41
+ const schemaWithForm = {
42
+ type: "object",
43
+ properties: {
44
+ $form: schema
45
+ },
46
+ required: ["$form"]
47
+ };
48
+ return defineConditional(schemaWithForm);
49
+ }
38
50
  function alwaysTrue() {
39
51
  return {};
40
52
  }
@@ -59,6 +71,9 @@ function not(condition) {
59
71
  required: []
60
72
  });
61
73
  }
74
+ function never() {
75
+ return not(alwaysTrue());
76
+ }
62
77
  var user = {
63
78
  hasScope: (scope) => defineConditional({
64
79
  type: "object",
@@ -106,69 +121,120 @@ var event = {
106
121
  required: ["$event"]
107
122
  })
108
123
  };
124
+ function getDateFromNow(days) {
125
+ return new Date(Date.now() - days * 24 * 60 * 60 * 1e3).toISOString().split("T")[0];
126
+ }
127
+ function getDateRangeToFieldReference(fieldId, comparedFieldId, clause) {
128
+ return {
129
+ type: "object",
130
+ properties: {
131
+ [fieldId]: {
132
+ type: "string",
133
+ format: "date",
134
+ [clause]: { $data: `1/${comparedFieldId}` }
135
+ },
136
+ [comparedFieldId]: { type: "string", format: "date" }
137
+ },
138
+ required: [fieldId]
139
+ };
140
+ }
141
+ function isFieldReference(value) {
142
+ return typeof value === "object" && value !== null && "_fieldId" in value;
143
+ }
109
144
  function field(fieldId) {
110
- const getDateFromNow = (days) => new Date(Date.now() - days * 24 * 60 * 60 * 1e3).toISOString().split("T")[0];
111
145
  const getDateRange = (date, clause) => ({
112
146
  type: "object",
113
147
  properties: {
114
- $form: {
115
- type: "object",
116
- properties: {
117
- [fieldId]: {
118
- type: "string",
119
- format: "date",
120
- [clause]: date
121
- }
122
- },
123
- required: [fieldId]
148
+ [fieldId]: {
149
+ type: "string",
150
+ format: "date",
151
+ [clause]: date
124
152
  }
125
153
  },
126
- required: ["$form"]
154
+ required: [fieldId]
127
155
  });
128
156
  return {
157
+ /**
158
+ * @private Internal property used for field reference tracking.
159
+ */
160
+ _fieldId: fieldId,
129
161
  isAfter: () => ({
130
162
  days: (days) => ({
131
- inPast: () => defineConditional(
163
+ inPast: () => defineFormConditional(
132
164
  getDateRange(getDateFromNow(days), "formatMinimum")
133
165
  ),
134
- inFuture: () => defineConditional(
166
+ inFuture: () => defineFormConditional(
135
167
  getDateRange(getDateFromNow(-days), "formatMinimum")
136
168
  )
137
169
  }),
138
- date: (date) => defineConditional(getDateRange(date, "formatMinimum")),
139
- now: () => defineConditional(getDateRange(getDateFromNow(0), "formatMinimum"))
170
+ date: (date) => {
171
+ if (isFieldReference(date)) {
172
+ const comparedFieldId = date._fieldId;
173
+ return defineFormConditional(
174
+ getDateRangeToFieldReference(
175
+ fieldId,
176
+ comparedFieldId,
177
+ "formatMinimum"
178
+ )
179
+ );
180
+ }
181
+ return defineFormConditional(getDateRange(date, "formatMinimum"));
182
+ },
183
+ now: () => defineFormConditional(getDateRange(getDateFromNow(0), "formatMinimum"))
140
184
  }),
141
185
  isBefore: () => ({
142
186
  days: (days) => ({
143
- inPast: () => defineConditional(
187
+ inPast: () => defineFormConditional(
144
188
  getDateRange(getDateFromNow(days), "formatMaximum")
145
189
  ),
146
- inFuture: () => defineConditional(
190
+ inFuture: () => defineFormConditional(
147
191
  getDateRange(getDateFromNow(-days), "formatMaximum")
148
192
  )
149
193
  }),
150
- date: (date) => defineConditional(getDateRange(date, "formatMaximum")),
151
- now: () => defineConditional(getDateRange(getDateFromNow(0), "formatMaximum"))
194
+ date: (date) => {
195
+ if (isFieldReference(date)) {
196
+ const comparedFieldId = date._fieldId;
197
+ return defineFormConditional(
198
+ getDateRangeToFieldReference(
199
+ fieldId,
200
+ comparedFieldId,
201
+ "formatMaximum"
202
+ )
203
+ );
204
+ }
205
+ return defineFormConditional(getDateRange(date, "formatMaximum"));
206
+ },
207
+ now: () => defineFormConditional(getDateRange(getDateFromNow(0), "formatMaximum"))
152
208
  }),
153
- isEqualTo: (value) => defineConditional({
154
- type: "object",
155
- properties: {
156
- $form: {
209
+ isEqualTo: (value) => {
210
+ if (isFieldReference(value)) {
211
+ const comparedFieldId = value._fieldId;
212
+ return defineFormConditional({
157
213
  type: "object",
158
214
  properties: {
159
215
  [fieldId]: {
160
- oneOf: [
161
- { type: "string", const: value },
162
- { type: "boolean", const: value }
163
- ],
164
- const: value
165
- }
216
+ type: ["string", "boolean"],
217
+ const: { $data: `1/${comparedFieldId}` }
218
+ },
219
+ [comparedFieldId]: { type: ["string", "boolean"] }
166
220
  },
167
- required: [fieldId]
168
- }
169
- },
170
- required: ["$form"]
171
- }),
221
+ required: [fieldId, comparedFieldId]
222
+ });
223
+ }
224
+ return defineFormConditional({
225
+ type: "object",
226
+ properties: {
227
+ [fieldId]: {
228
+ oneOf: [
229
+ { type: "string", const: value },
230
+ { type: "boolean", const: value }
231
+ ],
232
+ const: value
233
+ }
234
+ },
235
+ required: [fieldId]
236
+ });
237
+ },
172
238
  /**
173
239
  * Use case: Some fields are rendered when selection is not made, or boolean false is explicitly selected.
174
240
  * @example field('recommender.none').isFalsy() vs not(field('recommender.none').isEqualTo(true))
@@ -177,68 +243,87 @@ function field(fieldId) {
177
243
  * NOTE: For now, this only works with string, boolean, and null types. 0 is still allowed.
178
244
  *
179
245
  */
180
- isFalsy: () => defineConditional({
246
+ isFalsy: () => defineFormConditional({
181
247
  type: "object",
182
248
  properties: {
183
- $form: {
184
- type: "object",
185
- properties: {
186
- [fieldId]: {
187
- anyOf: [
188
- { const: "undefined" },
189
- { const: false },
190
- { const: null },
191
- { const: "" }
192
- ]
193
- }
194
- },
249
+ [fieldId]: {
195
250
  anyOf: [
196
- {
197
- required: [fieldId]
198
- },
199
- {
200
- not: {
201
- required: [fieldId]
202
- }
203
- }
251
+ { const: "undefined" },
252
+ { const: false },
253
+ { const: null },
254
+ { const: "" }
204
255
  ]
205
256
  }
206
257
  },
207
- required: ["$form"]
208
- }),
209
- isUndefined: () => defineConditional({
210
- type: "object",
211
- properties: {
212
- $form: {
213
- type: "object",
214
- properties: {
215
- [fieldId]: {
216
- type: "string",
217
- enum: ["undefined"]
218
- }
219
- },
258
+ anyOf: [
259
+ {
260
+ required: [fieldId]
261
+ },
262
+ {
220
263
  not: {
221
264
  required: [fieldId]
222
265
  }
223
266
  }
267
+ ]
268
+ }),
269
+ isUndefined: () => defineFormConditional({
270
+ type: "object",
271
+ properties: {
272
+ [fieldId]: {
273
+ type: "string",
274
+ enum: ["undefined"]
275
+ }
224
276
  },
225
- required: ["$form"]
277
+ not: {
278
+ required: [fieldId]
279
+ }
226
280
  }),
227
- inArray: (values) => defineConditional({
281
+ inArray: (values) => defineFormConditional({
228
282
  type: "object",
229
283
  properties: {
230
- $form: {
231
- type: "object",
232
- properties: {
233
- [fieldId]: {
234
- type: "string",
235
- enum: values
236
- }
237
- },
238
- required: [fieldId]
284
+ [fieldId]: {
285
+ type: "string",
286
+ enum: values
287
+ }
288
+ },
289
+ required: [fieldId]
290
+ }),
291
+ isValidEnglishName: () => defineFormConditional({
292
+ type: "object",
293
+ properties: {
294
+ [fieldId]: {
295
+ type: "string",
296
+ pattern: "^[\\p{Script=Latin}0-9'._-]*(\\([\\p{Script=Latin}0-9'._-]+\\))?[\\p{Script=Latin}0-9'._-]*( [\\p{Script=Latin}0-9'._-]*(\\([\\p{Script=Latin}0-9'._-]+\\))?[\\p{Script=Latin}0-9'._-]*)*$",
297
+ description: "Name must contain only letters, numbers, and allowed special characters ('._-). No double spaces."
298
+ }
299
+ },
300
+ required: [fieldId]
301
+ }),
302
+ /**
303
+ * Checks if the field value matches a given regular expression pattern.
304
+ * @param pattern - The regular expression pattern to match the field value against.
305
+ * @returns A JSONSchema conditional that validates the field value against the pattern.
306
+ */
307
+ matches: (pattern) => defineFormConditional({
308
+ type: "object",
309
+ properties: {
310
+ [fieldId]: {
311
+ type: "string",
312
+ pattern
313
+ }
314
+ },
315
+ required: [fieldId]
316
+ }),
317
+ isBetween: (min, max) => defineFormConditional({
318
+ type: "object",
319
+ properties: {
320
+ [fieldId]: {
321
+ type: "number",
322
+ minimum: min,
323
+ maximum: max
239
324
  }
240
325
  },
241
- required: ["$form"]
326
+ required: [fieldId]
242
327
  })
243
328
  };
244
329
  }