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

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 (36) hide show
  1. package/create-countryconfig/index.js +50 -20
  2. package/create-countryconfig/package.json +12 -2
  3. package/dist/application-config/index.js +250 -97
  4. package/dist/cli.js +10 -4
  5. package/dist/commons/api/router.d.ts +107 -21
  6. package/dist/commons/application-config/index.d.ts +1 -0
  7. package/dist/commons/conditionals/conditionals.d.ts +354 -4
  8. package/dist/commons/conditionals/validate.d.ts +51 -2
  9. package/dist/commons/events/ActionConfig.d.ts +28 -2
  10. package/dist/commons/events/ActionDocument.d.ts +6 -0
  11. package/dist/commons/events/ActionInput.d.ts +42 -36
  12. package/dist/commons/events/AdvancedSearchConfig.d.ts +342 -0
  13. package/dist/commons/events/Draft.d.ts +2 -3
  14. package/dist/commons/events/EventDocument.d.ts +3 -0
  15. package/dist/commons/events/FieldConfig.d.ts +378 -50
  16. package/dist/commons/events/FieldType.d.ts +1 -0
  17. package/dist/commons/events/FieldTypeMapping.d.ts +1 -1
  18. package/dist/commons/events/FieldValue.d.ts +6 -0
  19. package/dist/commons/events/WorkqueueConfig.d.ts +5 -5
  20. package/dist/commons/events/field.d.ts +53 -1
  21. package/dist/commons/events/index.d.ts +2 -0
  22. package/dist/commons/events/state/flags.d.ts +16 -0
  23. package/dist/commons/events/state/utils.d.ts +12 -287
  24. package/dist/commons/events/utils.d.ts +12 -1
  25. package/dist/conditionals/index.js +52 -1
  26. package/dist/events/index.js +1035 -222
  27. package/dist/migrations/v2.0/checkout-upstream-files.d.ts +1 -1
  28. package/dist/migrations/v2.0/checkout-upstream-files.d.ts.map +1 -1
  29. package/dist/migrations/v2.0/checkout-upstream-files.js +1 -1
  30. package/dist/migrations/v2.0/index.js +10 -4
  31. package/dist/notification/index.js +869 -120
  32. package/dist/scopes/index.d.ts +4 -6
  33. package/dist/scopes/index.js +9 -3
  34. package/opencrvs-toolkit-2.0.0-rc.ff1424b.tgz +0 -0
  35. package/package.json +6 -2
  36. package/opencrvs-toolkit-2.0.0-rc.ff04b30.tgz +0 -0
@@ -655,8 +655,8 @@ var ActionConditional = z7.discriminatedUnion("type", [
655
655
  // Action can be shown to the user in the list but as disabled
656
656
  EnableConditional
657
657
  ]).meta({
658
- description: "Action conditional configuration",
659
- id: "ActionConditional"
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
660
  });
