@researchdatabox/sails-ng-common 0.0.1-beta.10173

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 (236) hide show
  1. package/README.md +5 -0
  2. package/dist/src/config/base-field-component.model.d.ts +26 -0
  3. package/dist/src/config/base-field-component.model.js +29 -0
  4. package/dist/src/config/base-field-component.outline.d.ts +106 -0
  5. package/dist/src/config/base-field-component.outline.js +3 -0
  6. package/dist/src/config/component/accordion.model.d.ts +103 -0
  7. package/dist/src/config/component/accordion.model.js +127 -0
  8. package/dist/src/config/component/accordion.outline.d.ts +150 -0
  9. package/dist/src/config/component/accordion.outline.js +13 -0
  10. package/dist/src/config/component/action-row-layout.model.d.ts +28 -0
  11. package/dist/src/config/component/action-row-layout.model.js +35 -0
  12. package/dist/src/config/component/action-row-layout.outline.d.ts +36 -0
  13. package/dist/src/config/component/action-row-layout.outline.js +6 -0
  14. package/dist/src/config/component/cancel-button.model.d.ts +48 -0
  15. package/dist/src/config/component/cancel-button.model.js +58 -0
  16. package/dist/src/config/component/cancel-button.outline.d.ts +79 -0
  17. package/dist/src/config/component/cancel-button.outline.js +6 -0
  18. package/dist/src/config/component/checkbox-input.model.d.ts +67 -0
  19. package/dist/src/config/component/checkbox-input.model.js +79 -0
  20. package/dist/src/config/component/checkbox-input.outline.d.ts +87 -0
  21. package/dist/src/config/component/checkbox-input.outline.js +8 -0
  22. package/dist/src/config/component/checkbox-tree.model.d.ts +68 -0
  23. package/dist/src/config/component/checkbox-tree.model.js +80 -0
  24. package/dist/src/config/component/checkbox-tree.outline.d.ts +99 -0
  25. package/dist/src/config/component/checkbox-tree.outline.js +8 -0
  26. package/dist/src/config/component/content.model.d.ts +46 -0
  27. package/dist/src/config/component/content.model.js +56 -0
  28. package/dist/src/config/component/content.outline.d.ts +68 -0
  29. package/dist/src/config/component/content.outline.js +6 -0
  30. package/dist/src/config/component/data-location.model.d.ts +83 -0
  31. package/dist/src/config/component/data-location.model.js +95 -0
  32. package/dist/src/config/component/data-location.outline.d.ts +118 -0
  33. package/dist/src/config/component/data-location.outline.js +6 -0
  34. package/dist/src/config/component/date-input.model.d.ts +67 -0
  35. package/dist/src/config/component/date-input.model.js +80 -0
  36. package/dist/src/config/component/date-input.outline.d.ts +82 -0
  37. package/dist/src/config/component/date-input.outline.js +8 -0
  38. package/dist/src/config/component/default-layout.model.d.ts +22 -0
  39. package/dist/src/config/component/default-layout.model.js +30 -0
  40. package/dist/src/config/component/default-layout.outline.d.ts +29 -0
  41. package/dist/src/config/component/default-layout.outline.js +5 -0
  42. package/dist/src/config/component/delete-button.model.d.ts +46 -0
  43. package/dist/src/config/component/delete-button.model.js +48 -0
  44. package/dist/src/config/component/delete-button.outline.d.ts +83 -0
  45. package/dist/src/config/component/delete-button.outline.js +5 -0
  46. package/dist/src/config/component/dropdown-input.model.d.ts +65 -0
  47. package/dist/src/config/component/dropdown-input.model.js +78 -0
  48. package/dist/src/config/component/dropdown-input.outline.d.ts +86 -0
  49. package/dist/src/config/component/dropdown-input.outline.js +8 -0
  50. package/dist/src/config/component/file-upload.model.d.ts +67 -0
  51. package/dist/src/config/component/file-upload.model.js +81 -0
  52. package/dist/src/config/component/file-upload.outline.d.ts +93 -0
  53. package/dist/src/config/component/file-upload.outline.js +8 -0
  54. package/dist/src/config/component/group.model.d.ts +61 -0
  55. package/dist/src/config/component/group.model.js +75 -0
  56. package/dist/src/config/component/group.outline.d.ts +77 -0
  57. package/dist/src/config/component/group.outline.js +8 -0
  58. package/dist/src/config/component/inline-layout.model.d.ts +22 -0
  59. package/dist/src/config/component/inline-layout.model.js +29 -0
  60. package/dist/src/config/component/inline-layout.outline.d.ts +29 -0
  61. package/dist/src/config/component/inline-layout.outline.js +5 -0
  62. package/dist/src/config/component/integration-status.model.d.ts +49 -0
  63. package/dist/src/config/component/integration-status.model.js +65 -0
  64. package/dist/src/config/component/integration-status.outline.d.ts +55 -0
  65. package/dist/src/config/component/integration-status.outline.js +5 -0
  66. package/dist/src/config/component/map.model.d.ts +68 -0
  67. package/dist/src/config/component/map.model.js +85 -0
  68. package/dist/src/config/component/map.outline.d.ts +102 -0
  69. package/dist/src/config/component/map.outline.js +8 -0
  70. package/dist/src/config/component/pdf-list.model.d.ts +68 -0
  71. package/dist/src/config/component/pdf-list.model.js +71 -0
  72. package/dist/src/config/component/pdf-list.outline.d.ts +91 -0
  73. package/dist/src/config/component/pdf-list.outline.js +6 -0
  74. package/dist/src/config/component/publish-data-location-refresh.model.d.ts +39 -0
  75. package/dist/src/config/component/publish-data-location-refresh.model.js +52 -0
  76. package/dist/src/config/component/publish-data-location-refresh.outline.d.ts +52 -0
  77. package/dist/src/config/component/publish-data-location-refresh.outline.js +5 -0
  78. package/dist/src/config/component/publish-data-location-selector.model.d.ts +78 -0
  79. package/dist/src/config/component/publish-data-location-selector.model.js +104 -0
  80. package/dist/src/config/component/publish-data-location-selector.outline.d.ts +104 -0
  81. package/dist/src/config/component/publish-data-location-selector.outline.js +6 -0
  82. package/dist/src/config/component/question-tree.helper.d.ts +58 -0
  83. package/dist/src/config/component/question-tree.helper.js +291 -0
  84. package/dist/src/config/component/question-tree.model.d.ts +64 -0
  85. package/dist/src/config/component/question-tree.model.js +80 -0
  86. package/dist/src/config/component/question-tree.outline.d.ts +308 -0
  87. package/dist/src/config/component/question-tree.outline.js +9 -0
  88. package/dist/src/config/component/radio-input.model.d.ts +65 -0
  89. package/dist/src/config/component/radio-input.model.js +77 -0
  90. package/dist/src/config/component/radio-input.outline.d.ts +85 -0
  91. package/dist/src/config/component/radio-input.outline.js +8 -0
  92. package/dist/src/config/component/record-metadata-retriever.model.d.ts +41 -0
  93. package/dist/src/config/component/record-metadata-retriever.model.js +57 -0
  94. package/dist/src/config/component/record-metadata-retriever.outline.d.ts +47 -0
  95. package/dist/src/config/component/record-metadata-retriever.outline.js +5 -0
  96. package/dist/src/config/component/record-selector.model.d.ts +61 -0
  97. package/dist/src/config/component/record-selector.model.js +61 -0
  98. package/dist/src/config/component/record-selector.outline.d.ts +85 -0
  99. package/dist/src/config/component/record-selector.outline.js +6 -0
  100. package/dist/src/config/component/repeatable.model.d.ts +91 -0
  101. package/dist/src/config/component/repeatable.model.js +112 -0
  102. package/dist/src/config/component/repeatable.outline.d.ts +109 -0
  103. package/dist/src/config/component/repeatable.outline.js +10 -0
  104. package/dist/src/config/component/reusable.model.d.ts +42 -0
  105. package/dist/src/config/component/reusable.model.js +57 -0
  106. package/dist/src/config/component/reusable.outline.d.ts +49 -0
  107. package/dist/src/config/component/reusable.outline.js +6 -0
  108. package/dist/src/config/component/rich-text-editor.model.d.ts +65 -0
  109. package/dist/src/config/component/rich-text-editor.model.js +79 -0
  110. package/dist/src/config/component/rich-text-editor.outline.d.ts +86 -0
  111. package/dist/src/config/component/rich-text-editor.outline.js +8 -0
  112. package/dist/src/config/component/save-button.model.d.ts +49 -0
  113. package/dist/src/config/component/save-button.model.js +59 -0
  114. package/dist/src/config/component/save-button.outline.d.ts +84 -0
  115. package/dist/src/config/component/save-button.outline.js +6 -0
  116. package/dist/src/config/component/save-status.model.d.ts +42 -0
  117. package/dist/src/config/component/save-status.model.js +60 -0
  118. package/dist/src/config/component/save-status.outline.d.ts +52 -0
  119. package/dist/src/config/component/save-status.outline.js +6 -0
  120. package/dist/src/config/component/simple-input.model.d.ts +62 -0
  121. package/dist/src/config/component/simple-input.model.js +75 -0
  122. package/dist/src/config/component/simple-input.outline.d.ts +80 -0
  123. package/dist/src/config/component/simple-input.outline.js +9 -0
  124. package/dist/src/config/component/suggested-validation-summary.model.d.ts +45 -0
  125. package/dist/src/config/component/suggested-validation-summary.model.js +61 -0
  126. package/dist/src/config/component/suggested-validation-summary.outline.d.ts +51 -0
  127. package/dist/src/config/component/suggested-validation-summary.outline.js +5 -0
  128. package/dist/src/config/component/tab-content.model.d.ts +63 -0
  129. package/dist/src/config/component/tab-content.model.js +77 -0
  130. package/dist/src/config/component/tab-content.outline.d.ts +92 -0
  131. package/dist/src/config/component/tab-content.outline.js +8 -0
  132. package/dist/src/config/component/tab-nav-button.model.d.ts +45 -0
  133. package/dist/src/config/component/tab-nav-button.model.js +55 -0
  134. package/dist/src/config/component/tab-nav-button.outline.d.ts +64 -0
  135. package/dist/src/config/component/tab-nav-button.outline.js +6 -0
  136. package/dist/src/config/component/tab.model.d.ts +71 -0
  137. package/dist/src/config/component/tab.model.js +84 -0
  138. package/dist/src/config/component/tab.outline.d.ts +106 -0
  139. package/dist/src/config/component/tab.outline.js +9 -0
  140. package/dist/src/config/component/text-area.model.d.ts +63 -0
  141. package/dist/src/config/component/text-area.model.js +76 -0
  142. package/dist/src/config/component/text-area.outline.d.ts +81 -0
  143. package/dist/src/config/component/text-area.outline.js +8 -0
  144. package/dist/src/config/component/typeahead-input.model.d.ts +81 -0
  145. package/dist/src/config/component/typeahead-input.model.js +93 -0
  146. package/dist/src/config/component/typeahead-input.outline.d.ts +121 -0
  147. package/dist/src/config/component/typeahead-input.outline.js +8 -0
  148. package/dist/src/config/component/validation-summary.model.d.ts +42 -0
  149. package/dist/src/config/component/validation-summary.model.js +60 -0
  150. package/dist/src/config/component/validation-summary.outline.d.ts +57 -0
  151. package/dist/src/config/component/validation-summary.outline.js +6 -0
  152. package/dist/src/config/dictionary.model.d.ts +648 -0
  153. package/dist/src/config/dictionary.model.js +181 -0
  154. package/dist/src/config/dictionary.outline.d.ts +96 -0
  155. package/dist/src/config/dictionary.outline.js +3 -0
  156. package/dist/src/config/field-component.model.d.ts +7 -0
  157. package/dist/src/config/field-component.model.js +11 -0
  158. package/dist/src/config/field-component.outline.d.ts +20 -0
  159. package/dist/src/config/field-component.outline.js +3 -0
  160. package/dist/src/config/field-layout.model.d.ts +19 -0
  161. package/dist/src/config/field-layout.model.js +23 -0
  162. package/dist/src/config/field-layout.outline.d.ts +42 -0
  163. package/dist/src/config/field-layout.outline.js +3 -0
  164. package/dist/src/config/field-model.model.d.ts +21 -0
  165. package/dist/src/config/field-model.model.js +24 -0
  166. package/dist/src/config/field-model.outline.d.ts +63 -0
  167. package/dist/src/config/field-model.outline.js +3 -0
  168. package/dist/src/config/field.model.d.ts +12 -0
  169. package/dist/src/config/field.model.js +12 -0
  170. package/dist/src/config/field.outline.d.ts +19 -0
  171. package/dist/src/config/field.outline.js +3 -0
  172. package/dist/src/config/form-behaviour.outline.d.ts +128 -0
  173. package/dist/src/config/form-behaviour.outline.js +40 -0
  174. package/dist/src/config/form-component.model.d.ts +38 -0
  175. package/dist/src/config/form-component.model.js +36 -0
  176. package/dist/src/config/form-component.outline.d.ts +297 -0
  177. package/dist/src/config/form-component.outline.js +27 -0
  178. package/dist/src/config/form-config.model.d.ts +33 -0
  179. package/dist/src/config/form-config.model.js +36 -0
  180. package/dist/src/config/form-config.outline.d.ts +107 -0
  181. package/dist/src/config/form-config.outline.js +3 -0
  182. package/dist/src/config/form-override.model.d.ts +128 -0
  183. package/dist/src/config/form-override.model.js +1320 -0
  184. package/dist/src/config/form-override.outline.d.ts +15 -0
  185. package/dist/src/config/form-override.outline.js +3 -0
  186. package/dist/src/config/form-prehydrate.outline.d.ts +17 -0
  187. package/dist/src/config/form-prehydrate.outline.js +5 -0
  188. package/dist/src/config/form-types.model.d.ts +6 -0
  189. package/dist/src/config/form-types.model.js +23 -0
  190. package/dist/src/config/form-types.outline.d.ts +48 -0
  191. package/dist/src/config/form-types.outline.js +137 -0
  192. package/dist/src/config/helpers.d.ts +31 -0
  193. package/dist/src/config/helpers.js +122 -0
  194. package/dist/src/config/names/naming-helpers.d.ts +112 -0
  195. package/dist/src/config/names/naming-helpers.js +188 -0
  196. package/dist/src/config/names/query-helpers.d.ts +43 -0
  197. package/dist/src/config/names/query-helpers.js +59 -0
  198. package/dist/src/config/shared.outline.d.ts +54 -0
  199. package/dist/src/config/shared.outline.js +41 -0
  200. package/dist/src/config/visitor/base.model.d.ts +143 -0
  201. package/dist/src/config/visitor/base.model.js +336 -0
  202. package/dist/src/config/visitor/base.outline.d.ts +146 -0
  203. package/dist/src/config/visitor/base.outline.js +3 -0
  204. package/dist/src/config/visitor/common.model.d.ts +119 -0
  205. package/dist/src/config/visitor/common.model.js +422 -0
  206. package/dist/src/date-format-helpers.d.ts +1 -0
  207. package/dist/src/date-format-helpers.js +21 -0
  208. package/dist/src/handlebars-helpers.d.ts +264 -0
  209. package/dist/src/handlebars-helpers.js +670 -0
  210. package/dist/src/html-helpers.d.ts +15 -0
  211. package/dist/src/html-helpers.js +42 -0
  212. package/dist/src/index.d.ts +118 -0
  213. package/dist/src/index.js +145 -0
  214. package/dist/src/jsonata-helpers.d.ts +40 -0
  215. package/dist/src/jsonata-helpers.js +106 -0
  216. package/dist/src/logger.interface.d.ts +14 -0
  217. package/dist/src/logger.interface.js +3 -0
  218. package/dist/src/record.model.d.ts +35 -0
  219. package/dist/src/record.model.js +21 -0
  220. package/dist/src/report.model.d.ts +64 -0
  221. package/dist/src/report.model.js +19 -0
  222. package/dist/src/status.model.d.ts +22 -0
  223. package/dist/src/status.model.js +28 -0
  224. package/dist/src/template.outline.d.ts +79 -0
  225. package/dist/src/template.outline.js +14 -0
  226. package/dist/src/translation-helpers.d.ts +10 -0
  227. package/dist/src/translation-helpers.js +30 -0
  228. package/dist/src/validation/form.model.d.ts +323 -0
  229. package/dist/src/validation/form.model.js +31 -0
  230. package/dist/src/validation/helpers.d.ts +16 -0
  231. package/dist/src/validation/helpers.js +104 -0
  232. package/dist/src/validation/validators-support.d.ts +41 -0
  233. package/dist/src/validation/validators-support.js +183 -0
  234. package/dist/src/validation/validators.d.ts +21 -0
  235. package/dist/src/validation/validators.js +377 -0
  236. package/package.json +96 -0
