@opencrvs/toolkit 2.0.0-rc.fef9d21 → 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.
Files changed (59) hide show
  1. package/create-countryconfig/index.js +103 -0
  2. package/create-countryconfig/package.json +21 -0
  3. package/dist/application-config/index.js +305 -129
  4. package/dist/cli.js +548 -178
  5. package/dist/commons/api/router.d.ts +3379 -239
  6. package/dist/commons/application-config/index.d.ts +17 -4
  7. package/dist/commons/conditionals/conditionals.d.ts +360 -10
  8. package/dist/commons/conditionals/validate.d.ts +52 -2
  9. package/dist/commons/events/ActionDocument.d.ts +6 -0
  10. package/dist/commons/events/ActionInput.d.ts +114 -0
  11. package/dist/commons/events/AdvancedSearchConfig.d.ts +342 -0
  12. package/dist/commons/events/Draft.d.ts +4 -2
  13. package/dist/commons/events/EventDocument.d.ts +3 -0
  14. package/dist/commons/events/EventIndex.d.ts +0 -3
  15. package/dist/commons/events/EventMetadata.d.ts +0 -7
  16. package/dist/commons/events/FieldConfig.d.ts +387 -50
  17. package/dist/commons/events/FieldValue.d.ts +6 -0
  18. package/dist/commons/events/WorkqueueConfig.d.ts +150 -150
  19. package/dist/commons/events/field.d.ts +53 -1
  20. package/dist/commons/events/index.d.ts +2 -0
  21. package/dist/commons/events/locations.d.ts +38 -1
  22. package/dist/commons/events/mocks.test.utils.d.ts +19 -0
  23. package/dist/commons/events/scopes.d.ts +24 -1
  24. package/dist/commons/events/state/flags.d.ts +16 -0
  25. package/dist/commons/events/state/index.d.ts +0 -4
  26. package/dist/commons/events/state/utils.d.ts +12 -289
  27. package/dist/commons/events/utils.d.ts +13 -2
  28. package/dist/conditionals/index.js +92 -9
  29. package/dist/events/index.js +1084 -261
  30. package/dist/migrations/v2.0/add-birth-certificate-issuance-flag.d.ts.map +1 -1
  31. package/dist/migrations/v2.0/add-birth-certificate-issuance-flag.js +60 -35
  32. package/dist/migrations/v2.0/checkout-upstream-files.d.ts +1 -1
  33. package/dist/migrations/v2.0/checkout-upstream-files.d.ts.map +1 -1
  34. package/dist/migrations/v2.0/checkout-upstream-files.js +1 -2
  35. package/dist/migrations/v2.0/delete-infrastructure-directory.d.ts +9 -1
  36. package/dist/migrations/v2.0/delete-infrastructure-directory.d.ts.map +1 -1
  37. package/dist/migrations/v2.0/delete-infrastructure-directory.js +66 -20
  38. package/dist/migrations/v2.0/fix-accept-requested-registration-function-type.d.ts +3 -0
  39. package/dist/migrations/v2.0/fix-accept-requested-registration-function-type.d.ts.map +1 -0
  40. package/dist/migrations/v2.0/fix-accept-requested-registration-function-type.js +110 -0
  41. package/dist/migrations/v2.0/index.d.ts +5 -3
  42. package/dist/migrations/v2.0/index.d.ts.map +1 -1
  43. package/dist/migrations/v2.0/index.js +546 -176
  44. package/dist/migrations/v2.0/make-built-in-validate-actions-custom.d.ts.map +1 -1
  45. package/dist/migrations/v2.0/make-built-in-validate-actions-custom.js +90 -1
  46. package/dist/migrations/v2.0/merge-infrastructure-directory.d.ts +11 -1
  47. package/dist/migrations/v2.0/merge-infrastructure-directory.d.ts.map +1 -1
  48. package/dist/migrations/v2.0/merge-infrastructure-directory.js +17 -16
  49. package/dist/migrations/v2.0/migrate-scopes.d.ts.map +1 -1
  50. package/dist/migrations/v2.0/migrate-scopes.js +54 -30
  51. package/dist/migrations/v2.0/migrate-workqueue-configs.d.ts.map +1 -1
  52. package/dist/migrations/v2.0/migrate-workqueue-configs.js +140 -59
  53. package/dist/notification/index.js +841 -160
  54. package/dist/scopes/index.d.ts +91 -16
  55. package/dist/scopes/index.js +55 -12
  56. package/opencrvs-toolkit-2.0.0-rc.ff99998.tgz +0 -0
  57. package/package.json +6 -2
  58. package/tsconfig.tsbuildinfo +1 -1
  59. package/opencrvs-toolkit-2.0.0-rc.fef9d21.tgz +0 -0
@@ -110,6 +110,10 @@ var scopeByEvent = z2.preprocess(
110
110
  (val) => val === void 0 ? void 0 : [val].flat(),
111
111
  z2.array(z2.string()).optional()
112
112
  ).describe("Event type, e.g. birth, death");