661
661
  var DisplayOnReviewConditional = z7.object({
662
662
  type: z7.literal(ConditionalType.DISPLAY_ON_REVIEW),
@@ -672,8 +672,8 @@ var FieldConditional = z7.discriminatedUnion("type", [
672
672
  // Field output can be shown / hidden on the review page
673
673
  DisplayOnReviewConditional
674
674
  ]).meta({
675
- description: "Field conditional configuration",
676
- 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."
677
677
  });
678
678
 
679
679
  // ../commons/src/events/FieldType.ts
@@ -770,6 +770,11 @@ var FieldTypesToHideInReview = [
770
770
  FieldType.ALPHA_PRINT_BUTTON,
771
771
  FieldType.ALPHA_HIDDEN
772
772
  ];
773
+ var HiddenFieldTypes = [
774
+ FieldType.HTTP,
775
+ FieldType.QUERY_PARAM_READER,
776
+ FieldType.ALPHA_HIDDEN
777
+ ];
773
778
 
774
779
  // ../commons/src/events/FieldValue.ts
775
780
  var z12 = __toESM(require("zod/v4"));
@@ -888,7 +893,7 @@ var PlainDate = import_zod.z.string().date().brand("PlainDate").describe("Date i
888
893
  // ../commons/src/events/FieldValue.ts
889
894
  var TextValue = z12.string();
890
895
  var HiddenFieldValue = z12.string();
891
- var NonEmptyTextValue = TextValue.min(1);
896
+ var NonEmptyTextValue = z12.string().trim().min(1);
892
897
  var DateValue = z12.iso.date().describe("Date in the format YYYY-MM-DD");
893
898
  var AgeValue = z12.object({
894
899
  age: z12.number(),
@@ -917,6 +922,7 @@ var DateRangeFieldValue = z12.object({
917
922
  var EmailValue = z12.email();
918
923
  var CheckboxFieldValue = z12.boolean();
919
924
  var NumberFieldValue = z12.number();
925
+ var SignatureFieldValue = FileFieldValue;
920
926
  var ButtonFieldValue = z12.number();
921
927
  var VerificationStatusValue = z12.enum([
922
928
  "verified",
@@ -1215,8 +1221,9 @@ var RequestedCorrectionAction = ActionBase.extend(
1215
1221
  var ApprovedCorrectionAction = ActionBase.extend(
1216
1222
  z14.object({
1217
1223
  type: z14.literal(ActionType.APPROVE_CORRECTION),
1218
- requestId: z14.string()
1224
+ requestId: z14.string(),
1219
1225
  // TODO move into 'content' property
1226
+ content: z14.object({ immediateCorrection: z14.boolean().optional() }).optional()
1220
1227
  }).shape
1221
1228
  );
1222
1229
  var RejectedCorrectionAction = ActionBase.extend(
@@ -1309,8 +1316,8 @@ var FlagConfig = z15.object({
1309
1316
  ),
1310
1317
  label: TranslationConfig.describe("Human readable label of the flag.")
1311
1318
  }).meta({
1312
- description: "Flag configuration",
1313
- id: "FlagConfig"
1319
+ id: "FlagConfig",
1320
+ description: "Configuration for a custom flag that can be added to or removed from records by event actions."
1314
1321
  });
1315
1322
  var ActionFlagConfig = z15.object({
1316
1323
  id: Flag,
@@ -1319,8 +1326,8 @@ var ActionFlagConfig = z15.object({
1319
1326
  "When conditional is met, the operation is performed on the flag. If not provided, the operation is performed unconditionally."
1320
1327
  )
1321
1328
  }).meta({
1322
- description: "Action flag configuration",
1323
- id: "ActionFlagConfig"
1329
+ id: "ActionFlagConfig",
1330
+ description: "Add or remove operation applied to a flag when the parent action is accepted. Optionally gated by a conditional."
1324
1331
  });
1325
1332
 
1326
1333
  // ../commons/src/events/EventMetadata.ts
@@ -1665,11 +1672,28 @@ var FieldReference = import_v43.default.object({
1665
1672
  $$field: FieldId.describe("Id of the field to reference"),
1666
1673
  $$subfield: import_v43.default.array(import_v43.default.string()).optional().default([]).describe(
1667
1674
  'If the FieldValue is an object, subfield can be used to refer to e.g. `["foo", "bar"]` in `{ foo: { bar: 3 } }`'
1675
+ ),
1676
+ $$code: import_v43.default.string().optional().describe(
1677
+ "Serialised client-side function body. When present the expression is evaluated rather than dereferenced."
1668
1678
  )
1669
- }).describe("Reference to a field by its ID");
1679
+ }).describe(
1680
+ "Reference to a field value, with an optional client-side computation applied."
1681
+ );
1682
+ var ComputedDefaultValue = import_v43.default.object({
1683
+ $$code: import_v43.default.string().describe(
1684
+ "Serialised client-side function body. Receives (undefined, context) where context includes $now, $online, and system variables."
1685
+ )
1686
+ }).describe("A context-only computation used as a field default value.");
1670
1687
  var ValidationConfig = import_v43.default.object({
1671
- validator: Conditional,
1672
- message: TranslationConfig
1688
+ validator: Conditional.describe(
1689
+ "Conditional expression that must hold for the field value to be considered valid."
1690
+ ),
1691
+ message: TranslationConfig.describe(
1692
+ "Error message displayed when the validator does not hold."
1693
+ )
1694
+ }).meta({
1695
+ id: "ValidationConfig",
1696
+ 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."
1673
1697
  });
1674
1698
  var requiredSchema = import_v43.default.union([
1675
1699
  import_v43.default.boolean(),
@@ -1700,7 +1724,7 @@ var BaseField = import_v43.default.object({
1700
1724
  "Indicates whether the field can be modified during record correction."
1701
1725
  ),
1702
1726
  value: FieldReference.or(import_v43.default.array(FieldReference)).optional().describe(
1703
- "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."
1727
+ "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."
1704
1728
  ),
1705
1729
  analytics: import_v43.default.boolean().default(false).optional().describe(
1706
1730
  "Indicates whether the field is included in analytics. When enabled, its value becomes available in the analytics dashboard."
@@ -1708,30 +1732,40 @@ var BaseField = import_v43.default.object({
1708
1732
  }).describe("Common properties shared across all field types.");
1709
1733
  var Divider = BaseField.extend({
1710
1734
  type: import_v43.default.literal(FieldType.DIVIDER)
1735
+ }).meta({
1736
+ description: "A horizontal line divider",
1737
+ id: "Divider"
1711
1738
  });
1712
1739
  var TextField = BaseField.extend({
1713
1740
  type: import_v43.default.literal(FieldType.TEXT),
1714
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
1741
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
1715
1742
  configuration: import_v43.default.object({
1716
1743
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
1717
1744
  type: import_v43.default.enum(["text", "password"]).optional(),
1718
1745
  prefix: TranslationConfig.optional(),
1719
1746
  postfix: TranslationConfig.optional()
1720
1747
  }).default({ type: "text" }).optional()
1721
- }).describe("Text input");
1748
+ }).meta({
1749
+ description: "A text input field",
1750
+ id: "TextField"
1751
+ });
1722
1752
  var NumberField = BaseField.extend({
1723
1753
  type: import_v43.default.literal(FieldType.NUMBER),
1724
- defaultValue: NumberFieldValue.optional(),
1754
+ defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
1725
1755
  configuration: import_v43.default.object({
1726
1756
  min: import_v43.default.number().optional().describe("Minimum value"),
1727
1757
  max: import_v43.default.number().optional().describe("Maximum value"),
1758
+ integer: import_v43.default.boolean().optional().describe("When true, only whole numbers are allowed"),
1728
1759
  prefix: TranslationConfig.optional(),
1729
1760
  postfix: TranslationConfig.optional()
1730
1761
  }).optional()
1731
- }).describe("Number input");
1762
+ }).meta({
1763
+ description: "A number input field",
1764
+ id: "NumberField"
1765
+ });
1732
1766
  var TextAreaField = BaseField.extend({
1733
1767
  type: import_v43.default.literal(FieldType.TEXTAREA),
1734
- defaultValue: NonEmptyTextValue.optional(),
1768
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
1735
1769
  configuration: import_v43.default.object({
1736
1770
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text"),
1737
1771
  rows: import_v43.default.number().optional().describe("Number of visible text lines"),
@@ -1739,7 +1773,10 @@ var TextAreaField = BaseField.extend({
1739
1773
  prefix: TranslationConfig.optional(),
1740
1774
  postfix: TranslationConfig.optional()
1741
1775
  }).default({ rows: 4 }).optional()
1742
- }).describe("Multiline text input");
1776
+ }).meta({
1777
+ description: "A multiline text input",
1778
+ id: "TextAreaField"
1779
+ });
1743
1780
  var ImageMimeType = import_v43.default.enum([
1744
1781
  "image/png",
1745
1782
  "image/jpg",
@@ -1762,58 +1799,76 @@ var SignatureField = BaseField.extend({
1762
1799
  signaturePromptLabel: TranslationConfig.describe(
1763
1800
  "Title of the signature modal"
1764
1801
  ),
1765
- defaultValue: FieldValue.optional(),
1802
+ defaultValue: SignatureFieldValue.or(ComputedDefaultValue).optional(),
1766
1803
  configuration: import_v43.default.object({
1767
1804
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
1768
1805
  acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature")
1769
1806
  }).default({
1770
1807
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
1771
1808
  })
1772
- }).describe("Signature input field");
1809
+ }).meta({
1810
+ description: "A signature input field",
1811
+ id: "SignatureField"
1812
+ });
1773
1813
  var EmailField = BaseField.extend({
1774
1814
  type: import_v43.default.literal(FieldType.EMAIL),
1775
1815
  configuration: import_v43.default.object({
1776
1816
  maxLength: import_v43.default.number().optional().describe("Maximum length of the text")
1777
1817
  }).default({ maxLength: 255 }).optional(),
1778
- defaultValue: NonEmptyTextValue.optional()
1818
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional()
1819
+ }).meta({
1820
+ description: "An email input field",
1821
+ id: "EmailField"
1779
1822
  });
1780
1823
  var DateField = BaseField.extend({
1781
1824
  type: import_v43.default.literal(FieldType.DATE),
1782
- defaultValue: SerializedNowDateTime.or(PlainDate).optional().describe("Default date value(yyyy-MM-dd)"),
1825
+ defaultValue: SerializedNowDateTime.or(PlainDate).or(ComputedDefaultValue).optional().describe("Default date value(yyyy-MM-dd)"),
1783
1826
  configuration: import_v43.default.object({
1784
1827
  notice: TranslationConfig.describe(
1785
1828
  "Text to display above the date input"
1786
1829
  ).optional()
1787
1830
  }).optional()
1788
- }).describe("A single date input (yyyy-MM-dd)");
1831
+ }).meta({
1832
+ description: "A date input (yyyy-MM-dd)",
1833
+ id: "DateField"
1834
+ });
1789
1835
  var AgeField = BaseField.extend({
1790
1836
  type: import_v43.default.literal(FieldType.AGE),
1791
- defaultValue: NumberFieldValue.optional(),
1837
+ defaultValue: NumberFieldValue.or(ComputedDefaultValue).optional(),
1792
1838
  configuration: import_v43.default.object({
1793
1839
  asOfDate: FieldReference,
1794
1840
  prefix: TranslationConfig.optional(),
1795
1841
  postfix: TranslationConfig.optional()
1796
1842
  })
1797
- }).describe("An age input field which uses the current date as the asOfDate");
1843
+ }).meta({
1844
+ description: "An age input field which uses the current date as the asOfDate",
1845
+ id: "AgeField"
1846
+ });
1798
1847
  var TimeField = BaseField.extend({
1799
1848
  type: import_v43.default.literal(FieldType.TIME),
1800
- defaultValue: SerializedNowDateTime.or(TimeValue).optional().describe("Default time value (HH-mm)"),
1849
+ defaultValue: SerializedNowDateTime.or(TimeValue).or(ComputedDefaultValue).optional().describe("Default time value (HH-mm)"),
1801
1850
  configuration: import_v43.default.object({
1802
1851
  use12HourFormat: import_v43.default.boolean().optional().describe("Whether to use 12-hour format"),
1803
1852
  notice: TranslationConfig.describe(
1804
1853
  "Text to display above the time input"
1805
1854
  ).optional()
1806
1855
  }).optional()
1807
- }).describe("A single date input (HH-mm)");
1856
+ }).meta({
1857
+ description: "A single time input (HH-mm)",
1858
+ id: "TimeField"
1859
+ });
1808
1860
  var DateRangeField = BaseField.extend({
1809
1861
  type: import_v43.default.literal(FieldType.DATE_RANGE),
1810
- defaultValue: DateRangeFieldValue.optional(),
1862
+ defaultValue: DateRangeFieldValue.or(ComputedDefaultValue).optional(),
1811
1863
  configuration: import_v43.default.object({
1812
1864
  notice: TranslationConfig.describe(
1813
1865
  "Text to display above the date input"
1814
1866
  ).optional()
1815
1867
  }).optional()
1816
- }).describe("A date range input ({ start: yyyy-MM-dd, end: yyyy-MM-dd })");
1868
+ }).meta({
1869
+ description: "A date range input ({ start: yyyy-MM-dd, end: yyyy-MM-dd })",
1870
+ id: "DateRangeField"
1871
+ });
1817
1872
  var HtmlFontVariant = import_v43.default.enum([
1818
1873
  "reg12",
1819
1874
  "reg14",
@@ -1857,21 +1912,33 @@ var ImageViewField = BaseField.extend({
1857
1912
  type: import_v43.default.literal(FieldType.IMAGE_VIEW),
1858
1913
  defaultValue: NonEmptyTextValue.optional(),
1859
1914
  configuration: ImageConfiguration
1860
- }).describe("A read-only image component for form pages");
1915
+ }).meta({
1916
+ description: "A read-only image component for form pages",
1917
+ id: "ImageViewField"
1918
+ });
1861
1919
  var Paragraph = BaseField.extend({
1862
1920
  type: import_v43.default.literal(FieldType.PARAGRAPH),
1863
1921
  configuration: ParagraphConfiguration
1864
- }).describe("A read-only HTML <p> paragraph");
1922
+ }).meta({
1923
+ description: "A read-only HTML <p> paragraph",
1924
+ id: "Paragraph"
1925
+ });
1865
1926
  var Heading = BaseField.extend({
1866
1927
  type: import_v43.default.literal(FieldType.HEADING),
1867
1928
  configuration: HeadingConfiguration
1868
- }).describe("A read-only heading component for form pages");
1929
+ }).meta({
1930
+ description: "A read-only heading component for form pages",
1931
+ id: "Heading"
1932
+ });
1869
1933
  var PageHeader = BaseField.extend({
1870
1934
  type: import_v43.default.literal(FieldType.PAGE_HEADER)
1871
- }).describe("A read-only header component for form pages");
1935
+ }).meta({
1936
+ description: "A read-only header component for form pages",
1937
+ id: "PageHeader"
1938
+ });
1872
1939
  var File = BaseField.extend({
1873
1940
  type: import_v43.default.literal(FieldType.FILE),
1874
- defaultValue: FileFieldValue.optional(),
1941
+ defaultValue: FileFieldValue.or(ComputedDefaultValue).optional(),
1875
1942
  configuration: import_v43.default.object({
1876
1943
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
1877
1944
  acceptedFileTypes: MimeType.array().optional().describe("List of allowed file formats for the signature"),
@@ -1887,7 +1954,10 @@ var File = BaseField.extend({
1887
1954
  }).default({
1888
1955
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
1889
1956
  })
1890
- }).describe("File upload");
1957
+ }).meta({
1958
+ description: "A file upload field",
1959
+ id: "File"
1960
+ });
1891
1961
  var SelectOption = import_v43.default.object({
1892
1962
  value: import_v43.default.string().describe("The value of the option"),
1893
1963
  label: import_v43.default.union([import_v43.default.string(), TranslationConfig]).describe("The label of the option"),
@@ -1895,7 +1965,7 @@ var SelectOption = import_v43.default.object({
1895
1965
  });
1896
1966
  var NumberWithUnitField = BaseField.extend({
1897
1967
  type: import_v43.default.literal(FieldType.NUMBER_WITH_UNIT),
1898
- defaultValue: NumberWithUnitFieldValue.optional(),
1968
+ defaultValue: NumberWithUnitFieldValue.or(ComputedDefaultValue).optional(),
1899
1969
  options: import_v43.default.array(SelectOption).describe("A list of options for the unit select"),
1900
1970
  configuration: import_v43.default.object({
1901
1971
  min: import_v43.default.number().optional().describe("Minimum value of the number field"),
@@ -1904,17 +1974,23 @@ var NumberWithUnitField = BaseField.extend({
1904
1974
  "Placeholder for the number field"
1905
1975
  )
1906
1976
  }).optional()
1907
- }).describe("Number with unit input");
1977
+ }).meta({
1978
+ description: "A number with unit input field",
1979
+ id: "NumberWithUnitField"
1980
+ });
1908
1981
  var RadioGroup = BaseField.extend({
1909
1982
  type: import_v43.default.literal(FieldType.RADIO_GROUP),
1910
- defaultValue: TextValue.optional(),
1983
+ defaultValue: TextValue.or(ComputedDefaultValue).optional(),
1911
1984
  options: import_v43.default.array(SelectOption).describe("A list of options"),
1912
1985
  configuration: import_v43.default.object({
1913
1986
  styles: import_v43.default.object({
1914
1987
  size: import_v43.default.enum(["NORMAL", "LARGE"]).optional()
1915
1988
  }).optional()
1916
1989
  }).optional()
1917
- }).describe("Grouped radio options");
1990
+ }).meta({
1991
+ description: "A grouped radio button field",
1992
+ id: "RadioGroup"
1993
+ });
1918
1994
  var BulletList = BaseField.extend({
1919
1995
  type: import_v43.default.literal(FieldType.BULLET_LIST),
1920
1996
  items: import_v43.default.array(TranslationConfig).describe("A list of items"),
@@ -1923,10 +1999,13 @@ var BulletList = BaseField.extend({
1923
1999
  fontVariant: HtmlFontVariant.optional()
1924
2000
  }).optional()
1925
2001
  }).default({})
