UNPKG

decentralized-internet

Version:

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

1 lines 2.54 kB
"use strict";const Any=require("./any"),Ref=require("./ref"),Hoek=require("hoek"),internals={precisionRx:/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/};internals.Number=class extends Any{constructor(){super(),this._type="number",this._invalids.add(1/0),this._invalids.add(-1/0)}_base(e,r,t){const n={errors:null,value:e};if("string"==typeof e&&t.convert){const r=parseFloat(e);n.value=isNaN(r)||!isFinite(e)?NaN:r}const i="number"==typeof n.value&&!isNaN(n.value);if(t.convert&&"precision"in this._flags&&i){const e=Math.pow(10,this._flags.precision);n.value=Math.round(n.value*e)/e}return n.errors=i?null:this.createError("number.base",null,r,t),n}multiple(e){const r=Ref.isRef(e);return r||(Hoek.assert("number"==typeof e&&isFinite(e),"multiple must be a number"),Hoek.assert(e>0,"multiple must be greater than 0")),this._test("multiple",e,function(t,n,i){const s=r?e(n.parent,i):e;return!r||"number"==typeof s&&isFinite(s)?t%s==0?t:this.createError("number.multiple",{multiple:e,value:t},n,i):this.createError("number.ref",{ref:e.key},n,i)})}integer(){return this._test("integer",void 0,function(e,r,t){return Hoek.isInteger(e)?e:this.createError("number.integer",{value:e},r,t)})}negative(){return this._test("negative",void 0,function(e,r,t){return e<0?e:this.createError("number.negative",{value:e},r,t)})}positive(){return this._test("positive",void 0,function(e,r,t){return e>0?e:this.createError("number.positive",{value:e},r,t)})}precision(e){Hoek.assert(Hoek.isInteger(e),"limit must be an integer"),Hoek.assert(!("precision"in this._flags),"precision already set");const r=this._test("precision",e,function(r,t,n){const i=r.toString().match(internals.precisionRx);return Math.max((i[1]?i[1].length:0)-(i[2]?parseInt(i[2],10):0),0)<=e?r:this.createError("number.precision",{limit:e,value:r},t,n)});return r._flags.precision=e,r}},internals.compare=function(e,r){return function(t){const n=Ref.isRef(t),i="number"==typeof t&&!isNaN(t);return Hoek.assert(i||n,"limit must be a number or reference"),this._test(e,t,function(i,s,a){let o;if(n){if("number"!=typeof(o=t(s.parent,a))||isNaN(o))return this.createError("number.ref",{ref:t.key},s,a)}else o=t;return r(i,o)?i:this.createError("number."+e,{limit:o,value:i},s,a)})}},internals.Number.prototype.min=internals.compare("min",(e,r)=>e>=r),internals.Number.prototype.max=internals.compare("max",(e,r)=>e<=r),internals.Number.prototype.greater=internals.compare("greater",(e,r)=>e>r),internals.Number.prototype.less=internals.compare("less",(e,r)=>e<r),module.exports=new internals.Number;