@@ -0,0 +1,41 @@
1
+ import { FormValidationGroups, FormValidatorComponentErrors, FormValidatorConfig, FormValidatorDefinition, FormValidatorErrors, FormValidatorFns, FormValidatorTargetFieldConfig } from "./form.model";
2
+ export declare class ValidatorsSupport {
3
+ /**
4
+ * Create validator definition mapping from the validator definitions.
5
+ * @param definition The form validator definitions.
6
+ */
7
+ createValidatorDefinitionMapping(definition: FormValidatorDefinition[] | null | undefined): Map<string, FormValidatorDefinition>;
8
+ /**
9
+ * Create form validator instances from the validator definition mapping.
10
+ * @param defMap The validator definition mapping.
11
+ * @param config The form validator config blocks.
12
+ */
13
+ createFormValidatorInstancesFromMapping(defMap: Map<string, FormValidatorDefinition>, config: (FormValidatorConfig | FormValidatorTargetFieldConfig)[] | null | undefined): FormValidatorFns;
14
+ /**
15
+ * Get the form validator errors for a component's control.
16
+ * @param errors The control's errors.
17
+ */
18
+ getFormValidatorComponentErrors(errors: FormValidatorErrors | null): FormValidatorComponentErrors[];
19
+ checkValidationGroups(availableGroups: FormValidationGroups, enabledGroupNames: string[]): void;
20
+ /**
21
+ * Is the component model validator enabled?
22
+ * @param availableGroups All available validation groups in this form.
23
+ * @param enabledGroupNames The currently enabled validation groups.
24
+ * @param validator The validator config for a component's model.
25
+ */
26
+ isValidatorEnabled(availableGroups: FormValidationGroups, enabledGroupNames: string[], validator: FormValidatorConfig): boolean;
27
+ /**
28
+ * Assign the jsonata evaluator to each 'jsonata-expression' validator.
29
+ * This must be done before filtering the validators on the client, as the compiled templates are referenced by index.
30
+ * @param validators The validator configurations from the model config.
31
+ * @param callback The callback for each validator config with the index.
32
+ */
33
+ assignJsonataEvaluators(validators: FormValidatorConfig[], callback: (validator: FormValidatorConfig, index: number) => unknown): void;
34
+ /**
35
+ * Get the enabled validators.
36
+ * @param availableGroups All available validation groups in this form.
37
+ * @param enabledGroups The currently enabled validation groups.
38
+ * @param validators All available validators in this form.
39
+ */
40
+ enabledValidators(availableGroups: FormValidationGroups, enabledGroups: string[], validators: FormValidatorConfig[]): FormValidatorConfig[];
41
+ }
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidatorsSupport = void 0;
4
+ const form_types_model_1 = require("../config/form-types.model");
5
+ class ValidatorsSupport {
6
+ /**
7
+ * Create validator definition mapping from the validator definitions.
8
+ * @param definition The form validator definitions.
9
+ */
10
+ createValidatorDefinitionMapping(definition) {
11
+ const defMap = new Map();
12
+ for (const definitionItem of (definition ?? [])) {
13
+ if (!(0, form_types_model_1.isTypeFormValidatorDefinition)(definitionItem)) {
14
+ throw new Error(`Validator definition does not have valid 'class', 'message', and 'create' properties: ${JSON.stringify(definitionItem)}`);
15
+ }
16
+ const validatorClass = definitionItem?.class;
17
+ const message = definitionItem?.message;
18
+ if (defMap.has(validatorClass)) {
19
+ const messages = [message, defMap.get(validatorClass)?.message];
20
+ throw new Error(`Duplicate validator class '${validatorClass}' - the validator classes must be unique. `
21
+ + `To help you find the duplicates, these are the messages of the duplicates: '${messages.join(", ")}'.`);
22
+ }
23
+ defMap.set(validatorClass, definitionItem);
24
+ }
25
+ return defMap;
26
+ }
27
+ /**
28
+ * Create form validator instances from the validator definition mapping.
29
+ * @param defMap The validator definition mapping.
30
+ * @param config The form validator config blocks.
31
+ */
32
+ createFormValidatorInstancesFromMapping(defMap, config) {
33
+ const result = { syncDefs: [], asyncDefs: [] };
34
+ // Count how many times each class is used so we know which ones are duplicated.
35
+ // Duplicated classes need a unique error key so Angular's error merging keeps every
36
+ // instance instead of overwriting earlier ones (the merge key would otherwise collide).
37
+ const classCounts = new Map();
38
+ for (const validatorConfigItem of (config ?? [])) {
39
+ const validatorClass = validatorConfigItem?.class;
40
+ classCounts.set(validatorClass, (classCounts.get(validatorClass) ?? 0) + 1);
41
+ }
42
+ const classOccurrences = new Map();
43
+ for (const validatorConfigItem of (config ?? [])) {
44
+ const validatorClass = validatorConfigItem?.class;
45
+ const def = defMap.get(validatorClass);
46
+ if (!def) {
47
+ throw new Error(`No validator definition with class '${validatorClass}', `
48
+ + `the available validators are: '${Array.from(defMap.keys()).sort().join(", ")}'.`);
49
+ }
50
+ const message = validatorConfigItem?.message ?? def.message;
51
+ const createConfig = {
52
+ ...validatorConfigItem?.config ?? {},
53
+ class: validatorClass,
54
+ message: message,
55
+ };
56
+ // Only assign a unique error key when the class is used more than once on this control.
57
+ // Single-use classes keep the class as the error key, so the error shape is unchanged.
58
+ const occurrence = (classOccurrences.get(validatorClass) ?? 0);
59
+ classOccurrences.set(validatorClass, occurrence + 1);
60
+ if ((classCounts.get(validatorClass) ?? 0) > 1) {
61
+ createConfig.errorKey = `${validatorClass}#${occurrence}`;
62
+ }
63
+ if ('targetField' in validatorConfigItem && validatorConfigItem.targetField !== undefined) {
64
+ createConfig.targetField = validatorConfigItem.targetField;
65
+ }
66
+ if ('create' in def) {
67
+ result.syncDefs.push(def.create(createConfig));
68
+ }
69
+ else if ('createAsync' in def) {
70
+ result.asyncDefs.push(def.createAsync(createConfig));
71
+ }
72
+ else {
73
+ throw new Error(`Invalid validator definition: must specify 'create' or 'createAsync' function. Definition is ${JSON.stringify(validatorConfigItem)}.`);
74
+ }
75
+ }
76
+ return result;
77
+ }
78
+ /**
79
+ * Get the form validator errors for a component's control.
80
+ * @param errors The control's errors.
81
+ */
82
+ getFormValidatorComponentErrors(errors) {
83
+ const result = [];
84
+ for (const [key, value] of Object.entries(errors ?? {})) {
85
+ const item = {
86
+ // The error key matches the class unless the class was duplicated on a control, in
87
+ // which case the real class is carried on the value so it can be recovered here.
88
+ class: value.class ?? key,
89
+ message: value.message ?? null,
90
+ params: { ...value.params },
91
+ };
92
+ if (value.targetField !== undefined) {
93
+ item.targetField = value.targetField;
94
+ }
95
+ result.push(item);
96
+ }
97
+ return result;
98
+ }
99
+ checkValidationGroups(availableGroups, enabledGroupNames) {
100
+ const availableGroupNames = Object.keys(availableGroups);
101
+ const unknownGroups = enabledGroupNames.filter(g => !availableGroupNames.includes(g));
102
+ if (unknownGroups.length > 0) {
103
+ throw new Error(`Unknown enabled validation groups ${JSON.stringify(unknownGroups)}.`);
104
+ }
105
+ }
106
+ /**
107
+ * Is the component model validator enabled?
108
+ * @param availableGroups All available validation groups in this form.
109
+ * @param enabledGroupNames The currently enabled validation groups.
110
+ * @param validator The validator config for a component's model.
111
+ */
112
+ isValidatorEnabled(availableGroups, enabledGroupNames, validator) {
113
+ if (Object.keys(availableGroups).length === 0) {
114
+ // If there are no validation groups, all validators are enabled.
115
+ return true;
116
+ }
117
+ if (enabledGroupNames.length === 0) {
118
+ // If there are no validation groups enabled, all validators are enabled.
119
+ return true;
120
+ }
121
+ this.checkValidationGroups(availableGroups, enabledGroupNames);
122
+ // Check each validation group to see if the validator is enabled.
123
+ // A validator must pass at least one of the group checks to be enabled.
124
+ const includes = validator?.groups?.include ?? [];
125
+ this.checkValidationGroups(availableGroups, includes);
126
+ const excludes = validator?.groups?.exclude ?? [];
127
+ this.checkValidationGroups(availableGroups, excludes);
128
+ for (const [groupKey, groupConfig] of Object.entries(availableGroups)) {
129
+ const membership = groupConfig?.initialMembership ?? "none";
130
+ if (!enabledGroupNames?.includes(groupKey)) {
131
+ // Group is not enabled, so move on.
132
+ continue;
133
+ }
134
+ if (excludes.includes(groupKey)) {
135
+ // Validator excludes this group, so move on.
136
+ continue;
137
+ }
138
+ if (membership === "all" && !excludes.includes(groupKey)) {
139
+ // Validator is enabled.
140
+ // Group is enabled, starts with all validators, and validator does not exclude it.
141
+ return true;
142
+ }
143
+ if (membership === "none" && includes.includes(groupKey)) {
144
+ // Validator is enabled.
145
+ // Group is enabled, starts with no validators, and validator includes it.
146
+ return true;
147
+ }
148
+ }
149
+ // Validator was not included in any group, so it is disabled.
150
+ return false;
151
+ }
152
+ /**
153
+ * Assign the jsonata evaluator to each 'jsonata-expression' validator.
154
+ * This must be done before filtering the validators on the client, as the compiled templates are referenced by index.
155
+ * @param validators The validator configurations from the model config.
156
+ * @param callback The callback for each validator config with the index.
157
+ */
158
+ assignJsonataEvaluators(validators, callback) {
159
+ validators.forEach((validator, index) => {
160
+ if (validator.class === "jsonata-expression") {
161
+ if (!validator.config) {
162
+ validator.config = {};
163
+ }
164
+ const expr = validator?.config?.['expression']?.toString() ?? "";
165
+ const evaluator = validator.config?.['evaluator'];
166
+ if (validator.config && expr && !evaluator) {
167
+ validator.config['evaluator'] = callback(validator, index);
168
+ }
169
+ }
170
+ });
171
+ }
172
+ /**
173
+ * Get the enabled validators.
174
+ * @param availableGroups All available validation groups in this form.
175
+ * @param enabledGroups The currently enabled validation groups.
176
+ * @param validators All available validators in this form.
177
+ */
178
+ enabledValidators(availableGroups, enabledGroups, validators) {
179
+ return (validators ?? []).filter(validator => this.isValidatorEnabled(availableGroups, enabledGroups, validator));
180
+ }
181
+ }
182
+ exports.ValidatorsSupport = ValidatorsSupport;
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy1zdXBwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy1zdXBwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLGlFQUEyRTtBQUczRSxNQUFhLGlCQUFpQjtJQUM1Qjs7O09BR0c7SUFDSSxnQ0FBZ0MsQ0FDckMsVUFBd0Q7UUFFeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQW1DLENBQUM7UUFDMUQsS0FBSyxNQUFNLGNBQWMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxJQUFBLGdEQUE2QixFQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMseUZBQXlGLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdJLENBQUM7WUFDRCxNQUFNLGNBQWMsR0FBRyxjQUFjLEVBQUUsS0FBSyxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUM7WUFDeEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLGNBQWMsNENBQTRDO3NCQUNwRywrRUFBK0UsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUcsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJ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
@@ -0,0 +1,21 @@
1
+ import { FormValidatorDefinition } from "./form.model";
2
+ /**
3
+ * A regular expression for validating an email address.
4
+ *
5
+ * Based on the angular email validation regex. MIT-style license https://angular.dev/license
6
+ */
7
+ export declare const FORM_VALIDATOR_EMAIL_REGEXP: RegExp;
8
+ /**
9
+ * Definitions of form validators.
10
+ *
11
+ * These can be used on both server-side and client-side.
12
+ * The server provides them to the client.
13
+ *
14
+ * Sails hooks can use these validators functions, but cannot extend or override them.
15
+ * Use the 'jsonata-expression' validator to create custom validator functions.
16
+ *
17
+ * The validators are based on:
18
+ * - angular built-in validators: https://github.com/angular/angular/blob/5105fd6f05f01f04873ab1c87d64079fd8519ad4/packages/forms/src/validators.ts
19
+ * - formly schema: https://github.com/ngx-formly/ngx-formly/blob/a2f7901b6c0895aee63b4b5fe748fc5ec0ad5475/src/core/src/lib/models/fieldconfig.ts
20
+ */
21
+ export declare const formValidatorsSharedDefinitions: FormValidatorDefinition[];