1926
- }).describe("A list of bullet points");
2002
+ }).meta({
2003
+ description: "A list of bullet points",
2004
+ id: "BulletList"
2005
+ });
1927
2006
  var Select = BaseField.extend({
1928
2007
  type: import_v43.default.literal(FieldType.SELECT),
1929
- defaultValue: TextValue.optional(),
2008
+ defaultValue: TextValue.or(ComputedDefaultValue).optional(),
1930
2009
  options: import_v43.default.array(SelectOption).describe("A list of options"),
1931
2010
  noOptionsMessage: TranslationConfig.optional().describe(
1932
2011
  `
@@ -1938,16 +2017,22 @@ var Select = BaseField.extend({
1938
2017
  { ..., defaultMessage: "'{input}' is not listed among the health facilities." }
1939
2018
  `
1940
2019
  )
1941
- }).describe("Select input");
2020
+ }).meta({
2021
+ description: "A select input field",
2022
+ id: "Select"
2023
+ });
1942
2024
  var SelectDateRangeOption = import_v43.default.object({
1943
2025
  value: SelectDateRangeValue.describe("The value of the option"),
1944
2026
  label: TranslationConfig.describe("The label of the option")
1945
2027
  });
1946
2028
  var SelectDateRangeField = BaseField.extend({
1947
2029
  type: import_v43.default.literal(FieldType.SELECT_DATE_RANGE),
1948
- defaultValue: SelectDateRangeValue.optional(),
2030
+ defaultValue: SelectDateRangeValue.or(ComputedDefaultValue).optional(),
1949
2031
  options: import_v43.default.array(SelectDateRangeOption).describe("A list of options")
1950
- }).describe("Select input with date range options");
2032
+ }).meta({
2033
+ description: "A date range selection field",
2034
+ id: "SelectDateRangeField"
2035
+ });
1951
2036
  var NameConfig = import_v43.default.object({
1952
2037
  firstname: import_v43.default.object({ required: requiredSchema, label: TranslationConfig.optional() }).optional(),
1953
2038
  middlename: import_v43.default.object({ required: requiredSchema, label: TranslationConfig.optional() }).optional(),
@@ -1959,7 +2044,7 @@ var NameField = BaseField.extend({
1959
2044
  firstname: SerializedUserField.or(NonEmptyTextValue).optional(),
1960
2045
  middlename: SerializedUserField.or(NonEmptyTextValue).optional(),
1961
2046
  surname: SerializedUserField.or(NonEmptyTextValue).optional()
1962
- }).optional(),
2047
+ }).or(ComputedDefaultValue).optional(),
1963
2048
  configuration: import_v43.default.object({
1964
2049
  name: NameConfig.default({
1965
2050
  firstname: { required: true },
@@ -1978,26 +2063,41 @@ var NameField = BaseField.extend({
1978
2063
  surname: { required: true }
1979
2064
  }
1980
2065
  }).optional()
1981
- }).describe("Name input field");
2066
+ }).meta({
2067
+ description: "A field for entering a persons name",
2068
+ id: "NameField"
2069
+ });
1982
2070
  var PhoneField = BaseField.extend({
1983
- defaultValue: NonEmptyTextValue.optional(),
2071
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
1984
2072
  type: import_v43.default.literal(FieldType.PHONE)
1985
- }).describe("Phone input field");
2073
+ }).meta({
2074
+ description: "A field for entering a phone number",
2075
+ id: "PhoneField"
2076
+ });
1986
2077
  var IdField = BaseField.extend({
1987
- defaultValue: NonEmptyTextValue.optional(),
2078
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
1988
2079
  type: import_v43.default.literal(FieldType.ID)
1989
- }).describe("ID input field");
2080
+ }).meta({
2081
+ description: "A field for entering an ID",
2082
+ id: "IdField"
2083
+ });
1990
2084
  var Checkbox = BaseField.extend({
1991
2085
  type: import_v43.default.literal(FieldType.CHECKBOX),
1992
- defaultValue: CheckboxFieldValue.default(false)
1993
- }).describe("Boolean checkbox field");
2086
+ defaultValue: CheckboxFieldValue.or(ComputedDefaultValue).default(false)
2087
+ }).meta({
2088
+ description: "A boolean checkbox field",
2089
+ id: "Checkbox"
2090
+ });
1994
2091
  var Country = BaseField.extend({
1995
2092
  type: import_v43.default.literal(FieldType.COUNTRY),
1996
- defaultValue: NonEmptyTextValue.optional(),
2093
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
1997
2094
  optionOverrides: import_v43.default.array(SelectOption.omit({ label: true })).optional().describe(
1998
2095
  "Conditionals for specific countries. Countries not listed are always shown and enabled."
1999
2096
  )
2000
- }).describe("Country select field");
2097
+ }).meta({
2098
+ description: "A field for selecting a country",
2099
+ id: "Country"
2100
+ });
2001
2101
  var AllowedLocations = JurisdictionReference.optional().describe(
2002
2102
  "Limits which location options are selectable depending on user jurisdiction and location."
2003
2103
  );
@@ -2006,28 +2106,33 @@ var AdministrativeAreas = import_v43.default.enum([
2006
2106
  "HEALTH_FACILITY",
2007
2107
  "CRVS_OFFICE"
2008
2108
  ]);
2009
- var AdministrativeAreaConfiguration = import_v43.default.object({
2010
- partOf: FieldReference.optional().describe("Parent location"),
2011
- type: AdministrativeAreas,
2012
- allowedLocations: AllowedLocations
2013
- }).describe("Administrative area options");
2014
2109
  var AdministrativeAreaField = BaseField.extend({
2015
2110
  type: import_v43.default.literal(FieldType.ADMINISTRATIVE_AREA),
2016
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
2017
- configuration: AdministrativeAreaConfiguration
2018
- }).describe("Administrative area input field e.g. facility, office");
2111
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
2112
+ configuration: import_v43.default.object({
2113
+ partOf: FieldReference.optional().describe("Parent location"),
2114
+ type: AdministrativeAreas,
2115
+ allowedLocations: AllowedLocations
2116
+ }).describe("Administrative area options")
2117
+ }).meta({
2118
+ description: "Administrative area input field",
2119
+ id: "AdministrativeAreaField"
2120
+ });
2019
2121
  var LocationInput = BaseField.extend({
2020
2122
  type: import_v43.default.literal(FieldType.LOCATION),
2021
- defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField]).optional(),
2123
+ defaultValue: import_v43.default.union([NonEmptyTextValue, SerializedUserField, ComputedDefaultValue]).optional(),
2022
2124
  configuration: import_v43.default.object({
2023
2125
  locationTypes: import_v43.default.array(import_v43.default.string()).optional().describe("Types of the locations that are available for selection."),
2024
2126
  allowedLocations: AllowedLocations
2025
2127
  }).optional()
2026
- }).describe("Input field for a location");
2128
+ }).meta({
2129
+ description: "A field for selecting a location",
2130
+ id: "LocationInput"
2131
+ });
2027
2132
  var FileUploadWithOptions = BaseField.extend({
2028
2133
  type: import_v43.default.literal(FieldType.FILE_WITH_OPTIONS),
2029
2134
  options: import_v43.default.array(SelectOption).describe("A list of options"),
2030
- defaultValue: FileFieldWithOptionValue.optional(),
2135
+ defaultValue: FileFieldWithOptionValue.or(ComputedDefaultValue).optional(),
2031
2136
  configuration: import_v43.default.object({
2032
2137
  maxFileSize: import_v43.default.number().describe("Maximum file size in bytes").default(DEFAULT_MAX_FILE_SIZE_BYTES),
2033
2138
  maxImageSize: import_v43.default.object({
@@ -2037,15 +2142,18 @@ var FileUploadWithOptions = BaseField.extend({
2037
2142
  }).default({
2038
2143
  maxFileSize: DEFAULT_MAX_FILE_SIZE_BYTES
2039
2144
  })
2145
+ }).meta({
2146
+ description: "A field for uploading files with file type options",
2147
+ id: "FileUploadWithOptions"
2040
2148
  });
2041
2149
  var Facility = BaseField.extend({
2042
2150
  type: import_v43.default.literal(FieldType.FACILITY),
2043
- defaultValue: NonEmptyTextValue.optional(),
2151
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2044
2152
  configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
2045
2153
  }).describe("Input field for a facility");
2046
2154
  var Office = BaseField.extend({
2047
2155
  type: import_v43.default.literal(FieldType.OFFICE),
2048
- defaultValue: NonEmptyTextValue.optional(),
2156
+ defaultValue: NonEmptyTextValue.or(ComputedDefaultValue).optional(),
2049
2157
  configuration: import_v43.default.object({ allowedLocations: AllowedLocations }).optional()
2050
2158
  }).describe("Input field for an office");
2051
2159
  var DefaultAddressFieldValue = DomesticAddressFieldValue.extend({
@@ -2081,8 +2189,11 @@ var Address = BaseField.extend({
2081
2189
  ).optional(),
2082
2190
  allowedLocations: AllowedLocations
2083
2191
  }).optional(),
2084
- defaultValue: DefaultAddressFieldValue.optional()
2085
- }).describe("Address input field \u2013 a combination of location and text fields");
2192
+ defaultValue: DefaultAddressFieldValue.or(ComputedDefaultValue).optional()
2193
+ }).meta({
2194
+ description: "Address input field \u2013 a combination of location and text fields",
2195
+ id: "Address"
2196
+ });
2086
2197
  var StaticDataEntry = import_v43.default.object({
2087
2198
  id: import_v43.default.string().describe("ID for the data entry."),
2088
2199
  label: TranslationConfig,
@@ -2097,7 +2208,10 @@ var DataField = BaseField.extend({
2097
2208
  subtitle: TranslationConfig.optional(),
2098
2209
  data: import_v43.default.array(DataEntry)
2099
2210
  })
2100
- }).describe("Data field for displaying read-only data");
2211
+ }).meta({
2212
+ description: "A field for displaying a table of read-only data",
2213
+ id: "DataField"
2214
+ });
2101
2215
  var ButtonSize = import_v43.default.enum(["small", "medium", "large"]);
