244 lines
6.3 KiB
JavaScript
244 lines
6.3 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.create = create;
|
|
exports.default = void 0;
|
|
|
|
var _isAbsent = _interopRequireDefault(require("./util/isAbsent"));
|
|
|
|
var _isSchema = _interopRequireDefault(require("./util/isSchema"));
|
|
|
|
var _printValue = _interopRequireDefault(require("./util/printValue"));
|
|
|
|
var _locale = require("./locale");
|
|
|
|
var _runTests = _interopRequireDefault(require("./util/runTests"));
|
|
|
|
var _ValidationError = _interopRequireDefault(require("./ValidationError"));
|
|
|
|
var _schema = _interopRequireDefault(require("./schema"));
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
|
|
function create(type) {
|
|
return new ArraySchema(type);
|
|
}
|
|
|
|
class ArraySchema extends _schema.default {
|
|
constructor(type) {
|
|
super({
|
|
type: 'array'
|
|
}); // `undefined` specifically means uninitialized, as opposed to
|
|
// "no subtype"
|
|
|
|
this.innerType = type;
|
|
this.withMutation(() => {
|
|
this.transform(function (values) {
|
|
if (typeof values === 'string') try {
|
|
values = JSON.parse(values);
|
|
} catch (err) {
|
|
values = null;
|
|
}
|
|
return this.isType(values) ? values : null;
|
|
});
|
|
});
|
|
}
|
|
|
|
_typeCheck(v) {
|
|
return Array.isArray(v);
|
|
}
|
|
|
|
get _subType() {
|
|
return this.innerType;
|
|
}
|
|
|
|
_cast(_value, _opts) {
|
|
const value = super._cast(_value, _opts); //should ignore nulls here
|
|
|
|
|
|
if (!this._typeCheck(value) || !this.innerType) return value;
|
|
let isChanged = false;
|
|
const castArray = value.map((v, idx) => {
|
|
const castElement = this.innerType.cast(v, _extends({}, _opts, {
|
|
path: `${_opts.path || ''}[${idx}]`
|
|
}));
|
|
|
|
if (castElement !== v) {
|
|
isChanged = true;
|
|
}
|
|
|
|
return castElement;
|
|
});
|
|
return isChanged ? castArray : value;
|
|
}
|
|
|
|
_validate(_value, options = {}, callback) {
|
|
var _options$abortEarly, _options$recursive;
|
|
|
|
let errors = [];
|
|
let sync = options.sync;
|
|
let path = options.path;
|
|
let innerType = this.innerType;
|
|
let endEarly = (_options$abortEarly = options.abortEarly) != null ? _options$abortEarly : this.spec.abortEarly;
|
|
let recursive = (_options$recursive = options.recursive) != null ? _options$recursive : this.spec.recursive;
|
|
let originalValue = options.originalValue != null ? options.originalValue : _value;
|
|
|
|
super._validate(_value, options, (err, value) => {
|
|
if (err) {
|
|
if (!_ValidationError.default.isError(err) || endEarly) {
|
|
return void callback(err, value);
|
|
}
|
|
|
|
errors.push(err);
|
|
}
|
|
|
|
if (!recursive || !innerType || !this._typeCheck(value)) {
|
|
callback(errors[0] || null, value);
|
|
return;
|
|
}
|
|
|
|
originalValue = originalValue || value; // #950 Ensure that sparse array empty slots are validated
|
|
|
|
let tests = new Array(value.length);
|
|
|
|
for (let idx = 0; idx < value.length; idx++) {
|
|
let item = value[idx];
|
|
let path = `${options.path || ''}[${idx}]`; // object._validate note for isStrict explanation
|
|
|
|
let innerOptions = _extends({}, options, {
|
|
path,
|
|
strict: true,
|
|
parent: value,
|
|
index: idx,
|
|
originalValue: originalValue[idx]
|
|
});
|
|
|
|
tests[idx] = (_, cb) => innerType.validate(item, innerOptions, cb);
|
|
}
|
|
|
|
(0, _runTests.default)({
|
|
sync,
|
|
path,
|
|
value,
|
|
errors,
|
|
endEarly,
|
|
tests
|
|
}, callback);
|
|
});
|
|
}
|
|
|
|
clone(spec) {
|
|
const next = super.clone(spec);
|
|
next.innerType = this.innerType;
|
|
return next;
|
|
}
|
|
|
|
concat(schema) {
|
|
let next = super.concat(schema);
|
|
next.innerType = this.innerType;
|
|
if (schema.innerType) next.innerType = next.innerType ? // @ts-expect-error Lazy doesn't have concat()
|
|
next.innerType.concat(schema.innerType) : schema.innerType;
|
|
return next;
|
|
}
|
|
|
|
of(schema) {
|
|
// FIXME: this should return a new instance of array without the default to be
|
|
let next = this.clone();
|
|
if (!(0, _isSchema.default)(schema)) throw new TypeError('`array.of()` sub-schema must be a valid yup schema not: ' + (0, _printValue.default)(schema)); // FIXME(ts):
|
|
|
|
next.innerType = schema;
|
|
return next;
|
|
}
|
|
|
|
length(length, message = _locale.array.length) {
|
|
return this.test({
|
|
message,
|
|
name: 'length',
|
|
exclusive: true,
|
|
params: {
|
|
length
|
|
},
|
|
|
|
test(value) {
|
|
return (0, _isAbsent.default)(value) || value.length === this.resolve(length);
|
|
}
|
|
|
|
});
|
|
}
|
|
|
|
min(min, message) {
|
|
message = message || _locale.array.min;
|
|
return this.test({
|
|
message,
|
|
name: 'min',
|
|
exclusive: true,
|
|
params: {
|
|
min
|
|
},
|
|
|
|
// FIXME(ts): Array<typeof T>
|
|
test(value) {
|
|
return (0, _isAbsent.default)(value) || value.length >= this.resolve(min);
|
|
}
|
|
|
|
});
|
|
}
|
|
|
|
max(max, message) {
|
|
message = message || _locale.array.max;
|
|
return this.test({
|
|
message,
|
|
name: 'max',
|
|
exclusive: true,
|
|
params: {
|
|
max
|
|
},
|
|
|
|
test(value) {
|
|
return (0, _isAbsent.default)(value) || value.length <= this.resolve(max);
|
|
}
|
|
|
|
});
|
|
}
|
|
|
|
ensure() {
|
|
return this.default(() => []).transform((val, original) => {
|
|
// We don't want to return `null` for nullable schema
|
|
if (this._typeCheck(val)) return val;
|
|
return original == null ? [] : [].concat(original);
|
|
});
|
|
}
|
|
|
|
compact(rejector) {
|
|
let reject = !rejector ? v => !!v : (v, i, a) => !rejector(v, i, a);
|
|
return this.transform(values => values != null ? values.filter(reject) : values);
|
|
}
|
|
|
|
describe() {
|
|
let base = super.describe();
|
|
if (this.innerType) base.innerType = this.innerType.describe();
|
|
return base;
|
|
}
|
|
|
|
nullable(isNullable = true) {
|
|
return super.nullable(isNullable);
|
|
}
|
|
|
|
defined() {
|
|
return super.defined();
|
|
}
|
|
|
|
required(msg) {
|
|
return super.required(msg);
|
|
}
|
|
|
|
}
|
|
|
|
exports.default = ArraySchema;
|
|
create.prototype = ArraySchema.prototype; //
|
|
// Interfaces
|
|
//
|