@opencrvs/toolkit 2.0.0-rc.ff04b30 → 2.0.0-rc.ff99998

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.
@@ -75,6 +75,7 @@ __export(events_exports, {
75
75
  CheckboxFieldValue: () => CheckboxFieldValue,
76
76
  Clause: () => Clause,
77
77
  ClientSpecificAction: () => ClientSpecificAction,
78
+ ComputedDefaultValue: () => ComputedDefaultValue,
78
79
  Conditional: () => Conditional,
79
80
  ConditionalType: () => ConditionalType,
80
81
  ConfirmableActions: () => ConfirmableActions,
@@ -200,6 +201,7 @@ __export(events_exports, {
200
201
  SelectDateRangeValue: () => SelectDateRangeValue,
201
202
  SelectOption: () => SelectOption,
202
203
  ShowConditional: () => ShowConditional,
204
+ SignatureFieldValue: () => SignatureFieldValue,
203
205
  StaticDataEntry: () => StaticDataEntry,
204
206
  StreetLevelDetailsUpdateValue: () => StreetLevelDetailsUpdateValue,
205
207
  SummaryConfig: () => SummaryConfig,
@@ -213,6 +215,10 @@ __export(events_exports, {
213
215
  UUID: () => UUID,
214
216
  UnassignActionInput: () => UnassignActionInput,
215
217
  UserAuditRecordInput: () => UserAuditRecordInput,
218
+ V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS: () => V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS,
219
+ V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS_MAP: () => V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS_MAP,
220
+ V2_DEFAULT_MOCK_LOCATIONS: () => V2_DEFAULT_MOCK_LOCATIONS,
221
+ V2_DEFAULT_MOCK_LOCATIONS_MAP: () => V2_DEFAULT_MOCK_LOCATIONS_MAP,
216
222
  ValidationConfig: () => ValidationConfig,
217
223
  VerificationActionConfig: () => VerificationActionConfig,
218
224
  VerificationPageConfig: () => VerificationPageConfig,
@@ -234,6 +240,7 @@ __export(events_exports, {
234
240
  ageToDate: () => ageToDate,
235
241
  aggregateActionAnnotations: () => aggregateActionAnnotations,
236
242
  aggregateActionDeclarations: () => aggregateActionDeclarations,
243
+ always: () => always,
237
244
  alwaysTrue: () => alwaysTrue,
238
245
  and: () => and,
239
246
  annotationActions: () => annotationActions,
@@ -241,10 +248,12 @@ __export(events_exports, {
241
248
  applyDraftToEventIndex: () => applyDraftToEventIndex,
242
249
  areCertificateConditionsMet: () => areCertificateConditionsMet,
243
250
  areConditionsMet: () => areConditionsMet,
251
+ buildClientFunctionContext: () => buildClientFunctionContext,
244
252
  buildFormState: () => buildFormState,
245
253
  canAccessEventWithScope: () => canAccessEventWithScope,
246
254
  canAccessOtherUserWithScopes: () => canAccessOtherUserWithScopes,
247
255
  canAccessUserWithScope: () => canAccessUserWithScope,
256
+ compileClientFunction: () => compileClientFunction,
248
257
  compositeFieldTypes: () => compositeFieldTypes,
249
258
  createEmptyDraft: () => createEmptyDraft,
250
259
  createFieldConditionals: () => createFieldConditionals,
@@ -265,6 +274,7 @@ __export(events_exports, {
265
274
  defineWorkqueuesColumns: () => defineWorkqueuesColumns,
266
275
  deserializeQuery: () => deserializeQuery,
267
276
  errorMessages: () => errorMessages,
277
+ evaluate: () => evaluate,
268
278
  event: () => event,
269
279
  eventMetadataLabelMap: () => eventMetadataLabelMap,
270
280
  eventPayloadGenerator: () => eventPayloadGenerator,
@@ -277,6 +287,7 @@ __export(events_exports, {
277
287
  findActiveDraftForEvent: () => findActiveDraftForEvent,
278
288
  findAllFields: () => findAllFields,
279
289
  findLastAssignmentAction: () => findLastAssignmentAction,
290
+ findPendingCorrectionAction: () => findPendingCorrectionAction,
280
291
  findRecordActionPages: () => findRecordActionPages,
281
292
  flag: () => flag,
282
293
  flattenFieldReference: () => flattenFieldReference,
@@ -310,6 +321,7 @@ __export(events_exports, {
310
321
  getAvailableActionsForEvent: () => getAvailableActionsForEvent,
311
322
  getAvailableRolesForUserUpdatePayload: () => getAvailableRolesForUserUpdatePayload,
312
323
  getCompleteActionAnnotation: () => getCompleteActionAnnotation,
324
+ getCompleteActionContent: () => getCompleteActionContent,
313
325
  getCompleteActionDeclaration: () => getCompleteActionDeclaration,
314
326
  getCurrentEventState: () => getCurrentEventState,
315
327
  getCustomActionFields: () => getCustomActionFields,
@@ -318,6 +330,7 @@ __export(events_exports, {
318
330
  getDeclarationFields: () => getDeclarationFields,
319
331
  getDeclarationPages: () => getDeclarationPages,
320
332
  getEventConfigById: () => getEventConfigById,
333
+ getEventFlags: () => getEventFlags,
321
334
  getFilePathsFromEvent: () => getFilePathsFromEvent,
322
335
  getLocationHierarchy: () => getLocationHierarchy,
323
336
  getMixedPath: () => getMixedPath,
@@ -340,6 +353,7 @@ __export(events_exports, {
340
353
  isBulletListFieldType: () => isBulletListFieldType,
341
354
  isButtonFieldType: () => isButtonFieldType,
342
355
  isCheckboxFieldType: () => isCheckboxFieldType,
356
+ isCodeToEvaluate: () => isCodeToEvaluate,
343
357
  isConditionMet: () => isConditionMet,
344
358
  isCountryFieldType: () => isCountryFieldType,
345
359
  isCustomFieldType: () => isCustomFieldType,
@@ -380,6 +394,7 @@ __export(events_exports, {
380
394
  isPageVisible: () => isPageVisible,
381
395
  isParagraphFieldType: () => isParagraphFieldType,
382
396
  isPhoneFieldType: () => isPhoneFieldType,
397
+ isPotentialDuplicate: () => isPotentialDuplicate,
383
398
  isPrintButtonFieldType: () => isPrintButtonFieldType,
384
399
  isQrReaderFieldType: () => isQrReaderFieldType,
385
400
  isQueryParamReaderFieldType: () => isQueryParamReaderFieldType,
@@ -413,12 +428,15 @@ __export(events_exports, {
413
428
  plainDateToLocalDate: () => plainDateToLocalDate,
414
429
  precompileActionSchemas: () => precompileActionSchemas,
415
430
  resolveDateOfEvent: () => resolveDateOfEvent,
431
+ resolveEventCustomFlags: () => resolveEventCustomFlags,
416
432
  resolvePlaceOfEvent: () => resolvePlaceOfEvent,
433
+ runClientFunction: () => runClientFunction,
417
434
  runFieldValidations: () => runFieldValidations,
418
435
  runStructuralValidations: () => runStructuralValidations,
419
436
  safeUnion: () => safeUnion,
420
437
  status: () => status,
421
438
  timePeriodToDateRange: () => timePeriodToDateRange,
439
+ todayISO: () => todayISO,
422
440
  user: () => user,
423
441
  userCanAccessEventWithScopes: () => userCanAccessEventWithScopes,
424
442
  validate: () => validate,
@@ -693,14 +711,20 @@ var unflattenScope = (input) => {
693
711
  return { type, options };
694
712
  };
695
713
  var EncodedScope = z2.string().brand("EncodedScope");
696
- var decodeScope = (query) => {
697
- const scope = qs.parse(query, {
714
+ var decodedScopeCache = /* @__PURE__ */ new Map();
715
+ var decodeScope = (encodedScope) => {
716
+ if (decodedScopeCache.has(encodedScope)) {
717
+ return decodedScopeCache.get(encodedScope);
718
+ }
719
+ const scope = qs.parse(encodedScope, {
698
720
  ignoreQueryPrefix: true,
699
721
  comma: true,
700
722
  allowDots: true
701
723
  });
702
724
  const unflattenedScope = unflattenScope(scope);
703
- return Scope.safeParse(unflattenedScope)?.data;
725
+ const result = Scope.safeParse(unflattenedScope)?.data;
726
+ decodedScopeCache.set(encodedScope, result);
727
+ return result;
704
728
  };
705
729
  var DEFAULT_SCOPE_OPTIONS = {
706
730
  placeOfEvent: JurisdictionFilter.enum.all,
@@ -1080,8 +1104,8 @@ var ActionConditional = z7.discriminatedUnion("type", [
1080
1104
  // Action can be shown to the user in the list but as disabled
1081
1105
  EnableConditional
1082
1106
  ]).meta({
1083
- description: "Action conditional configuration",
1084
- id: "ActionConditional"
1107
+ id: "ActionConditional",
1108
+ description: "Conditional gating whether an action is shown (SHOW) or enabled (ENABLE). When omitted from an action, the action is shown and enabled for everyone."
1085
1109
  });
1086
1110
  var DisplayOnReviewConditional = z7.object({
1087
1111
  type: z7.literal(ConditionalType.DISPLAY_ON_REVIEW),
@@ -1097,8 +1121,8 @@ var FieldConditional = z7.discriminatedUnion("type", [
1097
1121
  // Field output can be shown / hidden on the review page
1098
1122
  DisplayOnReviewConditional
1099
1123
  ]).meta({
1100
- description: "Field conditional configuration",
1101
- id: "FieldConditional"
1124
+ id: "FieldConditional",
1125
+ description: "Conditional gating whether a form field is shown (SHOW), enabled (ENABLE), or displayed on the review page (DISPLAY_ON_REVIEW). When omitted, the field is shown and enabled for everyone, and is displayed on review whenever it has a value."
1102
1126
  });
1103
1127
 
1104
1128
  // ../commons/src/events/FieldType.ts
@@ -1350,6 +1374,7 @@ var DateRangeFieldValue = z12.object({
1350
1374
  var EmailValue = z12.email();
1351
1375
  var CheckboxFieldValue = z12.boolean();
1352
1376
  var NumberFieldValue = z12.number();
1377
+ var SignatureFieldValue = FileFieldValue;
1353
1378
  var ButtonFieldValue = z12.number();
1354
1379
  var VerificationStatusValue = z12.enum([
1355
1380
  "verified",
@@ -1648,8 +1673,9 @@ var RequestedCorrectionAction = ActionBase.extend(
1648
1673
  var ApprovedCorrectionAction = ActionBase.extend(
1649
1674
  z14.object({
1650
1675
  type: z14.literal(ActionType.APPROVE_CORRECTION),
1651
- requestId: z14.string()
1676
+ requestId: z14.string(),
1652
1677
  // TODO move into 'content' property
1678
+ content: z14.object({ immediateCorrection: z14.boolean().optional() }).optional()
1653
1679
  }).shape
1654
1680
  );
1655
1681
  var RejectedCorrectionAction = ActionBase.extend(
@@ -1742,8 +1768,8 @@ var FlagConfig = z15.object({
1742
1768
  ),
1743
1769
  label: TranslationConfig.describe("Human readable label of the flag.")
1744
1770
  }).meta({
1745
- description: "Flag configuration",
1746
- id: "FlagConfig"
1771
+ id: "FlagConfig",
1772
+ description: "Configuration for a custom flag that can be added to or removed from records by event actions."
1747
1773
  });
1748
1774
  var ActionFlagConfig = z15.object({
1749
1775
  id: Flag,
@@ -1752,8 +1778,8 @@ var ActionFlagConfig = z15.object({
1752
1778
  "When conditional is met, the operation is performed on the flag. If not provided, the operation is performed unconditionally."
1753
1779
  )
1754
1780
  }).meta({
1755
- description: "Action flag configuration",
1756
- id: "ActionFlagConfig"
1781
+ id: "ActionFlagConfig",
1782
+ description: "Add or remove operation applied to a flag when the parent action is accepted. Optionally gated by a conditional."
1757
1783
  });
1758
1784
 
1759
1785
  // ../commons/src/events/EventMetadata.ts
@@ -2180,11 +2206,31 @@ var FieldReference = import_v43.default.object({
2180
2206
  $$field: FieldId.describe("Id of the field to reference"),
2181
2207
  $$subfield: import_v43.default.array(import_v43.default.string()).optional().default([]).describe(
2182
2208
  'If the FieldValue is an object, subfield can be used to refer to e.g. `["foo", "bar"]` in `{ foo: { bar: 3 } }`'
2209
+ ),
2210
+ $$code: import_v43.default.string().optional().describe(
2211
+ "Serialised client-side function body. When present the expression is evaluated rather than dereferenced."
2183
2212
  )
2184
- }).describe("Reference to a field by its ID");
2213
+ }).describe(
2214
+ "Reference to a field value, with an optional client-side computation applied."
2215
+ );
2216
+ function isCodeToEvaluate(v) {
2217
+ return !!v && typeof v === "object" && "$$code" in v;
2218
+ }
2219
+ var ComputedDefaultValue = import_v43.default.object({
2220
+ $$code: import_v43.default.string().describe(
2221
+ "Serialised client-side function body. Receives (undefined, context) where context includes $now, $online, and system variables."
2222
+ )
2223
+ }).describe("A context-only computation used as a field default value.");
2185
2224
  var ValidationConfig = import_v43.default.object({
2186
- validator: Conditional,
2187
- message: TranslationConfig
2225
+ validator: Conditional.describe(
2226
+ "Conditional expression that must hold for the field value to be considered valid."
2227
+ ),
2228
+ message: TranslationConfig.describe(
2229
+ "Error message displayed when the validator does not hold."
2230
+ )
2231
+ }).meta({
2232
+ id: "ValidationConfig",
2233
+ description: "Validation rule applied to a form field. The validator is a conditional expression that must hold for the field value to be considered valid."
2188
2234
  });
2189
2235
  var requiredSchema = import_v43.default.union([
2190
2236
  import_v43.default.boolean(),
@@ -2215,7 +2261,7 @@ var BaseField = import_v43.default.object({
2215
2261
  "Indicates whether the field can be modified during record correction."
2216
2262
  ),
2217
2263
  value: FieldReference.or(import_v43.default.array(FieldReference)).optional().describe(
2218
- "Reference to the source field or fields. When a value is defined, it is copied from the parent field when changed. If multiple references are provided, the first truthy value is used."
2264
+ "Reference to the source field or fields. When a value is defined, it is copied from the parent field when changed. If multiple references are provided, the first truthy value is used. A FieldReference with $$code computes the value via a custom client-side function."
2219
2265
  ),
2220
2266
  analytics: import_v43.default.boolean().default(false).optional().describe(
2221
2267
  "Indicates whether the field is included in analytics. When enabled, its value becomes available in the analytics dashboard."
@@ -2223,30 +2269,39 @@ var BaseField = import_v43.default.object({
2223
2269
  }).describe("Common properties shared across all field types.");
2224
2270
  var Divider = BaseField.extend({
2225
2271
  type: import_v43.default.literal(FieldType.DIVIDER)
2272
+ }).meta({
2273
+ description: "A horizontal line divider",
2274
+ id: "Divider"
2226
2275
  });
2227
2276
  var TextField = BaseField.extend({
2228
2277
  type: import_v43.default.literal(FieldType.TEXT),
2229
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
2278
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
2230
2279
  configuration: import_v43.default.object({
2231
2280
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
2232
2281
  type: import_v43.default.enum(["text", "password"]).optional(),
2233
2282
  prefix: TranslationConfig.optional(),
2234
2283
  postfix: TranslationConfig.optional()
2235
2284
  }).default({ type: "text" }).optional()
2236
- }).describe("Text input");
2285
+ }).meta({
2286
+ description: "A text input field",
2287
+ id: "TextField"
2288
+ });
2237
2289
  var NumberField = BaseField.extend({
2238
2290
  type: import_v43.default.literal(FieldType.NUMBER),
2239
- defaultValue: NumberFieldValue.optional(),
2291
+ defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
2240
2292
  configuration: import_v43.default.object({
2241
2293
  min: import_v43.default.number().optional().describe("Minimum value"),
2242
2294
  max: import_v43.default.number().optional().describe("Maximum value"),
2243
2295
  prefix: TranslationConfig.optional(),
2244
2296
  postfix: TranslationConfig.optional()
2245
2297
  }).optional()
2246
- }).describe("Number input");
2298
+ }).meta({
2299
+ description: "A number input field",
2300
+ id: "NumberField"
2301
+ });
2247
2302
  var TextAreaField = BaseField.extend({
2248
2303
  type: import_v43.default.literal(FieldType.TEXTAREA),
2249
- defaultValue: NonEmptyTextValue.optional(),
2304
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2250
2305
  configuration: import_v43.default.object({
2251
2306
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
2252
2307
  rows: import_v43.default.number().optional().describe("Number of visible text lines"),
@@ -2254,7 +2309,10 @@ var TextAreaField = BaseField.extend({
2254
2309
  prefix: TranslationConfig.optional(),
2255
2310
  postfix: TranslationConfig.optional()
2256
2311
  }).default({ rows: 4 }).optional()
2257
- }).describe("Multiline text input");
2312
+ }).meta({
2313
+ description: "A multiline text input",
2314
+ id: "TextAreaField"
2315
+ });
2258
2316
  var ImageMimeType = import_v43.default.enum([
2259
2317
  "image/png",
2260
2318
  "image/jpg",
@@ -2277,58 +2335,76 @@ var SignatureField = BaseField.extend({
2277
2335
  signaturePromptLabel: TranslationConfig.describe(
2278
2336
  "Title of the signature modal"
2279
2337
  ),
2280
- defaultValue: FieldValue.optional(),
2338
+ defaultValue: SignatureFieldValue.or(ComputedDefaultValue).optional(),
2281
2339
  configuration: import_v43.default.object({
2282
2340
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
2283
2341
  acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature")
2284
2342
  }).default({
2285
2343
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
2286
2344
  })
2287
- }).describe("Signature input field");
2345
+ }).meta({
2346
+ description: "A signature input field",
2347
+ id: "SignatureField"
2348
+ });
2288
2349
  var EmailField = BaseField.extend({
2289
2350
  type: import_v43.default.literal(FieldType.EMAIL),
2290
2351
  configuration: import_v43.default.object({
2291
2352
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text")
2292
2353
  }).default({ maxLength: 255 }).optional(),
2293
- defaultValue: NonEmptyTextValue.optional()
2354
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional()
2355
+ }).meta({
2356
+ description: "An email input field",
2357
+ id: "EmailField"
2294
2358
  });
2295
2359
  var DateField = BaseField.extend({
2296
2360
  type: import_v43.default.literal(FieldType.DATE),
2297
- defaultValue: SerializedNowDateTime.or(PlainDate).optional().describe("Default date value(yyyy-MM-dd)"),
2361
+ defaultValue: SerializedNowDateTime.or(PlainDate).or(ComputedDefaultValue).optional().describe("Default date value(yyyy-MM-dd)"),
2298
2362
  configuration: import_v43.default.object({
2299
2363
  notice: TranslationConfig.describe(
2300
2364
  "Text to display above the date input"
2301
2365
  ).optional()
2302
2366
  }).optional()
2303
- }).describe("A single date input (yyyy-MM-dd)");
2367
+ }).meta({
2368
+ description: "A date input (yyyy-MM-dd)",
2369
+ id: "DateField"
2370
+ });
2304
2371
  var AgeField = BaseField.extend({
2305
2372
  type: import_v43.default.literal(FieldType.AGE),
2306
- defaultValue: NumberFieldValue.optional(),
2373
+ defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
2307
2374
  configuration: import_v43.default.object({
2308
2375
  asOfDate: FieldReference,
2309
2376
  prefix: TranslationConfig.optional(),
2310
2377
  postfix: TranslationConfig.optional()
2311
2378
  })
2312
- }).describe("An age input field which uses the current date as the asOfDate");
2379
+ }).meta({
2380
+ description: "An age input field which uses the current date as the asOfDate",
2381
+ id: "AgeField"
2382
+ });
2313
2383
  var TimeField = BaseField.extend({
2314
2384
  type: import_v43.default.literal(FieldType.TIME),
2315
- defaultValue: SerializedNowDateTime.or(TimeValue).optional().describe("Default time value (HH-mm)"),
2385
+ defaultValue: SerializedNowDateTime.or(TimeValue).or(ComputedDefaultValue).optional().describe("Default time value (HH-mm)"),
2316
2386
  configuration: import_v43.default.object({
2317
2387
  use12HourFormat: import_v43.default.boolean().optional().describe("Whether to use 12-hour format"),
2318
2388
  notice: TranslationConfig.describe(
2319
2389
  "Text to display above the time input"
2320
2390
  ).optional()
2321
2391
  }).optional()
2322
- }).describe("A single date input (HH-mm)");
2392
+ }).meta({
2393
+ description: "A single time input (HH-mm)",
2394
+ id: "TimeField"
2395
+ });
2323
2396
  var DateRangeField = BaseField.extend({
2324
2397
  type: import_v43.default.literal(FieldType.DATE_RANGE),
2325
- defaultValue: DateRangeFieldValue.optional(),
2398
+ defaultValue: DateRangeFieldValue.or(ComputedDefaultValue).optional(),
2326
2399
  configuration: import_v43.default.object({
2327
2400
  notice: TranslationConfig.describe(
2328
2401
  "Text to display above the date input"
2329
2402
  ).optional()
2330
2403
  }).optional()
2331
- }).describe("A date range input ({ start: yyyy-MM-dd, end: yyyy-MM-dd })");
2404
+ }).meta({
2405
+ description: "A date range input ({ start: yyyy-MM-dd, end: yyyy-MM-dd })",
2406
+ id: "DateRangeField"
2407
+ });
2332
2408
  var HtmlFontVariant = import_v43.default.enum([
2333
2409
  "reg12",
2334
2410
  "reg14",
@@ -2372,21 +2448,33 @@ var ImageViewField = BaseField.extend({
2372
2448
  type: import_v43.default.literal(FieldType.IMAGE_VIEW),
2373
2449
  defaultValue: NonEmptyTextValue.optional(),
2374
2450
  configuration: ImageConfiguration
2375
- }).describe("A read-only image component for form pages");
2451
+ }).meta({
2452
+ description: "A read-only image component for form pages",
2453
+ id: "ImageViewField"
2454
+ });
2376
2455
  var Paragraph = BaseField.extend({
2377
2456
  type: import_v43.default.literal(FieldType.PARAGRAPH),
2378
2457
  configuration: ParagraphConfiguration
2379
- }).describe("A read-only HTML <p> paragraph");
2458
+ }).meta({
2459
+ description: "A read-only HTML <p> paragraph",
2460
+ id: "Paragraph"
2461
+ });
2380
2462
  var Heading = BaseField.extend({
2381
2463
  type: import_v43.default.literal(FieldType.HEADING),
2382
2464
  configuration: HeadingConfiguration
2383
- }).describe("A read-only heading component for form pages");
2465
+ }).meta({
2466
+ description: "A read-only heading component for form pages",
2467
+ id: "Heading"
2468
+ });
2384
2469
  var PageHeader = BaseField.extend({
2385
2470
  type: import_v43.default.literal(FieldType.PAGE_HEADER)
2386
- }).describe("A read-only header component for form pages");
2471
+ }).meta({
2472
+ description: "A read-only header component for form pages",
2473
+ id: "PageHeader"
2474
+ });
2387
2475
  var File = BaseField.extend({
2388
2476
  type: import_v43.default.literal(FieldType.FILE),
2389
- defaultValue: FileFieldValue.optional(),
2477
+ defaultValue: FileFieldValue.or(ComputedDefaultValue).optional(),
2390
2478
  configuration: import_v43.default.object({
2391
2479
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
2392
2480
  acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature"),
@@ -2402,7 +2490,10 @@ var File = BaseField.extend({
2402
2490
  }).default({
2403
2491
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
2404
2492
  })
2405
- }).describe("File upload");
2493
+ }).meta({
2494
+ description: "A file upload field",
2495
+ id: "File"
2496
+ });
2406
2497
  var SelectOption = import_v43.default.object({
2407
2498
  value: import_v43.default.string().describe("The value of the option"),
2408
2499
  label: import_v43.default.union([import_v43.default.string(), TranslationConfig]).describe("The label of the option"),
@@ -2410,7 +2501,7 @@ var SelectOption = import_v43.default.object({
2410
2501
  });
2411
2502
  var NumberWithUnitField = BaseField.extend({
2412
2503
  type: import_v43.default.literal(FieldType.NUMBER_WITH_UNIT),
2413
- defaultValue: NumberWithUnitFieldValue.optional(),
2504
+ defaultValue: NumberWithUnitFieldValue.or(ComputedDefaultValue).optional(),
2414
2505
  options: import_v43.default.array(SelectOption).describe("A list of options for the unit select"),
2415
2506
  configuration: import_v43.default.object({
2416
2507
  min: import_v43.default.number().optional().describe("Minimum value of the number field"),
@@ -2419,17 +2510,23 @@ var NumberWithUnitField = BaseField.extend({
2419
2510
  "Placeholder for the number field"
2420
2511
  )
2421
2512
  }).optional()
2422
- }).describe("Number with unit input");
2513
+ }).meta({
2514
+ description: "A number with unit input field",
2515
+ id: "NumberWithUnitField"
2516
+ });
2423
2517
  var RadioGroup = BaseField.extend({
2424
2518
  type: import_v43.default.literal(FieldType.RADIO_GROUP),
2425
- defaultValue: TextValue.optional(),
2519
+ defaultValue: TextValue.or(ComputedDefaultValue).optional(),
2426
2520
  options: import_v43.default.array(SelectOption).describe("A list of options"),
2427
2521
  configuration: import_v43.default.object({
2428
2522
  styles: import_v43.default.object({
2429
2523
  size: import_v43.default.enum(["NORMAL", "LARGE"]).optional()
2430
2524
  }).optional()
2431
2525
  }).optional()
2432
- }).describe("Grouped radio options");
2526
+ }).meta({
2527
+ description: "A grouped radio button field",
2528
+ id: "RadioGroup"
2529
+ });
2433
2530
  var BulletList = BaseField.extend({
2434
2531
  type: import_v43.default.literal(FieldType.BULLET_LIST),
2435
2532
  items: import_v43.default.array(TranslationConfig).describe("A list of items"),
@@ -2438,10 +2535,13 @@ var BulletList = BaseField.extend({
2438
2535
  fontVariant: HtmlFontVariant.optional()
2439
2536
  }).optional()
2440
2537
  }).default({})
2441
- }).describe("A list of bullet points");
2538
+ }).meta({
2539
+ description: "A list of bullet points",
2540
+ id: "BulletList"
2541
+ });
2442
2542
  var Select = BaseField.extend({
2443
2543
  type: import_v43.default.literal(FieldType.SELECT),
2444
- defaultValue: TextValue.optional(),
2544
+ defaultValue: TextValue.or(ComputedDefaultValue).optional(),
2445
2545
  options: import_v43.default.array(SelectOption).describe("A list of options"),
2446
2546
  noOptionsMessage: TranslationConfig.optional().describe(
2447
2547
  `
@@ -2453,16 +2553,22 @@ var Select = BaseField.extend({
2453
2553
  { ..., defaultMessage: "'{input}' is not listed among the health facilities." }
2454
2554
  `
2455
2555
  )
2456
- }).describe("Select input");
2556
+ }).meta({
2557
+ description: "A select input field",
2558
+ id: "Select"
2559
+ });
2457
2560
  var SelectDateRangeOption = import_v43.default.object({
2458
2561
  value: SelectDateRangeValue.describe("The value of the option"),
2459
2562
  label: TranslationConfig.describe("The label of the option")
2460
2563
  });
2461
2564
  var SelectDateRangeField = BaseField.extend({
2462
2565
  type: import_v43.default.literal(FieldType.SELECT_DATE_RANGE),
2463
- defaultValue: SelectDateRangeValue.optional(),
2566
+ defaultValue: SelectDateRangeValue.or(ComputedDefaultValue).optional(),
2464
2567
  options: import_v43.default.array(SelectDateRangeOption).describe("A list of options")
2465
- }).describe("Select input with date range options");
2568
+ }).meta({
2569
+ description: "A date range selection field",
2570
+ id: "SelectDateRangeField"
2571
+ });
2466
2572
  var NameConfig = import_v43.default.object({
2467
2573
  firstname: import_v43.default.object({ required: requiredSchema, label: TranslationConfig.optional() }).optional(),
2468
2574
  middlename: import_v43.default.object({ required: requiredSchema, label: TranslationConfig.optional() }).optional(),
@@ -2474,7 +2580,7 @@ var NameField = BaseField.extend({
2474
2580
  firstname: SerializedUserField.or(NonEmptyTextValue).optional(),
2475
2581
  middlename: SerializedUserField.or(NonEmptyTextValue).optional(),
2476
2582
  surname: SerializedUserField.or(NonEmptyTextValue).optional()
2477
- }).optional(),
2583
+ }).or(ComputedDefaultValue).optional(),
2478
2584
  configuration: import_v43.default.object({
2479
2585
  name: NameConfig.default({
2480
2586
  firstname: { required: true },
@@ -2493,26 +2599,41 @@ var NameField = BaseField.extend({
2493
2599
  surname: { required: true }
2494
2600
  }
2495
2601
  }).optional()
2496
- }).describe("Name input field");
2602
+ }).meta({
2603
+ description: "A field for entering a persons name",
2604
+ id: "NameField"
2605
+ });
2497
2606
  var PhoneField = BaseField.extend({
2498
- defaultValue: NonEmptyTextValue.optional(),
2607
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2499
2608
  type: import_v43.default.literal(FieldType.PHONE)
2500
- }).describe("Phone input field");
2609
+ }).meta({
2610
+ description: "A field for entering a phone number",
2611
+ id: "PhoneField"
2612
+ });
2501
2613
  var IdField = BaseField.extend({
2502
- defaultValue: NonEmptyTextValue.optional(),
2614
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2503
2615
  type: import_v43.default.literal(FieldType.ID)
2504
- }).describe("ID input field");
2616
+ }).meta({
2617
+ description: "A field for entering an ID",
2618
+ id: "IdField"
2619
+ });
2505
2620
  var Checkbox = BaseField.extend({
2506
2621
  type: import_v43.default.literal(FieldType.CHECKBOX),
2507
- defaultValue: CheckboxFieldValue.default(false)
2508
- }).describe("Boolean checkbox field");
2622
+ defaultValue: CheckboxFieldValue.or(ComputedDefaultValue).default(false)
2623
+ }).meta({
2624
+ description: "A boolean checkbox field",
2625
+ id: "Checkbox"
2626
+ });
2509
2627
  var Country = BaseField.extend({
2510
2628
  type: import_v43.default.literal(FieldType.COUNTRY),
2511
- defaultValue: NonEmptyTextValue.optional(),
2629
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2512
2630
  optionOverrides: import_v43.default.array(SelectOption.omit({ label: true })).optional().describe(
2513
2631
  "Conditionals for specific countries. Countries not listed are always shown and enabled."
2514
2632
  )
2515
- }).describe("Country select field");
2633
+ }).meta({
2634
+ description: "A field for selecting a country",
2635
+ id: "Country"
2636
+ });
2516
2637
  var AllowedLocations = JurisdictionReference.optional().describe(
2517
2638
  "Limits which location options are selectable depending on user jurisdiction and location."
2518
2639
  );
@@ -2521,28 +2642,33 @@ var AdministrativeAreas = import_v43.default.enum([
2521
2642
  "HEALTH_FACILITY",
2522
2643
  "CRVS_OFFICE"
2523
2644
  ]);
2524
- var AdministrativeAreaConfiguration = import_v43.default.object({
2525
- partOf: FieldReference.optional().describe("Parent location"),
2526
- type: AdministrativeAreas,
2527
- allowedLocations: AllowedLocations
2528
- }).describe("Administrative area options");
2529
2645
  var AdministrativeAreaField = BaseField.extend({
2530
2646
  type: import_v43.default.literal(FieldType.ADMINISTRATIVE_AREA),
2531
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
2532
- configuration: AdministrativeAreaConfiguration
2533
- }).describe("Administrative area input field e.g. facility, office");
2647
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
2648
+ configuration: import_v43.default.object({
2649
+ partOf: FieldReference.optional().describe("Parent location"),
2650
+ type: AdministrativeAreas,
2651
+ allowedLocations: AllowedLocations
2652
+ }).describe("Administrative area options")
2653
+ }).meta({
2654
+ description: "Administrative area input field",
2655
+ id: "AdministrativeAreaField"
2656
+ });
2534
2657
  var LocationInput = BaseField.extend({
2535
2658
  type: import_v43.default.literal(FieldType.LOCATION),
2536
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
2659
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
2537
2660
  configuration: import_v43.default.object({
2538
2661
  locationTypes: import_v43.default.array(import_v43.default.string()).optional().describe("Types of the locations that are available for selection."),
2539
2662
  allowedLocations: AllowedLocations
2540
2663
  }).optional()
2541
- }).describe("Input field for a location");
2664
+ }).meta({
2665
+ description: "A field for selecting a location",
2666
+ id: "LocationInput"
2667
+ });
2542
2668
  var FileUploadWithOptions = BaseField.extend({
2543
2669
  type: import_v43.default.literal(FieldType.FILE_WITH_OPTIONS),
2544
2670
  options: import_v43.default.array(SelectOption).describe("A list of options"),
2545
- defaultValue: FileFieldWithOptionValue.optional(),
2671
+ defaultValue: FileFieldWithOptionValue.or(ComputedDefaultValue).optional(),
2546
2672
  configuration: import_v43.default.object({
2547
2673
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
2548
2674
  maxImageSize: import_v43.default.object({
@@ -2552,15 +2678,18 @@ var FileUploadWithOptions = BaseField.extend({
2552
2678
  }).default({
2553
2679
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
2554
2680
  })
2681
+ }).meta({
2682
+ description: "A field for uploading files with file type options",
2683
+ id: "FileUploadWithOptions"
2555
2684
  });
2556
2685
  var Facility = BaseField.extend({
2557
2686
  type: import_v43.default.literal(FieldType.FACILITY),
2558
- defaultValue: NonEmptyTextValue.optional(),
2687
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2559
2688
  configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
2560
2689
  }).describe("Input field for a facility");
2561
2690
  var Office = BaseField.extend({
2562
2691
  type: import_v43.default.literal(FieldType.OFFICE),
2563
- defaultValue: NonEmptyTextValue.optional(),
2692
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2564
2693
  configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
2565
2694
  }).describe("Input field for an office");
2566
2695
  var DefaultAddressFieldValue = DomesticAddressFieldValue.extend({
@@ -2596,8 +2725,11 @@ var Address = BaseField.extend({
2596
2725
  ).optional(),
2597
2726
  allowedLocations: AllowedLocations
2598
2727
  }).optional(),
2599
- defaultValue: DefaultAddressFieldValue.optional()
2600
- }).describe("Address input field \u2013 a combination of location and text fields");
2728
+ defaultValue: DefaultAddressFieldValue.or(ComputedDefaultValue).optional()
2729
+ }).meta({
2730
+ description: "Address input field \u2013 a combination of location and text fields",
2731
+ id: "Address"
2732
+ });
2601
2733
  var StaticDataEntry = import_v43.default.object({
2602
2734
  id: import_v43.default.string().describe("ID for the data entry."),
2603
2735
  label: TranslationConfig,
@@ -2612,7 +2744,10 @@ var DataField = BaseField.extend({
2612
2744
  subtitle: TranslationConfig.optional(),
2613
2745
  data: import_v43.default.array(DataEntry)
2614
2746
  })
2615
- }).describe("Data field for displaying read-only data");
2747
+ }).meta({
2748
+ description: "A field for displaying a table of read-only data",
2749
+ id: "DataField"
2750
+ });
2616
2751
  var ButtonSize = import_v43.default.enum(["small", "medium", "large"]);