2102
2216
  var ButtonType = import_v43.default.enum([
2103
2217
  "primary",
@@ -2122,13 +2236,19 @@ var ButtonConfiguration = import_v43.default.object({
2122
2236
  });
2123
2237
  var ButtonField = BaseField.extend({
2124
2238
  type: import_v43.default.literal(FieldType.BUTTON),
2125
- defaultValue: ButtonFieldValue.optional(),
2239
+ defaultValue: ButtonFieldValue.or(ComputedDefaultValue).optional(),
2126
2240
  configuration: ButtonConfiguration
2127
- }).describe("Generic button without any built-in functionality");
2241
+ }).meta({
2242
+ description: "A generic button that can be used to trigger an action",
2243
+ id: "ButtonField"
2244
+ });
2128
2245
  var FieldGroup = BaseField.extend({
2129
2246
  type: import_v43.default.literal(FieldType.FIELD_GROUP),
2130
2247
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
2131
2248
  fields: import_v43.default.lazy(() => import_v43.default.array(FieldConfig))
2249
+ }).meta({
2250
+ description: "A group of fields that are displayed together",
2251
+ id: "FieldGroup"
2132
2252
  });
2133
2253
  var AlphaPrintButton = BaseField.extend({
2134
2254
  type: import_v43.default.literal(FieldType.ALPHA_PRINT_BUTTON),
@@ -2138,10 +2258,13 @@ var AlphaPrintButton = BaseField.extend({
2138
2258
  "Label for the print button"
2139
2259
  )
2140
2260
  })
2141
- }).describe("Print button field for printing certificates");
2261
+ }).meta({
2262
+ description: "An experimental print button field for printing certificates during the declaration process",
2263
+ id: "AlphaPrintButton"
2264
+ });
2142
2265
  var HttpField = BaseField.extend({
2143
2266
  type: import_v43.default.literal(FieldType.HTTP),
2144
- defaultValue: HttpFieldValue.optional(),
2267
+ defaultValue: HttpFieldValue.or(ComputedDefaultValue).optional(),
2145
2268
  configuration: import_v43.default.object({
2146
2269
  trigger: FieldReference.optional().describe(
2147
2270
  "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."
@@ -2154,20 +2277,30 @@ var HttpField = BaseField.extend({
2154
2277
  params: import_v43.default.record(import_v43.default.string(), import_v43.default.union([import_v43.default.string(), FieldReference])).optional(),
2155
2278
  timeout: import_v43.default.number().default(15e3).describe("Request timeout in milliseconds")
2156
2279
  })
2157
- }).describe("HTTP request function triggered by a button click or other event");
2280
+ }).meta({
2281
+ 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.",
2282
+ id: "HttpField"
2283
+ });
2158
2284
  var AutocompleteField = BaseField.extend({
2159
2285
  type: import_v43.default.literal(FieldType.AUTOCOMPLETE),
2160
2286
  configuration: import_v43.default.object({
2161
- url: import_v43.default.string().describe("URL to fetch autocomplete suggestions from").optional(),
2287
+ url: import_v43.default.string().describe(
2288
+ "URL to fetch autocomplete suggestions from. This should be a country config server endpoint."
2289
+ ).optional(),
2162
2290
  method: import_v43.default.enum(["GET", "POST"]).default("GET").optional(),
2163
2291
  defaultOptions: import_v43.default.array(
2164
2292
  import_v43.default.object({
2165
2293
  label: import_v43.default.string(),
2166
2294
  value: import_v43.default.string()
2167
2295
  })
2168
- ).optional()
2296
+ ).optional().describe(
2297
+ "Manual entry is supported through configuration, allowing users to provide values not currently represented in the dataset."
2298
+ )
2169
2299
  })
2170
- }).describe("Autocomplete input field");
2300
+ }).meta({
2301
+ 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.",
2302
+ id: "AutocompleteField"
2303
+ });
2171
2304
  var SearchField = HttpField.extend({
2172
2305
  type: import_v43.default.literal(FieldType.SEARCH),
2173
2306
  configuration: SearchQuery.pick({
@@ -2200,6 +2333,9 @@ var SearchField = HttpField.extend({
2200
2333
  ok: TranslationConfig.optional()
2201
2334
  }).optional()
2202
2335
  })
2336
+ }).meta({
2337
+ description: "A search input field",
2338
+ id: "SearchField"
2203
2339
  });
2204
2340
  var LinkButtonField = BaseField.extend({
2205
2341
  type: import_v43.default.literal(FieldType.LINK_BUTTON),
@@ -2208,28 +2344,35 @@ var LinkButtonField = BaseField.extend({
2208
2344
  text: TranslationConfig.describe("Text to display on the button"),
2209
2345
  icon: import_v43.default.string().optional().describe("Icon for the button. You can find icons from OpenCRVS UI-Kit.")
2210
2346
  })
2211
- }).describe("Button that opens a link");
2347
+ }).meta({
2348
+ description: "A button that opens a URL link",
2349
+ id: "LinkButtonField"
2350
+ });
2212
2351
  var VerificationStatus = BaseField.extend({
2213
2352
  type: import_v43.default.literal(FieldType.VERIFICATION_STATUS),
2214
- defaultValue: VerificationStatusValue.optional(),
2353
+ defaultValue: VerificationStatusValue.or(ComputedDefaultValue).optional(),
2215
2354
  configuration: import_v43.default.object({
2216
2355
  status: TranslationConfig.describe("Text to display on the status pill."),
2217
2356
  description: TranslationConfig.describe(
2218
2357
  "Explaining text on the banner in form."
2219
2358
  )
2220
2359
  })
2360
+ }).meta({
2361
+ 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.",
2362
+ id: "VerificationStatus"
2221
2363
  });