113
+ var userRole = z2.preprocess(
114
+ (val) => val === void 0 ? void 0 : [val].flat(),
115
+ z2.array(z2.string()).optional()
116
+ ).describe("User role, e.g. admin, field agent");
113
117
  var scopeOptionsPlaceEvent = z2.object({
114
118
  event: scopeByEvent,
115
119
  placeOfEvent: JurisdictionFilter.optional()
@@ -133,6 +137,9 @@ var CustomActionScopeOptions = AllRecordScopeOptions.extend({
133
137
  var AccessLevelOptions = z2.object({
134
138
  accessLevel: JurisdictionFilter.optional()
135
139
  });
140
+ var AllUserScopeOptions = AccessLevelOptions.extend({
141
+ role: userRole.optional()
142
+ });
136
143
  var WorkqueueOrDashboardOptions = z2.object({
137
144
  ids: z2.preprocess(
138
145
  (val) => val === void 0 ? void 0 : [val].flat(),
@@ -142,6 +149,7 @@ var WorkqueueOrDashboardOptions = z2.object({
142
149
  var AllScopeOptions = z2.object({
143
150
  ...AllRecordScopeOptions.shape,
144
151
  ...AccessLevelOptions.shape,
152
+ ...AllUserScopeOptions.shape,
145
153
  ...WorkqueueOrDashboardOptions.shape
146
154
  });
147
155
  var ScopeOptionKey = AllScopeOptions.keyof();
@@ -214,6 +222,30 @@ var RecordScopeV2 = z2.discriminatedUnion("type", [
214
222
  ]).describe(
215
223
  "Scopes used to check user's permission to perform actions on a record."
216
224
  );
225
+ var SystemScopeType = z2.enum([
226
+ "organisation.read-locations",
227
+ "user.read",
228
+ "user.create",
229
+ "user.edit",
230
+ "user.search"
231
+ ]);
232
+ var UserScopeType = SystemScopeType.extract([
233
+ "user.read",
234
+ "user.create",
235
+ "user.edit",
236
+ "user.search"
237
+ ]);
238
+ var ScopesWithRoleOption = UserScopeType.extract(["user.edit", "user.create"]);
239
+ var UserScopeV2 = z2.discriminatedUnion("type", [
240
+ z2.object({
241
+ type: ScopesWithRoleOption,
242
+ options: AllUserScopeOptions.optional()
243
+ }),
244
+ z2.object({
245
+ type: UserScopeType.extract(["user.read", "user.search"]),
246
+ options: AccessLevelOptions.optional()
247
+ })
248
+ ]);
217
249
  var ResolvedRecordScopeV2 = z2.discriminatedUnion("type", [
218
250
  z2.object({
219
251
  type: ScopesWithPlaceEventOptions,
@@ -234,16 +266,14 @@ var ResolvedRecordScopeV2 = z2.discriminatedUnion("type", [
234
266
  }).optional()
235
267
  })
236
268
  ]).describe("Resolved scope with location/user IDs instead of filters.");
237
- var SystemScopeType = z2.enum([
238
- "organisation.read-locations",
239
- "user.read",
240
- "user.create",
241
- "user.edit"
242
- ]);
243
269
  var Scope = z2.discriminatedUnion("type", [
244
270
  z2.object({ type: PlainScopeType }),
245
271
  ...RecordScopeV2.options,
246
- z2.object({ type: SystemScopeType, options: AccessLevelOptions.optional() }),
272
+ ...UserScopeV2.options,
273
+ z2.object({
274
+ type: z2.literal("organisation.read-locations"),
275
+ options: AccessLevelOptions.optional()
276
+ }),
247
277
  z2.object({
248
278
  type: z2.literal("workqueue"),
249
279
  options: WorkqueueOrDashboardOptions
@@ -263,7 +293,9 @@ var ScopeType = z2.enum([
263
293
  var EncodedScope = z2.string().brand("EncodedScope");
264
294
  var DEFAULT_SCOPE_OPTIONS = {
265
295
  placeOfEvent: JurisdictionFilter.enum.all,
266
- accessLevel: JurisdictionFilter.enum.all
296
+ accessLevel: JurisdictionFilter.enum.all,
297
+ registeredIn: JurisdictionFilter.enum.all,
298
+ declaredIn: JurisdictionFilter.enum.all
267
299
  };
268
300
 
269
301
  // ../commons/src/authentication.ts
@@ -622,7 +654,10 @@ var ActionConditional = z7.discriminatedUnion("type", [
622
654
  ShowConditional,
623
655
  // Action can be shown to the user in the list but as disabled
624
656
  EnableConditional
625
- ]);
657
+ ]).meta({
658
+ id: "ActionConditional",
659
+ 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."
660
+ });
626
661
  var DisplayOnReviewConditional = z7.object({
627
662
  type: z7.literal(ConditionalType.DISPLAY_ON_REVIEW),
628
663
  conditional: Conditional
@@ -637,8 +672,8 @@ var FieldConditional = z7.discriminatedUnion("type", [
637
672
  // Field output can be shown / hidden on the review page
638
673
  DisplayOnReviewConditional
639
674
  ]).meta({
640
- description: "Field conditional configuration",
641
- id: "FieldConditional"
675
+ id: "FieldConditional",
676
+ 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."
642
677
  });
643
678
 
644
679
  // ../commons/src/events/FieldType.ts
@@ -882,6 +917,7 @@ var DateRangeFieldValue = z12.object({
882
917
  var EmailValue = z12.email();
883
918
  var CheckboxFieldValue = z12.boolean();
884
919
  var NumberFieldValue = z12.number();
920
+ var SignatureFieldValue = FileFieldValue;
885
921
  var ButtonFieldValue = z12.number();
886
922
  var VerificationStatusValue = z12.enum([
887
923
  "verified",
@@ -950,28 +986,20 @@ function schemaPriority(schema) {
950
986
  return idx === -1 ? 9999 : idx;
951
987
  }
952
988
  function safeUnion(schemas) {
989
+ const sortedSchemas = [...schemas].sort(
990
+ (a, b) => schemaPriority(a) - schemaPriority(b)
991
+ );
953
992
  return z12.any().superRefine((val, ctx) => {
954
- const successful = schemas.filter((s) => s.safeParse(val).success);
955
- if (successful.length === 1) {
956
- return;
957
- }
958
- if (successful.length === 0) {
959
- ctx.addIssue({
960
- code: "invalid_type",
961
- expected: "custom",
962
- message: "Value does not match any schema"
963
- });
964
- return;
965
- }
966
- successful.sort((a, b) => schemaPriority(a) - schemaPriority(b));
967
- const best = successful[0];
968
- if (!best.safeParse(val).success) {
969
- ctx.addIssue({
970
- expected: "custom",
971
- code: "invalid_type",
972
- message: "Value did not match the best schema"
973
- });
993
+ for (const schema of sortedSchemas) {
994
+ if (schema.safeParse(val).success) {
995
+ return;
996
+ }
974
997
  }
998
+ ctx.addIssue({
999
+ code: "invalid_type",
1000
+ expected: "custom",
1001
+ message: "Value does not match any schema"
1002
+ });
975
1003
  }).meta({
976
1004
  description: "Value that matches exactly one of the possible schema types (TextValue, DateValue, DateRangeFieldValue). The best matching schema is chosen by priority."
977
1005
  });
@@ -1188,8 +1216,9 @@ var RequestedCorrectionAction = ActionBase.extend(
1188
1216
  var ApprovedCorrectionAction = ActionBase.extend(
1189
1217
  z14.object({
1190
1218
  type: z14.literal(ActionType.APPROVE_CORRECTION),
1191
- requestId: z14.string()
1219
+ requestId: z14.string(),
1192
1220
  // TODO move into 'content' property
1221
+ content: z14.object({ immediateCorrection: z14.boolean().optional() }).optional()
1193
1222
  }).shape
1194
1223
  );
1195
1224
  var RejectedCorrectionAction = ActionBase.extend(
@@ -1281,6 +1310,9 @@ var FlagConfig = z15.object({
1281
1310
  "Indicates if this flag expects an action to be performed to be cleared."
1282
1311
  ),
1283
1312
  label: TranslationConfig.describe("Human readable label of the flag.")
1313
+ }).meta({
1314
+ id: "FlagConfig",
1315
+ description: "Configuration for a custom flag that can be added to or removed from records by event actions."
1284
1316
  });
1285
1317
  var ActionFlagConfig = z15.object({
1286
1318
  id: Flag,
@@ -1288,6 +1320,9 @@ var ActionFlagConfig = z15.object({
1288
1320
  conditional: Conditional.optional().describe(
1289
1321
  "When conditional is met, the operation is performed on the flag. If not provided, the operation is performed unconditionally."
1290
1322
  )
1323
+ }).meta({
1324
+ id: "ActionFlagConfig",
1325
+ description: "Add or remove operation applied to a flag when the parent action is accepted. Optionally gated by a conditional."
1291
1326
  });
1292
1327
 
1293
1328
  // ../commons/src/events/EventMetadata.ts
@@ -1309,8 +1344,7 @@ var ActionCreationMetadata = z16.object({
1309
1344
  ),
1310
1345
  createdByUserType: z16.enum(["user", "system"]).nullish().describe("Whether the user is a normal user or a system."),
1311
1346
  acceptedAt: z16.iso.datetime().describe("Timestamp when the action request was accepted."),
1312
- createdByRole: z16.string().optional().describe("Role of the user at the time of action request creation."),
1313
- createdBySignature: z16.string().nullish().describe("Signature of the user who created the action request.")
1347
+ createdByRole: z16.string().optional().describe("Role of the user at the time of action request creation.")
1314
1348
  });
1315
1349
  var RegistrationCreationMetadata = ActionCreationMetadata.extend({
1316
1350
  registrationNumber: z16.string().describe(
@@ -1338,9 +1372,6 @@ var EventMetadata = z16.object({
1338
1372
  createdAtLocation: UUID.nullish().describe(
1339
1373
  "Location of the user who created the event."
1340
1374
  ),
1341
- createdBySignature: DocumentPath.nullish().describe(
1342
- "Signature of the user who created the event."
1343
- ),
1344
1375
  updatedAtLocation: UUID.nullish().describe(
1345
1376
  "Location of the user who last changed the status."
1346
1377
  ),
@@ -1633,14 +1664,31 @@ var FieldId = import_v43.default.string().superRefine((val, ctx) => {
1633
1664
  }
1634
1665
  }).describe("Unique identifier for the field");
1635
1666
  var FieldReference = import_v43.default.object({
1636
- $$field: FieldId,
1667
+ $$field: FieldId.describe("Id of the field to reference"),
1637
1668
  $$subfield: import_v43.default.array(import_v43.default.string()).optional().default([]).describe(
1638
1669
  'If the FieldValue is an object, subfield can be used to refer to e.g. `["foo", "bar"]` in `{ foo: { bar: 3 } }`'
1670
+ ),
1671
+ $$code: import_v43.default.string().optional().describe(
1672
+ "Serialised client-side function body. When present the expression is evaluated rather than dereferenced."
1673
+ )
1674
+ }).describe(
1675
+ "Reference to a field value, with an optional client-side computation applied."
1676
+ );
1677
+ var ComputedDefaultValue = import_v43.default.object({
1678
+ $$code: import_v43.default.string().describe(
1679
+ "Serialised client-side function body. Receives (undefined, context) where context includes $now, $online, and system variables."
1639
1680
  )
1640
- }).describe("Reference to a field by its ID");
1681
+ }).describe("A context-only computation used as a field default value.");
1641
1682
  var ValidationConfig = import_v43.default.object({
1642
- validator: Conditional,
1643
- message: TranslationConfig
1683
+ validator: Conditional.describe(
1684
+ "Conditional expression that must hold for the field value to be considered valid."
1685
+ ),
1686
+ message: TranslationConfig.describe(
1687
+ "Error message displayed when the validator does not hold."
1688
+ )
1689
+ }).meta({
1690
+ id: "ValidationConfig",
1691
+ 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."
1644
1692
  });
1645
1693
  var requiredSchema = import_v43.default.union([
1646
1694
  import_v43.default.boolean(),
@@ -1671,7 +1719,7 @@ var BaseField = import_v43.default.object({
1671
1719
  "Indicates whether the field can be modified during record correction."
1672
1720
  ),
1673
1721
  value: FieldReference.or(import_v43.default.array(FieldReference)).optional().describe(
1674
- "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."
1722
+ "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."
1675
1723
  ),
1676
1724
  analytics: import_v43.default.boolean().default(false).optional().describe(
1677
1725
  "Indicates whether the field is included in analytics. When enabled, its value becomes available in the analytics dashboard."
@@ -1679,30 +1727,39 @@ var BaseField = import_v43.default.object({
1679
1727
  }).describe("Common properties shared across all field types.");
1680
1728
  var Divider = BaseField.extend({
1681
1729
  type: import_v43.default.literal(FieldType.DIVIDER)
1730
+ }).meta({
1731
+ description: "A horizontal line divider",
1732
+ id: "Divider"
1682
1733
  });
1683
1734
  var TextField = BaseField.extend({
1684
1735
  type: import_v43.default.literal(FieldType.TEXT),
1685
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
1736
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
1686
1737
  configuration: import_v43.default.object({
1687
1738
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
1688
1739
  type: import_v43.default.enum(["text", "password"]).optional(),
1689
1740
  prefix: TranslationConfig.optional(),
1690
1741
  postfix: TranslationConfig.optional()
1691
1742
  }).default({ type: "text" }).optional()
1692
- }).describe("Text input");
1743
+ }).meta({
1744
+ description: "A text input field",
1745
+ id: "TextField"
1746
+ });
1693
1747
  var NumberField = BaseField.extend({
1694
1748
  type: import_v43.default.literal(FieldType.NUMBER),
1695
- defaultValue: NumberFieldValue.optional(),
1749
+ defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
1696
1750
  configuration: import_v43.default.object({
1697
1751
  min: import_v43.default.number().optional().describe("Minimum value"),
1698
1752
  max: import_v43.default.number().optional().describe("Maximum value"),
1699
1753
  prefix: TranslationConfig.optional(),
1700
1754
  postfix: TranslationConfig.optional()
1701
1755
  }).optional()
1702
- }).describe("Number input");
1756
+ }).meta({
1757
+ description: "A number input field",
1758
+ id: "NumberField"
1759
+ });
1703
1760
  var TextAreaField = BaseField.extend({
1704
1761
  type: import_v43.default.literal(FieldType.TEXTAREA),
1705
- defaultValue: NonEmptyTextValue.optional(),
1762
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
1706
1763
  configuration: import_v43.default.object({
1707
1764
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
1708
1765
  rows: import_v43.default.number().optional().describe("Number of visible text lines"),
@@ -1710,7 +1767,10 @@ var TextAreaField = BaseField.extend({
1710
1767
  prefix: TranslationConfig.optional(),
1711
1768
  postfix: TranslationConfig.optional()
1712
1769
  }).default({ rows: 4 }).optional()
1713
- }).describe("Multiline text input");
1770
+ }).meta({
1771
+ description: "A multiline text input",
1772
+ id: "TextAreaField"
1773
+ });
1714
1774
  var ImageMimeType = import_v43.default.enum([
1715
1775
  "image/png",
1716
1776
  "image/jpg",
@@ -1733,58 +1793,76 @@ var SignatureField = BaseField.extend({
1733
1793
  signaturePromptLabel: TranslationConfig.describe(
1734
1794
  "Title of the signature modal"
1735
1795
  ),
1736
- defaultValue: FieldValue.optional(),
1796
+ defaultValue: SignatureFieldValue.or(ComputedDefaultValue).optional(),
1737
1797
  configuration: import_v43.default.object({
1738
1798
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
1739
1799
  acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature")
1740
1800
  }).default({
1741
1801
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
1742
1802
  })
1743
- }).describe("Signature input field");
1803
+ }).meta({
1804
+ description: "A signature input field",
1805
+ id: "SignatureField"
1806
+ });
1744
1807
  var EmailField = BaseField.extend({
1745
1808
  type: import_v43.default.literal(FieldType.EMAIL),
1746
1809
  configuration: import_v43.default.object({
1747
1810
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text")
1748
1811
  }).default({ maxLength: 255 }).optional(),
1749
- defaultValue: NonEmptyTextValue.optional()
1812
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional()
1813
+ }).meta({
1814
+ description: "An email input field",
1815
+ id: "EmailField"
1750
1816
  });
1751
1817
  var DateField = BaseField.extend({
1752
1818
  type: import_v43.default.literal(FieldType.DATE),
1753
- defaultValue: SerializedNowDateTime.or(PlainDate).optional().describe("Default date value(yyyy-MM-dd)"),
1819
+ defaultValue: SerializedNowDateTime.or(PlainDate).or(ComputedDefaultValue).optional().describe("Default date value(yyyy-MM-dd)"),
1754
1820
  configuration: import_v43.default.object({
1755
1821
  notice: TranslationConfig.describe(
1756
1822
  "Text to display above the date input"
1757
1823
  ).optional()
1758
1824
  }).optional()
1759
- }).describe("A single date input (yyyy-MM-dd)");
1825
+ }).meta({
1826
+ description: "A date input (yyyy-MM-dd)",
1827
+ id: "DateField"
1828
+ });
1760
1829
  var AgeField = BaseField.extend({
1761
1830
  type: import_v43.default.literal(FieldType.AGE),
1762
- defaultValue: NumberFieldValue.optional(),
1831
+ defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
1763
1832
  configuration: import_v43.default.object({
1764
1833
  asOfDate: FieldReference,
1765
1834
  prefix: TranslationConfig.optional(),
1766
1835
  postfix: TranslationConfig.optional()
1767
1836
  })
1768
- }).describe("An age input field which uses the current date as the asOfDate");
1837
+ }).meta({
1838
+ description: "An age input field which uses the current date as the asOfDate",
1839
+ id: "AgeField"
1840
+ });
1769
1841
  var TimeField = BaseField.extend({
1770
1842
  type: import_v43.default.literal(FieldType.TIME),
1771
- defaultValue: SerializedNowDateTime.or(TimeValue).optional().describe("Default time value (HH-mm)"),
1843
+ defaultValue: SerializedNowDateTime.or(TimeValue).or(ComputedDefaultValue).optional().describe("Default time value (HH-mm)"),
1772
1844
  configuration: import_v43.default.object({
1773
1845
  use12HourFormat: import_v43.default.boolean().optional().describe("Whether to use 12-hour format"),
1774
1846
  notice: TranslationConfig.describe(
1775
1847
  "Text to display above the time input"
1776
1848
  ).optional()
1777
1849
  }).optional()
1778
- }).describe("A single date input (HH-mm)");
1850
+ }).meta({
1851
+ description: "A single time input (HH-mm)",
1852
+ id: "TimeField"
1853
+ });
1779
1854
  var DateRangeField = BaseField.extend({
1780
1855
  type: import_v43.default.literal(FieldType.DATE_RANGE),
1781
- defaultValue: DateRangeFieldValue.optional(),
1856
+ defaultValue: DateRangeFieldValue.or(ComputedDefaultValue).optional(),
1782
1857
  configuration: import_v43.default.object({
1783
1858
  notice: TranslationConfig.describe(
1784
1859
  "Text to display above the date input"
1785
1860
  ).optional()
1786
1861
  }).optional()
1787
- }).describe("A date range input ({ start: yyyy-MM-dd, end: yyyy-MM-dd })");
1862
+ }).meta({
1863
+ description: "A date range input ({ start: yyyy-MM-dd, end: yyyy-MM-dd })",
1864
+ id: "DateRangeField"
1865
+ });
1788
1866
  var HtmlFontVariant = import_v43.default.enum([
1789
1867
  "reg12",
1790
1868
  "reg14",
@@ -1828,21 +1906,33 @@ var ImageViewField = BaseField.extend({
1828
1906
  type: import_v43.default.literal(FieldType.IMAGE_VIEW),
1829
1907
  defaultValue: NonEmptyTextValue.optional(),
1830
1908
  configuration: ImageConfiguration
1831
- }).describe("A read-only image component for form pages");
1909
+ }).meta({
1910
+ description: "A read-only image component for form pages",
1911
+ id: "ImageViewField"
1912
+ });
1832
1913
  var Paragraph = BaseField.extend({
1833
1914
  type: import_v43.default.literal(FieldType.PARAGRAPH),
1834
1915
  configuration: ParagraphConfiguration
1835
- }).describe("A read-only HTML <p> paragraph");
1916
+ }).meta({
1917
+ description: "A read-only HTML <p> paragraph",
1918
+ id: "Paragraph"
1919
+ });
1836
1920
  var Heading = BaseField.extend({
1837
1921
  type: import_v43.default.literal(FieldType.HEADING),
1838
1922
  configuration: HeadingConfiguration
1839
- }).describe("A read-only heading component for form pages");
1923
+ }).meta({
1924
+ description: "A read-only heading component for form pages",
1925
+ id: "Heading"
1926
+ });
1840
1927
  var PageHeader = BaseField.extend({
1841
1928
  type: import_v43.default.literal(FieldType.PAGE_HEADER)
1842
- }).describe("A read-only header component for form pages");
1929
+ }).meta({
1930
+ description: "A read-only header component for form pages",
1931
+ id: "PageHeader"
1932
+ });
1843
1933
  var File = BaseField.extend({
1844
1934
  type: import_v43.default.literal(FieldType.FILE),
1845
- defaultValue: FileFieldValue.optional(),
1935
+ defaultValue: FileFieldValue.or(ComputedDefaultValue).optional(),
1846
1936
  configuration: import_v43.default.object({
1847
1937
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
1848
1938
  acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature"),
@@ -1858,7 +1948,10 @@ var File = BaseField.extend({
1858
1948
  }).default({
1859
1949
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
1860
1950
  })
1861
- }).describe("File upload");
1951
+ }).meta({
1952
+ description: "A file upload field",
1953
+ id: "File"
1954
+ });
1862
1955
  var SelectOption = import_v43.default.object({
1863
1956
  value: import_v43.default.string().describe("The value of the option"),
1864
1957
  label: import_v43.default.union([import_v43.default.string(), TranslationConfig]).describe("The label of the option"),
@@ -1866,7 +1959,7 @@ var SelectOption = import_v43.default.object({
1866
1959
  });
1867
1960
  var NumberWithUnitField = BaseField.extend({
1868
1961
  type: import_v43.default.literal(FieldType.NUMBER_WITH_UNIT),
1869
- defaultValue: NumberWithUnitFieldValue.optional(),
1962
+ defaultValue: NumberWithUnitFieldValue.or(ComputedDefaultValue).optional(),
1870
1963
  options: import_v43.default.array(SelectOption).describe("A list of options for the unit select"),
1871
1964
  configuration: import_v43.default.object({
1872
1965
  min: import_v43.default.number().optional().describe("Minimum value of the number field"),
@@ -1875,17 +1968,23 @@ var NumberWithUnitField = BaseField.extend({
1875
1968
  "Placeholder for the number field"
1876
1969
  )
1877
1970
  }).optional()
1878
- }).describe("Number with unit input");
1971
+ }).meta({
1972
+ description: "A number with unit input field",
1973
+ id: "NumberWithUnitField"
1974
+ });
1879
1975
  var RadioGroup = BaseField.extend({
1880
1976
  type: import_v43.default.literal(FieldType.RADIO_GROUP),
1881
- defaultValue: TextValue.optional(),
1977
+ defaultValue: TextValue.or(ComputedDefaultValue).optional(),
1882
1978
  options: import_v43.default.array(SelectOption).describe("A list of options"),
1883
1979
  configuration: import_v43.default.object({
1884
1980
  styles: import_v43.default.object({
1885
1981
  size: import_v43.default.enum(["NORMAL", "LARGE"]).optional()
1886
1982
  }).optional()
1887
1983
  }).optional()
1888
- }).describe("Grouped radio options");
1984
+ }).meta({
1985
+ description: "A grouped radio button field",
1986
+ id: "RadioGroup"
1987
+ });
1889
1988
  var BulletList = BaseField.extend({
1890
1989
  type: import_v43.default.literal(FieldType.BULLET_LIST),
1891
1990
  items: import_v43.default.array(TranslationConfig).describe("A list of items"),
@@ -1894,10 +1993,13 @@ var BulletList = BaseField.extend({
1894
1993
  fontVariant: HtmlFontVariant.optional()
1895
1994
  }).optional()
1896
1995
  }).default({})
1897
- }).describe("A list of bullet points");
1996
+ }).meta({
1997
+ description: "A list of bullet points",
1998
+ id: "BulletList"
1999
+ });
1898
2000
  var Select = BaseField.extend({
1899
2001
  type: import_v43.default.literal(FieldType.SELECT),
1900
- defaultValue: TextValue.optional(),
2002
+ defaultValue: TextValue.or(ComputedDefaultValue).optional(),
1901
2003
  options: import_v43.default.array(SelectOption).describe("A list of options"),
1902
2004
  noOptionsMessage: TranslationConfig.optional().describe(
1903
2005
  `
@@ -1909,16 +2011,22 @@ var Select = BaseField.extend({
1909
2011
  { ..., defaultMessage: "'{input}' is not listed among the health facilities." }
1910
2012
  `
1911
2013
  )
1912
- }).describe("Select input");
2014
+ }).meta({
2015
+ description: "A select input field",
2016
+ id: "Select"
2017
+ });
1913
2018
  var SelectDateRangeOption = import_v43.default.object({
1914
2019
  value: SelectDateRangeValue.describe("The value of the option"),
1915
2020
  label: TranslationConfig.describe("The label of the option")
1916
2021
  });
1917
2022
  var SelectDateRangeField = BaseField.extend({
1918
2023
  type: import_v43.default.literal(FieldType.SELECT_DATE_RANGE),
1919
- defaultValue: SelectDateRangeValue.optional(),
2024
+ defaultValue: SelectDateRangeValue.or(ComputedDefaultValue).optional(),
1920
2025
  options: import_v43.default.array(SelectDateRangeOption).describe("A list of options")
1921
- }).describe("Select input with date range options");
2026
+ }).meta({
2027
+ description: "A date range selection field",
2028
+ id: "SelectDateRangeField"
2029
+ });
1922
2030
  var NameConfig = import_v43.default.object({
1923
2031
  firstname: import_v43.default.object({ required: requiredSchema, label: TranslationConfig.optional() }).optional(),
1924
2032
  middlename: import_v43.default.object({ required: requiredSchema, label: TranslationConfig.optional() }).optional(),
@@ -1930,7 +2038,7 @@ var NameField = BaseField.extend({
1930
2038
  firstname: SerializedUserField.or(NonEmptyTextValue).optional(),
1931
2039
  middlename: SerializedUserField.or(NonEmptyTextValue).optional(),
1932
2040
  surname: SerializedUserField.or(NonEmptyTextValue).optional()
1933
- }).optional(),
2041
+ }).or(ComputedDefaultValue).optional(),
1934
2042
  configuration: import_v43.default.object({
1935
2043
  name: NameConfig.default({
1936
2044
  firstname: { required: true },
@@ -1949,26 +2057,41 @@ var NameField = BaseField.extend({
1949
2057
  surname: { required: true }
1950
2058
  }
1951
2059
  }).optional()
1952
- }).describe("Name input field");
2060
+ }).meta({
2061
+ description: "A field for entering a persons name",
2062
+ id: "NameField"
2063
+ });
1953
2064
  var PhoneField = BaseField.extend({
1954
- defaultValue: NonEmptyTextValue.optional(),
2065
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
1955
2066
  type: import_v43.default.literal(FieldType.PHONE)
1956
- }).describe("Phone input field");
2067
+ }).meta({
2068
+ description: "A field for entering a phone number",
2069
+ id: "PhoneField"
2070
+ });
1957
2071
  var IdField = BaseField.extend({
1958
- defaultValue: NonEmptyTextValue.optional(),
2072
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
1959
2073
  type: import_v43.default.literal(FieldType.ID)
1960
- }).describe("ID input field");
2074
+ }).meta({
2075
+ description: "A field for entering an ID",
2076
+ id: "IdField"
2077
+ });
1961
2078
  var Checkbox = BaseField.extend({
1962
2079
  type: import_v43.default.literal(FieldType.CHECKBOX),
1963
- defaultValue: CheckboxFieldValue.default(false)
1964
- }).describe("Boolean checkbox field");
2080
+ defaultValue: CheckboxFieldValue.or(ComputedDefaultValue).default(false)
2081
+ }).meta({
2082
+ description: "A boolean checkbox field",
2083
+ id: "Checkbox"
2084
+ });
1965
2085
  var Country = BaseField.extend({
1966
2086
  type: import_v43.default.literal(FieldType.COUNTRY),
1967
- defaultValue: NonEmptyTextValue.optional(),
2087
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
1968
2088
  optionOverrides: import_v43.default.array(SelectOption.omit({ label: true })).optional().describe(
1969
2089
  "Conditionals for specific countries. Countries not listed are always shown and enabled."
1970
2090
  )
1971
- }).describe("Country select field");
2091
+ }).meta({
2092
+ description: "A field for selecting a country",
2093
+ id: "Country"
2094
+ });
1972
2095
  var AllowedLocations = JurisdictionReference.optional().describe(
1973
2096
  "Limits which location options are selectable depending on user jurisdiction and location."
1974
2097
  );
