This repository has been archived on 2020-11-15. You can view files and clone it, but cannot push or open issues or pull requests.
schemajs/dist/schema-browser.js

531 lines
15 KiB
JavaScript

// This file was generated by modules-webmake (modules for web) project
// see: https://github.com/medikoo/modules-webmake
window.schema = (function (modules) {
var getModule, getRequire, require;
getModule = (function (wrap) {
return function (scope, tree, path, fullpath) {
var name, dir, exports = {}, module = { exports: exports }, fn, isDir;
path = path.split('/');
name = path.pop();
if (!name) {
isDir = true;
name = path.pop();
}
if ((name === '.') || (name === '..')) {
path.push(name);
name = '';
}
while ((dir = path.shift())) {
if (dir === '..') {
scope = tree.pop();
} else if (dir !== '.') {
tree.push(scope);
scope = scope[dir];
}
}
if (name) {
if (!isDir && scope[name + '.js']) {
name += '.js';
}
if (typeof scope[name] === 'object') {
tree.push(scope);
scope = scope[name];
name = 'index.js';
}
} else {
name = 'index.js';
}
fn = scope[name];
if (!fn) {
throw new Error("Could not find module '" + fullpath + "'");
}
scope[name] = wrap(module);
fn.call(exports, exports, module, getRequire(scope, tree));
return module.exports;
};
}(function (cmodule) {
return function (ignore, module) {
module.exports = cmodule.exports;
};
}));
require = function (scope, tree, fullpath) {
var name, path = fullpath, t = fullpath.charAt(0);
if (t === '/') {
path = path.slice(1);
scope = modules['/'];
tree = [];
} else if (t !== '.') {
name = path.split('/', 1)[0];
scope = modules[name];
tree = [];
path = path.slice(name.length + 1) || scope[':mainpath:'];
}
return getModule(scope, tree, path, fullpath);
};
getRequire = function (scope, tree) {
return function (path) {
return require(scope, [].concat(tree), path);
};
};
return getRequire(modules, []);
})
({
"schemajs": {
"lib": {
"rules.js": function (exports, module, require) {
var Rules = function(param, rules)
{
this.param = param;
this.rules = rules;
};
Rules.prototype.Error = function(message, rule, value)
{
switch(typeof(this.rules.error))
{
case 'string':
message = this.rules.error;
break;
case 'object':
if(this.rules.error[rule])
{
message = this.rules.error[rule];
}
else if(this.rules.error['default'])
{
message = this.rules.error['default'];
}
break;
}
if(_.isString(value))
message = message.replace(/%v/, value.toString());
if(_.isString(rule))
message = message.replace(/%r/, rule);
return message.replace(/%p/, this.param).replace(/%v/, "value").replace(/%r/, "rule");
};
Rules.prototype.apply = function(value)
{
if(_.isEmpty(value) && !_.isUndefined(this.rules['default']))
{
value = this.rules['default'];
}
if(this.rules.required)
{
if(this.rules.required && _.isUndefined(value))
{
throw this.Error("%p is a required parameter", "required", value);
}
}
// if null is allowed, then no more rules need to be run
if(this.rules.allownull && _.isNull(value)) return value;
// if value is not required and is undefined, no more rules need to be run
if(_.isUndefined(value)) return value;
if(this.rules.filters)
{
value = this.filter(value);
}
if(this.rules.type)
{
if(typeof(this.rules.type) == "string" && typeof(is[this.rules.type]) == "function")
{
if(!is[this.rules.type](value))
throw this.Error("%p is not a " + this.rules.type, "type", value);
}
else if(typeof(this.rules.type == "function"))
{
if(!this.rules.type(value))
throw this.Error("%p is not a valid type", "type", value);
}
else
{
throw this.Error("%p is not a valid type", "type", value);
}
}
if(this.rules.properties)
{
this.check(value);
}
return value;
};
Rules.prototype.filter = function(value)
{
switch(typeof(this.rules.filters))
{
case 'function':
value = this.rules.filters(value);
break;
case 'string':
if(typeof(filters[this.rules.filters]) === 'function')
{
value = filters[this.rules.filters](value);
}
break;
case 'object':
if(_.isArray(this.rules.filters))
{
this.rules.filters.forEach(function(filter) { value = filters[filter](value); });
}
break;
}
return value;
};
Rules.prototype.check = function(value)
{
switch(typeof(this.rules.properties))
{
case 'function':
if(!this.rules.properties(value))
throw this.Error("%p is not valid");
break;
case 'object':
var properties = _.keys(this.rules.properties);
for(var i = 0; i < properties.length; i++)
{
var property = properties[i];
if(typeof(checks[property]) === "function")
{
var args = this.rules.properties[property];
if(!checks[property].apply(null, [value, args]))
throw this.Error("%p failed %r with %v", property);
}
else if(typeof(this.rules.properties[property]) === "function")
{
if(!this.rules.properties[property].apply(null, [value]))
throw this.Error("%p failed on %r with %v", property);
}
}
break;
}
};
var checks =
{
'max': function(value, length)
{
if(_.isArray(value) || typeof(value) == "string")
{
return value.length <= length;
}
else if(typeof(value) == "number")
{
return value <= length;
}
else
{
return false;
}
},
'min': function(value, length)
{
if(_.isArray(value) || typeof(value) == "string")
{
return value.length >= length;
}
else if(typeof(value) == "number")
{
return value >= length;
}
else
{
return false;
}
},
'regex': function(value, regex)
{
return regex.test(value);
},
'in': function(value, list)
{
return list.indexOf(value) != -1;
}
};
var is =
{
'string+': function(value)
{
return typeof(value) == 'string' && value.length && !(/^\s+$/.test(value));
},
'string': function(value)
{
return typeof(value) == 'string';
},
'alphanum': function(value)
{
return (/^[a-zA-Z0-9]+$/i).test(value) && typeof(value) == 'string';
},
'alpha': function(value)
{
return (/^[a-zA-Z]+$/i).test(value);
},
'object': function(value)
{
return typeof(value) == 'object' && !_.isArray(value);
},
'array': function(value)
{
return _.isArray(value);
},
'date': function(value)
{
// getTime() allows us to check if date is valid
return _.isDate(value) && !isNaN(value.getTime());
},
'number': function(value)
{
return typeof(value) == 'number' && !isNaN(value);
},
'int': function(value)
{
return typeof(value) == 'number' && value % 1 === 0 && !isNaN(value);
},
'boolean': function(value)
{
return _.isBoolean(value);
},
'float': function(value)
{
return typeof(value) == 'number' && !isNaN(value);
},
'email': function(value)
{
return (/[a-zA-Z0-9!#$%&'*+\/=?\^_`{|}~\-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?\^_`{|}~\-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?/).test(value);
},
'url': function(value)
{
return (/^(http(s)?:\/\/)?([\w\-]+\.{1})*(([\w\-]*){1}(\.{1}[A-Za-z]{2,4}){1}){1}(\:{1}\d*)?([\?\/|\#]+[\@\~\;\+\'\#\,\.\%\-\/\&\?\=\w\$\s]*)*$/i).test(value);
},
'zipcode': function(value)
{
return (/\d{5}/).test(value);
}
};
var filters =
{
'toInt': function(value)
{
var num = parseInt(value, 10);
return _.isNaN(num) ? null : num;
},
'toFloat': function(value)
{
var num = parseFloat(value, 10);
return _.isNaN(num) ? null : num;
},
'toString': function(value)
{
return value.toString();
},
'toDate': function(value)
{
return new Date(value);
},
'toBoolean': function(value)
{
if(value === 1 || value === true || /true|on|yes|1/.test(value))
return true;
else if(value === 0 || value === false || /false|off|no|0/.test(value))
return false;
else
return value;
},
'trim': function(value)
{
return _.isString(value) ? value.replace(/^\s\s*/, '').replace(/\s\s*$/, '') : value;
},
'lowercase': function(value)
{
return _.isString(value) ? value.toLowerCase() : value;
},
'uppercase': function(value)
{
return _.isString(value) ? value.toUpperCase() : value;
}
};
exports.create = function(param, rules) { return new Rules(param, rules); };
exports.types = is;
exports.filters = filters;
exports.properties = checks;
},
"schema.js": function (exports, module, require) {
var rules = require('./rules.js');
var Schema = function(schema) {
this.schema = schema;
};
var checkObject = function(schema, key, errors, values, get) {
var value;
_.keys(schema.schema).forEach(function(param) {
try {
// if undefined, don't store it
value = rules.create(key + "." + param, schema.schema[param]).apply(get(key)[param]);
if (!_.isUndefined(value)) {
values[key][param] = value;
}
} catch (error) {
if (!errors[key] || typeof(errors[key]) != 'object') errors[key] = {};
errors[key][param] = error;
}
});
};
var checkArray = function(schema, key, errors, values, get) {
values[key].forEach(function(value, index) {
try {
if(schema.schema.schema) {
// if array has another schema, then we want objects!
value = rules.create(key, {type:'object'}).apply(value);
var results = (new Schema(schema.schema.schema)).validate(value);
if(!results.valid)
{
errors[key] = errors[key] || [];
errors[key][index] = results.errors;
}
values[key][index] = results.data;
}
else
values[key][index] = rules.create(key + "[" + index + "]", schema.schema).apply(value);
} catch (error) {
if (!_.isArray(errors[key])) errors[key] = [];
errors[key][index] = error;
}
});
};
/*jshint loopfunc:true*/
Schema.prototype.validate = function(data) {
var params = _.keys(this.schema);
var errors = {};
var values = {};
var value;
var get = typeof(data) == "function" ? data : function(p) {
return data[p];
};
for (var i = 0; i < params.length; i++) {
var schema = this.schema[params[i]];
try {
// if undefined, don't store it.
value = rules.create(params[i], schema).apply(get(params[i]));
if (!_.isUndefined(value)) {
values[params[i]] = value;
}
// does this rule contain embedded schemas
if (typeof(schema.schema) == "object" && !_.isArray(schema.schema) && _.keys(schema.schema).length && !_.isUndefined(values[params[i]])) {
if (schema.type == "object") {
//checkObject(schema, params[i], errors, values, get);
var results = (new Schema(schema.schema)).validate(values[params[i]]);
if(!results.valid)
errors[params[i]] = results.errors;
values[params[i]] = results.data;
} else if (schema.type == "array") {
checkArray(schema, params[i], errors, values, get);
}
}
} catch (error) {
errors[params[i]] = error;
}
}
return {
data: values,
errors: errors,
valid: _.keys(errors).length === 0
};
};
exports.types = rules.types;
exports.test = function(value, schema) {
return (new Schema({
input: schema
})).validate({
input: value
});
};
exports.properties = rules.properties;
exports.filters = rules.filters;
exports.create = function(schema) {
return new Schema(schema);
};
exports.middleware = function(schema) {
return function(req, res, next) {
req.form = new Schema(schema).validate(req.route.method == "post" ? req.body : req.query);
next();
};
};
}
},
"schema.js": function (exports, module, require) {
module.exports = require("./lib/schema.js");
}
}
})("schemajs/schema");