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

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 (220) 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 +100 -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 +46 -0
  15. package/dist/src/config/component/cancel-button.model.js +56 -0
  16. package/dist/src/config/component/cancel-button.outline.d.ts +69 -0
  17. package/dist/src/config/component/cancel-button.outline.js +6 -0
  18. package/dist/src/config/component/checkbox-input.model.d.ts +65 -0
  19. package/dist/src/config/component/checkbox-input.model.js +78 -0
  20. package/dist/src/config/component/checkbox-input.outline.d.ts +85 -0
  21. package/dist/src/config/component/checkbox-input.outline.js +8 -0
  22. package/dist/src/config/component/checkbox-tree.model.d.ts +66 -0
  23. package/dist/src/config/component/checkbox-tree.model.js +79 -0
  24. package/dist/src/config/component/checkbox-tree.outline.d.ts +96 -0
  25. package/dist/src/config/component/checkbox-tree.outline.js +8 -0
  26. package/dist/src/config/component/content.model.d.ts +45 -0
  27. package/dist/src/config/component/content.model.js +55 -0
  28. package/dist/src/config/component/content.outline.d.ts +64 -0
  29. package/dist/src/config/component/content.outline.js +6 -0
  30. package/dist/src/config/component/data-location.model.d.ts +82 -0
  31. package/dist/src/config/component/data-location.model.js +94 -0
  32. package/dist/src/config/component/data-location.outline.d.ts +117 -0
  33. package/dist/src/config/component/data-location.outline.js +6 -0
  34. package/dist/src/config/component/date-input.model.d.ts +66 -0
  35. package/dist/src/config/component/date-input.model.js +79 -0
  36. package/dist/src/config/component/date-input.outline.d.ts +81 -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 +55 -0
  45. package/dist/src/config/component/delete-button.outline.js +5 -0
  46. package/dist/src/config/component/dropdown-input.model.d.ts +64 -0
  47. package/dist/src/config/component/dropdown-input.model.js +77 -0
  48. package/dist/src/config/component/dropdown-input.outline.d.ts +84 -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/map.model.d.ts +68 -0
  63. package/dist/src/config/component/map.model.js +85 -0
  64. package/dist/src/config/component/map.outline.d.ts +102 -0
  65. package/dist/src/config/component/map.outline.js +8 -0
  66. package/dist/src/config/component/pdf-list.model.d.ts +68 -0
  67. package/dist/src/config/component/pdf-list.model.js +71 -0
  68. package/dist/src/config/component/pdf-list.outline.d.ts +91 -0
  69. package/dist/src/config/component/pdf-list.outline.js +6 -0
  70. package/dist/src/config/component/publish-data-location-refresh.model.d.ts +38 -0
  71. package/dist/src/config/component/publish-data-location-refresh.model.js +51 -0
  72. package/dist/src/config/component/publish-data-location-refresh.outline.d.ts +47 -0
  73. package/dist/src/config/component/publish-data-location-refresh.outline.js +5 -0
  74. package/dist/src/config/component/publish-data-location-selector.model.d.ts +74 -0
  75. package/dist/src/config/component/publish-data-location-selector.model.js +100 -0
  76. package/dist/src/config/component/publish-data-location-selector.outline.d.ts +99 -0
  77. package/dist/src/config/component/publish-data-location-selector.outline.js +6 -0
  78. package/dist/src/config/component/question-tree.helper.d.ts +61 -0
  79. package/dist/src/config/component/question-tree.helper.js +298 -0
  80. package/dist/src/config/component/question-tree.model.d.ts +64 -0
  81. package/dist/src/config/component/question-tree.model.js +80 -0
  82. package/dist/src/config/component/question-tree.outline.d.ts +305 -0
  83. package/dist/src/config/component/question-tree.outline.js +9 -0
  84. package/dist/src/config/component/radio-input.model.d.ts +63 -0
  85. package/dist/src/config/component/radio-input.model.js +76 -0
  86. package/dist/src/config/component/radio-input.outline.d.ts +83 -0
  87. package/dist/src/config/component/radio-input.outline.js +8 -0
  88. package/dist/src/config/component/record-metadata-retriever.model.d.ts +41 -0
  89. package/dist/src/config/component/record-metadata-retriever.model.js +57 -0
  90. package/dist/src/config/component/record-metadata-retriever.outline.d.ts +47 -0
  91. package/dist/src/config/component/record-metadata-retriever.outline.js +5 -0
  92. package/dist/src/config/component/record-selector.model.d.ts +60 -0
  93. package/dist/src/config/component/record-selector.model.js +60 -0
  94. package/dist/src/config/component/record-selector.outline.d.ts +84 -0
  95. package/dist/src/config/component/record-selector.outline.js +6 -0
  96. package/dist/src/config/component/repeatable.model.d.ts +90 -0
  97. package/dist/src/config/component/repeatable.model.js +109 -0
  98. package/dist/src/config/component/repeatable.outline.d.ts +108 -0
  99. package/dist/src/config/component/repeatable.outline.js +10 -0
  100. package/dist/src/config/component/reusable.model.d.ts +42 -0
  101. package/dist/src/config/component/reusable.model.js +57 -0
  102. package/dist/src/config/component/reusable.outline.d.ts +49 -0
  103. package/dist/src/config/component/reusable.outline.js +6 -0
  104. package/dist/src/config/component/rich-text-editor.model.d.ts +65 -0
  105. package/dist/src/config/component/rich-text-editor.model.js +79 -0
  106. package/dist/src/config/component/rich-text-editor.outline.d.ts +86 -0
  107. package/dist/src/config/component/rich-text-editor.outline.js +8 -0
  108. package/dist/src/config/component/save-button.model.d.ts +45 -0
  109. package/dist/src/config/component/save-button.model.js +55 -0
  110. package/dist/src/config/component/save-button.outline.d.ts +65 -0
  111. package/dist/src/config/component/save-button.outline.js +6 -0
  112. package/dist/src/config/component/save-status.model.d.ts +42 -0
  113. package/dist/src/config/component/save-status.model.js +60 -0
  114. package/dist/src/config/component/save-status.outline.d.ts +52 -0
  115. package/dist/src/config/component/save-status.outline.js +6 -0
  116. package/dist/src/config/component/simple-input.model.d.ts +62 -0
  117. package/dist/src/config/component/simple-input.model.js +75 -0
  118. package/dist/src/config/component/simple-input.outline.d.ts +80 -0
  119. package/dist/src/config/component/simple-input.outline.js +9 -0
  120. package/dist/src/config/component/tab-content.model.d.ts +63 -0
  121. package/dist/src/config/component/tab-content.model.js +77 -0
  122. package/dist/src/config/component/tab-content.outline.d.ts +92 -0
  123. package/dist/src/config/component/tab-content.outline.js +8 -0
  124. package/dist/src/config/component/tab-nav-button.model.d.ts +45 -0
  125. package/dist/src/config/component/tab-nav-button.model.js +55 -0
  126. package/dist/src/config/component/tab-nav-button.outline.d.ts +64 -0
  127. package/dist/src/config/component/tab-nav-button.outline.js +6 -0
  128. package/dist/src/config/component/tab.model.d.ts +71 -0
  129. package/dist/src/config/component/tab.model.js +84 -0
  130. package/dist/src/config/component/tab.outline.d.ts +106 -0
  131. package/dist/src/config/component/tab.outline.js +9 -0
  132. package/dist/src/config/component/text-area.model.d.ts +63 -0
  133. package/dist/src/config/component/text-area.model.js +76 -0
  134. package/dist/src/config/component/text-area.outline.d.ts +81 -0
  135. package/dist/src/config/component/text-area.outline.js +8 -0
  136. package/dist/src/config/component/typeahead-input.model.d.ts +78 -0
  137. package/dist/src/config/component/typeahead-input.model.js +91 -0
  138. package/dist/src/config/component/typeahead-input.outline.d.ts +107 -0
  139. package/dist/src/config/component/typeahead-input.outline.js +8 -0
  140. package/dist/src/config/component/validation-summary.model.d.ts +42 -0
  141. package/dist/src/config/component/validation-summary.model.js +60 -0
  142. package/dist/src/config/component/validation-summary.outline.d.ts +57 -0
  143. package/dist/src/config/component/validation-summary.outline.js +6 -0
  144. package/dist/src/config/dictionary.model.d.ts +624 -0
  145. package/dist/src/config/dictionary.model.js +175 -0
  146. package/dist/src/config/dictionary.outline.d.ts +94 -0
  147. package/dist/src/config/dictionary.outline.js +3 -0
  148. package/dist/src/config/field-component.model.d.ts +7 -0
  149. package/dist/src/config/field-component.model.js +11 -0
  150. package/dist/src/config/field-component.outline.d.ts +20 -0
  151. package/dist/src/config/field-component.outline.js +3 -0
  152. package/dist/src/config/field-layout.model.d.ts +19 -0
  153. package/dist/src/config/field-layout.model.js +23 -0
  154. package/dist/src/config/field-layout.outline.d.ts +42 -0
  155. package/dist/src/config/field-layout.outline.js +3 -0
  156. package/dist/src/config/field-model.model.d.ts +22 -0
  157. package/dist/src/config/field-model.model.js +25 -0
  158. package/dist/src/config/field-model.outline.d.ts +63 -0
  159. package/dist/src/config/field-model.outline.js +3 -0
  160. package/dist/src/config/field.model.d.ts +12 -0
  161. package/dist/src/config/field.model.js +12 -0
  162. package/dist/src/config/field.outline.d.ts +19 -0
  163. package/dist/src/config/field.outline.js +3 -0
  164. package/dist/src/config/form-behaviour.outline.d.ts +128 -0
  165. package/dist/src/config/form-behaviour.outline.js +40 -0
  166. package/dist/src/config/form-component.model.d.ts +38 -0
  167. package/dist/src/config/form-component.model.js +36 -0
  168. package/dist/src/config/form-component.outline.d.ts +257 -0
  169. package/dist/src/config/form-component.outline.js +24 -0
  170. package/dist/src/config/form-config.model.d.ts +33 -0
  171. package/dist/src/config/form-config.model.js +36 -0
  172. package/dist/src/config/form-config.outline.d.ts +109 -0
  173. package/dist/src/config/form-config.outline.js +3 -0
  174. package/dist/src/config/form-override.model.d.ts +116 -0
  175. package/dist/src/config/form-override.model.js +1209 -0
  176. package/dist/src/config/form-override.outline.d.ts +15 -0
  177. package/dist/src/config/form-override.outline.js +3 -0
  178. package/dist/src/config/form-types.model.d.ts +6 -0
  179. package/dist/src/config/form-types.model.js +23 -0
  180. package/dist/src/config/form-types.outline.d.ts +48 -0
  181. package/dist/src/config/form-types.outline.js +137 -0
  182. package/dist/src/config/helpers.d.ts +23 -0
  183. package/dist/src/config/helpers.js +105 -0
  184. package/dist/src/config/names/naming-helpers.d.ts +71 -0
  185. package/dist/src/config/names/naming-helpers.js +72 -0
  186. package/dist/src/config/names/query-helpers.d.ts +43 -0
  187. package/dist/src/config/names/query-helpers.js +64 -0
  188. package/dist/src/config/shared.outline.d.ts +54 -0
  189. package/dist/src/config/shared.outline.js +41 -0
  190. package/dist/src/config/visitor/base.model.d.ts +137 -0
  191. package/dist/src/config/visitor/base.model.js +323 -0
  192. package/dist/src/config/visitor/base.outline.d.ts +140 -0
  193. package/dist/src/config/visitor/base.outline.js +3 -0
  194. package/dist/src/config/visitor/common.model.d.ts +119 -0
  195. package/dist/src/config/visitor/common.model.js +421 -0
  196. package/dist/src/handlebars-helpers.d.ts +224 -0
  197. package/dist/src/handlebars-helpers.js +558 -0
  198. package/dist/src/index.d.ts +109 -0
  199. package/dist/src/index.js +136 -0
  200. package/dist/src/logger.interface.d.ts +14 -0
  201. package/dist/src/logger.interface.js +3 -0
  202. package/dist/src/record.model.d.ts +35 -0
  203. package/dist/src/record.model.js +21 -0
  204. package/dist/src/report.model.d.ts +21 -0
  205. package/dist/src/report.model.js +19 -0
  206. package/dist/src/status.model.d.ts +22 -0
  207. package/dist/src/status.model.js +28 -0
  208. package/dist/src/template.outline.d.ts +49 -0
  209. package/dist/src/template.outline.js +13 -0
  210. package/dist/src/translation-helpers.d.ts +10 -0
  211. package/dist/src/translation-helpers.js +30 -0
  212. package/dist/src/validation/form.model.d.ts +247 -0
  213. package/dist/src/validation/form.model.js +31 -0
  214. package/dist/src/validation/helpers.d.ts +14 -0
  215. package/dist/src/validation/helpers.js +68 -0
  216. package/dist/src/validation/validators-support.d.ts +41 -0
  217. package/dist/src/validation/validators-support.js +141 -0
  218. package/dist/src/validation/validators.d.ts +23 -0
  219. package/dist/src/validation/validators.js +427 -0
  220. package/package.json +95 -0
