@researchdatabox/sails-ng-common 0.2.1 → 5.0.0-RC2

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 (237) hide show
  1. package/dist/src/config/base-field-component.model.d.ts +26 -0
  2. package/dist/src/config/base-field-component.model.js +29 -0
  3. package/dist/src/config/base-field-component.outline.d.ts +108 -0
  4. package/dist/src/config/base-field-component.outline.js +3 -0
  5. package/dist/src/config/component/accordion.model.d.ts +103 -0
  6. package/dist/src/config/component/accordion.model.js +127 -0
  7. package/dist/src/config/component/accordion.outline.d.ts +162 -0
  8. package/dist/src/config/component/accordion.outline.js +13 -0
  9. package/dist/src/config/component/action-row-layout.model.d.ts +28 -0
  10. package/dist/src/config/component/action-row-layout.model.js +35 -0
  11. package/dist/src/config/component/action-row-layout.outline.d.ts +36 -0
  12. package/dist/src/config/component/action-row-layout.outline.js +6 -0
  13. package/dist/src/config/component/cancel-button.model.d.ts +48 -0
  14. package/dist/src/config/component/cancel-button.model.js +58 -0
  15. package/dist/src/config/component/cancel-button.outline.d.ts +85 -0
  16. package/dist/src/config/component/cancel-button.outline.js +6 -0
  17. package/dist/src/config/component/checkbox-input.model.d.ts +67 -0
  18. package/dist/src/config/component/checkbox-input.model.js +79 -0
  19. package/dist/src/config/component/checkbox-input.outline.d.ts +93 -0
  20. package/dist/src/config/component/checkbox-input.outline.js +8 -0
  21. package/dist/src/config/component/checkbox-tree.model.d.ts +68 -0
  22. package/dist/src/config/component/checkbox-tree.model.js +80 -0
  23. package/dist/src/config/component/checkbox-tree.outline.d.ts +105 -0
  24. package/dist/src/config/component/checkbox-tree.outline.js +8 -0
  25. package/dist/src/config/component/content.model.d.ts +46 -0
  26. package/dist/src/config/component/content.model.js +56 -0
  27. package/dist/src/config/component/content.outline.d.ts +74 -0
  28. package/dist/src/config/component/content.outline.js +6 -0
  29. package/dist/src/config/component/data-location.model.d.ts +83 -0
  30. package/dist/src/config/component/data-location.model.js +95 -0
  31. package/dist/src/config/component/data-location.outline.d.ts +124 -0
  32. package/dist/src/config/component/data-location.outline.js +6 -0
  33. package/dist/src/config/component/date-input.model.d.ts +67 -0
  34. package/dist/src/config/component/date-input.model.js +80 -0
  35. package/dist/src/config/component/date-input.outline.d.ts +88 -0
  36. package/dist/src/config/component/date-input.outline.js +8 -0
  37. package/dist/src/config/component/default-layout.model.d.ts +22 -0
  38. package/dist/src/config/component/default-layout.model.js +30 -0
  39. package/dist/src/config/component/default-layout.outline.d.ts +29 -0
  40. package/dist/src/config/component/default-layout.outline.js +5 -0
  41. package/dist/src/config/component/delete-button.model.d.ts +46 -0
  42. package/dist/src/config/component/delete-button.model.js +48 -0
  43. package/dist/src/config/component/delete-button.outline.d.ts +89 -0
  44. package/dist/src/config/component/delete-button.outline.js +5 -0
  45. package/dist/src/config/component/dropdown-input.model.d.ts +65 -0
  46. package/dist/src/config/component/dropdown-input.model.js +78 -0
  47. package/dist/src/config/component/dropdown-input.outline.d.ts +92 -0
  48. package/dist/src/config/component/dropdown-input.outline.js +8 -0
  49. package/dist/src/config/component/file-upload.model.d.ts +67 -0
  50. package/dist/src/config/component/file-upload.model.js +81 -0
  51. package/dist/src/config/component/file-upload.outline.d.ts +99 -0
  52. package/dist/src/config/component/file-upload.outline.js +8 -0
  53. package/dist/src/config/component/group.model.d.ts +61 -0
  54. package/dist/src/config/component/group.model.js +75 -0
  55. package/dist/src/config/component/group.outline.d.ts +83 -0
  56. package/dist/src/config/component/group.outline.js +8 -0
  57. package/dist/src/config/component/inline-layout.model.d.ts +22 -0
  58. package/dist/src/config/component/inline-layout.model.js +29 -0
  59. package/dist/src/config/component/inline-layout.outline.d.ts +29 -0
  60. package/dist/src/config/component/inline-layout.outline.js +5 -0
  61. package/dist/src/config/component/integration-status.model.d.ts +49 -0
  62. package/dist/src/config/component/integration-status.model.js +65 -0
  63. package/dist/src/config/component/integration-status.outline.d.ts +61 -0
  64. package/dist/src/config/component/integration-status.outline.js +5 -0
  65. package/dist/src/config/component/map.model.d.ts +69 -0
  66. package/dist/src/config/component/map.model.js +86 -0
  67. package/dist/src/config/component/map.outline.d.ts +110 -0
  68. package/dist/src/config/component/map.outline.js +8 -0
  69. package/dist/src/config/component/pdf-list.model.d.ts +68 -0
  70. package/dist/src/config/component/pdf-list.model.js +71 -0
  71. package/dist/src/config/component/pdf-list.outline.d.ts +97 -0
  72. package/dist/src/config/component/pdf-list.outline.js +6 -0
  73. package/dist/src/config/component/publish-data-location-refresh.model.d.ts +39 -0
  74. package/dist/src/config/component/publish-data-location-refresh.model.js +52 -0
  75. package/dist/src/config/component/publish-data-location-refresh.outline.d.ts +58 -0
  76. package/dist/src/config/component/publish-data-location-refresh.outline.js +5 -0
  77. package/dist/src/config/component/publish-data-location-selector.model.d.ts +78 -0
  78. package/dist/src/config/component/publish-data-location-selector.model.js +104 -0
  79. package/dist/src/config/component/publish-data-location-selector.outline.d.ts +110 -0
  80. package/dist/src/config/component/publish-data-location-selector.outline.js +6 -0
  81. package/dist/src/config/component/question-tree.helper.d.ts +58 -0
  82. package/dist/src/config/component/question-tree.helper.js +291 -0
  83. package/dist/src/config/component/question-tree.model.d.ts +64 -0
  84. package/dist/src/config/component/question-tree.model.js +80 -0
  85. package/dist/src/config/component/question-tree.outline.d.ts +314 -0
  86. package/dist/src/config/component/question-tree.outline.js +9 -0
  87. package/dist/src/config/component/radio-input.model.d.ts +65 -0
  88. package/dist/src/config/component/radio-input.model.js +77 -0
  89. package/dist/src/config/component/radio-input.outline.d.ts +91 -0
  90. package/dist/src/config/component/radio-input.outline.js +8 -0
  91. package/dist/src/config/component/record-metadata-retriever.model.d.ts +41 -0
  92. package/dist/src/config/component/record-metadata-retriever.model.js +57 -0
  93. package/dist/src/config/component/record-metadata-retriever.outline.d.ts +53 -0
  94. package/dist/src/config/component/record-metadata-retriever.outline.js +5 -0
  95. package/dist/src/config/component/record-selector.model.d.ts +61 -0
  96. package/dist/src/config/component/record-selector.model.js +61 -0
  97. package/dist/src/config/component/record-selector.outline.d.ts +91 -0
  98. package/dist/src/config/component/record-selector.outline.js +6 -0
  99. package/dist/src/config/component/repeatable.model.d.ts +91 -0
  100. package/dist/src/config/component/repeatable.model.js +112 -0
  101. package/dist/src/config/component/repeatable.outline.d.ts +115 -0
  102. package/dist/src/config/component/repeatable.outline.js +10 -0
  103. package/dist/src/config/component/reusable.model.d.ts +42 -0
  104. package/dist/src/config/component/reusable.model.js +57 -0
  105. package/dist/src/config/component/reusable.outline.d.ts +55 -0
  106. package/dist/src/config/component/reusable.outline.js +6 -0
  107. package/dist/src/config/component/rich-text-editor.model.d.ts +65 -0
  108. package/dist/src/config/component/rich-text-editor.model.js +79 -0
  109. package/dist/src/config/component/rich-text-editor.outline.d.ts +92 -0
  110. package/dist/src/config/component/rich-text-editor.outline.js +8 -0
  111. package/dist/src/config/component/save-button.model.d.ts +49 -0
  112. package/dist/src/config/component/save-button.model.js +59 -0
  113. package/dist/src/config/component/save-button.outline.d.ts +90 -0
  114. package/dist/src/config/component/save-button.outline.js +6 -0
  115. package/dist/src/config/component/save-status.model.d.ts +42 -0
  116. package/dist/src/config/component/save-status.model.js +60 -0
  117. package/dist/src/config/component/save-status.outline.d.ts +58 -0
  118. package/dist/src/config/component/save-status.outline.js +6 -0
  119. package/dist/src/config/component/simple-input.model.d.ts +62 -0
  120. package/dist/src/config/component/simple-input.model.js +75 -0
  121. package/dist/src/config/component/simple-input.outline.d.ts +86 -0
  122. package/dist/src/config/component/simple-input.outline.js +9 -0
  123. package/dist/src/config/component/suggested-validation-summary.model.d.ts +45 -0
  124. package/dist/src/config/component/suggested-validation-summary.model.js +61 -0
  125. package/dist/src/config/component/suggested-validation-summary.outline.d.ts +57 -0
  126. package/dist/src/config/component/suggested-validation-summary.outline.js +5 -0
  127. package/dist/src/config/component/tab-content.model.d.ts +63 -0
  128. package/dist/src/config/component/tab-content.model.js +77 -0
  129. package/dist/src/config/component/tab-content.outline.d.ts +98 -0
  130. package/dist/src/config/component/tab-content.outline.js +8 -0
  131. package/dist/src/config/component/tab-nav-button.model.d.ts +45 -0
  132. package/dist/src/config/component/tab-nav-button.model.js +55 -0
  133. package/dist/src/config/component/tab-nav-button.outline.d.ts +70 -0
  134. package/dist/src/config/component/tab-nav-button.outline.js +6 -0
  135. package/dist/src/config/component/tab.model.d.ts +71 -0
  136. package/dist/src/config/component/tab.model.js +84 -0
  137. package/dist/src/config/component/tab.outline.d.ts +112 -0
  138. package/dist/src/config/component/tab.outline.js +9 -0
  139. package/dist/src/config/component/text-area.model.d.ts +63 -0
  140. package/dist/src/config/component/text-area.model.js +76 -0
  141. package/dist/src/config/component/text-area.outline.d.ts +87 -0
  142. package/dist/src/config/component/text-area.outline.js +8 -0
  143. package/dist/src/config/component/typeahead-input.model.d.ts +83 -0
  144. package/dist/src/config/component/typeahead-input.model.js +97 -0
  145. package/dist/src/config/component/typeahead-input.outline.d.ts +199 -0
  146. package/dist/src/config/component/typeahead-input.outline.js +10 -0
  147. package/dist/src/config/component/validation-summary.model.d.ts +42 -0
  148. package/dist/src/config/component/validation-summary.model.js +60 -0
  149. package/dist/src/config/component/validation-summary.outline.d.ts +63 -0
  150. package/dist/src/config/component/validation-summary.outline.js +6 -0
  151. package/dist/src/config/dictionary.model.d.ts +648 -0
  152. package/dist/src/config/dictionary.model.js +181 -0
  153. package/dist/src/config/dictionary.outline.d.ts +96 -0
  154. package/dist/src/config/dictionary.outline.js +3 -0
  155. package/dist/src/config/field-component.model.d.ts +7 -0
  156. package/dist/src/config/field-component.model.js +11 -0
  157. package/dist/src/config/field-component.outline.d.ts +20 -0
  158. package/dist/src/config/field-component.outline.js +3 -0
  159. package/dist/src/config/field-layout.model.d.ts +19 -0
  160. package/dist/src/config/field-layout.model.js +23 -0
  161. package/dist/src/config/field-layout.outline.d.ts +42 -0
  162. package/dist/src/config/field-layout.outline.js +3 -0
  163. package/dist/src/config/field-model.model.d.ts +21 -0
  164. package/dist/src/config/field-model.model.js +24 -0
  165. package/dist/src/config/field-model.outline.d.ts +63 -0
  166. package/dist/src/config/field-model.outline.js +3 -0
  167. package/dist/src/config/field.model.d.ts +12 -0
  168. package/dist/src/config/field.model.js +12 -0
  169. package/dist/src/config/field.outline.d.ts +19 -0
  170. package/dist/src/config/field.outline.js +3 -0
  171. package/dist/src/config/form-behaviour.outline.d.ts +128 -0
  172. package/dist/src/config/form-behaviour.outline.js +40 -0
  173. package/dist/src/config/form-component.model.d.ts +38 -0
  174. package/dist/src/config/form-component.model.js +36 -0
  175. package/dist/src/config/form-component.outline.d.ts +305 -0
  176. package/dist/src/config/form-component.outline.js +27 -0
  177. package/dist/src/config/form-config.model.d.ts +33 -0
  178. package/dist/src/config/form-config.model.js +36 -0
  179. package/dist/src/config/form-config.outline.d.ts +111 -0
  180. package/dist/src/config/form-config.outline.js +3 -0
  181. package/dist/src/config/form-override.model.d.ts +146 -0
  182. package/dist/src/config/form-override.model.js +1523 -0
  183. package/dist/src/config/form-override.outline.d.ts +15 -0
  184. package/dist/src/config/form-override.outline.js +3 -0
  185. package/dist/src/config/form-prehydrate.outline.d.ts +17 -0
  186. package/dist/src/config/form-prehydrate.outline.js +5 -0
  187. package/dist/src/config/form-types.model.d.ts +6 -0
  188. package/dist/src/config/form-types.model.js +23 -0
  189. package/dist/src/config/form-types.outline.d.ts +48 -0
  190. package/dist/src/config/form-types.outline.js +137 -0
  191. package/dist/src/config/helpers.d.ts +31 -0
  192. package/dist/src/config/helpers.js +122 -0
  193. package/dist/src/config/names/naming-helpers.d.ts +112 -0
  194. package/dist/src/config/names/naming-helpers.js +188 -0
  195. package/dist/src/config/names/query-helpers.d.ts +43 -0
  196. package/dist/src/config/names/query-helpers.js +59 -0
  197. package/dist/src/config/shared.outline.d.ts +54 -0
  198. package/dist/src/config/shared.outline.js +41 -0
  199. package/dist/src/config/visitor/base.model.d.ts +143 -0
  200. package/dist/src/config/visitor/base.model.js +336 -0
  201. package/dist/src/config/visitor/base.outline.d.ts +146 -0
  202. package/dist/src/config/visitor/base.outline.js +3 -0
  203. package/dist/src/config/visitor/common.model.d.ts +119 -0
  204. package/dist/src/config/visitor/common.model.js +422 -0
  205. package/dist/src/date-format-helpers.d.ts +1 -0
  206. package/dist/src/date-format-helpers.js +21 -0
  207. package/dist/src/handlebars-helpers.d.ts +258 -0
  208. package/dist/src/handlebars-helpers.js +715 -0
  209. package/dist/src/html-helpers.d.ts +15 -0
  210. package/dist/src/html-helpers.js +42 -0
  211. package/dist/src/index.d.ts +118 -3
  212. package/dist/src/index.js +127 -2
  213. package/dist/src/jsonata-helpers.d.ts +40 -0
  214. package/dist/src/jsonata-helpers.js +118 -0
  215. package/dist/src/logger.interface.d.ts +14 -0
  216. package/dist/src/logger.interface.js +3 -0
  217. package/dist/src/record.model.d.ts +23 -0
  218. package/dist/src/record.model.js +19 -1
  219. package/dist/src/report.model.d.ts +46 -0
  220. package/dist/src/status.model.d.ts +22 -0
  221. package/dist/src/status.model.js +28 -0
  222. package/dist/src/template.outline.d.ts +82 -0
  223. package/dist/src/template.outline.js +14 -0
  224. package/dist/src/translation-helpers.d.ts +26 -0
  225. package/dist/src/translation-helpers.js +71 -0
  226. package/dist/src/validation/form.model.d.ts +306 -24
  227. package/dist/src/validation/form.model.js +29 -1
  228. package/dist/src/validation/helpers.d.ts +15 -7
  229. package/dist/src/validation/helpers.js +49 -13
  230. package/dist/src/validation/validators-support.d.ts +39 -2
  231. package/dist/src/validation/validators-support.js +162 -12
  232. package/dist/src/validation/validators.d.ts +28 -0
  233. package/dist/src/validation/validators.js +531 -0
  234. package/package.json +51 -34
  235. package/LICENSE +0 -674
  236. package/dist/src/validation/index.d.ts +0 -3
  237. package/dist/src/validation/index.js +0 -20
