return function () {
var args = Array.prototype.slice.call(arguments);
return func.apply(thisArg, args);
};
}
function withLengthChecks(validators) {
return merge(validators, {
minLength: makeCheck(function (actual, expected) {
return getLength(actual) >= expected;
}),
maxLength: makeCheck(function (actual, expected) {
return getLength(actual) <= expected;
}),
length: makeCheck(function (actual, expected) {
return getLength(actual) === expected;
})
});
}
function rootSchema() {
return {
allowed: [],
valid: [],
invalid: [],
checks: [],
checksAfter: [],
alias: {},
keys: {},
includes: [],
excludes: [],
alternatives: [],
sanitizeBefore: [],
sanitize: [],
pattern: null,
_isSchema: true
};
}
var rootSchemaBuilder = {
_isSchemaBuilder: true,
compile: rootSchema,
notEmpty: makeCheck(not(isEmpty)),
allow: makeArrayProperty('allowed'),
valid: makeArrayProperty('valid'),
invalid: makeArrayProperty('invalid'),
alias: makeProperty('alias'),
check: makeArrayProperty('checksAfter'),
satisfy: makeArrayProperty('checks'),
sanitize: makeArrayProperty('sanitize'),
sanitizeBefore: makeArrayProperty('sanitizeBefore'),
required: makeSchemaBuilder({ presence: REQUIRED }),
optional: makeSchemaBuilder({ presence: OPTIONAL }),
forbidden: makeSchemaBuilder({ presence: FORBIDDEN }),
default: makeProperty('defaultValue')
};
var any = makeSchemaBuilder({});
var bool = makeSchemaBuilder({
type: 'boolean'
});
var func = makeSchemaBuilder({
type: 'function'
});
var number = makeSchemaBuilder({
type: 'number'
}, {
min: makeCheck(function (actual, expected) {
return actual >= expected;
}),
max: makeCheck(function (actual, expected) {
return actual <= expected;
}),
greater: makeCheck(function (actual, expected) {
return actual > expected;
}),
lesser: makeCheck(function (actual, expected) {
return actual < expected;
}),
integer: makeCheck(isInteger)
});
var string = makeSchemaBuilder({
type: 'string'
}, withLengthChecks({
match: makeCheck(function (actual, expected) {
return new RegExp(expected).test(actual);
}),
insensitive: makeSchemaBuilder({ insensitive: true }),
lowercase: makeCheck(function (actual) {
actual = String(actual);
return actual.toLowerCase() === actual;
}),
uppercase: makeCheck(function (actual) {
actual = String(actual);
return actual.toUpperCase() === actual;
}),
alphanum: makeMatchCheck(/^[0-9a-zA-Z]*$/),
url: makeMatchCheck(
/^https?:\/\/(\w+:?\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/),
element: makeCheck(function (actual) {
return !!window.document.getElementById(actual);
}),
digits: makeCheck(/^[0-9]*$/),
numeric: makeCheck(isNumeric)
}));
var array = makeSchemaBuilder({
type: 'array'
}, withLengthChecks({
unique: makeCheck(function (actual) {
var hash = {};
for (var i = 0; i < actual.length; i += 1) {
var value = actual[i];
if (isNumber(value) || isString(value)) {
if (hash[value]) {
return false;
}
hash[value] = true;
}
}
return true;
}),
includes: makeArrayProperty('includes'),
excludes: makeArrayProperty('excludes'),
}));
var object = makeSchemaBuilder({
type: 'object'
}, withLengthChecks({
keys: makeProperty("keys"),
type: makeCheck(is),
pattern: makeProperty("pattern")
}));
var alternatives = makeArrayProperty('alternatives');