@@ -1977,28 +2100,33 @@ var AdministrativeAreas = import_v43.default.enum([
1977
2100
  "HEALTH_FACILITY",
1978
2101
  "CRVS_OFFICE"
1979
2102
  ]);
1980
- var AdministrativeAreaConfiguration = import_v43.default.object({
1981
- partOf: FieldReference.optional().describe("Parent location"),
1982
- type: AdministrativeAreas,
1983
- allowedLocations: AllowedLocations
1984
- }).describe("Administrative area options");
1985
2103
  var AdministrativeAreaField = BaseField.extend({
1986
2104
  type: import_v43.default.literal(FieldType.ADMINISTRATIVE_AREA),
1987
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
1988
- configuration: AdministrativeAreaConfiguration
1989
- }).describe("Administrative area input field e.g. facility, office");
2105
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
2106
+ configuration: import_v43.default.object({
2107
+ partOf: FieldReference.optional().describe("Parent location"),
2108
+ type: AdministrativeAreas,
2109
+ allowedLocations: AllowedLocations
2110
+ }).describe("Administrative area options")
2111
+ }).meta({
2112
+ description: "Administrative area input field",
2113
+ id: "AdministrativeAreaField"
2114
+ });
1990
2115
  var LocationInput = BaseField.extend({
1991
2116
  type: import_v43.default.literal(FieldType.LOCATION),
1992
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
2117
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
1993
2118
  configuration: import_v43.default.object({
1994
2119
  locationTypes: import_v43.default.array(import_v43.default.string()).optional().describe("Types of the locations that are available for selection."),
1995
2120
  allowedLocations: AllowedLocations
1996
2121
  }).optional()
1997
- }).describe("Input field for a location");
2122
+ }).meta({
2123
+ description: "A field for selecting a location",
2124
+ id: "LocationInput"
2125
+ });
1998
2126
  var FileUploadWithOptions = BaseField.extend({
1999
2127
  type: import_v43.default.literal(FieldType.FILE_WITH_OPTIONS),
2000
2128
  options: import_v43.default.array(SelectOption).describe("A list of options"),
2001
- defaultValue: FileFieldWithOptionValue.optional(),
2129
+ defaultValue: FileFieldWithOptionValue.or(ComputedDefaultValue).optional(),
2002
2130
  configuration: import_v43.default.object({
2003
2131
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
2004
2132
  maxImageSize: import_v43.default.object({
@@ -2008,15 +2136,18 @@ var FileUploadWithOptions = BaseField.extend({
2008
2136
  }).default({
2009
2137
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
2010
2138
  })
2139
+ }).meta({
2140
+ description: "A field for uploading files with file type options",
2141
+ id: "FileUploadWithOptions"
2011
2142
  });
2012
2143
  var Facility = BaseField.extend({
2013
2144
  type: import_v43.default.literal(FieldType.FACILITY),
2014
- defaultValue: NonEmptyTextValue.optional(),
2145
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2015
2146
  configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
2016
2147
  }).describe("Input field for a facility");
2017
2148
  var Office = BaseField.extend({
2018
2149
  type: import_v43.default.literal(FieldType.OFFICE),
2019
- defaultValue: NonEmptyTextValue.optional(),
2150
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2020
2151
  configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
2021
2152
  }).describe("Input field for an office");
2022
2153
  var DefaultAddressFieldValue = DomesticAddressFieldValue.extend({
@@ -2052,8 +2183,11 @@ var Address = BaseField.extend({
2052
2183
  ).optional(),
2053
2184
  allowedLocations: AllowedLocations
2054
2185
  }).optional(),
2055
- defaultValue: DefaultAddressFieldValue.optional()
2056
- }).describe("Address input field \u2013 a combination of location and text fields");
2186
+ defaultValue: DefaultAddressFieldValue.or(ComputedDefaultValue).optional()
2187
+ }).meta({
2188
+ description: "Address input field \u2013 a combination of location and text fields",
2189
+ id: "Address"
2190
+ });
2057
2191
  var StaticDataEntry = import_v43.default.object({
2058
2192
  id: import_v43.default.string().describe("ID for the data entry."),
2059
2193
  label: TranslationConfig,
@@ -2068,7 +2202,10 @@ var DataField = BaseField.extend({
2068
2202
  subtitle: TranslationConfig.optional(),
2069
2203
  data: import_v43.default.array(DataEntry)
2070
2204
  })
2071
- }).describe("Data field for displaying read-only data");
2205
+ }).meta({
2206
+ description: "A field for displaying a table of read-only data",
2207
+ id: "DataField"
2208
+ });
2072
2209
  var ButtonSize = import_v43.default.enum(["small", "medium", "large"]);