2617
2752
  var ButtonType = import_v43.default.enum([
2618
2753
  "primary",
@@ -2637,13 +2772,19 @@ var ButtonConfiguration = import_v43.default.object({
2637
2772
  });
2638
2773
  var ButtonField = BaseField.extend({
2639
2774
  type: import_v43.default.literal(FieldType.BUTTON),
2640
- defaultValue: ButtonFieldValue.optional(),
2775
+ defaultValue: ButtonFieldValue.or(ComputedDefaultValue).optional(),
2641
2776
  configuration: ButtonConfiguration
2642
- }).describe("Generic button without any built-in functionality");
2777
+ }).meta({
2778
+ description: "A generic button that can be used to trigger an action",
2779
+ id: "ButtonField"
2780
+ });
2643
2781
  var FieldGroup = BaseField.extend({
2644
2782
  type: import_v43.default.literal(FieldType.FIELD_GROUP),
2645
2783
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
2646
2784
  fields: import_v43.default.lazy(() => import_v43.default.array(FieldConfig))
2785
+ }).meta({
2786
+ description: "A group of fields that are displayed together",
2787
+ id: "FieldGroup"
2647
2788
  });
2648
2789
  var AlphaPrintButton = BaseField.extend({
2649
2790
  type: import_v43.default.literal(FieldType.ALPHA_PRINT_BUTTON),
@@ -2653,10 +2794,13 @@ var AlphaPrintButton = BaseField.extend({
2653
2794
  "Label for the print button"
2654
2795
  )
2655
2796
  })
2656
- }).describe("Print button field for printing certificates");
2797
+ }).meta({
2798
+ description: "An experimental print button field for printing certificates during the declaration process",
2799
+ id: "AlphaPrintButton"
2800
+ });
2657
2801
  var HttpField = BaseField.extend({
2658
2802
  type: import_v43.default.literal(FieldType.HTTP),
2659
- defaultValue: HttpFieldValue.optional(),
2803
+ defaultValue: HttpFieldValue.or(ComputedDefaultValue).optional(),
2660
2804
  configuration: import_v43.default.object({
2661
2805
  trigger: FieldReference.optional().describe(
2662
2806
  "Reference to the field that triggers the HTTP request when its value changes. If not provided, the HTTP request is triggered once on component mount."
@@ -2669,20 +2813,30 @@ var HttpField = BaseField.extend({
2669
2813
  params: import_v43.default.record(import_v43.default.string(), import_v43.default.union([import_v43.default.string(), FieldReference])).optional(),
2670
2814
  timeout: import_v43.default.number().default(15e3).describe("Request timeout in milliseconds")
2671
2815
  })
2672
- }).describe("HTTP request function triggered by a button click or other event");
2816
+ }).meta({
2817
+ description: "Makes a background HTTP request to an external service and stores the response so other fields can use it. Has no visible UI \u2014 pair with LOADER to show request status.",
2818
+ id: "HttpField"
2819
+ });
2673
2820
  var AutocompleteField = BaseField.extend({
2674
2821
  type: import_v43.default.literal(FieldType.AUTOCOMPLETE),
2675
2822
  configuration: import_v43.default.object({
2676
- url: import_v43.default.string().describe("URL to fetch autocomplete suggestions from").optional(),
2823
+ url: import_v43.default.string().describe(
2824
+ "URL to fetch autocomplete suggestions from. This should be a country config server endpoint."
2825
+ ).optional(),
2677
2826
  method: import_v43.default.enum(["GET", "POST"]).default("GET").optional(),
2678
2827
  defaultOptions: import_v43.default.array(
2679
2828
  import_v43.default.object({
2680
2829
  label: import_v43.default.string(),
2681
2830
  value: import_v43.default.string()
2682
2831
  })
2683
- ).optional()
2832
+ ).optional().describe(
2833
+ "Manual entry is supported through configuration, allowing users to provide values not currently represented in the dataset."
2834
+ )
2684
2835
  })
2685
- }).describe("Autocomplete input field");
2836
+ }).meta({
2837
+ description: "Generic autocomplete component designed for use with large dictionary-based datasets. The component supports dynamic retrieval of options from configurable data sources and is intended for datasets that may contain tens or hundreds of thousands of records.",
2838
+ id: "AutocompleteField"
2839
+ });
2686
2840
  var SearchField = HttpField.extend({
2687
2841
  type: import_v43.default.literal(FieldType.SEARCH),
2688
2842
  configuration: SearchQuery.pick({
@@ -2715,6 +2869,9 @@ var SearchField = HttpField.extend({
2715
2869
  ok: TranslationConfig.optional()
2716
2870
  }).optional()
2717
2871
  })
2872
+ }).meta({
2873
+ description: "A search input field",
2874
+ id: "SearchField"
2718
2875
  });