2222
2364
  var QueryParamReaderField = BaseField.extend({
2223
2365
  type: import_v43.default.literal(FieldType.QUERY_PARAM_READER),
2224
2366
  configuration: import_v43.default.object({
2225
2367
  pickParams: import_v43.default.array(import_v43.default.string()).describe("List of query parameters to read from the URL")
2226
2368
  })
2227
- }).describe(
2228
- "A field that maps URL query params into form values and clears them afterward"
2229
- );
2369
+ }).meta({
2370
+ description: "A field that maps URL query params into form values and clears them afterward",
2371
+ id: "QueryParamReaderField"
2372
+ });
2230
2373
  var QrReaderField = BaseField.extend({
2231
2374
  type: import_v43.default.literal(FieldType.QR_READER),
2232
- defaultValue: QrReaderFieldValue.optional(),
2375
+ defaultValue: QrReaderFieldValue.or(ComputedDefaultValue).optional(),
2233
2376
  configuration: import_v43.default.object({
2234
2377
  validator: import_v43.default.any().meta({
2235
2378
  description: "JSON Schema to validate the scanned QR code data against before populating the form fields.",
@@ -2237,21 +2380,27 @@ var QrReaderField = BaseField.extend({
2237
2380
  })
2238
2381
  }).optional()
2239
2382
  }).meta({
2240
- description: "Configuration for QR code reader field, including optional JSON Schema validator.",
2383
+ description: "QR code reader field, including optional JSON Schema validator.",
2241
2384
  id: "QrReaderField"
2242
2385
  });
2243
2386
  var IdReaderField = BaseField.extend({
2244
2387
  type: import_v43.default.literal(FieldType.ID_READER),
2245
- defaultValue: IdReaderFieldValue.optional(),
2388
+ defaultValue: IdReaderFieldValue.or(ComputedDefaultValue).optional(),
2246
2389
  methods: import_v43.default.array(
2247
2390
  import_v43.default.union([QrReaderField, LinkButtonField]).describe("Methods for reading an ID")
2248
2391
  )
2392
+ }).meta({
2393
+ description: "A wrapper around nested form fields, specifically QR_READER and LINK_BUTTON. It can hold the QR_READERs value.",
2394
+ id: "IdReaderField"
2249
2395
  });
2250
2396
  var CustomField = BaseField.extend({
2251
2397
  type: import_v43.default.literal(FieldType._EXPERIMENTAL_CUSTOM),
2252
2398
  defaultValue: CustomFieldValue.optional(),
2253
2399
  src: import_v43.default.string().describe("Module source path for the custom field component"),
2254
2400
  configuration: import_v43.default.unknown().optional()
2401
+ }).meta({
2402
+ description: "An expiremental custom field that is defined by a module source path",
2403
+ id: "CustomField"
2255
2404
  });
2256
2405
  var FieldStyleVariant = import_v43.default.enum(["default", "highlighted"]);
2257
2406
  var LoaderField = BaseField.extend({
@@ -2261,22 +2410,25 @@ var LoaderField = BaseField.extend({
2261
2410
  configuration: import_v43.default.object({
2262
2411
  text: TranslationConfig.describe("Display text above the loading spinner")
2263
2412
  })
2264
- }).describe(
2265
- "A non-interactive field that indicates an in progress operation in form"
2266
- );
2413
+ }).meta({
2414
+ description: "A non-interactive field that indicates an in progress operation in form",
2415
+ id: "LoaderField"
2416
+ });
2267
2417
  var HiddenField = BaseField.extend({
2268
2418
  type: import_v43.default.literal(FieldType.ALPHA_HIDDEN),
2269
2419
  required: import_v43.default.boolean().default(false).optional(),
2270
2420
  defaultValue: TextValue.optional()
2271
- }).describe(
2272
- "A non-interactive, hidden field that only hold a value in the form"
2273
- );
2421
+ }).meta({
2422
+ description: "A non-interactive, hidden field that only hold a value in the form",
2423
+ id: "HiddenField"
2424
+ });
2274
2425
  var UserRoleField = BaseField.extend({
2275
2426
  type: import_v43.default.literal(FieldType.USER_ROLE),
2276
2427
  defaultValue: TextValue.optional()
2277
- }).describe(
2278
- "A select dropdown that is automatically populated with available user roles"
2279
- );
2428
+ }).meta({
2429
+ description: "A select dropdown that is automatically populated with available user roles",
2430
+ id: "UserRoleField"
2431
+ });
2280
2432
  var FieldConfig = import_v43.default.discriminatedUnion("type", [
2281
2433
  FieldGroup,
2282
2434
  Address,
@@ -2376,15 +2528,18 @@ var VerificationPageConfig = FormPageConfig.extend({
2376
2528
  actions: VerificationActionConfig
2377
2529
  });
2378
2530
  var PageConfig = z21.discriminatedUnion("type", [FormPageConfig, VerificationPageConfig]).meta({
2379
- description: "Page configuration",
2380
- id: "PageConfig"
2531
+ id: "PageConfig",
2532
+ 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."
2381
2533
  });
2382
2534
 
2383
2535
  // ../commons/src/events/FormConfig.ts
2384
2536
  var DeclarationFormConfig = z22.object({
2385
2537
  label: TranslationConfig.describe("Human readable description of the form"),
2386
2538
  pages: z22.array(FormPageConfig)
2387
- }).describe("Configuration of the declaration form.");
2539
+ }).meta({
2540
+ id: "DeclarationFormConfig",
2541
+ description: "Configuration of the declaration form."
2542
+ });
2388
2543
  var ActionFormConfig = z22.object({
2389
2544
  label: TranslationConfig.describe("Human readable description of the form"),
2390
2545
  pages: z22.array(PageConfig)
@@ -2484,6 +2639,9 @@ var DeduplicationConfig = z23.object({
2484
2639
  id: z23.string(),
2485
2640
  label: TranslationConfig,
2486
2641
  query: Clause
2642
+ }).meta({
2643
+ id: "DeduplicationConfig",
2644
+ 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."
2487
2645
  });
2488
2646
 
2489
2647
  // ../commons/src/events/ActionConfig.ts
@@ -2521,6 +2679,11 @@ var ReadActionConfig = ActionConfigBase.extend(
2521
2679
  conditionals: z24.never().optional().describe("Read-action can not be disabled or hidden with conditionals.")
2522
2680
  }).shape
2523
2681
  );
2682
+ var NotifyConfig = ActionConfigBase.extend(
2683
+ z24.object({
2684
+ type: z24.literal(ActionType.NOTIFY)
2685
+ }).shape
2686
+ );
2524
2687
  var DeclareConfig = DeclarationActionBase.extend(
2525
2688
  z24.object({
2526
2689
  type: z24.literal(ActionType.DECLARE),
@@ -2601,17 +2764,46 @@ var ActionConfig = z24.discriminatedUnion("type", [
2601
2764
  * OpenAPI references are defined here so our generated OpenAPI spec knows to reuse the models
2602
2765
  * and treat them as "models" instead of duplicating the data structure in each endpoint.
2603
2766
  */
2604
- ReadActionConfig.meta({ id: "ReadActionConfig" }),
2605
- DeclareConfig.meta({ id: "DeclareActionConfig" }),
2606
- RejectConfig.meta({ id: "RejectActionConfig" }),
2607
- RegisterConfig.meta({ id: "RegisterActionConfig" }),
2767
+ ReadActionConfig.meta({
2768
+ id: "ReadActionConfig",
2769
+ description: "Configuration for the read action \u2014 defines the record-tab content displayed on the event overview page."
2770
+ }),
2771
+ NotifyConfig.meta({
2772
+ id: "NotifyActionConfig",
2773
+ description: "Configuration for the notify action. When present, NOTIFY uses this config independently from DECLARE. When absent, NOTIFY falls back to the DeclareActionConfig."
2774
+ }),
2775
+ DeclareConfig.meta({
2776
+ id: "DeclareActionConfig",
2777
+ description: "Configuration for the declare action. Includes review-page fields. NOTIFY falls back to this config when no dedicated NotifyActionConfig is provided."
2778
+ }),
2779
+ RejectConfig.meta({
2780
+ id: "RejectActionConfig",
2781
+ description: "Configuration for rejecting a record before registration."
2782
+ }),
2783
+ RegisterConfig.meta({
2784
+ id: "RegisterActionConfig",
2785
+ description: "Configuration for registering a record."
2786
+ }),
2608
2787
  PrintCertificateActionConfig.meta({
2609
- id: "PrintCertificateActionConfig"
2788
+ id: "PrintCertificateActionConfig",
2789
+ description: "Configuration for printing a certificate of a registered record."
2790
+ }),
2791
+ RequestCorrectionConfig.meta({
2792
+ id: "RequestCorrectionActionConfig",
2793
+ description: "Configuration for requesting a correction on a registered record."
2794
+ }),
2795
+ EditActionConfig.meta({
2796
+ id: "EditActionConfig",
2797
+ description: "Configuration for editing a record before registration."
2610
2798
  }),
2611
- RequestCorrectionConfig.meta({ id: "RequestCorrectionActionConfig" }),
2612
- EditActionConfig.meta({ id: "EditActionConfig" }),
2613
- ArchiveConfig.meta({ id: "ArchiveActionConfig" }),
2614
- CustomActionConfig.meta({ id: "CustomActionConfig" })
2799
+ ArchiveConfig.meta({
2800
+ id: "ArchiveActionConfig",
2801
+ description: "Configuration for archiving a record."
2802
+ }),
2803
+ CustomActionConfig.meta({
2804
+ id: "CustomActionConfig",
2805
+ description: "Configuration for a country-defined custom action. An event may include any number of these."
2806
+ })
2615
2807
  ]).describe(
2616
2808
  "Configuration of an action available for an event. Data collected depends on the action type and is accessible through the annotation property in ActionDocument."
2617
2809
  ).meta({ id: "ActionConfig" });
@@ -2687,7 +2879,10 @@ var Field = BaseField2.extend({
2687
2879
  }).describe("Custom field defined for the summary view.");
2688
2880
  var SummaryConfig = z27.object({
2689
2881
  fields: z27.array(z27.union([Field, ReferenceField])).describe("Fields displayed in the event summary view.")
2690
- }).describe("Configuration of the event summary section.");
2882
+ }).meta({
2883
+ id: "SummaryConfig",
2884
+ 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."
2885
+ });
2691
2886
 
2692
2887
  // ../commons/src/events/AdvancedSearchConfig.ts
2693
2888
  var z28 = __toESM(require("zod/v4"));
@@ -2758,6 +2953,9 @@ var BaseField3 = z28.object({
2758
2953
  ),
2759
2954
  validations: z28.array(ValidationConfig).optional().describe(
2760
2955
  `Option for overriding the field validations specifically for advanced search form.`
2956
+ ),
2957
+ allowedLocations: JurisdictionReference.optional().describe(
2958
+ `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.`
2761
2959
  )
2762
2960
  });
