vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
184 lines (180 loc) • 5.68 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { array as locale } from "./locale.js";
import MixedSchema from "./mixed.js";
import inherits from "./util/inherits.js";
import isAbsent from "./util/isAbsent.js";
import isSchema from "./util/isSchema.js";
import printValue from "./util/printValue.js";
import runTests from "./util/runTests.js";
export default ArraySchema;
function ArraySchema(type) {
var _this = this;
if (!(this instanceof ArraySchema)) return typeof type === 'function' ? type(new ArraySchema()) : new ArraySchema(type);
MixedSchema.call(this, {
type: 'array'
});
// `undefined` specifically means uninitialized, as opposed to
// "no subtype"
this._subType = undefined;
this.innerType = undefined;
this.withMutation(function () {
_this.transform(function (values) {
if (typeof values === 'string') try {
values = JSON.parse(values);
} catch (err) {
values = null;
}
return this.isType(values) ? values : null;
});
if (type) _this.of(type);
});
}
inherits(ArraySchema, MixedSchema, {
_typeCheck: function _typeCheck(v) {
return Array.isArray(v);
},
_cast: function _cast(_value, _opts) {
var _this2 = this;
var value = MixedSchema.prototype._cast.call(this, _value, _opts);
//should ignore nulls here
if (!this._typeCheck(value) || !this.innerType) return value;
var isChanged = false;
var castArray = value.map(function (v, idx) {
var castElement = _this2.innerType.cast(v, _extends({}, _opts, {
path: (_opts.path || '') + "[" + idx + "]"
}));
if (castElement !== v) {
isChanged = true;
}
return castElement;
});
return isChanged ? castArray : value;
},
_validate: function _validate(_value, options, callback) {
var _this3 = this;
if (options === void 0) {
options = {};
}
var errors = [];
var sync = options.sync;
var path = options.path;
var innerType = this.innerType;
var endEarly = this._option('abortEarly', options);
var recursive = this._option('recursive', options);
var originalValue = options.originalValue != null ? options.originalValue : _value;
MixedSchema.prototype._validate.call(this, _value, options, function (err, value) {
if (err) {
if (endEarly) return void callback(err);
errors.push(err);
value = err.value;
}
if (!recursive || !innerType || !_this3._typeCheck(value)) {
callback(errors[0] || null, value);
return;
}
originalValue = originalValue || value;
// #950 Ensure that sparse array empty slots are validated
var tests = new Array(value.length);
var _loop = function _loop() {
var item = value[idx];
var path = (options.path || '') + "[" + idx + "]";
// object._validate note for isStrict explanation
var innerOptions = _extends({}, options, {
path: path,
strict: true,
parent: value,
index: idx,
originalValue: originalValue[idx]
});
tests[idx] = function (_, cb) {
return innerType.validate ? innerType.validate(item, innerOptions, cb) : cb(null);
};
};
for (var idx = 0; idx < value.length; idx++) {
_loop();
}
runTests({
sync: sync,
path: path,
value: value,
errors: errors,
endEarly: endEarly,
tests: tests
}, callback);
});
},
of: function of(schema) {
var next = this.clone();
if (schema !== false && !isSchema(schema)) throw new TypeError('`array.of()` sub-schema must be a valid yup schema, or `false` to negate a current sub-schema. ' + 'not: ' + printValue(schema));
next._subType = schema;
next.innerType = schema;
return next;
},
min: function min(_min, message) {
message = message || locale.min;
return this.test({
message: message,
name: 'min',
exclusive: true,
params: {
min: _min
},
test: function test(value) {
return isAbsent(value) || value.length >= this.resolve(_min);
}
});
},
max: function max(_max, message) {
message = message || locale.max;
return this.test({
message: message,
name: 'max',
exclusive: true,
params: {
max: _max
},
test: function test(value) {
return isAbsent(value) || value.length <= this.resolve(_max);
}
});
},
length: function length(_length, message) {
message = message || locale.length;
return this.test({
message: message,
name: 'length',
exclusive: true,
params: {
length: _length
},
test: function test(value) {
return isAbsent(value) || value.length === this.resolve(_length);
}
});
},
ensure: function ensure() {
var _this4 = this;
return this.default(function () {
return [];
}).transform(function (val, original) {
// We don't want to return `null` for nullable schema
if (_this4._typeCheck(val)) return val;
return original == null ? [] : [].concat(original);
});
},
compact: function compact(rejector) {
var reject = !rejector ? function (v) {
return !!v;
} : function (v, i, a) {
return !rejector(v, i, a);
};
return this.transform(function (values) {
return values != null ? values.filter(reject) : values;
});
},
describe: function describe() {
var base = MixedSchema.prototype.describe.call(this);
if (this.innerType) base.innerType = this.innerType.describe();
return base;
}
});