2719
2876
  var LinkButtonField = BaseField.extend({
2720
2877
  type: import_v43.default.literal(FieldType.LINK_BUTTON),
@@ -2723,28 +2880,35 @@ var LinkButtonField = BaseField.extend({
2723
2880
  text: TranslationConfig.describe("Text to display on the button"),
2724
2881
  icon: import_v43.default.string().optional().describe("Icon for the button. You can find icons from OpenCRVS UI-Kit.")
2725
2882
  })
2726
- }).describe("Button that opens a link");
2883
+ }).meta({
2884
+ description: "A button that opens a URL link",
2885
+ id: "LinkButtonField"
2886
+ });
2727
2887
  var VerificationStatus = BaseField.extend({
2728
2888
  type: import_v43.default.literal(FieldType.VERIFICATION_STATUS),
2729
- defaultValue: VerificationStatusValue.optional(),
2889
+ defaultValue: VerificationStatusValue.or(ComputedDefaultValue).optional(),
2730
2890
  configuration: import_v43.default.object({
2731
2891
  status: TranslationConfig.describe("Text to display on the status pill."),
2732
2892
  description: TranslationConfig.describe(
2733
2893
  "Explaining text on the banner in form."
2734
2894
  )
2735
2895
  })
2896
+ }).meta({
2897
+ description: "Displays a verification state (e.g. ID verified / pending). Often paired with ID_READER \u2014 it can read its value off an ID_READER rather than holding its own.",
2898
+ id: "VerificationStatus"
2736
2899
  });