2763
2961
  var SearchQueryParams = z28.object({
@@ -2811,6 +3009,9 @@ var AdvancedSearchField = z28.discriminatedUnion("fieldType", [FieldConfigSchema
2811
3009
  var AdvancedSearchConfig = z28.object({
2812
3010
  title: TranslationConfig.describe("Advanced search tab title"),
2813
3011
  fields: z28.array(AdvancedSearchField).describe("Advanced search fields within the tab.")
3012
+ }).meta({
3013
+ id: "AdvancedSearchConfig",
3014
+ 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()`)."
2814
3015
  });
2815
3016
 
2816
3017
  // ../commons/src/events/utils.ts
@@ -2861,7 +3062,37 @@ function resolveDataPath(rootData, dataPath, instancePath) {
2861
3062
  }
2862
3063
  return current;
2863
3064
  }
3065
+ function todayISO() {
3066
+ return (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date(), { representation: "date" });
3067
+ }
3068
+ var compiledFunctionCache = /* @__PURE__ */ new Map();
3069
+ function compileClientFunction(code) {
3070
+ let fn = compiledFunctionCache.get(code);
3071
+ if (!fn) {
3072
+ fn = new Function(`return (${code})`)();
3073
+ compiledFunctionCache.set(code, fn);
3074
+ }
3075
+ return fn;
3076
+ }
2864
3077
  (0, import_ajv_formats.default)(ajv);
3078
+ function buildClientFunctionContext(input) {
3079
+ return {
3080
+ $form: input.form,
3081
+ $now: todayISO(),
3082
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
3083
+ $online: isOnline(),
3084
+ $user: input.validatorContext?.user,
3085
+ $event: input.validatorContext?.event,
3086
+ $leafAdminStructureLocationIds: input.validatorContext?.leafAdminStructureLocationIds ?? [],
3087
+ user: input.systemVariables?.user,
3088
+ $window: input.systemVariables?.$window,
3089
+ locations: input.locations,
3090
+ adminLevelIds: input.adminLevelIds
3091
+ };
3092
+ }
3093
+ function runClientFunction(code, data, context) {
3094
+ return compileClientFunction(code)(data, context);
3095
+ }
2865
3096
  ajv.addKeyword({
2866
3097
  keyword: "daysFromDate",
2867
3098
  type: "string",
@@ -2906,12 +3137,35 @@ ajv.addKeyword({
2906
3137
  $data: true,
2907
3138
  errors: true,
2908
3139
  // @ts-ignore -- Force type. We will move this away from AJV next. Parsing the array will take seconds and is only called by core.
2909
- validate(schema, data, _2, dataContext) {
3140
+ validate(_schema, data, _2, dataContext) {
2910
3141
  const locationIdInput = data;
2911
3142
  const locations = dataContext?.rootData.$leafAdminStructureLocationIds ?? [];
2912
3143
  return locations.some((location) => location.id === locationIdInput);
2913
3144
  }
2914
3145
  });
3146
+ ajv.addKeyword({
3147
+ keyword: "customClientValidator",
3148
+ schemaType: "object",
3149
+ errors: true,
3150
+ // @ts-expect-error -- AJV's public types don't expose `rootData`. All
3151
+ // `validate()` callers build root data via `buildClientFunctionContext`,
3152
+ // so the cast holds.
3153
+ validate(schema, data, _2, dataContext) {
3154
+ return Boolean(
3155
+ runClientFunction(
3156
+ schema.code,
3157
+ data,
3158
+ dataContext?.rootData ?? buildClientFunctionContext({ form: {} })
3159
+ )
3160
+ );
3161
+ }
3162
+ });
3163
+ function isOnline() {
3164
+ if (typeof window !== "undefined" && typeof navigator !== "undefined") {
3165
+ return navigator.onLine;
3166
+ }
3167
+ return true;
3168
+ }
2915
3169
 
2916
3170
  // ../commons/src/utils.ts
2917
3171
  var z32 = __toESM(require("zod/v4"));
@@ -2954,7 +3208,7 @@ var getActionAnnotationFields = (actionConfig) => {
2954
3208
  if (actionConfig.type === ActionType.CUSTOM) {
2955
3209
  return actionConfig.form;
2956
3210
  }
2957
- if ("review" in actionConfig) {
3211
+ if ("review" in actionConfig && actionConfig.review != null) {
2958
3212
  return actionConfig.review.fields;
2959
3213
  }
2960
3214
  return [];
@@ -3530,7 +3784,54 @@ function createFieldConditionals(fieldId) {
3530
3784
  }
3531
3785
  },
3532
3786
  required: [fieldId]
3533
- })
3787
+ }),
3788
+ /**
3789
+ * Custom client-side validator. The provided function is serialised and executed
3790
+ * just-in-time on the client only. External references (e.g. lodash) are not
3791
+ * available inside the function body — all logic must be self-contained.
3792
+ *
3793
+ * @example
3794
+ * field('nid').customClientValidator((value) => {
3795
+ * // LUHN check — all logic must be inline
3796
+ * const digits = String(value).split('').map(Number)
3797
+ * // ...
3798
+ * return isValid
3799
+ * })
3800
+ */
3801
+ customClientValidator(validationFn) {
3802
+ const code = validationFn.toString();
3803
+ return defineFormConditional({
3804
+ type: "object",
3805
+ properties: wrapToPath(
3806
+ { [fieldId]: { customClientValidator: { code } } },
3807
+ this.$$subfield
3808
+ ),
3809
+ required: [fieldId]
3810
+ });
3811
+ },
3812
+ /**
3813
+ * Custom client-side evaluation. Returns a {@link FieldReference} descriptor
3814
+ * that can be used as the `value` property or a DATA component entry.
3815
+ * The function receives the referenced field's value as the first argument and
3816
+ * the full form context as the second; its return value replaces the field reference.
3817
+ * The function is serialised and executed just-in-time on the client only.
3818
+ * External references (e.g. lodash) are not available inside the function body.
3819
+ *
3820
+ * For computing a default value without referencing a specific field, use
3821
+ * `evaluate(fn)` in the `defaultValue` property instead.
3822
+ *
3823
+ * @example
3824
+ * field('a').customClientEvaluation((aValue, ctx) =>
3825
+ * Number(aValue) + Number(ctx.$form.b)
3826
+ * )
3827
+ */
3828
+ customClientEvaluation(computationFn) {
3829
+ return {
3830
+ $$code: computationFn.toString(),
3831
+ $$field: fieldId,
3832
+ $$subfield: this.$$subfield
3833
+ };
3834
+ }
3534
3835
  };
3535
3836
  }
3536
3837
 
@@ -3703,8 +4004,9 @@ var EventConfig = _EventConfigBase.superRefine((event2, ctx) => {
3703
4004
  validateActionFlags(event2, ctx);
3704
4005
  validateActionOrder(event2, ctx);
3705
4006
  }).meta({
3706
- id: "EventConfig"
3707
- }).describe("Configuration defining an event type.");
4007
+ id: "EventConfig",
4008
+ description: "Configuration defining an event type registered in OpenCRVS (for example birth or death)."
4009
+ });
3708
4010
 
3709
4011
  // ../commons/src/events/EventConfigInput.ts
3710
4012
  var defineDeclarationForm = (form) => DeclarationFormConfig.parse(form);
@@ -3926,6 +4228,9 @@ var WorkqueueColumnValue = z34.object({
3926
4228
  var WorkqueueColumn = z34.object({
3927
4229
  label: TranslationConfig,
3928
4230
  value: WorkqueueColumnValue
4231
+ }).meta({
4232
+ id: "WorkqueueColumn",
4233
+ description: "Configuration for a single workqueue column. The value references an event metadata key (e.g. `dateOfEvent`, `status`, `trackingId`)."
3929
4234
  });
3930
4235
  function defineWorkqueuesColumns(workqueueColumns) {
3931
4236
  return workqueueColumns.map(
@@ -4131,8 +4436,8 @@ var WorkqueueConfigWithoutQuery = WorkqueueConfig.omit({
4131
4436
  var WorkqueueConfigInput = WorkqueueConfig.extend({
4132
4437
  query: CountryConfigQueryInputType
4133
4438
  }).meta({
4134
- description: "Workqueue configuration",
4135
- id: "WorkqueueConfig"
4439
+ id: "WorkqueueConfig",
4440
+ 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."
4136
4441
  });
4137
4442
  var WorkqueueCountInput = z37.array(
4138
4443
  z37.object({ slug: z37.string(), query: QueryType })
@@ -4174,7 +4479,9 @@ var BaseActionInput = z38.object({
4174
4479
  keepAssignment: z38.boolean().optional(),
4175
4480
  keepAssignmentIfAccepted: z38.boolean().optional(),
4176
4481
  keepAssignmentIfRejected: z38.boolean().optional(),
4177
- waitFor: z38.boolean().optional(),
4482
+ waitFor: z38.boolean().default(true).describe(
4483
+ "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."
4484
+ ),
4178
4485
  // For normal users, the createdAtLocation is resolved on the backend from the user's primaryOfficeId.
4179
4486
  // @TODO: createdAtLocation should be limited to actions that system users can perform. For normal users, it should not be part of the base action.
4180
4487
  createdAtLocation: UUID.nullish().describe(
@@ -4292,7 +4599,8 @@ var RejectCorrectionActionInput = BaseActionInput.extend(
4292
4599
  var ApproveCorrectionActionInput = BaseActionInput.extend(
4293
4600
  z38.object({
4294
4601
  requestId: z38.string(),
4295
- type: z38.literal(ActionType.APPROVE_CORRECTION).default(ActionType.APPROVE_CORRECTION)
4602
+ type: z38.literal(ActionType.APPROVE_CORRECTION).default(ActionType.APPROVE_CORRECTION),
4603
+ content: z38.object({ immediateCorrection: z38.boolean().optional() }).optional()
4296
4604
  }).shape
4297
4605
  );
4298
4606
  var ReadActionInput = BaseActionInput.extend(
@@ -4354,7 +4662,7 @@ var Draft = z39.object({
4354
4662
  }).describe(
4355
4663
  "A temporary storage for an action. Stored with details of the event, creator and creation time."
4356
4664
  );
4357
- var DraftInput = BaseActionInput.extend({
4665
+ var DraftInput = BaseActionInput.omit({ waitFor: true }).extend({
4358
4666
  type: ActionTypes.exclude([ActionTypes.enum.DELETE]),
4359
4667
  status: z39.enum([
4360
4668
  ActionStatus.Requested,
@@ -4404,12 +4712,53 @@ var updateActions = ActionTypes.extract([
4404
4712
  ActionType.ARCHIVE,
4405
4713
  ActionType.PRINT_CERTIFICATE,
4406
4714
  ActionType.REQUEST_CORRECTION,
4715
+ ActionType.APPROVE_CORRECTION,
4716
+ ActionType.REJECT_CORRECTION,
4407
4717
  ActionType.CUSTOM
4408
4718
  ]);
4409
4719
 
4410
4720
  // ../commons/src/events/state/flags.ts
4411
4721
  var import_lodash3 = require("lodash");
4412
4722
  var import_date_fns3 = require("date-fns");
4723
+ var INHERENT_FLAG_RULES = [
4724
+ {
4725
+ flag: InherentFlags.CORRECTION_REQUESTED,
4726
+ setOn: [ActionType.REQUEST_CORRECTION],
4727
+ resetOn: [ActionType.APPROVE_CORRECTION, ActionType.REJECT_CORRECTION]
4728
+ },
4729
+ {
4730
+ // INCOMPLETE mirrors the NOTIFIED status: set by NOTIFY, cleared by any
4731
+ // other status-changing action (see getStatusFromActions).
4732
+ flag: InherentFlags.INCOMPLETE,
4733
+ setOn: [ActionType.NOTIFY],
4734
+ resetOn: [
4735
+ ActionType.CREATE,
4736
+ ActionType.DECLARE,
4737
+ ActionType.REGISTER,
4738
+ ActionType.ARCHIVE
4739
+ ]
4740
+ },
4741
+ {
4742
+ flag: InherentFlags.REJECTED,
4743
+ setOn: [ActionType.REJECT],
4744
+ resetOn: [
4745
+ ActionType.NOTIFY,
4746
+ ActionType.DECLARE,
4747
+ ActionType.EDIT,
4748
+ ActionType.REGISTER
4749
+ ]
4750
+ },
4751
+ {
4752
+ flag: InherentFlags.POTENTIAL_DUPLICATE,
4753
+ setOn: [ActionType.DUPLICATE_DETECTED],
4754
+ resetOn: [ActionType.MARK_AS_DUPLICATE, ActionType.MARK_AS_NOT_DUPLICATE]
4755
+ },
4756
+ {
4757
+ flag: InherentFlags.EDIT_IN_PROGRESS,
4758
+ setOn: [ActionType.EDIT],
4759
+ resetOnAnyOtherAction: true
4760
+ }
4761
+ ];
4413
4762
 
4414
4763
  // ../commons/src/events/defineConfig.ts
4415
4764
  var IGNORED_EVENT_TYPES = [
@@ -5155,6 +5504,11 @@ var TENNIS_CLUB_DECLARATION_REVIEW = {
5155
5504
  id: "signature.upload.modal.title",
5156
5505
  defaultMessage: "Draw signature",
5157
5506
  description: "Title for the modal to draw signature"
5507
+ },
5508
+ // Zod applies the schema default at parse time, but this fixture bypasses
5509
+ // parsing — GeneratedInputField accesses configuration.maxFileSize directly.
5510
+ configuration: {
5511
+ maxFileSize: 5 * 1024 * 1024
5158
5512
  }
5159
5513
  }
5160
5514
  ]
@@ -5711,6 +6065,20 @@ var tennisClubMembershipEvent = defineConfig({
5711
6065
  },
5712
6066
  review: TENNIS_CLUB_DECLARATION_REVIEW
5713
6067
  },
6068
+ {
6069
+ type: ActionType.NOTIFY,
6070
+ label: {
6071
+ defaultMessage: "Notify health worker",
6072
+ description: "This is shown as the action name anywhere the user can trigger the action from",
6073
+ id: "event.tennis-club-membership.action.notify.label"
6074
+ },
6075
+ flags: [
6076
+ {
6077
+ id: "health-worker-notified",
6078
+ operation: "add"
6079
+ }
6080
+ ]
6081
+ },
5714
6082
  {
5715
6083
  type: ActionType.REJECT,
5716
6084
  label: {
@@ -5953,6 +6321,17 @@ var tennisClubMembershipEvent = defineConfig({
5953
6321
  }
5954
6322
  }
5955
6323
  ],
6324
+ flags: [
6325
+ {
6326
+ id: "health-worker-notified",
6327
+ requiresAction: false,
6328
+ label: {
6329
+ id: "event.tennis-club-membership.flag.health-worker-notified.label",
6330
+ defaultMessage: "Health worker notified",
6331
+ description: "Label for the health-worker-notified flag"
6332
+ }
6333
+ }
6334
+ ],
5956
6335
  advancedSearch: [
5957
6336
  {
5958
6337
  title: {
@@ -6948,10 +7327,380 @@ var ACTION_FILTERS = {
6948
7327
  [ActionType.UNASSIGN]: (flags) => !flags.some((flag) => flag.endsWith(":requested")),
6949
7328
  [ActionType.CUSTOM]: (flags) => !flags.some((flag) => flag.endsWith(":requested"))
6950
7329
  };
7330
+ var REJECTED_ACTIONS = [
7331
+ ActionType.READ,
7332
+ ActionType.NOTIFY,
7333
+ ActionType.CUSTOM,
7334
+ ActionType.EDIT,
7335
+ ActionType.ARCHIVE
7336
+ ];
6951
7337
 
6952
7338
  // ../commons/src/events/FileUtils.ts
6953
7339
  var import_lodash7 = require("lodash");
6954
7340
 
7341
+ // ../commons/src/events/mocks.test.utils.ts
7342
+ var V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS = [
7343
+ {
7344
+ id: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7345
+ name: "Central",
7346
+ parentId: null,
7347
+ validUntil: null,
7348
+ externalId: "ydyJb1RAy4U1"
7349
+ },
7350
+ {
7351
+ id: "c599b691-fd2d-45e1-abf4-d185de727fb5",
7352
+ name: "Sulaka",
7353
+ parentId: null,
7354
+ validUntil: null,
7355
+ externalId: "pQ8nGxWmZ2Q3"
7356
+ },
7357
+ {
7358
+ id: "7ef2b9c7-5e6d-49f6-ae05-656207d0fc64",
7359
+ name: "Pualula",
7360
+ parentId: null,
7361
+ validUntil: null,
7362
+ externalId: "Aq91DweLmT8k"
7363
+ },
7364
+ {
7365
+ id: "6d1a59df-988c-4021-a846-ccbc021931a7",
7366
+ name: "Chuminga",
7367
+ parentId: null,
7368
+ validUntil: null,
7369
+ externalId: "Rw0fYNh2Xk9a"
7370
+ },
7371
+ {
7372
+ id: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7373
+ name: "Ibombo",
7374
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7375
+ validUntil: null,
7376
+ externalId: "k7DsP4vbN1Qe"
7377
+ },
7378
+ {
7379
+ id: "27160bbd-32d1-4625-812f-860226bfb92a",
7380
+ name: "Isango",
7381
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7382
+ validUntil: null,
7383
+ externalId: "Gm3Z9eQpHw4L"
7384
+ },
7385
+ {
7386
+ id: "967032fd-3f81-478a-826c-30cb8fe121bd",
7387
+ name: "Isamba",
7388
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7389
+ validUntil: null,
7390
+ externalId: "sT0xVu1KqJ7r"
7391
+ },
7392
+ {
7393
+ id: "89a33893-b17d-481d-a26d-6461e7ac1651",
7394
+ name: "Itambo",
7395
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7396
+ validUntil: null,
7397
+ externalId: "Nq6Bv2HpL9Te"
7398
+ },
7399
+ {
7400
+ id: "d42ab2fe-e7ed-470e-8b31-4fb27f9b8250",
7401
+ name: "Ezhi",
7402
+ parentId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7403
+ validUntil: null,
7404
+ externalId: "xK8cQ0ZRy5Wd"
7405
+ },
7406
+ {
7407
+ id: "8fbd09d2-212b-47f4-beb3-5e1694931d9f",
7408
+ name: "Ilanga",
7409
+ parentId: "c599b691-fd2d-45e1-abf4-d185de727fb5",
7410
+ validUntil: null,
7411
+ externalId: "Cq4Jm1XvN8Ls"
7412
+ },
7413
+ // Villages under Ibombo (62a0ccb4-880d-4f30-8882-f256007dfff9)
7414
+ {
7415
+ id: "1d4e5f6a-7b8c-4912-8efa-345678901234",
7416
+ name: "Klow",
7417
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7418
+ validUntil: null,
7419
+ externalId: "IkYcYBUcyY2"
7420
+ },
7421
+ {
7422
+ id: "2e5f6a7b-8c9d-4a23-8fab-456789012345",
7423
+ name: "Mbondo",
7424
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7425
+ validUntil: null,
7426
+ externalId: "Qhvv5hvo3mY"
7427
+ },
7428
+ {
7429
+ id: "3f6a7b8c-9d0e-4b34-8abc-567890123456",
7430
+ name: "Ndara",
7431
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7432
+ validUntil: null,
7433
+ externalId: "crXh068O9TR"
7434
+ },
7435
+ {
7436
+ id: "4a7b8c9d-0e1f-4c45-abcd-678901234567",
7437
+ name: "Olani",
7438
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7439
+ validUntil: null,
7440
+ externalId: "r00It8Tvvp7"
7441
+ },
7442
+ {
7443
+ id: "5b8c9d0e-1f2a-4d56-bcde-789012345678",
7444
+ name: "Pemba",
7445
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7446
+ validUntil: null,
7447
+ externalId: "ZnUWsbONIaH"
7448
+ },
7449
+ {
7450
+ id: "6c9d0e1f-2a3b-4e67-8def-890123456789",
7451
+ name: "Quanza",
7452
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7453
+ validUntil: null,
7454
+ externalId: "fDZycvQTa7l"
7455
+ },
7456
+ {
7457
+ id: "7d0e1f2a-3b4c-4f78-8efa-901234567890",
7458
+ name: "Rivka",
7459
+ parentId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7460
+ validUntil: null,
7461
+ externalId: "KqswxCGTELa"
7462
+ },
7463
+ // Villages under Isamba (967032fd-3f81-478a-826c-30cb8fe121bd)
7464
+ {
7465
+ id: "8e1f2a3b-4c5d-4089-8fab-012345678901",
7466
+ name: "Mbula",
7467
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7468
+ validUntil: null,
7469
+ externalId: "osEbKjRc9Kg"
7470
+ },
7471
+ {
7472
+ id: "9f2a3b4c-5d6e-4190-8abf-123456789012",
7473
+ name: "Ndoki",
7474
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7475
+ validUntil: null,
7476
+ externalId: "aq4daBUAGr3"
7477
+ },
7478
+ {
7479
+ id: "0a3b4c5d-6e7f-4201-abcd-234567890123",
7480
+ name: "Tsanga",
7481
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7482
+ validUntil: null,
7483
+ externalId: "cqis6Y8trbJ"
7484
+ },
7485
+ {
7486
+ id: "1b4c5d6e-7f8a-4312-bcde-345678901234",
7487
+ name: "Waziri",
7488
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7489
+ validUntil: null,
7490
+ externalId: "LMijHPyyx6d"
7491
+ },
7492
+ {
7493
+ id: "2c5d6e7f-8a9b-4423-8def-456789012345",
7494
+ name: "Zimbi",
7495
+ parentId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7496
+ validUntil: null,
7497
+ externalId: "pcQYbPuKGZ7"
7498
+ },
7499
+ // Villages under Itambo (89a33893-b17d-481d-a26d-6461e7ac1651)
7500
+ {
7501
+ id: "3d6e7f8a-9b0c-4534-8efa-567890123456",
7502
+ name: "Felani",
7503
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7504
+ validUntil: null,
7505
+ externalId: "gSqpoCGdMXp"
7506
+ },
7507
+ {
7508
+ id: "4e7f8a9b-0c1d-4645-8fab-678901234567",
7509
+ name: "Goroma",
7510
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7511
+ validUntil: null,
7512
+ externalId: "KvAAIaNqVrp"
7513
+ },
7514
+ {
7515
+ id: "5f8a9b0c-1d2e-4756-8abc-789012345678",
7516
+ name: "Halifu",
7517
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7518
+ validUntil: null,
7519
+ externalId: "qe4UnEVt1hv"
7520
+ },
7521
+ {
7522
+ id: "6a9b0c1d-2e3f-4867-abcd-890123456789",
7523
+ name: "Jabari",
7524
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7525
+ validUntil: null,
7526
+ externalId: "yHH9Nz4rLOt"
7527
+ },
7528
+ {
7529
+ id: "7b0c1d2e-3f4a-4978-bcde-901234567890",
7530
+ name: "Kifani",
7531
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7532
+ validUntil: null,
7533
+ externalId: "eSWmXIGeu1I"
7534
+ },
7535
+ {
7536
+ id: "8c1d2e3f-4a5b-4089-8def-012345678901",
7537
+ name: "Lumela",
7538
+ parentId: "89a33893-b17d-481d-a26d-6461e7ac1651",
7539
+ validUntil: null,
7540
+ externalId: "bh0b3aI1uP3"
7541
+ }
7542
+ ];
7543
+ var V2_DEFAULT_MOCK_LOCATIONS = [
7544
+ {
7545
+ id: "6f6186ce-cd5f-4a5f-810a-2d99e7c4ba12",
7546
+ name: "Central Provincial Office",
7547
+ locationType: "CRVS_OFFICE",
7548
+ administrativeAreaId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7549
+ validUntil: null,
7550
+ externalId: "Xr3Df8WpK6Ys"
7551
+ },
7552
+ {
7553
+ id: "b1c2d3e4-f5a6-7890-bcde-f12345678901",
7554
+ name: "Central Health Post",
7555
+ locationType: "HEALTH_FACILITY",
7556
+ administrativeAreaId: "a45b982a-5c7b-4bd9-8fd8-a42d0994054c",
7557
+ validUntil: null
7558
+ },
7559
+ {
7560
+ id: "028d2c85-ca31-426d-b5d1-2cef545a4902",
7561
+ name: "Ibombo District Office",
7562
+ locationType: "CRVS_OFFICE",
7563
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7564
+ validUntil: null,
7565
+ externalId: "Sm4Nw7GrD2Vy"
7566
+ },
7567
+ {
7568
+ id: "62a0ccb4-4f30-4f30-8882-f256007dff9f",
7569
+ name: "Isamba District Office",
7570
+ locationType: "CRVS_OFFICE",
7571
+ administrativeAreaId: "967032fd-3f81-478a-826c-30cb8fe121bd",
7572
+ validUntil: null,
7573
+ externalId: "Vg1Bq5XeH9Lt"
7574
+ },
7575
+ {
7576
+ id: "954c93e1-13f7-4435-bb82-35e0e215e07d",
7577
+ name: "Isango District Office",
7578
+ locationType: "CRVS_OFFICE",
7579
+ administrativeAreaId: "27160bbd-32d1-4625-812f-860226bfb92a",
7580
+ validUntil: null,
7581
+ externalId: "Je7Lm2XqN9Vz"
7582
+ },
7583
+ {
7584
+ id: "2884f5b9-17b4-49ce-bf4d-f538228935df",
7585
+ name: "Sulaka Provincial Office",
7586
+ locationType: "CRVS_OFFICE",
7587
+ administrativeAreaId: "c599b691-fd2d-45e1-abf4-d185de727fb5",
7588
+ validUntil: null,
7589
+ externalId: "Ht2Wp9KcX5Qv"
7590
+ },
7591
+ {
7592
+ id: "030358c6-54af-44be-821b-8e4af963a49c",
7593
+ name: "Ilanga District Office",
7594
+ locationType: "CRVS_OFFICE",
7595
+ administrativeAreaId: "8fbd09d2-212b-47f4-beb3-5e1694931d9f",
7596
+ validUntil: null,
7597
+ externalId: "Yp6Ds1WqN3Xz"
7598
+ },
7599
+ {
7600
+ id: "423d000f-101b-47c0-8b86-21a908067cee",
7601
+ name: "Chamakubi Health Post",
7602
+ locationType: "HEALTH_FACILITY",
7603
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7604
+ validUntil: null,
7605
+ externalId: "M1nFr8LbC2Qy"
7606
+ },
7607
+ {
7608
+ id: "4d3279be-d026-420c-88f7-f0a4ae986973",
7609
+ name: "Ibombo Rural Health Centre",
7610
+ locationType: "HEALTH_FACILITY",
7611
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7612
+ validUntil: null,
7613
+ externalId: "bT7pV6YrW0Xc"
7614
+ },
7615
+ {
7616
+ id: "190902f4-1d77-476a-8947-41145af1db7d",
7617
+ name: "Chikobo Rural Health Centre",
7618
+ locationType: "HEALTH_FACILITY",
7619
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7620
+ validUntil: null,
7621
+ externalId: "zE4qPn2SgJ5d"
7622
+ },
7623
+ {
7624
+ id: "f5ecbd9b-a01e-4a65-910e-70e86ab41b71",
7625
+ name: "Chilochabalenje Health Post",
7626
+ locationType: "HEALTH_FACILITY",
7627
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7628
+ validUntil: null,
7629
+ externalId: "H8vDs1MqR4Uf"
7630
+ },
7631
+ {
7632
+ id: "dbfc178f-7295-4b90-b28d-111c95b03127",
7633
+ name: "Chipeso Rural Health Centre",
7634
+ locationType: "HEALTH_FACILITY",
7635
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7636
+ validUntil: null,
7637
+ externalId: "Qw3uZ9KfX6Lm"
7638
+ },
7639
+ {
7640
+ id: "09862bfe-c7ac-46cd-987b-668681533c80",
7641
+ name: "Chisamba Rural Health Centre",
7642
+ locationType: "HEALTH_FACILITY",
7643
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7644
+ validUntil: null,
7645
+ externalId: "Yr0pCg8LdM2s"
7646
+ },
7647
+ {
7648
+ id: "834ce389-e95b-4fb0-96a0-33e9ab323059",
7649
+ name: "Chitanda Rural Health Centre",
7650
+ locationType: "HEALTH_FACILITY",
7651
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7652
+ validUntil: null,
7653
+ externalId: "tS9gJ4PwB1Qx"
7654
+ },
7655
+ {
7656
+ id: "0431c433-6062-4a4c-aee9-25271aec61ee",
7657
+ name: "Golden Valley Rural Health Centre",
7658
+ locationType: "HEALTH_FACILITY",
7659
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7660
+ validUntil: null,
7661
+ externalId: "Ld7Qm3XsA8Vr"
7662
+ },
7663
+ {
7664
+ id: "bc84d0b6-7ba7-480d-a339-5d9920d90eb2",
7665
+ name: "Ipongo Rural Health Centre",
7666
+ locationType: "HEALTH_FACILITY",
7667
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7668
+ validUntil: null,
7669
+ externalId: "kF2sW9DmH0Bt"
7670
+ },
7671
+ {
7672
+ id: "4cf1f53b-b730-41d2-8649-dff7eeed970d",
7673
+ name: "Itumbwe Health Post",
7674
+ locationType: "HEALTH_FACILITY",
7675
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7676
+ validUntil: null,
7677
+ externalId: "Ue5Xb3VaC7Pq"
7678
+ },
7679
+ {
7680
+ id: "4b3676cb-9355-4942-9eb9-2ce46acaf0e0",
7681
+ name: "Kabangalala Rural Health Centre",
7682
+ locationType: "HEALTH_FACILITY",
7683
+ administrativeAreaId: "62a0ccb4-880d-4f30-8882-f256007dfff9",
7684
+ validUntil: null,
7685
+ externalId: "Pz8Kc1TqH6Jn"
7686
+ },
7687
+ // Village offices
7688
+ {
7689
+ id: "1f4a5b6c-7d8e-4312-8abc-345678901234",
7690
+ name: "Klow Village Office",
7691
+ locationType: "CRVS_OFFICE",
7692
+ administrativeAreaId: "1d4e5f6a-7b8c-4912-8efa-345678901234",
7693
+ validUntil: null,
7694
+ externalId: "PmAyxAJkxiJ"
7695
+ }
7696
+ ];
7697
+ var V2_DEFAULT_MOCK_LOCATIONS_MAP = new Map(
7698
+ V2_DEFAULT_MOCK_LOCATIONS.map((l) => [l.id, l])
7699
+ );
7700
+ var V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS_MAP = new Map(
7701
+ V2_DEFAULT_MOCK_ADMINISTRATIVE_AREAS.map((a) => [a.id, a])
7702
+ );
7703
+
6955
7704
  // ../commons/src/notification/UserNotifications.ts
6956
7705
  var z44 = __toESM(require("zod/v4"));
6957
7706
  var TriggerEvent = {