UNPKG

decentralized-internet

Version:

An NPM library of programs to create decentralized web and distributed computing projects

1 lines 8.11 kB
"use strict";const Net=require("net"),Hoek=require("hoek"),Isemail=require("isemail"),Any=require("./any"),Ref=require("./ref"),JoiDate=require("./date"),Uri=require("./string/uri"),Ip=require("./string/ip"),internals={uriRegex:Uri.createUriRegex(),ipRegex:Ip.createIpRegex(["ipv4","ipv6","ipvfuture"],"optional")};internals.String=class extends Any{constructor(){super(),this._type="string",this._invalids.add("")}_base(e,t,r){if("string"==typeof e&&r.convert){if(this._flags.case&&(e="upper"===this._flags.case?e.toLocaleUpperCase():e.toLocaleLowerCase()),this._flags.trim&&(e=e.trim()),this._inner.replacements)for(let t=0;t<this._inner.replacements.length;++t){const r=this._inner.replacements[t];e=e.replace(r.pattern,r.replacement)}if(this._flags.truncate)for(let t=0;t<this._tests.length;++t){const r=this._tests[t];if("max"===r.name){e=e.slice(0,r.arg);break}}}return{value:e,errors:"string"==typeof e?null:this.createError("string.base",{value:e},t,r)}}insensitive(){const e=this.clone();return e._flags.insensitive=!0,e}creditCard(){return this._test("creditCard",void 0,function(e,t,r){let s=e.length,i=0,n=1;for(;s--;){const t=e.charAt(s)*n;i+=t-9*(t>9),n^=3}return i%10==0&&i>0?e:this.createError("string.creditCard",{value:e},t,r)})}regex(e,t){return Hoek.assert(e instanceof RegExp,"pattern must be a RegExp"),e=new RegExp(e.source,e.ignoreCase?"i":void 0),this._test("regex",e,function(r,s,i){return e.test(r)?r:this.createError(t?"string.regex.name":"string.regex.base",{name:t,pattern:e,value:r},s,i)})}alphanum(){return this._test("alphanum",void 0,function(e,t,r){return/^[a-zA-Z0-9]+$/.test(e)?e:this.createError("string.alphanum",{value:e},t,r)})}token(){return this._test("token",void 0,function(e,t,r){return/^\w+$/.test(e)?e:this.createError("string.token",{value:e},t,r)})}email(e){return e&&(Hoek.assert("object"==typeof e,"email options must be an object"),Hoek.assert(void 0===e.checkDNS,"checkDNS option is not supported"),Hoek.assert(void 0===e.tldWhitelist||"object"==typeof e.tldWhitelist,"tldWhitelist must be an array or object"),Hoek.assert(void 0===e.minDomainAtoms||Hoek.isInteger(e.minDomainAtoms)&&e.minDomainAtoms>0,"minDomainAtoms must be a positive integer"),Hoek.assert(void 0===e.errorLevel||"boolean"==typeof e.errorLevel||Hoek.isInteger(e.errorLevel)&&e.errorLevel>=0,"errorLevel must be a non-negative integer or boolean")),this._test("email",e,function(t,r,s){try{const r=Isemail.validate(t,e);if(!0===r||0===r)return t}catch(e){}return this.createError("string.email",{value:t},r,s)})}ip(e){let t,r=internals.ipRegex;if(e=e||{},Hoek.assert("object"==typeof e,"options must be an object"),e.cidr?(Hoek.assert("string"==typeof e.cidr,"cidr must be a string"),e.cidr=e.cidr.toLowerCase(),Hoek.assert(e.cidr in Ip.cidrs,"cidr must be one of "+Object.keys(Ip.cidrs).join(", ")),e.version||"optional"===e.cidr||(r=Ip.createIpRegex(["ipv4","ipv6","ipvfuture"],e.cidr))):e.cidr="optional",e.version){Array.isArray(e.version)||(e.version=[e.version]),Hoek.assert(e.version.length>=1,"version must have at least 1 version specified"),t=[];for(let r=0;r<e.version.length;++r){let s=e.version[r];Hoek.assert("string"==typeof s,"version at position "+r+" must be a string"),s=s.toLowerCase(),Hoek.assert(Ip.versions[s],"version at position "+r+" must be one of "+Object.keys(Ip.versions).join(", ")),t.push(s)}t=Hoek.unique(t),r=Ip.createIpRegex(t,e.cidr)}return this._test("ip",e,function(s,i,n){return r.test(s)?s:t?this.createError("string.ipVersion",{value:s,cidr:e.cidr,version:t},i,n):this.createError("string.ip",{value:s,cidr:e.cidr},i,n)})}uri(e){let t="",r=!1,s=internals.uriRegex;if(e){if(Hoek.assert("object"==typeof e,"options must be an object"),e.scheme){Hoek.assert(e.scheme instanceof RegExp||"string"==typeof e.scheme||Array.isArray(e.scheme),"scheme must be a RegExp, String, or Array"),Array.isArray(e.scheme)||(e.scheme=[e.scheme]),Hoek.assert(e.scheme.length>=1,"scheme must have at least 1 scheme specified");for(let r=0;r<e.scheme.length;++r){const s=e.scheme[r];Hoek.assert(s instanceof RegExp||"string"==typeof s,"scheme at position "+r+" must be a RegExp or String"),t+=t?"|":"",s instanceof RegExp?t+=s.source:(Hoek.assert(/[a-zA-Z][a-zA-Z0-9+-\.]*/.test(s),"scheme at position "+r+" must be a valid scheme"),t+=Hoek.escapeRegex(s))}}e.allowRelative&&(r=!0)}return(t||r)&&(s=Uri.createUriRegex(t,r)),this._test("uri",e,function(e,r,i){return s.test(e)?e:t?this.createError("string.uriCustomScheme",{scheme:t,value:e},r,i):this.createError("string.uri",{value:e},r,i)})}isoDate(){return this._test("isoDate",void 0,function(e,t,r){return JoiDate._isIsoDate(e)?e:this.createError("string.isoDate",{value:e},t,r)})}guid(e){const t={"{":"}","[":"]","(":")","":""},r={uuidv1:"1",uuidv2:"2",uuidv3:"3",uuidv4:"4",uuidv5:"5"},s=[];if(e&&e.version){Array.isArray(e.version)||(e.version=[e.version]),Hoek.assert(e.version.length>=1,"version must have at least 1 valid version specified");for(let t=0;t<e.version.length;++t){let i=e.version[t];Hoek.assert("string"==typeof i,"version at position "+t+" must be a string"),i=i.toLowerCase(),Hoek.assert(r[i],"version at position "+t+" must be one of "+Object.keys(r).join(", ")),Hoek.assert(-1===s.indexOf(i),"version at position "+t+" must not be a duplicate."),s.push(i)}}const i=/^([\[{\(]?)([0-9A-F]{8})([:-]?)([0-9A-F]{4})([:-]?)([0-9A-F]{4})([:-]?)([0-9A-F]{4})([:-]?)([0-9A-F]{12})([\]}\)]?)$/i;return this._test("guid",e,function(e,n,o){const a=i.exec(e);if(!a)return this.createError("string.guid",{value:e},n,o);if(t[a[1]]!==a[11])return this.createError("string.guid",{value:e},n,o);if(a[3]!==a[5]||a[3]!==a[7]||a[3]!==a[9])return this.createError("string.guid",{value:e},n,o);if(s.length){if(!s.some(e=>a[6][0]===r[e])||!/[89AB]/i.test(a[8][0]))return this.createError("string.guid",{value:e},n,o)}return e})}hex(){const e=/^[a-f0-9]+$/i;return this._test("hex",e,function(t,r,s){return e.test(t)?t:this.createError("string.hex",{value:t},r,s)})}hostname(){const e=/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/;return this._test("hostname",void 0,function(t,r,s){return t.length<=255&&e.test(t)||Net.isIPv6(t)?t:this.createError("string.hostname",{value:t},r,s)})}lowercase(){const e=this._test("lowercase",void 0,function(e,t,r){return r.convert||e===e.toLocaleLowerCase()?e:this.createError("string.lowercase",{value:e},t,r)});return e._flags.case="lower",e}uppercase(){const e=this._test("uppercase",void 0,function(e,t,r){return r.convert||e===e.toLocaleUpperCase()?e:this.createError("string.uppercase",{value:e},t,r)});return e._flags.case="upper",e}trim(){const e=this._test("trim",void 0,function(e,t,r){return r.convert||e===e.trim()?e:this.createError("string.trim",{value:e},t,r)});return e._flags.trim=!0,e}replace(e,t){"string"==typeof e&&(e=new RegExp(Hoek.escapeRegex(e),"g")),Hoek.assert(e instanceof RegExp,"pattern must be a RegExp"),Hoek.assert("string"==typeof t,"replacement must be a String");const r=this.clone();return r._inner.replacements||(r._inner.replacements=[]),r._inner.replacements.push({pattern:e,replacement:t}),r}truncate(e){const t=this.clone();return t._flags.truncate=void 0===e||!!e,t}},internals.compare=function(e,t){return function(r,s){const i=Ref.isRef(r);return Hoek.assert(Hoek.isInteger(r)&&r>=0||i,"limit must be a positive integer or reference"),Hoek.assert(!s||Buffer.isEncoding(s),"Invalid encoding:",s),this._test(e,r,function(n,o,a){let c;if(i){if(c=r(o.parent,a),!Hoek.isInteger(c))return this.createError("string.ref",{ref:r.key},o,a)}else c=r;return t(n,c,s)?n:this.createError("string."+e,{limit:c,value:n,encoding:s},o,a)})}},internals.String.prototype.min=internals.compare("min",(e,t,r)=>{return(r?Buffer.byteLength(e,r):e.length)>=t}),internals.String.prototype.max=internals.compare("max",(e,t,r)=>{return(r?Buffer.byteLength(e,r):e.length)<=t}),internals.String.prototype.length=internals.compare("length",(e,t,r)=>{return(r?Buffer.byteLength(e,r):e.length)===t}),internals.String.prototype.uuid=internals.String.prototype.guid,module.exports=new internals.String;