2073
2210
  var ButtonType = import_v43.default.enum([
2074
2211
  "primary",
@@ -2093,13 +2230,19 @@ var ButtonConfiguration = import_v43.default.object({
2093
2230
  });
2094
2231
  var ButtonField = BaseField.extend({
2095
2232
  type: import_v43.default.literal(FieldType.BUTTON),
2096
- defaultValue: ButtonFieldValue.optional(),
2233
+ defaultValue: ButtonFieldValue.or(ComputedDefaultValue).optional(),
2097
2234
  configuration: ButtonConfiguration
2098
- }).describe("Generic button without any built-in functionality");
2235
+ }).meta({
2236
+ description: "A generic button that can be used to trigger an action",
2237
+ id: "ButtonField"
2238
+ });
2099
2239
  var FieldGroup = BaseField.extend({
2100
2240
  type: import_v43.default.literal(FieldType.FIELD_GROUP),
2101
2241
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
2102
2242
  fields: import_v43.default.lazy(() => import_v43.default.array(FieldConfig))
2243
+ }).meta({
2244
+ description: "A group of fields that are displayed together",
2245
+ id: "FieldGroup"
2103
2246
  });
2104
2247
  var AlphaPrintButton = BaseField.extend({
2105
2248
  type: import_v43.default.literal(FieldType.ALPHA_PRINT_BUTTON),
@@ -2109,10 +2252,13 @@ var AlphaPrintButton = BaseField.extend({
2109
2252
  "Label for the print button"
2110
2253
  )
2111
2254
  })
2112
- }).describe("Print button field for printing certificates");
2255
+ }).meta({
2256
+ description: "An experimental print button field for printing certificates during the declaration process",
2257
+ id: "AlphaPrintButton"
2258
+ });
2113
2259
  var HttpField = BaseField.extend({
2114
2260
  type: import_v43.default.literal(FieldType.HTTP),
2115
- defaultValue: HttpFieldValue.optional(),
2261
+ defaultValue: HttpFieldValue.or(ComputedDefaultValue).optional(),
2116
2262
  configuration: import_v43.default.object({
2117
2263
  trigger: FieldReference.optional().describe(
2118
2264
  "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."
@@ -2125,20 +2271,30 @@ var HttpField = BaseField.extend({
2125
2271
  params: import_v43.default.record(import_v43.default.string(), import_v43.default.union([import_v43.default.string(), FieldReference])).optional(),
2126
2272
  timeout: import_v43.default.number().default(15e3).describe("Request timeout in milliseconds")
2127
2273
  })
2128
- }).describe("HTTP request function triggered by a button click or other event");
2274
+ }).meta({
2275
+ 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.",
2276
+ id: "HttpField"
2277
+ });
2129
2278
  var AutocompleteField = BaseField.extend({
2130
2279
  type: import_v43.default.literal(FieldType.AUTOCOMPLETE),
2131
2280
  configuration: import_v43.default.object({
2132
- url: import_v43.default.string().describe("URL to fetch autocomplete suggestions from").optional(),
2281
+ url: import_v43.default.string().describe(
2282
+ "URL to fetch autocomplete suggestions from. This should be a country config server endpoint."
2283
+ ).optional(),
2133
2284
  method: import_v43.default.enum(["GET", "POST"]).default("GET").optional(),
2134
2285
  defaultOptions: import_v43.default.array(
2135
2286
  import_v43.default.object({
2136
2287
  label: import_v43.default.string(),
2137
2288
  value: import_v43.default.string()
2138
2289
  })
2139
- ).optional()
2290
+ ).optional().describe(
2291
+ "Manual entry is supported through configuration, allowing users to provide values not currently represented in the dataset."
2292
+ )
2140
2293
  })
2141
- }).describe("Autocomplete input field");
2294
+ }).meta({
2295
+ 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.",
2296
+ id: "AutocompleteField"
2297
+ });
2142
2298
  var SearchField = HttpField.extend({
2143
2299
  type: import_v43.default.literal(FieldType.SEARCH),
2144
2300
  configuration: SearchQuery.pick({
@@ -2171,6 +2327,9 @@ var SearchField = HttpField.extend({
2171
2327
  ok: TranslationConfig.optional()
2172
2328
  }).optional()
2173
2329
  })
2330
+ }).meta({
2331
+ description: "A search input field",
2332
+ id: "SearchField"
2174
2333
  });
