actn-db 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +12 -0
- data/actn-db.gemspec +30 -0
- data/db/1_db.sql +54 -0
- data/db/__functions.sql +472 -0
- data/db/__setup.sql +37 -0
- data/db/lib/_0_actn.js +23 -0
- data/db/lib/_1_underscore.js +1 -0
- data/db/lib/_2_jjv.js +739 -0
- data/db/lib/_3_inflections.js +634 -0
- data/db/lib/_4_builder.coffee +136 -0
- data/db/lib/_4_builder.js +218 -0
- data/db/schemas/model.json +76 -0
- data/lib/actn/core_ext/hash.rb +10 -0
- data/lib/actn/core_ext/kernel.rb +8 -0
- data/lib/actn/core_ext/string.rb +14 -0
- data/lib/actn/db.rb +24 -0
- data/lib/actn/db/mod.rb +175 -0
- data/lib/actn/db/model.rb +25 -0
- data/lib/actn/db/pg.rb +88 -0
- data/lib/actn/db/set.rb +67 -0
- data/lib/actn/db/tasks/db.rake +96 -0
- data/lib/actn/db/version.rb +5 -0
- data/lib/actn/paths.rb +38 -0
- data/test/actn/test_mod.rb +54 -0
- data/test/actn/test_model.rb +49 -0
- data/test/actn/test_pg_funcs.rb +71 -0
- data/test/actn/test_set.rb +57 -0
- data/test/minitest_helper.rb +18 -0
- metadata +208 -0
data/db/__setup.sql
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
-- Extensions
|
2
|
+
|
3
|
+
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
4
|
+
CREATE EXTENSION IF NOT EXISTS "plv8";
|
5
|
+
CREATE EXTENSION IF NOT EXISTS "plcoffee";
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
-- Js Libs
|
12
|
+
|
13
|
+
CREATE TABLE plv8_modules(modname text primary key, load_on_start boolean, code text);
|
14
|
+
|
15
|
+
CREATE OR REPLACE FUNCTION plv8_startup() RETURNS void AS $$
|
16
|
+
|
17
|
+
load_module = (modname) ->
|
18
|
+
rows = plv8.execute("SELECT code from public.plv8_modules " + " where modname = $1", [modname])
|
19
|
+
r = 0
|
20
|
+
|
21
|
+
while r < rows.length
|
22
|
+
code = rows[r].code
|
23
|
+
eval("(function(){" + code + "})")()
|
24
|
+
r++
|
25
|
+
return
|
26
|
+
|
27
|
+
|
28
|
+
# now load all the modules marked for loading on start
|
29
|
+
rows = plv8.execute("SELECT modname, code from public.plv8_modules where load_on_start")
|
30
|
+
r = 0
|
31
|
+
|
32
|
+
while r < rows.length
|
33
|
+
code = rows[r].code
|
34
|
+
eval("(function(){" + code + "})")()
|
35
|
+
r++
|
36
|
+
|
37
|
+
$$ LANGUAGE plcoffee STABLE STRICT;
|
data/db/lib/_0_actn.js
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
global = (function() {
|
2
|
+
return this;
|
3
|
+
}).call(null);
|
4
|
+
|
5
|
+
var Actn = (function() {
|
6
|
+
function Actn() {}
|
7
|
+
|
8
|
+
Actn.prototype.valueAt = function(data, key) {
|
9
|
+
var i, keys;
|
10
|
+
keys = key.split(".");
|
11
|
+
for (i in keys) {
|
12
|
+
if (data != null) {
|
13
|
+
data = data[keys[i]];
|
14
|
+
}
|
15
|
+
}
|
16
|
+
return data;
|
17
|
+
};
|
18
|
+
|
19
|
+
return Actn;
|
20
|
+
|
21
|
+
})();
|
22
|
+
|
23
|
+
global.actn = new Actn();
|
@@ -0,0 +1 @@
|
|
1
|
+
(function(){var root=this;var previousUnderscore=root._;var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var push=ArrayProto.push,slice=ArrayProto.slice,concat=ArrayProto.concat,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){if(obj instanceof _)return obj;if(!(this instanceof _))return new _(obj);this._wrapped=obj};if(typeof exports!=='undefined'){if(typeof module!=='undefined'&&module.exports){exports=module.exports=_}exports._=_}else{root._=_}_.VERSION='1.7.0';var createCallback=function(func,context,argCount){if(context===void 0)return func;switch(argCount==null?3:argCount){case 1:return function(value){return func.call(context,value)};case 2:return function(value,other){return func.call(context,value,other)};case 3:return function(value,index,collection){return func.call(context,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(context,accumulator,value,index,collection)}}return function(){return func.apply(context,arguments)}};_.iteratee=function(value,context,argCount){if(value==null)return _.identity;if(_.isFunction(value))return createCallback(value,context,argCount);if(_.isObject(value))return _.matches(value);return _.property(value)};_.each=_.forEach=function(obj,iteratee,context){if(obj==null)return obj;iteratee=createCallback(iteratee,context);var i,length=obj.length;if(length===+length){for(i=0;i<length;i++){iteratee(obj[i],i,obj)}}else{var keys=_.keys(obj);for(i=0,length=keys.length;i<length;i++){iteratee(obj[keys[i]],keys[i],obj)}}return obj};_.map=_.collect=function(obj,iteratee,context){if(obj==null)return[];iteratee=_.iteratee(iteratee,context);var keys=obj.length!==+obj.length&&_.keys(obj),length=(keys||obj).length,results=Array(length),currentKey;for(var index=0;index<length;index++){currentKey=keys?keys[index]:index;results[index]=iteratee(obj[currentKey],currentKey,obj)}return results};var reduceError='Reduce of empty array with no initial value';_.reduce=_.foldl=_.inject=function(obj,iteratee,memo,context){if(obj==null)obj=[];iteratee=createCallback(iteratee,context,4);var keys=obj.length!==+obj.length&&_.keys(obj),length=(keys||obj).length,index=0,currentKey;if(arguments.length<3){if(!length)throw new TypeError(reduceError);memo=obj[keys?keys[index++]:index++]}for(;index<length;index++){currentKey=keys?keys[index]:index;memo=iteratee(memo,obj[currentKey],currentKey,obj)}return memo};_.reduceRight=_.foldr=function(obj,iteratee,memo,context){if(obj==null)obj=[];iteratee=createCallback(iteratee,context,4);var keys=obj.length!==+obj.length&&_.keys(obj),index=(keys||obj).length,currentKey;if(arguments.length<3){if(!index)throw new TypeError(reduceError);memo=obj[keys?keys[--index]:--index]}while(index--){currentKey=keys?keys[index]:index;memo=iteratee(memo,obj[currentKey],currentKey,obj)}return memo};_.find=_.detect=function(obj,predicate,context){var result;predicate=_.iteratee(predicate,context);_.some(obj,function(value,index,list){if(predicate(value,index,list)){result=value;return true}});return result};_.filter=_.select=function(obj,predicate,context){var results=[];if(obj==null)return results;predicate=_.iteratee(predicate,context);_.each(obj,function(value,index,list){if(predicate(value,index,list))results.push(value)});return results};_.reject=function(obj,predicate,context){return _.filter(obj,_.negate(_.iteratee(predicate)),context)};_.every=_.all=function(obj,predicate,context){if(obj==null)return true;predicate=_.iteratee(predicate,context);var keys=obj.length!==+obj.length&&_.keys(obj),length=(keys||obj).length,index,currentKey;for(index=0;index<length;index++){currentKey=keys?keys[index]:index;if(!predicate(obj[currentKey],currentKey,obj))return false}return true};_.some=_.any=function(obj,predicate,context){if(obj==null)return false;predicate=_.iteratee(predicate,context);var keys=obj.length!==+obj.length&&_.keys(obj),length=(keys||obj).length,index,currentKey;for(index=0;index<length;index++){currentKey=keys?keys[index]:index;if(predicate(obj[currentKey],currentKey,obj))return true}return false};_.contains=_.include=function(obj,target){if(obj==null)return false;if(obj.length!==+obj.length)obj=_.values(obj);return _.indexOf(obj,target)>=0};_.invoke=function(obj,method){var args=slice.call(arguments,2);var isFunc=_.isFunction(method);return _.map(obj,function(value){return(isFunc?method:value[method]).apply(value,args)})};_.pluck=function(obj,key){return _.map(obj,_.property(key))};_.where=function(obj,attrs){return _.filter(obj,_.matches(attrs))};_.findWhere=function(obj,attrs){return _.find(obj,_.matches(attrs))};_.max=function(obj,iteratee,context){var result=-Infinity,lastComputed=-Infinity,value,computed;if(iteratee==null&&obj!=null){obj=obj.length===+obj.length?obj:_.values(obj);for(var i=0,length=obj.length;i<length;i++){value=obj[i];if(value>result){result=value}}}else{iteratee=_.iteratee(iteratee,context);_.each(obj,function(value,index,list){computed=iteratee(value,index,list);if(computed>lastComputed||computed===-Infinity&&result===-Infinity){result=value;lastComputed=computed}})}return result};_.min=function(obj,iteratee,context){var result=Infinity,lastComputed=Infinity,value,computed;if(iteratee==null&&obj!=null){obj=obj.length===+obj.length?obj:_.values(obj);for(var i=0,length=obj.length;i<length;i++){value=obj[i];if(value<result){result=value}}}else{iteratee=_.iteratee(iteratee,context);_.each(obj,function(value,index,list){computed=iteratee(value,index,list);if(computed<lastComputed||computed===Infinity&&result===Infinity){result=value;lastComputed=computed}})}return result};_.shuffle=function(obj){var set=obj&&obj.length===+obj.length?obj:_.values(obj);var length=set.length;var shuffled=Array(length);for(var index=0,rand;index<length;index++){rand=_.random(0,index);if(rand!==index)shuffled[index]=shuffled[rand];shuffled[rand]=set[index]}return shuffled};_.sample=function(obj,n,guard){if(n==null||guard){if(obj.length!==+obj.length)obj=_.values(obj);return obj[_.random(obj.length-1)]}return _.shuffle(obj).slice(0,Math.max(0,n))};_.sortBy=function(obj,iteratee,context){iteratee=_.iteratee(iteratee,context);return _.pluck(_.map(obj,function(value,index,list){return{value:value,index:index,criteria:iteratee(value,index,list)}}).sort(function(left,right){var a=left.criteria;var b=right.criteria;if(a!==b){if(a>b||a===void 0)return 1;if(a<b||b===void 0)return-1}return left.index-right.index}),'value')};var group=function(behavior){return function(obj,iteratee,context){var result={};iteratee=_.iteratee(iteratee,context);_.each(obj,function(value,index){var key=iteratee(value,index,obj);behavior(result,value,key)});return result}};_.groupBy=group(function(result,value,key){if(_.has(result,key))result[key].push(value);else result[key]=[value]});_.indexBy=group(function(result,value,key){result[key]=value});_.countBy=group(function(result,value,key){if(_.has(result,key))result[key]++;else result[key]=1});_.sortedIndex=function(array,obj,iteratee,context){iteratee=_.iteratee(iteratee,context,1);var value=iteratee(obj);var low=0,high=array.length;while(low<high){var mid=low+high>>>1;if(iteratee(array[mid])<value)low=mid+1;else high=mid}return low};_.toArray=function(obj){if(!obj)return[];if(_.isArray(obj))return slice.call(obj);if(obj.length===+obj.length)return _.map(obj,_.identity);return _.values(obj)};_.size=function(obj){if(obj==null)return 0;return obj.length===+obj.length?obj.length:_.keys(obj).length};_.partition=function(obj,predicate,context){predicate=_.iteratee(predicate,context);var pass=[],fail=[];_.each(obj,function(value,key,obj){(predicate(value,key,obj)?pass:fail).push(value)});return[pass,fail]};_.first=_.head=_.take=function(array,n,guard){if(array==null)return void 0;if(n==null||guard)return array[0];return _.initial(array,array.length-n)};_.initial=function(array,n,guard){return slice.call(array,0,Math.max(0,array.length-(n==null||guard?1:n)))};_.last=function(array,n,guard){if(array==null)return void 0;if(n==null||guard)return array[array.length-1];return _.rest(array,Math.max(0,array.length-n))};_.rest=_.tail=_.drop=function(array,n,guard){return slice.call(array,n==null||guard?1:n)};_.compact=function(array){return _.filter(array,_.identity)};var flatten=function(input,shallow,strict,output){if(shallow&&_.every(input,_.isArray)){return concat.apply(output,input)}for(var i=0,length=input.length;i<length;i++){var value=input[i];if(!_.isArray(value)&&!_.isArguments(value)){if(!strict)output.push(value)}else if(shallow){push.apply(output,value)}else{flatten(value,shallow,strict,output)}}return output};_.flatten=function(array,shallow){return flatten(array,shallow,false,[])};_.without=function(array){return _.difference(array,slice.call(arguments,1))};_.uniq=_.unique=function(array,isSorted,iteratee,context){if(array==null)return[];if(!_.isBoolean(isSorted)){context=iteratee;iteratee=isSorted;isSorted=false}if(iteratee!=null)iteratee=_.iteratee(iteratee,context);var result=[];var seen=[];for(var i=0,length=array.length;i<length;i++){var value=array[i];if(isSorted){if(!i||seen!==value)result.push(value);seen=value}else if(iteratee){var computed=iteratee(value,i,array);if(_.indexOf(seen,computed)<0){seen.push(computed);result.push(value)}}else if(_.indexOf(result,value)<0){result.push(value)}}return result};_.union=function(){return _.uniq(flatten(arguments,true,true,[]))};_.intersection=function(array){if(array==null)return[];var result=[];var argsLength=arguments.length;for(var i=0,length=array.length;i<length;i++){var item=array[i];if(_.contains(result,item))continue;for(var j=1;j<argsLength;j++){if(!_.contains(arguments[j],item))break}if(j===argsLength)result.push(item)}return result};_.difference=function(array){var rest=flatten(slice.call(arguments,1),true,true,[]);return _.filter(array,function(value){return!_.contains(rest,value)})};_.zip=function(array){if(array==null)return[];var length=_.max(arguments,'length').length;var results=Array(length);while(length-->0){results[length]=_.pluck(arguments,length)}return results};_.unzip=function(array){return _.zip.apply(null,array)};_.object=function(list,values){if(list==null)return{};var result={};for(var i=0,length=list.length;i<length;i++){if(values){result[list[i]]=values[i]}else{result[list[i][0]]=list[i][1]}}return result};_.indexOf=function(array,item,isSorted){if(array==null)return-1;var i=0,length=array.length;if(isSorted){if(typeof isSorted=='number'){i=isSorted<0?Math.max(0,length+isSorted):isSorted}else{i=_.sortedIndex(array,item);return array[i]===item?i:-1}}for(;i<length;i++)if(array[i]===item)return i;return-1};_.lastIndexOf=function(array,item,from){if(array==null)return-1;var idx=array.length;if(typeof from=='number'){idx=from<0?idx+from+1:Math.min(idx,from+1)}while(--idx>=0)if(array[idx]===item)return idx;return-1};_.range=function(start,stop,step){if(arguments.length<=1){stop=start||0;start=0}step=step||1;var length=Math.max(Math.ceil((stop-start)/step),0);var range=Array(length);for(var idx=0;idx<length;idx++,start+=step){range[idx]=start}return range};var Ctor=function(){};_.bind=function(func,context){var args,bound;if(nativeBind&&func.bind===nativeBind)return nativeBind.apply(func,slice.call(arguments,1));if(!_.isFunction(func))throw new TypeError('Bind must be called on a function');args=slice.call(arguments,2);bound=function(){if(!(this instanceof bound))return func.apply(context,args.concat(slice.call(arguments)));Ctor.prototype=func.prototype;var self=new Ctor;Ctor.prototype=null;var result=func.apply(self,args.concat(slice.call(arguments)));if(_.isObject(result))return result;return self};return bound};_.partial=function(func){var boundArgs=slice.call(arguments,1);return function(){var position=0;var args=boundArgs.slice();for(var i=0,length=args.length;i<length;i++){if(args[i]===_)args[i]=arguments[position++]}while(position<arguments.length)args.push(arguments[position++]);return func.apply(this,args)}};_.bindAll=function(obj){var i,length=arguments.length,key;if(length<=1)throw new Error('bindAll must be passed function names');for(i=1;i<length;i++){key=arguments[i];obj[key]=_.bind(obj[key],obj)}return obj};_.memoize=function(func,hasher){var memoize=function(key){var cache=memoize.cache;var address=''+(hasher?hasher.apply(this,arguments):key);if(!_.has(cache,address))cache[address]=func.apply(this,arguments);return cache[address]};memoize.cache={};return memoize};_.delay=function(func,wait){var args=slice.call(arguments,2);return setTimeout(function(){return func.apply(null,args)},wait)};_.defer=function(func){return _.delay.apply(_,[func,1].concat(slice.call(arguments,1)))};_.throttle=function(func,wait,options){var context,args,result;var timeout=null;var previous=0;if(!options)options={};var later=function(){previous=options.leading===false?0:_.now();timeout=null;result=func.apply(context,args);if(!timeout)context=args=null};return function(){var now=_.now();if(!previous&&options.leading===false)previous=now;var remaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0||remaining>wait){if(timeout){clearTimeout(timeout);timeout=null}previous=now;result=func.apply(context,args);if(!timeout)context=args=null}else if(!timeout&&options.trailing!==false){timeout=setTimeout(later,remaining)}return result}};_.debounce=function(func,wait,immediate){var timeout,args,context,timestamp,result;var later=function(){var last=_.now()-timestamp;if(last<wait&&last>=0){timeout=setTimeout(later,wait-last)}else{timeout=null;if(!immediate){result=func.apply(context,args);if(!timeout)context=args=null}}};return function(){context=this;args=arguments;timestamp=_.now();var callNow=immediate&&!timeout;if(!timeout)timeout=setTimeout(later,wait);if(callNow){result=func.apply(context,args);context=args=null}return result}};_.wrap=function(func,wrapper){return _.partial(wrapper,func)};_.negate=function(predicate){return function(){return!predicate.apply(this,arguments)}};_.compose=function(){var args=arguments;var start=args.length-1;return function(){var i=start;var result=args[start].apply(this,arguments);while(i--)result=args[i].call(this,result);return result}};_.after=function(times,func){return function(){if(--times<1){return func.apply(this,arguments)}}};_.before=function(times,func){var memo;return function(){if(--times>0){memo=func.apply(this,arguments)}else{func=null}return memo}};_.once=_.partial(_.before,2);var hasEnumBug=!({toString:null}).propertyIsEnumerable('toString');var nonEnumerableProps=['constructor','valueOf','isPrototypeOf','toString','propertyIsEnumerable','hasOwnProperty','toLocaleString'];_.keys=function(obj){if(!_.isObject(obj))return[];if(nativeKeys)return nativeKeys(obj);var keys=[];for(var key in obj)if(_.has(obj,key))keys.push(key);if(hasEnumBug){var nonEnumIdx=nonEnumerableProps.length;while(nonEnumIdx--){var prop=nonEnumerableProps[nonEnumIdx];if(_.has(obj,prop)&&!_.contains(keys,prop))keys.push(prop)}}return keys};_.values=function(obj){var keys=_.keys(obj);var length=keys.length;var values=Array(length);for(var i=0;i<length;i++){values[i]=obj[keys[i]]}return values};_.pairs=function(obj){var keys=_.keys(obj);var length=keys.length;var pairs=Array(length);for(var i=0;i<length;i++){pairs[i]=[keys[i],obj[keys[i]]]}return pairs};_.invert=function(obj){var result={};var keys=_.keys(obj);for(var i=0,length=keys.length;i<length;i++){result[obj[keys[i]]]=keys[i]}return result};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key)}return names.sort()};_.extend=function(obj){if(!_.isObject(obj))return obj;var source,prop;for(var i=1,length=arguments.length;i<length;i++){source=arguments[i];for(prop in source){obj[prop]=source[prop]}}return obj};_.pick=function(obj,iteratee,context){var result={},key;if(obj==null)return result;if(_.isFunction(iteratee)){iteratee=createCallback(iteratee,context);for(key in obj){var value=obj[key];if(iteratee(value,key,obj))result[key]=value}}else{var keys=concat.apply([],slice.call(arguments,1));obj=new Object(obj);for(var i=0,length=keys.length;i<length;i++){key=keys[i];if(key in obj)result[key]=obj[key]}}return result};_.omit=function(obj,iteratee,context){if(_.isFunction(iteratee)){iteratee=_.negate(iteratee)}else{var keys=_.map(concat.apply([],slice.call(arguments,1)),String);iteratee=function(value,key){return!_.contains(keys,key)}}return _.pick(obj,iteratee,context)};_.defaults=function(obj){if(!_.isObject(obj))return obj;for(var i=1,length=arguments.length;i<length;i++){var source=arguments[i];for(var prop in source){if(obj[prop]===void 0)obj[prop]=source[prop]}}return obj};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj)};_.tap=function(obj,interceptor){interceptor(obj);return obj};var eq=function(a,b,aStack,bStack){if(a===b)return a!==0||1/a===1/b;if(a==null||b==null)return a===b;if(a instanceof _)a=a._wrapped;if(b instanceof _)b=b._wrapped;var className=toString.call(a);if(className!==toString.call(b))return false;switch(className){case'[object RegExp]':case'[object String]':return''+a===''+b;case'[object Number]':if(+a!==+a)return+b!==+b;return+a===0?1/+a===1/b:+a===+b;case'[object Date]':case'[object Boolean]':return+a===+b}var areArrays=className==='[object Array]';if(!areArrays){if(typeof a!='object'||typeof b!='object')return false;var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(_.isFunction(aCtor)&&aCtor instanceof aCtor&&_.isFunction(bCtor)&&bCtor instanceof bCtor)&&('constructor'in a&&'constructor'in b)){return false}}var length=aStack.length;while(length--){if(aStack[length]===a)return bStack[length]===b}aStack.push(a);bStack.push(b);var size,result;if(areArrays){size=a.length;result=size===b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack)))break}}}else{var keys=_.keys(a),key;size=keys.length;result=_.keys(b).length===size;if(result){while(size--){key=keys[size];if(!(result=_.has(b,key)&&eq(a[key],b[key],aStack,bStack)))break}}}aStack.pop();bStack.pop();return result};_.isEqual=function(a,b){return eq(a,b,[],[])};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj)||_.isArguments(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true};_.isElement=function(obj){return!!(obj&&obj.nodeType===1)};_.isArray=nativeIsArray||function(obj){return toString.call(obj)==='[object Array]'};_.isObject=function(obj){var type=typeof obj;return type==='function'||type==='object'&&!!obj};_.each(['Arguments','Function','String','Number','Date','RegExp','Error'],function(name){_['is'+name]=function(obj){return toString.call(obj)==='[object '+name+']'}});if(!_.isArguments(arguments)){_.isArguments=function(obj){return _.has(obj,'callee')}}if(typeof/./!=='function'){_.isFunction=function(obj){return typeof obj=='function'||false}}_.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj))};_.isNaN=function(obj){return _.isNumber(obj)&&obj!==+obj};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)==='[object Boolean]'};_.isNull=function(obj){return obj===null};_.isUndefined=function(obj){return obj===void 0};_.has=function(obj,key){return obj!=null&&hasOwnProperty.call(obj,key)};_.noConflict=function(){root._=previousUnderscore;return this};_.identity=function(value){return value};_.constant=function(value){return function(){return value}};_.noop=function(){};_.property=function(key){return function(obj){return obj==null?void 0:obj[key]}};_.matches=function(attrs){var pairs=_.pairs(attrs),length=pairs.length;return function(obj){if(obj==null)return!length;obj=new Object(obj);for(var i=0;i<length;i++){var pair=pairs[i],key=pair[0];if(pair[1]!==obj[key]||!(key in obj))return false}return true}};_.times=function(n,iteratee,context){var accum=Array(Math.max(0,n));iteratee=createCallback(iteratee,context,1);for(var i=0;i<n;i++)accum[i]=iteratee(i);return accum};_.random=function(min,max){if(max==null){max=min;min=0}return min+Math.floor(Math.random()*(max-min+1))};_.now=Date.now||function(){return new Date().getTime()};var escapeMap={'&':'&','<':'<','>':'>','"':'"',"'":''','`':'`'};var unescapeMap=_.invert(escapeMap);var createEscaper=function(map){var escaper=function(match){return map[match]};var source='(?:'+_.keys(map).join('|')+')';var testRegexp=RegExp(source);var replaceRegexp=RegExp(source,'g');return function(string){string=string==null?'':''+string;return testRegexp.test(string)?string.replace(replaceRegexp,escaper):string}};_.escape=createEscaper(escapeMap);_.unescape=createEscaper(unescapeMap);_.result=function(object,property,fallback){var value=object==null?void 0:object[property];if(value===void 0){return fallback}return _.isFunction(value)?object[property]():value};var idCounter=0;_.uniqueId=function(prefix){var id=++idCounter+'';return prefix?prefix+id:id};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/(.)^/;var escapes={"'":"'",'\\':'\\','\r':'r','\n':'n','\u2028':'u2028','\u2029':'u2029'};var escaper=/\\|'|\r|\n|\u2028|\u2029/g;var escapeChar=function(match){return'\\'+escapes[match]};_.template=function(text,settings,oldSettings){if(!settings&&oldSettings)settings=oldSettings;settings=_.defaults({},settings,_.templateSettings);var matcher=RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join('|')+'|$','g');var index=0;var source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,escapeChar);index=offset+match.length;if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'"}else if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'"}else if(evaluate){source+="';\n"+evaluate+"\n__p+='"}return match});source+="';\n";if(!settings.variable)source='with(obj||{}){\n'+source+'}\n';source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+'return __p;\n';try{var render=new Function(settings.variable||'obj','_',source)}catch(e){e.source=source;throw e}var template=function(data){return render.call(this,data,_)};var argument=settings.variable||'obj';template.source='function('+argument+'){\n'+source+'}';return template};_.chain=function(obj){var instance=_(obj);instance._chain=true;return instance};var result=function(instance,obj){return instance._chain?_(obj).chain():obj};_.mixin=function(obj){_.each(_.functions(obj),function(name){var func=_[name]=obj[name];_.prototype[name]=function(){var args=[this._wrapped];push.apply(args,arguments);return result(this,func.apply(_,args))}})};_.mixin(_);_.each(['pop','push','reverse','shift','sort','splice','unshift'],function(name){var method=ArrayProto[name];_.prototype[name]=function(){var obj=this._wrapped;method.apply(obj,arguments);if((name==='shift'||name==='splice')&&obj.length===0)delete obj[0];return result(this,obj)}});_.each(['concat','join','slice'],function(name){var method=ArrayProto[name];_.prototype[name]=function(){return result(this,method.apply(this._wrapped,arguments))}});_.prototype.value=function(){return this._wrapped};if(typeof define==='function'&&define.amd){define('underscore',[],function(){return _})}}.call(this));
|
data/db/lib/_2_jjv.js
ADDED
@@ -0,0 +1,739 @@
|
|
1
|
+
/* jshint proto: true */
|
2
|
+
|
3
|
+
/**
|
4
|
+
* jjv.js -- A javascript library to validate json input through a json-schema.
|
5
|
+
*
|
6
|
+
* Copyright (c) 2013 Alex Cornejo.
|
7
|
+
*
|
8
|
+
* Redistributable under a MIT-style open source license.
|
9
|
+
*/
|
10
|
+
|
11
|
+
(function () {
|
12
|
+
var clone = function (obj) {
|
13
|
+
// Handle the 3 simple types (string, number, function), and null or undefined
|
14
|
+
if (obj === null || typeof obj !== 'object') return obj;
|
15
|
+
var copy;
|
16
|
+
|
17
|
+
// Handle Date
|
18
|
+
if (obj instanceof Date) {
|
19
|
+
copy = new Date();
|
20
|
+
copy.setTime(obj.getTime());
|
21
|
+
return copy;
|
22
|
+
}
|
23
|
+
|
24
|
+
// handle RegExp
|
25
|
+
if (obj instanceof RegExp) {
|
26
|
+
copy = new RegExp(obj);
|
27
|
+
return copy;
|
28
|
+
}
|
29
|
+
|
30
|
+
// Handle Array
|
31
|
+
if (obj instanceof Array) {
|
32
|
+
copy = [];
|
33
|
+
for (var i = 0, len = obj.length; i < len; i++)
|
34
|
+
copy[i] = clone(obj[i]);
|
35
|
+
return copy;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Handle Object
|
39
|
+
if (obj instanceof Object) {
|
40
|
+
copy = {};
|
41
|
+
// copy = Object.create(Object.getPrototypeOf(obj));
|
42
|
+
for (var attr in obj) {
|
43
|
+
if (obj.hasOwnProperty(attr))
|
44
|
+
copy[attr] = clone(obj[attr]);
|
45
|
+
}
|
46
|
+
return copy;
|
47
|
+
}
|
48
|
+
|
49
|
+
throw new Error("Unable to clone object!");
|
50
|
+
};
|
51
|
+
|
52
|
+
var clone_stack = function (stack) {
|
53
|
+
var new_stack = [ clone(stack[0]) ], key = new_stack[0].key, obj = new_stack[0].object;
|
54
|
+
for (var i = 1, len = stack.length; i< len; i++) {
|
55
|
+
obj = obj[key];
|
56
|
+
key = stack[i].key;
|
57
|
+
new_stack.push({ object: obj, key: key });
|
58
|
+
}
|
59
|
+
return new_stack;
|
60
|
+
};
|
61
|
+
|
62
|
+
var copy_stack = function (new_stack, old_stack) {
|
63
|
+
var stack_last = new_stack.length-1, key = new_stack[stack_last].key;
|
64
|
+
old_stack[stack_last].object[key] = new_stack[stack_last].object[key];
|
65
|
+
};
|
66
|
+
|
67
|
+
var handled = {
|
68
|
+
'type': true,
|
69
|
+
'not': true,
|
70
|
+
'anyOf': true,
|
71
|
+
'allOf': true,
|
72
|
+
'oneOf': true,
|
73
|
+
'$ref': true,
|
74
|
+
'$schema': true,
|
75
|
+
'id': true,
|
76
|
+
'exclusiveMaximum': true,
|
77
|
+
'exclusiveMininum': true,
|
78
|
+
'properties': true,
|
79
|
+
'patternProperties': true,
|
80
|
+
'additionalProperties': true,
|
81
|
+
'items': true,
|
82
|
+
'additionalItems': true,
|
83
|
+
'required': true,
|
84
|
+
'default': true,
|
85
|
+
'title': true,
|
86
|
+
'description': true,
|
87
|
+
'definitions': true,
|
88
|
+
'dependencies': true
|
89
|
+
};
|
90
|
+
|
91
|
+
var fieldType = {
|
92
|
+
'null': function (x) {
|
93
|
+
return x === null;
|
94
|
+
},
|
95
|
+
'string': function (x) {
|
96
|
+
return typeof x === 'string';
|
97
|
+
},
|
98
|
+
'boolean': function (x) {
|
99
|
+
return typeof x === 'boolean';
|
100
|
+
},
|
101
|
+
'number': function (x) {
|
102
|
+
// Use x === x instead of !isNaN(x) for speed
|
103
|
+
return typeof x === 'number' && x === x;
|
104
|
+
},
|
105
|
+
'integer': function (x) {
|
106
|
+
return typeof x === 'number' && x%1 === 0;
|
107
|
+
},
|
108
|
+
'object': function (x) {
|
109
|
+
return x && typeof x === 'object' && !Array.isArray(x);
|
110
|
+
},
|
111
|
+
'array': function (x) {
|
112
|
+
return Array.isArray(x);
|
113
|
+
},
|
114
|
+
'date': function (x) {
|
115
|
+
return x instanceof Date;
|
116
|
+
}
|
117
|
+
};
|
118
|
+
|
119
|
+
// missing: uri, date-time, ipv4, ipv6
|
120
|
+
var fieldFormat = {
|
121
|
+
'alpha': function (v) {
|
122
|
+
return (/^[a-zA-Z]+$/).test(v);
|
123
|
+
},
|
124
|
+
'alphanumeric': function (v) {
|
125
|
+
return (/^[a-zA-Z0-9]+$/).test(v);
|
126
|
+
},
|
127
|
+
'identifier': function (v) {
|
128
|
+
return (/^[-_a-zA-Z0-9]+$/).test(v);
|
129
|
+
},
|
130
|
+
'hexadecimal': function (v) {
|
131
|
+
return (/^[a-fA-F0-9]+$/).test(v);
|
132
|
+
},
|
133
|
+
'numeric': function (v) {
|
134
|
+
return (/^[0-9]+$/).test(v);
|
135
|
+
},
|
136
|
+
'date-time': function (v) {
|
137
|
+
return !isNaN(Date.parse(v)) && v.indexOf('/') === -1;
|
138
|
+
},
|
139
|
+
'uppercase': function (v) {
|
140
|
+
return v === v.toUpperCase();
|
141
|
+
},
|
142
|
+
'lowercase': function (v) {
|
143
|
+
return v === v.toLowerCase();
|
144
|
+
},
|
145
|
+
'hostname': function (v) {
|
146
|
+
return v.length < 256 && (/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$/).test(v);
|
147
|
+
},
|
148
|
+
'uri': function (v) {
|
149
|
+
return (/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/).test(v);
|
150
|
+
},
|
151
|
+
'email': function (v) { // email, ipv4 and ipv6 adapted from node-validator
|
152
|
+
return (/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/).test(v);
|
153
|
+
},
|
154
|
+
'ipv4': function (v) {
|
155
|
+
if ((/^(\d?\d?\d)\.(\d?\d?\d)\.(\d?\d?\d)\.(\d?\d?\d)$/).test(v)) {
|
156
|
+
var parts = v.split('.').sort();
|
157
|
+
if (parts[3] <= 255)
|
158
|
+
return true;
|
159
|
+
}
|
160
|
+
return false;
|
161
|
+
},
|
162
|
+
'ipv6': function(v) {
|
163
|
+
return (/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/).test(v);
|
164
|
+
/* return (/^::|^::1|^([a-fA-F0-9]{1,4}::?){1,7}([a-fA-F0-9]{1,4})$/).test(v); */
|
165
|
+
}
|
166
|
+
};
|
167
|
+
|
168
|
+
var fieldValidate = {
|
169
|
+
'readOnly': function (v, p) {
|
170
|
+
return false;
|
171
|
+
},
|
172
|
+
// ****** numeric validation ********
|
173
|
+
'minimum': function (v, p, schema) {
|
174
|
+
return !(v < p || schema.exclusiveMinimum && v <= p);
|
175
|
+
},
|
176
|
+
'maximum': function (v, p, schema) {
|
177
|
+
return !(v > p || schema.exclusiveMaximum && v >= p);
|
178
|
+
},
|
179
|
+
'multipleOf': function (v, p) {
|
180
|
+
return (v/p)%1 === 0 || typeof v !== 'number';
|
181
|
+
},
|
182
|
+
// ****** string validation ******
|
183
|
+
'pattern': function (v, p) {
|
184
|
+
if (typeof v !== 'string')
|
185
|
+
return true;
|
186
|
+
var pattern, modifiers;
|
187
|
+
if (typeof p === 'string')
|
188
|
+
pattern=p;
|
189
|
+
else {
|
190
|
+
pattern=p[0];
|
191
|
+
modifiers=p[1];
|
192
|
+
}
|
193
|
+
var regex = new RegExp(pattern, modifiers);
|
194
|
+
return regex.test(v);
|
195
|
+
},
|
196
|
+
'minLength': function (v, p) {
|
197
|
+
return v.length >= p || typeof v !== 'string';
|
198
|
+
},
|
199
|
+
'maxLength': function (v, p) {
|
200
|
+
return v.length <= p || typeof v !== 'string';
|
201
|
+
},
|
202
|
+
// ***** array validation *****
|
203
|
+
'minItems': function (v, p) {
|
204
|
+
return v.length >= p || !Array.isArray(v);
|
205
|
+
},
|
206
|
+
'maxItems': function (v, p) {
|
207
|
+
return v.length <= p || !Array.isArray(v);
|
208
|
+
},
|
209
|
+
'uniqueItems': function (v, p) {
|
210
|
+
var hash = {}, key;
|
211
|
+
for (var i = 0, len = v.length; i < len; i++) {
|
212
|
+
key = JSON.stringify(v[i]);
|
213
|
+
if (hash.hasOwnProperty(key))
|
214
|
+
return false;
|
215
|
+
else
|
216
|
+
hash[key] = true;
|
217
|
+
}
|
218
|
+
return true;
|
219
|
+
},
|
220
|
+
// ***** object validation ****
|
221
|
+
'minProperties': function (v, p) {
|
222
|
+
if (typeof v !== 'object')
|
223
|
+
return true;
|
224
|
+
var count = 0;
|
225
|
+
for (var attr in v) if (v.hasOwnProperty(attr)) count = count + 1;
|
226
|
+
return count >= p;
|
227
|
+
},
|
228
|
+
'maxProperties': function (v, p) {
|
229
|
+
if (typeof v !== 'object')
|
230
|
+
return true;
|
231
|
+
var count = 0;
|
232
|
+
for (var attr in v) if (v.hasOwnProperty(attr)) count = count + 1;
|
233
|
+
return count <= p;
|
234
|
+
},
|
235
|
+
// ****** all *****
|
236
|
+
'constant': function (v, p) {
|
237
|
+
return JSON.stringify(v) == JSON.stringify(p);
|
238
|
+
},
|
239
|
+
'enum': function (v, p) {
|
240
|
+
var i, len, vs;
|
241
|
+
if (typeof v === 'object') {
|
242
|
+
vs = JSON.stringify(v);
|
243
|
+
for (i = 0, len = p.length; i < len; i++)
|
244
|
+
if (vs === JSON.stringify(p[i]))
|
245
|
+
return true;
|
246
|
+
} else {
|
247
|
+
for (i = 0, len = p.length; i < len; i++)
|
248
|
+
if (v === p[i])
|
249
|
+
return true;
|
250
|
+
}
|
251
|
+
return false;
|
252
|
+
}
|
253
|
+
};
|
254
|
+
|
255
|
+
var normalizeID = function (id) {
|
256
|
+
return id.indexOf("://") === -1 ? id : id.split("#")[0];
|
257
|
+
};
|
258
|
+
|
259
|
+
var resolveURI = function (env, schema_stack, uri) {
|
260
|
+
var curschema, components, hash_idx, name;
|
261
|
+
|
262
|
+
hash_idx = uri.indexOf('#');
|
263
|
+
|
264
|
+
if (hash_idx === -1) {
|
265
|
+
if (!env.schema.hasOwnProperty(uri))
|
266
|
+
return null;
|
267
|
+
return [env.schema[uri]];
|
268
|
+
}
|
269
|
+
|
270
|
+
if (hash_idx > 0) {
|
271
|
+
name = uri.substr(0, hash_idx);
|
272
|
+
uri = uri.substr(hash_idx+1);
|
273
|
+
if (!env.schema.hasOwnProperty(name)) {
|
274
|
+
if (schema_stack && schema_stack[0].id === name)
|
275
|
+
schema_stack = [schema_stack[0]];
|
276
|
+
else
|
277
|
+
return null;
|
278
|
+
} else
|
279
|
+
schema_stack = [env.schema[name]];
|
280
|
+
} else {
|
281
|
+
if (!schema_stack)
|
282
|
+
return null;
|
283
|
+
uri = uri.substr(1);
|
284
|
+
}
|
285
|
+
|
286
|
+
if (uri === '')
|
287
|
+
return [schema_stack[0]];
|
288
|
+
|
289
|
+
if (uri.charAt(0) === '/') {
|
290
|
+
uri = uri.substr(1);
|
291
|
+
curschema = schema_stack[0];
|
292
|
+
components = uri.split('/');
|
293
|
+
while (components.length > 0) {
|
294
|
+
if (!curschema.hasOwnProperty(components[0]))
|
295
|
+
return null;
|
296
|
+
curschema = curschema[components[0]];
|
297
|
+
schema_stack.push(curschema);
|
298
|
+
components.shift();
|
299
|
+
}
|
300
|
+
return schema_stack;
|
301
|
+
} else // FIX: should look for subschemas whose id matches uri
|
302
|
+
return null;
|
303
|
+
};
|
304
|
+
|
305
|
+
var resolveObjectRef = function (object_stack, uri) {
|
306
|
+
var components, object, last_frame = object_stack.length-1, skip_frames, frame, m = /^(\d+)/.exec(uri);
|
307
|
+
|
308
|
+
if (m) {
|
309
|
+
uri = uri.substr(m[0].length);
|
310
|
+
skip_frames = parseInt(m[1], 10);
|
311
|
+
if (skip_frames < 0 || skip_frames > last_frame)
|
312
|
+
return;
|
313
|
+
frame = object_stack[last_frame-skip_frames];
|
314
|
+
if (uri === '#')
|
315
|
+
return frame.key;
|
316
|
+
} else
|
317
|
+
frame = object_stack[0];
|
318
|
+
|
319
|
+
object = frame.object[frame.key];
|
320
|
+
|
321
|
+
if (uri === '')
|
322
|
+
return object;
|
323
|
+
|
324
|
+
if (uri.charAt(0) === '/') {
|
325
|
+
uri = uri.substr(1);
|
326
|
+
components = uri.split('/');
|
327
|
+
while (components.length > 0) {
|
328
|
+
components[0] = components[0].replace(/~1/g, '/').replace(/~0/g, '~');
|
329
|
+
if (!object.hasOwnProperty(components[0]))
|
330
|
+
return;
|
331
|
+
object = object[components[0]];
|
332
|
+
components.shift();
|
333
|
+
}
|
334
|
+
return object;
|
335
|
+
} else
|
336
|
+
return;
|
337
|
+
};
|
338
|
+
|
339
|
+
var checkValidity = function (env, schema_stack, object_stack, options) {
|
340
|
+
var i, len, count, hasProp, hasPattern;
|
341
|
+
var p, v, malformed = false, objerrs = {}, objerr, props, matched;
|
342
|
+
var sl = schema_stack.length-1, schema = schema_stack[sl], new_stack;
|
343
|
+
var ol = object_stack.length-1, object = object_stack[ol].object, name = object_stack[ol].key, prop = object[name];
|
344
|
+
var errCount, minErrCount;
|
345
|
+
|
346
|
+
if (schema.hasOwnProperty('$ref')) {
|
347
|
+
schema_stack= resolveURI(env, schema_stack, schema.$ref);
|
348
|
+
if (!schema_stack)
|
349
|
+
return {'$ref': schema.$ref};
|
350
|
+
else
|
351
|
+
return checkValidity(env, schema_stack, object_stack, options);
|
352
|
+
}
|
353
|
+
|
354
|
+
if (schema.hasOwnProperty('type')) {
|
355
|
+
if (typeof schema.type === 'string') {
|
356
|
+
if (options.useCoerce && env.coerceType.hasOwnProperty(schema.type))
|
357
|
+
prop = object[name] = env.coerceType[schema.type](prop);
|
358
|
+
if (!env.fieldType[schema.type](prop))
|
359
|
+
return {'type': schema.type};
|
360
|
+
} else {
|
361
|
+
malformed = true;
|
362
|
+
for (i = 0, len = schema.type.length; i < len && malformed; i++)
|
363
|
+
if (env.fieldType[schema.type[i]](prop))
|
364
|
+
malformed = false;
|
365
|
+
if (malformed)
|
366
|
+
return {'type': schema.type};
|
367
|
+
}
|
368
|
+
}
|
369
|
+
|
370
|
+
if (schema.hasOwnProperty('allOf')) {
|
371
|
+
for (i = 0, len = schema.allOf.length; i < len; i++) {
|
372
|
+
objerr = checkValidity(env, schema_stack.concat(schema.allOf[i]), object_stack, options);
|
373
|
+
if (objerr)
|
374
|
+
return objerr;
|
375
|
+
}
|
376
|
+
}
|
377
|
+
|
378
|
+
if (!options.useCoerce && !options.useDefault && !options.removeAdditional) {
|
379
|
+
if (schema.hasOwnProperty('oneOf')) {
|
380
|
+
minErrCount = Infinity;
|
381
|
+
for (i = 0, len = schema.oneOf.length, count = 0; i < len; i++) {
|
382
|
+
objerr = checkValidity(env, schema_stack.concat(schema.oneOf[i]), object_stack, options);
|
383
|
+
if (!objerr) {
|
384
|
+
count = count + 1;
|
385
|
+
if (count > 1)
|
386
|
+
break;
|
387
|
+
} else {
|
388
|
+
errCount = objerr.schema ? Object.keys(objerr.schema).length : 1;
|
389
|
+
if (errCount < minErrCount) {
|
390
|
+
minErrCount = errCount;
|
391
|
+
objerrs = objerr;
|
392
|
+
}
|
393
|
+
}
|
394
|
+
}
|
395
|
+
if (count > 1)
|
396
|
+
return {'oneOf': true};
|
397
|
+
else if (count < 1)
|
398
|
+
return objerrs;
|
399
|
+
objerrs = {};
|
400
|
+
}
|
401
|
+
|
402
|
+
if (schema.hasOwnProperty('anyOf')) {
|
403
|
+
objerrs = null;
|
404
|
+
minErrCount = Infinity;
|
405
|
+
for (i = 0, len = schema.anyOf.length; i < len; i++) {
|
406
|
+
objerr = checkValidity(env, schema_stack.concat(schema.anyOf[i]), object_stack, options);
|
407
|
+
if (!objerr) {
|
408
|
+
objerrs = null;
|
409
|
+
break;
|
410
|
+
}
|
411
|
+
else {
|
412
|
+
errCount = objerr.schema ? Object.keys(objerr.schema).length : 1;
|
413
|
+
if (errCount < minErrCount) {
|
414
|
+
minErrCount = errCount;
|
415
|
+
objerrs = objerr;
|
416
|
+
}
|
417
|
+
}
|
418
|
+
}
|
419
|
+
if (objerrs)
|
420
|
+
return objerrs;
|
421
|
+
}
|
422
|
+
|
423
|
+
if (schema.hasOwnProperty('not')) {
|
424
|
+
objerr = checkValidity(env, schema_stack.concat(schema.not), object_stack, options);
|
425
|
+
if (!objerr)
|
426
|
+
return {'not': true};
|
427
|
+
}
|
428
|
+
} else {
|
429
|
+
if (schema.hasOwnProperty('oneOf')) {
|
430
|
+
minErrCount = Infinity;
|
431
|
+
for (i = 0, len = schema.oneOf.length, count = 0; i < len; i++) {
|
432
|
+
new_stack = clone_stack(object_stack);
|
433
|
+
objerr = checkValidity(env, schema_stack.concat(schema.oneOf[i]), new_stack, options);
|
434
|
+
if (!objerr) {
|
435
|
+
count = count + 1;
|
436
|
+
if (count > 1)
|
437
|
+
break;
|
438
|
+
else
|
439
|
+
copy_stack(new_stack, object_stack);
|
440
|
+
} else {
|
441
|
+
errCount = objerr.schema ? Object.keys(objerr.schema).length : 1;
|
442
|
+
if (errCount < minErrCount) {
|
443
|
+
minErrCount = errCount;
|
444
|
+
objerrs = objerr;
|
445
|
+
}
|
446
|
+
}
|
447
|
+
}
|
448
|
+
if (count > 1)
|
449
|
+
return {'oneOf': true};
|
450
|
+
else if (count < 1)
|
451
|
+
return objerrs;
|
452
|
+
objerrs = {};
|
453
|
+
}
|
454
|
+
|
455
|
+
if (schema.hasOwnProperty('anyOf')) {
|
456
|
+
objerrs = null;
|
457
|
+
minErrCount = Infinity;
|
458
|
+
for (i = 0, len = schema.anyOf.length; i < len; i++) {
|
459
|
+
new_stack = clone_stack(object_stack);
|
460
|
+
objerr = checkValidity(env, schema_stack.concat(schema.anyOf[i]), new_stack, options);
|
461
|
+
if (!objerr) {
|
462
|
+
copy_stack(new_stack, object_stack);
|
463
|
+
objerrs = null;
|
464
|
+
break;
|
465
|
+
}
|
466
|
+
else {
|
467
|
+
errCount = objerr.schema ? Object.keys(objerr.schema).length : 1;
|
468
|
+
if (errCount < minErrCount) {
|
469
|
+
minErrCount = errCount;
|
470
|
+
objerrs = objerr;
|
471
|
+
}
|
472
|
+
}
|
473
|
+
}
|
474
|
+
if (objerrs)
|
475
|
+
return objerrs;
|
476
|
+
}
|
477
|
+
|
478
|
+
if (schema.hasOwnProperty('not')) {
|
479
|
+
new_stack = clone_stack(object_stack);
|
480
|
+
objerr = checkValidity(env, schema_stack.concat(schema.not), new_stack, options);
|
481
|
+
if (!objerr)
|
482
|
+
return {'not': true};
|
483
|
+
}
|
484
|
+
}
|
485
|
+
|
486
|
+
if (schema.hasOwnProperty('dependencies')) {
|
487
|
+
for (p in schema.dependencies)
|
488
|
+
if (schema.dependencies.hasOwnProperty(p) && prop.hasOwnProperty(p)) {
|
489
|
+
if (Array.isArray(schema.dependencies[p])) {
|
490
|
+
for (i = 0, len = schema.dependencies[p].length; i < len; i++)
|
491
|
+
if (!prop.hasOwnProperty(schema.dependencies[p][i])) {
|
492
|
+
return {'dependencies': true};
|
493
|
+
}
|
494
|
+
} else {
|
495
|
+
objerr = checkValidity(env, schema_stack.concat(schema.dependencies[p]), object_stack, options);
|
496
|
+
if (objerr)
|
497
|
+
return objerr;
|
498
|
+
}
|
499
|
+
}
|
500
|
+
}
|
501
|
+
|
502
|
+
if (!Array.isArray(prop)) {
|
503
|
+
props = [];
|
504
|
+
objerrs = {};
|
505
|
+
for (p in prop)
|
506
|
+
if (prop.hasOwnProperty(p))
|
507
|
+
props.push(p);
|
508
|
+
|
509
|
+
if (options.checkRequired && schema.required) {
|
510
|
+
for (i = 0, len = schema.required.length; i < len; i++)
|
511
|
+
if (!prop.hasOwnProperty(schema.required[i])) {
|
512
|
+
objerrs[schema.required[i]] = {'required': true};
|
513
|
+
malformed = true;
|
514
|
+
}
|
515
|
+
}
|
516
|
+
|
517
|
+
hasProp = schema.hasOwnProperty('properties');
|
518
|
+
hasPattern = schema.hasOwnProperty('patternProperties');
|
519
|
+
if (hasProp || hasPattern) {
|
520
|
+
i = props.length;
|
521
|
+
while (i--) {
|
522
|
+
matched = false;
|
523
|
+
if (hasProp && schema.properties.hasOwnProperty(props[i])) {
|
524
|
+
matched = true;
|
525
|
+
objerr = checkValidity(env, schema_stack.concat(schema.properties[props[i]]), object_stack.concat({object: prop, key: props[i]}), options);
|
526
|
+
if (objerr !== null) {
|
527
|
+
objerrs[props[i]] = objerr;
|
528
|
+
malformed = true;
|
529
|
+
}
|
530
|
+
}
|
531
|
+
if (hasPattern) {
|
532
|
+
for (p in schema.patternProperties)
|
533
|
+
if (schema.patternProperties.hasOwnProperty(p) && props[i].match(p)) {
|
534
|
+
matched = true;
|
535
|
+
objerr = checkValidity(env, schema_stack.concat(schema.patternProperties[p]), object_stack.concat({object: prop, key: props[i]}), options);
|
536
|
+
if (objerr !== null) {
|
537
|
+
objerrs[props[i]] = objerr;
|
538
|
+
malformed = true;
|
539
|
+
}
|
540
|
+
}
|
541
|
+
}
|
542
|
+
if (matched)
|
543
|
+
props.splice(i, 1);
|
544
|
+
}
|
545
|
+
}
|
546
|
+
|
547
|
+
if (options.useDefault && hasProp && !malformed) {
|
548
|
+
for (p in schema.properties)
|
549
|
+
if (schema.properties.hasOwnProperty(p) && !prop.hasOwnProperty(p) && schema.properties[p].hasOwnProperty('default'))
|
550
|
+
prop[p] = schema.properties[p]['default'];
|
551
|
+
}
|
552
|
+
|
553
|
+
if (options.removeAdditional && hasProp && schema.additionalProperties !== true && typeof schema.additionalProperties !== 'object') {
|
554
|
+
for (i = 0, len = props.length; i < len; i++)
|
555
|
+
delete prop[props[i]];
|
556
|
+
} else {
|
557
|
+
if (schema.hasOwnProperty('additionalProperties')) {
|
558
|
+
if (typeof schema.additionalProperties === 'boolean') {
|
559
|
+
if (!schema.additionalProperties) {
|
560
|
+
for (i = 0, len = props.length; i < len; i++) {
|
561
|
+
objerrs[props[i]] = {'additional': true};
|
562
|
+
malformed = true;
|
563
|
+
}
|
564
|
+
}
|
565
|
+
} else {
|
566
|
+
for (i = 0, len = props.length; i < len; i++) {
|
567
|
+
objerr = checkValidity(env, schema_stack.concat(schema.additionalProperties), object_stack.concat({object: prop, key: props[i]}), options);
|
568
|
+
if (objerr !== null) {
|
569
|
+
objerrs[props[i]] = objerr;
|
570
|
+
malformed = true;
|
571
|
+
}
|
572
|
+
}
|
573
|
+
}
|
574
|
+
}
|
575
|
+
}
|
576
|
+
if (malformed)
|
577
|
+
return {'schema': objerrs};
|
578
|
+
} else {
|
579
|
+
if (schema.hasOwnProperty('items')) {
|
580
|
+
if (Array.isArray(schema.items)) {
|
581
|
+
for (i = 0, len = schema.items.length; i < len; i++) {
|
582
|
+
objerr = checkValidity(env, schema_stack.concat(schema.items[i]), object_stack.concat({object: prop, key: i}), options);
|
583
|
+
if (objerr !== null) {
|
584
|
+
objerrs[i] = objerr;
|
585
|
+
malformed = true;
|
586
|
+
}
|
587
|
+
}
|
588
|
+
if (prop.length > len && schema.hasOwnProperty('additionalItems')) {
|
589
|
+
if (typeof schema.additionalItems === 'boolean') {
|
590
|
+
if (!schema.additionalItems)
|
591
|
+
return {'additionalItems': true};
|
592
|
+
} else {
|
593
|
+
for (i = len, len = prop.length; i < len; i++) {
|
594
|
+
objerr = checkValidity(env, schema_stack.concat(schema.additionalItems), object_stack.concat({object: prop, key: i}), options);
|
595
|
+
if (objerr !== null) {
|
596
|
+
objerrs[i] = objerr;
|
597
|
+
malformed = true;
|
598
|
+
}
|
599
|
+
}
|
600
|
+
}
|
601
|
+
}
|
602
|
+
} else {
|
603
|
+
for (i = 0, len = prop.length; i < len; i++) {
|
604
|
+
objerr = checkValidity(env, schema_stack.concat(schema.items), object_stack.concat({object: prop, key: i}), options);
|
605
|
+
if (objerr !== null) {
|
606
|
+
objerrs[i] = objerr;
|
607
|
+
malformed = true;
|
608
|
+
}
|
609
|
+
}
|
610
|
+
}
|
611
|
+
} else if (schema.hasOwnProperty('additionalItems')) {
|
612
|
+
if (typeof schema.additionalItems !== 'boolean') {
|
613
|
+
for (i = 0, len = prop.length; i < len; i++) {
|
614
|
+
objerr = checkValidity(env, schema_stack.concat(schema.additionalItems), object_stack.concat({object: prop, key: i}), options);
|
615
|
+
if (objerr !== null) {
|
616
|
+
objerrs[i] = objerr;
|
617
|
+
malformed = true;
|
618
|
+
}
|
619
|
+
}
|
620
|
+
}
|
621
|
+
}
|
622
|
+
if (malformed)
|
623
|
+
return {'schema': objerrs};
|
624
|
+
}
|
625
|
+
|
626
|
+
for (v in schema) {
|
627
|
+
if (schema.hasOwnProperty(v) && !handled.hasOwnProperty(v)) {
|
628
|
+
if (v === 'format') {
|
629
|
+
if (env.fieldFormat.hasOwnProperty(schema[v]) && !env.fieldFormat[schema[v]](prop, schema, object_stack, options)) {
|
630
|
+
objerrs[v] = true;
|
631
|
+
malformed = true;
|
632
|
+
}
|
633
|
+
} else {
|
634
|
+
if (env.fieldValidate.hasOwnProperty(v) && !env.fieldValidate[v](prop, schema[v].hasOwnProperty('$data') ? resolveObjectRef(object_stack, schema[v].$data) : schema[v], schema, object_stack, options)) {
|
635
|
+
objerrs[v] = true;
|
636
|
+
malformed = true;
|
637
|
+
}
|
638
|
+
}
|
639
|
+
}
|
640
|
+
}
|
641
|
+
|
642
|
+
if (malformed)
|
643
|
+
return objerrs;
|
644
|
+
else
|
645
|
+
return null;
|
646
|
+
};
|
647
|
+
|
648
|
+
var defaultOptions = {
|
649
|
+
useDefault: false,
|
650
|
+
useCoerce: false,
|
651
|
+
checkRequired: true,
|
652
|
+
removeAdditional: false
|
653
|
+
};
|
654
|
+
|
655
|
+
function Environment() {
|
656
|
+
if (!(this instanceof Environment))
|
657
|
+
return new Environment();
|
658
|
+
|
659
|
+
this.coerceType = {};
|
660
|
+
this.fieldType = clone(fieldType);
|
661
|
+
this.fieldValidate = clone(fieldValidate);
|
662
|
+
this.fieldFormat = clone(fieldFormat);
|
663
|
+
this.defaultOptions = clone(defaultOptions);
|
664
|
+
this.schema = {};
|
665
|
+
}
|
666
|
+
|
667
|
+
Environment.prototype = {
|
668
|
+
validate: function (name, object, options) {
|
669
|
+
var schema_stack = [name], errors = null, object_stack = [{object: {'__root__': object}, key: '__root__'}];
|
670
|
+
|
671
|
+
if (typeof name === 'string') {
|
672
|
+
schema_stack = resolveURI(this, null, name);
|
673
|
+
if (!schema_stack)
|
674
|
+
throw new Error('jjv: could not find schema \'' + name + '\'.');
|
675
|
+
}
|
676
|
+
|
677
|
+
if (!options) {
|
678
|
+
options = this.defaultOptions;
|
679
|
+
} else {
|
680
|
+
for (var p in this.defaultOptions)
|
681
|
+
if (this.defaultOptions.hasOwnProperty(p) && !options.hasOwnProperty(p))
|
682
|
+
options[p] = this.defaultOptions[p];
|
683
|
+
}
|
684
|
+
|
685
|
+
errors = checkValidity(this, schema_stack, object_stack, options);
|
686
|
+
|
687
|
+
if (errors)
|
688
|
+
return {validation: errors.hasOwnProperty('schema') ? errors.schema : errors};
|
689
|
+
else
|
690
|
+
return null;
|
691
|
+
},
|
692
|
+
|
693
|
+
resolveRef: function (schema_stack, $ref) {
|
694
|
+
return resolveURI(this, schema_stack, $ref);
|
695
|
+
},
|
696
|
+
|
697
|
+
addType: function (name, func) {
|
698
|
+
this.fieldType[name] = func;
|
699
|
+
},
|
700
|
+
|
701
|
+
addTypeCoercion: function (type, func) {
|
702
|
+
this.coerceType[type] = func;
|
703
|
+
},
|
704
|
+
|
705
|
+
addCheck: function (name, func) {
|
706
|
+
this.fieldValidate[name] = func;
|
707
|
+
},
|
708
|
+
|
709
|
+
addFormat: function (name, func) {
|
710
|
+
this.fieldFormat[name] = func;
|
711
|
+
},
|
712
|
+
|
713
|
+
addSchema: function (name, schema) {
|
714
|
+
if (!schema && name) {
|
715
|
+
schema = name;
|
716
|
+
name = undefined;
|
717
|
+
}
|
718
|
+
if (schema.hasOwnProperty('id') && typeof schema.id === 'string' && schema.id !== name) {
|
719
|
+
if (schema.id.charAt(0) === '/')
|
720
|
+
throw new Error('jjv: schema id\'s starting with / are invalid.');
|
721
|
+
this.schema[normalizeID(schema.id)] = schema;
|
722
|
+
} else if (!name) {
|
723
|
+
throw new Error('jjv: schema needs either a name or id attribute.');
|
724
|
+
}
|
725
|
+
if (name)
|
726
|
+
this.schema[normalizeID(name)] = schema;
|
727
|
+
}
|
728
|
+
};
|
729
|
+
|
730
|
+
// Export for use in server and client.
|
731
|
+
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined')
|
732
|
+
module.exports = Environment;
|
733
|
+
else if (typeof define === 'function' && define.amd)
|
734
|
+
define(function () {return Environment;});
|
735
|
+
else
|
736
|
+
this.jjv = Environment;
|
737
|
+
}).call(this);
|
738
|
+
|
739
|
+
global.actn.jjv = jjv();
|