@oneblink/apps-react 6.11.0-beta.1 → 6.11.0-beta.3

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 (30) hide show
  1. package/dist/components/renderer/LookupButton.js +1 -1
  2. package/dist/components/renderer/LookupButton.js.map +1 -1
  3. package/dist/components/renderer/attachments/FileCard.js +1 -1
  4. package/dist/components/renderer/attachments/FileCard.js.map +1 -1
  5. package/dist/form-elements/FormElementFiles.js +1 -1
  6. package/dist/form-elements/FormElementFiles.js.map +1 -1
  7. package/dist/form-elements/FormElementSection.js +1 -1
  8. package/dist/form-elements/FormElementSection.js.map +1 -1
  9. package/dist/hooks/useFormValidation.js +9 -6
  10. package/dist/hooks/useFormValidation.js.map +1 -1
  11. package/dist/hooks/usePages.js +1 -1
  12. package/dist/hooks/usePages.js.map +1 -1
  13. package/dist/services/form-validation/extensions.d.ts +26 -0
  14. package/dist/services/form-validation/extensions.js +93 -0
  15. package/dist/services/form-validation/extensions.js.map +1 -0
  16. package/dist/services/form-validation/validate-dot-js.d.ts +63 -0
  17. package/dist/services/form-validation/validate-dot-js.js +329 -0
  18. package/dist/services/form-validation/validate-dot-js.js.map +1 -0
  19. package/dist/services/form-validation/validateSubmission.d.ts +9 -0
  20. package/dist/services/form-validation/validateSubmission.js +490 -0
  21. package/dist/services/form-validation/validateSubmission.js.map +1 -0
  22. package/dist/services/form-validation/validators.d.ts +13 -0
  23. package/dist/services/form-validation/validators.js +70 -0
  24. package/dist/services/form-validation/validators.js.map +1 -0
  25. package/dist/services/generateCivicaNameRecordElements.d.ts +1 -1
  26. package/dist/services/generateCivicaNameRecordElements.js.map +1 -1
  27. package/package.json +1 -2
  28. package/dist/services/form-validation.d.ts +0 -10
  29. package/dist/services/form-validation.js +0 -604
  30. package/dist/services/form-validation.js.map +0 -1