@@ -0,0 +1,427 @@
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
+ /**
6
+ * A regular expression for validating an email address.
7
+ *
8
+ * Based on the angular email validation regex. MIT-style license https://angular.dev/license
9
+ */
10
+ 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])?)*$/;
11
+ /**
12
+ * Definitions of shared form validators.
13
+ *
14
+ * These can be used on both server-side and client-side. The server provides them to the client.
15
+ * These are the shared / common definitions.
16
+ * ReDBox implementations can modify these validation definitions or add more.
17
+ *
18
+ * The validators are based on:
19
+ * angular built-in validators: https://github.com/angular/angular/blob/5105fd6f05f01f04873ab1c87d64079fd8519ad4/packages/forms/src/validators.ts
20
+ * formly schema: https://github.com/ngx-formly/ngx-formly/blob/a2f7901b6c0895aee63b4b5fe748fc5ec0ad5475/src/core/src/lib/models/fieldconfig.ts
21
+ *
22
+ * These validation definitions need to be on the server-side, and provided to the client-side from the server.
23
+ * There are two sets of validator definitions - 1) shared / common definitions in the core; 2) definitions specific to a client.
24
+ * These two set of definitions need to be merged and provided by the server to the client.
25
+ */
26
+ exports.formValidatorsSharedDefinitions = [
27
+ {
28
+ class: "min",
29
+ message: "@validator-error-min",
30
+ create: (config) => {
31
+ const optionNameKey = "class";
32
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "min");
33
+ const optionMessageKey = "message";
34
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-min");
35
+ const optionMinKey = "min";
36
+ const optionMinValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMinKey);
37
+ return (control) => {
38
+ if (control.value == null || optionMinValue == null) {
39
+ return null; // don't validate empty values to allow optional controls
40
+ }
41
+ let value;
42
+ try {
43
+ value = parseFloat(control.value?.toString() ?? null);
44
+ }
45
+ catch (err) {
46
+ value = undefined;
47
+ }
48
+ // Controls with NaN values after parsing should be treated as not having a
49
+ // minimum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-min
50
+ if (value === undefined || (!isNaN(value) && value < optionMinValue)) {
51
+ return {
52
+ [optionNameValue]: {
53
+ [optionMessageKey]: optionMessageValue,
54
+ params: {
55
+ requiredThreshold: optionMinValue,
56
+ actual: control.value,
57
+ },
58
+ },
59
+ };
60
+ }
61
+ return null;
62
+ };
63
+ },
64
+ },
65
+ {
66
+ class: "max",
67
+ message: "@validator-error-max",
68
+ create: (config) => {
69
+ const optionNameKey = "class";
70
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "max");
71
+ const optionMessageKey = "message";
72
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-max");
73
+ const optionMaxKey = "max";
74
+ const optionMaxValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMaxKey);
75
+ return (control) => {
76
+ if (control.value == null || optionMaxValue == null) {
77
+ return null; // don't validate empty values to allow optional controls
78
+ }
79
+ let value;
80
+ try {
81
+ value = parseFloat(control.value?.toString() ?? null);
82
+ }
83
+ catch (err) {
84
+ value = undefined;
85
+ }
86
+ // Controls with NaN values after parsing should be treated as not having a
87
+ // maximum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-max
88
+ if (value === undefined || (!isNaN(value) && value > optionMaxValue)) {
89
+ return {
90
+ [optionNameValue]: {
91
+ [optionMessageKey]: optionMessageValue,
92
+ params: {
93
+ requiredThreshold: optionMaxValue,
94
+ actual: control.value,
95
+ },
96
+ },
97
+ };
98
+ }
99
+ return null;
100
+ };
101
+ },
102
+ },
103
+ {
104
+ class: "minLength",
105
+ message: "@validator-error-min-length",
106
+ create: (config) => {
107
+ const optionNameKey = "class";
108
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "minLength");
109
+ const optionMessageKey = "message";
110
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-min-length");
111
+ const optionMinLengthKey = "minLength";
112
+ const optionMinLengthValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMinLengthKey);
113
+ return (control) => {
114
+ const length = (0, helpers_1.formValidatorLengthOrSize)(control.value);
115
+ if (length === null || length === 0) {
116
+ // don't validate empty values to allow optional controls
117
+ // don't validate values without `length` or `size` property
118
+ return null;
119
+ }
120
+ return length < optionMinLengthValue
121
+ ? {
122
+ [optionNameValue]: {
123
+ [optionMessageKey]: optionMessageValue,
124
+ params: {
125
+ requiredLength: optionMinLengthValue,
126
+ actualLength: length,
127
+ },
128
+ },
129
+ }
130
+ : null;
131
+ };
132
+ },
133
+ },
134
+ {
135
+ class: "maxLength",
136
+ message: "@validator-error-max-length",
137
+ create: (config) => {
138
+ const optionNameKey = "class";
139
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "maxLength");
140
+ const optionMessageKey = "message";
141
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-max-length");
142
+ const optionMaxLengthKey = "maxLength";
143
+ const optionMaxLengthValue = (0, helpers_1.formValidatorGetDefinitionNumber)(config, optionMaxLengthKey);
144
+ return (control) => {
145
+ const length = (0, helpers_1.formValidatorLengthOrSize)(control.value);
146
+ if (length !== null && length > optionMaxLengthValue) {
147
+ return {
148
+ [optionNameValue]: {
149
+ [optionMessageKey]: optionMessageValue,
150
+ params: {
151
+ requiredLength: optionMaxLengthValue,
152
+ actualLength: length,
153
+ },
154
+ },
155
+ };
156
+ }
157
+ return null;
158
+ };
159
+ },
160
+ },
161
+ {
162
+ class: "required",
163
+ message: "@validator-error-required",
164
+ create: (config) => {
165
+ const optionNameKey = "class";
166
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "required");
167
+ const optionMessageKey = "message";
168
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-required");
169
+ const optionRequiredKey = "required";
170
+ const optionRequiredValue = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, optionRequiredKey, true);
171
+ return (control) => {
172
+ if (optionRequiredValue && (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0)) {
173
+ return {
174
+ [optionNameValue]: {
175
+ [optionMessageKey]: optionMessageValue,
176
+ params: {
177
+ required: optionRequiredValue,
178
+ actual: control.value,
179
+ },
180
+ },
181
+ };
182
+ }
183
+ return null;
184
+ };
185
+ },
186
+ },
187
+ {
188
+ class: "requiredTrue",
189
+ message: "@validator-error-required-true",
190
+ create: (config) => {
191
+ const optionNameKey = "class";
192
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "requiredTrue")?.toString() ?? "";
193
+ const optionMessageKey = "message";
194
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-required-true");
195
+ const optionRequiredKey = "requiredTrue";
196
+ const optionRequiredValue = (0, helpers_1.formValidatorGetDefinitionBoolean)(config, optionRequiredKey, true);
197
+ return (control) => {
198
+ if (optionRequiredValue && control.value !== true) {
199
+ return {
200
+ [optionNameValue]: {
201
+ [optionMessageKey]: optionMessageValue,
202
+ params: {
203
+ required: optionRequiredValue,
204
+ actual: control.value,
205
+ },
206
+ },
207
+ };
208
+ }
209
+ return null;
210
+ };
211
+ },
212
+ },
213
+ {
214
+ class: "email",
215
+ message: "@validator-error-email",
216
+ create: (config) => {
217
+ const optionNameKey = "class";
218
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "email");
219
+ const optionMessageKey = "message";
220
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-email");
221
+ const optionDescriptionKey = "description";
222
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey, "email must be in format (name)@(domain.tld)");
223
+ const optionPatternKey = "pattern";
224
+ const optionPatternValue = (0, helpers_1.formValidatorGetDefinitionRegexp)(config, optionPatternKey, exports.FORM_VALIDATOR_EMAIL_REGEXP);
225
+ return (control) => {
226
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
227
+ // don't validate empty values to allow optional controls
228
+ return null;
229
+ }
230
+ const value = control.value?.toString() ?? "";
231
+ const testOutcome = optionPatternValue.test(value);
232
+ if (!testOutcome) {
233
+ return {
234
+ [optionNameValue]: {
235
+ [optionMessageKey]: optionMessageValue,
236
+ params: {
237
+ requiredPattern: optionPatternValue,
238
+ description: optionDescriptionValue, actual: control.value,
239
+ },
240
+ },
241
+ };
242
+ }
243
+ return null;
244
+ };
245
+ },
246
+ },
247
+ {
248
+ class: "pattern",
249
+ message: "@validator-error-pattern",
250
+ create: (config) => {
251
+ const optionNameKey = "class";
252
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "pattern");
253
+ const optionMessageKey = "message";
254
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-pattern");
255
+ const optionDescriptionKey = "description";
256
+ const optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey);
257
+ const optionPatternKey = "pattern";
258
+ const pattern = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionPatternKey);
259
+ let regex;
260
+ let regexStr = (pattern instanceof RegExp ? pattern?.source : pattern?.toString()) ?? "";
261
+ // The pattern must start with '^' (start anchor)
262
+ if (regexStr.charAt(0) !== "^") {
263
+ regexStr = ("^" + regexStr);
264
+ }
265
+ // The pattern must end with '$' (end anchor).
266
+ if (regexStr.charAt(regexStr.length - 1) !== "$") {
267
+ regexStr = (regexStr + "$");
268
+ }
269
+ regex = new RegExp(regexStr);
270
+ return (control) => {
271
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
272
+ return null; // don't validate empty values to allow optional controls
273
+ }
274
+ const value = control.value?.toString();
275
+ return regex.test(value)
276
+ ? null
277
+ : {
278
+ [optionNameValue]: {
279
+ [optionMessageKey]: optionMessageValue,
280
+ params: {
281
+ requiredPattern: regexStr,
282
+ description: optionDescriptionValue,
283
+ actual: value,
284
+ },
285
+ },
286
+ };
287
+ };
288
+ },
289
+ },
290
+ {
291
+ class: "different-values",
292
+ message: "@validator-error-different-values",
293
+ create: (config) => {
294
+ const optionNameKey = "class";
295
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "different-values");
296
+ const optionMessageKey = "message";
297
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-different-values");
298
+ const optionControlNamesKey = "controlNames";
299
+ const optionControlNamesValue = (0, helpers_1.formValidatorGetDefinitionArray)(config, optionControlNamesKey);
300
+ return (control) => {
301
+ // TODO: fix how control values are obtained - need to use full angular component path
302
+ const controls = (optionControlNamesValue ?? [])
303
+ ?.filter(i => i !== null && i !== undefined)
304
+ ?.map(n => control?.get(n?.toString())) ?? [];
305
+ const values = new Set(controls?.map(c => c?.value) ?? []);
306
+ if (values.size !== controls.length) {
307
+ return {
308
+ [optionNameValue]: {
309
+ [optionMessageKey]: optionMessageValue,
310
+ params: {
311
+ controlNames: optionControlNamesValue,
312
+ controlCount: optionControlNamesValue?.length,
313
+ valueCount: values.size,
314
+ values: Array.from(values),
315
+ },
316
+ },
317
+ };
318
+ }
319
+ return null;
320
+ };
321
+ },
322
+ },
323
+ {
324
+ class: "jsonata-expression",
325
+ message: "@validator-error-jsonata-expression",
326
+ create: (config) => {
327
+ const optionNameKey = "class";
328
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "jsonata-expression");
329
+ const optionMessageKey = "message";
330
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-jsonata-expression");
331
+ const optionDescriptionKey = "description";
332
+ let optionDescriptionValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionDescriptionKey);
333
+ const optionExpressionKey = "expression";
334
+ const expression = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionExpressionKey);
335
+ const optionEvaluatorKey = "evaluator";
336
+ const evaluator = (0, helpers_1.formValidatorGetDefinitionItem)(config, optionEvaluatorKey);
337
+ return (control) => {
338
+ if (control.value == null || (0, helpers_1.formValidatorLengthOrSize)(control.value) === 0) {
339
+ return null; // don't validate empty values to allow optional controls
340
+ }
341
+ const value = control.value?.toString();
342
+ let success;
343
+ try {
344
+ success = evaluator(control);
345
+ }
346
+ catch (err) {
347
+ success = false;
348
+ optionDescriptionValue = "the validator is not configured correctly";
349
+ console.error(`Validator 'jsonata-expression' could not run due to error: ${err}`);
350
+ }
351
+ return success
352
+ ? null
353
+ : {
354
+ [optionNameValue]: {
355
+ [optionMessageKey]: optionMessageValue,
356
+ params: {
357
+ expression: expression,
358
+ description: optionDescriptionValue,
359
+ actual: value,
360
+ },
361
+ },
362
+ };
363
+ };
364
+ },
365
+ },
366
+ // 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
367
+ {
368
+ class: "orcid",
369
+ message: "@validator-error-orcid",
370
+ create: (config) => {
371
+ const optionNameKey = "class";
372
+ const optionNameValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionNameKey, "orcid");
373
+ const optionMessageKey = "message";
374
+ const optionMessageValue = (0, helpers_1.formValidatorGetDefinitionString)(config, optionMessageKey, "@validator-error-orcid");
375
+ return (control) => {
376
+ if (control.value == null || control.value === "") {
377
+ return null; // don't validate empty values
378
+ }
379
+ let value = control.value.toString();
380
+ // Validate format: either xxxx-xxxx-xxxx-xxxx or xxxxxxxxxxxxxxxx, last digit can be X or x
381
+ if (!/^(\d{4}-\d{4}-\d{4}-\d{3}[\dXx]|\d{15}[\dXx])$/.test(value)) {
382
+ return {
383
+ [optionNameValue]: {
384
+ [optionMessageKey]: optionMessageValue,
385
+ params: {
386
+ actual: control.value,
387
+ },
388
+ },
389
+ };
390
+ }
391
+ value = value.replace(/-/g, '');
392
+ if (value.length !== 16) {
393
+ return {
394
+ [optionNameValue]: {
395
+ [optionMessageKey]: optionMessageValue,
396
+ params: {
397
+ actual: control.value,
398
+ },
399
+ },
400
+ };
401
+ }
402
+ const baseDigits = value.substring(0, 15);
403
+ const checkDigit = value.substring(15);
404
+ let total = 0;
405
+ for (let i = 0; i < baseDigits.length; i++) {
406
+ const digit = parseInt(baseDigits.charAt(i), 10);
407
+ total = (total + digit) * 2;
408
+ }
409
+ const remainder = total % 11;
410
+ const result = (12 - remainder) % 11;
411
+ const calculatedCheckDigit = result === 10 ? "X" : result.toString();
412
+ if (checkDigit.toUpperCase() !== calculatedCheckDigit) {
413
+ return {
414
+ [optionNameValue]: {
415
+ [optionMessageKey]: optionMessageValue,
416
+ params: {
417
+ actual: control.value,
418
+ },
419
+ },
420
+ };
421
+ }
422
+ return null;
423
+ };
424
+ },
425
+ },
426
+ ];
427
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdUNBS21CO0FBSW5COzs7O0dBSUc7QUFDVSxRQUFBLDJCQUEyQixHQUFHLG9NQUFvTSxDQUFDO0FBRWhQOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ1UsUUFBQSwrQkFBK0IsR0FBOEI7SUFDeEU7UUFDRSxLQUFLLEVBQUUsS0FBSztRQUNaLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDO1lBQzlCLE1BQU0sZUFBZSxHQUFHLElBQUEsMENBQWdDLEVBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RixNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztZQUNuQyxNQUFNLGtCQUFrQixHQUFHLElBQUEsMENBQWdDLEVBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDOUcsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzNCLE1BQU0sY0FBYyxHQUFHLElBQUEsMENBQWdDLEVBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzlFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3BELE9BQU8sSUFBSSxDQUFDLENBQUMseURBQXlEO2dCQUN4RSxDQUFDO2dCQUVELElBQUksS0FBSyxDQUFDO2dCQUNWLElBQUksQ0FBQztvQkFDRCxLQUFLLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQzFELENBQUM7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
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "@researchdatabox/sails-ng-common",
3
+ "version": "0.0.1-beta.8936",
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/**/*.test.js",
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.0",
48
+ "chai": "6.2.2",
49
+ "jsonata": "2.1.0",
50
+ "mocha": "11.7.5",
51
+ "mocha-junit-reporter": "2.2.1",
52
+ "nyc": "18.0.0",
53
+ "serialize-javascript": "7.0.5",
54
+ "typescript": "6.0.2"
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.5.0",
76
+ "lodash": "4.17.23",
77
+ "lodash-es": "4.17.23",
78
+ "luxon": "3.7.2",
79
+ "marked": "17.0.5",
80
+ "ts-json-schema-generator": "2.9.0"
81
+ },
82
+ "overrides": {
83
+ "mocha": {
84
+ "serialize-javascript": "7.0.5"
85
+ }
86
+ },
87
+ "peerDependencies": {
88
+ "jsonata": "2.1.0"
89
+ },
90
+ "publishConfig": {
91
+ "access": "public",
92
+ "registry": "https://registry.npmjs.org/",
93
+ "provenance": false
94
+ }
95
+ }