2175
2334
  var LinkButtonField = BaseField.extend({
2176
2335
  type: import_v43.default.literal(FieldType.LINK_BUTTON),
@@ -2179,28 +2338,35 @@ var LinkButtonField = BaseField.extend({
2179
2338
  text: TranslationConfig.describe("Text to display on the button"),
2180
2339
  icon: import_v43.default.string().optional().describe("Icon for the button. You can find icons from OpenCRVS UI-Kit.")
2181
2340
  })
2182
- }).describe("Button that opens a link");
2341
+ }).meta({
2342
+ description: "A button that opens a URL link",
2343
+ id: "LinkButtonField"
2344
+ });
2183
2345
  var VerificationStatus = BaseField.extend({
2184
2346
  type: import_v43.default.literal(FieldType.VERIFICATION_STATUS),
2185
- defaultValue: VerificationStatusValue.optional(),
2347
+ defaultValue: VerificationStatusValue.or(ComputedDefaultValue).optional(),
2186
2348
  configuration: import_v43.default.object({
2187
2349
  status: TranslationConfig.describe("Text to display on the status pill."),
2188
2350
  description: TranslationConfig.describe(
2189
2351
  "Explaining text on the banner in form."
2190
2352
  )
2191
2353
  })
2354
+ }).meta({
2355
+ 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.",
2356
+ id: "VerificationStatus"
2192
2357
  });
2193
2358
  var QueryParamReaderField = BaseField.extend({
2194
2359
  type: import_v43.default.literal(FieldType.QUERY_PARAM_READER),
2195
2360
  configuration: import_v43.default.object({
2196
2361
  pickParams: import_v43.default.array(import_v43.default.string()).describe("List of query parameters to read from the URL")
2197
2362
  })
2198
- }).describe(
2199
- "A field that maps URL query params into form values and clears them afterward"
2200
- );
2363
+ }).meta({
2364
+ description: "A field that maps URL query params into form values and clears them afterward",
2365
+ id: "QueryParamReaderField"
2366
+ });
2201
2367
  var QrReaderField = BaseField.extend({
2202
2368
  type: import_v43.default.literal(FieldType.QR_READER),
2203
- defaultValue: QrReaderFieldValue.optional(),
2369
+ defaultValue: QrReaderFieldValue.or(ComputedDefaultValue).optional(),
2204
2370
  configuration: import_v43.default.object({
2205
2371
  validator: import_v43.default.any().meta({
2206
2372
  description: "JSON Schema to validate the scanned QR code data against before populating the form fields.",
@@ -2208,21 +2374,27 @@ var QrReaderField = BaseField.extend({
2208
2374
  })
2209
2375
  }).optional()
2210
2376
  }).meta({
2211
- description: "Configuration for QR code reader field, including optional JSON Schema validator.",
2377
+ description: "QR code reader field, including optional JSON Schema validator.",
2212
2378
  id: "QrReaderField"
2213
2379
  });
2214
2380
  var IdReaderField = BaseField.extend({
2215
2381
  type: import_v43.default.literal(FieldType.ID_READER),
2216
- defaultValue: IdReaderFieldValue.optional(),
2382
+ defaultValue: IdReaderFieldValue.or(ComputedDefaultValue).optional(),
2217
2383
  methods: import_v43.default.array(
2218
2384
  import_v43.default.union([QrReaderField, LinkButtonField]).describe("Methods for reading an ID")
2219
2385
  )
2386
+ }).meta({
2387
+ description: "A wrapper around nested form fields, specifically QR_READER and LINK_BUTTON. It can hold the QR_READERs value.",
2388
+ id: "IdReaderField"
2220
2389
  });
2221
2390
  var CustomField = BaseField.extend({
2222
2391
  type: import_v43.default.literal(FieldType._EXPERIMENTAL_CUSTOM),
2223
2392
  defaultValue: CustomFieldValue.optional(),
2224
2393
  src: import_v43.default.string().describe("Module source path for the custom field component"),
2225
2394
  configuration: import_v43.default.unknown().optional()
2395
+ }).meta({
2396
+ description: "An expiremental custom field that is defined by a module source path",
2397
+ id: "CustomField"
2226
2398
  });
2227
2399
  var FieldStyleVariant = import_v43.default.enum(["default", "highlighted"]);
2228
2400
  var LoaderField = BaseField.extend({
@@ -2232,22 +2404,25 @@ var LoaderField = BaseField.extend({
2232
2404
  configuration: import_v43.default.object({
2233
2405
  text: TranslationConfig.describe("Display text above the loading spinner")
2234
2406
  })
2235
- }).describe(
2236
- "A non-interactive field that indicates an in progress operation in form"
2237
- );
2407
+ }).meta({
2408
+ description: "A non-interactive field that indicates an in progress operation in form",
2409
+ id: "LoaderField"
2410
+ });
2238
2411
  var HiddenField = BaseField.extend({
2239
2412
  type: import_v43.default.literal(FieldType.ALPHA_HIDDEN),
2240
2413
  required: import_v43.default.boolean().default(false).optional(),
2241
2414
  defaultValue: TextValue.optional()
2242
- }).describe(
2243
- "A non-interactive, hidden field that only hold a value in the form"
2244
- );
2415
+ }).meta({
2416
+ description: "A non-interactive, hidden field that only hold a value in the form",
2417
+ id: "HiddenField"
2418
+ });
2245
2419
  var UserRoleField = BaseField.extend({
2246
2420
  type: import_v43.default.literal(FieldType.USER_ROLE),
2247
2421
  defaultValue: TextValue.optional()
2248
- }).describe(
2249
- "A select dropdown that is automatically populated with available user roles"
2250
- );
2422
+ }).meta({
2423
+ description: "A select dropdown that is automatically populated with available user roles",
2424
+ id: "UserRoleField"
2425
+ });
2251
2426
  var FieldConfig = import_v43.default.discriminatedUnion("type", [
2252
2427
  FieldGroup,
2253
2428
  Address,
@@ -2346,16 +2521,19 @@ var VerificationPageConfig = FormPageConfig.extend({
2346
2521
  type: z21.literal(PageTypes.enum.VERIFICATION),
2347
2522
  actions: VerificationActionConfig
2348
2523
  });
2349
- var PageConfig = z21.discriminatedUnion("type", [
2350
- FormPageConfig,
2351
- VerificationPageConfig
2352
- ]);
2524
+ var PageConfig = z21.discriminatedUnion("type", [FormPageConfig, VerificationPageConfig]).meta({
2525
+ id: "PageConfig",
2526
+ 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."
2527
+ });
2353
2528
 
2354
2529
  // ../commons/src/events/FormConfig.ts
2355
2530
  var DeclarationFormConfig = z22.object({
2356
2531
  label: TranslationConfig.describe("Human readable description of the form"),
2357
2532
  pages: z22.array(FormPageConfig)
2358
- }).describe("Configuration of the declaration form.");
2533
+ }).meta({
2534
+ id: "DeclarationFormConfig",
2535
+ description: "Configuration of the declaration form."
2536
+ });
2359
2537
  var ActionFormConfig = z22.object({
2360
2538
  label: TranslationConfig.describe("Human readable description of the form"),
2361
2539
  pages: z22.array(PageConfig)
@@ -2455,6 +2633,9 @@ var DeduplicationConfig = z23.object({
2455
2633
  id: z23.string(),
2456
2634
  label: TranslationConfig,
2457
2635
  query: Clause
2636
+ }).meta({
2637
+ id: "DeduplicationConfig",
2638
+ 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."
2458
2639
  });
2459
2640
 
2460
2641
  // ../commons/src/events/ActionConfig.ts
@@ -2572,17 +2753,42 @@ var ActionConfig = z24.discriminatedUnion("type", [
2572
2753
  * OpenAPI references are defined here so our generated OpenAPI spec knows to reuse the models
2573
2754
  * and treat them as "models" instead of duplicating the data structure in each endpoint.
2574
2755
  */
2575
- ReadActionConfig.meta({ id: "ReadActionConfig" }),
2576
- DeclareConfig.meta({ id: "DeclareActionConfig" }),
2577
- RejectConfig.meta({ id: "RejectActionConfig" }),
2578
- RegisterConfig.meta({ id: "RegisterActionConfig" }),
2756
+ ReadActionConfig.meta({
2757
+ id: "ReadActionConfig",
2758
+ description: "Configuration for the read action \u2014 defines the record-tab content displayed on the event overview page."
2759
+ }),
2760
+ DeclareConfig.meta({
2761
+ id: "DeclareActionConfig",
2762
+ description: "Configuration for the declare action. Includes review-page fields. Shared with the notify action (ActionType.NOTIFY)."
2763
+ }),
2764
+ RejectConfig.meta({
2765
+ id: "RejectActionConfig",
2766
+ description: "Configuration for rejecting a record before registration."
2767
+ }),
2768
+ RegisterConfig.meta({
2769
+ id: "RegisterActionConfig",
2770
+ description: "Configuration for registering a record."
2771
+ }),
2579
2772
  PrintCertificateActionConfig.meta({
2580
- id: "PrintCertificateActionConfig"
2773
+ id: "PrintCertificateActionConfig",
2774
+ description: "Configuration for printing a certificate of a registered record."
2775
+ }),
2776
+ RequestCorrectionConfig.meta({
2777
+ id: "RequestCorrectionActionConfig",
2778
+ description: "Configuration for requesting a correction on a registered record."
2779
+ }),
2780
+ EditActionConfig.meta({
2781
+ id: "EditActionConfig",
2782
+ description: "Configuration for editing a record before registration."
2581
2783
  }),
2582
- RequestCorrectionConfig.meta({ id: "RequestCorrectionActionConfig" }),
2583
- EditActionConfig.meta({ id: "EditActionConfig" }),
2584
- ArchiveConfig.meta({ id: "ArchiveActionConfig" }),
2585
- CustomActionConfig.meta({ id: "CustomActionConfig" })
2784
+ ArchiveConfig.meta({
2785
+ id: "ArchiveActionConfig",
2786
+ description: "Configuration for archiving a record."
2787
+ }),
2788
+ CustomActionConfig.meta({
2789
+ id: "CustomActionConfig",
2790
+ description: "Configuration for a country-defined custom action. An event may include any number of these."
2791
+ })
2586
2792
  ]).describe(
2587
2793
  "Configuration of an action available for an event. Data collected depends on the action type and is accessible through the annotation property in ActionDocument."
2588
2794
  ).meta({ id: "ActionConfig" });
@@ -2658,7 +2864,10 @@ var Field = BaseField2.extend({
2658
2864
  }).describe("Custom field defined for the summary view.");
2659
2865
  var SummaryConfig = z27.object({
2660
2866
  fields: z27.array(z27.union([Field, ReferenceField])).describe("Fields displayed in the event summary view.")
2661
- }).describe("Configuration of the event summary section.");
2867
+ }).meta({
2868
+ id: "SummaryConfig",
2869
+ 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."
2870
+ });
2662
2871
 