@@ -0,0 +1,531 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formValidatorsSharedDefinitions = exports.FORM_VALIDATOR_DOI_REGEXP = exports.FORM_VALIDATOR_EMAIL_REGEXP = void 0;
4
+ const helpers_1 = require("./helpers");
5
+ function hasMeaningfulValue(value) {
6
+ if (value == null) {
7
+ return false;
8
+ }
9
+ if (typeof value === "string") {
10
+ return value.trim().length > 0;
11
+ }
12
+ const lengthOrSize = (0, helpers_1.formValidatorLengthOrSize)(value);
13
+ if (lengthOrSize !== null) {
14
+ return lengthOrSize > 0;
15
+ }
16
+ return true;
17
+ }
18
+ function hasLegacyRequiredValue(value) {
19
+ if (value == null) {
20
+ return false;
21
+ }
22
+ const lengthOrSize = (0, helpers_1.formValidatorLengthOrSize)(value);
23
+ if (lengthOrSize !== null) {
24
+ return lengthOrSize > 0;
25
+ }
26
+ return true;
27
+ }
28
+ function hasRequiredFieldValue(value, fieldNames) {
29
+ if (fieldNames.length === 0) {
30
+ return hasLegacyRequiredValue(value);
31
+ }
32
+ if (Array.isArray(value)) {
33
+ return value.some(item => hasRequiredFieldValue(item, fieldNames));
34
+ }
35
+ if (value == null || typeof value !== "object") {
36
+ return false;
37
+ }
38
+ const candidate = value;
39
+ return fieldNames.some(fieldName => hasMeaningfulValue(candidate[fieldName]));
40
+ }
41
+ /**
42
+ * A regular expression for validating an email address.
43
+ *
44
+ * Based on the angular email validation regex. MIT-style license https://angular.dev/license
45
+ */
46
+ exports.FORM_VALIDATOR_EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
47
+ /**
48
+ * A regular expression for a bare DOI (without a doi.org resolver URL).
49
+ *
50
+ * This follows the Crossref-recommended broad DOI syntax and is intentionally
51
+ * case-insensitive for DOI suffixes.
52
+ */
53
+ exports.FORM_VALIDATOR_DOI_REGEXP = /^10\.\d{4,9}\/[-._;()/:a-zA-Z0-9]+$/i;
54
+ function createNestedSyncValidator(validatorConfig) {
55
+ const definition = exports.formValidatorsSharedDefinitions.find(item => item.class === validatorConfig.class);
56
+ if (definition == null) {
57
+ throw new Error(`No validator definition with class '${validatorConfig.class}' in 'any-of' validator.`);
58
+ }
59
+ if (!("create" in definition)) {
60
+ throw new Error(`Validator '${validatorConfig.class}' in 'any-of' must be synchronous.`);
61
+ }
62
+ const syncDefinition = definition;
63
+ return syncDefinition.create({
64
+ ...(validatorConfig.config ?? {}),
65
+ class: validatorConfig.class,
66
+ message: validatorConfig.message ?? syncDefinition.message,
67
+ });
68
+ }
69
+ /**
70
+ * Definitions of form validators.
71
+ *
72
+ * These can be used on both server-side and client-side.
73
+ * The server provides them to the client.
74
+ *
75
+ * Sails hooks can use these validators functions, but cannot extend or override them.
76
+ * Use the 'jsonata-expression' validator to create custom validator functions.
77
+ *
78
+ * The validators are based on:
79
+ * - angular built-in validators: https://github.com/angular/angular/blob/5105fd6f05f01f04873ab1c87d64079fd8519ad4/packages/forms/src/validators.ts
80
+ * - formly schema: https://github.com/ngx-formly/ngx-formly/blob/a2f7901b6c0895aee63b4b5fe748fc5ec0ad5475/src/core/src/lib/models/fieldconfig.ts
81
+ */
82
+ exports.formValidatorsSharedDefinitions = [
83
+ {
84
+ class: "min",
85
+ message: "@validator-error-min",
86
+ create: (config) => {
87
+ const optionMinKey = "min";
88
+ const optionMinValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMinKey);
89
+ return (control) => {
90
+ if (control.value == null || optionMinValue == null) {
91
+ return null; // don't validate empty values to allow optional controls
92
+ }
93
+ let value;
94
+ try {
95
+ value = parseFloat(control.value?.toString() ?? null);
96
+ }
97
+ catch (err) {
98
+ value = undefined;
99
+ }
100
+ // Controls with NaN values after parsing should be treated as not having a
101
+ // minimum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-min
102
+ if (value === undefined || (!isNaN(value) && value < optionMinValue)) {
103
+ return (0, helpers_1.formValidatorBuildError)(config, {
104
+ requiredThreshold: optionMinValue,
105
+ actual: control.value,
106
+ });
107
+ }
108
+ return null;
109
+ };
110
+ },
111
+ },
112
+ {
113
+ class: "max",
114
+ message: "@validator-error-max",
115
+ create: (config) => {
116
+ const optionMaxKey = "max";
117
+ const optionMaxValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMaxKey);
118
+ return (control) => {
119
+ if (control.value == null || optionMaxValue == null) {
120
+ return null; // don't validate empty values to allow optional controls
121
+ }
122
+ let value;
123
+ try {
124
+ value = parseFloat(control.value?.toString() ?? null);
125
+ }
126
+ catch (err) {
127
+ value = undefined;
128
+ }
129
+ // Controls with NaN values after parsing should be treated as not having a
130
+ // maximum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-max
131
+ if (value === undefined || (!isNaN(value) && value > optionMaxValue)) {
132
+ return (0, helpers_1.formValidatorBuildError)(config, {
133
+ requiredThreshold: optionMaxValue,
134
+ actual: control.value,
135
+ });
136
+ }
137
+ return null;
138
+ };
139
+ },
140
+ },
141
+ {
142
+ class: "minLength",
143
+ message: "@validator-error-min-length",
144
+ create: (config) => {
145
+ const optionMinLengthKey = "minLength";
146
+ const optionMinLengthValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMinLengthKey);
147
+ return (control) => {
148
+ const length = (0, helpers_1.formValidatorLengthOrSize)(control.value);
149
+ if (length === null || length === 0) {
150
+ // don't validate empty values to allow optional controls
151
+ // don't validate values without `length` or `size` property
152
+ return null;
153
+ }
154
+ return length < optionMinLengthValue
155
+ ? (0, helpers_1.formValidatorBuildError)(config, {
156
+ requiredLength: optionMinLengthValue,
157
+ actualLength: length,
158
+ })
159
+ : null;
160
+ };
161
+ },
162
+ },
163
+ {
164
+ class: "maxLength",
165
+ message: "@validator-error-max-length",
166
+ create: (config) => {
167
+ const optionMaxLengthKey = "maxLength";
168
+ const optionMaxLengthValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMaxLengthKey);
169
+ return (control) => {
170
+ const length = (0, helpers_1.formValidatorLengthOrSize)(control.value);
171
+ if (length !== null && length > optionMaxLengthValue) {
172
+ return (0, helpers_1.formValidatorBuildError)(config, {
173
+ requiredLength: optionMaxLengthValue,
174
+ actualLength: length,
175
+ });
176
+ }
177
+ return null;
178
+ };
179
+ },
180
+ },
181
+ {
182
+ class: "required",
183
+ message: "@validator-error-required",
184
+ create: (config) => {
185
+ const optionRequiredKey = "required";
186
+ const optionRequiredValue = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, optionRequiredKey, true);
187
+ const optionAnyOfFields = Array.isArray(config?.['anyOfFields'])
188
+ ? config['anyOfFields'].map(item => item?.toString() ?? "").filter(item => item.length > 0)
189
+ : [];
190
+ return (control) => {
191
+ if (!optionRequiredValue) {
192
+ return null;
193
+ }
194
+ const isValid = optionAnyOfFields.length > 0
195
+ ? hasRequiredFieldValue(control.value, optionAnyOfFields)
196
+ : control.value != null && (0, helpers_1.formValidatorLengthOrSize)(control.value) !== 0;
197
+ if (!isValid) {
198
+ return (0, helpers_1.formValidatorBuildError)(config, {
199
+ required: optionRequiredValue,
200
+ actual: control.value,
201
+ });
202
+ }
203
+ return null;
204
+ };
205
+ },
206
+ },
207
+ {
208
+ class: "requiredTrue",
209
+ message: "@validator-error-required-true",
210
+ create: (config) => {
211
+ const optionRequiredKey = "requiredTrue";
212
+ const optionRequiredValue = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, optionRequiredKey, true);
213
+ return (control) => {
214
+ if (optionRequiredValue && control.value !== true) {
215
+ return (0, helpers_1.formValidatorBuildError)(config, {
216
+ required: optionRequiredValue,
217
+ actual: control.value,
218
+ });
219
+ }
220
+ return null;
221
+ };
222
+ },
223
+ },
224
+ {
225
+ class: "email",
226
+ message: "@validator-error-email",
227
+ create: (config) => {
228
+ const optionDescriptionKey = "description";
229
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey, "email must be in format (name)@(domain.tld)");
230
+ const optionPatternKey = "pattern";
231
+ const optionPatternValue = (0, helpers_1.formValidatorGetDefinitionRegexp)(config, optionPatternKey, exports.FORM_VALIDATOR_EMAIL_REGEXP);
232
+ return (control) => {
233
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
234
+ // don't validate empty values to allow optional controls
235
+ return null;
236
+ }
237
+ const value = control.value?.toString() ?? "";
238
+ const testOutcome = optionPatternValue.test(value);
239
+ if (!testOutcome) {
240
+ return (0, helpers_1.formValidatorBuildError)(config, {
241
+ requiredPattern: optionPatternValue,
242
+ description: optionDescriptionValue, actual: control.value,
243
+ });
244
+ }
245
+ return null;
246
+ };
247
+ },
248
+ },
249
+ {
250
+ class: "pattern",
251
+ message: "@validator-error-pattern",
252
+ create: (config) => {
253
+ const optionDescriptionKey = "description";
254
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey);
255
+ const optionPatternKey = "pattern";
256
+ const pattern = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionPatternKey);
257
+ let regex;
258
+ let regexStr = (pattern instanceof RegExp ? pattern?.source : pattern?.toString()) ?? "";
259
+ // The pattern must start with '^' (start anchor)
260
+ if (regexStr.charAt(0) !== "^") {
261
+ regexStr = ("^" + regexStr);
262
+ }
263
+ // The pattern must end with '$' (end anchor).
264
+ if (regexStr.charAt(regexStr.length - 1) !== "$") {
265
+ regexStr = (regexStr + "$");
266
+ }
267
+ regex = new RegExp(regexStr);
268
+ return (control) => {
269
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
270
+ return null; // don't validate empty values to allow optional controls
271
+ }
272
+ const value = control.value?.toString();
273
+ return regex.test(value)
274
+ ? null
275
+ : (0, helpers_1.formValidatorBuildError)(config, {
276
+ requiredPattern: regexStr,
277
+ description: optionDescriptionValue,
278
+ actual: value,
279
+ });
280
+ };
281
+ },
282
+ },
283
+ {
284
+ class: "different-values",
285
+ message: "@validator-error-different-values",
286
+ create: (config) => {
287
+ const optionControlNamesKey = "controlNames";
288
+ const optionControlNamesValue = (0, helpers_1.formValidatorGetDefinitionArray)(config, optionControlNamesKey);
289
+ return (control) => {
290
+ // TODO: fix how control values are obtained - need to use full angular component path
291
+ const controls = (optionControlNamesValue ?? [])
292
+ ?.filter(i => i !== null && i !== undefined)
293
+ ?.map(n => control?.get(n?.toString())) ?? [];
294
+ const values = new Set(controls?.map(c => c?.value) ?? []);
295
+ const compare = values.size === controls.length;
296
+ return compare
297
+ ? null
298
+ : (0, helpers_1.formValidatorBuildError)(config, {
299
+ controlNames: optionControlNamesValue,
300
+ controlCount: optionControlNamesValue?.length,
301
+ valueCount: values.size,
302
+ values: Array.from(values),
303
+ });
304
+ };
305
+ },
306
+ },
307
+ {
308
+ class: "jsonata-expression",
309
+ message: "@validator-error-jsonata-expression",
310
+ createAsync: (config) => {
311
+ const optionDescriptionKey = "description";
312
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey, "");
313
+ const optionExpressionKey = "expression";
314
+ const expression = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionExpressionKey);
315
+ const optionEvaluatorKey = "evaluator";
316
+ const evaluator = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionEvaluatorKey);
317
+ return async (control) => {
318
+ // Notes:
319
+ // 1. For the jsonata-expression validator, always validate the control value.
320
+ // This enables the expression to decide whether empty values are valid or not.
321
+ // If empty values were not validated, then the expression would not have the option to treat empty values as invalid.
322
+ // 2. jsonata tries to define a 'keepSingleton' property on the input value.
323
+ // Must clone the value because control values cannot be extended.
324
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cant_define_property_object_not_extensible
325
+ let success = null;
326
+ let value;
327
+ try {
328
+ value = structuredClone(control.value);
329
+ }
330
+ catch (err) {
331
+ success = false;
332
+ console.error(`Validator 'jsonata-expression' with description '${optionDescriptionValue}' could not run due to error: control value cannot be cloned`);
333
+ }
334
+ if (success === null && typeof evaluator !== "function") {
335
+ success = false;
336
+ console.error(`Validator 'jsonata-expression' with description '${optionDescriptionValue}' could not run due to error: evaluator is not a function`);
337
+ }
338
+ if (success === null) {
339
+ try {
340
+ success = await evaluator(value) === true;
341
+ }
342
+ catch (err) {
343
+ success = false;
344
+ console.error(`Validator 'jsonata-expression' with description '${optionDescriptionValue}' could not run due to error: ${err}`);
345
+ }
346
+ }
347
+ return success
348
+ ? null
349
+ : (0, helpers_1.formValidatorBuildError)(config, {
350
+ expression: expression,
351
+ description: optionDescriptionValue,
352
+ actual: control.value,
353
+ });
354
+ };
355
+ },
356
+ },
357
+ // Validates an ORCID identifier. Details on the ORCID format and checksum can be found at https://support.orcid.org/hc/en-us/articles/360006897674-Structure-of-the-ORCID-Identifier
358
+ {
359
+ class: "orcid",
360
+ message: "@validator-error-orcid",
361
+ create: (config) => {
362
+ return (control) => {
363
+ if (control.value == null || control.value === "") {
364
+ return null; // don't validate empty values
365
+ }
366
+ let value = control.value.toString();
367
+ // Validate format: either xxxx-xxxx-xxxx-xxxx or xxxxxxxxxxxxxxxx, last digit can be X or x
368
+ if (!/^(\d{4}-\d{4}-\d{4}-\d{3}[\dXx]|\d{15}[\dXx])$/.test(value)) {
369
+ return (0, helpers_1.formValidatorBuildError)(config, {
370
+ actual: control.value,
371
+ });
372
+ }
373
+ value = value.replace(/-/g, '');
374
+ if (value.length !== 16) {
375
+ return (0, helpers_1.formValidatorBuildError)(config, {
376
+ actual: control.value,
377
+ });
378
+ }
379
+ const baseDigits = value.substring(0, 15);
380
+ const checkDigit = value.substring(15);
381
+ let total = 0;
382
+ for (let i = 0; i < baseDigits.length; i++) {
383
+ const digit = parseInt(baseDigits.charAt(i), 10);
384
+ total = (total + digit) * 2;
385
+ }
386
+ const remainder = total % 11;
387
+ const result = (12 - remainder) % 11;
388
+ const calculatedCheckDigit = result === 10 ? "X" : result.toString();
389
+ if (checkDigit.toUpperCase() !== calculatedCheckDigit) {
390
+ return (0, helpers_1.formValidatorBuildError)(config, {
391
+ actual: control.value,
392
+ });
393
+ }
394
+ return null;
395
+ };
396
+ },
397
+ },
398
+ // Validates a URL using the WHATWG URL parser. By default only absolute http(s) URLs pass.
399
+ // Configuration options (all optional):
400
+ // - schemes: string[] allowed schemes for absolute URLs (default ["http", "https"]).
401
+ // An empty array allows any scheme.
402
+ // - allowAbsolute: boolean accept absolute URLs, e.g. "https://example.org/x" (default true).
403
+ // - allowRelative: boolean accept relative references, e.g. "/path", "page?q=1", "../x"
404
+ // (default false). Protocol-relative values ("//host/x") are rejected.
405
+ // - requireTld: boolean when accepting an absolute URL, require the host to contain a dot,
406
+ // e.g. reject "http://localhost" (default false).
407
+ // - description: string included in the error params for custom messaging.
408
+ {
409
+ class: "url",
410
+ message: "@validator-error-url",
411
+ create: (config) => {
412
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, "description", "");
413
+ const allowAbsolute = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, "allowAbsolute", true);
414
+ const allowRelative = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, "allowRelative", false);
415
+ const requireTld = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, "requireTld", false);
416
+ const schemes = (0, helpers_1.formValidatorGetDefinitionArray)(config, "schemes", ["http", "https"])
417
+ .map((scheme) => (scheme?.toString() ?? "").trim().toLowerCase().replace(/:$/, ""))
418
+ .filter((scheme) => scheme.length > 0);
419
+ return (control) => {
420
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
421
+ return null; // don't validate empty values to allow optional controls
422
+ }
423
+ const candidate = control.value.toString().trim();
424
+ if (candidate.length === 0) {
425
+ return null; // treat whitespace-only values as empty/optional
426
+ }
427
+ const buildError = () => (0, helpers_1.formValidatorBuildError)(config, {
428
+ description: optionDescriptionValue,
429
+ schemes,
430
+ allowAbsolute,
431
+ allowRelative,
432
+ actual: control.value,
433
+ });
434
+ // Try to parse as an absolute URL first. A successful parse means the value has a scheme.
435
+ let absolute = null;
436
+ try {
437
+ absolute = new URL(candidate);
438
+ }
439
+ catch {
440
+ absolute = null;
441
+ }
442
+ if (absolute) {
443
+ if (!allowAbsolute) {
444
+ return buildError();
445
+ }
446
+ const scheme = absolute.protocol.replace(/:$/, "").toLowerCase();
447
+ if (schemes.length > 0 && !schemes.includes(scheme)) {
448
+ return buildError();
449
+ }
450
+ if (requireTld && !absolute.hostname.includes(".")) {
451
+ return buildError();
452
+ }
453
+ return null;
454
+ }
455
+ // Not absolute, so treat it as a relative reference.
456
+ if (!allowRelative) {
457
+ return buildError();
458
+ }
459
+ // Protocol-relative values resolve to an arbitrary host, escaping the relative scope.
460
+ if (candidate.startsWith("//")) {
461
+ return buildError();
462
+ }
463
+ try {
464
+ // Resolving against a base only throws for malformed relative references.
465
+ new URL(candidate, "http://relative.invalid/");
466
+ }
467
+ catch {
468
+ return buildError();
469
+ }
470
+ return null;
471
+ };
472
+ },
473
+ },
474
+ // Validates a bare DOI. DOI resolver URLs are URLs, not bare DOI identifiers,
475
+ // and can be accepted separately by composing this validator with `url`.
476
+ {
477
+ class: "doi",
478
+ message: "@validator-error-doi",
479
+ create: (config) => {
480
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, "description", "");
481
+ return (control) => {
482
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
483
+ return null; // don't validate empty values to allow optional controls
484
+ }
485
+ const candidate = control.value.toString().trim();
486
+ if (candidate.length === 0) {
487
+ return null; // treat whitespace-only values as empty/optional
488
+ }
489
+ return exports.FORM_VALIDATOR_DOI_REGEXP.test(candidate)
490
+ ? null
491
+ : (0, helpers_1.formValidatorBuildError)(config, {
492
+ description: optionDescriptionValue,
493
+ requiredPattern: exports.FORM_VALIDATOR_DOI_REGEXP.source,
494
+ actual: control.value,
495
+ });
496
+ };
497
+ },
498
+ },
499
+ // Applies nested synchronous validators with OR semantics. The value is valid
500
+ // when at least one nested validator accepts it. This allows reusable validators
501
+ // such as `url` and `doi` to be combined on a single input without duplicating
502
+ // their validation rules in form configuration.
503
+ {
504
+ class: "any-of",
505
+ message: "@validator-error-any-of",
506
+ create: (config) => {
507
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, "description", "");
508
+ const validatorConfigs = (0, helpers_1.formValidatorGetDefinitionArray)(config, "validators");
509
+ if (validatorConfigs.length === 0) {
510
+ throw new Error("Validator 'any-of' requires at least one nested validator.");
511
+ }
512
+ const validators = validatorConfigs.map((validatorConfig) => {
513
+ if (validatorConfig == null || typeof validatorConfig !== "object" || typeof validatorConfig.class !== "string" || validatorConfig.class === "") {
514
+ throw new Error(`Invalid nested validator in 'any-of': ${JSON.stringify(validatorConfig)}.`);
515
+ }
516
+ return createNestedSyncValidator(validatorConfig);
517
+ });
518
+ return (control) => {
519
+ const accepted = validators.some(validator => validator(control) == null);
520
+ return accepted
521
+ ? null
522
+ : (0, helpers_1.formValidatorBuildError)(config, {
523
+ description: optionDescriptionValue,
524
+ validatorClasses: validatorConfigs.map(item => item.class),
525
+ actual: control.value,
526
+ });
527
+ };
528
+ },
529
+ },
530
+ ];
531
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsdUNBU21CO0FBR25CLFNBQVMsa0JBQWtCLENBQUMsS0FBYztJQUN4QyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLElBQUEsbUNBQXlCLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWM7SUFDNUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBQSxtQ0FBeUIsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMxQixPQUFPLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsS0FBYyxFQUFFLFVBQW9CO0lBQ2pFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFJ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