2737
2900
  var QueryParamReaderField = BaseField.extend({
2738
2901
  type: import_v43.default.literal(FieldType.QUERY_PARAM_READER),
2739
2902
  configuration: import_v43.default.object({
2740
2903
  pickParams: import_v43.default.array(import_v43.default.string()).describe("List of query parameters to read from the URL")
2741
2904
  })
2742
- }).describe(
2743
- "A field that maps URL query params into form values and clears them afterward"
2744
- );
2905
+ }).meta({
2906
+ description: "A field that maps URL query params into form values and clears them afterward",
2907
+ id: "QueryParamReaderField"
2908
+ });
2745
2909
  var QrReaderField = BaseField.extend({
2746
2910
  type: import_v43.default.literal(FieldType.QR_READER),
2747
- defaultValue: QrReaderFieldValue.optional(),
2911
+ defaultValue: QrReaderFieldValue.or(ComputedDefaultValue).optional(),
2748
2912
  configuration: import_v43.default.object({
2749
2913
  validator: import_v43.default.any().meta({
2750
2914
  description: "JSON Schema to validate the scanned QR code data against before populating the form fields.",
@@ -2752,21 +2916,27 @@ var QrReaderField = BaseField.extend({
2752
2916
  })
2753
2917
  }).optional()
2754
2918
  }).meta({
2755
- description: "Configuration for QR code reader field, including optional JSON Schema validator.",
2919
+ description: "QR code reader field, including optional JSON Schema validator.",
2756
2920
  id: "QrReaderField"
2757
2921
  });
2758
2922
  var IdReaderField = BaseField.extend({
2759
2923
  type: import_v43.default.literal(FieldType.ID_READER),
2760
- defaultValue: IdReaderFieldValue.optional(),
2924
+ defaultValue: IdReaderFieldValue.or(ComputedDefaultValue).optional(),
2761
2925
  methods: import_v43.default.array(
2762
2926
  import_v43.default.union([QrReaderField, LinkButtonField]).describe("Methods for reading an ID")
2763
2927
  )
2928
+ }).meta({
2929
+ description: "A wrapper around nested form fields, specifically QR_READER and LINK_BUTTON. It can hold the QR_READERs value.",
2930
+ id: "IdReaderField"
2764
2931
  });
2765
2932
  var CustomField = BaseField.extend({
2766
2933
  type: import_v43.default.literal(FieldType._EXPERIMENTAL_CUSTOM),
2767
2934
  defaultValue: CustomFieldValue.optional(),
2768
2935
  src: import_v43.default.string().describe("Module source path for the custom field component"),
2769
2936
  configuration: import_v43.default.unknown().optional()
2937
+ }).meta({
2938
+ description: "An expiremental custom field that is defined by a module source path",
2939
+ id: "CustomField"
2770
2940
  });
2771
2941
  var FieldStyleVariant = import_v43.default.enum(["default", "highlighted"]);
2772
2942
  var LoaderField = BaseField.extend({
@@ -2776,22 +2946,25 @@ var LoaderField = BaseField.extend({
2776
2946
  configuration: import_v43.default.object({
2777
2947
  text: TranslationConfig.describe("Display text above the loading spinner")
2778
2948
  })
2779
- }).describe(
2780
- "A non-interactive field that indicates an in progress operation in form"
2781
- );
2949
+ }).meta({
2950
+ description: "A non-interactive field that indicates an in progress operation in form",
2951
+ id: "LoaderField"
2952
+ });
2782
2953
  var HiddenField = BaseField.extend({
2783
2954
  type: import_v43.default.literal(FieldType.ALPHA_HIDDEN),
2784
2955
  required: import_v43.default.boolean().default(false).optional(),
2785
2956
  defaultValue: TextValue.optional()
2786
- }).describe(
2787
- "A non-interactive, hidden field that only hold a value in the form"
2788
- );
2957
+ }).meta({
2958
+ description: "A non-interactive, hidden field that only hold a value in the form",
2959
+ id: "HiddenField"
2960
+ });
2789
2961
  var UserRoleField = BaseField.extend({
2790
2962
  type: import_v43.default.literal(FieldType.USER_ROLE),
2791
2963
  defaultValue: TextValue.optional()
2792
- }).describe(
2793
- "A select dropdown that is automatically populated with available user roles"
2794
- );
2964
+ }).meta({
2965
+ description: "A select dropdown that is automatically populated with available user roles",
2966
+ id: "UserRoleField"
2967
+ });
2795
2968
  var FieldConfig = import_v43.default.discriminatedUnion("type", [
2796
2969
  FieldGroup,
2797
2970
  Address,
@@ -2891,15 +3064,18 @@ var VerificationPageConfig = FormPageConfig.extend({
2891
3064
  actions: VerificationActionConfig
2892
3065
  });
2893
3066
  var PageConfig = z21.discriminatedUnion("type", [FormPageConfig, VerificationPageConfig]).meta({
2894
- description: "Page configuration",
2895
- id: "PageConfig"
3067
+ id: "PageConfig",
3068
+ description: "Configuration for a single page in a form. Either a form page with fields and a continue button, or a verification page with verify/cancel options."
2896
3069
  });
2897
3070
 
2898
3071
  // ../commons/src/events/FormConfig.ts
2899
3072
  var DeclarationFormConfig = z22.object({
2900
3073
  label: TranslationConfig.describe("Human readable description of the form"),
2901
3074
  pages: z22.array(FormPageConfig)
2902
- }).describe("Configuration of the declaration form.");
3075
+ }).meta({
3076
+ id: "DeclarationFormConfig",
3077
+ description: "Configuration of the declaration form."
3078
+ });
2903
3079
  var ActionFormConfig = z22.object({
2904
3080
  label: TranslationConfig.describe("Human readable description of the form"),
2905
3081
  pages: z22.array(PageConfig)
@@ -2999,6 +3175,9 @@ var DeduplicationConfig = z23.object({
2999
3175
  id: z23.string(),
3000
3176
  label: TranslationConfig,
3001
3177
  query: Clause
3178
+ }).meta({
3179
+ id: "DeduplicationConfig",
3180
+ description: "Configuration for duplicate detection on a declare or register action. The query is built from fuzzy / strict / date-range matchers combined with and/or/not."
3002
3181
  });
3003
3182
 
3004
3183
  // ../commons/src/events/ActionConfig.ts
@@ -3116,17 +3295,42 @@ var ActionConfig = z24.discriminatedUnion("type", [
3116
3295
  * OpenAPI references are defined here so our generated OpenAPI spec knows to reuse the models
3117
3296
  * and treat them as "models" instead of duplicating the data structure in each endpoint.
3118
3297
  */
3119
- ReadActionConfig.meta({ id: "ReadActionConfig" }),
3120
- DeclareConfig.meta({ id: "DeclareActionConfig" }),
3121
- RejectConfig.meta({ id: "RejectActionConfig" }),
3122
- RegisterConfig.meta({ id: "RegisterActionConfig" }),
3298
+ ReadActionConfig.meta({
3299
+ id: "ReadActionConfig",
3300
+ description: "Configuration for the read action \u2014 defines the record-tab content displayed on the event overview page."
3301
+ }),
3302
+ DeclareConfig.meta({
3303
+ id: "DeclareActionConfig",
3304
+ description: "Configuration for the declare action. Includes review-page fields. Shared with the notify action (ActionType.NOTIFY)."
3305
+ }),
3306
+ RejectConfig.meta({
3307
+ id: "RejectActionConfig",
3308
+ description: "Configuration for rejecting a record before registration."
3309
+ }),
3310
+ RegisterConfig.meta({
3311
+ id: "RegisterActionConfig",
3312
+ description: "Configuration for registering a record."
3313
+ }),
3123
3314
  PrintCertificateActionConfig.meta({
3124
- id: "PrintCertificateActionConfig"
3315
+ id: "PrintCertificateActionConfig",
3316
+ description: "Configuration for printing a certificate of a registered record."
3317
+ }),
3318
+ RequestCorrectionConfig.meta({
3319
+ id: "RequestCorrectionActionConfig",
3320
+ description: "Configuration for requesting a correction on a registered record."
3321
+ }),
3322
+ EditActionConfig.meta({
3323
+ id: "EditActionConfig",
3324
+ description: "Configuration for editing a record before registration."
3325
+ }),
3326
+ ArchiveConfig.meta({
3327
+ id: "ArchiveActionConfig",
3328
+ description: "Configuration for archiving a record."
3125
3329
  }),
3126
- RequestCorrectionConfig.meta({ id: "RequestCorrectionActionConfig" }),
3127
- EditActionConfig.meta({ id: "EditActionConfig" }),
3128
- ArchiveConfig.meta({ id: "ArchiveActionConfig" }),
3129
- CustomActionConfig.meta({ id: "CustomActionConfig" })
3330
+ CustomActionConfig.meta({
3331
+ id: "CustomActionConfig",
3332
+ description: "Configuration for a country-defined custom action. An event may include any number of these."
3333
+ })
3130
3334
  ]).describe(
3131
3335
  "Configuration of an action available for an event. Data collected depends on the action type and is accessible through the annotation property in ActionDocument."
3132
3336
  ).meta({ id: "ActionConfig" });
@@ -3202,7 +3406,10 @@ var Field = BaseField2.extend({
3202
3406
  }).describe("Custom field defined for the summary view.");
3203
3407
  var SummaryConfig = z27.object({
3204
3408
  fields: z27.array(z27.union([Field, ReferenceField])).describe("Fields displayed in the event summary view.")
3205
- }).describe("Configuration of the event summary section.");
3409
+ }).meta({
3410
+ id: "SummaryConfig",
3411
+ description: "Configuration of the event overview page. Defines which declaration fields appear in the record summary, optionally with custom labels, empty-value messages, and templated values."
3412
+ });
3206
3413
 
