@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.
Files changed (41) hide show
  1. package/dist/OneBlinkFormBase.js +4 -3
  2. package/dist/OneBlinkFormBase.js.map +1 -1
  3. package/dist/components/renderer/LookupButton.js +1 -1
  4. package/dist/components/renderer/LookupButton.js.map +1 -1
  5. package/dist/components/renderer/attachments/FileCard.js +1 -1
  6. package/dist/components/renderer/attachments/FileCard.js.map +1 -1
  7. package/dist/form-elements/FormElementCaptcha.d.ts +1 -1
  8. package/dist/form-elements/FormElementCaptcha.js +9 -5
  9. package/dist/form-elements/FormElementCaptcha.js.map +1 -1
  10. package/dist/form-elements/FormElementFiles.js +1 -1
  11. package/dist/form-elements/FormElementFiles.js.map +1 -1
  12. package/dist/form-elements/FormElementSection.js +1 -1
  13. package/dist/form-elements/FormElementSection.js.map +1 -1
  14. package/dist/form-elements/OptionButton.js +10 -2
  15. package/dist/form-elements/OptionButton.js.map +1 -1
  16. package/dist/hooks/useFormValidation.d.ts +1 -1
  17. package/dist/hooks/useFormValidation.js +10 -6
  18. package/dist/hooks/useFormValidation.js.map +1 -1
  19. package/dist/hooks/usePages.js +1 -1
  20. package/dist/hooks/usePages.js.map +1 -1
  21. package/dist/services/form-validation/extensions.d.ts +28 -0
  22. package/dist/services/form-validation/extensions.js +97 -0
  23. package/dist/services/form-validation/extensions.js.map +1 -0
  24. package/dist/services/form-validation/validate-dot-js.d.ts +63 -0
  25. package/dist/services/form-validation/validate-dot-js.js +328 -0
  26. package/dist/services/form-validation/validate-dot-js.js.map +1 -0
  27. package/dist/services/form-validation/validateSubmission.d.ts +11 -0
  28. package/dist/services/form-validation/validateSubmission.js +503 -0
  29. package/dist/services/form-validation/validateSubmission.js.map +1 -0
  30. package/dist/services/form-validation/validators.d.ts +13 -0
  31. package/dist/services/form-validation/validators.js +70 -0
  32. package/dist/services/form-validation/validators.js.map +1 -0
  33. package/dist/services/generateCivicaNameRecordElements.d.ts +1 -1
  34. package/dist/services/generateCivicaNameRecordElements.js.map +1 -1
  35. package/dist/styles/option-buttons.scss +5 -0
  36. package/dist/styles.css +6 -0
  37. package/dist/styles.scss +1 -0
  38. package/package.json +3 -3
  39. package/dist/services/form-validation.d.ts +0 -10
  40. package/dist/services/form-validation.js +0 -604
  41. 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;