@sanity/validation 2.33.4-shopify.8 → 2.34.1-canary.0

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.
@@ -5,78 +5,77 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = validateDocument;
7
7
  exports.resolveTypeForArrayItem = resolveTypeForArrayItem;
8
+ exports.validateDocumentObservable = validateDocumentObservable;
8
9
  exports.validateItem = validateItem;
9
-
10
10
  var _uniqBy2 = _interopRequireDefault(require("lodash/uniqBy"));
11
-
11
+ var _flatten2 = _interopRequireDefault(require("lodash/flatten"));
12
12
  var _types = require("@sanity/types");
13
-
13
+ var _rxjs = require("rxjs");
14
+ var _operators = require("rxjs/operators");
14
15
  var _typeString = _interopRequireDefault(require("./util/typeString"));
15
-
16
+ var _requestIdleCallback = require("./util/requestIdleCallback");
16
17
  var _ValidationError = _interopRequireDefault(require("./ValidationError"));
17
-
18
18
  var _normalizeValidationRules = _interopRequireDefault(require("./util/normalizeValidationRules"));
19
-
20
19
  var _excluded = ["value", "type", "path", "parent"];
21
-
22
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
21
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
25
-
26
22
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
27
-
28
23
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
29
-
30
24
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
31
-
32
25
  function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
33
-
34
26
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
35
-
36
27
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
37
-
38
28
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
39
-
40
29
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
41
-
42
30
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
43
-
44
31
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
45
-
46
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
47
-
48
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
49
-
50
32
  var isRecord = maybeRecord => typeof maybeRecord === 'object' && maybeRecord !== null && !Array.isArray(maybeRecord);
51
-
52
33
  var isNonNullable = value => value !== null && value !== undefined;
34
+
53
35
  /**
54
36
  * @internal
55
37
  */
56
-
57
-
58
38
  function resolveTypeForArrayItem(item, candidates) {
59
39
  // if there is only one type available, assume that it's the correct one
60
40
  if (candidates.length === 1) return candidates[0];
61
-
62
41
  var itemType = (0, _types.isTypedObject)(item) && item._type;
63
-
64
42
  var primitive = item === undefined || item === null || !itemType && (0, _typeString.default)(item).toLowerCase();
65
-
66
43
  if (primitive && primitive !== 'object') {
67
44
  return candidates.find(candidate => candidate.jsonType === primitive);
68
45
  }
69
-
70
46
  return candidates.find(candidate => {
71
47
  var _candidate$type;
72
-
73
48
  return ((_candidate$type = candidate.type) === null || _candidate$type === void 0 ? void 0 : _candidate$type.name) === itemType;
74
49
  }) || candidates.find(candidate => candidate.name === itemType) || candidates.find(candidate => candidate.name === 'object' && primitive === 'object');
75
50
  }
