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