diff --git a/bower.json b/bower.json index 350f7bd..ef13e37 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "rekord-validation", - "version": "1.5.0", + "version": "1.5.6", "homepage": "https://github.com/Rekord/rekord-validation", "authors": [ "Philip Diffenderfer " diff --git a/build/rekord-validation.js b/build/rekord-validation.js index 6e65f83..d81a89c 100644 --- a/build/rekord-validation.js +++ b/build/rekord-validation.js @@ -1,4 +1,4 @@ -/* rekord-validation 1.5.0 - Advanced validation rules for rekord by Philip Diffenderfer */ +/* rekord-validation 1.5.6 - Advanced validation rules for rekord by Philip Diffenderfer */ // UMD (Universal Module Definition) (function (root, factory) { @@ -427,6 +427,27 @@ var Validation = RuleSeparator: ':', Stop: {}, + callRules: function(rules, message, field, database, getAlias) + { + var validations = this.parseRules( rules, field, database, getAlias, message ); + + return function (value) + { + var onChainEnd = function() {}; + var model = { + $get: function () { + return value; + }, + }; + + var chain = new ValidationChain( model, field, validations, onChainEnd ); + + chain.start(); + + return chain; + }; + }, + parseRules: function(rules, field, database, getAlias, message) { var validators = []; @@ -2204,6 +2225,7 @@ Validation.Rules.unbase64 = function(field, params, database, alias, message) Rekord.Validation = Validation; + Rekord.ValidationChain = ValidationChain; Rekord.ruleGenerator = ruleGenerator; Rekord.rangeRuleGenerator = rangeRuleGenerator; diff --git a/build/rekord-validation.min.js b/build/rekord-validation.min.js index 0bd9e67..3696a84 100644 --- a/build/rekord-validation.min.js +++ b/build/rekord-validation.min.js @@ -1,3 +1,3 @@ -/* rekord-validation 1.5.0 - Advanced validation rules for rekord by Philip Diffenderfer */ -!function(e,t){"function"==typeof define&&define.amd?define(["rekord"],function(n){return t(e,n)}):"object"==typeof module&&module.exports?module.exports=t(global,require("rekord")):e.Rekord=t(e,e.Rekord)}(this,function(e,t,n){function a(e,t,n,a){this.model=e,this.field=t,this.validations=n,this.onEnd=a}function i(e){var t=parseFloat(e);return isNaN(t)||(e=t),e}function r(e){var t=parseInt(e);return isNaN(t)||(e=t),e}function s(e){return N(e)?e.setHours(0,0,0,0):T(e)&&(e-=e%864e5),e}function u(e){return N(e)?e.setHours(23,59,59,999):T(e)&&(e=e-e%864e5+864e5-1),e}function l(e,t,n){K.Rules[e]=function(t,a,i,r,s){d(e,t,a);var u=o(e,s);return function(e,a,i){n(e,a,i)?i.invalid(h(t,r(t),e,a,u)):i.next()}},K.Rules[e].message=t}function o(e,t){return t||K.Rules[e].message}function f(e,t,n,a){var i=e.slice();if(a)for(var r=0;re}),m("before","{$alias} must be before {$date}.",function(e,t){return e>t}),m("before_on","{$alias} must be before or equal to {$date}.",function(e,t){return e>u(t)}),l("date_like","{$alias} must be a valid date.",function(e,t,n){var a=J(e),i=a===!1;return i||n.update(a.getTime()),i}),$("required_if","{$alias} is required.",function(e,t,n,a,i){var r=i[t.$get(n)];return r&&k(e)}),$("required_unless","{$alias} is required.",function(e,t,n,a,i){var r=!i[t.$get(n)];return r&&k(e)}),g("confirmed","{$alias} must match {$fieldAliases}.",function(e,t,n,a){for(var i=!0,r=0;r0}),b("if_any",function(e,t){return e>=t}),b("if_not",function(e,t){return t>e}),x("in","{$alias} must be one of {$list}.",function(e,t,n){return!n(e,t)}),x("not_in","{$alias} must not be one of {$list}.",function(e,t,n){return n(e,t)}),R("between",{string:"{$alias} must have between {$start} to {$end} characters.",number:"{$alias} must be between {$start} and {$end}.",object:"{$alias} must have between {$start} to {$end} items."},function(e,t,n){return t>e||e>n}),R("not_between",{string:"{$alias} must not have between {$start} to {$end} characters.",number:"{$alias} must not be between {$start} and {$end}.",object:"{$alias} must not have between {$start} to {$end} items."},function(e,t,n){return e>=t&&n>=e}),w("alpha","{$alias} should only contain alphabetic characters.",/^[a-zA-Z]*$/),w("alpha_dash","{$alias} should only contain alpha-numeric characters, dashes, and underscores.",/^[a-zA-Z0-9_-]*$/),w("alpha_num","{$alias} should only contain alpha-numeric characters.",/^[a-zA-Z0-9]*$/),w("email","{$alias} is not a valid email.",/^.+@.+\..+$/),w("url","{$alias} is not a valid URL.",/^(https?:\/\/)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)$/),w("uri","{$alias} is not a valid URI.",/^(\w+:\/\/)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)$/),w("phone","{$alias} is not a valid phone number.",/^1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?$/),K.Rules.regex=function(e,t,n,a,i){var r;if(j(t)){var s=/^\/(.*)\/([gmi]*)$/.exec(t);s&&(r=new RegExp(s[1],s[2]))}else O(t)&&(r=t);if(!r)throw t+" is not a valid regular expression for the regex rule";var u=o("regex",i);return function(t,n,i){r.test(t)?i.next():i.invalid(h(e,a(e),t,n,u))}},K.Rules.regex.message="{$alias} is not a valid value.",l("required","{$alias} is required.",function(e){return k(e)}),y("min",{string:"{$alias} must have a minimum of {$number} characters.",number:"{$alias} must be at least {$number}.",object:"{$alias} must have at least {$number} items."},function(e,t){return t>e}),y("greater_than",{string:"{$alias} must have more than {$number} characters.",number:"{$alias} must be greater than {$number}.",object:"{$alias} must have more than {$number} items."},function(e,t){return t>=e}),y("max",{string:"{$alias} must have no more than {$number} characters.",number:"{$alias} must be no more than {$number}.",object:"{$alias} must have no more than {$number} items."},function(e,t){return e>t}),y("less_than",{string:"{$alias} must have less than {$number} characters.",number:"{$alias} must be less than {$number}.",object:"{$alias} must have less than {$number} items."},function(e,t){return e>=t}),y("equal",{string:"{$alias} must have {$number} characters.",number:"{$alias} must equal {$number}.",object:"{$alias} must have {$number} items."},function(e,t){return e!==t}),y("not_equal",{string:"{$alias} must not have {$number} characters.",number:"{$alias} must not equal {$number}.",object:"{$alias} must not have {$number} items."},function(e,t){return e===t}),l("array","{$alias} must be an array.",function(e){return!M(e)}),l("object","{$alias} must be an object.",function(e){return!z(e)}),l("string","{$alias} must be a string.",function(e){return!j(e)}),l("number","{$alias} must be a number.",function(e){return!T(e)}),l("boolean","{$alias} must be a true or false.",function(e){return!G(e)}),l("model","{$alias} must have a value.",function(e){return!(e instanceof q)}),l("whole","{$alias} must be a whole number.",function(e,t,n){var a=r(e),i=parseFloat(e),s=!T(a);return s||(s=Math.floor(a)!==i,s||n.update(a)),s}),l("numeric","{$alias} must be numeric.",function(e,t,n){var a=i(e),r=!T(a);return r||n.update(a),r}),l("yesno","{$alias} must be a yes or no.",function(e,t,n){var a=K.Rules.yesno.map[e],i=!G(a);return i||n.update(a),i}),K.Rules.yesno.map={"true":!0,t:!0,yes:!0,y:!0,1:!0,"false":!1,f:!1,no:!1,n:!1,0:!1},K.Rules.abs=function(e,t,n,a,r){return function(e,t,n){e=i(e),T(e)&&n.update(Math.abs(e)),n.next()}},K.Rules.apply=function(e,t,n,a,i){return function(t,n,a){n.$set(e,t),a.next()}},K.Rules.base64=function(t,n,a,i,r){return function(t,n,a){e.btoa&&a.update(e.btoa(t)),a.next()}},K.Rules.ceil=function(e,t,n,a,r){return function(e,t,n){e=i(e),T(e)&&n.update(Math.ceil(e)),n.next()}},K.Rules.endOfDay=function(e,t,n,a,i){return function(e,t,n){n.update(u(e)),n.next()}},K.Rules.filter=function(e,t,n,a,i){return function(e,t,n){if(M(e)){for(var a=e.length-1;a>=0;a--)P(e[a])||e.splice(a,1);n.update(e)}else if(z(e)){for(var i in e)P(e[i])||delete e[i];n.update(e)}n.next()}},K.Rules.floor=function(e,t,n,a,r){return function(e,t,n){e=i(e),T(e)&&n.update(Math.floor(e)),n.next()}},K.Rules.mod=function(e,t,n,a,r){var s=i(t);if(!T(s))throw'"'+s+'" is not a valid number for the mod rule.';return function(e,t,n){e=i(e),T(e)&&n.update(e%s),n.next()}},K.Rules["null"]=function(e,t,n,a,i){return function(t,n,a){n.$set(e,null),a.update(null),a.next()}},K.Rules.round=function(e,t,n,a,r){return function(e,t,n){e=i(e),T(e)&&n.update(Math.round(e)),n.next()}},K.Rules.startOfDay=function(e,t,n,a,i){return function(e,t,n){n.update(s(e)),n.next()}},K.Rules.stripEnts=function(e,t,n,a,i){return function(e,t,n){j(e)&&n.update(e.replace(/&[a-z]+;/gi,"")),n.next()}},K.Rules.stripTags=function(e,t,n,a,i){return function(e,t,n){j(e)&&n.update(e.replace(/<(?:.|\n)*?>/gm,"")),n.next()}},K.Rules.trim=function(e,t,n,a,i){var r=function(){if(String.prototype.trim)return function(e){return e.trim()};var e=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;return function(t){return t.replace(e,"")}}();return function(e,t,n){j(e)&&n.update(r(e)),n.next()}},K.Rules.unbase64=function(t,n,a,i,r){return function(t,n,a){e.atob&&a.update(e.atob(t)),a.next()}},t.Validation=K,t.ruleGenerator=l,t.rangeRuleGenerator=R,t.collectionRuleGenerator=v,t.dateRuleGenerator=m,t.fieldListRuleGenerator=$,t.fieldsRuleGenerator=g,t.foreignRuleGenerator=p,t.subRuleGenerator=b,t.listRuleGenerator=x,t.regexRuleGenerator=w,t.sizeRuleGenerator=y,t.joinFriendly=f,t.tryParseFloat=i,t.tryParseInt=r,t.startOfDay=s,t.endOfDay=u,t.determineMessage=o,t.mapFromArray=c,t.checkNoParams=d,t.generateMessage=h,t}); +/* rekord-validation 1.5.6 - Advanced validation rules for rekord by Philip Diffenderfer */ +!function(e,t){"function"==typeof define&&define.amd?define(["rekord"],function(n){return t(e,n)}):"object"==typeof module&&module.exports?module.exports=t(global,require("rekord")):e.Rekord=t(e,e.Rekord)}(this,function(e,t,n){function a(e,t,n,a){this.model=e,this.field=t,this.validations=n,this.onEnd=a}function i(e){var t=parseFloat(e);return isNaN(t)||(e=t),e}function r(e){var t=parseInt(e);return isNaN(t)||(e=t),e}function s(e){return N(e)?e.setHours(0,0,0,0):T(e)&&(e-=e%864e5),e}function u(e){return N(e)?e.setHours(23,59,59,999):T(e)&&(e=e-e%864e5+864e5-1),e}function l(e,t,n){K.Rules[e]=function(t,a,i,r,s){d(e,t,a);var u=o(e,s);return function(e,a,i){n(e,a,i)?i.invalid(h(t,r(t),e,a,u)):i.next()}},K.Rules[e].message=t}function o(e,t){return t||K.Rules[e].message}function f(e,t,n,a){var i=e.slice();if(a)for(var r=0;rt}),m("before_on","{$alias} must be before or equal to {$date}.",function(e,t){return e>u(t)}),l("date_like","{$alias} must be a valid date.",function(e,t,n){var a=J(e),i=a===!1;return i||n.update(a.getTime()),i}),$("required_if","{$alias} is required.",function(e,t,n,a,i){var r=i[t.$get(n)];return r&&k(e)}),$("required_unless","{$alias} is required.",function(e,t,n,a,i){var r=!i[t.$get(n)];return r&&k(e)}),g("confirmed","{$alias} must match {$fieldAliases}.",function(e,t,n,a){for(var i=!0,r=0;r0}),b("if_any",function(e,t){return e>=t}),b("if_not",function(e,t){return en}),R("not_between",{string:"{$alias} must not have between {$start} to {$end} characters.",number:"{$alias} must not be between {$start} and {$end}.",object:"{$alias} must not have between {$start} to {$end} items."},function(e,t,n){return e>=t&&e<=n}),w("alpha","{$alias} should only contain alphabetic characters.",/^[a-zA-Z]*$/),w("alpha_dash","{$alias} should only contain alpha-numeric characters, dashes, and underscores.",/^[a-zA-Z0-9_-]*$/),w("alpha_num","{$alias} should only contain alpha-numeric characters.",/^[a-zA-Z0-9]*$/),w("email","{$alias} is not a valid email.",/^.+@.+\..+$/),w("url","{$alias} is not a valid URL.",/^(https?:\/\/)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)$/),w("uri","{$alias} is not a valid URI.",/^(\w+:\/\/)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)$/),w("phone","{$alias} is not a valid phone number.",/^1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?$/),K.Rules.regex=function(e,t,n,a,i){var r;if(j(t)){var s=/^\/(.*)\/([gmi]*)$/.exec(t);s&&(r=new RegExp(s[1],s[2]))}else O(t)&&(r=t);if(!r)throw t+" is not a valid regular expression for the regex rule";var u=o("regex",i);return function(t,n,i){r.test(t)?i.next():i.invalid(h(e,a(e),t,n,u))}},K.Rules.regex.message="{$alias} is not a valid value.",l("required","{$alias} is required.",function(e){return k(e)}),y("min",{string:"{$alias} must have a minimum of {$number} characters.",number:"{$alias} must be at least {$number}.",object:"{$alias} must have at least {$number} items."},function(e,t){return et}),y("less_than",{string:"{$alias} must have less than {$number} characters.",number:"{$alias} must be less than {$number}.",object:"{$alias} must have less than {$number} items."},function(e,t){return e>=t}),y("equal",{string:"{$alias} must have {$number} characters.",number:"{$alias} must equal {$number}.",object:"{$alias} must have {$number} items."},function(e,t){return e!==t}),y("not_equal",{string:"{$alias} must not have {$number} characters.",number:"{$alias} must not equal {$number}.",object:"{$alias} must not have {$number} items."},function(e,t){return e===t}),l("array","{$alias} must be an array.",function(e){return!M(e)}),l("object","{$alias} must be an object.",function(e){return!V(e)}),l("string","{$alias} must be a string.",function(e){return!j(e)}),l("number","{$alias} must be a number.",function(e){return!T(e)}),l("boolean","{$alias} must be a true or false.",function(e){return!G(e)}),l("model","{$alias} must have a value.",function(e){return!(e instanceof q)}),l("whole","{$alias} must be a whole number.",function(e,t,n){var a=r(e),i=parseFloat(e),s=!T(a);return s||(s=Math.floor(a)!==i,s||n.update(a)),s}),l("numeric","{$alias} must be numeric.",function(e,t,n){var a=i(e),r=!T(a);return r||n.update(a),r}),l("yesno","{$alias} must be a yes or no.",function(e,t,n){var a=K.Rules.yesno.map[e],i=!G(a);return i||n.update(a),i}),K.Rules.yesno.map={"true":!0,t:!0,yes:!0,y:!0,1:!0,"false":!1,f:!1,no:!1,n:!1,0:!1},K.Rules.abs=function(e,t,n,a,r){return function(e,t,n){e=i(e),T(e)&&n.update(Math.abs(e)),n.next()}},K.Rules.apply=function(e,t,n,a,i){return function(t,n,a){n.$set(e,t),a.next()}},K.Rules.base64=function(t,n,a,i,r){return function(t,n,a){e.btoa&&a.update(e.btoa(t)),a.next()}},K.Rules.ceil=function(e,t,n,a,r){return function(e,t,n){e=i(e),T(e)&&n.update(Math.ceil(e)),n.next()}},K.Rules.endOfDay=function(e,t,n,a,i){return function(e,t,n){n.update(u(e)),n.next()}},K.Rules.filter=function(e,t,n,a,i){return function(e,t,n){if(M(e)){for(var a=e.length-1;a>=0;a--)P(e[a])||e.splice(a,1);n.update(e)}else if(V(e)){for(var i in e)P(e[i])||delete e[i];n.update(e)}n.next()}},K.Rules.floor=function(e,t,n,a,r){return function(e,t,n){e=i(e),T(e)&&n.update(Math.floor(e)),n.next()}},K.Rules.mod=function(e,t,n,a,r){var s=i(t);if(!T(s))throw'"'+s+'" is not a valid number for the mod rule.';return function(e,t,n){e=i(e),T(e)&&n.update(e%s),n.next()}},K.Rules["null"]=function(e,t,n,a,i){return function(t,n,a){n.$set(e,null),a.update(null),a.next()}},K.Rules.round=function(e,t,n,a,r){return function(e,t,n){e=i(e),T(e)&&n.update(Math.round(e)),n.next()}},K.Rules.startOfDay=function(e,t,n,a,i){return function(e,t,n){n.update(s(e)),n.next()}},K.Rules.stripEnts=function(e,t,n,a,i){return function(e,t,n){j(e)&&n.update(e.replace(/&[a-z]+;/gi,"")),n.next()}},K.Rules.stripTags=function(e,t,n,a,i){return function(e,t,n){j(e)&&n.update(e.replace(/<(?:.|\n)*?>/gm,"")),n.next()}},K.Rules.trim=function(e,t,n,a,i){var r=function(){if(String.prototype.trim)return function(e){return e.trim()};var e=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;return function(t){return t.replace(e,"")}}();return function(e,t,n){j(e)&&n.update(r(e)),n.next()}},K.Rules.unbase64=function(t,n,a,i,r){return function(t,n,a){e.atob&&a.update(e.atob(t)),a.next()}},t.Validation=K,t.ValidationChain=a,t.ruleGenerator=l,t.rangeRuleGenerator=R,t.collectionRuleGenerator=v,t.dateRuleGenerator=m,t.fieldListRuleGenerator=$,t.fieldsRuleGenerator=g,t.foreignRuleGenerator=p,t.subRuleGenerator=b,t.listRuleGenerator=x,t.regexRuleGenerator=w,t.sizeRuleGenerator=y,t.joinFriendly=f,t.tryParseFloat=i,t.tryParseInt=r,t.startOfDay=s,t.endOfDay=u,t.determineMessage=o,t.mapFromArray=c,t.checkNoParams=d,t.generateMessage=h,t}); //# sourceMappingURL=rekord-validation.min.js.map diff --git a/build/rekord-validation.min.js.map b/build/rekord-validation.min.js.map index 1869874..f402bb7 100644 --- a/build/rekord-validation.min.js.map +++ b/build/rekord-validation.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["rekord-validation.min.js"],"names":["root","factory","define","amd","Rekord","module","exports","global","require","this","undefined","ValidationChain","model","field","validations","onEnd","tryParseFloat","x","parsed","parseFloat","isNaN","tryParseInt","parseInt","startOfDay","d","isDate","setHours","isNumber","endOfDay","ruleGenerator","ruleName","defaultMessage","isInvalid","Validation","Rules","params","database","getAlias","message","checkNoParams","messageTemplate","determineMessage","value","chain","invalid","generateMessage","next","joinFriendly","arr","lastSeparatorCustom","itemSeparatorCustom","copy","slice","i","length","last","pop","lastSeparator","itemSeparator","join","mapFromArray","map","alias","extra","isFunction","base","$field","$alias","$value","transfer","isObject","format","collectionRuleGenerator","matchField","matchValue","equality","isString","comma","indexOf","substring","isArray","equals","equalsCompare","fields","$matchField","$matchAlias","$matchValue","dateRuleGenerator","dateExpression","parseExpression","parseDate","parsedTime","getTime","noop","$date","date","fieldListRuleGenerator","matchValues","parts","split","shift","values","list","$params","$list","fieldsRuleGenerator","fieldNames","fieldAliases","$fields","$fieldAliases","foreignRuleGenerator","modelName","models","fieldName","isValue","name","ModelCollection","get","success","modelClass","all","isRekord","$class","subRuleGenerator","otherField","otherRules","colon","rules","validators","parseRules","invalids","chainCount","onChainEnd","innerChain","valid","stop","testValue","$get","start","listRuleGenerator","inList","isPrimitiveArray","rangeRuleGenerator","defaultMessages","end","range","string","number","object","$start","$end","size","sizeof","type","typeMessage","$size","regexRuleGenerator","regex","test","sizeRuleGenerator","$number","Model","Database","Promise","Collection","Class","isEmpty","isBoolean","isRegExp","create","reset","updated","linkIndex","call","update","newValue","n","addPlugin","db","options","aliases","validation","Defaults","messages","required","method","callback","context","$trigger","Events","PreValidate","$valid","$validations","$validationMessages","chainEnds","chains","push","ValidatePass","ValidateFail","replace","$init","apply","arguments","$save","$isDeleted","debug","Debugs","SAVE_DELETED","$db","resolve","promise","modelInstance","args","$validate","saving","then","reject","noline","cancel","Expression","Expressions","Delimiter","Escape","RuleSeparator","Stop","rule","defaultMessageValidator","parseRule","ruleProperty","ruleMessageOrData","ruleMessage","ruleInput","input","customMessageValidator","charAt","customValidator","ruleParams","validatorFactory","expr","parsers","parser","expressionFunction","functionName","result","RELATIVE_REGEX","RELATIVE_UNITS","ms","millisecond","milliseconds","s","second","seconds","min","mins","minute","minutes","hr","hour","hours","day","days","wk","week","weeks","month","months","yr","year","years","relative","exec","amount","unit","unitScale","Date","setTime","getter","setter","today","tomorrow","setDate","getDate","yesterday","accepted","acceptable","valueString","toLowerCase","1","yes","on","y","true","contains","m","validate","messageOption","related","pluck","confirmed","different","invalidCount","totalCount","RegExp","numeric","Math","floor","mapped","yesno","t","false","f","no","0","abs","$set","base64","btoa","ceil","filter","splice","prop","mod","round","stripEnts","stripTags","trim","String","prototype","unbase64","atob"],"mappings":"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","file":"rekord-validation.min.js","sourcesContent":["/* rekord-validation 1.5.0 - Advanced validation rules for rekord by Philip Diffenderfer */\n// UMD (Universal Module Definition)\n(function (root, factory)\n{\n if (typeof define === 'function' && define.amd) // jshint ignore:line\n {\n // AMD. Register as an anonymous module.\n define(['rekord'], function(Rekord) { // jshint ignore:line\n return factory(root, Rekord);\n });\n }\n else if (typeof module === 'object' && module.exports) // jshint ignore:line\n {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory(global, require('rekord')); // jshint ignore:line\n }\n else\n {\n // Browser globals (root is window)\n root.Rekord = factory(root, root.Rekord);\n }\n}(this, function(global, Rekord, undefined)\n{\n\n var Model = Rekord.Model;\n var Database = Rekord.Database;\n var Promise = Rekord.Promise;\n var Collection = Rekord.Collection;\n var ModelCollection = Rekord.ModelCollection;\n var Class = Rekord.Class;\n\n var isEmpty = Rekord.isEmpty;\n var isString = Rekord.isString;\n var isArray = Rekord.isArray;\n var isObject = Rekord.isObject;\n var isFunction = Rekord.isFunction;\n var isDate = Rekord.isDate;\n var isNumber = Rekord.isNumber;\n var isBoolean = Rekord.isBoolean;\n var isValue = Rekord.isValue;\n var isPrimitiveArray = Rekord.isPrimitiveArray;\n var isRegExp = Rekord.isRegExp;\n var isRekord = Rekord.isRekord;\n\n var noop = Rekord.noop;\n var equalsCompare = Rekord.equalsCompare;\n var equals = Rekord.equals;\n var indexOf = Rekord.indexOf;\n var sizeof = Rekord.sizeof;\n\n var split = Rekord.split;\n var transfer = Rekord.transfer;\n var format = Rekord.format;\n\n var parseDate = Rekord.parseDate;\n\n\nfunction ValidationChain(model, field, validations, onEnd)\n{\n this.model = model;\n this.field = field;\n this.validations = validations;\n this.onEnd = onEnd;\n}\n\nClass.create( ValidationChain,\n{\n\n reset: function(value)\n {\n this.value = value !== undefined ? value : this.model.$get( this.field );\n this.updated = false;\n this.valid = true;\n this.message = '';\n this.linkIndex = 0;\n },\n\n start: function(value)\n {\n this.reset( value );\n this.call();\n },\n\n call: function()\n {\n this.validations[ this.linkIndex ]( this.value, this.model, this );\n },\n\n update: function(newValue)\n {\n this.value = newValue;\n this.updated = true;\n\n return this;\n },\n\n next: function()\n {\n var n = this.validations.length;\n\n this.linkIndex++;\n\n if (this.linkIndex === n)\n {\n this.onEnd( this );\n }\n else if (this.linkIndex < n)\n {\n this.call();\n }\n\n return this;\n },\n\n stop: function()\n {\n var n = this.validations.length;\n\n if (this.linkIndex < n)\n {\n this.linkIndex = n - 1;\n this.next();\n }\n\n return this;\n },\n\n invalid: function(message)\n {\n this.message = message;\n this.valid = false;\n this.stop();\n\n return this;\n }\n\n});\n\nfunction tryParseFloat(x)\n{\n var parsed = parseFloat( x );\n\n if ( !isNaN( parsed ) )\n {\n x = parsed;\n }\n\n return x;\n}\n\nfunction tryParseInt(x)\n{\n var parsed = parseInt( x );\n\n if ( !isNaN( parsed ) )\n {\n x = parsed;\n }\n\n return x;\n}\n\nfunction startOfDay(d)\n{\n if ( isDate( d ) )\n {\n d.setHours( 0, 0, 0, 0 );\n }\n else if ( isNumber( d ) )\n {\n d = d - (d % 86400000);\n }\n\n return d;\n}\n\nfunction endOfDay(d)\n{\n if ( isDate( d ) )\n {\n d.setHours( 23, 59, 59, 999 );\n }\n else if ( isNumber( d ) )\n {\n d = d - (d % 86400000) + 86400000 - 1;\n }\n\n return d;\n}\n\nfunction ruleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n checkNoParams( ruleName, field, params );\n\n var messageTemplate = determineMessage( ruleName, message );\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, chain ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\nfunction determineMessage(ruleName, message)\n{\n return message || Validation.Rules[ ruleName ].message;\n}\n\nfunction joinFriendly(arr, lastSeparatorCustom, itemSeparatorCustom, getAlias)\n{\n var copy = arr.slice();\n\n if ( getAlias )\n {\n for (var i = 0; i < copy.length; i++)\n {\n copy[ i ] = getAlias( copy[ i ] );\n }\n }\n\n var last = copy.pop();\n var lastSeparator = lastSeparatorCustom || 'and';\n var itemSeparator = itemSeparatorCustom || ', ';\n\n switch (copy.length) {\n case 0:\n return last;\n case 1:\n return copy[ 0 ] + ' ' + lastSeparator + ' ' + last;\n default:\n return copy.join( itemSeparator ) + itemSeparator + lastSeparator + ' ' + last;\n }\n}\n\nfunction mapFromArray(arr, value)\n{\n var map = {};\n\n for (var i = 0; i < arr.length; i++)\n {\n map[ arr[ i ] ] = value;\n }\n\n return map;\n}\n\nfunction checkNoParams(ruleName, field, params)\n{\n if ( params )\n {\n throw 'the rule ' + ruleName + ' for field ' + field + ' has no arguments';\n }\n}\n\nfunction generateMessage(field, alias, value, model, message, extra)\n{\n if ( isFunction( message ) )\n {\n message = message( field, alias, value, model, extra );\n }\n\n var base = {};\n base.$field = field;\n base.$alias = alias;\n base.$value = value;\n\n transfer( model, base );\n\n if ( isObject( extra ) )\n {\n transfer( extra, base );\n }\n\n return format( message, base );\n}\n\nRekord.addPlugin(function(model, db, options)\n{\n var validation = options.validation || Database.Defaults.validation;\n\n if ( isEmpty( validation ) )\n {\n return;\n }\n\n var rules = validation.rules || {};\n var messages = validation.messages || {};\n var aliases = validation.aliases || {};\n var required = !!validation.required;\n\n function getAlias(field)\n {\n return aliases[ field ] || field;\n }\n\n db.validations = {};\n\n for ( var field in rules )\n {\n db.validations[ field ] = Validation.parseRules( rules[ field ], field, db, getAlias, messages[ field ] );\n }\n\n Class.method( model, '$validate', function(callback, context)\n {\n this.$trigger( Model.Events.PreValidate, [this] );\n\n this.$valid = true;\n this.$validations = {};\n this.$validationMessages.length = 0;\n\n var chainEnds = 0;\n var chains = [];\n\n var onChainEnd = function(chain)\n {\n var model = chain.model;\n\n if (!chain.valid)\n {\n model.$validations[ chain.field ] = chain.message;\n model.$validationMessages.push( chain.message );\n model.$valid = false;\n }\n\n if (++chainEnds === chains.length)\n {\n model.$trigger( model.$valid ? Model.Events.ValidatePass : Model.Events.ValidateFail, [model] );\n\n if ( isFunction( callback ) )\n {\n callback.call( context || model, model.$valid );\n }\n }\n };\n\n for (var field in db.validations)\n {\n var validations = db.validations[ field ];\n var chain = new ValidationChain( this, field, validations, onChainEnd );\n\n chains.push( chain );\n }\n\n for (var i = 0; i < chains.length; i++)\n {\n chains[ i ].start();\n }\n\n return this.$valid;\n });\n\n Class.replace( model, '$init', function($init)\n {\n return function()\n {\n this.$valid = undefined;\n this.$validations = {};\n this.$validationMessages = [];\n\n return $init.apply( this, arguments );\n };\n });\n\n if ( required )\n {\n Class.replace( model, '$save', function($save)\n {\n return function()\n {\n if ( this.$isDeleted() )\n {\n Rekord.debug( Rekord.Debugs.SAVE_DELETED, this.$db, this );\n\n return Promise.resolve( this );\n }\n\n var promise = new Rekord.Promise();\n var modelInstance = this;\n var args = arguments;\n\n this.$validate(function(valid)\n {\n if (!valid)\n {\n promise.reject( modelInstance );\n }\n else\n {\n var saving = $save.apply( modelInstance, args );\n\n saving.then( promise.resolve, promise.reject, promise.noline, promise.cancel, promise );\n }\n });\n\n return promise;\n };\n });\n }\n});\n\nModel.Events.PreValidate = 'pre-validate';\n\nModel.Events.ValidatePass = 'validate-pass';\n\nModel.Events.ValidateFail = 'validate-fail';\n\nvar Validation =\n{\n Rules: {},\n Expression: {},\n Expressions: [],\n Delimiter: /([|])/,\n Escape: '\\\\',\n RuleSeparator: ':',\n Stop: {},\n\n parseRules: function(rules, field, database, getAlias, message)\n {\n var validators = [];\n\n if ( isString( rules ) )\n {\n rules = split( rules, this.Delimiter, this.Escape );\n }\n\n if ( isArray( rules ) )\n {\n for (var i = 0; i < rules.length; i++)\n {\n var rule = rules[ i ];\n var defaultMessageValidator = this.parseRule( rule, field, database, getAlias, message );\n\n validators.push( defaultMessageValidator );\n }\n }\n else if ( isObject( rules ) )\n {\n for (var ruleProperty in rules)\n {\n var ruleMessageOrData = rules[ ruleProperty ];\n\n var ruleMessage = isObject( ruleMessageOrData ) ? ruleMessageOrData.message :\n ( isString( ruleMessageOrData ) ? ruleMessageOrData : undefined );\n\n var ruleInput = isObject( ruleMessageOrData ) && ruleMessageOrData.message ? ruleMessageOrData.input :\n ( isString( ruleMessageOrData ) ? undefined : ruleMessageOrData );\n\n var customMessageValidator = this.parseRule( ruleProperty, field, database, getAlias, ruleMessage || message, ruleInput );\n\n validators.push( customMessageValidator );\n }\n }\n\n return validators;\n },\n\n parseRule: function(rule, field, database, getAlias, message, input)\n {\n var colon = rule.indexOf( this.RuleSeparator );\n var ruleName = colon === -1 ? rule : rule.substring( 0, colon );\n\n if ( ruleName.charAt( 0 ) === '$' )\n {\n return this.customValidator( ruleName, field, database, getAlias, message );\n }\n\n var ruleParams = colon === -1 ? input : rule.substring( colon + 1 );\n var validatorFactory = Validation.Rules[ ruleName ];\n\n if ( !validatorFactory )\n {\n throw ruleName + ' is not a valid rule';\n }\n\n return validatorFactory( field, ruleParams, database, getAlias, message );\n },\n\n parseExpression: function(expr, database)\n {\n var parsers = Validation.Expressions;\n\n for (var i = 0; i < parsers.length; i++)\n {\n var parser = parsers[ i ];\n var expressionFunction = parser( expr, database );\n\n if ( isFunction( expressionFunction ) )\n {\n return expressionFunction; // (value, model)\n }\n }\n\n return noop;\n },\n\n customValidator: function(functionName, field, database, getAlias, message)\n {\n return function(value, model, chain)\n {\n var result = model[ functionName ]( value, getAlias, message, chain );\n\n if ( isString( result ) )\n {\n chain.invalid( result );\n }\n else if ( result !== false )\n {\n chain.next();\n }\n };\n }\n};\n\nValidation.Expression.date =\nValidation.Expressions.push(function(expr, database)\n{\n var parsed = parseDate( expr );\n\n if ( parsed !== false )\n {\n var parsedTime = parsed.getTime();\n\n return function(value, model)\n {\n return parsedTime;\n };\n }\n}) - 1;\n\nValidation.Expression.field =\nValidation.Expressions.push(function(expr, database)\n{\n if ( indexOf( database.fields, expr ) )\n {\n return function(value, model)\n {\n return model.$get( expr );\n };\n }\n}) - 1;\n\n\nvar RELATIVE_REGEX = /^([+-]\\d+(\\.\\d+)?)\\s*(.+)$/;\n\nvar RELATIVE_UNITS = {\n ms: 1,\n millisecond: 1,\n milliseconds: 1,\n s: 1000,\n second: 1000,\n seconds: 1000,\n min: 1000 * 60,\n mins: 1000 * 60,\n minute: 1000 * 60,\n minutes: 1000 * 60,\n hr: 1000 * 60 * 60,\n hour: 1000 * 60 * 60,\n hours: 1000 * 60 * 60,\n day: 1000 * 60 * 60 * 24,\n days: 1000 * 60 * 60 * 24,\n wk: 1000 * 60 * 60 * 24 * 7,\n week: 1000 * 60 * 60 * 24 * 7,\n weeks: 1000 * 60 * 60 * 24 * 7,\n month: ['getMonth', 'setMonth'],\n months: ['getMonth', 'setMonth'],\n yr: ['getFullYear', 'setFullYear'],\n year: ['getFullYear', 'setFullYear'],\n years: ['getFullYear', 'setFullYear']\n};\n\nValidation.Expression.relative =\nValidation.Expressions.push(function(expr, database)\n{\n var parsed = RELATIVE_REGEX.exec( expr );\n\n if ( parsed !== null )\n {\n var amount = parseFloat( parsed[ 1 ] );\n var unit = parsed[ 3 ];\n var unitScale = RELATIVE_UNITS[ unit ];\n\n if ( !unitScale )\n {\n throw unit + ' is not a valid unit.';\n }\n\n return function(value, model)\n {\n var relative = new Date();\n\n if ( isNumber( unitScale ) )\n {\n relative.setTime( relative.getTime() + unitScale * amount );\n }\n else\n {\n var getter = unitScale[0];\n var setter = unitScale[1];\n\n relative[ setter ]( relative[ getter ]() + amount );\n }\n\n return relative.getTime();\n };\n }\n}) - 1;\n\nValidation.Expression.today =\nValidation.Expressions.push(function(expr, database)\n{\n if ( expr === 'today' )\n {\n return function(value, model)\n {\n var today = new Date();\n\n startOfDay( today );\n\n return today.getTime();\n };\n }\n}) - 1;\n\nValidation.Expression.tomorrow =\nValidation.Expressions.push(function(expr, database)\n{\n if ( expr === 'tomorrow' )\n {\n return function(value, model)\n {\n var tomorrow = new Date();\n\n tomorrow.setDate( tomorrow.getDate() + 1 );\n startOfDay( tomorrow );\n\n return tomorrow.getTime();\n };\n }\n}) - 1;\n\nValidation.Expression.yesterday =\nValidation.Expressions.push(function(expr, database)\n{\n if ( expr === 'yesterday' )\n {\n return function(value, model)\n {\n var yesterday = new Date();\n\n yesterday.setDate( yesterday.getDate() - 1 );\n startOfDay( yesterday );\n\n return yesterday.getTime();\n };\n }\n}) - 1;\n\n// accepted\nValidation.Rules.accepted = function(field, params, database, getAlias, message)\n{\n checkNoParams( 'accepted', field, params );\n\n var messageTemplate = determineMessage( 'accepted', message );\n var acceptable = Validation.Rules.accepted.acceptable;\n\n return function(value, model, chain)\n {\n var valueString = (value + '').toLowerCase();\n var accepted = acceptable[ valueString ];\n\n if ( !accepted )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n }\n else\n {\n chain.next();\n }\n };\n};\n\nValidation.Rules.accepted.message = '{$alias} has not been accepted.';\n\nValidation.Rules.accepted.acceptable =\n{\n '1': true,\n 'yes': true,\n 'on': true,\n 'y': true,\n 'true': true\n};\n\n// contains:field,value\ncollectionRuleGenerator('contains',\n '{$alias} does not contain an item whose {$matchAlias} equals {$matchValue}.',\n function isInvalid(value, model, matchField, matchValue, equality)\n {\n return !value.contains(function isMatch(m)\n {\n return m !== model && equality( matchValue, m.$get( matchField ) );\n });\n }\n);\n\n// not_contains:field,value\ncollectionRuleGenerator('not_contains',\n '{$alias} contains an item whose {$matchAlias} equals {$matchValue}.',\n function isInvalid(value, model, matchField, matchValue, equality)\n {\n return value.contains(function isMatch(m)\n {\n return m !== model && equality( matchValue, m.$get( matchField ) );\n });\n }\n);\n\nfunction collectionRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires field & value arguments';\n }\n\n var matchField, matchValue, equality;\n\n if ( isString( params ) )\n {\n var comma = params.indexOf(',');\n\n if ( comma === -1 )\n {\n throw ruleName + ' validation rule requires field & value arguments';\n }\n\n matchField = params.substring( 0, comma );\n matchValue = params.substring( comma + 1 );\n }\n else if ( isArray( params ) )\n {\n matchField = params[ 0 ];\n matchValue = params[ 1 ];\n equality = params[ 2 ];\n }\n else if ( isObject( params ) )\n {\n matchField = params.field;\n matchValue = params.value;\n equality = params.equals;\n }\n\n if ( !isFunction( equality ) )\n {\n equality = equalsCompare;\n }\n\n if ( indexOf( database.fields, matchField ) === -1 )\n {\n throw matchField + ' is not a valid field for the ' + ruleName + ' rule';\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $matchField: matchField,\n $matchAlias: getAlias( matchField ),\n $matchValue: matchValue\n };\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, matchField, matchValue, equality ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\nValidation.Rules.validate = function(field, params, database, getAlias, message)\n{\n // message, models, validations\n var messageOption = params || 'message';\n var messageTemplate = determineMessage( 'validate', message );\n\n return function(value, model, chain)\n {\n if ( isArray( value ) )\n {\n var invalid = new Collection();\n\n for (var i = 0; i < value.length; i++)\n {\n var related = value[ i ];\n\n if ( related && related.$validate && !related.$validate() )\n {\n invalid.push( related );\n }\n }\n\n if ( invalid.length )\n {\n switch (messageOption)\n {\n case 'models':\n chain.invalid( invalid );\n break;\n case 'validations':\n chain.invalid( invalid.pluck( '$validations', '$$key' ) );\n break;\n default: // message\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n break;\n }\n }\n else\n {\n chain.next();\n }\n }\n else\n {\n chain.next();\n }\n };\n};\n\nValidation.Rules.validate.message = '{$alias} is not valid.';\n\n// after:today\ndateRuleGenerator('after',\n '{$alias} must be after {$date}.',\n function isInvalid(value, date) {\n return value < endOfDay( date );\n }\n);\n\n// after_on:tomorrow\ndateRuleGenerator('after_on',\n '{$alias} must be after or equal to {$date}.',\n function isInvalid(value, date) {\n return value < date;\n }\n);\n\n// before:yesterday\ndateRuleGenerator('before',\n '{$alias} must be before {$date}.',\n function isInvalid(value, date) {\n return value > date;\n }\n);\n\n// before_on:+2days\ndateRuleGenerator('before_on',\n '{$alias} must be before or equal to {$date}.',\n function isInvalid(value, date) {\n return value > endOfDay( date );\n }\n);\n\n// date\nruleGenerator('date_like',\n '{$alias} must be a valid date.',\n function isInvalid(value, model, chain) {\n var parsed = parseDate( value );\n var invalid = parsed === false;\n if ( !invalid ) {\n chain.update( parsed.getTime() );\n }\n return invalid;\n }\n);\n\nfunction dateRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a date expression argument';\n }\n\n var dateExpression;\n\n if ( isString( params ) )\n {\n dateExpression = Validation.parseExpression( params, database );\n }\n else if ( isFunction( params ) )\n {\n dateExpression = params;\n }\n else\n {\n var parsed = parseDate( params );\n\n if ( parsed !== false )\n {\n var parsedTime = parsed.getTime();\n\n dateExpression = function()\n {\n return parsedTime;\n };\n }\n }\n\n if ( !dateExpression || dateExpression === noop )\n {\n throw params + ' is not a valid date expression for the ' + ruleName + ' rule';\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $date: params\n };\n\n return function(value, model, chain)\n {\n var parsed = parseDate( value );\n\n if ( parsed !== false )\n {\n value = parsed.getTime();\n\n var date = dateExpression( value, model );\n\n if ( isNumber( date ) && isInvalid( value, date ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n\n// required_if:X,Y,...\nfieldListRuleGenerator('required_if',\n '{$alias} is required.',\n function isInvalid(value, model, field, values, map) {\n var required = map[ model.$get( field ) ];\n\n return required && isEmpty( value );\n }\n);\n\n// required_unless:X,Y,...\nfieldListRuleGenerator('required_unless',\n '{$alias} is required.',\n function isInvalid(value, model, field, values, map) {\n var required = !map[ model.$get( field ) ];\n\n return required && isEmpty( value );\n }\n);\n\nfunction fieldListRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a field and list arguments';\n }\n\n var matchField, matchValues;\n\n if ( isString( params ) )\n {\n var parts = split( params, /(,)/, '\\\\' );\n\n matchField = parts.shift();\n matchValues = parts;\n }\n else if ( isArray( params ) )\n {\n matchField = params.shift();\n matchValues = params;\n }\n else if ( isObject( params ) )\n {\n matchField = params.field;\n matchValues = params.values;\n }\n\n if ( indexOf( database.fields, matchField ) === false )\n {\n throw matchField + ' is not a valid field for the ' + ruleName + ' rule';\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var list = joinFriendly( matchValues );\n var extra = {\n $params: params,\n $matchField: matchField,\n $matchAlias: getAlias( matchField ),\n $list: list\n };\n var map = mapFromArray( matchValues, true );\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, matchField, matchValues, map ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n// confirmed:X\nfieldsRuleGenerator('confirmed',\n '{$alias} must match {$fieldAliases}.',\n function isInvalid(value, model, fields, chain) {\n var confirmed = true;\n\n for (var i = 0; i < fields.length; i++)\n {\n if ( !equals( value, model.$get( fields[ i ] ) ) )\n {\n confirmed = false;\n }\n }\n\n return !confirmed;\n }\n);\n\n// different:X\nfieldsRuleGenerator('different',\n '{$alias} must not match {$fieldAliases}.',\n function isInvalid(value, model, fields, chain) {\n var different = false;\n\n for (var i = 0; i < fields.length; i++)\n {\n if ( !equals( value, model.$get( fields[ i ] ) ) )\n {\n different = true;\n }\n }\n\n return !different;\n }\n);\n\n// if_valid:X\nfieldsRuleGenerator('if_valid',\n '',\n function isInvalid(value, model, fields, chain) {\n var valid = true;\n\n for (var i = 0; i < fields.length && valid; i++)\n {\n if ( model.$validations[ fields[ i ] ] )\n {\n valid = false;\n }\n }\n\n if ( !valid )\n {\n chain.stop();\n }\n\n return false;\n }\n);\n\n// The field under validation must be present only if any of the other specified fields are present.\n// required_with:X,Y,...\nfieldsRuleGenerator('required_with',\n '{$alias} is required.',\n function isInvalid(value, model, fields, chain) {\n var required = false;\n\n for (var i = 0; i < fields.length && !required; i++)\n {\n if ( !isEmpty( model.$get( fields[ i ] ) ) )\n {\n required = true;\n }\n }\n\n return required && isEmpty( value );\n }\n);\n\n// The field under validation must be present only if all of the other specified fields are present.\n// required_with_all:X,Y,...\nfieldsRuleGenerator('required_with_all',\n '{$alias} is required.',\n function isInvalid(value, model, fields, chain) {\n var required = true;\n\n for (var i = 0; i < fields.length && required; i++)\n {\n if ( isEmpty( model.$get( fields[ i ] ) ) )\n {\n required = false;\n }\n }\n\n return required && isEmpty( value );\n }\n);\n\n// The field under validation must be present only when any of the other specified fields are not present.\n// required_without:X,Y,...\nfieldsRuleGenerator('required_without',\n '{$alias} is required.',\n function isInvalid(value, model, fields, chain) {\n var required = false;\n\n for (var i = 0; i < fields.length && !required; i++)\n {\n if ( isEmpty( model.$get( fields[ i ] ) ) )\n {\n required = true;\n }\n }\n\n return required && isEmpty( value );\n }\n);\n\n// The field under validation must be present only when all of the other specified fields are not present.\n// required_without_all:X,Y,...\nfieldsRuleGenerator('required_without_all',\n '{$alias} is required.',\n function isInvalid(value, model, fields, chain) {\n var required = true;\n\n for (var i = 0; i < fields.length && required; i++)\n {\n if ( !isEmpty( model.$get( fields[ i ] ) ) )\n {\n required = false;\n }\n }\n\n return required && isEmpty( value );\n }\n);\n\nfunction fieldsRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires an array of fields argument';\n }\n\n var fields = split( params, /(\\s*,\\s*)/, '\\\\' );\n\n for (var i = 0; i < fields.length; i++)\n {\n if ( indexOf( database.fields, fields[ i ] ) === -1 )\n {\n throw fields[ i ] + ' is not a valid field for the ' + ruleName + ' rule';\n }\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var fieldNames = joinFriendly( fields );\n var fieldAliases = joinFriendly( fields, false, false, getAlias );\n var extra = {\n $fields: fieldNames,\n $fieldAliases: fieldAliases\n };\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, fields, chain ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n// exists:X,Y\nforeignRuleGenerator('exists',\n '{$alias} must match an existing {$matchAlias} in a {$class}',\n function isInvalid(value, model, models, fieldName)\n {\n return !models.contains(function isDifferentMatch(m)\n {\n return m !== model && equals( value, m.$get( fieldName ) );\n });\n }\n);\n\n// unique:X,Y\nforeignRuleGenerator('unique',\n '{$alias} must be a unique {$matchAlias} in a {$class}',\n function isInvalid(value, model, models, fieldName)\n {\n return models.contains(function isDifferentMatch(m)\n {\n return m !== model && equals( value, m.$get( fieldName ) );\n });\n }\n);\n\n// 'ruleName'\n// 'ruleName:name'\n// 'ruleName:,field'\n// 'ruleName:name,field'\n// 'ruleName:name,field': '...'\n// 'ruleName': {input: {field: 'field', model: 'name'}, message: '...'}\n// 'ruleName': {input: {field: 'field', model: ModelClass}, message: '...'}\n// 'ruleName': {input: {field: 'field', models: [...]}, message: '...'}\n// 'ruleName': {field: 'field', model: 'name'}\n// 'ruleName': {field: 'field', model: ModelClass}\n// 'ruleName': {field: 'field', models: [...]}\nfunction foreignRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n var modelName, models, fieldName;\n\n if ( !isValue( params ) || isString( params ) )\n {\n var parts = split( params || '', /(\\s*,\\s*)/, '\\\\' );\n modelName = parts[0] || database.name;\n fieldName = parts[1] || field;\n models = null;\n }\n else if ( isArray( params ) )\n {\n modelName = isString( params[0] ) ? params.shift() : database.name;\n fieldName = isString( params[0] ) ? params.shift() : field;\n models = new ModelCollection( database, params );\n }\n else if ( isObject( params ) )\n {\n modelName = params.model || database.name;\n fieldName = params.field || field;\n models = params.models;\n }\n\n if ( !models )\n {\n if ( !modelName )\n {\n throw 'model, model class, or models is required for ' + ruleName + ' rule';\n }\n\n if ( isString( modelName ) )\n {\n Rekord.get( modelName ).success(function(modelClass)\n {\n models = modelClass.all();\n });\n }\n else if ( isRekord( modelName ) )\n {\n models = modelName.all();\n }\n }\n\n if ( indexOf( database.fields, fieldName ) === false )\n {\n throw fieldName + ' is not a valid field for the ' + ruleName + ' rule';\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $class: modelName,\n $matchField: fieldName,\n $matchAlias: getAlias( fieldName )\n };\n\n return function(value, model, chain)\n {\n if ( models && isValue( value ) )\n {\n if ( isInvalid( value, model, models, fieldName ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n// if:due_date:before:today|required\n\n// if all rules pass for the given field, continue with remaining rules\nsubRuleGenerator('if',\n function isInvalid(invalidCount, totalCount) {\n return invalidCount > 0;\n }\n);\n\n// if any rules pass for the given field, continue with remaining rules\nsubRuleGenerator('if_any',\n function isInvalid(invalidCount, totalCount) {\n return invalidCount >= totalCount;\n }\n);\n\n// if no rules pass for the given field, continue with remaining rules\nsubRuleGenerator('if_not',\n function isInvalid(invalidCount, totalCount) {\n return invalidCount < totalCount;\n }\n);\n\n\n\nfunction subRuleGenerator(ruleName, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a validation rule argument';\n }\n\n var otherField, otherRules;\n\n if ( isString( params ) )\n {\n var colon = params.indexOf( ':' );\n\n if ( colon === -1 )\n {\n throw params + ' is not a valid argument for the ' + ruleName + ' rule';\n }\n\n otherField = params.substring( 0, colon ) || field;\n otherRules = params.substring( colon + 1 );\n }\n else if ( isArray( params ) )\n {\n otherField = params.shift() || field;\n otherRules = params;\n }\n else if ( isObject( params ) )\n {\n otherField = params.field || field;\n otherRules = params.rules;\n }\n\n if ( indexOf( database.fields, otherField ) === -1 )\n {\n throw otherField + ' is not a valid field for the ' + ruleName + ' rule';\n }\n\n if ( !otherRules )\n {\n throw 'rules are required for the ' + ruleName + ' rule';\n }\n\n var validators = Validation.parseRules( otherRules, otherField, database, getAlias );\n\n return function(value, model, chain)\n {\n var invalids = 0;\n var chainCount = 0;\n\n var onChainEnd = function(innerChain)\n {\n if (!innerChain.valid)\n {\n invalids++;\n }\n\n if (++chainCount === validators.length)\n {\n if ( isInvalid( invalids, chainCount ) )\n {\n chain.stop();\n }\n else\n {\n chain.next();\n }\n }\n };\n\n var testValue = otherField === field ? value : model.$get( otherField );\n\n for (var i = 0; i < validators.length; i++)\n {\n var innerChain = new ValidationChain( model, otherField, [validators[ i ]], onChainEnd );\n\n innerChain.start( testValue );\n }\n };\n };\n}\n\n// in:X,Y,Z,...\nlistRuleGenerator('in',\n '{$alias} must be one of {$list}.',\n function isInvalid(value, model, inList)\n {\n return !inList( value, model );\n }\n);\n\n// not_in:X,Y,Z,...\nlistRuleGenerator('not_in',\n '{$alias} must not be one of {$list}.',\n function isInvalid(value, model, inList)\n {\n return inList( value, model );\n }\n);\n\nfunction listRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a list argument';\n }\n\n var values, inList = false;\n\n if ( isString( params ) )\n {\n values = split( params, /(,)/, '\\\\' );\n }\n else if ( isArray( params ) )\n {\n values = params;\n }\n else if ( isFunction( params ) )\n {\n values = inList;\n }\n\n if ( inList !== false )\n {\n if ( !values || values.length === 0 )\n {\n throw params + ' is not a valid list of values for the ' + ruleName + ' rule';\n }\n }\n\n if ( isPrimitiveArray( values ) )\n {\n var map = mapFromArray( values, true );\n\n inList = function(value)\n {\n return map[ value ];\n };\n }\n else\n {\n inList = function(value)\n {\n return indexOf( values, value, equals );\n };\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var list = joinFriendly( values, 'or' );\n var extra = {\n $params: params,\n $list: list\n };\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, inList ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n// between:3,10\nrangeRuleGenerator('between', {\n 'string': '{$alias} must have between {$start} to {$end} characters.',\n 'number': '{$alias} must be between {$start} and {$end}.',\n 'object': '{$alias} must have between {$start} to {$end} items.'\n },\n function isInvalid(value, start, end) {\n return value < start || value > end;\n }\n);\n\n// not_between\nrangeRuleGenerator('not_between', {\n 'string': '{$alias} must not have between {$start} to {$end} characters.',\n 'number': '{$alias} must not be between {$start} and {$end}.',\n 'object': '{$alias} must not have between {$start} to {$end} items.'\n },\n function isInvalid(value, start, end) {\n return value >= start && value <= end;\n }\n);\n\nfunction rangeRuleGenerator(ruleName, defaultMessages, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a range argument';\n }\n\n var start, end;\n\n if ( isString( params ) )\n {\n var range = split( params, /(\\s*,\\s*)/, '\\\\' );\n\n start = parseFloat( range[0] );\n end = parseFloat( range[1] );\n }\n else if ( isArray( params ) )\n {\n start = params[ 0 ];\n end = params[ 1 ];\n }\n else if ( isObject( params ) )\n {\n start = params.start;\n end = params.end;\n }\n\n if ( isNaN( start ) || isNaN( end ) )\n {\n throw params + ' is not a valid range of numbers for the ' + ruleName + ' rule';\n }\n\n if ( isString( message ) )\n {\n message = {\n 'string': message,\n 'number': message,\n 'object': message\n };\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $start: start,\n $end: end\n };\n\n return function(value, model, chain)\n {\n var size = sizeof( value );\n var type = typeof( value );\n var typeMessage = messageTemplate[ type ];\n\n if ( typeMessage && isInvalid( size, start, end ) )\n {\n extra.$size = size;\n\n chain.invalid( generateMessage( field, getAlias( field ), value, model, typeMessage, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessages;\n}\n\n\n\nregexRuleGenerator('alpha',\n '{$alias} should only contain alphabetic characters.',\n /^[a-zA-Z]*$/\n);\n\nregexRuleGenerator('alpha_dash',\n '{$alias} should only contain alpha-numeric characters, dashes, and underscores.',\n /^[a-zA-Z0-9_-]*$/\n);\n\nregexRuleGenerator('alpha_num',\n '{$alias} should only contain alpha-numeric characters.',\n /^[a-zA-Z0-9]*$/\n);\n\nregexRuleGenerator('email',\n '{$alias} is not a valid email.',\n /^.+@.+\\..+$/\n);\n\nregexRuleGenerator('url',\n '{$alias} is not a valid URL.',\n /^(https?:\\/\\/)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)$/\n);\n\nregexRuleGenerator('uri',\n '{$alias} is not a valid URI.',\n /^(\\w+:\\/\\/)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)$/\n);\n\nregexRuleGenerator('phone',\n '{$alias} is not a valid phone number.',\n /^1?\\W*([2-9][0-8][0-9])\\W*([2-9][0-9]{2})\\W*([0-9]{4})(\\se?x?t?(\\d*))?$/\n);\n\nfunction regexRuleGenerator(ruleName, defaultMessage, regex)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n checkNoParams( ruleName, field, params );\n\n var messageTemplate = determineMessage( ruleName, message );\n\n return function(value, model, chain)\n {\n if ( !regex.test( value ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n }\n else\n {\n chain.next();\n }\n\n return value;\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\nValidation.Rules.regex = function(field, params, database, getAlias, message)\n{\n var regex;\n\n if ( isString( params ) )\n {\n var parsed = /^\\/(.*)\\/([gmi]*)$/.exec( params );\n\n if ( parsed )\n {\n regex = new RegExp( parsed[1], parsed[2] );\n }\n }\n else if ( isRegExp( params ) )\n {\n regex = params;\n }\n\n if ( !regex )\n {\n throw params + ' is not a valid regular expression for the regex rule';\n }\n\n var messageTemplate = determineMessage( 'regex', message );\n\n return function(value, model, chain)\n {\n if ( !regex.test( value ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n }\n else\n {\n chain.next();\n }\n };\n};\n\nValidation.Rules.regex.message = '{$alias} is not a valid value.';\n\n// required\nruleGenerator('required',\n '{$alias} is required.',\n function isInvalid(value) {\n return isEmpty( value );\n }\n);\n\n// min:3\nsizeRuleGenerator('min', {\n 'string': '{$alias} must have a minimum of {$number} characters.',\n 'number': '{$alias} must be at least {$number}.',\n 'object': '{$alias} must have at least {$number} items.'\n },\n function isInvalid(value, number) {\n return value < number;\n }\n);\n\n// greater_than:0\nsizeRuleGenerator('greater_than', {\n 'string': '{$alias} must have more than {$number} characters.',\n 'number': '{$alias} must be greater than {$number}.',\n 'object': '{$alias} must have more than {$number} items.'\n },\n function isInvalid(value, number) {\n return value <= number;\n }\n);\n\n// max:10\nsizeRuleGenerator('max', {\n 'string': '{$alias} must have no more than {$number} characters.',\n 'number': '{$alias} must be no more than {$number}.',\n 'object': '{$alias} must have no more than {$number} items.'\n },\n function isInvalid(value, number) {\n return value > number;\n }\n);\n\n// less_than:5\nsizeRuleGenerator('less_than', {\n 'string': '{$alias} must have less than {$number} characters.',\n 'number': '{$alias} must be less than {$number}.',\n 'object': '{$alias} must have less than {$number} items.'\n },\n function isInvalid(value, number) {\n return value >= number;\n }\n);\n\n// equal:4.5\nsizeRuleGenerator('equal', {\n 'string': '{$alias} must have {$number} characters.',\n 'number': '{$alias} must equal {$number}.',\n 'object': '{$alias} must have {$number} items.'\n },\n function isInvalid(value, number) {\n return value !== number;\n }\n);\n\n// not_equal:0\nsizeRuleGenerator('not_equal', {\n 'string': '{$alias} must not have {$number} characters.',\n 'number': '{$alias} must not equal {$number}.',\n 'object': '{$alias} must not have {$number} items.'\n },\n function isInvalid(value, number) {\n return value === number;\n }\n);\n\nfunction sizeRuleGenerator(ruleName, defaultMessages, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n var number;\n\n if ( isString( params ) )\n {\n number = parseFloat( params );\n }\n else if ( isNumber( params ) )\n {\n number = params;\n }\n\n if ( isNaN( number ) )\n {\n throw '\"' + params + '\" is not a valid number for the ' + ruleName + ' rule';\n }\n\n if ( isString( message ) )\n {\n message = {\n 'string': message,\n 'number': message,\n 'object': message\n };\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $number: params\n };\n\n return function(value, model, chain)\n {\n var size = sizeof( value );\n var type = typeof( value );\n var typeMessage = messageTemplate[ type ];\n\n if ( typeMessage && isInvalid( size, number ) )\n {\n extra.$size = size;\n\n chain.invalid( generateMessage( field, getAlias( field ), value, model, typeMessage, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessages;\n}\n\n\nruleGenerator('array',\n '{$alias} must be an array.',\n function isInvalid(value) {\n return !isArray( value );\n }\n);\n\nruleGenerator('object',\n '{$alias} must be an object.',\n function isInvalid(value) {\n return !isObject( value );\n }\n);\n\nruleGenerator('string',\n '{$alias} must be a string.',\n function isInvalid(value) {\n return !isString( value );\n }\n);\n\nruleGenerator('number',\n '{$alias} must be a number.',\n function isInvalid(value) {\n return !isNumber( value );\n }\n);\n\nruleGenerator('boolean',\n '{$alias} must be a true or false.',\n function isInvalid(value) {\n return !isBoolean( value );\n }\n);\n\nruleGenerator('model',\n '{$alias} must have a value.',\n function isInvalid(value) {\n return !(value instanceof Model);\n }\n);\n\nruleGenerator('whole',\n '{$alias} must be a whole number.',\n function isInvalid(value, model, chain) {\n var parsed = tryParseInt( value );\n var numeric = parseFloat( value );\n var invalid = !isNumber( parsed );\n if ( !invalid ) {\n invalid = Math.floor( parsed ) !== numeric;\n if ( !invalid ) {\n chain.update( parsed );\n }\n }\n return invalid;\n }\n);\n\nruleGenerator('numeric',\n '{$alias} must be numeric.',\n function isInvalid(value, model, chain) {\n var parsed = tryParseFloat( value );\n var invalid = !isNumber( parsed );\n if ( !invalid ) {\n chain.update( parsed );\n }\n return invalid;\n }\n);\n\nruleGenerator('yesno',\n '{$alias} must be a yes or no.',\n function isInvalid(value, model, chain) {\n var mapped = Validation.Rules.yesno.map[ value ];\n var invalid = !isBoolean( mapped );\n if ( !invalid ) {\n chain.update( mapped );\n }\n return invalid;\n }\n);\n\nValidation.Rules.yesno.map =\n{\n 'true': true,\n 't': true,\n 'yes': true,\n 'y': true,\n '1': true,\n 'false': false,\n 'f': false,\n 'no': false,\n 'n': false,\n '0': false\n};\n\nValidation.Rules.abs = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( Math.abs( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.apply = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n model.$set( field, value );\n\n chain.next();\n };\n};\n\nValidation.Rules.base64 = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( global.btoa )\n {\n chain.update( global.btoa( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.ceil = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( Math.ceil( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.endOfDay = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n chain.update( endOfDay( value ) );\n \n chain.next();\n };\n};\n\nValidation.Rules.filter = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( isArray( value ) )\n {\n for (var i = value.length - 1; i >= 0; i--)\n {\n if ( !isValue( value[ i ] ) )\n {\n value.splice( i, 1 );\n }\n }\n\n chain.update( value );\n }\n else if ( isObject( value ) )\n {\n for (var prop in value)\n {\n if ( !isValue( value[ prop ] ) )\n {\n delete value[ prop ];\n }\n }\n\n chain.update( value );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.floor = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( Math.floor( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.mod = function(field, params, database, alias, message)\n{\n var number = tryParseFloat( params );\n\n if ( !isNumber( number ) )\n {\n throw '\"' + number + '\" is not a valid number for the mod rule.';\n }\n\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( value % number );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.null = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n model.$set( field, null );\n\n chain.update( null );\n\n chain.next();\n };\n};\n\nValidation.Rules.round = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( Math.round( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.startOfDay = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n chain.update( startOfDay( value ) );\n\n chain.next();\n };\n};\n\nValidation.Rules.stripEnts = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( isString( value ) )\n {\n chain.update( value.replace( /&[a-z]+;/gi, '' ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.stripTags = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( isString( value ) )\n {\n chain.update( value.replace( /<(?:.|\\n)*?>/gm, '' ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.trim = function(field, params, database, alias, message)\n{\n var trim = (function()\n {\n if ( String.prototype.trim )\n {\n return function(x) {\n return x.trim();\n };\n }\n\n var regex = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n return function(x)\n {\n return x.replace( regex, '' );\n };\n\n })();\n\n return function(value, model, chain)\n {\n if ( isString( value ) )\n {\n chain.update( trim( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.unbase64 = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( global.atob )\n {\n chain.update( global.atob( value ) );\n }\n\n chain.next();\n };\n};\n\n\n Rekord.Validation = Validation;\n\n Rekord.ruleGenerator = ruleGenerator;\n Rekord.rangeRuleGenerator = rangeRuleGenerator;\n Rekord.collectionRuleGenerator = collectionRuleGenerator;\n Rekord.dateRuleGenerator = dateRuleGenerator;\n Rekord.fieldListRuleGenerator = fieldListRuleGenerator;\n Rekord.fieldsRuleGenerator = fieldsRuleGenerator;\n Rekord.foreignRuleGenerator = foreignRuleGenerator;\n Rekord.subRuleGenerator = subRuleGenerator;\n Rekord.listRuleGenerator = listRuleGenerator;\n Rekord.regexRuleGenerator = regexRuleGenerator;\n Rekord.sizeRuleGenerator = sizeRuleGenerator;\n\n Rekord.joinFriendly = joinFriendly;\n Rekord.tryParseFloat = tryParseFloat;\n Rekord.tryParseInt = tryParseInt;\n Rekord.startOfDay = startOfDay;\n Rekord.endOfDay = endOfDay;\n Rekord.determineMessage = determineMessage;\n Rekord.mapFromArray = mapFromArray;\n Rekord.checkNoParams = checkNoParams;\n Rekord.generateMessage = generateMessage;\n\n return Rekord;\n\n}));\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["rekord-validation.min.js"],"names":["root","factory","define","amd","Rekord","module","exports","global","require","this","undefined","ValidationChain","model","field","validations","onEnd","tryParseFloat","x","parsed","parseFloat","isNaN","tryParseInt","parseInt","startOfDay","d","isDate","setHours","isNumber","endOfDay","ruleGenerator","ruleName","defaultMessage","isInvalid","Validation","Rules","params","database","getAlias","message","checkNoParams","messageTemplate","determineMessage","value","chain","invalid","generateMessage","next","joinFriendly","arr","lastSeparatorCustom","itemSeparatorCustom","copy","slice","i","length","last","pop","lastSeparator","itemSeparator","join","mapFromArray","map","alias","extra","isFunction","base","$field","$alias","$value","transfer","isObject","format","collectionRuleGenerator","matchField","matchValue","equality","isString","comma","indexOf","substring","isArray","equals","equalsCompare","fields","$matchField","$matchAlias","$matchValue","dateRuleGenerator","dateExpression","parseExpression","parseDate","parsedTime","getTime","noop","$date","date","fieldListRuleGenerator","matchValues","parts","split","shift","values","list","$params","$list","fieldsRuleGenerator","fieldNames","fieldAliases","$fields","$fieldAliases","foreignRuleGenerator","modelName","models","fieldName","isValue","name","ModelCollection","get","success","modelClass","all","isRekord","$class","subRuleGenerator","otherField","otherRules","colon","rules","validators","parseRules","invalids","chainCount","onChainEnd","innerChain","valid","stop","testValue","$get","start","listRuleGenerator","inList","isPrimitiveArray","rangeRuleGenerator","defaultMessages","end","range","string","number","object","$start","$end","size","sizeof","type","typeMessage","$size","regexRuleGenerator","regex","test","sizeRuleGenerator","$number","Model","Database","Promise","Collection","Class","isEmpty","isBoolean","isRegExp","create","reset","updated","linkIndex","call","update","newValue","n","addPlugin","db","options","aliases","validation","Defaults","messages","required","method","callback","context","$trigger","Events","PreValidate","$valid","$validations","$validationMessages","chainEnds","chains","push","ValidatePass","ValidateFail","replace","$init","apply","arguments","$save","$isDeleted","debug","Debugs","SAVE_DELETED","$db","resolve","promise","modelInstance","args","$validate","saving","then","reject","noline","cancel","Expression","Expressions","Delimiter","Escape","RuleSeparator","Stop","callRules","rule","defaultMessageValidator","parseRule","ruleProperty","ruleMessageOrData","ruleMessage","ruleInput","input","customMessageValidator","charAt","customValidator","ruleParams","validatorFactory","expr","parsers","parser","expressionFunction","functionName","result","RELATIVE_REGEX","RELATIVE_UNITS","ms","millisecond","milliseconds","s","second","seconds","min","mins","minute","minutes","hr","hour","hours","day","days","wk","week","weeks","month","months","yr","year","years","relative","exec","amount","unit","unitScale","Date","setTime","getter","setter","today","tomorrow","setDate","getDate","yesterday","accepted","acceptable","valueString","toLowerCase","1","yes","on","y","true","contains","m","validate","messageOption","related","pluck","confirmed","different","invalidCount","totalCount","RegExp","numeric","Math","floor","mapped","yesno","t","false","f","no","0","abs","$set","base64","btoa","ceil","filter","splice","prop","mod","round","stripEnts","stripTags","trim","String","prototype","unbase64","atob"],"mappings":"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","file":"rekord-validation.min.js","sourcesContent":["/* rekord-validation 1.5.6 - Advanced validation rules for rekord by Philip Diffenderfer */\n// UMD (Universal Module Definition)\n(function (root, factory)\n{\n if (typeof define === 'function' && define.amd) // jshint ignore:line\n {\n // AMD. Register as an anonymous module.\n define(['rekord'], function(Rekord) { // jshint ignore:line\n return factory(root, Rekord);\n });\n }\n else if (typeof module === 'object' && module.exports) // jshint ignore:line\n {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory(global, require('rekord')); // jshint ignore:line\n }\n else\n {\n // Browser globals (root is window)\n root.Rekord = factory(root, root.Rekord);\n }\n}(this, function(global, Rekord, undefined)\n{\n\n var Model = Rekord.Model;\n var Database = Rekord.Database;\n var Promise = Rekord.Promise;\n var Collection = Rekord.Collection;\n var ModelCollection = Rekord.ModelCollection;\n var Class = Rekord.Class;\n\n var isEmpty = Rekord.isEmpty;\n var isString = Rekord.isString;\n var isArray = Rekord.isArray;\n var isObject = Rekord.isObject;\n var isFunction = Rekord.isFunction;\n var isDate = Rekord.isDate;\n var isNumber = Rekord.isNumber;\n var isBoolean = Rekord.isBoolean;\n var isValue = Rekord.isValue;\n var isPrimitiveArray = Rekord.isPrimitiveArray;\n var isRegExp = Rekord.isRegExp;\n var isRekord = Rekord.isRekord;\n\n var noop = Rekord.noop;\n var equalsCompare = Rekord.equalsCompare;\n var equals = Rekord.equals;\n var indexOf = Rekord.indexOf;\n var sizeof = Rekord.sizeof;\n\n var split = Rekord.split;\n var transfer = Rekord.transfer;\n var format = Rekord.format;\n\n var parseDate = Rekord.parseDate;\n\n\nfunction ValidationChain(model, field, validations, onEnd)\n{\n this.model = model;\n this.field = field;\n this.validations = validations;\n this.onEnd = onEnd;\n}\n\nClass.create( ValidationChain,\n{\n\n reset: function(value)\n {\n this.value = value !== undefined ? value : this.model.$get( this.field );\n this.updated = false;\n this.valid = true;\n this.message = '';\n this.linkIndex = 0;\n },\n\n start: function(value)\n {\n this.reset( value );\n this.call();\n },\n\n call: function()\n {\n this.validations[ this.linkIndex ]( this.value, this.model, this );\n },\n\n update: function(newValue)\n {\n this.value = newValue;\n this.updated = true;\n\n return this;\n },\n\n next: function()\n {\n var n = this.validations.length;\n\n this.linkIndex++;\n\n if (this.linkIndex === n)\n {\n this.onEnd( this );\n }\n else if (this.linkIndex < n)\n {\n this.call();\n }\n\n return this;\n },\n\n stop: function()\n {\n var n = this.validations.length;\n\n if (this.linkIndex < n)\n {\n this.linkIndex = n - 1;\n this.next();\n }\n\n return this;\n },\n\n invalid: function(message)\n {\n this.message = message;\n this.valid = false;\n this.stop();\n\n return this;\n }\n\n});\n\nfunction tryParseFloat(x)\n{\n var parsed = parseFloat( x );\n\n if ( !isNaN( parsed ) )\n {\n x = parsed;\n }\n\n return x;\n}\n\nfunction tryParseInt(x)\n{\n var parsed = parseInt( x );\n\n if ( !isNaN( parsed ) )\n {\n x = parsed;\n }\n\n return x;\n}\n\nfunction startOfDay(d)\n{\n if ( isDate( d ) )\n {\n d.setHours( 0, 0, 0, 0 );\n }\n else if ( isNumber( d ) )\n {\n d = d - (d % 86400000);\n }\n\n return d;\n}\n\nfunction endOfDay(d)\n{\n if ( isDate( d ) )\n {\n d.setHours( 23, 59, 59, 999 );\n }\n else if ( isNumber( d ) )\n {\n d = d - (d % 86400000) + 86400000 - 1;\n }\n\n return d;\n}\n\nfunction ruleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n checkNoParams( ruleName, field, params );\n\n var messageTemplate = determineMessage( ruleName, message );\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, chain ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\nfunction determineMessage(ruleName, message)\n{\n return message || Validation.Rules[ ruleName ].message;\n}\n\nfunction joinFriendly(arr, lastSeparatorCustom, itemSeparatorCustom, getAlias)\n{\n var copy = arr.slice();\n\n if ( getAlias )\n {\n for (var i = 0; i < copy.length; i++)\n {\n copy[ i ] = getAlias( copy[ i ] );\n }\n }\n\n var last = copy.pop();\n var lastSeparator = lastSeparatorCustom || 'and';\n var itemSeparator = itemSeparatorCustom || ', ';\n\n switch (copy.length) {\n case 0:\n return last;\n case 1:\n return copy[ 0 ] + ' ' + lastSeparator + ' ' + last;\n default:\n return copy.join( itemSeparator ) + itemSeparator + lastSeparator + ' ' + last;\n }\n}\n\nfunction mapFromArray(arr, value)\n{\n var map = {};\n\n for (var i = 0; i < arr.length; i++)\n {\n map[ arr[ i ] ] = value;\n }\n\n return map;\n}\n\nfunction checkNoParams(ruleName, field, params)\n{\n if ( params )\n {\n throw 'the rule ' + ruleName + ' for field ' + field + ' has no arguments';\n }\n}\n\nfunction generateMessage(field, alias, value, model, message, extra)\n{\n if ( isFunction( message ) )\n {\n message = message( field, alias, value, model, extra );\n }\n\n var base = {};\n base.$field = field;\n base.$alias = alias;\n base.$value = value;\n\n transfer( model, base );\n\n if ( isObject( extra ) )\n {\n transfer( extra, base );\n }\n\n return format( message, base );\n}\n\nRekord.addPlugin(function(model, db, options)\n{\n var validation = options.validation || Database.Defaults.validation;\n\n if ( isEmpty( validation ) )\n {\n return;\n }\n\n var rules = validation.rules || {};\n var messages = validation.messages || {};\n var aliases = validation.aliases || {};\n var required = !!validation.required;\n\n function getAlias(field)\n {\n return aliases[ field ] || field;\n }\n\n db.validations = {};\n\n for ( var field in rules )\n {\n db.validations[ field ] = Validation.parseRules( rules[ field ], field, db, getAlias, messages[ field ] );\n }\n\n Class.method( model, '$validate', function(callback, context)\n {\n this.$trigger( Model.Events.PreValidate, [this] );\n\n this.$valid = true;\n this.$validations = {};\n this.$validationMessages.length = 0;\n\n var chainEnds = 0;\n var chains = [];\n\n var onChainEnd = function(chain)\n {\n var model = chain.model;\n\n if (!chain.valid)\n {\n model.$validations[ chain.field ] = chain.message;\n model.$validationMessages.push( chain.message );\n model.$valid = false;\n }\n\n if (++chainEnds === chains.length)\n {\n model.$trigger( model.$valid ? Model.Events.ValidatePass : Model.Events.ValidateFail, [model] );\n\n if ( isFunction( callback ) )\n {\n callback.call( context || model, model.$valid );\n }\n }\n };\n\n for (var field in db.validations)\n {\n var validations = db.validations[ field ];\n var chain = new ValidationChain( this, field, validations, onChainEnd );\n\n chains.push( chain );\n }\n\n for (var i = 0; i < chains.length; i++)\n {\n chains[ i ].start();\n }\n\n return this.$valid;\n });\n\n Class.replace( model, '$init', function($init)\n {\n return function()\n {\n this.$valid = undefined;\n this.$validations = {};\n this.$validationMessages = [];\n\n return $init.apply( this, arguments );\n };\n });\n\n if ( required )\n {\n Class.replace( model, '$save', function($save)\n {\n return function()\n {\n if ( this.$isDeleted() )\n {\n Rekord.debug( Rekord.Debugs.SAVE_DELETED, this.$db, this );\n\n return Promise.resolve( this );\n }\n\n var promise = new Rekord.Promise();\n var modelInstance = this;\n var args = arguments;\n\n this.$validate(function(valid)\n {\n if (!valid)\n {\n promise.reject( modelInstance );\n }\n else\n {\n var saving = $save.apply( modelInstance, args );\n\n saving.then( promise.resolve, promise.reject, promise.noline, promise.cancel, promise );\n }\n });\n\n return promise;\n };\n });\n }\n});\n\nModel.Events.PreValidate = 'pre-validate';\n\nModel.Events.ValidatePass = 'validate-pass';\n\nModel.Events.ValidateFail = 'validate-fail';\n\nvar Validation =\n{\n Rules: {},\n Expression: {},\n Expressions: [],\n Delimiter: /([|])/,\n Escape: '\\\\',\n RuleSeparator: ':',\n Stop: {},\n\n callRules: function(rules, message, field, database, getAlias)\n {\n var validations = this.parseRules( rules, field, database, getAlias, message );\n\n return function (value)\n {\n var onChainEnd = function() {};\n var model = {\n $get: function () {\n return value;\n },\n };\n \n var chain = new ValidationChain( model, field, validations, onChainEnd );\n\n chain.start();\n\n return chain;\n };\n },\n\n parseRules: function(rules, field, database, getAlias, message)\n {\n var validators = [];\n\n if ( isString( rules ) )\n {\n rules = split( rules, this.Delimiter, this.Escape );\n }\n\n if ( isArray( rules ) )\n {\n for (var i = 0; i < rules.length; i++)\n {\n var rule = rules[ i ];\n var defaultMessageValidator = this.parseRule( rule, field, database, getAlias, message );\n\n validators.push( defaultMessageValidator );\n }\n }\n else if ( isObject( rules ) )\n {\n for (var ruleProperty in rules)\n {\n var ruleMessageOrData = rules[ ruleProperty ];\n\n var ruleMessage = isObject( ruleMessageOrData ) ? ruleMessageOrData.message :\n ( isString( ruleMessageOrData ) ? ruleMessageOrData : undefined );\n\n var ruleInput = isObject( ruleMessageOrData ) && ruleMessageOrData.message ? ruleMessageOrData.input :\n ( isString( ruleMessageOrData ) ? undefined : ruleMessageOrData );\n\n var customMessageValidator = this.parseRule( ruleProperty, field, database, getAlias, ruleMessage || message, ruleInput );\n\n validators.push( customMessageValidator );\n }\n }\n\n return validators;\n },\n\n parseRule: function(rule, field, database, getAlias, message, input)\n {\n var colon = rule.indexOf( this.RuleSeparator );\n var ruleName = colon === -1 ? rule : rule.substring( 0, colon );\n\n if ( ruleName.charAt( 0 ) === '$' )\n {\n return this.customValidator( ruleName, field, database, getAlias, message );\n }\n\n var ruleParams = colon === -1 ? input : rule.substring( colon + 1 );\n var validatorFactory = Validation.Rules[ ruleName ];\n\n if ( !validatorFactory )\n {\n throw ruleName + ' is not a valid rule';\n }\n\n return validatorFactory( field, ruleParams, database, getAlias, message );\n },\n\n parseExpression: function(expr, database)\n {\n var parsers = Validation.Expressions;\n\n for (var i = 0; i < parsers.length; i++)\n {\n var parser = parsers[ i ];\n var expressionFunction = parser( expr, database );\n\n if ( isFunction( expressionFunction ) )\n {\n return expressionFunction; // (value, model)\n }\n }\n\n return noop;\n },\n\n customValidator: function(functionName, field, database, getAlias, message)\n {\n return function(value, model, chain)\n {\n var result = model[ functionName ]( value, getAlias, message, chain );\n\n if ( isString( result ) )\n {\n chain.invalid( result );\n }\n else if ( result !== false )\n {\n chain.next();\n }\n };\n }\n};\n\nValidation.Expression.date =\nValidation.Expressions.push(function(expr, database)\n{\n var parsed = parseDate( expr );\n\n if ( parsed !== false )\n {\n var parsedTime = parsed.getTime();\n\n return function(value, model)\n {\n return parsedTime;\n };\n }\n}) - 1;\n\nValidation.Expression.field =\nValidation.Expressions.push(function(expr, database)\n{\n if ( indexOf( database.fields, expr ) )\n {\n return function(value, model)\n {\n return model.$get( expr );\n };\n }\n}) - 1;\n\n\nvar RELATIVE_REGEX = /^([+-]\\d+(\\.\\d+)?)\\s*(.+)$/;\n\nvar RELATIVE_UNITS = {\n ms: 1,\n millisecond: 1,\n milliseconds: 1,\n s: 1000,\n second: 1000,\n seconds: 1000,\n min: 1000 * 60,\n mins: 1000 * 60,\n minute: 1000 * 60,\n minutes: 1000 * 60,\n hr: 1000 * 60 * 60,\n hour: 1000 * 60 * 60,\n hours: 1000 * 60 * 60,\n day: 1000 * 60 * 60 * 24,\n days: 1000 * 60 * 60 * 24,\n wk: 1000 * 60 * 60 * 24 * 7,\n week: 1000 * 60 * 60 * 24 * 7,\n weeks: 1000 * 60 * 60 * 24 * 7,\n month: ['getMonth', 'setMonth'],\n months: ['getMonth', 'setMonth'],\n yr: ['getFullYear', 'setFullYear'],\n year: ['getFullYear', 'setFullYear'],\n years: ['getFullYear', 'setFullYear']\n};\n\nValidation.Expression.relative =\nValidation.Expressions.push(function(expr, database)\n{\n var parsed = RELATIVE_REGEX.exec( expr );\n\n if ( parsed !== null )\n {\n var amount = parseFloat( parsed[ 1 ] );\n var unit = parsed[ 3 ];\n var unitScale = RELATIVE_UNITS[ unit ];\n\n if ( !unitScale )\n {\n throw unit + ' is not a valid unit.';\n }\n\n return function(value, model)\n {\n var relative = new Date();\n\n if ( isNumber( unitScale ) )\n {\n relative.setTime( relative.getTime() + unitScale * amount );\n }\n else\n {\n var getter = unitScale[0];\n var setter = unitScale[1];\n\n relative[ setter ]( relative[ getter ]() + amount );\n }\n\n return relative.getTime();\n };\n }\n}) - 1;\n\nValidation.Expression.today =\nValidation.Expressions.push(function(expr, database)\n{\n if ( expr === 'today' )\n {\n return function(value, model)\n {\n var today = new Date();\n\n startOfDay( today );\n\n return today.getTime();\n };\n }\n}) - 1;\n\nValidation.Expression.tomorrow =\nValidation.Expressions.push(function(expr, database)\n{\n if ( expr === 'tomorrow' )\n {\n return function(value, model)\n {\n var tomorrow = new Date();\n\n tomorrow.setDate( tomorrow.getDate() + 1 );\n startOfDay( tomorrow );\n\n return tomorrow.getTime();\n };\n }\n}) - 1;\n\nValidation.Expression.yesterday =\nValidation.Expressions.push(function(expr, database)\n{\n if ( expr === 'yesterday' )\n {\n return function(value, model)\n {\n var yesterday = new Date();\n\n yesterday.setDate( yesterday.getDate() - 1 );\n startOfDay( yesterday );\n\n return yesterday.getTime();\n };\n }\n}) - 1;\n\n// accepted\nValidation.Rules.accepted = function(field, params, database, getAlias, message)\n{\n checkNoParams( 'accepted', field, params );\n\n var messageTemplate = determineMessage( 'accepted', message );\n var acceptable = Validation.Rules.accepted.acceptable;\n\n return function(value, model, chain)\n {\n var valueString = (value + '').toLowerCase();\n var accepted = acceptable[ valueString ];\n\n if ( !accepted )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n }\n else\n {\n chain.next();\n }\n };\n};\n\nValidation.Rules.accepted.message = '{$alias} has not been accepted.';\n\nValidation.Rules.accepted.acceptable =\n{\n '1': true,\n 'yes': true,\n 'on': true,\n 'y': true,\n 'true': true\n};\n\n// contains:field,value\ncollectionRuleGenerator('contains',\n '{$alias} does not contain an item whose {$matchAlias} equals {$matchValue}.',\n function isInvalid(value, model, matchField, matchValue, equality)\n {\n return !value.contains(function isMatch(m)\n {\n return m !== model && equality( matchValue, m.$get( matchField ) );\n });\n }\n);\n\n// not_contains:field,value\ncollectionRuleGenerator('not_contains',\n '{$alias} contains an item whose {$matchAlias} equals {$matchValue}.',\n function isInvalid(value, model, matchField, matchValue, equality)\n {\n return value.contains(function isMatch(m)\n {\n return m !== model && equality( matchValue, m.$get( matchField ) );\n });\n }\n);\n\nfunction collectionRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires field & value arguments';\n }\n\n var matchField, matchValue, equality;\n\n if ( isString( params ) )\n {\n var comma = params.indexOf(',');\n\n if ( comma === -1 )\n {\n throw ruleName + ' validation rule requires field & value arguments';\n }\n\n matchField = params.substring( 0, comma );\n matchValue = params.substring( comma + 1 );\n }\n else if ( isArray( params ) )\n {\n matchField = params[ 0 ];\n matchValue = params[ 1 ];\n equality = params[ 2 ];\n }\n else if ( isObject( params ) )\n {\n matchField = params.field;\n matchValue = params.value;\n equality = params.equals;\n }\n\n if ( !isFunction( equality ) )\n {\n equality = equalsCompare;\n }\n\n if ( indexOf( database.fields, matchField ) === -1 )\n {\n throw matchField + ' is not a valid field for the ' + ruleName + ' rule';\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $matchField: matchField,\n $matchAlias: getAlias( matchField ),\n $matchValue: matchValue\n };\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, matchField, matchValue, equality ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\nValidation.Rules.validate = function(field, params, database, getAlias, message)\n{\n // message, models, validations\n var messageOption = params || 'message';\n var messageTemplate = determineMessage( 'validate', message );\n\n return function(value, model, chain)\n {\n if ( isArray( value ) )\n {\n var invalid = new Collection();\n\n for (var i = 0; i < value.length; i++)\n {\n var related = value[ i ];\n\n if ( related && related.$validate && !related.$validate() )\n {\n invalid.push( related );\n }\n }\n\n if ( invalid.length )\n {\n switch (messageOption)\n {\n case 'models':\n chain.invalid( invalid );\n break;\n case 'validations':\n chain.invalid( invalid.pluck( '$validations', '$$key' ) );\n break;\n default: // message\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n break;\n }\n }\n else\n {\n chain.next();\n }\n }\n else\n {\n chain.next();\n }\n };\n};\n\nValidation.Rules.validate.message = '{$alias} is not valid.';\n\n// after:today\ndateRuleGenerator('after',\n '{$alias} must be after {$date}.',\n function isInvalid(value, date) {\n return value < endOfDay( date );\n }\n);\n\n// after_on:tomorrow\ndateRuleGenerator('after_on',\n '{$alias} must be after or equal to {$date}.',\n function isInvalid(value, date) {\n return value < date;\n }\n);\n\n// before:yesterday\ndateRuleGenerator('before',\n '{$alias} must be before {$date}.',\n function isInvalid(value, date) {\n return value > date;\n }\n);\n\n// before_on:+2days\ndateRuleGenerator('before_on',\n '{$alias} must be before or equal to {$date}.',\n function isInvalid(value, date) {\n return value > endOfDay( date );\n }\n);\n\n// date\nruleGenerator('date_like',\n '{$alias} must be a valid date.',\n function isInvalid(value, model, chain) {\n var parsed = parseDate( value );\n var invalid = parsed === false;\n if ( !invalid ) {\n chain.update( parsed.getTime() );\n }\n return invalid;\n }\n);\n\nfunction dateRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a date expression argument';\n }\n\n var dateExpression;\n\n if ( isString( params ) )\n {\n dateExpression = Validation.parseExpression( params, database );\n }\n else if ( isFunction( params ) )\n {\n dateExpression = params;\n }\n else\n {\n var parsed = parseDate( params );\n\n if ( parsed !== false )\n {\n var parsedTime = parsed.getTime();\n\n dateExpression = function()\n {\n return parsedTime;\n };\n }\n }\n\n if ( !dateExpression || dateExpression === noop )\n {\n throw params + ' is not a valid date expression for the ' + ruleName + ' rule';\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $date: params\n };\n\n return function(value, model, chain)\n {\n var parsed = parseDate( value );\n\n if ( parsed !== false )\n {\n value = parsed.getTime();\n\n var date = dateExpression( value, model );\n\n if ( isNumber( date ) && isInvalid( value, date ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n\n// required_if:X,Y,...\nfieldListRuleGenerator('required_if',\n '{$alias} is required.',\n function isInvalid(value, model, field, values, map) {\n var required = map[ model.$get( field ) ];\n\n return required && isEmpty( value );\n }\n);\n\n// required_unless:X,Y,...\nfieldListRuleGenerator('required_unless',\n '{$alias} is required.',\n function isInvalid(value, model, field, values, map) {\n var required = !map[ model.$get( field ) ];\n\n return required && isEmpty( value );\n }\n);\n\nfunction fieldListRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a field and list arguments';\n }\n\n var matchField, matchValues;\n\n if ( isString( params ) )\n {\n var parts = split( params, /(,)/, '\\\\' );\n\n matchField = parts.shift();\n matchValues = parts;\n }\n else if ( isArray( params ) )\n {\n matchField = params.shift();\n matchValues = params;\n }\n else if ( isObject( params ) )\n {\n matchField = params.field;\n matchValues = params.values;\n }\n\n if ( indexOf( database.fields, matchField ) === false )\n {\n throw matchField + ' is not a valid field for the ' + ruleName + ' rule';\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var list = joinFriendly( matchValues );\n var extra = {\n $params: params,\n $matchField: matchField,\n $matchAlias: getAlias( matchField ),\n $list: list\n };\n var map = mapFromArray( matchValues, true );\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, matchField, matchValues, map ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n// confirmed:X\nfieldsRuleGenerator('confirmed',\n '{$alias} must match {$fieldAliases}.',\n function isInvalid(value, model, fields, chain) {\n var confirmed = true;\n\n for (var i = 0; i < fields.length; i++)\n {\n if ( !equals( value, model.$get( fields[ i ] ) ) )\n {\n confirmed = false;\n }\n }\n\n return !confirmed;\n }\n);\n\n// different:X\nfieldsRuleGenerator('different',\n '{$alias} must not match {$fieldAliases}.',\n function isInvalid(value, model, fields, chain) {\n var different = false;\n\n for (var i = 0; i < fields.length; i++)\n {\n if ( !equals( value, model.$get( fields[ i ] ) ) )\n {\n different = true;\n }\n }\n\n return !different;\n }\n);\n\n// if_valid:X\nfieldsRuleGenerator('if_valid',\n '',\n function isInvalid(value, model, fields, chain) {\n var valid = true;\n\n for (var i = 0; i < fields.length && valid; i++)\n {\n if ( model.$validations[ fields[ i ] ] )\n {\n valid = false;\n }\n }\n\n if ( !valid )\n {\n chain.stop();\n }\n\n return false;\n }\n);\n\n// The field under validation must be present only if any of the other specified fields are present.\n// required_with:X,Y,...\nfieldsRuleGenerator('required_with',\n '{$alias} is required.',\n function isInvalid(value, model, fields, chain) {\n var required = false;\n\n for (var i = 0; i < fields.length && !required; i++)\n {\n if ( !isEmpty( model.$get( fields[ i ] ) ) )\n {\n required = true;\n }\n }\n\n return required && isEmpty( value );\n }\n);\n\n// The field under validation must be present only if all of the other specified fields are present.\n// required_with_all:X,Y,...\nfieldsRuleGenerator('required_with_all',\n '{$alias} is required.',\n function isInvalid(value, model, fields, chain) {\n var required = true;\n\n for (var i = 0; i < fields.length && required; i++)\n {\n if ( isEmpty( model.$get( fields[ i ] ) ) )\n {\n required = false;\n }\n }\n\n return required && isEmpty( value );\n }\n);\n\n// The field under validation must be present only when any of the other specified fields are not present.\n// required_without:X,Y,...\nfieldsRuleGenerator('required_without',\n '{$alias} is required.',\n function isInvalid(value, model, fields, chain) {\n var required = false;\n\n for (var i = 0; i < fields.length && !required; i++)\n {\n if ( isEmpty( model.$get( fields[ i ] ) ) )\n {\n required = true;\n }\n }\n\n return required && isEmpty( value );\n }\n);\n\n// The field under validation must be present only when all of the other specified fields are not present.\n// required_without_all:X,Y,...\nfieldsRuleGenerator('required_without_all',\n '{$alias} is required.',\n function isInvalid(value, model, fields, chain) {\n var required = true;\n\n for (var i = 0; i < fields.length && required; i++)\n {\n if ( !isEmpty( model.$get( fields[ i ] ) ) )\n {\n required = false;\n }\n }\n\n return required && isEmpty( value );\n }\n);\n\nfunction fieldsRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires an array of fields argument';\n }\n\n var fields = split( params, /(\\s*,\\s*)/, '\\\\' );\n\n for (var i = 0; i < fields.length; i++)\n {\n if ( indexOf( database.fields, fields[ i ] ) === -1 )\n {\n throw fields[ i ] + ' is not a valid field for the ' + ruleName + ' rule';\n }\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var fieldNames = joinFriendly( fields );\n var fieldAliases = joinFriendly( fields, false, false, getAlias );\n var extra = {\n $fields: fieldNames,\n $fieldAliases: fieldAliases\n };\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, fields, chain ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n// exists:X,Y\nforeignRuleGenerator('exists',\n '{$alias} must match an existing {$matchAlias} in a {$class}',\n function isInvalid(value, model, models, fieldName)\n {\n return !models.contains(function isDifferentMatch(m)\n {\n return m !== model && equals( value, m.$get( fieldName ) );\n });\n }\n);\n\n// unique:X,Y\nforeignRuleGenerator('unique',\n '{$alias} must be a unique {$matchAlias} in a {$class}',\n function isInvalid(value, model, models, fieldName)\n {\n return models.contains(function isDifferentMatch(m)\n {\n return m !== model && equals( value, m.$get( fieldName ) );\n });\n }\n);\n\n// 'ruleName'\n// 'ruleName:name'\n// 'ruleName:,field'\n// 'ruleName:name,field'\n// 'ruleName:name,field': '...'\n// 'ruleName': {input: {field: 'field', model: 'name'}, message: '...'}\n// 'ruleName': {input: {field: 'field', model: ModelClass}, message: '...'}\n// 'ruleName': {input: {field: 'field', models: [...]}, message: '...'}\n// 'ruleName': {field: 'field', model: 'name'}\n// 'ruleName': {field: 'field', model: ModelClass}\n// 'ruleName': {field: 'field', models: [...]}\nfunction foreignRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n var modelName, models, fieldName;\n\n if ( !isValue( params ) || isString( params ) )\n {\n var parts = split( params || '', /(\\s*,\\s*)/, '\\\\' );\n modelName = parts[0] || database.name;\n fieldName = parts[1] || field;\n models = null;\n }\n else if ( isArray( params ) )\n {\n modelName = isString( params[0] ) ? params.shift() : database.name;\n fieldName = isString( params[0] ) ? params.shift() : field;\n models = new ModelCollection( database, params );\n }\n else if ( isObject( params ) )\n {\n modelName = params.model || database.name;\n fieldName = params.field || field;\n models = params.models;\n }\n\n if ( !models )\n {\n if ( !modelName )\n {\n throw 'model, model class, or models is required for ' + ruleName + ' rule';\n }\n\n if ( isString( modelName ) )\n {\n Rekord.get( modelName ).success(function(modelClass)\n {\n models = modelClass.all();\n });\n }\n else if ( isRekord( modelName ) )\n {\n models = modelName.all();\n }\n }\n\n if ( indexOf( database.fields, fieldName ) === false )\n {\n throw fieldName + ' is not a valid field for the ' + ruleName + ' rule';\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $class: modelName,\n $matchField: fieldName,\n $matchAlias: getAlias( fieldName )\n };\n\n return function(value, model, chain)\n {\n if ( models && isValue( value ) )\n {\n if ( isInvalid( value, model, models, fieldName ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n// if:due_date:before:today|required\n\n// if all rules pass for the given field, continue with remaining rules\nsubRuleGenerator('if',\n function isInvalid(invalidCount, totalCount) {\n return invalidCount > 0;\n }\n);\n\n// if any rules pass for the given field, continue with remaining rules\nsubRuleGenerator('if_any',\n function isInvalid(invalidCount, totalCount) {\n return invalidCount >= totalCount;\n }\n);\n\n// if no rules pass for the given field, continue with remaining rules\nsubRuleGenerator('if_not',\n function isInvalid(invalidCount, totalCount) {\n return invalidCount < totalCount;\n }\n);\n\n\n\nfunction subRuleGenerator(ruleName, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a validation rule argument';\n }\n\n var otherField, otherRules;\n\n if ( isString( params ) )\n {\n var colon = params.indexOf( ':' );\n\n if ( colon === -1 )\n {\n throw params + ' is not a valid argument for the ' + ruleName + ' rule';\n }\n\n otherField = params.substring( 0, colon ) || field;\n otherRules = params.substring( colon + 1 );\n }\n else if ( isArray( params ) )\n {\n otherField = params.shift() || field;\n otherRules = params;\n }\n else if ( isObject( params ) )\n {\n otherField = params.field || field;\n otherRules = params.rules;\n }\n\n if ( indexOf( database.fields, otherField ) === -1 )\n {\n throw otherField + ' is not a valid field for the ' + ruleName + ' rule';\n }\n\n if ( !otherRules )\n {\n throw 'rules are required for the ' + ruleName + ' rule';\n }\n\n var validators = Validation.parseRules( otherRules, otherField, database, getAlias );\n\n return function(value, model, chain)\n {\n var invalids = 0;\n var chainCount = 0;\n\n var onChainEnd = function(innerChain)\n {\n if (!innerChain.valid)\n {\n invalids++;\n }\n\n if (++chainCount === validators.length)\n {\n if ( isInvalid( invalids, chainCount ) )\n {\n chain.stop();\n }\n else\n {\n chain.next();\n }\n }\n };\n\n var testValue = otherField === field ? value : model.$get( otherField );\n\n for (var i = 0; i < validators.length; i++)\n {\n var innerChain = new ValidationChain( model, otherField, [validators[ i ]], onChainEnd );\n\n innerChain.start( testValue );\n }\n };\n };\n}\n\n// in:X,Y,Z,...\nlistRuleGenerator('in',\n '{$alias} must be one of {$list}.',\n function isInvalid(value, model, inList)\n {\n return !inList( value, model );\n }\n);\n\n// not_in:X,Y,Z,...\nlistRuleGenerator('not_in',\n '{$alias} must not be one of {$list}.',\n function isInvalid(value, model, inList)\n {\n return inList( value, model );\n }\n);\n\nfunction listRuleGenerator(ruleName, defaultMessage, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a list argument';\n }\n\n var values, inList = false;\n\n if ( isString( params ) )\n {\n values = split( params, /(,)/, '\\\\' );\n }\n else if ( isArray( params ) )\n {\n values = params;\n }\n else if ( isFunction( params ) )\n {\n values = inList;\n }\n\n if ( inList !== false )\n {\n if ( !values || values.length === 0 )\n {\n throw params + ' is not a valid list of values for the ' + ruleName + ' rule';\n }\n }\n\n if ( isPrimitiveArray( values ) )\n {\n var map = mapFromArray( values, true );\n\n inList = function(value)\n {\n return map[ value ];\n };\n }\n else\n {\n inList = function(value)\n {\n return indexOf( values, value, equals );\n };\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var list = joinFriendly( values, 'or' );\n var extra = {\n $params: params,\n $list: list\n };\n\n return function(value, model, chain)\n {\n if ( isInvalid( value, model, inList ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\n// between:3,10\nrangeRuleGenerator('between', {\n 'string': '{$alias} must have between {$start} to {$end} characters.',\n 'number': '{$alias} must be between {$start} and {$end}.',\n 'object': '{$alias} must have between {$start} to {$end} items.'\n },\n function isInvalid(value, start, end) {\n return value < start || value > end;\n }\n);\n\n// not_between\nrangeRuleGenerator('not_between', {\n 'string': '{$alias} must not have between {$start} to {$end} characters.',\n 'number': '{$alias} must not be between {$start} and {$end}.',\n 'object': '{$alias} must not have between {$start} to {$end} items.'\n },\n function isInvalid(value, start, end) {\n return value >= start && value <= end;\n }\n);\n\nfunction rangeRuleGenerator(ruleName, defaultMessages, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n if ( !params )\n {\n throw ruleName + ' validation rule requires a range argument';\n }\n\n var start, end;\n\n if ( isString( params ) )\n {\n var range = split( params, /(\\s*,\\s*)/, '\\\\' );\n\n start = parseFloat( range[0] );\n end = parseFloat( range[1] );\n }\n else if ( isArray( params ) )\n {\n start = params[ 0 ];\n end = params[ 1 ];\n }\n else if ( isObject( params ) )\n {\n start = params.start;\n end = params.end;\n }\n\n if ( isNaN( start ) || isNaN( end ) )\n {\n throw params + ' is not a valid range of numbers for the ' + ruleName + ' rule';\n }\n\n if ( isString( message ) )\n {\n message = {\n 'string': message,\n 'number': message,\n 'object': message\n };\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $start: start,\n $end: end\n };\n\n return function(value, model, chain)\n {\n var size = sizeof( value );\n var type = typeof( value );\n var typeMessage = messageTemplate[ type ];\n\n if ( typeMessage && isInvalid( size, start, end ) )\n {\n extra.$size = size;\n\n chain.invalid( generateMessage( field, getAlias( field ), value, model, typeMessage, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessages;\n}\n\n\n\nregexRuleGenerator('alpha',\n '{$alias} should only contain alphabetic characters.',\n /^[a-zA-Z]*$/\n);\n\nregexRuleGenerator('alpha_dash',\n '{$alias} should only contain alpha-numeric characters, dashes, and underscores.',\n /^[a-zA-Z0-9_-]*$/\n);\n\nregexRuleGenerator('alpha_num',\n '{$alias} should only contain alpha-numeric characters.',\n /^[a-zA-Z0-9]*$/\n);\n\nregexRuleGenerator('email',\n '{$alias} is not a valid email.',\n /^.+@.+\\..+$/\n);\n\nregexRuleGenerator('url',\n '{$alias} is not a valid URL.',\n /^(https?:\\/\\/)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)$/\n);\n\nregexRuleGenerator('uri',\n '{$alias} is not a valid URI.',\n /^(\\w+:\\/\\/)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)$/\n);\n\nregexRuleGenerator('phone',\n '{$alias} is not a valid phone number.',\n /^1?\\W*([2-9][0-8][0-9])\\W*([2-9][0-9]{2})\\W*([0-9]{4})(\\se?x?t?(\\d*))?$/\n);\n\nfunction regexRuleGenerator(ruleName, defaultMessage, regex)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n checkNoParams( ruleName, field, params );\n\n var messageTemplate = determineMessage( ruleName, message );\n\n return function(value, model, chain)\n {\n if ( !regex.test( value ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n }\n else\n {\n chain.next();\n }\n\n return value;\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessage;\n}\n\nValidation.Rules.regex = function(field, params, database, getAlias, message)\n{\n var regex;\n\n if ( isString( params ) )\n {\n var parsed = /^\\/(.*)\\/([gmi]*)$/.exec( params );\n\n if ( parsed )\n {\n regex = new RegExp( parsed[1], parsed[2] );\n }\n }\n else if ( isRegExp( params ) )\n {\n regex = params;\n }\n\n if ( !regex )\n {\n throw params + ' is not a valid regular expression for the regex rule';\n }\n\n var messageTemplate = determineMessage( 'regex', message );\n\n return function(value, model, chain)\n {\n if ( !regex.test( value ) )\n {\n chain.invalid( generateMessage( field, getAlias( field ), value, model, messageTemplate ) );\n }\n else\n {\n chain.next();\n }\n };\n};\n\nValidation.Rules.regex.message = '{$alias} is not a valid value.';\n\n// required\nruleGenerator('required',\n '{$alias} is required.',\n function isInvalid(value) {\n return isEmpty( value );\n }\n);\n\n// min:3\nsizeRuleGenerator('min', {\n 'string': '{$alias} must have a minimum of {$number} characters.',\n 'number': '{$alias} must be at least {$number}.',\n 'object': '{$alias} must have at least {$number} items.'\n },\n function isInvalid(value, number) {\n return value < number;\n }\n);\n\n// greater_than:0\nsizeRuleGenerator('greater_than', {\n 'string': '{$alias} must have more than {$number} characters.',\n 'number': '{$alias} must be greater than {$number}.',\n 'object': '{$alias} must have more than {$number} items.'\n },\n function isInvalid(value, number) {\n return value <= number;\n }\n);\n\n// max:10\nsizeRuleGenerator('max', {\n 'string': '{$alias} must have no more than {$number} characters.',\n 'number': '{$alias} must be no more than {$number}.',\n 'object': '{$alias} must have no more than {$number} items.'\n },\n function isInvalid(value, number) {\n return value > number;\n }\n);\n\n// less_than:5\nsizeRuleGenerator('less_than', {\n 'string': '{$alias} must have less than {$number} characters.',\n 'number': '{$alias} must be less than {$number}.',\n 'object': '{$alias} must have less than {$number} items.'\n },\n function isInvalid(value, number) {\n return value >= number;\n }\n);\n\n// equal:4.5\nsizeRuleGenerator('equal', {\n 'string': '{$alias} must have {$number} characters.',\n 'number': '{$alias} must equal {$number}.',\n 'object': '{$alias} must have {$number} items.'\n },\n function isInvalid(value, number) {\n return value !== number;\n }\n);\n\n// not_equal:0\nsizeRuleGenerator('not_equal', {\n 'string': '{$alias} must not have {$number} characters.',\n 'number': '{$alias} must not equal {$number}.',\n 'object': '{$alias} must not have {$number} items.'\n },\n function isInvalid(value, number) {\n return value === number;\n }\n);\n\nfunction sizeRuleGenerator(ruleName, defaultMessages, isInvalid)\n{\n Validation.Rules[ ruleName ] = function(field, params, database, getAlias, message)\n {\n var number;\n\n if ( isString( params ) )\n {\n number = parseFloat( params );\n }\n else if ( isNumber( params ) )\n {\n number = params;\n }\n\n if ( isNaN( number ) )\n {\n throw '\"' + params + '\" is not a valid number for the ' + ruleName + ' rule';\n }\n\n if ( isString( message ) )\n {\n message = {\n 'string': message,\n 'number': message,\n 'object': message\n };\n }\n\n var messageTemplate = determineMessage( ruleName, message );\n var extra = {\n $number: params\n };\n\n return function(value, model, chain)\n {\n var size = sizeof( value );\n var type = typeof( value );\n var typeMessage = messageTemplate[ type ];\n\n if ( typeMessage && isInvalid( size, number ) )\n {\n extra.$size = size;\n\n chain.invalid( generateMessage( field, getAlias( field ), value, model, typeMessage, extra ) );\n }\n else\n {\n chain.next();\n }\n };\n };\n\n Validation.Rules[ ruleName ].message = defaultMessages;\n}\n\n\nruleGenerator('array',\n '{$alias} must be an array.',\n function isInvalid(value) {\n return !isArray( value );\n }\n);\n\nruleGenerator('object',\n '{$alias} must be an object.',\n function isInvalid(value) {\n return !isObject( value );\n }\n);\n\nruleGenerator('string',\n '{$alias} must be a string.',\n function isInvalid(value) {\n return !isString( value );\n }\n);\n\nruleGenerator('number',\n '{$alias} must be a number.',\n function isInvalid(value) {\n return !isNumber( value );\n }\n);\n\nruleGenerator('boolean',\n '{$alias} must be a true or false.',\n function isInvalid(value) {\n return !isBoolean( value );\n }\n);\n\nruleGenerator('model',\n '{$alias} must have a value.',\n function isInvalid(value) {\n return !(value instanceof Model);\n }\n);\n\nruleGenerator('whole',\n '{$alias} must be a whole number.',\n function isInvalid(value, model, chain) {\n var parsed = tryParseInt( value );\n var numeric = parseFloat( value );\n var invalid = !isNumber( parsed );\n if ( !invalid ) {\n invalid = Math.floor( parsed ) !== numeric;\n if ( !invalid ) {\n chain.update( parsed );\n }\n }\n return invalid;\n }\n);\n\nruleGenerator('numeric',\n '{$alias} must be numeric.',\n function isInvalid(value, model, chain) {\n var parsed = tryParseFloat( value );\n var invalid = !isNumber( parsed );\n if ( !invalid ) {\n chain.update( parsed );\n }\n return invalid;\n }\n);\n\nruleGenerator('yesno',\n '{$alias} must be a yes or no.',\n function isInvalid(value, model, chain) {\n var mapped = Validation.Rules.yesno.map[ value ];\n var invalid = !isBoolean( mapped );\n if ( !invalid ) {\n chain.update( mapped );\n }\n return invalid;\n }\n);\n\nValidation.Rules.yesno.map =\n{\n 'true': true,\n 't': true,\n 'yes': true,\n 'y': true,\n '1': true,\n 'false': false,\n 'f': false,\n 'no': false,\n 'n': false,\n '0': false\n};\n\nValidation.Rules.abs = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( Math.abs( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.apply = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n model.$set( field, value );\n\n chain.next();\n };\n};\n\nValidation.Rules.base64 = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( global.btoa )\n {\n chain.update( global.btoa( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.ceil = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( Math.ceil( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.endOfDay = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n chain.update( endOfDay( value ) );\n \n chain.next();\n };\n};\n\nValidation.Rules.filter = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( isArray( value ) )\n {\n for (var i = value.length - 1; i >= 0; i--)\n {\n if ( !isValue( value[ i ] ) )\n {\n value.splice( i, 1 );\n }\n }\n\n chain.update( value );\n }\n else if ( isObject( value ) )\n {\n for (var prop in value)\n {\n if ( !isValue( value[ prop ] ) )\n {\n delete value[ prop ];\n }\n }\n\n chain.update( value );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.floor = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( Math.floor( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.mod = function(field, params, database, alias, message)\n{\n var number = tryParseFloat( params );\n\n if ( !isNumber( number ) )\n {\n throw '\"' + number + '\" is not a valid number for the mod rule.';\n }\n\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( value % number );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.null = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n model.$set( field, null );\n\n chain.update( null );\n\n chain.next();\n };\n};\n\nValidation.Rules.round = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n value = tryParseFloat( value );\n\n if ( isNumber( value ) )\n {\n chain.update( Math.round( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.startOfDay = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n chain.update( startOfDay( value ) );\n\n chain.next();\n };\n};\n\nValidation.Rules.stripEnts = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( isString( value ) )\n {\n chain.update( value.replace( /&[a-z]+;/gi, '' ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.stripTags = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( isString( value ) )\n {\n chain.update( value.replace( /<(?:.|\\n)*?>/gm, '' ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.trim = function(field, params, database, alias, message)\n{\n var trim = (function()\n {\n if ( String.prototype.trim )\n {\n return function(x) {\n return x.trim();\n };\n }\n\n var regex = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n return function(x)\n {\n return x.replace( regex, '' );\n };\n\n })();\n\n return function(value, model, chain)\n {\n if ( isString( value ) )\n {\n chain.update( trim( value ) );\n }\n\n chain.next();\n };\n};\n\nValidation.Rules.unbase64 = function(field, params, database, alias, message)\n{\n return function(value, model, chain)\n {\n if ( global.atob )\n {\n chain.update( global.atob( value ) );\n }\n\n chain.next();\n };\n};\n\n\n Rekord.Validation = Validation;\n Rekord.ValidationChain = ValidationChain;\n\n Rekord.ruleGenerator = ruleGenerator;\n Rekord.rangeRuleGenerator = rangeRuleGenerator;\n Rekord.collectionRuleGenerator = collectionRuleGenerator;\n Rekord.dateRuleGenerator = dateRuleGenerator;\n Rekord.fieldListRuleGenerator = fieldListRuleGenerator;\n Rekord.fieldsRuleGenerator = fieldsRuleGenerator;\n Rekord.foreignRuleGenerator = foreignRuleGenerator;\n Rekord.subRuleGenerator = subRuleGenerator;\n Rekord.listRuleGenerator = listRuleGenerator;\n Rekord.regexRuleGenerator = regexRuleGenerator;\n Rekord.sizeRuleGenerator = sizeRuleGenerator;\n\n Rekord.joinFriendly = joinFriendly;\n Rekord.tryParseFloat = tryParseFloat;\n Rekord.tryParseInt = tryParseInt;\n Rekord.startOfDay = startOfDay;\n Rekord.endOfDay = endOfDay;\n Rekord.determineMessage = determineMessage;\n Rekord.mapFromArray = mapFromArray;\n Rekord.checkNoParams = checkNoParams;\n Rekord.generateMessage = generateMessage;\n\n return Rekord;\n\n}));\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..34e7839 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5844 @@ +{ + "name": "rekord-validation", + "version": "1.5.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "requires": { + "normalize-path": "2.1.1", + "through2": "2.0.5" + } + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "3.1.1", + "fast-json-stable-stringify": "2.1.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.3" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + } + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "catharsis": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", + "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", + "dev": true, + "requires": { + "lodash": "4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.3", + "fsevents": "1.2.12", + "glob-parent": "2.0.0", + "inherits": "2.0.4", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.6" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.3.3", + "path-is-absolute": "1.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "process-nextick-args": "2.0.1", + "readable-stream": "2.3.7" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "inherits": "2.0.4", + "readable-stream": "2.3.7", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "source-map": "0.6.1", + "source-map-resolve": "0.5.3", + "urix": "0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "deap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.1.tgz", + "integrity": "sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz", + "integrity": "sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=", + "dev": true, + "requires": { + "debug": "2.6.9", + "lazy-debug-legacy": "0.0.1", + "object-assign": "4.1.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.4" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "2.0.1", + "entities": "2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.2.2", + "domelementtype": "1.3.1" + } + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.4" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.1.1", + "repeat-element": "1.1.3", + "repeat-string": "1.6.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.3" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + } + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.5", + "yauzl": "2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "parse-node-version": "1.0.1", + "time-stamp": "1.1.0" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "1.0.0", + "is-glob": "3.1.0", + "micromatch": "3.1.10", + "resolve-dir": "1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.26" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "4.2.3", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "bindings": "1.5.0", + "nan": "2.14.0", + "node-pre-gyp": "0.14.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.7" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.9.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.2", + "yallist": "3.1.1" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "requires": { + "minimist": "1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "3.2.6", + "iconv-lite": "0.4.24", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.3", + "needle": "2.3.3", + "nopt": "4.0.3", + "npm-packlist": "1.4.8", + "npmlog": "4.1.2", + "rc": "1.2.8", + "rimraf": "2.7.1", + "semver": "5.7.1", + "tar": "4.4.13" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.3", + "npm-bundled": "1.1.1", + "npm-normalize-package-bin": "1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.5", + "strip-json-comments": "2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.6" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.1.4", + "fs-minipass": "1.2.7", + "minipass": "2.9.0", + "minizlib": "1.3.3", + "mkdirp": "0.5.3", + "safe-buffer": "5.1.2", + "yallist": "3.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true + } + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "2.0.10", + "once": "1.3.3" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.2" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.3", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.1" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "1.0.1" + } + }, + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "requires": { + "natives": "1.1.6" + } + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.2.0", + "liftoff": "2.5.0", + "minimist": "1.2.5", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + } + }, + "gulp-check-filesize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gulp-check-filesize/-/gulp-check-filesize-2.0.1.tgz", + "integrity": "sha1-s0BsBpZR2RzZUecApYZoc08VcOA=", + "dev": true, + "requires": { + "filesize": "3.6.1", + "gulp-util": "2.2.20", + "map-stream": "0.0.5", + "through2": "2.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "requires": { + "chalk": "0.5.1", + "dateformat": "1.0.12", + "lodash._reinterpolate": "2.4.1", + "lodash.template": "2.4.1", + "minimist": "0.2.1", + "multipipe": "0.1.2", + "through2": "0.5.1", + "vinyl": "0.2.3" + }, + "dependencies": { + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + } + } + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "2.4.1", + "lodash._reunescapedhtml": "2.4.1", + "lodash.keys": "2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + } + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true, + "requires": { + "lodash._escapestringchar": "2.4.1", + "lodash._reinterpolate": "2.4.1", + "lodash.defaults": "2.4.1", + "lodash.escape": "2.4.1", + "lodash.keys": "2.4.1", + "lodash.templatesettings": "2.4.1", + "lodash.values": "2.4.1" + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true, + "requires": { + "lodash._reinterpolate": "2.4.1", + "lodash.escape": "2.4.1" + } + }, + "minimist": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz", + "integrity": "sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true, + "requires": { + "clone-stats": "0.0.1" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "1.1.0", + "through2": "2.0.5", + "vinyl": "2.2.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "2.1.2", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.3", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } + } + }, + "gulp-insert": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/gulp-insert/-/gulp-insert-0.5.0.tgz", + "integrity": "sha1-MjE/E+SiPPWsylzl8MCAkjx3hgI=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "streamqueue": "0.0.6" + } + }, + "gulp-jshint": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-2.1.0.tgz", + "integrity": "sha512-sP3NK8Y/1e58O0PH9t6s7DAr/lKDSUbIY207oWSeufM6/VclB7jJrIBcPCsyhrFTCDUl9DauePbt6VqP2vPM5w==", + "dev": true, + "requires": { + "lodash": "4.17.15", + "minimatch": "3.0.4", + "plugin-error": "0.1.2", + "rcloader": "0.2.2", + "through2": "2.0.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + } + } + }, + "gulp-load-plugins": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-load-plugins/-/gulp-load-plugins-1.6.0.tgz", + "integrity": "sha512-HlCODki0WHJvQIgAsJYOTkyo0c7TsDCetvfhrdGz9JYPL6A4mFRMGmKfoi6JmXjA/vvzg+fkT91c9FBh7rnkyg==", + "dev": true, + "requires": { + "array-unique": "0.2.1", + "fancy-log": "1.3.3", + "findup-sync": "3.0.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "micromatch": "3.1.10", + "resolve": "1.15.1" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "1.0.0", + "is-glob": "4.0.1", + "micromatch": "3.1.10", + "resolve-dir": "1.0.1" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "gulp-qunit": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/gulp-qunit/-/gulp-qunit-1.5.2.tgz", + "integrity": "sha512-Cj619t43lNMwX40dwgYn5wX+Wx2Jh3iQk0uIwlhPcs+zaQuNDHEhNVWYO6Bz2sSkQCeVjRq8aOG6z/dHfPqBSQ==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "gulp-util": "3.0.8", + "phantomjs-prebuilt": "2.1.16", + "qunit-phantomjs-runner": "2.4.1", + "through2": "0.6.5" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.2" + } + } + } + }, + "gulp-rename": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", + "dev": true + }, + "gulp-shell": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.5.2.tgz", + "integrity": "sha1-pJWcoGUa0ce7/nCy0K27tOGuqY0=", + "dev": true, + "requires": { + "async": "1.5.2", + "gulp-util": "3.0.8", + "lodash": "4.17.15", + "through2": "2.0.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "gulp-sourcemaps": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", + "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=", + "dev": true, + "requires": { + "@gulp-sourcemaps/map-sources": "1.0.0", + "acorn": "4.0.13", + "convert-source-map": "1.7.0", + "css": "2.2.4", + "debug-fabulous": "0.0.4", + "detect-newline": "2.1.0", + "graceful-fs": "4.2.3", + "source-map": "0.6.1", + "strip-bom": "2.0.0", + "through2": "2.0.5", + "vinyl": "1.2.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-uglify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", + "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", + "dev": true, + "requires": { + "deap": "1.0.1", + "fancy-log": "1.3.3", + "gulp-util": "3.0.8", + "isobject": "2.1.0", + "through2": "2.0.5", + "uglify-js": "2.6.4", + "uglify-save-license": "0.4.1", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.3", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.5", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.5", + "vinyl": "0.5.3" + } + }, + "gulp-watch": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-4.3.11.tgz", + "integrity": "sha1-Fi/FY96fx3DpH5p845VVE6mhGMA=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "chokidar": "1.7.0", + "glob-parent": "3.1.0", + "gulp-util": "3.0.8", + "object-assign": "4.1.1", + "path-is-absolute": "1.0.1", + "readable-stream": "2.3.7", + "slash": "1.0.0", + "vinyl": "1.2.0", + "vinyl-file": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.2" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "6.12.0", + "har-schema": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.1" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "pinkie-promise": "2.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.1", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.16.1" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.3.3", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "1.0.0", + "is-windows": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.13.1" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jaguarjs-jsdoc": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jaguarjs-jsdoc/-/jaguarjs-jsdoc-0.0.1.tgz", + "integrity": "sha1-Lzmath2/zkt3lJOaLVo3mo5d8ME=", + "dev": true + }, + "js2xmlparser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz", + "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==", + "dev": true, + "requires": { + "xmlcreate": "2.0.3" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdoc": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.4.tgz", + "integrity": "sha512-3G9d37VHv7MFdheviDCjUfQoIjdv4TC5zTTf5G9VODLtOnVS6La1eoYBDlbWfsRT3/Xo+j2MIqki2EV12BZfwA==", + "dev": true, + "requires": { + "@babel/parser": "7.9.4", + "bluebird": "3.7.2", + "catharsis": "0.8.11", + "escape-string-regexp": "2.0.0", + "js2xmlparser": "4.0.1", + "klaw": "3.0.0", + "markdown-it": "10.0.0", + "markdown-it-anchor": "5.2.7", + "marked": "0.8.2", + "mkdirp": "1.0.4", + "requizzle": "0.2.3", + "strip-json-comments": "3.1.0", + "taffydb": "2.6.2", + "underscore": "1.10.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "4.2.3" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "jshint": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.11.0.tgz", + "integrity": "sha512-ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==", + "dev": true, + "requires": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "4.17.15", + "minimatch": "3.0.4", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.2.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true, + "optional": true + } + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.2.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true, + "optional": true + } + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lazy-debug-legacy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", + "integrity": "sha1-U3cWwHduTPeePtG2IfdljCkRsbE=", + "dev": true + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "3.0.2", + "findup-sync": "2.0.0", + "fined": "1.2.0", + "flagged-respawn": "1.0.1", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.6.2", + "resolve": "1.15.1" + } + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "1.0.6" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.2.3", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "2.4.1" + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "requires": { + "lodash._htmlescapes": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + } + } + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1" + } + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + } + } + } + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1" + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "requires": { + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + } + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.3" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.5.tgz", + "integrity": "sha1-gP/g9YjaMr8Aa38S2Rl8W4cl3xw=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "entities": "2.0.0", + "linkify-it": "2.2.0", + "mdurl": "1.0.1", + "uc.micro": "1.0.6" + } + }, + "markdown-it-anchor": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.7.tgz", + "integrity": "sha512-REFmIaSS6szaD1bye80DMbp7ePwsPNvLTR5HunsUcZ0SG0rWJQ+Pz24R4UlTKtjKBPhxo0v0tOBDYjZQQknW8Q==", + "dev": true + }, + "marked": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", + "dev": true + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.5", + "normalize-package-data": "2.5.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + } + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "2.3.7" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.3", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "2.8.8", + "resolve": "1.15.1", + "semver": "4.3.6", + "validate-npm-package-license": "3.0.4" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "1.0.0", + "make-iterator": "1.0.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.1" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.2.3", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + } + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "dev": true, + "requires": { + "es6-promise": "4.2.8", + "extract-zip": "1.7.0", + "fs-extra": "1.0.0", + "hasha": "2.2.0", + "kew": "0.7.0", + "progress": "1.1.8", + "request": "2.88.2", + "request-progress": "2.0.1", + "which": "1.3.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "0.1.1", + "ansi-red": "0.1.1", + "arr-diff": "1.1.0", + "arr-union": "2.1.0", + "extend-shallow": "1.1.4" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-slice": "0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "qunit-phantomjs-runner": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/qunit-phantomjs-runner/-/qunit-phantomjs-runner-2.4.1.tgz", + "integrity": "sha512-UBpfyREVhwSmGlJqG+KHDbA5mXGQnSjpluhhIap+5ElymTegjgsNPtq0qLAVaOA2KjcxeByDdYZ13LYNGfHCgg==", + "dev": true, + "requires": { + "qunit-reporter-junit": "1.1.1" + } + }, + "qunit-reporter-junit": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/qunit-reporter-junit/-/qunit-reporter-junit-1.1.1.tgz", + "integrity": "sha1-7rYiZFeJaZPnlaEZQPGK9q+lebQ=", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "4.0.0", + "kind-of": "6.0.3", + "math-random": "1.0.4" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "rcfinder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", + "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=", + "dev": true, + "requires": { + "lodash.clonedeep": "4.5.0" + } + }, + "rcloader": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.2.2.tgz", + "integrity": "sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc=", + "dev": true, + "requires": { + "lodash.assign": "4.2.0", + "lodash.isobject": "3.0.2", + "lodash.merge": "4.6.2", + "rcfinder": "0.1.9" + }, + "dependencies": { + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "4.2.3", + "micromatch": "3.1.10", + "readable-stream": "2.3.7" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.15.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "rekord": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/rekord/-/rekord-1.5.11.tgz", + "integrity": "sha512-ZK8GrC4tyWghoD7M0EdpN304rXWzS7GW3kFzUpeIqVF++XbBOK03KkaMI+E+rPZzjYfzkIp4V5+1XdxzlNSh9A==" + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.1.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.9.1", + "caseless": "0.12.0", + "combined-stream": "1.0.8", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.26", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.5.0", + "tunnel-agent": "0.6.0", + "uuid": "3.4.0" + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "1.0.0" + } + }, + "requizzle": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", + "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "dev": true, + "requires": { + "lodash": "4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.3", + "use": "3.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.5" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.5" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "streamqueue": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/streamqueue/-/streamqueue-0.0.6.tgz", + "integrity": "sha1-ZvX17JTpuK8knkrsLdH3Qb/pTeM=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "2.0.0", + "strip-bom": "2.0.0" + }, + "dependencies": { + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "2.3.7" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "2.3.7", + "xtend": "4.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "1.8.0", + "punycode": "2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uglify-js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", + "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", + "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "2.0.1" + } + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "3.1.0", + "spdx-expression-parse": "3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "4.2.3", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0", + "strip-bom-stream": "2.0.0", + "vinyl": "1.2.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.12", + "mkdirp": "0.5.5", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.2" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xmlcreate": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz", + "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.1.0" + } + } + } +} diff --git a/package.json b/package.json index d80176c..1ab6170 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rekord-validation", - "version": "1.5.0", + "version": "1.5.6", "description": "Advanced validation rules for rekord", "author": "Philip Diffenderfer", "license": "MIT", diff --git a/src/footer.js b/src/footer.js index 647cc62..d7e7e04 100644 --- a/src/footer.js +++ b/src/footer.js @@ -1,5 +1,6 @@ Rekord.Validation = Validation; + Rekord.ValidationChain = ValidationChain; Rekord.ruleGenerator = ruleGenerator; Rekord.rangeRuleGenerator = rangeRuleGenerator; diff --git a/src/lib/validation.js b/src/lib/validation.js index 62d5163..776ebaf 100644 --- a/src/lib/validation.js +++ b/src/lib/validation.js @@ -138,6 +138,27 @@ var Validation = RuleSeparator: ':', Stop: {}, + callRules: function(rules, message, field, database, getAlias) + { + var validations = this.parseRules( rules, field, database, getAlias, message ); + + return function (value) + { + var onChainEnd = function() {}; + var model = { + $get: function () { + return value; + }, + }; + + var chain = new ValidationChain( model, field, validations, onChainEnd ); + + chain.start(); + + return chain; + }; + }, + parseRules: function(rules, field, database, getAlias, message) { var validators = [];