76
-
77
- function validateDocument(_x, _x2, _x3) {
78
- return _validateDocument.apply(this, arguments);
51
+ var EMPTY_MARKERS = [];
52
+ function validateDocument(doc, schema, context) {
53
+ return validateDocumentObservable(doc, schema, context).toPromise();
54
+ }
55
+ function validateDocumentObservable(doc, schema, context) {
56
+ var documentType = schema.get(doc._type);
57
+ if (!documentType) {
58
+ console.warn('Schema type for object type "%s" not found, skipping validation', doc._type);
59
+ return (0, _rxjs.of)(EMPTY_MARKERS);
60
+ }
61
+ return validateItemObservable({
62
+ parent: undefined,
63
+ value: doc,
64
+ path: [],
65
+ document: doc,
66
+ type: documentType,
67
+ getDocumentExists: context === null || context === void 0 ? void 0 : context.getDocumentExists
68
+ }).pipe((0, _operators.catchError)(err => {
69
+ console.error(err);
70
+ return (0, _rxjs.of)([{
71
+ type: 'validation',
72
+ level: 'error',
73
+ path: [],
74
+ item: new _ValidationError.default(err === null || err === void 0 ? void 0 : err.message)
75
+ }]);
76
+ }));
79
77
  }
78
+
80
79
  /**
81
80
  * this is used make optional properties required by replacing optionals with
82
81
  * `T[P] | undefined`. this is used to prevent errors in `validateItem` where
@@ -85,147 +84,120 @@ function validateDocument(_x, _x2, _x3) {
85
84
  * https://medium.com/terria/typescript-transforming-optional-properties-to-required-properties-that-may-be-undefined-7482cb4e1585
86
85
  */
87
86
 
88
-
89
- function _validateDocument() {
90
- _validateDocument = _asyncToGenerator(function* (doc, schema, context) {
91
- var documentType = schema.get(doc._type);
92
-
93
- if (!documentType) {
94
- console.warn('Schema type for object type "%s" not found, skipping validation', doc._type);
95
- return [];
96
- }
97
-
98
- try {
99
- return yield validateItem({
100
- parent: undefined,
101
- value: doc,
102
- path: [],
103
- document: doc,
104
- type: documentType,
105
- getDocumentExists: context === null || context === void 0 ? void 0 : context.getDocumentExists
106
- });
107
- } catch (err) {
108
- console.error(err);
109
- return [{
110
- type: 'validation',
111
- level: 'error',
112
- path: [],
113
- item: new _ValidationError.default(err === null || err === void 0 ? void 0 : err.message)
114
- }];
115
- }
116
- });
117
- return _validateDocument.apply(this, arguments);
118
- }
119
-
120
- function validateItem(_x4) {
121
- return _validateItem.apply(this, arguments);
87
+ function validateItem(opts) {
88
+ return validateItemObservable(opts).toPromise();
122
89
  }
90
+ function validateItemObservable(_ref) {
91
+ var value = _ref.value,
92
+ type = _ref.type,
93
+ _ref$path = _ref.path,
94
+ path = _ref$path === void 0 ? [] : _ref$path,
95
+ parent = _ref.parent,
96
+ restOfContext = _objectWithoutProperties(_ref, _excluded);
97
+ var rules = (0, _normalizeValidationRules.default)(type);
98
+ // run validation for the current value
99
+ var selfChecks = rules.map(rule => (0, _rxjs.defer)(() => rule.validate(value, _objectSpread(_objectSpread({}, restOfContext), {}, {
100
+ parent,
101
+ path,
102
+ type
103
+ }))));
104
+
105
+ // run validation for nested values (conditionally)
106
+ var fieldChecks = [];
107
+ var selfIsRequired = rules.some(rule => rule.isRequired());
108
+ var shouldRunNestedObjectValidation =
109
+ // run nested validation for objects
110
+ (type === null || type === void 0 ? void 0 : type.jsonType) === 'object' && (
111
+ // if the value is truthy
112
+ !!value ||
113
+ // or
114
+ // (the value is null or undefined) and the top-level value is required
115
+ (value === null || value === undefined) && selfIsRequired);
116
+ if (shouldRunNestedObjectValidation) {
117
+ var fieldTypes = type.fields.reduce((acc, field) => {
118
+ acc[field.name] = field.type;
119
+ return acc;
120
+ }, {});
121
+
122
+ // Validation for rules set at the object level with `Rule.fields({/* ... */})`
123
+ fieldChecks = fieldChecks.concat(rules.map(rule => rule._fieldRules).filter(isNonNullable).flatMap(fieldResults => Object.entries(fieldResults)).flatMap(_ref2 => {
124
+ var _ref3 = _slicedToArray(_ref2, 2),
125
+ name = _ref3[0],
126
+ validation = _ref3[1];
127
+ var fieldType = fieldTypes[name];
128
+ return (0, _normalizeValidationRules.default)(_objectSpread(_objectSpread({}, fieldType), {}, {
129
+ validation
130
+ })).map(subRule => {
131
+ var nestedValue = isRecord(value) ? value[name] : undefined;
132
+ return (0, _rxjs.defer)(() => subRule.validate(nestedValue, _objectSpread(_objectSpread({}, restOfContext), {}, {
133
+ parent: value,
134
+ path: path.concat(name),
135
+ type: fieldType
136
+ })));
137
+ });
138
+ }));
139
+
140
+ // Validation from each field's schema `validation: Rule => {/* ... */}` function
141
+ fieldChecks = fieldChecks.concat(type.fields.map(field => validateItemObservable(_objectSpread(_objectSpread({}, restOfContext), {}, {
142
+ parent: value,
143
+ value: isRecord(value) ? value[field.name] : undefined,
144
+ path: path.concat(field.name),
145
+ type: field.type
146
+ }))));
147
+ }
123
148
 
124
- function _validateItem() {
125
- _validateItem = _asyncToGenerator(function* (_ref) {
126
- var value = _ref.value,
127
- type = _ref.type,
128
- _ref$path = _ref.path,
129
- path = _ref$path === void 0 ? [] : _ref$path,
130
- parent = _ref.parent,
131
- restOfContext = _objectWithoutProperties(_ref, _excluded);
132
-
133
- var rules = (0, _normalizeValidationRules.default)(type); // run validation for the current value
134
-
135
- var selfChecks = rules.map(rule => rule.validate(value, _objectSpread(_objectSpread({}, restOfContext), {}, {
136
- parent,
137
- path,
138
- type
139
- }))); // run validation for nested values (conditionally)
140
-
141
- var nestedChecks = [];
142
- var selfIsRequired = rules.some(rule => rule.isRequired());
143
- var shouldRunNestedObjectValidation = // run nested validation for objects
144
- (type === null || type === void 0 ? void 0 : type.jsonType) === 'object' && ( // if the value is truthy
145
- !!value || // or
146
- // (the value is null or undefined) and the top-level value is required
147
- (value === null || value === undefined) && selfIsRequired);
148
-
149
- if (shouldRunNestedObjectValidation) {
150
- var fieldTypes = type.fields.reduce((acc, field) => {
151
- acc[field.name] = field.type;
152
- return acc;
153
- }, {}); // Validation for rules set at the object level with `Rule.fields({/* ... */})`
154
-
155
- nestedChecks = nestedChecks.concat(rules.map(rule => rule._fieldRules).filter(isNonNullable).flatMap(fieldResults => Object.entries(fieldResults)).flatMap(_ref2 => {
156
- var _ref3 = _slicedToArray(_ref2, 2),
157
- name = _ref3[0],
158
- validation = _ref3[1];
159
-
160
- var fieldType = fieldTypes[name];
161
- return (0, _normalizeValidationRules.default)(_objectSpread(_objectSpread({}, fieldType), {}, {
162
- validation
163
- })).map(subRule => {
164
- var nestedValue = isRecord(value) ? value[name] : undefined;
165
- return subRule.validate(nestedValue, _objectSpread(_objectSpread({}, restOfContext), {}, {
166
- parent: value,
167
- path: path.concat(name),
168
- type: fieldType
169
- }));
170
- });
171
- })); // Validation from each field's schema `validation: Rule => {/* ... */}` function
172
-
173
- nestedChecks = nestedChecks.concat(type.fields.map(field => validateItem(_objectSpread(_objectSpread({}, restOfContext), {}, {
174
- parent: value,
175
- value: isRecord(value) ? value[field.name] : undefined,
176
- path: path.concat(field.name),
177
- type: field.type
178
- }))));
179
- } // note: unlike objects, arrays should not run nested validation for undefined
180
- // values because we won't have a valid path to put a marker (i.e. missing the
181
- // key or index in the path) and the downstream form builder won't have a
182
- // valid target component
183
-
184
-
185
- var shouldRunNestedValidationForArrays = (type === null || type === void 0 ? void 0 : type.jsonType) === 'array' && Array.isArray(value);
186
-
187
- if (shouldRunNestedValidationForArrays) {
188
- nestedChecks = nestedChecks.concat(value.map(item => validateItem(_objectSpread(_objectSpread({}, restOfContext), {}, {
189
- parent: value,
190
- value: item,
191
- path: path.concat((0, _types.isKeyedObject)(item) ? {
192
- _key: item._key
193
- } : value.indexOf(item)),
194
- type: resolveTypeForArrayItem(item, type.of)
195
- }))));
196
- } // markDefs also do no run nested validation if the parent object is undefined
197
- // for a similar reason to arrays
198
-
199
-
200
- var shouldRunNestedValidationForMarkDefs = (0, _types.isBlock)(value) && value.markDefs.length && (0, _types.isBlockSchemaType)(type);
201
-
202
- if (shouldRunNestedValidationForMarkDefs) {
203
- var _type$fields = _slicedToArray(type.fields, 1),
204
- spanChildrenField = _type$fields[0];
205
-
206
- var spanType = spanChildrenField.type.of.find(_types.isSpanSchemaType);
207
- var annotations = ((spanType === null || spanType === void 0 ? void 0 : spanType.annotations) || []).reduce((map, annotationType) => {
208
- map.set(annotationType.name, annotationType);
209
- return map;
210
- }, new Map());
211
- nestedChecks = nestedChecks.concat(value.markDefs.map(markDef => validateItem(_objectSpread(_objectSpread({}, restOfContext), {}, {
212
- parent: value,
213
- value: markDef,
214
- path: path.concat(['markDefs', {
215
- _key: markDef._key
216
- }]),
217
- type: annotations.get(markDef._type)
218
- }))));
219
- }
149
+ // note: unlike objects, arrays should not run nested validation for undefined
150
+ // values because we won't have a valid path to put a marker (i.e. missing the
151
+ // key or index in the path) and the downstream form builder won't have a
152
+ // valid target component
153
+ var shouldRunNestedValidationForArrays = (type === null || type === void 0 ? void 0 : type.jsonType) === 'array' && Array.isArray(value);
154
+ if (shouldRunNestedValidationForArrays) {
155
+ fieldChecks = fieldChecks.concat(value.map(item => validateItemObservable(_objectSpread(_objectSpread({}, restOfContext), {}, {
156
+ parent: value,
157
+ value: item,
158
+ path: path.concat((0, _types.isKeyedObject)(item) ? {
159
+ _key: item._key
160
+ } : value.indexOf(item)),
161
+ type: resolveTypeForArrayItem(item, type.of)
162
+ }))));
163
+ }
220
164
 
221
- var results = (yield Promise.all([...selfChecks, ...nestedChecks])).flat(); // run `uniqBy` if `_fieldRules` are present because they can
165
+ // markDefs also do no run nested validation if the parent object is undefined
166
+ // for a similar reason to arrays
167
+ var shouldRunNestedValidationForMarkDefs = (0, _types.isBlock)(value) && value.markDefs.length && (0, _types.isBlockSchemaType)(type);
168
+ if (shouldRunNestedValidationForMarkDefs) {
169
+ var _type$fields = _slicedToArray(type.fields, 1),
170
+ spanChildrenField = _type$fields[0];
171
+ var spanType = spanChildrenField.type.of.find(_types.isSpanSchemaType);
172
+ var annotations = ((spanType === null || spanType === void 0 ? void 0 : spanType.annotations) || []).reduce((acc, annotationType) => {
173
+ acc.set(annotationType.name, annotationType);
174
+ return acc;
175
+ }, new Map());
176
+ fieldChecks = fieldChecks.concat(value.markDefs.map(markDef => validateItemObservable(_objectSpread(_objectSpread({}, restOfContext), {}, {
177
+ parent: value,
178
+ value: markDef,
179
+ path: path.concat(['markDefs', {
180
+ _key: markDef._key
181
+ }]),
182
+ type: annotations.get(markDef._type)
183
+ }))));
184
+ }
185
+ return (0, _rxjs.defer)(() => (0, _rxjs.merge)([...selfChecks, ...fieldChecks])).pipe((0, _operators.mergeMap)(validateNode => (0, _rxjs.concat)(idle(), validateNode), 40), (0, _operators.mergeAll)(), (0, _operators.toArray)(), (0, _operators.map)(_flatten2.default), (0, _operators.map)(results => {
186
+ // run `uniqBy` if `_fieldRules` are present because they can
222
187
  // cause repeat markers
223
-
224
188
  if (rules.some(rule => rule._fieldRules)) {
225
189
  return (0, _uniqBy2.default)(results, rule => JSON.stringify(rule));
226
190
  }
227
-
228
191
  return results;
192
+ }));
193
+ }
194
+ function idle(timeout) {
195
+ return new _rxjs.Observable(observer => {
196
+ var handle = (0, _requestIdleCallback.requestIdleCallback)(() => {
197
+ observer.complete();
198
+ }, timeout ? {
199
+ timeout
200
+ } : undefined);
201
+ return () => (0, _requestIdleCallback.cancelIdleCallback)(handle);
229
202
  });
230
- return _validateItem.apply(this, arguments);
231
203
  }
@@ -4,108 +4,82 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _deepEquals = _interopRequireDefault(require("../util/deepEquals"));
9
-
10
8
  var _ValidationError = _interopRequireDefault(require("../ValidationError"));
11
-
12
9
  var _genericValidator = _interopRequireDefault(require("./genericValidator"));
13
-
14
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
11
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
17
-
18
12
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
-
20
13
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
21
-
22
14
  var arrayValidators = _objectSpread(_objectSpread({}, _genericValidator.default), {}, {
23
15
  min: (minLength, value, message) => {
24
16
  if (!value || value.length >= minLength) {
25
17
  return true;
26
18
  }
27
-
28
19
  return message || "Must have at least ".concat(minLength, " items");
29
20
  },
30
21
  max: (maxLength, value, message) => {
31
22
  if (!value || value.length <= maxLength) {
32
23
  return true;
33
24
  }
34
-
35
25
  return message || "Must have at most ".concat(maxLength, " items");
36
26
  },
37
27
  length: (wantedLength, value, message) => {
38
28
  if (!value || value.length === wantedLength) {
39
29
  return true;
40
30
  }
41
-
42
31
  return message || "Must have exactly ".concat(wantedLength, " items");
43
32
  },
44
33
  presence: (flag, value, message) => {
45
34
  if (flag === 'required' && !value) {
46
35
  return message || 'Required';
47
36
  }
48
-
49
37
  return true;
50
38
  },
51
39
  valid: (allowedValues, values, message) => {
52
40
  var valueType = typeof values;
53
-
54
41
  if (valueType === 'undefined') {
55
42
  return true;
56
43
  }
57
-
58
44
  var paths = [];
59
-
60
45
  var _loop = function _loop(i) {
61
46
  var value = values[i];
62
-
63
47
  if (allowedValues.some(expected => (0, _deepEquals.default)(expected, value))) {
64
48
  return "continue";
65
49
  }
66
-
67
50
  var pathSegment = value && value._key ? {
68
51
  _key: value._key
69
52
  } : i;
70
53
  paths.push([pathSegment]);
71
54
  };
72
-
73
55
  for (var i = 0; i < values.length; i++) {
74
56
  var _ret = _loop(i);
75
-
76
57
  if (_ret === "continue") continue;
77
58
  }
78
-
79
59
  return paths.length === 0 ? true : new _ValidationError.default(message || 'Value did not match any allowed values', {
80
60
  paths
81
61
  });
82
62
  },
83
63
  unique: (_unused, value, message) => {
84
64
  var dupeIndices = [];
85
-
86
65
  if (!value) {
87
66
  return true;
88
67
  }
89
-
90
68
  for (var x = 0; x < value.length; x++) {
91
69
  for (var y = x + 1; y < value.length; y++) {
92
70
  var itemA = value[x];
93
71
  var itemB = value[y];
94
-
95
72
  if (!(0, _deepEquals.default)(itemA, itemB)) {
96
73
  continue;
97
74
  }
98
-
99
75
  if (dupeIndices.indexOf(x) === -1) {
100
76
  dupeIndices.push(x);
101
77
  }
102
-
103
78
  if (dupeIndices.indexOf(y) === -1) {
104
79
  dupeIndices.push(y);
105
80
  }
106
81
  }
107
82
  }
108
-
109
83
  var paths = dupeIndices.map(idx => {
110
84
  var item = value[idx];
111
85
  var pathSegment = item && item._key ? {
@@ -118,6 +92,5 @@ var arrayValidators = _objectSpread(_objectSpread({}, _genericValidator.default)
118
92
  }) : true;
119
93
  }
120
94
  });
121
-
122
95
  var _default = arrayValidators;
123
96
  exports.default = _default;
@@ -4,26 +4,18 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _genericValidator = _interopRequireDefault(require("./genericValidator"));
9
-
10
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
-
12
9
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
-
14
10
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
-
16
11
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
-
18
12
  var booleanValidators = _objectSpread(_objectSpread({}, _genericValidator.default), {}, {
19
13
  presence: (flag, value, message) => {
20
14
  if (flag === 'required' && typeof value !== 'boolean') {
21
15
  return message || 'Required';
22
16
  }
23
-
24
17
  return true;
25
18
  }
26
19
  });
27
-
28
20
  var _default = booleanValidators;
29
21
  exports.default = _default;
@@ -5,25 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  exports.isRecord = isRecord;
8
-
9
8
  var _format = _interopRequireDefault(require("date-fns/format"));
10
-
11
9
  var _genericValidator = _interopRequireDefault(require("./genericValidator"));
12
-
13
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
-
15
11
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
16
-
17
12
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
18
-
19
13
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
20
-
21
14
  function isRecord(obj) {
22
15
  return typeof obj === 'object' && obj !== null && !Array.isArray(obj);
23
- } // eslint-disable-next-line no-useless-escape
16
+ }
24
17
 
18
+ // eslint-disable-next-line no-useless-escape
19
+ var isoDate = /^(?:[-+]\d{2})?(?:\d{4}(?!\d{2}\b))(?:(-?)(?:(?:0[1-9]|1[0-2])(?:\1(?:[12]\d|0[1-9]|3[01]))?|W(?:[0-4]\d|5[0-2])(?:-?[1-7])?|(?:00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[1-6])))(?![T]$|[T][\d]+Z$)(?:[T\s](?:(?:(?:[01]\d|2[0-3])(?:(:?)[0-5]\d)?|24\:?00)(?:[.,]\d+(?!:))?)(?:\2[0-5]\d(?:[.,]\d+)?)?(?:[Z]|(?:[+-])(?:[01]\d|2[0-3])(?::?[0-5]\d)?)?)?)?$/;
25
20
 
26
- var isoDate = /^(?:[-+]\d{2})?(?:\d{4}(?!\d{2}\b))(?:(-?)(?:(?:0[1-9]|1[0-2])(?:\1(?:[12]\d|0[1-9]|3[01]))?|W(?:[0-4]\d|5[0-2])(?:-?[1-7])?|(?:00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[1-6])))(?![T]$|[T][\d]+Z$)(?:[T\s](?:(?:(?:[01]\d|2[0-3])(?:(:?)[0-5]\d)?|24\:?00)(?:[.,]\d+(?!:))?)(?:\2[0-5]\d(?:[.,]\d+)?)?(?:[Z]|(?:[+-])(?:[01]\d|2[0-3])(?::?[0-5]\d)?)?)?)?$/; // eslint-disable-next-line no-warning-comments
21
+ // eslint-disable-next-line no-warning-comments
27
22
  // TODO (eventually): move these to schema type package
28
23
 
29
24
  var getFormattedDate = function getFormattedDate() {
@@ -31,54 +26,45 @@ var getFormattedDate = function getFormattedDate() {
31
26
  var value = arguments.length > 1 ? arguments[1] : undefined;
32
27
  var options = arguments.length > 2 ? arguments[2] : undefined;
33
28
  var format = 'yyyy-MM-dd';
34
-
35
29
  if (options && options.dateFormat) {
36
30
  format = options.dateFormat;
37
31
  }
38
-
39
32
  if (type === 'date') {
40
33
  // If the type is date only
41
34
  return (0, _format.default)(new Date(value), format);
42
- } // If the type is datetime
43
-
35
+ }
44
36
 
37
+ // If the type is datetime
45
38
  if (options && options.timeFormat) {
46
39
  format += " ".concat(options.timeFormat);
47
40
  } else {
48
41
  format += ' HH:mm';
49
42
  }
50
-
51
43
  return (0, _format.default)(new Date(value), format);
52
44
  };
53
-
54
45
  function parseDate(date) {
55
46
  var throwOnError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
56
47
  if (!date) return null;
57
- if (date === 'now') return new Date(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ if (date === 'now') return new Date();
58
49
 
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
51
  var parsed = new Date(date);
60
52
  var isInvalid = isNaN(parsed.getTime());
61
-
62
53
  if (isInvalid && throwOnError) {
63
54
  throw new Error("Unable to parse \"".concat(date, "\" to a date"));
64
55
  }
65
-
66
56
  return isInvalid ? null : parsed;
67
57
  }
68
-
69
58
  var dateValidators = _objectSpread(_objectSpread({}, _genericValidator.default), {}, {
70
59
  type: (_unused, value, message) => {
71
60
  var strVal = "".concat(value);
72
-
73
61
  if (!strVal || isoDate.test(value)) {
74
62
  return true;
75
63
  }
76
-
77
64
  return message || 'Must be a valid ISO-8601 formatted date string';
78
65
  },
79
66
  min: (minDate, value, message, context) => {
80
67
  var dateVal = parseDate(value);
81
-
82
68
  if (!dateVal) {
83
69
  return true; // `type()` should catch parse errors
84
70
  }
@@ -86,18 +72,15 @@ var dateValidators = _objectSpread(_objectSpread({}, _genericValidator.default),
86
72
  if (!value || dateVal >= parseDate(minDate, true)) {
87
73
  return true;
88
74
  }
89
-
90
75
  if (!context.type) {
91
76
  throw new Error("`type` was not provided in validation context.");
92
77
  }
93
-
94
78
  var dateTimeOptions = isRecord(context.type.options) ? context.type.options : {};
95
79
  var date = getFormattedDate(context.type.name, minDate, dateTimeOptions);
96
80
  return message || "Must be at or after ".concat(date);
97
81
  },
98
82
  max: (maxDate, value, message, context) => {
99
83
  var dateVal = parseDate(value);
100
-
101
84
  if (!dateVal) {
102
85
  return true; // `type()` should catch parse errors
103
86
  }
@@ -105,16 +88,13 @@ var dateValidators = _objectSpread(_objectSpread({}, _genericValidator.default),
105
88
  if (!value || dateVal <= parseDate(maxDate, true)) {
106
89
  return true;
107
90
  }
108
-
109
91
  if (!context.type) {
110
92
  throw new Error("`type` was not provided in validation context.");
111
93
  }
112
-
113
94
  var dateTimeOptions = isRecord(context.type.options) ? context.type.options : {};
114
95
  var date = getFormattedDate(context.type.name, maxDate, dateTimeOptions);
115
96
  return message || "Must be at or before ".concat(date);
116
97
  }
117
98
  });
118
-
119
99
  var _default = dateValidators;
120
100
  exports.default = _default;