@@ -0,0 +1,329 @@
1
+ const EMPTY_STRING_REGEXP = /^\s*$/;
2
+ // eslint-disable-next-line no-useless-escape
3
+ const FORMAT_REGEXP = /(%?)%\{([^\}]+)\}/g;
4
+ const EMAIL_REGEXP =
5
+ // eslint-disable-next-line no-control-regex
6
+ /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i;
7
+ /**
8
+ * Checks if the value is a number. This function does not consider NaN a number
9
+ * like many other `isNumber` functions do.
10
+ *
11
+ * @param value
12
+ * @returns
13
+ */
14
+ function isNumber(value) {
15
+ return typeof value === 'number' && !isNaN(value);
16
+ }
17
+ /**
18
+ * Returns false if the object is not a function
19
+ *
20
+ * @param value
21
+ * @returns
22
+ */
23
+ function isFunction(value) {
24
+ return typeof value === 'function';
25
+ }
26
+ /**
27
+ * A simple check to verify that the value is an integer. Uses `isNumber` and a
28
+ * simple modulo check.
29
+ *
30
+ * @param value
31
+ * @returns
32
+ */
33
+ function isInteger(value) {
34
+ return isNumber(value) && value % 1 === 0;
35
+ }
36
+ /**
37
+ * Uses the `Object` function to check if the given argument is an object.
38
+ *
39
+ * @param obj
40
+ * @returns
41
+ */
42
+ function isObject(obj) {
43
+ return obj === Object(obj);
44
+ }
45
+ /**
46
+ * Simply checks if the object is an instance of a date
47
+ *
48
+ * @param obj
49
+ * @returns
50
+ */
51
+ function isDate(obj) {
52
+ return obj instanceof Date;
53
+ }
54
+ /**
55
+ * Returns false if the object is `null` of `undefined`
56
+ *
57
+ * @param obj
58
+ * @returns
59
+ */
60
+ function isDefined(obj) {
61
+ return obj !== null && obj !== undefined;
62
+ }
63
+ export function isEmpty(value) {
64
+ // Null and undefined are empty
65
+ if (!isDefined(value)) {
66
+ return true;
67
+ }
68
+ // functions are non empty
69
+ if (isFunction(value)) {
70
+ return false;
71
+ }
72
+ // Whitespace only strings are empty
73
+ if (isString(value)) {
74
+ return EMPTY_STRING_REGEXP.test(value);
75
+ }
76
+ // For arrays we use the length property
77
+ if (isArray(value)) {
78
+ return value.length === 0;
79
+ }
80
+ // Dates have no attributes but aren't empty
81
+ if (isDate(value)) {
82
+ return false;
83
+ }
84
+ // If we find at least one property we consider it non empty
85
+ if (isObject(value)) {
86
+ for (const _attr in value) {
87
+ return false;
88
+ }
89
+ return true;
90
+ }
91
+ return false;
92
+ }
93
+ /**
94
+ * Formats the specified strings with the given values like so:
95
+ *
96
+ * format('Foo: %{foo}', { foo: 'bar' }) // "Foo bar"
97
+ *
98
+ * If you want to write %{...} without having it replaced simply prefix it with
99
+ * % like this `Foo: %%{foo}` and it will be returned as `"Foo: %{foo}"`
100
+ *
101
+ * @param str
102
+ * @param vals
103
+ * @returns
104
+ */
105
+ function formatValidationMessage(str, vals) {
106
+ if (!isString(str)) {
107
+ return str;
108
+ }
109
+ return str.replace(FORMAT_REGEXP, function (m0, m1, m2) {
110
+ if (m1 === '%') {
111
+ return '%{' + m2 + '}';
112
+ }
113
+ else {
114
+ return String(vals[m2]);
115
+ }
116
+ });
117
+ }
118
+ function isString(value) {
119
+ return typeof value === 'string';
120
+ }
121
+ function isArray(value) {
122
+ return Array.isArray(value);
123
+ }
124
+ export const validators = {
125
+ /**
126
+ * Presence validates that the value isn't empty
127
+ *
128
+ * @param value
129
+ * @param options
130
+ * @returns
131
+ */
132
+ presence(value, options) {
133
+ if ((options === null || options === void 0 ? void 0 : options.allowEmpty) !== false ? !isDefined(value) : isEmpty(value)) {
134
+ return [(options === null || options === void 0 ? void 0 : options.message) || "can't be blank"];
135
+ }
136
+ return [];
137
+ },
138
+ length(value, options) {
139
+ // Empty values are allowed
140
+ if (!isDefined(value)) {
141
+ return [];
142
+ }
143
+ const length = value === null || value === void 0 ? void 0 : value.length;
144
+ const { message, is, minimum, maximum, tooShort, tooLong, wrongLength } = options || {};
145
+ if (!isNumber(length)) {
146
+ return [message || 'has an incorrect length'];
147
+ }
148
+ const errors = [];
149
+ // Is checks
150
+ if (isNumber(is) && length !== is) {
151
+ const err = wrongLength || 'is the wrong length (should be %{count} characters)';
152
+ errors.push(formatValidationMessage(err, { count: is }));
153
+ }
154
+ if (isNumber(minimum) && length < minimum) {
155
+ const err = tooShort || 'is too short (minimum is %{count} characters)';
156
+ errors.push(formatValidationMessage(err, { count: minimum }));
157
+ }
158
+ if (isNumber(maximum) && length > maximum) {
159
+ const err = tooLong || 'is too long (maximum is %{count} characters)';
160
+ errors.push(formatValidationMessage(err, { count: maximum }));
161
+ }
162
+ if (errors.length > 0) {
163
+ return message ? [message] : errors;
164
+ }
165
+ return [];
166
+ },
167
+ numericality(value, options) {
168
+ // Empty values are fine
169
+ if (!isDefined(value)) {
170
+ return [];
171
+ }
172
+ // If it's not a number we shouldn't continue since it will compare it.
173
+ if (!isNumber(value)) {
174
+ return [(options === null || options === void 0 ? void 0 : options.message) || (options === null || options === void 0 ? void 0 : options.notValid) || 'is not a number'];
175
+ }
176
+ // Same logic as above, sort of. Don't bother with comparisons if this
177
+ // doesn't pass.
178
+ if ((options === null || options === void 0 ? void 0 : options.onlyInteger) && !isInteger(value)) {
179
+ return [(options === null || options === void 0 ? void 0 : options.message) || (options === null || options === void 0 ? void 0 : options.notInteger) || 'must be an integer'];
180
+ }
181
+ const checks = [
182
+ {
183
+ name: 'greater than',
184
+ message: options === null || options === void 0 ? void 0 : options.notGreaterThan,
185
+ predicateValue: options === null || options === void 0 ? void 0 : options.greaterThan,
186
+ predicate(predicateValue) {
187
+ return value > predicateValue;
188
+ },
189
+ },
190
+ {
191
+ name: 'greater than or equal to',
192
+ message: options === null || options === void 0 ? void 0 : options.notGreaterThanOrEqualTo,
193
+ predicateValue: options === null || options === void 0 ? void 0 : options.greaterThanOrEqualTo,
194
+ predicate(predicateValue) {
195
+ return value >= predicateValue;
196
+ },
197
+ },
198
+ {
199
+ name: 'equal to',
200
+ message: options === null || options === void 0 ? void 0 : options.notEqualTo,
201
+ predicateValue: options === null || options === void 0 ? void 0 : options.equalTo,
202
+ predicate(predicateValue) {
203
+ return value === predicateValue;
204
+ },
205
+ },
206
+ {
207
+ name: 'less than',
208
+ message: options === null || options === void 0 ? void 0 : options.notLessThan,
209
+ predicateValue: options === null || options === void 0 ? void 0 : options.lessThan,
210
+ predicate(predicateValue) {
211
+ return value < predicateValue;
212
+ },
213
+ },
214
+ {
215
+ name: 'less than or equal to',
216
+ message: options === null || options === void 0 ? void 0 : options.notLessThanOrEqualTo,
217
+ predicateValue: options === null || options === void 0 ? void 0 : options.lessThanOrEqualTo,
218
+ predicate(predicateValue) {
219
+ return value <= predicateValue;
220
+ },
221
+ },
222
+ {
223
+ name: 'divisible by',
224
+ message: options === null || options === void 0 ? void 0 : options.notDivisibleBy,
225
+ predicateValue: options === null || options === void 0 ? void 0 : options.divisibleBy,
226
+ predicate(predicateValue) {
227
+ return value % predicateValue === 0;
228
+ },
229
+ },
230
+ ];
231
+ const errors = [];
232
+ for (const check of checks) {
233
+ if (isNumber(check.predicateValue) &&
234
+ !check.predicate(check.predicateValue)) {
235
+ // This picks the default message if specified
236
+ // For example the greaterThan check uses the message from
237
+ // this.notGreaterThan so we capitalize the name and prepend "not"
238
+ const msg = check.message || 'must be %{type} %{count}';
239
+ errors.push(formatValidationMessage(msg, {
240
+ count: check.predicateValue,
241
+ type: check.name,
242
+ }));
243
+ }
244
+ }
245
+ if ((options === null || options === void 0 ? void 0 : options.odd) && value % 2 !== 1) {
246
+ errors.push(options.notOdd || 'must be odd');
247
+ }
248
+ if ((options === null || options === void 0 ? void 0 : options.even) && value % 2 !== 0) {
249
+ errors.push(options.notEven || 'must be even');
250
+ }
251
+ if (errors.length) {
252
+ return (options === null || options === void 0 ? void 0 : options.message) ? [options.message] : errors;
253
+ }
254
+ return [];
255
+ },
256
+ datetime(value, { format, ...options }) {
257
+ // Empty values are fine
258
+ if (!isDefined(value)) {
259
+ return [];
260
+ }
261
+ let num = value;
262
+ if (isString(value)) {
263
+ num = Date.parse(value);
264
+ }
265
+ // 86400000 is the number of milliseconds in a day, this is used to remove
266
+ // the time from the date
267
+ if (!isNumber(num) ||
268
+ isNaN(num) ||
269
+ (options.dateOnly && num % 86400000 !== 0)) {
270
+ const err = options.notValid || options.message || 'must be a valid date';
271
+ return [formatValidationMessage(err, { value })];
272
+ }
273
+ const errors = [];
274
+ const earliest = options.earliest ? Date.parse(options.earliest) : NaN;
275
+ if (!isNaN(earliest) && num < earliest) {
276
+ const err = options.tooEarly || options.message || 'must be no earlier than %{date}';
277
+ errors.push(formatValidationMessage(err, {
278
+ value: format(new Date(num)),
279
+ date: format(new Date(earliest)),
280
+ }));
281
+ }
282
+ const latest = options.latest ? Date.parse(options.latest) : NaN;
283
+ if (!isNaN(latest) && num > latest) {
284
+ const err = options.tooLate || options.message || 'must be no later than %{date}';
285
+ errors.push(formatValidationMessage(err, {
286
+ date: format(new Date(latest)),
287
+ value: format(new Date(num)),
288
+ }));
289
+ }
290
+ return errors;
291
+ },
292
+ regexValidation(value, options) {
293
+ if (isString(options) || options instanceof RegExp) {
294
+ options = { pattern: options };
295
+ }
296
+ const message = options.message || 'is invalid';
297
+ // Empty values are allowed
298
+ if (!isDefined(value)) {
299
+ return [];
300
+ }
301
+ if (!isString(value)) {
302
+ return [message];
303
+ }
304
+ let pattern = options.pattern;
305
+ if (isString(pattern)) {
306
+ pattern = new RegExp(options.pattern, options.flags);
307
+ }
308
+ const match = pattern.exec(value);
309
+ if (!match || match[0].length != value.length) {
310
+ return [message];
311
+ }
312
+ return [];
313
+ },
314
+ email(value, options) {
315
+ // Empty values are fine
316
+ if (!isDefined(value)) {
317
+ return [];
318
+ }
319
+ const message = (options === null || options === void 0 ? void 0 : options.message) || 'is not a valid email';
320
+ if (!isString(value)) {
321
+ return [message];
322
+ }
323
+ if (!EMAIL_REGEXP.exec(value)) {
324
+ return [message];
325
+ }
326
+ return [];
327
+ },
328
+ };
329
+ //# sourceMappingURL=validate-dot-js.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-dot-js.js","sourceRoot":"","sources":["../../../src/services/form-validation/validate-dot-js.ts"],"names":[],"mappings":"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","sourcesContent":["const EMPTY_STRING_REGEXP = /^\\s*$/\n// eslint-disable-next-line no-useless-escape\nconst FORMAT_REGEXP = /(%?)%\\{([^\\}]+)\\}/g\nconst EMAIL_REGEXP =\n // eslint-disable-next-line no-control-regex\n /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i\n\n/**\n * Checks if the value is a number. This function does not consider NaN a number\n * like many other `isNumber` functions do.\n *\n * @param value\n * @returns\n */\nfunction isNumber(value: unknown): value is number {\n return typeof value === 'number' && !isNaN(value)\n}\n\n/**\n * Returns false if the object is not a function\n *\n * @param value\n * @returns\n */\nfunction isFunction(value: unknown) {\n return typeof value === 'function'\n}\n\n/**\n * A simple check to verify that the value is an integer. Uses `isNumber` and a\n * simple modulo check.\n *\n * @param value\n * @returns\n */\nfunction isInteger(value: unknown): value is number {\n return isNumber(value) && value % 1 === 0\n}\n\n/**\n * Uses the `Object` function to check if the given argument is an object.\n *\n * @param obj\n * @returns\n */\nfunction isObject(obj: unknown): obj is object {\n return obj === Object(obj)\n}\n\n/**\n * Simply checks if the object is an instance of a date\n *\n * @param obj\n * @returns\n */\nfunction isDate(obj: unknown): obj is Date {\n return obj instanceof Date\n}\n\n/**\n * Returns false if the object is `null` of `undefined`\n *\n * @param obj\n * @returns\n */\nfunction isDefined(obj: unknown) {\n return obj !== null && obj !== undefined\n}\n\nexport function isEmpty(value: unknown) {\n // Null and undefined are empty\n if (!isDefined(value)) {\n return true\n }\n\n // functions are non empty\n if (isFunction(value)) {\n return false\n }\n\n // Whitespace only strings are empty\n if (isString(value)) {\n return EMPTY_STRING_REGEXP.test(value)\n }\n\n // For arrays we use the length property\n if (isArray(value)) {\n return value.length === 0\n }\n\n // Dates have no attributes but aren't empty\n if (isDate(value)) {\n return false\n }\n\n // If we find at least one property we consider it non empty\n if (isObject(value)) {\n for (const _attr in value) {\n return false\n }\n return true\n }\n\n return false\n}\n\n/**\n * Formats the specified strings with the given values like so:\n *\n * format('Foo: %{foo}', { foo: 'bar' }) // \"Foo bar\"\n *\n * If you want to write %{...} without having it replaced simply prefix it with\n * % like this `Foo: %%{foo}` and it will be returned as `\"Foo: %{foo}\"`\n *\n * @param str\n * @param vals\n * @returns\n */\nfunction formatValidationMessage(\n str: string,\n vals: Record<string, unknown>,\n): string {\n if (!isString(str)) {\n return str\n }\n return str.replace(FORMAT_REGEXP, function (m0, m1, m2) {\n if (m1 === '%') {\n return '%{' + m2 + '}'\n } else {\n return String(vals[m2])\n }\n })\n}\n\nfunction isString(value: unknown) {\n return typeof value === 'string'\n}\n\nfunction isArray(value: unknown) {\n return Array.isArray(value)\n}\n\nexport const validators = {\n /**\n * Presence validates that the value isn't empty\n *\n * @param value\n * @param options\n * @returns\n */\n presence(\n value: unknown,\n options?: { allowEmpty?: boolean; message?: string },\n ): string[] {\n if (options?.allowEmpty !== false ? !isDefined(value) : isEmpty(value)) {\n return [options?.message || \"can't be blank\"]\n }\n\n return []\n },\n\n length(\n value: unknown,\n options?: {\n message?: string\n is?: number\n minimum?: number\n maximum?: number\n tooShort?: string\n tooLong?: string\n wrongLength?: string\n },\n ): string[] {\n // Empty values are allowed\n if (!isDefined(value)) {\n return []\n }\n\n const length = (value as { length?: unknown } | string | Array<unknown>)\n ?.length\n const { message, is, minimum, maximum, tooShort, tooLong, wrongLength } =\n options || {}\n\n if (!isNumber(length)) {\n return [message || 'has an incorrect length']\n }\n\n const errors: string[] = []\n // Is checks\n if (isNumber(is) && length !== is) {\n const err =\n wrongLength || 'is the wrong length (should be %{count} characters)'\n errors.push(formatValidationMessage(err, { count: is }))\n }\n\n if (isNumber(minimum) && length < minimum) {\n const err = tooShort || 'is too short (minimum is %{count} characters)'\n errors.push(formatValidationMessage(err, { count: minimum }))\n }\n\n if (isNumber(maximum) && length > maximum) {\n const err = tooLong || 'is too long (maximum is %{count} characters)'\n errors.push(formatValidationMessage(err, { count: maximum }))\n }\n\n if (errors.length > 0) {\n return message ? [message] : errors\n }\n\n return []\n },\n numericality(\n value: unknown,\n options?: {\n message?: string\n notValid?: string\n onlyInteger?: boolean\n notInteger?: string\n greaterThan?: number\n notGreaterThan?: string\n greaterThanOrEqualTo?: number\n notGreaterThanOrEqualTo?: string\n lessThanOrEqualTo?: number\n notLessThanOrEqualTo?: string\n equalTo?: number\n notEqualTo?: string\n lessThan?: number\n notLessThan?: string\n divisibleBy?: number\n notDivisibleBy?: string\n odd?: boolean\n notOdd?: string\n even?: boolean\n notEven?: string\n },\n ): string[] {\n // Empty values are fine\n if (!isDefined(value)) {\n return []\n }\n\n // If it's not a number we shouldn't continue since it will compare it.\n if (!isNumber(value)) {\n return [options?.message || options?.notValid || 'is not a number']\n }\n\n // Same logic as above, sort of. Don't bother with comparisons if this\n // doesn't pass.\n if (options?.onlyInteger && !isInteger(value)) {\n return [options?.message || options?.notInteger || 'must be an integer']\n }\n\n const checks = [\n {\n name: 'greater than',\n message: options?.notGreaterThan,\n predicateValue: options?.greaterThan,\n predicate(predicateValue: number) {\n return value > predicateValue\n },\n },\n {\n name: 'greater than or equal to',\n message: options?.notGreaterThanOrEqualTo,\n predicateValue: options?.greaterThanOrEqualTo,\n predicate(predicateValue: number) {\n return value >= predicateValue\n },\n },\n {\n name: 'equal to',\n message: options?.notEqualTo,\n predicateValue: options?.equalTo,\n predicate(predicateValue: number) {\n return value === predicateValue\n },\n },\n {\n name: 'less than',\n message: options?.notLessThan,\n predicateValue: options?.lessThan,\n predicate(predicateValue: number) {\n return value < predicateValue\n },\n },\n {\n name: 'less than or equal to',\n message: options?.notLessThanOrEqualTo,\n predicateValue: options?.lessThanOrEqualTo,\n predicate(predicateValue: number) {\n return value <= predicateValue\n },\n },\n {\n name: 'divisible by',\n message: options?.notDivisibleBy,\n predicateValue: options?.divisibleBy,\n predicate(predicateValue: number) {\n return value % predicateValue === 0\n },\n },\n ]\n\n const errors: string[] = []\n\n for (const check of checks) {\n if (\n isNumber(check.predicateValue) &&\n !check.predicate(check.predicateValue)\n ) {\n // This picks the default message if specified\n // For example the greaterThan check uses the message from\n // this.notGreaterThan so we capitalize the name and prepend \"not\"\n const msg = check.message || 'must be %{type} %{count}'\n\n errors.push(\n formatValidationMessage(msg, {\n count: check.predicateValue,\n type: check.name,\n }),\n )\n }\n }\n\n if (options?.odd && value % 2 !== 1) {\n errors.push(options.notOdd || 'must be odd')\n }\n if (options?.even && value % 2 !== 0) {\n errors.push(options.notEven || 'must be even')\n }\n\n if (errors.length) {\n return options?.message ? [options.message] : errors\n }\n\n return []\n },\n\n datetime(\n value: unknown,\n {\n format,\n ...options\n }: {\n format: (date: Date) => string\n earliest?: string\n latest?: string\n tooEarly?: string\n tooLate?: string\n dateOnly?: boolean\n notValid?: string\n message?: string\n },\n ): string[] {\n // Empty values are fine\n if (!isDefined(value)) {\n return []\n }\n\n let num = value\n if (isString(value)) {\n num = Date.parse(value)\n }\n\n // 86400000 is the number of milliseconds in a day, this is used to remove\n // the time from the date\n if (\n !isNumber(num) ||\n isNaN(num) ||\n (options.dateOnly && num % 86400000 !== 0)\n ) {\n const err = options.notValid || options.message || 'must be a valid date'\n return [formatValidationMessage(err, { value })]\n }\n\n const errors = []\n\n const earliest = options.earliest ? Date.parse(options.earliest) : NaN\n if (!isNaN(earliest) && num < earliest) {\n const err =\n options.tooEarly || options.message || 'must be no earlier than %{date}'\n errors.push(\n formatValidationMessage(err, {\n value: format(new Date(num)),\n date: format(new Date(earliest)),\n }),\n )\n }\n\n const latest = options.latest ? Date.parse(options.latest) : NaN\n if (!isNaN(latest) && num > latest) {\n const err =\n options.tooLate || options.message || 'must be no later than %{date}'\n errors.push(\n formatValidationMessage(err, {\n date: format(new Date(latest)),\n value: format(new Date(num)),\n }),\n )\n }\n\n return errors\n },\n\n regexValidation(\n value: unknown,\n options:\n | {\n pattern: RegExp | string\n message?: string\n flags?: string\n }\n | RegExp\n | string,\n ): string[] {\n if (isString(options) || options instanceof RegExp) {\n options = { pattern: options }\n }\n\n const message = options.message || 'is invalid'\n\n // Empty values are allowed\n if (!isDefined(value)) {\n return []\n }\n if (!isString(value)) {\n return [message]\n }\n\n let pattern = options.pattern\n if (isString(pattern)) {\n pattern = new RegExp(options.pattern, options.flags)\n }\n const match = pattern.exec(value)\n if (!match || match[0].length != value.length) {\n return [message]\n }\n\n return []\n },\n\n email(value: unknown, options?: { message?: string }): string[] {\n // Empty values are fine\n if (!isDefined(value)) {\n return []\n }\n\n const message = options?.message || 'is not a valid email'\n if (!isString(value)) {\n return [message]\n }\n if (!EMAIL_REGEXP.exec(value)) {\n return [message]\n }\n\n return []\n },\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { FormTypes, SubmissionTypes } from '@oneblink/types';
2
+ import { CaptchaType, ExecutedLookups, FormElementsConditionallyShown, FormElementsValidation } from '../../types/form';
3
+ export default function validateSubmission({ elements, submission, formElementsConditionallyShown, executedLookups, captchaType, }: {
4
+ elements: FormTypes.FormElementWithName[];
5
+ submission: SubmissionTypes.S3SubmissionData['submission'];
6
+ formElementsConditionallyShown: FormElementsConditionallyShown | undefined;
7
+ executedLookups: ExecutedLookups;
8
+ captchaType: CaptchaType;
9
+ }): FormElementsValidation | undefined;