3207
3414
  // ../commons/src/events/AdvancedSearchConfig.ts
3208
3415
  var z28 = __toESM(require("zod/v4"));
@@ -3273,6 +3480,9 @@ var BaseField3 = z28.object({
3273
3480
  ),
3274
3481
  validations: z28.array(ValidationConfig).optional().describe(
3275
3482
  `Option for overriding the field validations specifically for advanced search form.`
3483
+ ),
3484
+ allowedLocations: JurisdictionReference.optional().describe(
3485
+ `Override the allowedLocations for a location field in advanced search. Use this when the declaration form's allowedLocations references a scope (e.g. record.create) that search-only users don't have \u2014 specify record.search scope instead.`
3276
3486
  )
3277
3487
  });
3278
3488
  var SearchQueryParams = z28.object({
@@ -3326,6 +3536,9 @@ var AdvancedSearchField = z28.discriminatedUnion("fieldType", [FieldConfigSchema
3326
3536
  var AdvancedSearchConfig = z28.object({
3327
3537
  title: TranslationConfig.describe("Advanced search tab title"),
3328
3538
  fields: z28.array(AdvancedSearchField).describe("Advanced search fields within the tab.")
3539
+ }).meta({
3540
+ id: "AdvancedSearchConfig",
3541
+ description: "Configuration of one advanced search tab. Each tab has a title and a list of searchable fields \u2014 either declaration fields (via `field()`) or event metadata (via `event()`)."
3329
3542
  });
3330
3543
 
3331
3544
  // ../commons/src/events/utils.ts
@@ -3344,9 +3557,11 @@ var z30 = __toESM(require("zod/v4"));
3344
3557
  var z29 = __toESM(require("zod/v4"));
3345
3558
  function getDynamicNameValue(field3) {
3346
3559
  const nameConfiguration = field3.configuration?.name;
3560
+ const firstnameRequired = nameConfiguration?.firstname?.required ?? field3.required;
3561
+ const surnameRequired = nameConfiguration?.surname?.required ?? field3.required;
3347
3562
  return z29.object({
3348
- firstname: nameConfiguration?.firstname?.required ? NonEmptyTextValue : TextValue,
3349
- surname: nameConfiguration?.surname?.required ? NonEmptyTextValue : TextValue,
3563
+ firstname: firstnameRequired ? NonEmptyTextValue : TextValue,
3564
+ surname: surnameRequired ? NonEmptyTextValue : TextValue,
3350
3565
  middlename: nameConfiguration?.middlename?.required ? NonEmptyTextValue : TextValue.optional()
3351
3566
  });
3352
3567
  }
@@ -3729,7 +3944,37 @@ function resolveDataPath(rootData, dataPath, instancePath) {
3729
3944
  }
3730
3945
  return current;
3731
3946
  }
3947
+ function todayISO() {
3948
+ return (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" });
3949
+ }
3950
+ var compiledFunctionCache = /* @__PURE__ */ new Map();
3951
+ function compileClientFunction(code) {
3952
+ let fn = compiledFunctionCache.get(code);
3953
+ if (!fn) {
3954
+ fn = new Function(`return (${code})`)();
3955
+ compiledFunctionCache.set(code, fn);
3956
+ }
3957
+ return fn;
3958
+ }
3732
3959
  (0, import_ajv_formats.default)(ajv);
3960
+ function buildClientFunctionContext(input) {
3961
+ return {
3962
+ $form: input.form,
3963
+ $now: todayISO(),
3964
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
3965
+ $online: isOnline(),
3966
+ $user: input.validatorContext?.user,
3967
+ $event: input.validatorContext?.event,
3968
+ $leafAdminStructureLocationIds: input.validatorContext?.leafAdminStructureLocationIds ?? [],
3969
+ user: input.systemVariables?.user,
3970
+ $window: input.systemVariables?.$window,
3971
+ locations: input.locations,
3972
+ adminLevelIds: input.adminLevelIds
3973
+ };
3974
+ }
3975
+ function runClientFunction(code, data, context) {
3976
+ return compileClientFunction(code)(data, context);
3977
+ }
3733
3978
  ajv.addKeyword({
3734
3979
  keyword: "daysFromDate",
3735
3980
  type: "string",
@@ -3774,7 +4019,7 @@ ajv.addKeyword({
3774
4019
  $data: true,
3775
4020
  errors: true,
3776
4021
  // @ts-ignore -- Force type. We will move this away from AJV next. Parsing the array will take seconds and is only called by core.
3777
- validate(schema, data, _2, dataContext) {
4022
+ validate(_schema, data, _2, dataContext) {
3778
4023
  const locationIdInput = data;
3779
4024
  const locations = dataContext?.rootData.$leafAdminStructureLocationIds ?? [];
3780
4025
  return locations.some((location) => location.id === locationIdInput);
@@ -3805,6 +4050,23 @@ function isAgeValue(value) {
3805
4050
  function mergeWithBaseFormState(values, context) {
3806
4051
  return { ...context.baseFormState, ...values };
3807
4052
  }
4053
+ ajv.addKeyword({
4054
+ keyword: "customClientValidator",
4055
+ schemaType: "object",
4056
+ errors: true,
4057
+ // @ts-expect-error -- AJV's public types don't expose `rootData`. All
4058
+ // `validate()` callers build root data via `buildClientFunctionContext`,
4059
+ // so the cast holds.
4060
+ validate(schema, data, _2, dataContext) {
4061
+ return Boolean(
4062
+ runClientFunction(
4063
+ schema.code,
4064
+ data,
4065
+ dataContext?.rootData ?? buildClientFunctionContext({ form: {} })
4066
+ )
4067
+ );
4068
+ }
4069
+ });
3808
4070
  function validate(schema, data) {
3809
4071
  const validator = ajv.getSchema(schema.$id) || ajv.compile(schema);
3810
4072
  if ("$form" in data) {
@@ -3841,17 +4103,14 @@ function isOnline() {
3841
4103
  }
3842
4104
  return true;
3843
4105
  }
3844
- function isConditionMet(conditional, values, context, eventIndex) {
3845
- return validate(conditional, {
3846
- $form: mergeWithBaseFormState(values, context),
3847
- $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
3848
- $online: isOnline(),
3849
- $user: context.user,
3850
- $leafAdminStructureLocationIds: context.leafAdminStructureLocationIds ?? [],
3851
- $flags: eventIndex?.flags ?? [],
3852
- $status: eventIndex?.status,
3853
- $event: context.event
3854
- });
4106
+ function isConditionMet(conditional, values, context) {
4107
+ return validate(
4108
+ conditional,
4109
+ buildClientFunctionContext({
4110
+ form: mergeWithBaseFormState(values, context),
4111
+ validatorContext: context
4112
+ })
4113
+ );
3855
4114
  }
3856
4115
  function getConditionalActionsForField(field3, values) {
3857
4116
  if (!field3.conditionals) {
@@ -3859,9 +4118,9 @@ function getConditionalActionsForField(field3, values) {
3859
4118
  }
3860
4119
  return field3.conditionals.filter((conditional) => validate(conditional.conditional, values)).map((conditional) => conditional.type);
3861
4120
  }
3862
- function areConditionsMet(conditions, values, context, event2) {
4121
+ function areConditionsMet(conditions, values, context, _event) {
3863
4122
  return conditions.every(
3864
- (condition) => isConditionMet(condition.conditional, values, context, event2)
4123
+ (condition) => isConditionMet(condition.conditional, values, context)
3865
4124
  );
3866
4125
  }
3867
4126
  function isFieldConditionMet(field3, form, conditionalType, context) {
@@ -3871,14 +4130,13 @@ function isFieldConditionMet(field3, form, conditionalType, context) {
3871
4130
  if (!hasRule) {
3872
4131
  return true;
3873
4132
  }
3874
- const validConditionals = getConditionalActionsForField(field3, {
3875
- $form: mergeWithBaseFormState(form, context),
3876
- $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
3877
- $online: isOnline(),
3878
- $user: context.user,
3879
- $leafAdminStructureLocationIds: context.leafAdminStructureLocationIds ?? [],
3880
- $event: context.event
3881
- });
4133
+ const validConditionals = getConditionalActionsForField(
4134
+ field3,
4135
+ buildClientFunctionContext({
4136
+ form: mergeWithBaseFormState(form, context),
4137
+ validatorContext: context
4138
+ })
4139
+ );
3882
4140
  return validConditionals.includes(conditionalType);
3883
4141
  }
3884
4142
  function isFieldVisible(field3, form, context) {
@@ -3904,7 +4162,14 @@ function isActionConditionMet(actionConfig, event2, context, conditionalType) {
3904
4162
  if (!rule) {
3905
4163
  return true;
3906
4164
  }
3907
- return isConditionMet(rule.conditional, event2.declaration, context, event2);
4165
+ return validate(rule.conditional, {
4166
+ ...buildClientFunctionContext({
4167
+ form: mergeWithBaseFormState(event2.declaration, context),
4168
+ validatorContext: context
4169
+ }),
4170
+ $flags: event2.flags,
4171
+ $status: event2.status
4172
+ });
3908
4173
  }
3909
4174
  function isActionEnabled(actionConfig, event2, context) {
3910
4175
  return isActionConditionMet(
@@ -4063,19 +4328,10 @@ function runFieldValidations({
4063
4328
  if (!isFieldVisible(field3.config, form, context)) {
4064
4329
  return [];
4065
4330
  }
4066
- const conditionalParameters = {
4067
- $form: mergeWithBaseFormState(form, context),
4068
- $now: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" }),
4069
- /**
4070
- * In real use cases, there can be hundreds of thousands of locations.
4071
- * Make sure that the context contains only the locations that are needed for validation.
4072
- * E.g. if the user is a leaf admin, only the leaf locations under their admin structure are needed.
4073
- * Loading few megabytes of locations to memory just for validation is not efficient and will choke the application.
4074
- */
4075
- $leafAdminStructureLocationIds: context.leafAdminStructureLocationIds ?? [],
4076
- $online: isOnline(),
4077
- $user: context.user
4078
- };
4331
+ const conditionalParameters = buildClientFunctionContext({
4332
+ form: mergeWithBaseFormState(form, context),
4333
+ validatorContext: context
4334
+ });
4079
4335
  if (isFieldGroupFieldType(field3)) {
4080
4336
  const subfieldErrors = buildFormState(
4081
4337
  field3.config.fields,
@@ -4559,19 +4815,32 @@ function getPendingAction(actions) {
4559
4815
  }
4560
4816
  return pendingActions[0];
4561
4817
  }
4562
- function getCompleteActionAnnotation(annotation, event2, action) {
4818
+ function getCompleteActionAnnotation(event2, action) {
4563
4819
  if (action.originalActionId) {
4564
4820
  const originalAction = event2.actions.find(
4565
4821
  ({ id }) => id === action.originalActionId
4566
4822
  );
4567
4823
  if (originalAction?.status === ActionStatus.Requested) {
4568
- return deepMerge(
4569
- deepMerge(annotation, originalAction.annotation ?? {}),
4570
- action.annotation ?? {}
4571
- );
4824
+ return deepMerge(originalAction.annotation ?? {}, action.annotation ?? {});
4572
4825
  }
4573
4826
  }
4574
- return deepMerge(annotation, action.annotation ?? {});
4827
+ return action.annotation ?? {};
4828
+ }
4829
+ function getCompleteActionContent(event2, action) {
4830
+ const currentContent = "content" in action ? action.content : void 0;
4831
+ if (!action.originalActionId) {
4832
+ return currentContent;
4833
+ }
4834
+ const originalAction = event2.actions.find(
4835
+ ({ id }) => id === action.originalActionId
4836
+ );
4837
+ if (originalAction && "content" in originalAction && originalAction.content) {
4838
+ return {
4839
+ ...originalAction.content,
4840
+ ...currentContent ?? {}
4841
+ };
4842
+ }
4843
+ return currentContent;
4575
4844
  }
4576
4845
  function getCompleteActionDeclaration(declaration, event2, action) {
4577
4846
  if (action.originalActionId) {
@@ -4591,7 +4860,7 @@ function getAcceptedActions(event2) {
4591
4860
  return event2.actions.filter(isAcceptedAction).map((action) => ({
4592
4861
  ...action,
4593
4862
  declaration: getCompleteActionDeclaration({}, event2, action),
4594
- annotation: getCompleteActionAnnotation({}, event2, action)
4863
+ annotation: getCompleteActionAnnotation(event2, action)
4595
4864
  }));
4596
4865
  }
4597
4866
  var EXCLUDED_ACTIONS = [
@@ -4679,6 +4948,9 @@ function not(condition) {
4679
4948
  function never2() {
4680
4949
  return not(alwaysTrue());
4681
4950
  }
4951
+ function always() {
4952
+ return defineConditional(alwaysTrue());
4953
+ }
4682
4954
  function jsonFieldPath(field3) {
4683
4955
  return [field3.$$field, ...field3.$$subfield].join("/");
4684
4956
  }
@@ -5226,7 +5498,54 @@ function createFieldConditionals(fieldId) {
5226
5498
  }
5227
5499
  },
5228
5500
  required: [fieldId]
5229
- })
5501
+ }),
5502
+ /**
5503
+ * Custom client-side validator. The provided function is serialised and executed
5504
+ * just-in-time on the client only. External references (e.g. lodash) are not
5505
+ * available inside the function body — all logic must be self-contained.
5506
+ *
5507
+ * @example
5508
+ * field('nid').customClientValidator((value) => {
5509
+ * // LUHN check — all logic must be inline
5510
+ * const digits = String(value).split('').map(Number)
5511
+ * // ...
5512
+ * return isValid
5513
+ * })
5514
+ */
5515
+ customClientValidator(validationFn) {
5516
+ const code = validationFn.toString();
5517
+ return defineFormConditional({
5518
+ type: "object",
5519
+ properties: wrapToPath(
5520
+ { [fieldId]: { customClientValidator: { code } } },
5521
+ this.$$subfield
5522
+ ),
5523
+ required: [fieldId]
5524
+ });
5525
+ },
5526
+ /**
5527
+ * Custom client-side evaluation. Returns a {@link FieldReference} descriptor
5528
+ * that can be used as the `value` property or a DATA component entry.
5529
+ * The function receives the referenced field's value as the first argument and
5530
+ * the full form context as the second; its return value replaces the field reference.
5531
+ * The function is serialised and executed just-in-time on the client only.
5532
+ * External references (e.g. lodash) are not available inside the function body.
5533
+ *
5534
+ * For computing a default value without referencing a specific field, use
5535
+ * `evaluate(fn)` in the `defaultValue` property instead.
5536
+ *
5537
+ * @example
5538
+ * field('a').customClientEvaluation((aValue, ctx) =>
5539
+ * Number(aValue) + Number(ctx.$form.b)
5540
+ * )
5541
+ */
5542
+ customClientEvaluation(computationFn) {
5543
+ return {
5544
+ $$code: computationFn.toString(),
5545
+ $$field: fieldId,
5546
+ $$subfield: this.$$subfield
5547
+ };
5548
+ }
5230
5549
  };
5231
5550
  }
5232
5551
 
@@ -5399,8 +5718,9 @@ var EventConfig = _EventConfigBase.superRefine((event2, ctx) => {
5399
5718
  validateActionFlags(event2, ctx);
5400
5719
  validateActionOrder(event2, ctx);
5401
5720
  }).meta({
5402
- id: "EventConfig"
5403
- }).describe("Configuration defining an event type.");
5721
+ id: "EventConfig",
5722
+ description: "Configuration defining an event type registered in OpenCRVS (for example birth or death)."
5723
+ });
5404
5724
 
5405
5725
  // ../commons/src/events/EventConfigInput.ts
5406
5726
  var defineDeclarationForm = (form) => DeclarationFormConfig.parse(form);
@@ -5623,6 +5943,9 @@ var WorkqueueColumnValue = z34.object({
5623
5943
  var WorkqueueColumn = z34.object({
5624
5944
  label: TranslationConfig,
5625
5945
  value: WorkqueueColumnValue
5946
+ }).meta({
5947
+ id: "WorkqueueColumn",
5948
+ description: "Configuration for a single workqueue column. The value references an event metadata key (e.g. `dateOfEvent`, `status`, `trackingId`)."
5626
5949
  });
5627
5950
  function defineWorkqueuesColumns(workqueueColumns) {
5628
5951
  return workqueueColumns.map(
@@ -5828,8 +6151,8 @@ var WorkqueueConfigWithoutQuery = WorkqueueConfig.omit({
5828
6151
  var WorkqueueConfigInput = WorkqueueConfig.extend({
5829
6152
  query: CountryConfigQueryInputType
5830
6153
  }).meta({
5831
- description: "Workqueue configuration",
5832
- id: "WorkqueueConfig"
6154
+ id: "WorkqueueConfig",
6155
+ description: "Configuration for a single workqueue. Defines the filter applied to the event index, the quick-action button, the columns shown on each row, and the message rendered when the queue is empty."
5833
6156
  });
5834
6157
  function defineWorkqueue(workqueueInput) {
5835
6158
  const queryInput = workqueueInput.query;
@@ -5892,7 +6215,9 @@ var BaseActionInput = z38.object({
5892
6215
  keepAssignment: z38.boolean().optional(),
5893
6216
  keepAssignmentIfAccepted: z38.boolean().optional(),
5894
6217
  keepAssignmentIfRejected: z38.boolean().optional(),
5895
- waitFor: z38.boolean().optional(),
6218
+ waitFor: z38.boolean().default(true).describe(
6219
+ "Whether action waits for the indexing before returning. Defaults to true. Setting this to to false completes faster but might lead to stale data in the client if the client tries to read the event immediately after performing the action. Use with care."
6220
+ ),
5896
6221
  // For normal users, the createdAtLocation is resolved on the backend from the user's primaryOfficeId.
5897
6222
  // @TODO: createdAtLocation should be limited to actions that system users can perform. For normal users, it should not be part of the base action.
5898
6223
  createdAtLocation: UUID.nullish().describe(
@@ -6010,7 +6335,8 @@ var RejectCorrectionActionInput = BaseActionInput.extend(
6010
6335
  var ApproveCorrectionActionInput = BaseActionInput.extend(
6011
6336
  z38.object({
6012
6337
  requestId: z38.string(),
6013
- type: z38.literal(ActionType.APPROVE_CORRECTION).default(ActionType.APPROVE_CORRECTION)
6338
+ type: z38.literal(ActionType.APPROVE_CORRECTION).default(ActionType.APPROVE_CORRECTION),
6339
+ content: z38.object({ immediateCorrection: z38.boolean().optional() }).optional()
6014
6340
  }).shape
6015
6341
  );
6016
6342
  var ReadActionInput = BaseActionInput.extend(
@@ -6072,7 +6398,7 @@ var Draft = z39.object({
6072
6398
  }).describe(
6073
6399
  "A temporary storage for an action. Stored with details of the event, creator and creation time."
6074
6400
  );
6075
- var DraftInput = BaseActionInput.extend({
6401
+ var DraftInput = BaseActionInput.omit({ waitFor: true }).extend({
6076
6402
  type: ActionTypes.exclude([ActionTypes.enum.DELETE]),
6077
6403
  status: z39.enum([
6078
6404
  ActionStatus.Requested,
@@ -6173,7 +6499,7 @@ function getActionUpdateMetadata(actions) {
6173
6499
  "createdAtLocation",
6174
6500
  "createdByRole"
6175
6501
  ];
6176
- return actions.filter(({ type }) => updateActions.safeParse(type).success).filter(({ status: status2 }) => status2 === ActionStatus.Accepted).reduce(
6502
+ return actions.filter(({ type }) => updateActions.safeParse(type).success).reduce(
6177
6503
  (_2, action) => {
6178
6504
  if (action.originalActionId) {
6179
6505
  const originalAction = actions.find(({ id }) => id === action.originalActionId) ?? action;
@@ -6203,26 +6529,43 @@ var import_date_fns3 = require("date-fns");
6203
6529
  function isEditInProgress(actions) {
6204
6530
  return actions.at(-1)?.type === ActionType.EDIT;
6205
6531
  }
6532
+ function findPendingCorrectionAction(writeActions2) {
6533
+ let correctionRequestAction;
6534
+ for (let i = writeActions2.length - 1; i >= 0; i--) {
6535
+ const action = writeActions2[i];
6536
+ if (action.type === ActionType.APPROVE_CORRECTION || action.type === ActionType.REJECT_CORRECTION) {
6537
+ break;
6538
+ }
6539
+ if (action.type === ActionType.REQUEST_CORRECTION) {
6540
+ correctionRequestAction = action;
6541
+ break;
6542
+ }
6543
+ }
6544
+ return correctionRequestAction;
6545
+ }
6206
6546
  function isCorrectionRequested(actions) {
6547
+ return findPendingCorrectionAction(actions) !== void 0;
6548
+ }
6549
+ function isDeclarationIncomplete(actions) {
6550
+ return getStatusFromActions(actions) === EventStatus.enum.NOTIFIED;
6551
+ }
6552
+ function isRejected(actions) {
6553
+ const resettingActionTypes = [
6554
+ ActionType.NOTIFY,
6555
+ ActionType.DECLARE,
6556
+ ActionType.EDIT,
6557
+ ActionType.REGISTER
6558
+ ];
6207
6559
  return actions.reduce((prev, { type }) => {
6208
- if (type === ActionType.REQUEST_CORRECTION) {
6560
+ if (type === ActionType.REJECT) {
6209
6561
  return true;
6210
6562
  }
6211
- if (type === ActionType.APPROVE_CORRECTION) {
6212
- return false;
6213
- }
6214
- if (type === ActionType.REJECT_CORRECTION) {
6563
+ if (resettingActionTypes.includes(type)) {
6215
6564
  return false;
6216
6565
  }
6217
6566
  return prev;
6218
6567
  }, false);
6219
6568
  }
6220
- function isDeclarationIncomplete(actions) {
6221
- return getStatusFromActions(actions) === EventStatus.enum.NOTIFIED;
6222
- }
6223
- function isRejected(actions) {
6224
- return actions.at(-1)?.type === ActionType.REJECT;
6225
- }
6226
6569
  function isPotentialDuplicate(actions) {
6227
6570
  return actions.reduce((prev, { type }) => {
6228
6571
  if (type === ActionType.DUPLICATE_DETECTED) {
@@ -6285,8 +6628,7 @@ function resolveEventCustomFlags(event2, eventConfiguration) {
6285
6628
  return (0, import_lodash3.uniq)(flags);
6286
6629
  }, []);
6287
6630
  }
6288
- function getEventFlags(event2, config) {
6289
- const sortedActions = event2.actions.filter(({ type }) => !isMetaAction(type)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
6631
+ function getActionStatusFlags(sortedActions) {
6290
6632
  const actionStatus = sortedActions.reduce(
6291
6633
  (actionStatuses, { type, status: status2 }) => ({
6292
6634
  ...actionStatuses,
@@ -6294,26 +6636,40 @@ function getEventFlags(event2, config) {
6294
6636
  }),
6295
6637
  {}
6296
6638
  );
6297
- const flags = Object.entries(actionStatus).filter(([, status2]) => status2 !== ActionStatus.Accepted).map(([type, status2]) => {
6639
+ return Object.entries(actionStatus).filter(([, status2]) => status2 !== ActionStatus.Accepted).map(([type, status2]) => {
6298
6640
  const flag2 = joinValues([type, status2], ":").toLowerCase();
6299
6641
  return flag2;
6300
6642
  });
6301
- if (isCorrectionRequested(sortedActions)) {
6302
- flags.push(InherentFlags.CORRECTION_REQUESTED);
6643
+ }
6644
+ function getInherentFlags(sortedActions) {
6645
+ const acceptedActions = sortedActions.filter(
6646
+ ({ status: status2 }) => status2 === ActionStatus.Accepted
6647
+ );
6648
+ const inherentFlags = [];
6649
+ if (isCorrectionRequested(acceptedActions)) {
6650
+ inherentFlags.push(InherentFlags.CORRECTION_REQUESTED);
6303
6651
  }
6304
- if (isDeclarationIncomplete(sortedActions)) {
6305
- flags.push(InherentFlags.INCOMPLETE);
6652
+ if (isDeclarationIncomplete(acceptedActions)) {
6653
+ inherentFlags.push(InherentFlags.INCOMPLETE);
6306
6654
  }
6307
- if (isRejected(sortedActions)) {
6308
- flags.push(InherentFlags.REJECTED);
6655
+ if (isRejected(acceptedActions)) {
6656
+ inherentFlags.push(InherentFlags.REJECTED);
6309
6657
  }
6310
- if (isPotentialDuplicate(sortedActions)) {
6311
- flags.push(InherentFlags.POTENTIAL_DUPLICATE);
6658
+ if (isPotentialDuplicate(acceptedActions)) {
6659
+ inherentFlags.push(InherentFlags.POTENTIAL_DUPLICATE);
6312
6660
  }
6313
- if (isEditInProgress(sortedActions)) {
6314
- flags.push(InherentFlags.EDIT_IN_PROGRESS);
6661
+ if (isEditInProgress(acceptedActions)) {
6662
+ inherentFlags.push(InherentFlags.EDIT_IN_PROGRESS);
6315
6663
  }
6316
- return [...flags, ...resolveEventCustomFlags(event2, config)];
6664
+ return inherentFlags;
6665
+ }
6666
+ function getEventFlags(event2, config) {
6667
+ const sortedActions = event2.actions.filter(({ type }) => !isMetaAction(type)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
6668
+ return [
6669
+ ...getActionStatusFlags(sortedActions),
6670
+ ...getInherentFlags(sortedActions),
6671
+ ...resolveEventCustomFlags(event2, config)
6672
+ ];
6317
6673
  }
6318
6674
 
6319
6675
  // ../commons/src/events/state/index.ts
@@ -6548,7 +6904,7 @@ function getActionAnnotation({
6548
6904
  const action = (0, import_lodash4.findLast)(activeActions, (a) => a.type === actionType);
6549
6905
  const actionWithCompleteAnnotation = action && {
6550
6906
  ...action,
6551
- annotation: getCompleteActionAnnotation({}, event2, action)
6907
+ annotation: getCompleteActionAnnotation(event2, action)
6552
6908
  };
6553
6909
  const matchingDraft = draft?.action.type === actionType ? draft : void 0;
6554
6910
  const sortedActions = (0, import_lodash4.orderBy)(
@@ -6620,6 +6976,9 @@ function createFieldConfig(fieldId, options) {
6620
6976
  }
6621
6977
 
6622
6978
  // ../commons/src/events/field.ts
6979
+ function evaluate(computationFn) {
6980
+ return { $$code: computationFn.toString() };
6981
+ }
6623
6982
  function field(fieldId, options = {}) {
6624
6983
  return {
6625
6984
  ...createFieldConditionals(fieldId),
@@ -10312,3 +10671,366 @@ function getFilePathsFromEvent(event2) {
10312
10671
  });
10313
10672
  return (0, import_lodash7.uniq)(filepaths);
10314
10673
  }
10674
+
10675
+ // ../commons/src/events/mocks.test.utils.ts
10676
+ var V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS = [
10677
+ {
10678
+ id: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
10679
+ name: "Central",
10680
+ parentId: null,
10681
+ validUntil: null,
10682
+ externalId: "ydyJb1RAy4U1"
10683
+ },
10684
+ {
10685
+ id: "c599b691-fd2d-45e1-abf4-d185de727fb5",
10686
+ name: "Sulaka",
10687
+ parentId: null,
10688
+ validUntil: null,
10689
+ externalId: "pQ8nGxWmZ2Q3"
10690
+ },
10691
+ {
10692
+ id: "7ef2b9c7-5e6d-49f6-ae05-656207d0fc64",
10693
+ name: "Pualula",
10694
+ parentId: null,
10695
+ validUntil: null,
10696
+ externalId: "Aq91DweLmT8k"
10697
+ },
10698
+ {
10699
+ id: "6d1a59df-988c-4021-a846-ccbc021931a7",
10700
+ name: "Chuminga",
10701
+ parentId: null,
10702
+ validUntil: null,
10703
+ externalId: "Rw0fYNh2Xk9a"
10704
+ },
10705
+ {
10706
+ id: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10707
+ name: "Ibombo",
10708
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
10709
+ validUntil: null,
10710
+ externalId: "k7DsP4vbN1Qe"
10711
+ },
10712
+ {
10713
+ id: "27160bbd-32d1-4625-812f-860226bfb92a",
10714
+ name: "Isango",
10715
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
10716
+ validUntil: null,
10717
+ externalId: "Gm3Z9eQpHw4L"
10718
+ },
10719
+ {
10720
+ id: "967032fd-3f81-478a-826c-30cb8fe121bd",
10721
+ name: "Isamba",
10722
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
10723
+ validUntil: null,
10724
+ externalId: "sT0xVu1KqJ7r"
10725
+ },
10726
+ {
10727
+ id: "89a33893-b17d-481d-a26d-6461e7ac1651",
10728
+ name: "Itambo",
10729
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
10730
+ validUntil: null,
10731
+ externalId: "Nq6Bv2HpL9Te"
10732
+ },
10733
+ {
10734
+ id: "d42ab2fe-e7ed-470e-8b31-4fb27f9b8250",
10735
+ name: "Ezhi",
10736
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
10737
+ validUntil: null,
10738
+ externalId: "xK8cQ0ZRy5Wd"
10739
+ },
10740
+ {
10741
+ id: "8fbd09d2-212b-47f4-beb3-5e1694931d9f",
10742
+ name: "Ilanga",
10743
+ parentId: "c599b691-fd2d-45e1-abf4-d185de727fb5",
10744
+ validUntil: null,
10745
+ externalId: "Cq4Jm1XvN8Ls"
10746
+ },
10747
+ // Villages under Ibombo (62a0ccb4-880d-4f30-8882-f256007dfff9)
10748
+ {
10749
+ id: "1d4e5f6a-7b8c-4912-8efa-345678901234",
10750
+ name: "Klow",
10751
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10752
+ validUntil: null,
10753
+ externalId: "IkYcYBUcyY2"
10754
+ },
10755
+ {
10756
+ id: "2e5f6a7b-8c9d-4a23-8fab-456789012345",
10757
+ name: "Mbondo",
10758
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10759
+ validUntil: null,
10760
+ externalId: "Qhvv5hvo3mY"
10761
+ },
10762
+ {
10763
+ id: "3f6a7b8c-9d0e-4b34-8abc-567890123456",
10764
+ name: "Ndara",
10765
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10766
+ validUntil: null,
10767
+ externalId: "crXh068O9TR"
10768
+ },
10769
+ {
10770
+ id: "4a7b8c9d-0e1f-4c45-abcd-678901234567",
10771
+ name: "Olani",
10772
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10773
+ validUntil: null,
10774
+ externalId: "r00It8Tvvp7"
10775
+ },
10776
+ {
10777
+ id: "5b8c9d0e-1f2a-4d56-bcde-789012345678",
10778
+ name: "Pemba",
10779
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10780
+ validUntil: null,
10781
+ externalId: "ZnUWsbONIaH"
10782
+ },
10783
+ {
10784
+ id: "6c9d0e1f-2a3b-4e67-8def-890123456789",
10785
+ name: "Quanza",
10786
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10787
+ validUntil: null,
10788
+ externalId: "fDZycvQTa7l"
10789
+ },
10790
+ {
10791
+ id: "7d0e1f2a-3b4c-4f78-8efa-901234567890",
10792
+ name: "Rivka",
10793
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10794
+ validUntil: null,
10795
+ externalId: "KqswxCGTELa"
10796
+ },
10797
+ // Villages under Isamba (967032fd-3f81-478a-826c-30cb8fe121bd)
10798
+ {
10799
+ id: "8e1f2a3b-4c5d-4089-8fab-012345678901",
10800
+ name: "Mbula",
10801
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
10802
+ validUntil: null,
10803
+ externalId: "osEbKjRc9Kg"
10804
+ },
10805
+ {
10806
+ id: "9f2a3b4c-5d6e-4190-8abf-123456789012",
10807
+ name: "Ndoki",
10808
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
10809
+ validUntil: null,
10810
+ externalId: "aq4daBUAGr3"
10811
+ },
10812
+ {
10813
+ id: "0a3b4c5d-6e7f-4201-abcd-234567890123",
10814
+ name: "Tsanga",
10815
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
10816
+ validUntil: null,
10817
+ externalId: "cqis6Y8trbJ"
10818
+ },
10819
+ {
10820
+ id: "1b4c5d6e-7f8a-4312-bcde-345678901234",
10821
+ name: "Waziri",
10822
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
10823
+ validUntil: null,
10824
+ externalId: "LMijHPyyx6d"
10825
+ },
10826
+ {
10827
+ id: "2c5d6e7f-8a9b-4423-8def-456789012345",
10828
+ name: "Zimbi",
10829
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
10830
+ validUntil: null,
10831
+ externalId: "pcQYbPuKGZ7"
10832
+ },
10833
+ // Villages under Itambo (89a33893-b17d-481d-a26d-6461e7ac1651)
10834
+ {
10835
+ id: "3d6e7f8a-9b0c-4534-8efa-567890123456",
10836
+ name: "Felani",
10837
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
10838
+ validUntil: null,
10839
+ externalId: "gSqpoCGdMXp"
10840
+ },
10841
+ {
10842
+ id: "4e7f8a9b-0c1d-4645-8fab-678901234567",
10843
+ name: "Goroma",
10844
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
10845
+ validUntil: null,
10846
+ externalId: "KvAAIaNqVrp"
10847
+ },
10848
+ {
10849
+ id: "5f8a9b0c-1d2e-4756-8abc-789012345678",
10850
+ name: "Halifu",
10851
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
10852
+ validUntil: null,
10853
+ externalId: "qe4UnEVt1hv"
10854
+ },
10855
+ {
10856
+ id: "6a9b0c1d-2e3f-4867-abcd-890123456789",
10857
+ name: "Jabari",
10858
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
10859
+ validUntil: null,
10860
+ externalId: "yHH9Nz4rLOt"
10861
+ },
10862
+ {
10863
+ id: "7b0c1d2e-3f4a-4978-bcde-901234567890",
10864
+ name: "Kifani",
10865
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
10866
+ validUntil: null,
10867
+ externalId: "eSWmXIGeu1I"
10868
+ },
10869
+ {
10870
+ id: "8c1d2e3f-4a5b-4089-8def-012345678901",
10871
+ name: "Lumela",
10872
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
10873
+ validUntil: null,
10874
+ externalId: "bh0b3aI1uP3"
10875
+ }
10876
+ ];
10877
+ var V2_DEFAULT_MOCK_LOCATIONS = [
10878
+ {
10879
+ id: "6f6186ce-cd5f-4a5f-810a-2d99e7c4ba12",
10880
+ name: "Central Provincial Office",
10881
+ locationType: "CRVS_OFFICE",
10882
+ administrativeAreaId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
10883
+ validUntil: null,
10884
+ externalId: "Xr3Df8WpK6Ys"
10885
+ },
10886
+ {
10887
+ id: "b1c2d3e4-f5a6-7890-bcde-f12345678901",
10888
+ name: "Central Health Post",
10889
+ locationType: "HEALTH_FACILITY",
10890
+ administrativeAreaId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
10891
+ validUntil: null
10892
+ },
10893
+ {
10894
+ id: "028d2c85-ca31-426d-b5d1-2cef545a4902",
10895
+ name: "Ibombo District Office",
10896
+ locationType: "CRVS_OFFICE",
10897
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10898
+ validUntil: null,
10899
+ externalId: "Sm4Nw7GrD2Vy"
10900
+ },
10901
+ {
10902
+ id: "62a0ccb4-4f30-4f30-8882-f256007dff9f",
10903
+ name: "Isamba District Office",
10904
+ locationType: "CRVS_OFFICE",
10905
+ administrativeAreaId: "967032fd-3f81-478a-826c-30cb8fe121bd",
10906
+ validUntil: null,
10907
+ externalId: "Vg1Bq5XeH9Lt"
10908
+ },
10909
+ {
10910
+ id: "954c93e1-13f7-4435-bb82-35e0e215e07d",
10911
+ name: "Isango District Office",
10912
+ locationType: "CRVS_OFFICE",
10913
+ administrativeAreaId: "27160bbd-32d1-4625-812f-860226bfb92a",
10914
+ validUntil: null,
10915
+ externalId: "Je7Lm2XqN9Vz"
10916
+ },
10917
+ {
10918
+ id: "2884f5b9-17b4-49ce-bf4d-f538228935df",
10919
+ name: "Sulaka Provincial Office",
10920
+ locationType: "CRVS_OFFICE",
10921
+ administrativeAreaId: "c599b691-fd2d-45e1-abf4-d185de727fb5",
10922
+ validUntil: null,
10923
+ externalId: "Ht2Wp9KcX5Qv"
10924
+ },
10925
+ {
10926
+ id: "030358c6-54af-44be-821b-8e4af963a49c",
10927
+ name: "Ilanga District Office",
10928
+ locationType: "CRVS_OFFICE",
10929
+ administrativeAreaId: "8fbd09d2-212b-47f4-beb3-5e1694931d9f",
10930
+ validUntil: null,
10931
+ externalId: "Yp6Ds1WqN3Xz"
10932
+ },
10933
+ {
10934
+ id: "423d000f-101b-47c0-8b86-21a908067cee",
10935
+ name: "Chamakubi Health Post",
10936
+ locationType: "HEALTH_FACILITY",
10937
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10938
+ validUntil: null,
10939
+ externalId: "M1nFr8LbC2Qy"
10940
+ },
10941
+ {
10942
+ id: "4d3279be-d026-420c-88f7-f0a4ae986973",
10943
+ name: "Ibombo Rural Health Centre",
10944
+ locationType: "HEALTH_FACILITY",
10945
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10946
+ validUntil: null,
10947
+ externalId: "bT7pV6YrW0Xc"
10948
+ },
10949
+ {
10950
+ id: "190902f4-1d77-476a-8947-41145af1db7d",
10951
+ name: "Chikobo Rural Health Centre",
10952
+ locationType: "HEALTH_FACILITY",
10953
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10954
+ validUntil: null,
10955
+ externalId: "zE4qPn2SgJ5d"
10956
+ },
10957
+ {
10958
+ id: "f5ecbd9b-a01e-4a65-910e-70e86ab41b71",
10959
+ name: "Chilochabalenje Health Post",
10960
+ locationType: "HEALTH_FACILITY",
10961
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10962
+ validUntil: null,
10963
+ externalId: "H8vDs1MqR4Uf"
10964
+ },
10965
+ {
10966
+ id: "dbfc178f-7295-4b90-b28d-111c95b03127",
10967
+ name: "Chipeso Rural Health Centre",
10968
+ locationType: "HEALTH_FACILITY",
10969
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10970
+ validUntil: null,
10971
+ externalId: "Qw3uZ9KfX6Lm"
10972
+ },
10973
+ {
10974
+ id: "09862bfe-c7ac-46cd-987b-668681533c80",
10975
+ name: "Chisamba Rural Health Centre",
10976
+ locationType: "HEALTH_FACILITY",
10977
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10978
+ validUntil: null,
10979
+ externalId: "Yr0pCg8LdM2s"
10980
+ },
10981
+ {
10982
+ id: "834ce389-e95b-4fb0-96a0-33e9ab323059",
10983
+ name: "Chitanda Rural Health Centre",
10984
+ locationType: "HEALTH_FACILITY",
10985
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10986
+ validUntil: null,
10987
+ externalId: "tS9gJ4PwB1Qx"
10988
+ },
10989
+ {
10990
+ id: "0431c433-6062-4a4c-aee9-25271aec61ee",
10991
+ name: "Golden Valley Rural Health Centre",
10992
+ locationType: "HEALTH_FACILITY",
10993
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
10994
+ validUntil: null,
10995
+ externalId: "Ld7Qm3XsA8Vr"
10996
+ },
10997
+ {
10998
+ id: "bc84d0b6-7ba7-480d-a339-5d9920d90eb2",
10999
+ name: "Ipongo Rural Health Centre",
11000
+ locationType: "HEALTH_FACILITY",
11001
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
11002
+ validUntil: null,
11003
+ externalId: "kF2sW9DmH0Bt"
11004
+ },
11005
+ {
11006
+ id: "4cf1f53b-b730-41d2-8649-dff7eeed970d",
11007
+ name: "Itumbwe Health Post",
11008
+ locationType: "HEALTH_FACILITY",
11009
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
11010
+ validUntil: null,
11011
+ externalId: "Ue5Xb3VaC7Pq"
11012
+ },
11013
+ {
11014
+ id: "4b3676cb-9355-4942-9eb9-2ce46acaf0e0",
11015
+ name: "Kabangalala Rural Health Centre",
11016
+ locationType: "HEALTH_FACILITY",
11017
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
11018
+ validUntil: null,
11019
+ externalId: "Pz8Kc1TqH6Jn"
11020
+ },
11021
+ // Village offices
11022
+ {
11023
+ id: "1f4a5b6c-7d8e-4312-8abc-345678901234",
11024
+ name: "Klow Village Office",
11025
+ locationType: "CRVS_OFFICE",
11026
+ administrativeAreaId: "1d4e5f6a-7b8c-4912-8efa-345678901234",
11027
+ validUntil: null,
11028
+ externalId: "PmAyxAJkxiJ"
11029
+ }
11030
+ ];
11031
+ var V2_DEFAULT_MOCK_LOCATIONS_MAP = new Map(
11032
+ V2_DEFAULT_MOCK_LOCATIONS.map((l) => [l.id, l])
11033
+ );
11034
+ var V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS_MAP = new Map(
11035
+ V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS.map((a) => [a.id, a])
11036
+ );