@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,377 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formValidatorsSharedDefinitions = 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
+ * Definitions of form validators.
49
+ *
50
+ * These can be used on both server-side and client-side.
51
+ * The server provides them to the client.
52
+ *
53
+ * Sails hooks can use these validators functions, but cannot extend or override them.
54
+ * Use the 'jsonata-expression' validator to create custom validator functions.
55
+ *
56
+ * The validators are based on:
57
+ * - angular built-in validators: https://github.com/angular/angular/blob/5105fd6f05f01f04873ab1c87d64079fd8519ad4/packages/forms/src/validators.ts
58
+ * - formly schema: https://github.com/ngx-formly/ngx-formly/blob/a2f7901b6c0895aee63b4b5fe748fc5ec0ad5475/src/core/src/lib/models/fieldconfig.ts
59
+ */
60
+ exports.formValidatorsSharedDefinitions = [
61
+ {
62
+ class: "min",
63
+ message: "@validator-error-min",
64
+ create: (config) => {
65
+ const optionMinKey = "min";
66
+ const optionMinValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMinKey);
67
+ return (control) => {
68
+ if (control.value == null || optionMinValue == null) {
69
+ return null; // don't validate empty values to allow optional controls
70
+ }
71
+ let value;
72
+ try {
73
+ value = parseFloat(control.value?.toString() ?? null);
74
+ }
75
+ catch (err) {
76
+ value = undefined;
77
+ }
78
+ // Controls with NaN values after parsing should be treated as not having a
79
+ // minimum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-min
80
+ if (value === undefined || (!isNaN(value) && value < optionMinValue)) {
81
+ return (0, helpers_1.formValidatorBuildError)(config, {
82
+ requiredThreshold: optionMinValue,
83
+ actual: control.value,
84
+ });
85
+ }
86
+ return null;
87
+ };
88
+ },
89
+ },
90
+ {
91
+ class: "max",
92
+ message: "@validator-error-max",
93
+ create: (config) => {
94
+ const optionMaxKey = "max";
95
+ const optionMaxValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMaxKey);
96
+ return (control) => {
97
+ if (control.value == null || optionMaxValue == null) {
98
+ return null; // don't validate empty values to allow optional controls
99
+ }
100
+ let value;
101
+ try {
102
+ value = parseFloat(control.value?.toString() ?? null);
103
+ }
104
+ catch (err) {
105
+ value = undefined;
106
+ }
107
+ // Controls with NaN values after parsing should be treated as not having a
108
+ // maximum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-max
109
+ if (value === undefined || (!isNaN(value) && value > optionMaxValue)) {
110
+ return (0, helpers_1.formValidatorBuildError)(config, {
111
+ requiredThreshold: optionMaxValue,
112
+ actual: control.value,
113
+ });
114
+ }
115
+ return null;
116
+ };
117
+ },
118
+ },
119
+ {
120
+ class: "minLength",
121
+ message: "@validator-error-min-length",
122
+ create: (config) => {
123
+ const optionMinLengthKey = "minLength";
124
+ const optionMinLengthValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMinLengthKey);
125
+ return (control) => {
126
+ const length = (0, helpers_1.formValidatorLengthOrSize)(control.value);
127
+ if (length === null || length === 0) {
128
+ // don't validate empty values to allow optional controls
129
+ // don't validate values without `length` or `size` property
130
+ return null;
131
+ }
132
+ return length < optionMinLengthValue
133
+ ? (0, helpers_1.formValidatorBuildError)(config, {
134
+ requiredLength: optionMinLengthValue,
135
+ actualLength: length,
136
+ })
137
+ : null;
138
+ };
139
+ },
140
+ },
141
+ {
142
+ class: "maxLength",
143
+ message: "@validator-error-max-length",
144
+ create: (config) => {
145
+ const optionMaxLengthKey = "maxLength";
146
+ const optionMaxLengthValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMaxLengthKey);
147
+ return (control) => {
148
+ const length = (0, helpers_1.formValidatorLengthOrSize)(control.value);
149
+ if (length !== null && length > optionMaxLengthValue) {
150
+ return (0, helpers_1.formValidatorBuildError)(config, {
151
+ requiredLength: optionMaxLengthValue,
152
+ actualLength: length,
153
+ });
154
+ }
155
+ return null;
156
+ };
157
+ },
158
+ },
159
+ {
160
+ class: "required",
161
+ message: "@validator-error-required",
162
+ create: (config) => {
163
+ const optionRequiredKey = "required";
164
+ const optionRequiredValue = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, optionRequiredKey, true);
165
+ const optionAnyOfFields = Array.isArray(config?.['anyOfFields'])
166
+ ? config['anyOfFields'].map(item => item?.toString() ?? "").filter(item => item.length > 0)
167
+ : [];
168
+ return (control) => {
169
+ if (!optionRequiredValue) {
170
+ return null;
171
+ }
172
+ const isValid = optionAnyOfFields.length > 0
173
+ ? hasRequiredFieldValue(control.value, optionAnyOfFields)
174
+ : control.value != null && (0, helpers_1.formValidatorLengthOrSize)(control.value) !== 0;
175
+ if (!isValid) {
176
+ return (0, helpers_1.formValidatorBuildError)(config, {
177
+ required: optionRequiredValue,
178
+ actual: control.value,
179
+ });
180
+ }
181
+ return null;
182
+ };
183
+ },
184
+ },
185
+ {
186
+ class: "requiredTrue",
187
+ message: "@validator-error-required-true",
188
+ create: (config) => {
189
+ const optionRequiredKey = "requiredTrue";
190
+ const optionRequiredValue = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, optionRequiredKey, true);
191
+ return (control) => {
192
+ if (optionRequiredValue && control.value !== true) {
193
+ return (0, helpers_1.formValidatorBuildError)(config, {
194
+ required: optionRequiredValue,
195
+ actual: control.value,
196
+ });
197
+ }
198
+ return null;
199
+ };
200
+ },
201
+ },
202
+ {
203
+ class: "email",
204
+ message: "@validator-error-email",
205
+ create: (config) => {
206
+ const optionDescriptionKey = "description";
207
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey, "email must be in format (name)@(domain.tld)");
208
+ const optionPatternKey = "pattern";
209
+ const optionPatternValue = (0, helpers_1.formValidatorGetDefinitionRegexp)(config, optionPatternKey, exports.FORM_VALIDATOR_EMAIL_REGEXP);
210
+ return (control) => {
211
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
212
+ // don't validate empty values to allow optional controls
213
+ return null;
214
+ }
215
+ const value = control.value?.toString() ?? "";
216
+ const testOutcome = optionPatternValue.test(value);
217
+ if (!testOutcome) {
218
+ return (0, helpers_1.formValidatorBuildError)(config, {
219
+ requiredPattern: optionPatternValue,
220
+ description: optionDescriptionValue, actual: control.value,
221
+ });
222
+ }
223
+ return null;
224
+ };
225
+ },
226
+ },
227
+ {
228
+ class: "pattern",
229
+ message: "@validator-error-pattern",
230
+ create: (config) => {
231
+ const optionDescriptionKey = "description";
232
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey);
233
+ const optionPatternKey = "pattern";
234
+ const pattern = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionPatternKey);
235
+ let regex;
236
+ let regexStr = (pattern instanceof RegExp ? pattern?.source : pattern?.toString()) ?? "";
237
+ // The pattern must start with '^' (start anchor)
238
+ if (regexStr.charAt(0) !== "^") {
239
+ regexStr = ("^" + regexStr);
240
+ }
241
+ // The pattern must end with '$' (end anchor).
242
+ if (regexStr.charAt(regexStr.length - 1) !== "$") {
243
+ regexStr = (regexStr + "$");
244
+ }
245
+ regex = new RegExp(regexStr);
246
+ return (control) => {
247
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
248
+ return null; // don't validate empty values to allow optional controls
249
+ }
250
+ const value = control.value?.toString();
251
+ return regex.test(value)
252
+ ? null
253
+ : (0, helpers_1.formValidatorBuildError)(config, {
254
+ requiredPattern: regexStr,
255
+ description: optionDescriptionValue,
256
+ actual: value,
257
+ });
258
+ };
259
+ },
260
+ },
261
+ {
262
+ class: "different-values",
263
+ message: "@validator-error-different-values",
264
+ create: (config) => {
265
+ const optionControlNamesKey = "controlNames";
266
+ const optionControlNamesValue = (0, helpers_1.formValidatorGetDefinitionArray)(config, optionControlNamesKey);
267
+ return (control) => {
268
+ // TODO: fix how control values are obtained - need to use full angular component path
269
+ const controls = (optionControlNamesValue ?? [])
270
+ ?.filter(i => i !== null && i !== undefined)
271
+ ?.map(n => control?.get(n?.toString())) ?? [];
272
+ const values = new Set(controls?.map(c => c?.value) ?? []);
273
+ const compare = values.size === controls.length;
274
+ return compare
275
+ ? null
276
+ : (0, helpers_1.formValidatorBuildError)(config, {
277
+ controlNames: optionControlNamesValue,
278
+ controlCount: optionControlNamesValue?.length,
279
+ valueCount: values.size,
280
+ values: Array.from(values),
281
+ });
282
+ };
283
+ },
284
+ },
285
+ {
286
+ class: "jsonata-expression",
287
+ message: "@validator-error-jsonata-expression",
288
+ createAsync: (config) => {
289
+ const optionDescriptionKey = "description";
290
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey, "");
291
+ const optionExpressionKey = "expression";
292
+ const expression = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionExpressionKey);
293
+ const optionEvaluatorKey = "evaluator";
294
+ const evaluator = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionEvaluatorKey);
295
+ return async (control) => {
296
+ // Notes:
297
+ // 1. For the jsonata-expression validator, always validate the control value.
298
+ // This enables the expression to decide whether empty values are valid or not.
299
+ // If empty values were not validated, then the expression would not have the option to treat empty values as invalid.
300
+ // 2. jsonata tries to define a 'keepSingleton' property on the input value.
301
+ // Must clone the value because control values cannot be extended.
302
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cant_define_property_object_not_extensible
303
+ let success = null;
304
+ let value;
305
+ try {
306
+ value = structuredClone(control.value);
307
+ }
308
+ catch (err) {
309
+ success = false;
310
+ console.error(`Validator 'jsonata-expression' with description '${optionDescriptionValue}' could not run due to error: control value cannot be cloned`);
311
+ }
312
+ if (success === null && typeof evaluator !== "function") {
313
+ success = false;
314
+ console.error(`Validator 'jsonata-expression' with description '${optionDescriptionValue}' could not run due to error: evaluator is not a function`);
315
+ }
316
+ if (success === null) {
317
+ try {
318
+ success = await evaluator(value) === true;
319
+ }
320
+ catch (err) {
321
+ success = false;
322
+ console.error(`Validator 'jsonata-expression' with description '${optionDescriptionValue}' could not run due to error: ${err}`);
323
+ }
324
+ }
325
+ return success
326
+ ? null
327
+ : (0, helpers_1.formValidatorBuildError)(config, {
328
+ expression: expression,
329
+ description: optionDescriptionValue,
330
+ actual: control.value,
331
+ });
332
+ };
333
+ },
334
+ },
335
+ // 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
336
+ {
337
+ class: "orcid",
338
+ message: "@validator-error-orcid",
339
+ create: (config) => {
340
+ return (control) => {
341
+ if (control.value == null || control.value === "") {
342
+ return null; // don't validate empty values
343
+ }
344
+ let value = control.value.toString();
345
+ // Validate format: either xxxx-xxxx-xxxx-xxxx or xxxxxxxxxxxxxxxx, last digit can be X or x
346
+ if (!/^(\d{4}-\d{4}-\d{4}-\d{3}[\dXx]|\d{15}[\dXx])$/.test(value)) {
347
+ return (0, helpers_1.formValidatorBuildError)(config, {
348
+ actual: control.value,
349
+ });
350
+ }
351
+ value = value.replace(/-/g, '');
352
+ if (value.length !== 16) {
353
+ return (0, helpers_1.formValidatorBuildError)(config, {
354
+ actual: control.value,
355
+ });
356
+ }
357
+ const baseDigits = value.substring(0, 15);
358
+ const checkDigit = value.substring(15);
359
+ let total = 0;
360
+ for (let i = 0; i < baseDigits.length; i++) {
361
+ const digit = parseInt(baseDigits.charAt(i), 10);
362
+ total = (total + digit) * 2;
363
+ }
364
+ const remainder = total % 11;
365
+ const result = (12 - remainder) % 11;
366
+ const calculatedCheckDigit = result === 10 ? "X" : result.toString();
367
+ if (checkDigit.toUpperCase() !== calculatedCheckDigit) {
368
+ return (0, helpers_1.formValidatorBuildError)(config, {
369
+ actual: control.value,
370
+ });
371
+ }
372
+ return null;
373
+ };
374
+ },
375
+ },
376
+ ];
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdUNBU21CO0FBR25CLFNBQVMsa0JBQWtCLENBQUMsS0FBYztJQUN4QyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLElBQUEsbUNBQXlCLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWM7SUFDNUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBQSxtQ0FBeUIsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMxQixPQUFPLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsS0FBYyxFQUFFLFVBQW9CO0lBQ2pFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFJ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
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "@researchdatabox/sails-ng-common",
3
+ "version": "0.0.1-beta.10173",
4
+ "description": "Common models shared between Sails API endpoints and client-side Angular code",
5
+ "main": "dist/src/index.js",
6
+ "types": "dist/src/index.d.ts",
7
+ "files": [
8
+ "./dist/src"
9
+ ],
10
+ "scripts": {
11
+ "test": "nyc --reporter=text mocha --exit --config test/unit/.mocharc.js dist/test/unit",
12
+ "pretest": "npm run test:compile && mkdir -p support/junit",
13
+ "test:clean": "rm -rf support/junit || true",
14
+ "compile": "tsc -p tsconfig.prod.json",
15
+ "compile:clean": "rm -rf dist/",
16
+ "test:compile": "tsc -p tsconfig.test.json",
17
+ "pretest:compile": "npm run compile:clean"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/redbox-mint/redbox-portal.git"
22
+ },
23
+ "keywords": [
24
+ "redbox",
25
+ "research",
26
+ "research",
27
+ "data",
28
+ "management",
29
+ "planning"
30
+ ],
31
+ "author": "QCIF Engineering",
32
+ "license": "GPL-3.0-or-later",
33
+ "bugs": {
34
+ "url": "https://github.com/redbox-mint/redbox-portal/issues"
35
+ },
36
+ "homepage": "https://github.com/redbox-mint/redbox-portal/packages/sails-ng-common",
37
+ "engines": {
38
+ "node": ">=20.0.0"
39
+ },
40
+ "devDependencies": {
41
+ "@tsconfig/node24": "24.0.4",
42
+ "@types/chai": "5.2.3",
43
+ "@types/lodash": "4.17.24",
44
+ "@types/lodash-es": "4.17.12",
45
+ "@types/luxon": "3.7.1",
46
+ "@types/mocha": "10.0.10",
47
+ "@types/node": "24.12.4",
48
+ "chai": "6.2.2",
49
+ "jsonata": "2.2.1",
50
+ "mocha": "11.7.6",
51
+ "mocha-junit-reporter": "2.2.1",
52
+ "nyc": "18.0.0",
53
+ "serialize-javascript": "7.0.5",
54
+ "typescript": "5.9.3"
55
+ },
56
+ "nyc": {
57
+ "check-coverage": true,
58
+ "all": true,
59
+ "lines": 45,
60
+ "statements": 45,
61
+ "functions": 45,
62
+ "branches": 45,
63
+ "include": [
64
+ "**/src/handlebars-helpers.*",
65
+ "**/src/config/names/**/*.*",
66
+ "**/src/validation/**/*.*"
67
+ ],
68
+ "reporter": [
69
+ "lcov",
70
+ "text",
71
+ "text-summary"
72
+ ]
73
+ },
74
+ "dependencies": {
75
+ "@jsonjoy.com/json-pointer": "18.28.0",
76
+ "lodash": "4.18.1",
77
+ "lodash-es": "4.18.1",
78
+ "luxon": "3.7.2",
79
+ "marked": "18.0.5",
80
+ "ts-json-schema-generator": "2.9.0"
81
+ },
82
+ "overrides": {
83
+ "uuid": "14.0.0",
84
+ "mocha": {
85
+ "minimatch": "10.2.5",
86
+ "serialize-javascript": "7.0.5"
87
+ }
88
+ },
89
+ "peerDependencies": {
90
+ "jsonata": "2.2.1"
91
+ },
92
+ "publishConfig": {
93
+ "access": "public",
94
+ "registry": "https://registry.npmjs.org/"
95
+ }
96
+ }