2663
2872
  // ../commons/src/events/AdvancedSearchConfig.ts
2664
2873
  var z28 = __toESM(require("zod/v4"));
@@ -2729,6 +2938,9 @@ var BaseField3 = z28.object({
2729
2938
  ),
2730
2939
  validations: z28.array(ValidationConfig).optional().describe(
2731
2940
  `Option for overriding the field validations specifically for advanced search form.`
2941
+ ),
2942
+ allowedLocations: JurisdictionReference.optional().describe(
2943
+ `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.`
2732
2944
  )
2733
2945
  });
2734
2946
  var SearchQueryParams = z28.object({
@@ -2782,6 +2994,9 @@ var AdvancedSearchField = z28.discriminatedUnion("fieldType", [FieldConfigSchema
2782
2994
  var AdvancedSearchConfig = z28.object({
2783
2995
  title: TranslationConfig.describe("Advanced search tab title"),
2784
2996
  fields: z28.array(AdvancedSearchField).describe("Advanced search fields within the tab.")
2997
+ }).meta({
2998
+ id: "AdvancedSearchConfig",
2999
+ 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()`)."
2785
3000
  });
2786
3001
 
2787
3002
  // ../commons/src/events/utils.ts
@@ -2832,7 +3047,37 @@ function resolveDataPath(rootData, dataPath, instancePath) {
2832
3047
  }
2833
3048
  return current;
2834
3049
  }
3050
+ function todayISO() {
3051
+ return (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" });
3052
+ }
3053
+ var compiledFunctionCache = /* @__PURE__ */ new Map();
3054
+ function compileClientFunction(code) {
3055
+ let fn = compiledFunctionCache.get(code);
3056
+ if (!fn) {
3057
+ fn = new Function(`return (${code})`)();
3058
+ compiledFunctionCache.set(code, fn);
3059
+ }
3060
+ return fn;
3061
+ }
2835
3062
  (0, import_ajv_formats.default)(ajv);
3063
+ function buildClientFunctionContext(input) {
3064
+ return {
3065
+ $form: input.form,
3066
+ $now: todayISO(),
3067
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
3068
+ $online: isOnline(),
3069
+ $user: input.validatorContext?.user,
3070
+ $event: input.validatorContext?.event,
3071
+ $leafAdminStructureLocationIds: input.validatorContext?.leafAdminStructureLocationIds ?? [],
3072
+ user: input.systemVariables?.user,
3073
+ $window: input.systemVariables?.$window,
3074
+ locations: input.locations,
3075
+ adminLevelIds: input.adminLevelIds
3076
+ };
3077
+ }
3078
+ function runClientFunction(code, data, context) {
3079
+ return compileClientFunction(code)(data, context);
3080
+ }
2836
3081
  ajv.addKeyword({
2837
3082
  keyword: "daysFromDate",
2838
3083
  type: "string",
@@ -2877,12 +3122,35 @@ ajv.addKeyword({
2877
3122
  $data: true,
2878
3123
  errors: true,
2879
3124
  // @ts-ignore -- Force type. We will move this away from AJV next. Parsing the array will take seconds and is only called by core.
2880
- validate(schema, data, _2, dataContext) {
3125
+ validate(_schema, data, _2, dataContext) {
2881
3126
  const locationIdInput = data;
2882
3127
  const locations = dataContext?.rootData.$leafAdminStructureLocationIds ?? [];
2883
3128
  return locations.some((location) => location.id === locationIdInput);
2884
3129
  }
2885
3130
  });
3131
+ ajv.addKeyword({
3132
+ keyword: "customClientValidator",
3133
+ schemaType: "object",
3134
+ errors: true,
3135
+ // @ts-expect-error -- AJV's public types don't expose `rootData`. All
3136
+ // `validate()` callers build root data via `buildClientFunctionContext`,
3137
+ // so the cast holds.
3138
+ validate(schema, data, _2, dataContext) {
3139
+ return Boolean(
3140
+ runClientFunction(
3141
+ schema.code,
3142
+ data,
3143
+ dataContext?.rootData ?? buildClientFunctionContext({ form: {} })
3144
+ )
3145
+ );
3146
+ }
3147
+ });
3148
+ function isOnline() {
3149
+ if (typeof window !== "undefined" && typeof navigator !== "undefined") {
3150
+ return navigator.onLine;
3151
+ }
3152
+ return true;
3153
+ }
2886
3154
 
2887
3155
  // ../commons/src/utils.ts
2888
3156
  var z32 = __toESM(require("zod/v4"));
@@ -3501,7 +3769,54 @@ function createFieldConditionals(fieldId) {
3501
3769
  }
3502
3770
  },
3503
3771
  required: [fieldId]
3504
- })
3772
+ }),
3773
+ /**
3774
+ * Custom client-side validator. The provided function is serialised and executed
3775
+ * just-in-time on the client only. External references (e.g. lodash) are not
3776
+ * available inside the function body — all logic must be self-contained.
3777
+ *
3778
+ * @example
3779
+ * field('nid').customClientValidator((value) => {
3780
+ * // LUHN check — all logic must be inline
3781
+ * const digits = String(value).split('').map(Number)
3782
+ * // ...
3783
+ * return isValid
3784
+ * })
3785
+ */
3786
+ customClientValidator(validationFn) {
3787
+ const code = validationFn.toString();
3788
+ return defineFormConditional({
3789
+ type: "object",
3790
+ properties: wrapToPath(
3791
+ { [fieldId]: { customClientValidator: { code } } },
3792
+ this.$$subfield
3793
+ ),
3794
+ required: [fieldId]
3795
+ });
3796
+ },
3797
+ /**
3798
+ * Custom client-side evaluation. Returns a {@link FieldReference} descriptor
3799
+ * that can be used as the `value` property or a DATA component entry.
3800
+ * The function receives the referenced field's value as the first argument and
3801
+ * the full form context as the second; its return value replaces the field reference.
3802
+ * The function is serialised and executed just-in-time on the client only.
3803
+ * External references (e.g. lodash) are not available inside the function body.
3804
+ *
3805
+ * For computing a default value without referencing a specific field, use
3806
+ * `evaluate(fn)` in the `defaultValue` property instead.
3807
+ *
3808
+ * @example
3809
+ * field('a').customClientEvaluation((aValue, ctx) =>
3810
+ * Number(aValue) + Number(ctx.$form.b)
3811
+ * )
3812
+ */
3813
+ customClientEvaluation(computationFn) {
3814
+ return {
3815
+ $$code: computationFn.toString(),
3816
+ $$field: fieldId,
3817
+ $$subfield: this.$$subfield
3818
+ };
3819
+ }
3505
3820
  };
3506
3821
  }
3507
3822
 
@@ -3649,7 +3964,7 @@ var _EventConfigBase = z33.object({
3649
3964
  ),
3650
3965
  label: TranslationConfig.describe("Human-readable label for the event type."),
3651
3966
  actions: z33.array(ActionConfig).describe(
3652
- "Configuration of system-defined actions associated with the event."
3967
+ "Configuration of core and custom actions associated with the event."
3653
3968
  ),
3654
3969
  actionOrder: z33.array(z33.string()).optional().describe(
3655
3970
  "Order of actions in the action menu. Use either the action type for core actions or the customActionType for custom actions."
@@ -3661,7 +3976,7 @@ var _EventConfigBase = z33.object({
3661
3976
  "Configuration of fields available in the advanced search feature."
3662
3977
  ),
3663
3978
  flags: z33.array(FlagConfig).optional().default([]).describe(
3664
- "Configuration of flags associated with the actions of this event type."
3979
+ "Configuration of custom flags associated with the actions of this event type."
3665
3980
  ),
3666
3981
  analytics: z33.boolean().optional().default(true).describe(
3667
3982
  "Indicates whether the records of this event type are included in analytics"
@@ -3674,8 +3989,9 @@ var EventConfig = _EventConfigBase.superRefine((event2, ctx) => {
3674
3989
  validateActionFlags(event2, ctx);
3675
3990
  validateActionOrder(event2, ctx);
3676
3991
  }).meta({
3677
- id: "EventConfig"
3678
- }).describe("Configuration defining an event type.");
3992
+ id: "EventConfig",
3993
+ description: "Configuration defining an event type registered in OpenCRVS (for example birth or death)."
3994
+ });
3679
3995
 
3680
3996
  // ../commons/src/events/EventConfigInput.ts
3681
3997
  var defineDeclarationForm = (form) => DeclarationFormConfig.parse(form);
@@ -3897,6 +4213,9 @@ var WorkqueueColumnValue = z34.object({
3897
4213
  var WorkqueueColumn = z34.object({
3898
4214
  label: TranslationConfig,
3899
4215
  value: WorkqueueColumnValue
4216
+ }).meta({
4217
+ id: "WorkqueueColumn",
4218
+ description: "Configuration for a single workqueue column. The value references an event metadata key (e.g. `dateOfEvent`, `status`, `trackingId`)."
3900
4219
  });
3901
4220
  function defineWorkqueuesColumns(workqueueColumns) {
3902
4221
  return workqueueColumns.map(
@@ -4099,18 +4418,11 @@ var WorkqueueConfigWithoutQuery = WorkqueueConfig.omit({
4099
4418
  query: true,
4100
4419
  columns: true
4101
4420
  });
4102
- var WorkqueueConfigInput = z37.object({
4103
- slug: z37.string().describe("Determines the url of the workqueue."),
4104
- name: TranslationConfig.describe(
4105
- "Title of the workflow (both in navigation and on the page)"
4106
- ),
4107
- query: CountryConfigQueryInputType,
4108
- action: z37.object({ type: WorkqueueActionType }).optional().describe(
4109
- "Workqueue call-to-action button configuration. This determines the quick action button shown on each event card and the action taken when the button is clicked."
4110
- ),
4111
- columns: z37.array(WorkqueueColumn).default(mandatoryColumns),
4112
- icon: AvailableIcons,
4113
- emptyMessage: TranslationConfig.optional()
4421
+ var WorkqueueConfigInput = WorkqueueConfig.extend({
4422
+ query: CountryConfigQueryInputType
4423
+ }).meta({
4424
+ id: "WorkqueueConfig",
4425
+ 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."
4114
4426
  });
4115
4427
  var WorkqueueCountInput = z37.array(
4116
4428
  z37.object({ slug: z37.string(), query: QueryType })
@@ -4150,6 +4462,11 @@ var BaseActionInput = z38.object({
4150
4462
  originalActionId: UUID.optional(),
4151
4463
  // should not be part of base action.
4152
4464
  keepAssignment: z38.boolean().optional(),
4465
+ keepAssignmentIfAccepted: z38.boolean().optional(),
4466
+ keepAssignmentIfRejected: z38.boolean().optional(),
4467
+ waitFor: z38.boolean().default(true).describe(
4468
+ "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."
4469
+ ),
4153
4470
  // For normal users, the createdAtLocation is resolved on the backend from the user's primaryOfficeId.
4154
4471
  // @TODO: createdAtLocation should be limited to actions that system users can perform. For normal users, it should not be part of the base action.
4155
4472
  createdAtLocation: UUID.nullish().describe(
@@ -4267,7 +4584,8 @@ var RejectCorrectionActionInput = BaseActionInput.extend(
4267
4584
  var ApproveCorrectionActionInput = BaseActionInput.extend(
4268
4585
  z38.object({
4269
4586
  requestId: z38.string(),
4270
- type: z38.literal(ActionType.APPROVE_CORRECTION).default(ActionType.APPROVE_CORRECTION)
4587
+ type: z38.literal(ActionType.APPROVE_CORRECTION).default(ActionType.APPROVE_CORRECTION),
4588
+ content: z38.object({ immediateCorrection: z38.boolean().optional() }).optional()
4271
4589
  }).shape
4272
4590
  );
4273
4591
  var ReadActionInput = BaseActionInput.extend(
@@ -4329,7 +4647,7 @@ var Draft = z39.object({
4329
4647
  }).describe(
4330
4648
  "A temporary storage for an action. Stored with details of the event, creator and creation time."
4331
4649
  );
4332
- var DraftInput = BaseActionInput.extend({
4650
+ var DraftInput = BaseActionInput.omit({ waitFor: true }).extend({
4333
4651
  type: ActionTypes.exclude([ActionTypes.enum.DELETE]),
4334
4652
  status: z39.enum([
4335
4653
  ActionStatus.Requested,
@@ -6927,6 +7245,369 @@ var ACTION_FILTERS = {
6927
7245
  // ../commons/src/events/FileUtils.ts
6928
7246
  var import_lodash7 = require("lodash");
6929
7247
 
7248
+ // ../commons/src/events/mocks.test.utils.ts
7249
+ var V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS = [
7250
+ {
7251
+ id: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7252
+ name: "Central",
7253
+ parentId: null,
7254
+ validUntil: null,
7255
+ externalId: "ydyJb1RAy4U1"
7256
+ },
7257
+ {
7258
+ id: "c599b691-fd2d-45e1-abf4-d185de727fb5",
7259
+ name: "Sulaka",
7260
+ parentId: null,
7261
+ validUntil: null,
7262
+ externalId: "pQ8nGxWmZ2Q3"
7263
+ },
7264
+ {
7265
+ id: "7ef2b9c7-5e6d-49f6-ae05-656207d0fc64",
7266
+ name: "Pualula",
7267
+ parentId: null,
7268
+ validUntil: null,
7269
+ externalId: "Aq91DweLmT8k"
7270
+ },
7271
+ {
7272
+ id: "6d1a59df-988c-4021-a846-ccbc021931a7",
7273
+ name: "Chuminga",
7274
+ parentId: null,
7275
+ validUntil: null,
7276
+ externalId: "Rw0fYNh2Xk9a"
7277
+ },
7278
+ {
7279
+ id: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7280
+ name: "Ibombo",
7281
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7282
+ validUntil: null,
7283
+ externalId: "k7DsP4vbN1Qe"
7284
+ },
7285
+ {
7286
+ id: "27160bbd-32d1-4625-812f-860226bfb92a",
7287
+ name: "Isango",
7288
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7289
+ validUntil: null,
7290
+ externalId: "Gm3Z9eQpHw4L"
7291
+ },
7292
+ {
7293
+ id: "967032fd-3f81-478a-826c-30cb8fe121bd",
7294
+ name: "Isamba",
7295
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7296
+ validUntil: null,
7297
+ externalId: "sT0xVu1KqJ7r"
7298
+ },
7299
+ {
7300
+ id: "89a33893-b17d-481d-a26d-6461e7ac1651",
7301
+ name: "Itambo",
7302
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7303
+ validUntil: null,
7304
+ externalId: "Nq6Bv2HpL9Te"
7305
+ },
7306
+ {
7307
+ id: "d42ab2fe-e7ed-470e-8b31-4fb27f9b8250",
7308
+ name: "Ezhi",
7309
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7310
+ validUntil: null,
7311
+ externalId: "xK8cQ0ZRy5Wd"
7312
+ },
7313
+ {
7314
+ id: "8fbd09d2-212b-47f4-beb3-5e1694931d9f",
7315
+ name: "Ilanga",
7316
+ parentId: "c599b691-fd2d-45e1-abf4-d185de727fb5",
7317
+ validUntil: null,
7318
+ externalId: "Cq4Jm1XvN8Ls"
7319
+ },
7320
+ // Villages under Ibombo (62a0ccb4-880d-4f30-8882-f256007dfff9)
7321
+ {
7322
+ id: "1d4e5f6a-7b8c-4912-8efa-345678901234",
7323
+ name: "Klow",
7324
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7325
+ validUntil: null,
7326
+ externalId: "IkYcYBUcyY2"
7327
+ },
7328
+ {
7329
+ id: "2e5f6a7b-8c9d-4a23-8fab-456789012345",
7330
+ name: "Mbondo",
7331
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7332
+ validUntil: null,
7333
+ externalId: "Qhvv5hvo3mY"
7334
+ },
7335
+ {
7336
+ id: "3f6a7b8c-9d0e-4b34-8abc-567890123456",
7337
+ name: "Ndara",
7338
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7339
+ validUntil: null,
7340
+ externalId: "crXh068O9TR"
7341
+ },
7342
+ {
7343
+ id: "4a7b8c9d-0e1f-4c45-abcd-678901234567",
7344
+ name: "Olani",
7345
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7346
+ validUntil: null,
7347
+ externalId: "r00It8Tvvp7"
7348
+ },
7349
+ {
7350
+ id: "5b8c9d0e-1f2a-4d56-bcde-789012345678",
7351
+ name: "Pemba",
7352
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7353
+ validUntil: null,
7354
+ externalId: "ZnUWsbONIaH"
7355
+ },
7356
+ {
7357
+ id: "6c9d0e1f-2a3b-4e67-8def-890123456789",
7358
+ name: "Quanza",
7359
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7360
+ validUntil: null,
7361
+ externalId: "fDZycvQTa7l"
7362
+ },
7363
+ {
7364
+ id: "7d0e1f2a-3b4c-4f78-8efa-901234567890",
7365
+ name: "Rivka",
7366
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7367
+ validUntil: null,
7368
+ externalId: "KqswxCGTELa"
7369
+ },
7370
+ // Villages under Isamba (967032fd-3f81-478a-826c-30cb8fe121bd)
7371
+ {
7372
+ id: "8e1f2a3b-4c5d-4089-8fab-012345678901",
7373
+ name: "Mbula",
7374
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7375
+ validUntil: null,
7376
+ externalId: "osEbKjRc9Kg"
7377
+ },
7378
+ {
7379
+ id: "9f2a3b4c-5d6e-4190-8abf-123456789012",
7380
+ name: "Ndoki",
7381
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7382
+ validUntil: null,
7383
+ externalId: "aq4daBUAGr3"
7384
+ },
7385
+ {
7386
+ id: "0a3b4c5d-6e7f-4201-abcd-234567890123",
7387
+ name: "Tsanga",
7388
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7389
+ validUntil: null,
7390
+ externalId: "cqis6Y8trbJ"
7391
+ },
7392
+ {
7393
+ id: "1b4c5d6e-7f8a-4312-bcde-345678901234",
7394
+ name: "Waziri",
7395
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7396
+ validUntil: null,
7397
+ externalId: "LMijHPyyx6d"
7398
+ },
7399
+ {
7400
+ id: "2c5d6e7f-8a9b-4423-8def-456789012345",
7401
+ name: "Zimbi",
7402
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7403
+ validUntil: null,
7404
+ externalId: "pcQYbPuKGZ7"
7405
+ },
7406
+ // Villages under Itambo (89a33893-b17d-481d-a26d-6461e7ac1651)
7407
+ {
7408
+ id: "3d6e7f8a-9b0c-4534-8efa-567890123456",
7409
+ name: "Felani",
7410
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7411
+ validUntil: null,
7412
+ externalId: "gSqpoCGdMXp"
7413
+ },
7414
+ {
7415
+ id: "4e7f8a9b-0c1d-4645-8fab-678901234567",
7416
+ name: "Goroma",
7417
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7418
+ validUntil: null,
7419
+ externalId: "KvAAIaNqVrp"
7420
+ },
7421
+ {
7422
+ id: "5f8a9b0c-1d2e-4756-8abc-789012345678",
7423
+ name: "Halifu",
7424
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7425
+ validUntil: null,
7426
+ externalId: "qe4UnEVt1hv"
7427
+ },
7428
+ {
7429
+ id: "6a9b0c1d-2e3f-4867-abcd-890123456789",
7430
+ name: "Jabari",
7431
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7432
+ validUntil: null,
7433
+ externalId: "yHH9Nz4rLOt"
7434
+ },
7435
+ {
7436
+ id: "7b0c1d2e-3f4a-4978-bcde-901234567890",
7437
+ name: "Kifani",
7438
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7439
+ validUntil: null,
7440
+ externalId: "eSWmXIGeu1I"
7441
+ },
7442
+ {
7443
+ id: "8c1d2e3f-4a5b-4089-8def-012345678901",
7444
+ name: "Lumela",
7445
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7446
+ validUntil: null,
7447
+ externalId: "bh0b3aI1uP3"
7448
+ }
7449
+ ];
7450
+ var V2_DEFAULT_MOCK_LOCATIONS = [
7451
+ {
7452
+ id: "6f6186ce-cd5f-4a5f-810a-2d99e7c4ba12",
7453
+ name: "Central Provincial Office",
7454
+ locationType: "CRVS_OFFICE",
7455
+ administrativeAreaId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7456
+ validUntil: null,
7457
+ externalId: "Xr3Df8WpK6Ys"
7458
+ },
7459
+ {
7460
+ id: "b1c2d3e4-f5a6-7890-bcde-f12345678901",
7461
+ name: "Central Health Post",
7462
+ locationType: "HEALTH_FACILITY",
7463
+ administrativeAreaId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7464
+ validUntil: null
7465
+ },
7466
+ {
7467
+ id: "028d2c85-ca31-426d-b5d1-2cef545a4902",
7468
+ name: "Ibombo District Office",
7469
+ locationType: "CRVS_OFFICE",
7470
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7471
+ validUntil: null,
7472
+ externalId: "Sm4Nw7GrD2Vy"
7473
+ },
7474
+ {
7475
+ id: "62a0ccb4-4f30-4f30-8882-f256007dff9f",
7476
+ name: "Isamba District Office",
7477
+ locationType: "CRVS_OFFICE",
7478
+ administrativeAreaId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7479
+ validUntil: null,
7480
+ externalId: "Vg1Bq5XeH9Lt"
7481
+ },
7482
+ {
7483
+ id: "954c93e1-13f7-4435-bb82-35e0e215e07d",
7484
+ name: "Isango District Office",
7485
+ locationType: "CRVS_OFFICE",
7486
+ administrativeAreaId: "27160bbd-32d1-4625-812f-860226bfb92a",
7487
+ validUntil: null,
7488
+ externalId: "Je7Lm2XqN9Vz"
7489
+ },
7490
+ {
7491
+ id: "2884f5b9-17b4-49ce-bf4d-f538228935df",
7492
+ name: "Sulaka Provincial Office",
7493
+ locationType: "CRVS_OFFICE",
7494
+ administrativeAreaId: "c599b691-fd2d-45e1-abf4-d185de727fb5",
7495
+ validUntil: null,
7496
+ externalId: "Ht2Wp9KcX5Qv"
7497
+ },
7498
+ {
7499
+ id: "030358c6-54af-44be-821b-8e4af963a49c",
7500
+ name: "Ilanga District Office",
7501
+ locationType: "CRVS_OFFICE",
7502
+ administrativeAreaId: "8fbd09d2-212b-47f4-beb3-5e1694931d9f",
7503
+ validUntil: null,
7504
+ externalId: "Yp6Ds1WqN3Xz"
7505
+ },
7506
+ {
7507
+ id: "423d000f-101b-47c0-8b86-21a908067cee",
7508
+ name: "Chamakubi Health Post",
7509
+ locationType: "HEALTH_FACILITY",
7510
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7511
+ validUntil: null,
7512
+ externalId: "M1nFr8LbC2Qy"
7513
+ },
7514
+ {
7515
+ id: "4d3279be-d026-420c-88f7-f0a4ae986973",
7516
+ name: "Ibombo Rural Health Centre",
7517
+ locationType: "HEALTH_FACILITY",
7518
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7519
+ validUntil: null,
7520
+ externalId: "bT7pV6YrW0Xc"
7521
+ },
7522
+ {
7523
+ id: "190902f4-1d77-476a-8947-41145af1db7d",
7524
+ name: "Chikobo Rural Health Centre",
7525
+ locationType: "HEALTH_FACILITY",
7526
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7527
+ validUntil: null,
7528
+ externalId: "zE4qPn2SgJ5d"
7529
+ },
7530
+ {
7531
+ id: "f5ecbd9b-a01e-4a65-910e-70e86ab41b71",
7532
+ name: "Chilochabalenje Health Post",
7533
+ locationType: "HEALTH_FACILITY",
7534
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7535
+ validUntil: null,
7536
+ externalId: "H8vDs1MqR4Uf"
7537
+ },
7538
+ {
7539
+ id: "dbfc178f-7295-4b90-b28d-111c95b03127",
7540
+ name: "Chipeso Rural Health Centre",
7541
+ locationType: "HEALTH_FACILITY",
7542
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7543
+ validUntil: null,
7544
+ externalId: "Qw3uZ9KfX6Lm"
7545
+ },
7546
+ {
7547
+ id: "09862bfe-c7ac-46cd-987b-668681533c80",
7548
+ name: "Chisamba Rural Health Centre",
7549
+ locationType: "HEALTH_FACILITY",
7550
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7551
+ validUntil: null,
7552
+ externalId: "Yr0pCg8LdM2s"
7553
+ },
7554
+ {
7555
+ id: "834ce389-e95b-4fb0-96a0-33e9ab323059",
7556
+ name: "Chitanda Rural Health Centre",
7557
+ locationType: "HEALTH_FACILITY",
7558
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7559
+ validUntil: null,
7560
+ externalId: "tS9gJ4PwB1Qx"
7561
+ },
7562
+ {
7563
+ id: "0431c433-6062-4a4c-aee9-25271aec61ee",
7564
+ name: "Golden Valley Rural Health Centre",
7565
+ locationType: "HEALTH_FACILITY",
7566
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7567
+ validUntil: null,
7568
+ externalId: "Ld7Qm3XsA8Vr"
7569
+ },
7570
+ {
7571
+ id: "bc84d0b6-7ba7-480d-a339-5d9920d90eb2",
7572
+ name: "Ipongo Rural Health Centre",
7573
+ locationType: "HEALTH_FACILITY",
7574
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7575
+ validUntil: null,
7576
+ externalId: "kF2sW9DmH0Bt"
7577
+ },
7578
+ {
7579
+ id: "4cf1f53b-b730-41d2-8649-dff7eeed970d",
7580
+ name: "Itumbwe Health Post",
7581
+ locationType: "HEALTH_FACILITY",
7582
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7583
+ validUntil: null,
7584
+ externalId: "Ue5Xb3VaC7Pq"
7585
+ },
7586
+ {
7587
+ id: "4b3676cb-9355-4942-9eb9-2ce46acaf0e0",
7588
+ name: "Kabangalala Rural Health Centre",
7589
+ locationType: "HEALTH_FACILITY",
7590
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7591
+ validUntil: null,
7592
+ externalId: "Pz8Kc1TqH6Jn"
7593
+ },
7594
+ // Village offices
7595
+ {
7596
+ id: "1f4a5b6c-7d8e-4312-8abc-345678901234",
7597
+ name: "Klow Village Office",
7598
+ locationType: "CRVS_OFFICE",
7599
+ administrativeAreaId: "1d4e5f6a-7b8c-4912-8efa-345678901234",
7600
+ validUntil: null,
7601
+ externalId: "PmAyxAJkxiJ"
7602
+ }
7603
+ ];
7604
+ var V2_DEFAULT_MOCK_LOCATIONS_MAP = new Map(
7605
+ V2_DEFAULT_MOCK_LOCATIONS.map((l) => [l.id, l])
7606
+ );
7607
+ var V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS_MAP = new Map(
7608
+ V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS.map((a) => [a.id, a])
7609
+ );
7610
+
6930
7611
  // ../commons/src/notification/UserNotifications.ts
6931
7612
  var z44 = __toESM(require("zod/v4"));
6932
7613
  var TriggerEvent = {