util-helpers 4.0.8 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).utilHelpers={})}(this,(function(t){"use strict";const n=Object.prototype.toString;function e(t,e){return n.call(t)===`[object ${e}]`}function r(t){return e(t,"String")}function o(t){return r(t)?t:String(t)}const i=/^1[3456789]\d{9}$/;const s=/^(0\d{2,3}\-)?([2-9]\d{6,7})(\-\d{1,6})?$/;const u=/^\d{6}$/;const c=/^[1-9]\d{5}(19|20)?\d{2}((0[1-9])|(1[012]))(([0-2][1-9])|10|20|30|31)\d{3}(\d|X)?$/i;function d(t,{loose:n=!1,checkCode:e=!0}={}){const r=o(t);return 15===r.length&&n?c.test(r):!(18!==r.length||!c.test(r))&&(!e||function(t){let n,e,r;for(e=n=0;n<17;n++)e+=Math.pow(2,17-n)%11*Number(t[n]);return r=(12-e%11)%11,r<10?r===Number(t[17]):"X"==t[17]}(r))}const a=/^[\da-z]+([\-\.\_]?[\da-z]+)*@[\da-z]+([\-\.]?[\da-z]+)*(\.[a-z]{2,})+$/i;const l=/^[1-9]\d{4,10}$/;const f=/^[a-z]([-_a-z0-9]{5,19})+$/i;const p=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})|([A-Z0-9]{5}[DF])|([DF][A-Z0-9]{5}))$/;const g=/^[1-9]\d{9,20}$/,h=/^\d{8,30}$/;const b=/^[\dA-HJ-NPQRTUWXY]{2}\d{6}[\dA-HJ-NPQRTUWXY]{10}$/,$="0123456789ABCDEFGHJKLMNPQRTUWXY".split(""),y=[1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28];function m(t){let n;return $.some(((e,r)=>e===t&&(n=r,!0))),n}const w={disableWarning:!0};const x=/[\d]/,A=/[a-z]/,F=/[A-Z]/,M=/[\d|a-z]/gi;function v(t){return t.indexOf("\\x")>-1||t.indexOf("\\u")>-1}function C(t,{level:n=2,ignoreCase:e=!1,special:r="\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E"}={}){let o=t;"string"!=typeof t&&(w.disableWarning||console.warn("[validatePassword] value must be a string."),o="");let i=0;const s=(u=o,x.test(u));var u;const c=function(t){return A.test(t)}(o),d=function(t){return F.test(t)}(o),a=function(t,n=""){if(!n)return!1;const e=t.replace(M,""),r=v(n)?new RegExp(`[${n}]`):null;if(r)return r.test(e);let o=!1;return e.split("").some((t=>(n.indexOf(t)>-1&&(o=!0),o))),o}(o,r),l=function(t,n=""){const e=t.replace(M,"");if(!n&&e)return!0;const r=v(n)?new RegExp(`[^${n}]`):null;if(r)return r.test(e);let o=!1;return e.split("").some((t=>(-1===n.indexOf(t)&&(o=!0),o))),o}(o,r);s&&(i+=1),e?(c||d)&&(i+=1):(c&&(i+=1),d&&(i+=1)),a&&(i+=1);return{validated:i>=n&&!l,level:i,containes:{number:s,lowerCaseLetter:c,upperCaseLetter:d,specialCharacter:a,unallowableCharacter:l}}}const N=/^((e[\da-z])|(de)|(se)|(pe)|(k[\da-z])|(kj)|(ma))[\da-z]{7}$/i;const B="[一-龥]",E="[麦-鿯]",z="[㐀-䶵]",P="[𠀀-𪛖]",S="[𪜀-𫜴]",R="[𫝀-𫠝]",T="[𫠠-𬺡]",W="[𬺰-𮯠]";let j=B+"+",Z="^"+B+"+$";const _=RegExp.prototype.hasOwnProperty("unicode");_&&(j="(?:"+B+"|"+E+"|"+z+"|"+P+"|"+S+"|"+R+"|"+T+"|"+W+")+",Z="^(?:"+B+"|"+E+"|"+z+"|"+P+"|"+S+"|"+R+"|"+T+"|"+W+")+$");const I=/^((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;const O=/^((([0-9A-F]{1,4}:){7}([0-9A-F]{1,4}|:))|(([0-9A-F]{1,4}:){6}(:[0-9A-F]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){5}(((:[0-9A-F]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){4}(((:[0-9A-F]{1,4}){1,3})|((:[0-9A-F]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){3}(((:[0-9A-F]{1,4}){1,4})|((:[0-9A-F]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){2}(((:[0-9A-F]{1,4}){1,5})|((:[0-9A-F]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){1}(((:[0-9A-F]{1,4}){1,6})|((:[0-9A-F]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:))|(:(((:[0-9A-F]{1,4}){1,7})|((:[0-9A-F]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:)))(%.+)?$/i;const X=/(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;const k=/^\d{15}$/;const L=/^[hm]{1}([0-9]{10}|[0-9]{8})$/i;const H=/^(\d{8}|[\da-z]{10})$/i;const Q=Number.MAX_SAFE_INTEGER||9007199254740991,D=Number.MIN_SAFE_INTEGER||-9007199254740991;function G(t){return/\d+\.?\d*e[\+\-]*\d+/i.test(t)}function U(t,n=12){return+parseFloat(t.toPrecision(n))}function Y(t){const n=t.toString().split(/e/i),e=(n[0].split(".")[1]||"").length-+(n[1]||0);return e>0?e:0}function J(t){if(!G(t.toString()))return Number(t.toString().replace(".",""));const n=Y(t);return n>0?U(+t*Math.pow(10,n)):+t}function K(t){(+t>Q||+t<D)&&(w.disableWarning||console.warn(`${t} is beyond boundary when transfer to integer, the results may not be accurate`))}function V(t){const n=/^([+-])?(0+)([0-9\.]+)$/.exec(t);let e;return n?(e=n[1]||"",e+("."===n[3][0]?"0"+n[3]:n[3])):t}function q(t){return e(t,"Number")&&isNaN(t)}const tt=/^[+-]?\d*\.?\d*$/;const nt=["零","一","二","三","四","五","六","七","八","九"],et=["","十","百","千"],rt=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],ot=["","拾","佰","仟"];let it,st,ut;function ct(t){let n="",e="",r=!1,o=0;for(;t>0;){let i=t%10;0==i?r&&(r=!1,e=it[i]+e):(r=!0,n=it[i],n+=st[o],e=n+e),o++,t=Math.floor(t/10)}return e}function dt(t){const n=t+"";let e="";for(let t=0,r=n.length;t<r;t++)e+=it[parseInt(n[t])];return e}const at=/^(?<province>\d{2})(?<city>\d{2})(?<area>\d{2})(?<year>(?:\d{2})?\d{2})(?<month>\d{2})(?<day>\d{2})\d{2}(?<gender>\d)(?:\d|X)?$/i,lt=[["11","北京市"],["12","天津市"],["13","河北省"],["14","山西省"],["15","内蒙古自治区"],["21","辽宁省"],["22","吉林省"],["23","黑龙江省"],["31","上海市"],["32","江苏省"],["33","浙江省"],["34","安徽省"],["35","福建省"],["36","江西省"],["37","山东省"],["41","河南省"],["42","湖北省"],["43","湖南省"],["44","广东省"],["45","广西壮族自治区"],["46","海南省"],["50","重庆市"],["51","四川省"],["52","贵州省"],["53","云南省"],["54","西藏自治区"],["61","陕西省"],["62","甘肃省"],["63","青海省"],["64","宁夏回族自治区"],["65","新疆维吾尔自治区"],["71","台湾省"],["83","台湾省"],["81","香港特别行政区"],["82","澳门特别行政区"]];function ft(t){return e(t,"Number")}function pt(...t){const[n,e,...o]=t;if(o.length>0)return pt(pt(n,e),...o);if((!ft(e)||q(e))&&!r(e))return n;const i=J(n),s=J(e),u=Y(n)+Y(e),c=i*s;return K(c),c/Math.pow(10,u)}function gt(...t){const[n,e,...o]=t;if(o.length>0)return gt(gt(n,e),...o);if((!ft(e)||q(e))&&!r(e))return n;const i=J(n),s=J(e);return K(i),K(s),pt(i/s,U(Math.pow(10,Y(e)-Y(n))))}t.bytesToSize=function(t){if(0===t)return"0 B";const n=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],e=Math.floor(Math.log(t)/Math.log(1024));return n[e]?`${Number((t/Math.pow(1024,e)).toFixed(2))} ${n[e]}`:t+""},t.divide=gt,t.formatBankCard=function(t="",{char:n=" ",length:e=4}={}){const r=new RegExp(`(.{${e}})`,"g"),o=new RegExp(`${n}`,"g"),i=t.replace(o,""),s=i.length%e==0,u=i.replace(r,`$1${n}`);return s?u.substring(0,u.length-1):u},t.formatMoney=(t,{precision:n=2,symbol:e,thousand:r=",",decimal:o="."}={})=>{if(!function(t){return!tt.test(t)&&!G(t)||q(t)||"number"!=typeof t&&"string"!=typeof t||""===t?(w.disableWarning||console.warn(`${t} invalid parameter.`),!1):("number"==typeof t&&K(t),!0)}(t))return"";"number"!=typeof n||q(n)||n<0?n=2:n>10&&(n=10),e="string"==typeof e?e:"",r="string"==typeof r?r:",",o="string"==typeof o?o:".";const i=function(t){if(G(t.toString())){const n="0",e=String(t).toLowerCase().split("e"),r=e.pop(),o=Math.abs(r),i=r/o,s=e[0].split(".");if(-1===i)t=n+"."+new Array(o).join(n)+s.join("");else{const e=s[1];t=o-e.length<0?V(s[0]+e.substring(0,o))+"."+e.substring(o):s.join("")+new Array(o-e.length+1).join(n)}}return t}(t)+"",[s,u]=i.split(".");return e+function(t,n){let e="";t="+"===(t=V(t))[0]?t.substring(1):t;const r=Number(t)<0?"-":"",o=r?t.substring(1).split("").reverse():t.split("").reverse();for(let t=0;t<o.length;t++)e+=o[t]+((t+1)%3==0&&t+1!==o.length?n:"");return r+e.split("").reverse().join("")}(s,r)+function(t,n,e){if(0===n)return"";let r="";r=t&&Number(t)>0?parseFloat("0."+t).toFixed(n).substring(2):(0).toFixed(n).substring(2);return e+r}(u,n,o)},t.isBankCard=function(t,{loose:n=!1}={}){const e=o(t);return n?h.test(e):g.test(e)},t.isBusinessLicense=function(t,{loose:n=!1}={}){const e=o(t),r=k.test(e);if(n||!r)return r;const i=e.substring(0,14),s=e.substring(e.length-1),u=function(t){let n,e=10;for(let n=0;n<14;n++){let r=(e+Number(t[n]))%10;r=0===r?10:r,e=2*r%11}return n=10===e||1===e?1:11-e,n}(i);return s===String(u)},t.isChinese=function(t,{loose:n=!1}={}){const e=o(t);return new RegExp(n?j:Z,_?"u":void 0).test(e)},t.isEmail=function(t){const n=o(t);return a.test(n)},t.isHMCard=function(t){const n=o(t);return L.test(n)},t.isIPv4=function(t){const n=o(t);return I.test(n)},t.isIPv6=function(t){const n=o(t);return O.test(n)},t.isIdCard=d,t.isMobile=function(t){const n=o(t);return i.test(n)},t.isPassport=function(t){const n=o(t);return N.test(n)},t.isPassword=function(t,{level:n=2,ignoreCase:e=!1,special:r="\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E"}={}){return C(t,{level:n,ignoreCase:e,special:r}).validated},t.isPostcode=function(t){const n=o(t);return u.test(n)},t.isPromiseLike=function(t){return null!==t&&("object"==typeof t||"function"==typeof t)&&"function"==typeof t.then},t.isQQ=function(t){const n=o(t);return l.test(n)},t.isSocialCreditCode=function(t,{loose:n=!1}={}){const e=o(t),r=b.test(e);if(n||!r)return r;const i=e.substring(0,17);return e.substring(e.length-1)===function(t){let n=0;for(let e=0;e<17;e++)n+=m(t[e])*y[e];return $[31-n%31]}(i)},t.isTWCard=function(t){const n=o(t);return H.test(n)},t.isTelephone=function(t){const n=o(t);return s.test(n)},t.isUrl=function(t){const n=o(t);return X.test(n)},t.isVehicle=function(t){const n=o(t);return p.test(n)},t.isWX=function(t){const n=o(t);return f.test(n)},t.minus=function t(...n){const[e,o,...i]=n;if(i.length>0)return t(t(e,o),...i);if((!ft(o)||q(o))&&!r(o))return e;const s=Math.pow(10,Math.max(Y(e),Y(o)));return(pt(e,s)-pt(o,s))/s},t.numberToChinese=function(t,{big5:n=!1,unit:e=!0,decimal:r="点",zero:o="",negative:i="负",unitConfig:s={w:"万",y:"亿"}}={}){if("number"!=typeof t||isNaN(t))return w.disableWarning||console.warn(`参数错误 ${t},请传入数字`),"";K(t),n?(it=rt.slice(),st=ot.slice()):(it=nt.slice(),st=et.slice()),ut=["",s.w||"万",s.y||"亿",s.w&&s.y?s.w+s.y:"万亿"],o&&(it[0]=o);const u=t<0?i:"";let c,d;return c=e?function(t){let n=0,e="",r="",o=!1;if(0===(t=Math.floor(t)))return it[0];for(;t>0;){var i=t%1e4;o&&(r=it[0]+r),e=ct(i),e+=0!==i?ut[n]:ut[0],r=e+r,o=i<1e3&&i>0,t=Math.floor(t/1e4),n++}return r}(t):dt(Math.floor(t)),d=function(t){const n=t+"",e=n.indexOf(".");let r="";if(e>-1){let t=n.slice(e+1);r=dt(parseInt(t))}return r}(t),d?`${u}${c}${r}${d}`:`${u}${c}`},t.parseIdCard=function(t){if(!d(t,{loose:!0}))return null;const n=at.exec(t);if(!n)return null;let e={province:"",city:"",area:"",year:"",month:"",day:"",gender:""};e=n.groups?n.groups:{province:n[1],city:n[2],area:n[3],year:n[4],month:n[5],day:n[6],gender:n[7]};const r=lt.find((t=>t[0]===e.province));if(!r)return null;const o=`${e.year}-${e.month}-${e.day}`,i=Number(e.gender)%2==0?"女":"男";return{province:r[1],birthday:o,gender:i,origin:e}},t.plus=function t(...n){const[e,o,...i]=n;if(i.length>0)return t(t(e,o),...i);if((!ft(o)||q(o))&&!r(o))return e;const s=Math.pow(10,Math.max(Y(e),Y(o)));return(pt(e,s)+pt(o,s))/s},t.replaceChar=function(t="",{start:n=3,end:e=-4,char:r="*",repeat:o,exclude:i}={}){const s=t.length;if(Math.abs(n)>=s)return t;if((n=n>=0?n:s+n)>=(e=e>=0?e:s+e))return t;let u=t.substring(n,e);if(i){const t=new RegExp(`[^${i}]`,"g");u=u.replace(t,r)}else o="number"==typeof o&&o>=0?o:u.length,u=r.repeat(o);return t.substring(0,n)+u+t.substring(e)},t.round=function(t,n=0){const e=Math.pow(10,n);return gt(Math.round(pt(t,e)),e)},t.setDisableWarning=function(t){w.disableWarning=!!t},t.times=pt,t.validatePassword=C,Object.defineProperty(t,"__esModule",{value:!0})}));
1
+ !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).utilHelpers={})}(this,(function(t){"use strict";const n=Object.prototype.toString;function e(t,e){return n.call(t)===`[object ${e}]`}function r(t){return e(t,"String")}function o(t){return r(t)?t:String(t)}const i=/^1[3456789]\d{9}$/;const s=/^(0\d{2,3}\-)?([2-9]\d{6,7})(\-\d{1,6})?$/;const u=/^\d{6}$/;const c=/^[1-9]\d{5}(19|20)?\d{2}((0[1-9])|(1[012]))(([0-2][1-9])|10|20|30|31)\d{3}(\d|X)?$/i;function d(t,{loose:n=!1,checkCode:e=!0}={}){const r=o(t);return 15===r.length&&n?c.test(r):!(18!==r.length||!c.test(r))&&(!e||function(t){let n,e,r;for(e=n=0;n<17;n++)e+=Math.pow(2,17-n)%11*Number(t[n]);return r=(12-e%11)%11,r<10?r===Number(t[17]):"X"==t[17]}(r))}const a=/^[\da-z]+([\-\.\_]?[\da-z]+)*@[\da-z]+([\-\.]?[\da-z]+)*(\.[a-z]{2,})+$/i;const l=/^[1-9]\d{4,10}$/;const f=/^[a-z]([-_a-z0-9]{5,19})+$/i;const p=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})|([A-Z0-9]{5}[DF])|([DF][A-Z0-9]{5}))$/;const g=/^[1-9]\d{9,20}$/,h=/^\d{8,30}$/;const b=/^[\dA-HJ-NPQRTUWXY]{2}\d{6}[\dA-HJ-NPQRTUWXY]{10}$/,$="0123456789ABCDEFGHJKLMNPQRTUWXY".split(""),m=[1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28];function y(t){let n;return $.some(((e,r)=>e===t&&(n=r,!0))),n}const w={disableWarning:!0};const A=/[\d]/,x=/[a-z]/,F=/[A-Z]/,M=/[\d|a-z]/gi;function v(t){return t.indexOf("\\x")>-1||t.indexOf("\\u")>-1}function C(t,{level:n=2,ignoreCase:e=!1,special:r="\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E"}={}){let o=t;"string"!=typeof t&&(w.disableWarning||console.warn("[validatePassword] value must be a string."),o="");let i=0;const s=(u=o,A.test(u));var u;const c=function(t){return x.test(t)}(o),d=function(t){return F.test(t)}(o),a=function(t,n=""){if(!n)return!1;const e=t.replace(M,""),r=v(n)?new RegExp(`[${n}]`):null;if(r)return r.test(e);let o=!1;return e.split("").some((t=>(n.indexOf(t)>-1&&(o=!0),o))),o}(o,r),l=function(t,n=""){const e=t.replace(M,"");if(!n&&e)return!0;const r=v(n)?new RegExp(`[^${n}]`):null;if(r)return r.test(e);let o=!1;return e.split("").some((t=>(-1===n.indexOf(t)&&(o=!0),o))),o}(o,r);s&&(i+=1),e?(c||d)&&(i+=1):(c&&(i+=1),d&&(i+=1)),a&&(i+=1);return{validated:i>=n&&!l,level:i,containes:{number:s,lowerCaseLetter:c,upperCaseLetter:d,specialCharacter:a,unallowableCharacter:l}}}const N=/^((e[\da-z])|(de)|(se)|(pe)|(k[\da-z])|(kj)|(ma))[\da-z]{7}$/i;const B="[一-龥]",E="[麦-鿯]",z="[㐀-䶵]",P="[𠀀-𪛖]",R="[𪜀-𫜴]",T="[𫝀-𫠝]",S="[𫠠-𬺡]",W="[𬺰-𮯠]";let j=B+"+",L="^"+B+"+$";const Z=RegExp.prototype.hasOwnProperty("unicode");Z&&(j="(?:"+B+"|"+E+"|"+z+"|"+P+"|"+R+"|"+T+"|"+S+"|"+W+")+",L="^(?:"+B+"|"+E+"|"+z+"|"+P+"|"+R+"|"+T+"|"+S+"|"+W+")+$");const _=/^((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;const I=/^((([0-9A-F]{1,4}:){7}([0-9A-F]{1,4}|:))|(([0-9A-F]{1,4}:){6}(:[0-9A-F]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){5}(((:[0-9A-F]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){4}(((:[0-9A-F]{1,4}){1,3})|((:[0-9A-F]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){3}(((:[0-9A-F]{1,4}){1,4})|((:[0-9A-F]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){2}(((:[0-9A-F]{1,4}){1,5})|((:[0-9A-F]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){1}(((:[0-9A-F]{1,4}){1,6})|((:[0-9A-F]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:))|(:(((:[0-9A-F]{1,4}){1,7})|((:[0-9A-F]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(\.(25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3}))|:)))(%.+)?$/i;const U=/(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;const O=/^\d{15}$/;const X=/^[hm]{1}([0-9]{10}|[0-9]{8})$/i;const D=/^(\d{8}|[\da-z]{10})$/i;const k=Number.MAX_SAFE_INTEGER||9007199254740991,H=Number.MIN_SAFE_INTEGER||-9007199254740991;function Q(t){return/\d+\.?\d*e[\+\-]*\d+/i.test(t)}function G(t,n=12){return+parseFloat(t.toPrecision(n))}function Y(t){const n=t.toString().split(/e/i),e=(n[0].split(".")[1]||"").length-+(n[1]||0);return e>0?e:0}function J(t){if(!Q(t.toString()))return Number(t.toString().replace(".",""));const n=Y(t);return n>0?G(+t*Math.pow(10,n)):+t}function K(t){(+t>k||+t<H)&&(w.disableWarning||console.warn(`${t} is beyond boundary when transfer to integer, the results may not be accurate`))}function V(t){const n=/^([+-])?(0+)([0-9\.]+)$/.exec(t);let e;return n?(e=n[1]||"",e+("."===n[3][0]?"0"+n[3]:n[3])):t}function q(t){return e(t,"Number")&&isNaN(t)}const tt=/^[+-]?\d*\.?\d*$/;const nt=["零","一","二","三","四","五","六","七","八","九"],et=["","十","百","千"],rt=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],ot=["","拾","佰","仟"];let it,st,ut;function ct(t){let n="",e="",r=!1,o=0;for(;t>0;){let i=t%10;0==i?r&&(r=!1,e=it[i]+e):(r=!0,n=it[i],n+=st[o],e=n+e),o++,t=Math.floor(t/10)}return e}function dt(t){const n=t+"";let e="";for(let t=0,r=n.length;t<r;t++)e+=it[parseInt(n[t])];return e}const at=/^(?<province>\d{2})(?<city>\d{2})(?<area>\d{2})(?<year>(?:\d{2})?\d{2})(?<month>\d{2})(?<day>\d{2})\d{2}(?<gender>\d)(?:\d|X)?$/i,lt=[["11","北京市"],["12","天津市"],["13","河北省"],["14","山西省"],["15","内蒙古自治区"],["21","辽宁省"],["22","吉林省"],["23","黑龙江省"],["31","上海市"],["32","江苏省"],["33","浙江省"],["34","安徽省"],["35","福建省"],["36","江西省"],["37","山东省"],["41","河南省"],["42","湖北省"],["43","湖南省"],["44","广东省"],["45","广西壮族自治区"],["46","海南省"],["50","重庆市"],["51","四川省"],["52","贵州省"],["53","云南省"],["54","西藏自治区"],["61","陕西省"],["62","甘肃省"],["63","青海省"],["64","宁夏回族自治区"],["65","新疆维吾尔自治区"],["71","台湾省"],["83","台湾省"],["81","香港特别行政区"],["82","澳门特别行政区"]];function ft(t){return e(t,"Number")}function pt(...t){const[n,e,...o]=t;if(o.length>0)return pt(pt(n,e),...o);if((!ft(e)||q(e))&&!r(e))return n;const i=J(n),s=J(e),u=Y(n)+Y(e),c=i*s;return K(c),c/Math.pow(10,u)}function gt(...t){const[n,e,...o]=t;if(o.length>0)return gt(gt(n,e),...o);if((!ft(e)||q(e))&&!r(e))return n;const i=J(n),s=J(e);return K(i),K(s),pt(i/s,G(Math.pow(10,Y(e)-Y(n))))}t.blobToDataURL=function(t){return new Promise(((n,e)=>{const r=new FileReader;r.readAsDataURL(t),r.onload=()=>n(r.result),r.onerror=t=>e(t)}))},t.bytesToSize=function(t){if(0===t)return"0 B";const n=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],e=Math.floor(Math.log(t)/Math.log(1024));return n[e]?`${Number((t/Math.pow(1024,e)).toFixed(2))} ${n[e]}`:t+""},t.dataURLToBlob=function(t){const n=t.split(","),e=n[0].match(/:(.*?);/)[1],r=atob(n[1]);let o=r.length;const i=new Uint8Array(o);for(;o--;)i[o]=r.charCodeAt(o);return new Blob([i],{type:e})},t.divide=gt,t.formatBankCard=function(t="",{char:n=" ",length:e=4}={}){const r=new RegExp(`(.{${e}})`,"g"),o=new RegExp(`${n}`,"g"),i=t.replace(o,""),s=i.length%e==0,u=i.replace(r,`$1${n}`);return s?u.substring(0,u.length-1):u},t.formatMoney=(t,{precision:n=2,symbol:e,thousand:r=",",decimal:o="."}={})=>{if(!function(t){return!tt.test(t)&&!Q(t)||q(t)||"number"!=typeof t&&"string"!=typeof t||""===t?(w.disableWarning||console.warn(`${t} invalid parameter.`),!1):("number"==typeof t&&K(t),!0)}(t))return"";"number"!=typeof n||q(n)||n<0?n=2:n>10&&(n=10),e="string"==typeof e?e:"",r="string"==typeof r?r:",",o="string"==typeof o?o:".";const i=function(t){if(Q(t.toString())){const n="0",e=String(t).toLowerCase().split("e"),r=e.pop(),o=Math.abs(r),i=r/o,s=e[0].split(".");if(-1===i)t=n+"."+new Array(o).join(n)+s.join("");else{const e=s[1];t=o-e.length<0?V(s[0]+e.substring(0,o))+"."+e.substring(o):s.join("")+new Array(o-e.length+1).join(n)}}return t}(t)+"",[s,u]=i.split(".");return e+function(t,n){let e="";t="+"===(t=V(t))[0]?t.substring(1):t;const r=Number(t)<0?"-":"",o=r?t.substring(1).split("").reverse():t.split("").reverse();for(let t=0;t<o.length;t++)e+=o[t]+((t+1)%3==0&&t+1!==o.length?n:"");return r+e.split("").reverse().join("")}(s,r)+function(t,n,e){if(0===n)return"";let r="";r=t&&Number(t)>0?parseFloat("0."+t).toFixed(n).substring(2):(0).toFixed(n).substring(2);return e+r}(u,n,o)},t.isBankCard=function(t,{loose:n=!1}={}){const e=o(t);return n?h.test(e):g.test(e)},t.isBusinessLicense=function(t,{loose:n=!1}={}){const e=o(t),r=O.test(e);if(n||!r)return r;const i=e.substring(0,14),s=e.substring(e.length-1),u=function(t){let n,e=10;for(let n=0;n<14;n++){let r=(e+Number(t[n]))%10;r=0===r?10:r,e=2*r%11}return n=10===e||1===e?1:11-e,n}(i);return s===String(u)},t.isChinese=function(t,{loose:n=!1}={}){const e=o(t);return new RegExp(n?j:L,Z?"u":void 0).test(e)},t.isEmail=function(t){const n=o(t);return a.test(n)},t.isHMCard=function(t){const n=o(t);return X.test(n)},t.isIPv4=function(t){const n=o(t);return _.test(n)},t.isIPv6=function(t){const n=o(t);return I.test(n)},t.isIdCard=d,t.isMobile=function(t){const n=o(t);return i.test(n)},t.isPassport=function(t){const n=o(t);return N.test(n)},t.isPassword=function(t,{level:n=2,ignoreCase:e=!1,special:r="\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E"}={}){return C(t,{level:n,ignoreCase:e,special:r}).validated},t.isPostcode=function(t){const n=o(t);return u.test(n)},t.isPromiseLike=function(t){return null!==t&&("object"==typeof t||"function"==typeof t)&&"function"==typeof t.then},t.isQQ=function(t){const n=o(t);return l.test(n)},t.isSocialCreditCode=function(t,{loose:n=!1}={}){const e=o(t),r=b.test(e);if(n||!r)return r;const i=e.substring(0,17);return e.substring(e.length-1)===function(t){let n=0;for(let e=0;e<17;e++)n+=y(t[e])*m[e];return $[31-n%31]}(i)},t.isTWCard=function(t){const n=o(t);return D.test(n)},t.isTelephone=function(t){const n=o(t);return s.test(n)},t.isUrl=function(t){const n=o(t);return U.test(n)},t.isVehicle=function(t){const n=o(t);return p.test(n)},t.isWX=function(t){const n=o(t);return f.test(n)},t.minus=function t(...n){const[e,o,...i]=n;if(i.length>0)return t(t(e,o),...i);if((!ft(o)||q(o))&&!r(o))return e;const s=Math.pow(10,Math.max(Y(e),Y(o)));return(pt(e,s)-pt(o,s))/s},t.numberToChinese=function(t,{big5:n=!1,unit:e=!0,decimal:r="点",zero:o="",negative:i="负",unitConfig:s={w:"万",y:"亿"}}={}){if("number"!=typeof t||isNaN(t))return w.disableWarning||console.warn(`参数错误 ${t},请传入数字`),"";K(t),n?(it=rt.slice(),st=ot.slice()):(it=nt.slice(),st=et.slice()),ut=["",s.w||"万",s.y||"亿",s.w&&s.y?s.w+s.y:"万亿"],o&&(it[0]=o);const u=t<0?i:"";let c,d;return c=e?function(t){let n=0,e="",r="",o=!1;if(0===(t=Math.floor(t)))return it[0];for(;t>0;){var i=t%1e4;o&&(r=it[0]+r),e=ct(i),e+=0!==i?ut[n]:ut[0],r=e+r,o=i<1e3&&i>0,t=Math.floor(t/1e4),n++}return r}(t):dt(Math.floor(t)),d=function(t){const n=t+"",e=n.indexOf(".");let r="";if(e>-1){let t=n.slice(e+1);r=dt(parseInt(t))}return r}(t),d?`${u}${c}${r}${d}`:`${u}${c}`},t.parseIdCard=function(t){if(!d(t,{loose:!0}))return null;const n=at.exec(t);if(!n)return null;let e={province:"",city:"",area:"",year:"",month:"",day:"",gender:""};e=n.groups?n.groups:{province:n[1],city:n[2],area:n[3],year:n[4],month:n[5],day:n[6],gender:n[7]};const r=lt.find((t=>t[0]===e.province));if(!r)return null;const o=`${e.year}-${e.month}-${e.day}`,i=Number(e.gender)%2==0?"女":"男";return{province:r[1],birthday:o,gender:i,origin:e}},t.plus=function t(...n){const[e,o,...i]=n;if(i.length>0)return t(t(e,o),...i);if((!ft(o)||q(o))&&!r(o))return e;const s=Math.pow(10,Math.max(Y(e),Y(o)));return(pt(e,s)+pt(o,s))/s},t.replaceChar=function(t="",{start:n=3,end:e=-4,char:r="*",repeat:o,exclude:i}={}){const s=t.length;if(Math.abs(n)>=s)return t;if((n=n>=0?n:s+n)>=(e=e>=0?e:s+e))return t;let u=t.substring(n,e);if(i){const t=new RegExp(`[^${i}]`,"g");u=u.replace(t,r)}else o="number"==typeof o&&o>=0?o:u.length,u=r.repeat(o);return t.substring(0,n)+u+t.substring(e)},t.round=function(t,n=0){const e=Math.pow(10,n);return gt(Math.round(pt(t,e)),e)},t.setDataURLPrefix=function(t,n="image/png",e=!0){return`data:${n}${e?";base64":""},${t}`},t.setDisableWarning=function(t){w.disableWarning=!!t},t.times=pt,t.validatePassword=C,Object.defineProperty(t,"__esModule",{value:!0})}));
2
2
  //# sourceMappingURL=util-helpers.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util-helpers.min.js","sources":["../src/utils/type/isType.js","../src/utils/type/isString.js","../src/utils/convertToString.js","../src/isMobile.js","../src/isTelephone.js","../src/isPostcode.js","../src/isIdCard.js","../src/isEmail.js","../src/isQQ.js","../src/isWX.js","../src/isVehicle.js","../src/isBankCard.js","../src/isSocialCreditCode.js","../src/utils/config.js","../src/validatePassword.js","../src/isPassport.js","../src/isChinese.js","../src/isIPv4.js","../src/isIPv6.js","../src/isUrl.js","../src/isBusinessLicense.js","../src/isHMCard.js","../src/isTWCard.js","../src/utils/constants.js","../src/utils/math.util.js","../src/utils/type/isNaN.js","../src/formatMoney.js","../src/numberToChinese.js","../src/parseIdCard.js","../src/utils/type/isNumber.js","../src/times.js","../src/divide.js","../src/bytesToSize.js","../src/formatBankCard.js","../src/isPassword.js","../src/isPromiseLike.js","../src/minus.js","../src/plus.js","../src/replaceChar.js","../src/round.js"],"sourcesContent":["const toString = Object.prototype.toString;\n\n/**\n * 检测值的 `toString` 类型\n *\n * @private\n * @since 1.1.0\n * @param {*} value 检查值\n * @param {string} typename 类型名称\n * @returns {boolean} 返回值的 `toString` 类型是否匹配\n */\nfunction isType(value, typename) {\n return toString.call(value) === `[object ${typename}]`;\n}\n\nexport default isType;\n","import isType from './isType';\n\n/**\n * 检查值是否为String\n *\n * @static\n * @alias module:Type.isString\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为String\n * @example\n *\n * isString('abc')\n * // => true\n *\n * isString(1)\n * // => false\n */\nfunction isString(value) {\n return isType(value, 'String');\n}\n\nexport default isString;\n","import isString from './type/isString';\n\n/**\n * 转换为字符串\n *\n * @param {*} value 值\n * @returns {string} 字符串\n */\nfunction convertToString(value) {\n return isString(value) ? value : String(value);\n}\n\nexport default convertToString;\n","import convertToString from './utils/convertToString';\n\n// 手机号码 11位数字,以1开头,第二位是3456789其中一个,后面再加9个数字\nconst reg = /^1[3456789]\\d{9}$/;\n\n/**\n * 检测值是否为手机号码\n *\n * @static\n * @alias module:Validator.isMobile\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为手机号码\n * @example\n *\n * isMobile('13000000000');\n * // => true\n *\n * isMobile('13000');\n * // => false\n *\n */\nfunction isMobile(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isMobile;\n","import convertToString from './utils/convertToString';\n\n// 固定电话 支持区号和分机号 3~4位区号,以0开头;7~8位直播号,以2~9开头;1~6位分机号\nconst reg = /^(0\\d{2,3}\\-)?([2-9]\\d{6,7})(\\-\\d{1,6})?$/;\n\n/**\n * 检测值是否为固定电话\n *\n * @static\n * @alias module:Validator.isTelephone\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为固定电话\n * @example\n *\n * isTelephone('22033212');\n * // => true\n *\n * isTelephone('021-22033212');\n * // => true\n *\n * isTelephone('021-22033212-123');\n * // => true\n *\n * isTelephone('13000000000');\n * // => false\n *\n */\nfunction isTelephone(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isTelephone;\n","import convertToString from './utils/convertToString';\n\n// 邮政编码\nconst reg = /^\\d{6}$/;\n\n/**\n * 检测值是否为邮政编码,6位数字\n *\n * @static\n * @alias module:Validator.isPostcode\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为邮政编码\n * @example\n *\n * isPostcode('101111');\n * // => true\n *\n * isPostcode('123');\n * // => false\n *\n */\nfunction isPostcode(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isPostcode;\n","import convertToString from './utils/convertToString';\n\n// 身份证号正则\nconst regIdCard = /^[1-9]\\d{5}(19|20)?\\d{2}((0[1-9])|(1[012]))(([0-2][1-9])|10|20|30|31)\\d{3}(\\d|X)?$/i;\n\n/**\n * 校验码计算\n *\n * @private\n * @see 参考 {@link https://zh.wikipedia.org/wiki/中华人民共和国公民身份号码|中华人民共和国公民身份号码}\n * @see 参考 {@link https://baike.baidu.com/item/居民身份证号码|居民身份证号码}\n * @param {string} id 身份证号码\n * @returns 校验码是否正确\n */\nfunction check(id) {\n let index, sum, num;\n for (sum = index = 0; index < 17; index++) {\n sum += (Math.pow(2, 17 - index) % 11) * Number(id[index]);\n }\n num = (12 - (sum % 11)) % 11;\n if (num < 10) {\n return num === Number(id[17]);\n } else {\n return id[17] == 'X';\n }\n}\n\n/**\n * 检测值是否为18位身份证号码。<br/>宽松模式下,支持15位身份证号码\n *\n * @static\n * @alias module:Validator.isIdCard\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,支持15位身份证号码\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,仅支持18位身份证号码\n * @returns {boolean} 值是否为身份证号\n * @example\n *\n * isIdCard('130701199310302288');\n * // => true\n *\n * isIdCard('13070119931030228X');\n * // => false\n *\n * isIdCard('13070119931030228X', { checkCode: false }); // 不校验校验码\n * // => true\n *\n * isIdCard('320311770706001');\n * // => false\n *\n * isIdCard('320311770706001', { loose: true });\n * // => true\n *\n */\nfunction isIdCard(value, { loose = false, checkCode = true } = {}) {\n const valueStr = convertToString(value);\n if (valueStr.length === 15 && loose) {\n return regIdCard.test(valueStr);\n }\n\n if (valueStr.length === 18 && regIdCard.test(valueStr)) {\n if (checkCode) {\n return check(valueStr);\n }\n return true;\n }\n\n return false;\n}\n\nexport default isIdCard;\n","import convertToString from './utils/convertToString';\n\n// 邮箱\nconst reg = /^[\\da-z]+([\\-\\.\\_]?[\\da-z]+)*@[\\da-z]+([\\-\\.]?[\\da-z]+)*(\\.[a-z]{2,})+$/i;\n\n/**\n * 检测值是否为Email\n *\n * @static\n * @alias module:Validator.isEmail\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为Email\n * @example\n *\n * isEmail('1232@qq.com');\n * // => true\n *\n * isEmail('123@');\n * // => false\n *\n */\nfunction isEmail(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isEmail;\n","import convertToString from './utils/convertToString';\n\n// QQ号正则\nconst reg = /^[1-9]\\d{4,10}$/;\n\n/**\n * 检测值是否为QQ号,非0开头,5至11位数字\n *\n * @static\n * @alias module:Validator.isQQ\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为QQ号\n * @example\n *\n * isQQ('12345');\n * // => true\n *\n * isQQ('123');\n * // => false\n *\n */\nfunction isQQ(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isQQ;\n","import convertToString from './utils/convertToString';\n\n// 微信号 6至20位,以字母开头,字母,数字,减号(连接符),下划线\nconst reg = /^[a-z]([-_a-z0-9]{5,19})+$/i;\n\n/**\n * 检测值是否为微信号\n *\n * @static\n * @alias module:Validator.isWX\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为微信号\n * @example\n *\n * isWX('a12345');\n * // => true\n *\n * isWX('123');\n * // => false\n *\n */\nfunction isWX(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isWX;\n","import convertToString from './utils/convertToString';\n\n// 车牌号正则\nconst reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})|([A-Z0-9]{5}[DF])|([DF][A-Z0-9]{5}))$/;\n\n/**\n * 检测值是否为车牌号,支持新能源和非新能源车牌\n *\n * @static\n * @alias module:Validator.isVehicle\n * @see 参考 {@link https://baike.baidu.com/item/车牌号|车牌号}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为车牌号\n * @example\n *\n * isVehicle('京L12345');\n * // => true\n *\n * isVehicle('粤BD12345');\n * // => true\n *\n * isVehicle('粤BF12345');\n * // => true\n *\n * isVehicle('粤B12345D');\n * // => true\n *\n * isVehicle('粤B12345F');\n * // => true\n *\n */\nfunction isVehicle(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isVehicle;\n","import convertToString from './utils/convertToString';\n\n// 非0开头,10~21位数字\nconst reg = /^[1-9]\\d{9,20}$/;\n\n// 8~30位数字\nconst regLoose = /^\\d{8,30}$/;\n\n/**\n * 检测值是否为银行卡号。正常模式(非0开头,10~21位数字)宽松模式(8~30位数字)\n *\n * @static\n * @alias module:Validator.isBankCard\n * @see 参考 {@link https://kf.qq.com/faq/170112ABnm6b170112FvquAn.html|常用银行账号位数参考}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,8~30位数字\n * @returns {boolean} 值是否为银行卡号\n * @example\n *\n * isBankCard('6228480402564890018');\n * // => true\n *\n * isBankCard('6228480402564890');\n * // => true\n *\n * isBankCard('123456789');\n * // => false\n *\n * isBankCard('123456789', { loose: true });\n * // => true\n *\n */\nfunction isBankCard(value, { loose = false } = {}) {\n const valueStr = convertToString(value);\n\n if (loose) {\n return regLoose.test(valueStr);\n }\n return reg.test(valueStr);\n}\n\nexport default isBankCard;\n","import convertToString from './utils/convertToString';\n\n// 基础规则,由18位数字和大写字母组成,不使用I、O、Z、S、V。\nconst baseReg = /^[\\dA-HJ-NPQRTUWXY]{2}\\d{6}[\\dA-HJ-NPQRTUWXY]{10}$/;\n\n// 基础字符组成\nconst baseCodeArr = '0123456789ABCDEFGHJKLMNPQRTUWXY'.split('');\n\n//加权因子\nconst weightFactor = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];\n\n/**\n * 获取字符位置\n *\n * @private\n * @param {string} code 字符\n * @returns {number} 字符所在基础字符的位置\n */\nfunction getBaseCodeIndex(code) {\n let ret;\n\n baseCodeArr.some((item, index) => {\n if (item === code) {\n ret = index;\n return true;\n }\n return false;\n });\n\n // @ts-ignore\n return ret;\n}\n\n/**\n * 计算校验码\n *\n * @private\n * @since 1.1.0\n * @param {string} preCode 统一代码前17位\n * @returns {string} 校验码\n */\nfunction sumCheckCode(preCode) {\n // const preCodeArr = preCode.split('');\n\n let total = 0;\n\n // 计算字符位置对应序号和加权因子的乘积,总和\n for (let i = 0; i < 17; i++) {\n // 字符位置对应的基础编码序号\n const index = getBaseCodeIndex(preCode[i]);\n // 加权因子\n const wf = weightFactor[i];\n // 计算序号和加权因子的乘积,并计算级数之和\n total += index * wf;\n }\n\n // 计算整数求余函数MOD\n const remainder = total % 31;\n // 校验码字符值序号\n const checkCodeIndex = 31 - remainder;\n\n return baseCodeArr[checkCodeIndex];\n}\n\n/**\n * 检测值是否为统一社会信用代码,也叫三证合一组织代码。由18位数字和大写字母组成,不使用I、O、Z、S、V。\n *\n * @static\n * @alias module:Validator.isSocialCreditCode\n * @see 参考 {@link https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则|GB 32100-2015 法人和其他组织统一社会信用代码编码规则}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,不校验校验位。\n * @returns {boolean} 值是否为统一社会信用代码\n * @example\n *\n * isSocialCreditCode('91350100M000100Y43');\n * // => true\n *\n * isSocialCreditCode('91350100M000100Y4A');\n * // => false\n *\n * // 宽松模式,不校验校验位。所以也可以通过\n * isSocialCreditCode('91350100M000100Y4A', {loose: true});\n * // => true\n *\n */\nfunction isSocialCreditCode(value, { loose = false } = {}) {\n const valueStr = convertToString(value);\n\n const passBaseRule = baseReg.test(valueStr);\n\n // 宽松模式 或 基础规则不通过直接返回\n if (loose || !passBaseRule) {\n return passBaseRule;\n }\n\n // 前17位\n const preCode = valueStr.substring(0, 17);\n // 校验码\n const lastCode = valueStr.substring(valueStr.length - 1);\n // 计算校验码\n const checkCode = sumCheckCode(preCode);\n\n return lastCode === checkCode;\n}\n\nexport default isSocialCreditCode;\n","const config = {\n // 禁用warning提示\n disableWarning: true\n};\n\n/**\n * 设置禁止warning提示\n * @static\n * @alias module:Debug.formatBankCard\n * @since 3.6.1\n * @param {boolean} bool 是否禁止warning提示\n */\nfunction setDisableWarning(bool) {\n config.disableWarning = !!bool;\n}\n\nexport { config, setDisableWarning };\n","import { config } from './utils/config';\n\nconst regNumber = /[\\d]/;\nconst regLowerCaseLetter = /[a-z]/;\nconst regUpperCaseLetter = /[A-Z]/;\nconst regAllNumberAndLetter = /[\\d|a-z]/gi;\n\n/**\n * 是否包含数字\n *\n * @private\n * @param {string} val 检查的值\n * @returns {boolean} 是否包含数字\n */\nfunction hasNumber(val) {\n return regNumber.test(val);\n}\n\n/**\n * 是否包含小写字母\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否包含小写字母\n */\nfunction hasLowerCaseLetter(val) {\n return regLowerCaseLetter.test(val);\n}\n\n/**\n * 是否包含大写字母\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否包含大写字母\n */\nfunction hasUpperCaseLetter(val) {\n return regUpperCaseLetter.test(val);\n}\n\n/**\n * 是否为十六进制\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否为十六进制\n */\nfunction hasHex(val) {\n return val.indexOf('\\\\x') > -1 || val.indexOf('\\\\u') > -1;\n}\n\n/**\n * 是否包含特殊字符\n *\n * @private\n * @param {string} val 检测的值\n * @param {string} [chars] 特殊字符\n * @returns {boolean} 是否包含特殊字符\n */\nfunction hasSpecialCharacter(val, chars = '') {\n if (!chars) {\n return false;\n }\n\n const specialChars = val.replace(regAllNumberAndLetter, '');\n const regChars = hasHex(chars) ? new RegExp(`[${chars}]`) : null;\n\n if (regChars) {\n return regChars.test(specialChars);\n }\n\n let ret = false;\n specialChars.split('').some((charItem) => {\n if (chars.indexOf(charItem) > -1) {\n ret = true;\n }\n return ret;\n });\n return ret;\n}\n\n/**\n * 是否包含非法字符\n *\n * @private\n * @param {string} val 检测的值\n * @param {string} chars 非法字符\n * @returns {boolean} 是否包含非法字符\n */\nfunction hasUnallowableCharacter(val, chars = '') {\n const specialChars = val.replace(regAllNumberAndLetter, '');\n\n if (!chars && specialChars) {\n return true;\n }\n\n const regChars = hasHex(chars) ? new RegExp(`[^${chars}]`) : null;\n if (regChars) {\n return regChars.test(specialChars);\n }\n let ret = false;\n specialChars.split('').some((charItem) => {\n if (chars.indexOf(charItem) === -1) {\n ret = true;\n }\n return ret;\n });\n return ret;\n}\n\n/**\n * 验证密码(数字、大小写字母、特殊字符、非法字符)\n *\n * @see 参考 {@link https://baike.baidu.com/item/ASCII#3|ASCII}\n * @static\n * @alias module:Validator.validatePassword\n * @since 3.7.0\n * @param {string} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,为 ture 时,大小写字母视为一种字符\n * @param {string} [options.special=\"!@#$%^&*()-=_+[]\\|{},./?<>~\"] 支持的特殊字符\n * @returns 验证结果\n * @example\n *\n * validatePassword('a12345678');\n * // =>\n * {\n * validated: true, // 验证结果,根据密码强度、是否包含非法字符得出\n * level: 2, // 强度级别\n * containes: {\n * number: true, // 包含数字\n * lowerCaseLetter: true, // 包含小写字母\n * upperCaseLetter: false, // 包含大写字母\n * specialCharacter: false, // 包含特殊字符\n * unallowableCharacter: false // 包含非法字符\n * }\n * }\n *\n * validatePassword('a12345678', {level: 3});\n * // =>\n * {\n * validated: false,\n * level: 2,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: false,\n * specialCharacter: false,\n * unallowableCharacter: false\n * }\n * }\n *\n * validatePassword('_Aa一二三45678', {level: 3, ignoreCase: true});\n * // =>\n * {\n * validated: false,\n * level: 3,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: true,\n * specialCharacter: true,\n * unallowableCharacter: true\n * }\n * }\n *\n * // 自定义特殊字符\n * validatePassword('_Aa一二三45678', {level: 3, ignoreCase: true, special: '_一二三'});\n * // =>\n * {\n * validated: true,\n * level: 3,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: true,\n * specialCharacter: true,\n * unallowableCharacter: false\n * }\n * }\n */\nfunction validatePassword(value, { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = {}) {\n let valStr = value;\n\n if (typeof value !== 'string') {\n if (!config.disableWarning) {\n console.warn(`[validatePassword] value must be a string.`);\n }\n valStr = '';\n }\n\n let currentLevel = 0;\n\n // 包含数字\n const containesNumber = hasNumber(valStr);\n // 包含小写字母\n const containesLowerCaseLetter = hasLowerCaseLetter(valStr);\n // 包含大写字母\n const containesUpperCaseLetter = hasUpperCaseLetter(valStr);\n // 包含特殊字符\n const containesSpecialCharacter = hasSpecialCharacter(valStr, special);\n // 包含非法字符\n const containesUnallowableCharacter = hasUnallowableCharacter(valStr, special);\n\n if (containesNumber) {\n currentLevel += 1;\n }\n\n if (ignoreCase) {\n // 不区分大小写\n if (containesLowerCaseLetter || containesUpperCaseLetter) {\n currentLevel += 1;\n }\n } else {\n // 区分大小写\n if (containesLowerCaseLetter) {\n currentLevel += 1;\n }\n if (containesUpperCaseLetter) {\n currentLevel += 1;\n }\n }\n\n if (containesSpecialCharacter) {\n currentLevel += 1;\n }\n\n // 验证结果\n const validated = currentLevel >= level && !containesUnallowableCharacter;\n\n return {\n validated,\n level: currentLevel,\n containes: {\n number: containesNumber,\n lowerCaseLetter: containesLowerCaseLetter,\n upperCaseLetter: containesUpperCaseLetter,\n specialCharacter: containesSpecialCharacter,\n unallowableCharacter: containesUnallowableCharacter\n }\n };\n}\n\nexport default validatePassword;\n","import convertToString from './utils/convertToString';\n\n// 护照号 9位,包括首字母和数字;支持 普通护照(E*)、外交护照(DE)、公务护照(SE)、公务普通护照(PE)、香港特区护照(K/KJ)、澳门特区护照(MA)\nconst reg = /^((e[\\da-z])|(de)|(se)|(pe)|(k[\\da-z])|(kj)|(ma))[\\da-z]{7}$/i;\n\n/**\n * 检测值是否为护照号\n * 支持普通护照(E*)、外交护照(DE)、公务护照(SE)、公务普通护照(PE)、香港特区护照(K/KJ)、澳门特区护照(MA)\n *\n * @static\n * @alias module:Validator.isPassport\n * @see 参考 {@link https://zh.wikipedia.org/wiki/中华人民共和国护照#个人资料页|中华人民共和国护照#个人资料页}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为护照号\n * @example\n *\n * isPassport('E12345678');\n * // => true\n *\n * isPassport('abc');\n * // => false\n *\n */\nfunction isPassport(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isPassport;\n","import convertToString from './utils/convertToString';\n\nconst chineseDictionary = {\n // 基本汉字\n chineseBasic: '[\\u4e00-\\u9fa5]',\n\n // 基本汉字补充\n chineseExtend: '[\\u9ea6-\\u9fef]',\n\n // 汉字扩展A\n chineseExtendA: '[\\u3400-\\u4DB5]',\n\n // 汉字扩展B\n chineseExtendB: '[\\u{20000}-\\u{2A6D6}]',\n\n // 汉字扩展C\n chineseExtendC: '[\\u{2A700}-\\u{2B734}]',\n\n // 汉字扩展D\n chineseExtendD: '[\\u{2B740}-\\u{2B81D}]',\n\n // 汉字扩展E\n chineseExtendE: '[\\u{2B820}-\\u{2CEA1}]',\n\n // 汉字扩展F\n chineseExtendF: '[\\u{2CEB0}-\\u{2EBE0}]'\n};\n\nlet looseChineseRegExp = chineseDictionary.chineseBasic + '+';\n\nlet chineseRegExp = '^' + chineseDictionary.chineseBasic + '+$';\n\n// eslint-disable-next-line no-prototype-builtins\nconst supportRegExpUnicode = RegExp.prototype.hasOwnProperty('unicode');\n\nif (supportRegExpUnicode) {\n looseChineseRegExp = '(?:' + chineseDictionary.chineseBasic + '|' + chineseDictionary.chineseExtend + '|' + chineseDictionary.chineseExtendA + '|' + chineseDictionary.chineseExtendB + '|' + chineseDictionary.chineseExtendC + '|' + chineseDictionary.chineseExtendD + '|' + chineseDictionary.chineseExtendE + '|' + chineseDictionary.chineseExtendF + ')+';\n chineseRegExp = '^(?:' + chineseDictionary.chineseBasic + '|' + chineseDictionary.chineseExtend + '|' + chineseDictionary.chineseExtendA + '|' + chineseDictionary.chineseExtendB + '|' + chineseDictionary.chineseExtendC + '|' + chineseDictionary.chineseExtendD + '|' + chineseDictionary.chineseExtendE + '|' + chineseDictionary.chineseExtendF + ')+$';\n}\n\n/**\n * 检测值是否为中文\n *\n * @static\n * @alias module:Validator.isChinese\n * @since 1.1.0\n * @see 参考 {@link http://www.unicode.org/reports/tr38/#BlockListing|4.4 Listing of Characters Covered by the Unihan Database}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,只要包含中文即为true\n * @returns {boolean} 值是否为中文\n * @example\n *\n * isChinese('林某某');\n * // => true\n *\n * isChinese('林A');\n * // => false\n *\n * // 宽松模式,只要包含中文即为true\n * isChinese('林A', {loose: true});\n * // => true\n *\n * isChinese('A林A', {loose: true});\n * // => true\n *\n */\nfunction isChinese(value, { loose = false } = {}) {\n const valueStr = convertToString(value);\n const reg = new RegExp(loose ? looseChineseRegExp : chineseRegExp, supportRegExpUnicode ? 'u' : undefined);\n return reg.test(valueStr);\n}\n\nexport default isChinese;\n","import convertToString from './utils/convertToString';\n\n// ipv4正则\nconst reg = /^((\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n\n/**\n * 检测值是否为ipv4\n *\n * @static\n * @alias module:Validator.isIPv4\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为ipv4\n * @example\n *\n * isIPv4('192.168.1.1');\n * // => true\n *\n * isIPv4('255.255.255.255');\n * // => true\n *\n * isIPv4('256.256.256.256');\n * // => false\n *\n * isIPv4('0.0');\n * // => false\n *\n */\nfunction isIPv4(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv4;\n","import convertToString from './utils/convertToString';\n\n// ipv6正则\nconst reg = /^((([0-9A-F]{1,4}:){7}([0-9A-F]{1,4}|:))|(([0-9A-F]{1,4}:){6}(:[0-9A-F]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){5}(((:[0-9A-F]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){4}(((:[0-9A-F]{1,4}){1,3})|((:[0-9A-F]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){3}(((:[0-9A-F]{1,4}){1,4})|((:[0-9A-F]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){2}(((:[0-9A-F]{1,4}){1,5})|((:[0-9A-F]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){1}(((:[0-9A-F]{1,4}){1,6})|((:[0-9A-F]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(:(((:[0-9A-F]{1,4}){1,7})|((:[0-9A-F]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:)))(%.+)?$/i;\n\n/**\n * 检测值是否为ipv6\n *\n * @static\n * @alias module:Validator.isIPv6\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为ipv6\n * @example\n *\n * // 冒分十六进制表示法\n * isIPv6('2001:0DB8:0000:0023:0008:0800:200C:417A');\n * // => true\n *\n * // 前导0省略\n * isIPv6('2001:DB8:0:23:8:800:200C:417A');\n * // => true\n *\n * isIPv6('FF01:0:0:0:0:0:0:1101');\n * // => true\n *\n * // 0位压缩表示法\n * isIPv6('FF01::1101');\n * // => true\n *\n * isIPv6('::1');\n * // => true\n *\n * isIPv6('::');\n * // => true\n *\n * isIPv6('0:0:0:0:0:0:0:1');\n * // => true\n *\n * isIPv6('0:0:0:0:0:0:0:0');\n * // => true\n *\n * // 内嵌IPv4地址表示法\n * isIPv6('::192.168.1.1');\n * // => true\n *\n * isIPv6('::FFFF:192.168.1.1');\n * // => true\n *\n * isIPv6('192.168.1.1');\n * // => false\n *\n */\nfunction isIPv6(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv6;\n","import convertToString from './utils/convertToString';\n\n// url正则\nconst reg = /(((^https?:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+(?::\\d+)?|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)$/;\n\n/**\n * 检测值是否为url\n *\n * @static\n * @alias module:Validator.isUrl\n * @since 3.4.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/统一资源定位符|统一资源定位符}\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为url\n * @example\n *\n * isUrl('');\n * // => false\n *\n * isUrl('8.8.8.8');\n * // => false\n *\n * isUrl('example.com');\n * // => true\n *\n * isUrl('http://example.com');\n * // => true\n *\n * isUrl('https://example.com:8080');\n * // => true\n *\n * isUrl('http://www.example.com/test/123');\n * // => true\n *\n * isUrl('http://www.example.com/test/123?foo=bar');\n * // => true\n */\nfunction isUrl(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isUrl;\n","import convertToString from './utils/convertToString';\n\n// 基础规则,由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\nconst baseReg = /^\\d{15}$/;\n\n/**\n * 计算校验码\n *\n * @private\n * @since 3.5.0\n * @param {string} preCode 营业执照前14位\n * @returns {number} 校验码\n */\nfunction sumCheckCode(preCode) {\n let retNum; // 校验位数字\n\n let pj = 10; // Pj+1 11,初始为10\n\n for (let j = 0; j < 14; j++) {\n const sj = pj + Number(preCode[j]);\n let sj10 = sj % 10;\n sj10 = sj10 === 0 ? 10 : sj10;\n const pj1 = sj10 * 2;\n pj = pj1 % 11;\n }\n\n // 反模10计算\n if (pj === 10 || pj === 1) {\n retNum = 1;\n } else {\n retNum = 11 - pj;\n }\n\n return retNum;\n}\n\n/**\n * 检测值是否为营业执照号,也叫工商注册号。由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\n *\n * @static\n * @alias module:Validator.isBusinessLicense\n * @see 参考 {@link https://wenku.baidu.com/view/19873704cc1755270722087c.html|GS15—2006 工商行政管理市场主体注册号编制规则}\n * @since 3.5.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,不校验校验位。\n * @returns {boolean} 值是否为营业执照号\n * @example\n *\n * isBusinessLicense('310115600985533');\n * // => true\n *\n * isBusinessLicense('3101156009');\n * // => false\n *\n * isBusinessLicense('3101156009', { loose: true });\n * // => false\n *\n * isBusinessLicense('310115600985535');\n * // => false\n *\n * isBusinessLicense('310115600985535', { loose: true });\n * // => true\n */\nfunction isBusinessLicense(value, { loose = false } = {}) {\n const valueStr = convertToString(value);\n\n const passBaseRule = baseReg.test(valueStr);\n\n // 宽松模式 或 基础规则不通过直接返回\n if (loose || !passBaseRule) {\n return passBaseRule;\n }\n\n // 前14位\n const preCode = valueStr.substring(0, 14);\n // 校验码\n const lastCode = valueStr.substring(valueStr.length - 1);\n // 计算校验码\n const checkCode = sumCheckCode(preCode);\n\n return lastCode === String(checkCode);\n}\n\nexport default isBusinessLicense;\n","import convertToString from './utils/convertToString';\n\n// 港澳居民来往内地通行证正则\nconst regHMCard = /^[hm]{1}([0-9]{10}|[0-9]{8})$/i;\n\n/**\n * 检测值是否为港澳居民来往内地通行证,俗称回乡证或回乡卡。\n *\n * @static\n * @alias module:Validator.isHMCard\n * @since 4.0.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/港澳居民来往内地通行证|港澳居民来往内地通行证}\n * @param {*} value 要检测的值\n * @returns {boolean} 是否为港澳居民来往内地通行证\n */\nfunction isHMCard(value) {\n const valueStr = convertToString(value);\n return regHMCard.test(valueStr);\n}\n\nexport default isHMCard;\n","import convertToString from './utils/convertToString';\n\n// 台湾居民来往大陆通行证正则,支持一次性短期台胞证\nconst regTWCard = /^(\\d{8}|[\\da-z]{10})$/i;\n\n/**\n * 检测值是否为台湾居民来往大陆通行证,俗称台胞证。\n *\n * @static\n * @alias module:Validator.isTWCard\n * @since 4.0.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/台湾居民来往大陆通行证|台湾居民来往大陆通行证}\n * @param {*} value 要检测的值\n * @returns {boolean} 是否为台湾居民来往大陆通行证\n */\nfunction isTWCard(value) {\n const valueStr = convertToString(value);\n return regTWCard.test(valueStr);\n}\n\nexport default isTWCard;\n","// 最大安全数字\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n// 最小安全数字\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n","/**\n * 参考: https://github.com/nefe/number-precision/blob/master/src/index.ts\n *\n * 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。\n * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998\n */\n\nimport { MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from './constants';\nimport { config } from './config';\n\n/**\n * 是否为科学计数法数字\n *\n * @param {string} num 检查值\n * @returns {boolean}\n */\nexport function isScientificNumber(num) {\n return /\\d+\\.?\\d*e[\\+\\-]*\\d+/i.test(num);\n}\n\n/**\n * 把错误的数据转正\n *\n * @param {number} num 输入数\n * @param {number} [precision=12] 小数点的精度\n * @returns {number}\n * @example\n *\n * strip(0.09999999999999998)=0.1\n */\nexport function strip(num, precision = 12) {\n return +parseFloat(num.toPrecision(precision));\n}\n\n/**\n * 计算数字的小数点长度,支持科学记数法\n *\n * @param {number|string} num 输入数\n * @returns {number} 小数点长度\n */\nexport function digitLength(num) {\n // Get digit length of e\n const eSplit = num.toString().split(/e/i);\n const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\n return len > 0 ? len : 0;\n}\n\n/**\n * 把小数转成整数,支持科学计数法。如果是小数则放大成整数\n *\n * @param {number|string} num 输入数\n * @returns {number}\n */\nexport function float2Fixed(num) {\n if (!isScientificNumber(num.toString())) {\n return Number(num.toString().replace('.', ''));\n }\n const dLen = digitLength(num);\n return dLen > 0 ? strip(+num * Math.pow(10, dLen)) : +num;\n}\n\n/**\n * 检测数字是否越界,如果越界给出提示\n * @param {number} num 输入数\n * @returns\n */\nexport function checkBoundary(num) {\n if (+num > MAX_SAFE_INTEGER || +num < MIN_SAFE_INTEGER) {\n if (!config.disableWarning) {\n console.warn(`${num} is beyond boundary when transfer to integer, the results may not be accurate`);\n }\n }\n}\n\n/**\n * 去掉左边数字0\n *\n * @param {string} num 数字字符串\n * @returns {string}\n */\nexport function trimLeftZero(num) {\n const reg = /^([+-])?(0+)([0-9\\.]+)$/;\n const result = reg.exec(num);\n\n let sign;\n\n if (result) {\n sign = result[1] || '';\n return sign + (result[3][0] === '.' ? '0' + result[3] : result[3]);\n }\n\n return num;\n}\n\n/**\n * 科学计数法转换成普通数字\n *\n * JavaScript在以下情景会自动将数值转换为科学计数法:\n * 1.小数点前的数字个数大于等于22位\n * 2.小数点前边是0,小数点后十分位(包含十分位)之后连续零的个数大于等于6个\n *\n * @param {string | number} num 科学计数法数字\n * @returns {string} 转换后的数字字符串\n */\nexport function scientificToNumber(num) {\n if (isScientificNumber(num.toString())) {\n const zero = '0';\n const parts = String(num).toLowerCase().split('e');\n const e = parts.pop(); // 存储指数\n // @ts-ignore\n const l = Math.abs(e); // 取绝对值,l-1就是0的个数\n // @ts-ignore\n const sign = e / l; //判断正负\n const coeff_array = parts[0].split('.'); // 将系数按照小数点拆分\n\n //如果是小数\n if (sign === -1) {\n //拼接字符串,如果是小数,拼接0和小数点\n num = zero + '.' + new Array(l).join(zero) + coeff_array.join('');\n } else {\n const dec = coeff_array[1];\n\n //如果是整数,将整数除第一位之外的非零数字计入位数,相应的减少0的个数\n if (l - dec.length < 0) {\n num = trimLeftZero(coeff_array[0] + dec.substring(0, l)) + '.' + dec.substring(l);\n } else {\n //拼接字符串,如果是整数,不需要拼接小数点\n num = coeff_array.join('') + new Array(l - dec.length + 1).join(zero);\n }\n }\n }\n // @ts-ignore\n return num;\n}\n","import isType from './isType';\n\n/**\n * 检查值是否为NaN\n *\n * @static\n * @alias module:Type.isNaN\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为NaN\n * @example\n *\n * isNaN(NaN)\n * // => true\n *\n * isNaN(1)\n * // => false\n */\nfunction _isNaN(value) {\n return isType(value, 'Number') && isNaN(value);\n}\n\nexport default _isNaN;\n","import { checkBoundary, scientificToNumber, isScientificNumber } from './utils/math.util';\nimport isNaN from './utils/type/isNaN';\nimport { trimLeftZero } from './utils/math.util';\nimport { config } from './utils/config';\n\nconst reg = /^[+-]?\\d*\\.?\\d*$/;\n\n/**\n * 检查数字或数字字符串\n *\n * @private\n * @param {string} num\n * @returns 是否为数字\n */\nfunction checkNumber(num) {\n if (!(reg.test(num) || isScientificNumber(num)) || isNaN(num) || (typeof num !== 'number' && typeof num !== 'string') || num === '') {\n if (!config.disableWarning) {\n console.warn(`${num} invalid parameter.`);\n }\n\n return false;\n }\n\n // 数字超限如果不是是字符串,可能有异常\n // 如 1111111111111111111111 // => 1.1111111111111111e+21\n if (typeof num === 'number') {\n checkBoundary(num);\n }\n\n return true;\n}\n\n/**\n * 格式化整数部分\n *\n * @private\n * @param {string} intStr 数字字符串\n * @param {string} thousand 千分位符号\n * @returns 格式化后的值\n */\nfunction formatInt(intStr, thousand) {\n let txt = '';\n intStr = trimLeftZero(intStr);\n intStr = intStr[0] === '+' ? intStr.substring(1) : intStr; // 去掉+符号\n const negativeSymbol = Number(intStr) < 0 ? '-' : '';\n const reArr = negativeSymbol ? intStr.substring(1).split('').reverse() : intStr.split('').reverse();\n\n for (let i = 0; i < reArr.length; i++) {\n txt += reArr[i] + ((i + 1) % 3 === 0 && i + 1 !== reArr.length ? thousand : '');\n }\n\n return negativeSymbol + txt.split('').reverse().join('');\n}\n\n/**\n * 格式化小数部分,如果使用 toFixed,超大额数字会自动被截断\n *\n * @private\n * @param {string} decStr 小数点部分的字符串\n * @param {number} precision 保留位数\n * @param {string} decimal 小数点符号\n * @returns 格式化后的值\n */\nfunction formatDec(decStr, precision, decimal) {\n if (precision === 0) {\n return '';\n }\n\n const zero = 0;\n let ret = '';\n\n if (decStr && Number(decStr) > 0) {\n let tmpNum = parseFloat('0.' + decStr);\n ret = tmpNum.toFixed(precision).substring(2);\n } else {\n ret = zero.toFixed(precision).substring(2);\n }\n\n return decimal + ret;\n}\n\n/**\n * 格式化金额\n *\n * @static\n * @alias module:Processor.formatMoney\n * @since 1.1.0\n * @param {string | number} num 需转换金额 (最大:9007199254740991 最小: -9007199254740991)\n * @param {Object} [options] - 金额格式化配置\n * @param {string | number} [options.precision=2] - 保留位数 (最高:10位)\n * @param {string} [options.symbol] - 货币符号\n * @param {string} [options.thousand=\",\"] - 千分位符号\n * @param {string} [options.decimal=\".\"] - 小数位符号\n * @returns {string} 格式化的金额\n * @example\n *\n * // 整数\n * formatMoney('1000');\n * // => 1,000.00\n *\n * // 小数(默认保留2位小数)\n * formatMoney('3000.03');\n * // => 3,000.03\n *\n * // 保留4位小数\n * formatMoney('3000.0300', { precision: 4 });\n * // => 3,000.0300\n *\n * // 保留10位小数\n * formatMoney('1500.2', { precision: 10 });\n * // => 1,500.2000000000\n *\n * // 自定义单位符号\n * formatMoney(1000.00, { symbol: '$' });\n * // => $1,000.00\n *\n * // 自定义千位分割符(默认',')\n * formatMoney(1000.00, { thousand: '|' });\n * // => 1|000.00\n *\n * // 自定义小数位分割符(默认'.')\n * formatMoney(1000.00, { decimal: '&' });\n * // => 1,000&00\n */\nconst formatMoney = (num, { precision = 2, symbol, thousand = ',', decimal = '.' } = {}) => {\n // 数字参数不正确,返回空字符串\n // @ts-ignore\n if (!checkNumber(num)) {\n return '';\n }\n\n // 参数规整化\n if (typeof precision !== 'number' || isNaN(precision) || precision < 0) {\n precision = 2;\n } else if (precision > 10) {\n precision = 10;\n }\n symbol = typeof symbol === 'string' ? symbol : '';\n thousand = typeof thousand === 'string' ? thousand : ',';\n decimal = typeof decimal === 'string' ? decimal : '.';\n\n // 转换数字字符串,支持科学记数法\n const numStr = scientificToNumber(num) + '';\n // 整数和小数部分\n const [intStr, decStr] = numStr.split('.');\n\n return symbol + formatInt(intStr, thousand) + formatDec(decStr, precision, decimal);\n};\n\nexport default formatMoney;\n","import { checkBoundary } from './utils/math.util';\nimport { config } from './utils/config';\n\n// 简体\nconst chnNumberChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];\nconst chnUnitChar = ['', '十', '百', '千'];\n\n// 繁体\nconst big5NumberChar = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];\nconst big5UnitChar = ['', '拾', '佰', '仟'];\n\n// 数字字符、计数单位\n\n/**\n * @type {string[]}\n * @private\n */\nlet numberChar;\n\n/**\n * @type {string[]}\n * @private\n */\nlet unitChar;\n\n/**\n * @type {string[]}\n * @private\n */\nlet unitSection;\n\n/**\n * 每个小节的内部进行转化\n *\n * @private\n * @param {number} section 数字\n * @returns {string} 转化的数字\n */\nfunction sectionToChinese(section) {\n let str = '',\n chnstr = '',\n zero = false, //zero为是否进行补零, 第一次进行取余由于为个位数,默认不补零\n unitPos = 0;\n\n while (section > 0) {\n // 对数字取余10,得到的数即为个位数\n let v = section % 10;\n\n //如果数字为零,则对字符串进行补零\n if (v == 0) {\n if (zero) {\n //如果遇到连续多次取余都是0,那么只需补一个零即可\n zero = false;\n chnstr = numberChar[v] + chnstr;\n }\n } else {\n //第一次取余之后,如果再次取余为零,则需要补零\n zero = true;\n str = numberChar[v];\n str += unitChar[unitPos];\n chnstr = str + chnstr;\n }\n unitPos++;\n section = Math.floor(section / 10);\n }\n return chnstr;\n}\n\n/**\n * 转换整数\n *\n * @private\n * @param {number} num 要转换的数字\n * @returns {string} 中文数字\n */\nfunction convertInteger(num) {\n num = Math.floor(num);\n\n let unitPos = 0;\n let strIns = '',\n chnStr = '';\n let needZero = false;\n\n if (num === 0) {\n return numberChar[0];\n }\n while (num > 0) {\n var section = num % 10000;\n if (needZero) {\n chnStr = numberChar[0] + chnStr;\n }\n strIns = sectionToChinese(section);\n strIns += section !== 0 ? unitSection[unitPos] : unitSection[0];\n chnStr = strIns + chnStr;\n needZero = section < 1000 && section > 0;\n num = Math.floor(num / 10000);\n unitPos++;\n }\n return chnStr;\n}\n\n/**\n * 转换小数\n *\n * @private\n * @param {number} num 要转换的数字\n */\nfunction convertDecimal(num) {\n const numStr = num + '';\n const index = numStr.indexOf('.');\n\n let ret = '';\n\n if (index > -1) {\n let decimalStr = numStr.slice(index + 1);\n ret = mapNumberChar(parseInt(decimalStr));\n }\n\n return ret;\n}\n\n/**\n * 映射为中文数字\n *\n * @private\n * @param {number} num 要处理的数字\n * @returns {string} 返回中文数字的映射\n */\nfunction mapNumberChar(num) {\n const numStr = num + '';\n let ret = '';\n\n for (let i = 0, len = numStr.length; i < len; i++) {\n ret += numberChar[parseInt(numStr[i])];\n }\n\n return ret;\n}\n\n/**\n * 数字转中文数字\n * 不在安全数字 -9007199254740991~9007199254740991 内,处理会有异常\n *\n * @static\n * @alias module:Processor.numberToChinese\n * @since 1.2.0\n * @param {number} num 数字\n * @param {Object} [options] 配置项\n * @param {boolean} [options.big5=false] 繁体\n * @param {boolean} [options.unit=true] 计数单位\n * @param {string} [options.decimal=\"点\"] 中文小数点\n * @param {string} [options.zero=\"零\"] 设置0。常用配置 〇\n * @param {string} [options.negative=\"负\"] 负数前面的字\n * @param {Object} [options.unitConfig] 节点单位配置\n * @param {string} [options.unitConfig.w=\"万\"] 设置计数单位万。常用配置 萬\n * @param {string} [options.unitConfig.y=\"亿\"] 设置计数单位亿。常用配置 億\n * @returns {string} 中文数字\n * @example\n *\n * numberToChinese(100);\n * // => 一百\n *\n * numberToChinese(100.3);\n * // => 一百点三\n *\n * // 繁体\n * numberToChinese(100, {big5: true});\n * // => 壹佰\n *\n * numberToChinese(100.3, {big5: true});\n * // => 壹佰点叁\n *\n * numberToChinese(1234567890, {big5: true});\n * // => 壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾\n *\n * // 不带计数单位\n * numberToChinese(1990, {unit: false});\n * // => 一九九零\n *\n * // 不带计数单位,修改0\n * numberToChinese(1990, {unit: false, zero:'〇'});\n * // => 一九九〇\n *\n */\nfunction numberToChinese(\n num,\n {\n big5 = false,\n unit = true,\n decimal = '点',\n zero = '',\n negative = '负',\n unitConfig = {\n w: '万', // '萬'\n y: '亿' // '億'\n }\n } = {}\n) {\n // 非数字 或 NaN 不处理\n if (typeof num !== 'number' || isNaN(num)) {\n if (!config.disableWarning) {\n console.warn(`参数错误 ${num},请传入数字`);\n }\n\n return '';\n }\n\n // 超过安全数字提示\n checkBoundary(num);\n\n // 设置数字字符和计数单位\n if (big5) {\n numberChar = big5NumberChar.slice();\n unitChar = big5UnitChar.slice();\n } else {\n numberChar = chnNumberChar.slice();\n unitChar = chnUnitChar.slice();\n }\n\n // 设置节点计数单位,万、亿、万亿\n const defaultUnitWan = '万';\n const defaultUnitYi = '亿';\n unitSection = ['', unitConfig.w || defaultUnitWan, unitConfig.y || defaultUnitYi, unitConfig.w && unitConfig.y ? unitConfig.w + unitConfig.y : defaultUnitWan + defaultUnitYi];\n\n // 设置0\n if (zero) {\n numberChar[0] = zero;\n }\n\n // 前置字符,负数处理\n const preStr = num < 0 ? negative : '';\n\n // 整数和小数\n let chnInteger, chnDecimal;\n\n // 处理整数\n if (unit) {\n chnInteger = convertInteger(num);\n } else {\n chnInteger = mapNumberChar(Math.floor(num));\n }\n\n // 处理小数\n chnDecimal = convertDecimal(num);\n\n return chnDecimal ? `${preStr}${chnInteger}${decimal}${chnDecimal}` : `${preStr}${chnInteger}`;\n}\n\nexport default numberToChinese;\n","import isIdCard from './isIdCard';\n\nconst regIdCard = /^(?<province>\\d{2})(?<city>\\d{2})(?<area>\\d{2})(?<year>(?:\\d{2})?\\d{2})(?<month>\\d{2})(?<day>\\d{2})\\d{2}(?<gender>\\d)(?:\\d|X)?$/i;\n\nconst Provinces = [\n // 华北地区:北京市|110000,天津市|120000,河北省|130000,山西省|140000,内蒙古自治区|150000\n ['11', '北京市'],\n ['12', '天津市'],\n ['13', '河北省'],\n ['14', '山西省'],\n ['15', '内蒙古自治区'],\n\n // 东北地区: 辽宁省|210000,吉林省|220000,黑龙江省|230000\n ['21', '辽宁省'],\n ['22', '吉林省'],\n ['23', '黑龙江省'],\n\n // 华东地区: 上海市|310000,江苏省|320000,浙江省|330000,安徽省|340000,福建省|350000,江西省|360000,山东省|370000\n ['31', '上海市'],\n ['32', '江苏省'],\n ['33', '浙江省'],\n ['34', '安徽省'],\n ['35', '福建省'],\n ['36', '江西省'],\n ['37', '山东省'],\n\n // 华中地区: 河南省|410000,湖北省|420000,湖南省|430000\n ['41', '河南省'],\n ['42', '湖北省'],\n ['43', '湖南省'],\n\n // 华南地区:广东省|440000,广西壮族自治区|450000,海南省|460000\n ['44', '广东省'],\n ['45', '广西壮族自治区'],\n ['46', '海南省'],\n\n // 西南地区:重庆市|500000,四川省|510000,贵州省|520000,云南省|530000,西藏自治区|540000\n ['50', '重庆市'],\n ['51', '四川省'],\n ['52', '贵州省'],\n ['53', '云南省'],\n ['54', '西藏自治区'],\n\n // 西北地区: 陕西省|610000,甘肃省|620000,青海省|630000,宁夏回族自治区|640000,新疆维吾尔自治区|650000\n ['61', '陕西省'],\n ['62', '甘肃省'],\n ['63', '青海省'],\n ['64', '宁夏回族自治区'],\n ['65', '新疆维吾尔自治区'],\n\n // 台湾地区:台湾省|710000\n // 台湾居民公民身份号码地址码为830000,参考 http://www.wanweibaike.com/wiki-中华人民共和国行政区划代码_(7区)、https://zh.wikipedia.org/wiki/港澳台居民居住证\n ['71', '台湾省'],\n ['83', '台湾省'],\n\n // 港澳地区:香港特别行政区|810000,澳门特别行政区|820000\n ['81', '香港特别行政区'],\n ['82', '澳门特别行政区']\n];\n\n// 第一位数字是以前的大区制代码。第二位是大区所在省市编码。全国共分为8个大区:华北(1)、东北(2)、华东(3)、中南(4)、西南(5)、西北(6)、台湾(7)和港澳(8)。\n// const Regions = [\n// ['1', '华北地区'],\n// ['2', '东北地区'],\n// ['3', '华东地区'],\n// ['4', '中南地区'],\n// ['5', '西南地区'],\n// ['6', '西北地区'],\n// ['7', '台湾地区'],\n// ['8', '港澳地区']\n// ];\n\n/**\n * 解析身份证号码,支持15、18位身份证号码\n * \n * @static\n * @alias module:Processor.parseIdCard\n * @since 4.0.0\n * @see 参考 {@link https://baike.baidu.com/item/居民身份证号码|居民身份证号码}\n * @param {string} id 身份证号码,支持15位\n * @returns null 或 省份、生日、性别,省/市/区/年/月/日/性别编码\n * @example\n * parseIdCard('123456789123456');\n * // => null\n * \n * // 18位身份证号码\n * parseIdCard('130701199310302288')\n * // =>\n * {\n birthday: \"1993-10-30\",\n gender: \"女\",\n origin: { province: \"13\", city: \"07\", area: \"01\", year: \"1993\", month: \"10\", day: \"30\", gender: \"8\" },\n province: \"河北省\"\n}\n * // 15位身份证号码\n * parseIdCard('130701931030228');\n * // =>\n * {\n birthday: \"93-10-30\",\n gender: \"女\",\n origin: { province: \"13\", city: \"07\", area: \"01\", year: \"93\", month: \"10\", day: \"30\", gender: \"8\" },\n province: \"河北省\"\n}\n * \n */\nfunction parseIdCard(id) {\n if (!isIdCard(id, { loose: true })) {\n return null;\n }\n\n const info = regIdCard.exec(id);\n\n if (!info) {\n return null;\n }\n\n /**\n * @type {{ province: string, city: string, area: string, year: string, month: string, day: string, gender: string }}\n *\n */\n let origin = {\n province: '',\n city: '',\n area: '',\n year: '',\n month: '',\n day: '',\n gender: ''\n };\n\n if (info.groups) {\n // @ts-ignore\n origin = info.groups;\n } else {\n origin = {\n province: info[1],\n city: info[2],\n area: info[3],\n year: info[4],\n month: info[5],\n day: info[6],\n gender: info[7]\n };\n }\n\n const province = Provinces.find((item) => item[0] === origin.province);\n\n if (!province) {\n return null;\n }\n\n const birthday = `${origin.year}-${origin.month}-${origin.day}`;\n const gender = Number(origin.gender) % 2 === 0 ? '女' : '男';\n // const region = Regions.find(item => item[0] === origin.province?.substring(0, 1));\n\n return {\n // region,\n province: province[1],\n birthday,\n gender,\n origin\n };\n}\n\nexport default parseIdCard;\n","import isType from './isType';\n\n/**\n * 检查值是否为Number\n *\n * @static\n * @alias module:Type.isNumber\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Number\n * @example\n *\n * isNumber(1)\n * // => true\n *\n * isNumber(Number.MIN_VALUE)\n * // => true\n *\n * isNumber(Infinity)\n * // => true\n *\n * isNumber(NaN)\n * // => true\n *\n * isNumber('1')\n * // => false\n */\nfunction isNumber(value) {\n return isType(value, 'Number');\n}\n\nexport default isNumber;\n","import { digitLength, float2Fixed, checkBoundary } from './utils/math.util';\nimport { isNumber, isNaN, isString } from './utils/type';\n\n/**\n * 精确乘法,支持多个数相乘\n *\n * @static\n * @alias module:Math.times\n * @since 3.1.0\n * @param {...number|string} nums 相乘的数\n * @returns {number} 乘积\n * @example\n *\n * times(3, 0.6);\n * // => 1.8\n *\n * times(3, 0.6, 2);\n * // => 3.6\n *\n * times(3, 0.6, 2, 10);\n * // => 36\n */\nfunction times(...nums) {\n const [num1, num2, ...rest] = nums;\n if (rest.length > 0) {\n return times(times(num1, num2), ...rest);\n }\n\n // 兼容处理,如果第2个参数为非数字或字符串时,返回第一个参数\n if ((!isNumber(num2) || isNaN(num2)) && !isString(num2)) {\n // @ts-ignore\n return num1;\n }\n\n const num1Changed = float2Fixed(num1);\n const num2Changed = float2Fixed(num2);\n const baseNum = digitLength(num1) + digitLength(num2);\n const leftValue = num1Changed * num2Changed;\n\n checkBoundary(leftValue);\n\n return leftValue / Math.pow(10, baseNum);\n}\n\nexport default times;\n","import { strip, digitLength, float2Fixed, checkBoundary } from './utils/math.util';\nimport times from './times';\nimport { isNumber, isNaN, isString } from './utils/type';\n\n/**\n * 精确除法,支持多个数相除\n *\n * @static\n * @alias module:Math.divide\n * @since 3.1.0\n * @param {...number|string} nums 除数和被除数\n * @returns {number} 商数\n * @example\n *\n * divide(1.21, 1.1);\n * // => 1.1\n *\n * divide(1000, 10, 10);\n * // => 10\n *\n * divide(1000, 10, 10, 10);\n * // => 1\n */\nfunction divide(...nums) {\n const [num1, num2, ...rest] = nums;\n\n if (rest.length > 0) {\n return divide(divide(num1, num2), ...rest);\n }\n\n // 兼容处理,如果第2个参数为非数字或字符串时,返回第一个参数\n if ((!isNumber(num2) || isNaN(num2)) && !isString(num2)) {\n // @ts-ignore\n return num1;\n }\n\n const num1Changed = float2Fixed(num1);\n const num2Changed = float2Fixed(num2);\n checkBoundary(num1Changed);\n checkBoundary(num2Changed);\n // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正\n return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\n}\n\nexport default divide;\n","/**\n * 字节转换存储单位,保留2位小数点\n *\n * @static\n * @alias module:Processor.bytesToSize\n * @since 3.8.0\n * @param {number} bytes 字节大小\n * @returns {string} 存储单位值\n * @example\n *\n * bytesToSize(0);\n * // => 0 B\n *\n * bytesToSize(1024);\n * // => 1 KB\n *\n * bytesToSize(3.213243*1024*1024);\n * // => 3.21 MB\n *\n * bytesToSize(1024*1024*1024);\n * // => 1 GB\n */\nfunction bytesToSize(bytes) {\n if (bytes === 0) return '0 B';\n const k = 1024;\n // 存储单位\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return sizes[i] ? `${Number((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}` : bytes + '';\n}\n\nexport default bytesToSize;\n","/**\n * 格式化银行卡号\n *\n * @static\n * @alias module:Processor.formatBankCard\n * @since 1.1.0\n * @param {string} bankCardNo 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {string} [options.char=\" \"] 间隔字符\n * @param {number} [options.length=4] 间隔长度\n * @returns {string} 格式化的银行卡号\n * @example\n *\n * // 19位银行卡\n * formatBankCard('6228480402564890018');\n * // => 6228 4804 0256 4890 018\n *\n * // 16位银行卡\n * formatBankCard('6228480402564890');\n * // => 6228 4804 0256 4890\n *\n * // 脱敏银行卡\n * formatBankCard('6228********890');\n * // => 6228 **** **** 890\n *\n * // 16位银行卡,\"-\"间隔\n * formatBankCard('6228480402564890', {char: '-'});\n * // => 6228-4804-0256-4890\n *\n */\nfunction formatBankCard(bankCardNo = '', { char = ' ', length = 4 } = {}) {\n const reg = new RegExp(`(.{${length}})`, 'g');\n const regChar = new RegExp(`${char}`, 'g');\n\n const realValue = bankCardNo.replace(regChar, '');\n\n const needRemoveLastChar = realValue.length % length === 0;\n\n const str = realValue.replace(reg, `$1${char}`);\n\n return needRemoveLastChar ? str.substring(0, str.length - 1) : str;\n}\n\nexport default formatBankCard;\n","import validatePassword from './validatePassword';\n\n/**\n * 检测值是否符合密码强度\n * <p><strong>注意:该校验只校验是否存在不同字符(大小写字母、数字、特殊符号),不判断长度。</strong></p>\n * <p><i>如果需要更细致的验证,请使用 <a href=\"#.validatePassword\">validatePassword</a></i></p>\n *\n * @see 参考 {@link https://baike.baidu.com/item/ASCII#3|ASCII}\n * @static\n * @alias module:Validator.isPassword\n * @since 1.1.0\n * @requires module:Validator.validatePassword\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,为 ture 时,大小写字母视为一种字符\n * @param {string} [options.special=\"!@#$%^&*()-=_+[]\\|{},./?<>~\"] 支持的特殊字符\n * @returns {boolean} 值是否符合密码强度\n * @example\n *\n * isPassword('a12345678');\n * // => true\n *\n * isPassword('a12345678', {level: 3});\n * // => false\n *\n * isPassword('Aa12345678', {level: 3});\n * // => true\n *\n * isPassword('Aa12345678', {level: 3, ignoreCase: true});\n * // => false\n *\n * isPassword('_Aa12345678', {level: 3, ignoreCase: true});\n * // => true\n *\n * // 仅支持 数字、字母、特殊字符,其他字符如中文字符是校验不通过的\n * isPassword('_Aa一二三45678', {level: 3, ignoreCase: true});\n * // => false\n *\n * isPassword(' _Aa12345678', {level: 3, ignoreCase: true});\n * // => false\n */\nfunction isPassword(value, { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = {}) {\n return validatePassword(value, { level, ignoreCase, special }).validated;\n}\n\nexport default isPassword;\n","/**\n * 检测值是否类似Promise对象\n *\n * @static\n * @alias module:Validator.isPromiseLike\n * @since 3.8.0\n * @param {*} obj 要检测的值\n * @returns {boolean} 是否类似Promise对象\n * @example\n *\n * isPromiseLike([]);\n * => false\n *\n * isPromiseLike({then:()=>{}});\n * => true\n *\n * isPromiseLike(Promise.resolve());\n * => true\n */\nfunction isPromiseLike(obj) {\n return obj !== null && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';\n}\n\nexport default isPromiseLike;\n","import { digitLength } from './utils/math.util';\nimport times from './times';\nimport { isNumber, isNaN, isString } from './utils/type';\n\n/**\n * 精确减法,支持多个数相减\n *\n * @static\n * @alias module:Math.minus\n * @since 3.1.0\n * @param {...number|string} nums 相减的数\n * @returns {number} 差\n * @example\n *\n * minus(1, 0.9);\n * // => 0.1\n *\n * minus(1, 0.9, 0.02);\n * // => 0.08\n *\n * minus(1, 0.9, 0.02, 0.08);\n * // => 0\n */\nfunction minus(...nums) {\n const [num1, num2, ...rest] = nums;\n\n if (rest.length > 0) {\n return minus(minus(num1, num2), ...rest);\n }\n\n // 兼容处理,如果第2个参数为非数字或字符串时,返回第一个参数\n if ((!isNumber(num2) || isNaN(num2)) && !isString(num2)) {\n // @ts-ignore\n return num1;\n }\n\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\n}\n\nexport default minus;\n","import { digitLength } from './utils/math.util';\nimport times from './times';\nimport { isNumber, isNaN, isString } from './utils/type';\n\n/**\n * 精确加法,支持多个数相加\n *\n * @static\n * @alias module:Math.plus\n * @since 3.1.0\n * @param {...number|string} nums 相加的数\n * @returns {number} 总和\n * @example\n *\n * plus(0.1, 0.2);\n * // => 0.3\n *\n * plus(0.1, 0.2, 0.3);\n * // => 0.6\n *\n * plus(0.1, 0.2, 0.3, 0.4);\n * // => 1\n */\nfunction plus(...nums) {\n const [num1, num2, ...rest] = nums;\n\n if (rest.length > 0) {\n return plus(plus(num1, num2), ...rest);\n }\n\n // 兼容处理,如果第2个参数为非数字或字符串时,返回第一个参数\n if ((!isNumber(num2) || isNaN(num2)) && !isString(num2)) {\n // @ts-ignore\n return num1;\n }\n\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\n}\n\nexport default plus;\n","/**\n * 替换字符,应用场景如:脱敏\n *\n * @static\n * @alias module:Processor.replaceChar\n * @since 1.1.0\n * @param {string} str 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {number} [options.start=3] 开始位置\n * @param {number} [options.end=-4] 结束位置\n * @param {string} [options.char=\"*\"] 替换字符\n * @param {number} [options.repeat] 替换字符的重复次数,默认为替换内容长度,可设置为固定值\n * @param {string} [options.exclude] 排除字符,如果指定排除项,repeat设置无效\n * @returns {string} 处理后的字符\n * @example\n *\n * // 手机号\n * replaceChar('13000000000');\n * // => 130****0000\n *\n * // 身份证\n * replaceChar('130701199310302288');\n * // => 130***********2288\n *\n * // 邮箱\n * const email = '12345@qq.com'\n * replaceChar(email, {start: 2, end: email.indexOf('@'), repeat: 4});\n * // => 12****@qq.com\n *\n * // 银行卡号\n * replaceChar('6228480402564890018', {start: 0, end: -4, repeat: 4});\n * // => ****0018\n *\n * // 带格式的银行卡号\n * replaceChar('6228 4804 0256 4890 018', {start: 4, end: -4, exclude: ' '});\n * // => 6228 **** **** **** 018\n *\n * // 用户名\n * replaceChar('林某某', {start: 1, end: Infinity, repeat: 2});\n * // => 林**\n * replaceChar('林某', {start: 1, end: Infinity, repeat: 2});\n * // => 林**\n * replaceChar('林某某某', {start: 1, end: Infinity, repeat: 2});\n * // => 林**\n *\n */\nfunction replaceChar(str = '', { start = 3, end = -4, char = '*', repeat, exclude } = {}) {\n const strLen = str.length;\n\n // 开始位置超过str长度\n if (Math.abs(start) >= strLen) {\n return str;\n }\n\n start = start >= 0 ? start : strLen + start;\n end = end >= 0 ? end : strLen + end;\n\n // 开始位置大于结束位置\n if (start >= end) {\n return str;\n }\n\n let middleStr = str.substring(start, end);\n\n if (exclude) {\n const reg = new RegExp(`[^${exclude}]`, 'g');\n middleStr = middleStr.replace(reg, char);\n } else {\n repeat = typeof repeat === 'number' && repeat >= 0 ? repeat : middleStr.length;\n middleStr = char.repeat(repeat);\n }\n\n return str.substring(0, start) + middleStr + str.substring(end);\n}\n\nexport default replaceChar;\n","import divide from './divide';\nimport times from './times';\n\n/**\n * 四舍五入,支持设置精度\n *\n * @static\n * @alias module:Math.round\n * @since 3.1.0\n * @param {number|string} num 要四舍五入的数字\n * @param {number} [precision=0] 四舍五入的精度\n * @returns {number} 四舍五入的数字\n * @example\n *\n * round(4.006);\n * // => 4\n *\n * round(4.006, 2);\n * // => 4.01\n *\n * round(4060, -2);\n * // => 4100\n */\nfunction round(num, precision = 0) {\n const base = Math.pow(10, precision);\n return divide(Math.round(times(num, base)), base);\n}\n\nexport default round;\n"],"names":["toString","Object","prototype","isType","value","typename","call","isString","convertToString","String","reg","regIdCard","isIdCard","loose","checkCode","valueStr","length","test","id","index","sum","num","Math","pow","Number","check","regLoose","baseReg","baseCodeArr","split","weightFactor","getBaseCodeIndex","code","ret","some","item","config","disableWarning","regNumber","regLowerCaseLetter","regUpperCaseLetter","regAllNumberAndLetter","hasHex","val","indexOf","validatePassword","level","ignoreCase","special","valStr","console","warn","currentLevel","containesNumber","containesLowerCaseLetter","hasLowerCaseLetter","containesUpperCaseLetter","hasUpperCaseLetter","containesSpecialCharacter","chars","specialChars","replace","regChars","RegExp","charItem","hasSpecialCharacter","containesUnallowableCharacter","hasUnallowableCharacter","validated","containes","number","lowerCaseLetter","upperCaseLetter","specialCharacter","unallowableCharacter","chineseDictionary","looseChineseRegExp","chineseRegExp","supportRegExpUnicode","hasOwnProperty","regHMCard","regTWCard","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","isScientificNumber","strip","precision","parseFloat","toPrecision","digitLength","eSplit","len","float2Fixed","dLen","checkBoundary","trimLeftZero","result","exec","sign","_isNaN","isNaN","chnNumberChar","chnUnitChar","big5NumberChar","big5UnitChar","numberChar","unitChar","unitSection","sectionToChinese","section","str","chnstr","zero","unitPos","v","floor","mapNumberChar","numStr","i","parseInt","Provinces","isNumber","times","nums","num1","num2","rest","num1Changed","num2Changed","baseNum","leftValue","divide","bytes","sizes","log","toFixed","bankCardNo","char","regChar","realValue","needRemoveLastChar","substring","symbol","thousand","decimal","checkNumber","parts","toLowerCase","e","pop","l","abs","coeff_array","Array","join","dec","scientificToNumber","intStr","decStr","txt","negativeSymbol","reArr","reverse","formatInt","formatDec","passBaseRule","preCode","lastCode","retNum","pj","j","sj10","sumCheckCode","undefined","obj","then","total","minus","max","big5","unit","negative","unitConfig","w","y","slice","defaultUnitWan","preStr","chnInteger","chnDecimal","strIns","chnStr","needZero","convertInteger","decimalStr","convertDecimal","info","origin","province","city","area","year","month","day","gender","groups","find","birthday","plus","start","end","repeat","exclude","strLen","middleStr","base","round","bool"],"mappings":"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"}
1
+ {"version":3,"file":"util-helpers.min.js","sources":["../src/utils/type/isType.js","../src/utils/type/isString.js","../src/utils/convertToString.js","../src/isMobile.js","../src/isTelephone.js","../src/isPostcode.js","../src/isIdCard.js","../src/isEmail.js","../src/isQQ.js","../src/isWX.js","../src/isVehicle.js","../src/isBankCard.js","../src/isSocialCreditCode.js","../src/utils/config.js","../src/validatePassword.js","../src/isPassport.js","../src/isChinese.js","../src/isIPv4.js","../src/isIPv6.js","../src/isUrl.js","../src/isBusinessLicense.js","../src/isHMCard.js","../src/isTWCard.js","../src/utils/constants.js","../src/utils/math.util.js","../src/utils/type/isNaN.js","../src/formatMoney.js","../src/numberToChinese.js","../src/parseIdCard.js","../src/utils/type/isNumber.js","../src/times.js","../src/divide.js","../src/blobToDataURL.js","../src/bytesToSize.js","../src/dataURLToBlob.js","../src/formatBankCard.js","../src/isPassword.js","../src/isPromiseLike.js","../src/minus.js","../src/plus.js","../src/replaceChar.js","../src/round.js","../src/setDataURLPrefix.js"],"sourcesContent":["const toString = Object.prototype.toString;\n\n/**\n * 检测值的 `toString` 类型\n *\n * @private\n * @since 1.1.0\n * @param {*} value 检查值\n * @param {string} typename 类型名称\n * @returns {boolean} 返回值的 `toString` 类型是否匹配\n */\nfunction isType(value, typename) {\n return toString.call(value) === `[object ${typename}]`;\n}\n\nexport default isType;\n","import isType from './isType';\n\n/**\n * 检查值是否为String\n *\n * @static\n * @alias module:Type.isString\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为String\n * @example\n *\n * isString('abc')\n * // => true\n *\n * isString(1)\n * // => false\n */\nfunction isString(value) {\n return isType(value, 'String');\n}\n\nexport default isString;\n","import isString from './type/isString';\n\n/**\n * 转换为字符串\n *\n * @param {*} value 值\n * @returns {string} 字符串\n */\nfunction convertToString(value) {\n return isString(value) ? value : String(value);\n}\n\nexport default convertToString;\n","import convertToString from './utils/convertToString';\n\n// 手机号码 11位数字,以1开头,第二位是3456789其中一个,后面再加9个数字\nconst reg = /^1[3456789]\\d{9}$/;\n\n/**\n * 检测值是否为手机号码\n *\n * @static\n * @alias module:Validator.isMobile\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为手机号码\n * @example\n *\n * isMobile('13000000000');\n * // => true\n *\n * isMobile('13000');\n * // => false\n *\n */\nfunction isMobile(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isMobile;\n","import convertToString from './utils/convertToString';\n\n// 固定电话 支持区号和分机号 3~4位区号,以0开头;7~8位直播号,以2~9开头;1~6位分机号\nconst reg = /^(0\\d{2,3}\\-)?([2-9]\\d{6,7})(\\-\\d{1,6})?$/;\n\n/**\n * 检测值是否为固定电话\n *\n * @static\n * @alias module:Validator.isTelephone\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为固定电话\n * @example\n *\n * isTelephone('22033212');\n * // => true\n *\n * isTelephone('021-22033212');\n * // => true\n *\n * isTelephone('021-22033212-123');\n * // => true\n *\n * isTelephone('13000000000');\n * // => false\n *\n */\nfunction isTelephone(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isTelephone;\n","import convertToString from './utils/convertToString';\n\n// 邮政编码\nconst reg = /^\\d{6}$/;\n\n/**\n * 检测值是否为邮政编码,6位数字\n *\n * @static\n * @alias module:Validator.isPostcode\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为邮政编码\n * @example\n *\n * isPostcode('101111');\n * // => true\n *\n * isPostcode('123');\n * // => false\n *\n */\nfunction isPostcode(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isPostcode;\n","import convertToString from './utils/convertToString';\n\n// 身份证号正则\nconst regIdCard = /^[1-9]\\d{5}(19|20)?\\d{2}((0[1-9])|(1[012]))(([0-2][1-9])|10|20|30|31)\\d{3}(\\d|X)?$/i;\n\n/**\n * 校验码计算\n *\n * @private\n * @see 参考 {@link https://zh.wikipedia.org/wiki/中华人民共和国公民身份号码|中华人民共和国公民身份号码}\n * @see 参考 {@link https://baike.baidu.com/item/居民身份证号码|居民身份证号码}\n * @param {string} id 身份证号码\n * @returns 校验码是否正确\n */\nfunction check(id) {\n let index, sum, num;\n for (sum = index = 0; index < 17; index++) {\n sum += (Math.pow(2, 17 - index) % 11) * Number(id[index]);\n }\n num = (12 - (sum % 11)) % 11;\n if (num < 10) {\n return num === Number(id[17]);\n } else {\n return id[17] == 'X';\n }\n}\n\n/**\n * 检测值是否为18位身份证号码。<br/>宽松模式下,支持15位身份证号码\n *\n * @static\n * @alias module:Validator.isIdCard\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,支持15位身份证号码\n * @param {boolean} [options.checkCode=true] 是否校验最后一位校验码,仅支持18位身份证号码\n * @returns {boolean} 值是否为身份证号\n * @example\n *\n * isIdCard('130701199310302288');\n * // => true\n *\n * isIdCard('13070119931030228X');\n * // => false\n *\n * isIdCard('13070119931030228X', { checkCode: false }); // 不校验校验码\n * // => true\n *\n * isIdCard('320311770706001');\n * // => false\n *\n * isIdCard('320311770706001', { loose: true });\n * // => true\n *\n */\nfunction isIdCard(value, { loose = false, checkCode = true } = {}) {\n const valueStr = convertToString(value);\n if (valueStr.length === 15 && loose) {\n return regIdCard.test(valueStr);\n }\n\n if (valueStr.length === 18 && regIdCard.test(valueStr)) {\n if (checkCode) {\n return check(valueStr);\n }\n return true;\n }\n\n return false;\n}\n\nexport default isIdCard;\n","import convertToString from './utils/convertToString';\n\n// 邮箱\nconst reg = /^[\\da-z]+([\\-\\.\\_]?[\\da-z]+)*@[\\da-z]+([\\-\\.]?[\\da-z]+)*(\\.[a-z]{2,})+$/i;\n\n/**\n * 检测值是否为Email\n *\n * @static\n * @alias module:Validator.isEmail\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为Email\n * @example\n *\n * isEmail('1232@qq.com');\n * // => true\n *\n * isEmail('123@');\n * // => false\n *\n */\nfunction isEmail(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isEmail;\n","import convertToString from './utils/convertToString';\n\n// QQ号正则\nconst reg = /^[1-9]\\d{4,10}$/;\n\n/**\n * 检测值是否为QQ号,非0开头,5至11位数字\n *\n * @static\n * @alias module:Validator.isQQ\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为QQ号\n * @example\n *\n * isQQ('12345');\n * // => true\n *\n * isQQ('123');\n * // => false\n *\n */\nfunction isQQ(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isQQ;\n","import convertToString from './utils/convertToString';\n\n// 微信号 6至20位,以字母开头,字母,数字,减号(连接符),下划线\nconst reg = /^[a-z]([-_a-z0-9]{5,19})+$/i;\n\n/**\n * 检测值是否为微信号\n *\n * @static\n * @alias module:Validator.isWX\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为微信号\n * @example\n *\n * isWX('a12345');\n * // => true\n *\n * isWX('123');\n * // => false\n *\n */\nfunction isWX(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isWX;\n","import convertToString from './utils/convertToString';\n\n// 车牌号正则\nconst reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})|([A-Z0-9]{5}[DF])|([DF][A-Z0-9]{5}))$/;\n\n/**\n * 检测值是否为车牌号,支持新能源和非新能源车牌\n *\n * @static\n * @alias module:Validator.isVehicle\n * @see 参考 {@link https://baike.baidu.com/item/车牌号|车牌号}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为车牌号\n * @example\n *\n * isVehicle('京L12345');\n * // => true\n *\n * isVehicle('粤BD12345');\n * // => true\n *\n * isVehicle('粤BF12345');\n * // => true\n *\n * isVehicle('粤B12345D');\n * // => true\n *\n * isVehicle('粤B12345F');\n * // => true\n *\n */\nfunction isVehicle(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isVehicle;\n","import convertToString from './utils/convertToString';\n\n// 非0开头,10~21位数字\nconst reg = /^[1-9]\\d{9,20}$/;\n\n// 8~30位数字\nconst regLoose = /^\\d{8,30}$/;\n\n/**\n * 检测值是否为银行卡号。正常模式(非0开头,10~21位数字)宽松模式(8~30位数字)\n *\n * @static\n * @alias module:Validator.isBankCard\n * @see 参考 {@link https://kf.qq.com/faq/170112ABnm6b170112FvquAn.html|常用银行账号位数参考}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式,8~30位数字\n * @returns {boolean} 值是否为银行卡号\n * @example\n *\n * isBankCard('6228480402564890018');\n * // => true\n *\n * isBankCard('6228480402564890');\n * // => true\n *\n * isBankCard('123456789');\n * // => false\n *\n * isBankCard('123456789', { loose: true });\n * // => true\n *\n */\nfunction isBankCard(value, { loose = false } = {}) {\n const valueStr = convertToString(value);\n\n if (loose) {\n return regLoose.test(valueStr);\n }\n return reg.test(valueStr);\n}\n\nexport default isBankCard;\n","import convertToString from './utils/convertToString';\n\n// 基础规则,由18位数字和大写字母组成,不使用I、O、Z、S、V。\nconst baseReg = /^[\\dA-HJ-NPQRTUWXY]{2}\\d{6}[\\dA-HJ-NPQRTUWXY]{10}$/;\n\n// 基础字符组成\nconst baseCodeArr = '0123456789ABCDEFGHJKLMNPQRTUWXY'.split('');\n\n//加权因子\nconst weightFactor = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];\n\n/**\n * 获取字符位置\n *\n * @private\n * @param {string} code 字符\n * @returns {number} 字符所在基础字符的位置\n */\nfunction getBaseCodeIndex(code) {\n let ret;\n\n baseCodeArr.some((item, index) => {\n if (item === code) {\n ret = index;\n return true;\n }\n return false;\n });\n\n // @ts-ignore\n return ret;\n}\n\n/**\n * 计算校验码\n *\n * @private\n * @since 1.1.0\n * @param {string} preCode 统一代码前17位\n * @returns {string} 校验码\n */\nfunction sumCheckCode(preCode) {\n // const preCodeArr = preCode.split('');\n\n let total = 0;\n\n // 计算字符位置对应序号和加权因子的乘积,总和\n for (let i = 0; i < 17; i++) {\n // 字符位置对应的基础编码序号\n const index = getBaseCodeIndex(preCode[i]);\n // 加权因子\n const wf = weightFactor[i];\n // 计算序号和加权因子的乘积,并计算级数之和\n total += index * wf;\n }\n\n // 计算整数求余函数MOD\n const remainder = total % 31;\n // 校验码字符值序号\n const checkCodeIndex = 31 - remainder;\n\n return baseCodeArr[checkCodeIndex];\n}\n\n/**\n * 检测值是否为统一社会信用代码,也叫三证合一组织代码。由18位数字和大写字母组成,不使用I、O、Z、S、V。\n *\n * @static\n * @alias module:Validator.isSocialCreditCode\n * @see 参考 {@link https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则|GB 32100-2015 法人和其他组织统一社会信用代码编码规则}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,不校验校验位。\n * @returns {boolean} 值是否为统一社会信用代码\n * @example\n *\n * isSocialCreditCode('91350100M000100Y43');\n * // => true\n *\n * isSocialCreditCode('91350100M000100Y4A');\n * // => false\n *\n * // 宽松模式,不校验校验位。所以也可以通过\n * isSocialCreditCode('91350100M000100Y4A', {loose: true});\n * // => true\n *\n */\nfunction isSocialCreditCode(value, { loose = false } = {}) {\n const valueStr = convertToString(value);\n\n const passBaseRule = baseReg.test(valueStr);\n\n // 宽松模式 或 基础规则不通过直接返回\n if (loose || !passBaseRule) {\n return passBaseRule;\n }\n\n // 前17位\n const preCode = valueStr.substring(0, 17);\n // 校验码\n const lastCode = valueStr.substring(valueStr.length - 1);\n // 计算校验码\n const checkCode = sumCheckCode(preCode);\n\n return lastCode === checkCode;\n}\n\nexport default isSocialCreditCode;\n","const config = {\n // 禁用warning提示\n disableWarning: true\n};\n\n/**\n * 设置禁止warning提示\n * @static\n * @alias module:Debug.formatBankCard\n * @since 3.6.1\n * @param {boolean} bool 是否禁止warning提示\n */\nfunction setDisableWarning(bool) {\n config.disableWarning = !!bool;\n}\n\nexport { config, setDisableWarning };\n","import { config } from './utils/config';\n\nconst regNumber = /[\\d]/;\nconst regLowerCaseLetter = /[a-z]/;\nconst regUpperCaseLetter = /[A-Z]/;\nconst regAllNumberAndLetter = /[\\d|a-z]/gi;\n\n/**\n * 是否包含数字\n *\n * @private\n * @param {string} val 检查的值\n * @returns {boolean} 是否包含数字\n */\nfunction hasNumber(val) {\n return regNumber.test(val);\n}\n\n/**\n * 是否包含小写字母\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否包含小写字母\n */\nfunction hasLowerCaseLetter(val) {\n return regLowerCaseLetter.test(val);\n}\n\n/**\n * 是否包含大写字母\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否包含大写字母\n */\nfunction hasUpperCaseLetter(val) {\n return regUpperCaseLetter.test(val);\n}\n\n/**\n * 是否为十六进制\n *\n * @private\n * @param {string} val 检测的值\n * @returns {boolean} 是否为十六进制\n */\nfunction hasHex(val) {\n return val.indexOf('\\\\x') > -1 || val.indexOf('\\\\u') > -1;\n}\n\n/**\n * 是否包含特殊字符\n *\n * @private\n * @param {string} val 检测的值\n * @param {string} [chars] 特殊字符\n * @returns {boolean} 是否包含特殊字符\n */\nfunction hasSpecialCharacter(val, chars = '') {\n if (!chars) {\n return false;\n }\n\n const specialChars = val.replace(regAllNumberAndLetter, '');\n const regChars = hasHex(chars) ? new RegExp(`[${chars}]`) : null;\n\n if (regChars) {\n return regChars.test(specialChars);\n }\n\n let ret = false;\n specialChars.split('').some((charItem) => {\n if (chars.indexOf(charItem) > -1) {\n ret = true;\n }\n return ret;\n });\n return ret;\n}\n\n/**\n * 是否包含非法字符\n *\n * @private\n * @param {string} val 检测的值\n * @param {string} chars 非法字符\n * @returns {boolean} 是否包含非法字符\n */\nfunction hasUnallowableCharacter(val, chars = '') {\n const specialChars = val.replace(regAllNumberAndLetter, '');\n\n if (!chars && specialChars) {\n return true;\n }\n\n const regChars = hasHex(chars) ? new RegExp(`[^${chars}]`) : null;\n if (regChars) {\n return regChars.test(specialChars);\n }\n let ret = false;\n specialChars.split('').some((charItem) => {\n if (chars.indexOf(charItem) === -1) {\n ret = true;\n }\n return ret;\n });\n return ret;\n}\n\n/**\n * 验证密码(数字、大小写字母、特殊字符、非法字符)\n *\n * @see 参考 {@link https://baike.baidu.com/item/ASCII#3|ASCII}\n * @static\n * @alias module:Validator.validatePassword\n * @since 3.7.0\n * @param {string} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,为 ture 时,大小写字母视为一种字符\n * @param {string} [options.special=\"!@#$%^&*()-=_+[]\\|{},./?<>~\"] 支持的特殊字符\n * @returns 验证结果\n * @example\n *\n * validatePassword('a12345678');\n * // =>\n * {\n * validated: true, // 验证结果,根据密码强度、是否包含非法字符得出\n * level: 2, // 强度级别\n * containes: {\n * number: true, // 包含数字\n * lowerCaseLetter: true, // 包含小写字母\n * upperCaseLetter: false, // 包含大写字母\n * specialCharacter: false, // 包含特殊字符\n * unallowableCharacter: false // 包含非法字符\n * }\n * }\n *\n * validatePassword('a12345678', {level: 3});\n * // =>\n * {\n * validated: false,\n * level: 2,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: false,\n * specialCharacter: false,\n * unallowableCharacter: false\n * }\n * }\n *\n * validatePassword('_Aa一二三45678', {level: 3, ignoreCase: true});\n * // =>\n * {\n * validated: false,\n * level: 3,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: true,\n * specialCharacter: true,\n * unallowableCharacter: true\n * }\n * }\n *\n * // 自定义特殊字符\n * validatePassword('_Aa一二三45678', {level: 3, ignoreCase: true, special: '_一二三'});\n * // =>\n * {\n * validated: true,\n * level: 3,\n * containes: {\n * number: true,\n * lowerCaseLetter: true,\n * upperCaseLetter: true,\n * specialCharacter: true,\n * unallowableCharacter: false\n * }\n * }\n */\nfunction validatePassword(value, { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = {}) {\n let valStr = value;\n\n if (typeof value !== 'string') {\n if (!config.disableWarning) {\n console.warn(`[validatePassword] value must be a string.`);\n }\n valStr = '';\n }\n\n let currentLevel = 0;\n\n // 包含数字\n const containesNumber = hasNumber(valStr);\n // 包含小写字母\n const containesLowerCaseLetter = hasLowerCaseLetter(valStr);\n // 包含大写字母\n const containesUpperCaseLetter = hasUpperCaseLetter(valStr);\n // 包含特殊字符\n const containesSpecialCharacter = hasSpecialCharacter(valStr, special);\n // 包含非法字符\n const containesUnallowableCharacter = hasUnallowableCharacter(valStr, special);\n\n if (containesNumber) {\n currentLevel += 1;\n }\n\n if (ignoreCase) {\n // 不区分大小写\n if (containesLowerCaseLetter || containesUpperCaseLetter) {\n currentLevel += 1;\n }\n } else {\n // 区分大小写\n if (containesLowerCaseLetter) {\n currentLevel += 1;\n }\n if (containesUpperCaseLetter) {\n currentLevel += 1;\n }\n }\n\n if (containesSpecialCharacter) {\n currentLevel += 1;\n }\n\n // 验证结果\n const validated = currentLevel >= level && !containesUnallowableCharacter;\n\n return {\n validated,\n level: currentLevel,\n containes: {\n number: containesNumber,\n lowerCaseLetter: containesLowerCaseLetter,\n upperCaseLetter: containesUpperCaseLetter,\n specialCharacter: containesSpecialCharacter,\n unallowableCharacter: containesUnallowableCharacter\n }\n };\n}\n\nexport default validatePassword;\n","import convertToString from './utils/convertToString';\n\n// 护照号 9位,包括首字母和数字;支持 普通护照(E*)、外交护照(DE)、公务护照(SE)、公务普通护照(PE)、香港特区护照(K/KJ)、澳门特区护照(MA)\nconst reg = /^((e[\\da-z])|(de)|(se)|(pe)|(k[\\da-z])|(kj)|(ma))[\\da-z]{7}$/i;\n\n/**\n * 检测值是否为护照号\n * 支持普通护照(E*)、外交护照(DE)、公务护照(SE)、公务普通护照(PE)、香港特区护照(K/KJ)、澳门特区护照(MA)\n *\n * @static\n * @alias module:Validator.isPassport\n * @see 参考 {@link https://zh.wikipedia.org/wiki/中华人民共和国护照#个人资料页|中华人民共和国护照#个人资料页}\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为护照号\n * @example\n *\n * isPassport('E12345678');\n * // => true\n *\n * isPassport('abc');\n * // => false\n *\n */\nfunction isPassport(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isPassport;\n","import convertToString from './utils/convertToString';\n\nconst chineseDictionary = {\n // 基本汉字\n chineseBasic: '[\\u4e00-\\u9fa5]',\n\n // 基本汉字补充\n chineseExtend: '[\\u9ea6-\\u9fef]',\n\n // 汉字扩展A\n chineseExtendA: '[\\u3400-\\u4DB5]',\n\n // 汉字扩展B\n chineseExtendB: '[\\u{20000}-\\u{2A6D6}]',\n\n // 汉字扩展C\n chineseExtendC: '[\\u{2A700}-\\u{2B734}]',\n\n // 汉字扩展D\n chineseExtendD: '[\\u{2B740}-\\u{2B81D}]',\n\n // 汉字扩展E\n chineseExtendE: '[\\u{2B820}-\\u{2CEA1}]',\n\n // 汉字扩展F\n chineseExtendF: '[\\u{2CEB0}-\\u{2EBE0}]'\n};\n\nlet looseChineseRegExp = chineseDictionary.chineseBasic + '+';\n\nlet chineseRegExp = '^' + chineseDictionary.chineseBasic + '+$';\n\n// eslint-disable-next-line no-prototype-builtins\nconst supportRegExpUnicode = RegExp.prototype.hasOwnProperty('unicode');\n\nif (supportRegExpUnicode) {\n looseChineseRegExp = '(?:' + chineseDictionary.chineseBasic + '|' + chineseDictionary.chineseExtend + '|' + chineseDictionary.chineseExtendA + '|' + chineseDictionary.chineseExtendB + '|' + chineseDictionary.chineseExtendC + '|' + chineseDictionary.chineseExtendD + '|' + chineseDictionary.chineseExtendE + '|' + chineseDictionary.chineseExtendF + ')+';\n chineseRegExp = '^(?:' + chineseDictionary.chineseBasic + '|' + chineseDictionary.chineseExtend + '|' + chineseDictionary.chineseExtendA + '|' + chineseDictionary.chineseExtendB + '|' + chineseDictionary.chineseExtendC + '|' + chineseDictionary.chineseExtendD + '|' + chineseDictionary.chineseExtendE + '|' + chineseDictionary.chineseExtendF + ')+$';\n}\n\n/**\n * 检测值是否为中文\n *\n * @static\n * @alias module:Validator.isChinese\n * @since 1.1.0\n * @see 参考 {@link http://www.unicode.org/reports/tr38/#BlockListing|4.4 Listing of Characters Covered by the Unihan Database}\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,只要包含中文即为true\n * @returns {boolean} 值是否为中文\n * @example\n *\n * isChinese('林某某');\n * // => true\n *\n * isChinese('林A');\n * // => false\n *\n * // 宽松模式,只要包含中文即为true\n * isChinese('林A', {loose: true});\n * // => true\n *\n * isChinese('A林A', {loose: true});\n * // => true\n *\n */\nfunction isChinese(value, { loose = false } = {}) {\n const valueStr = convertToString(value);\n const reg = new RegExp(loose ? looseChineseRegExp : chineseRegExp, supportRegExpUnicode ? 'u' : undefined);\n return reg.test(valueStr);\n}\n\nexport default isChinese;\n","import convertToString from './utils/convertToString';\n\n// ipv4正则\nconst reg = /^((\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n\n/**\n * 检测值是否为ipv4\n *\n * @static\n * @alias module:Validator.isIPv4\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为ipv4\n * @example\n *\n * isIPv4('192.168.1.1');\n * // => true\n *\n * isIPv4('255.255.255.255');\n * // => true\n *\n * isIPv4('256.256.256.256');\n * // => false\n *\n * isIPv4('0.0');\n * // => false\n *\n */\nfunction isIPv4(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv4;\n","import convertToString from './utils/convertToString';\n\n// ipv6正则\nconst reg = /^((([0-9A-F]{1,4}:){7}([0-9A-F]{1,4}|:))|(([0-9A-F]{1,4}:){6}(:[0-9A-F]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){5}(((:[0-9A-F]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3})|:))|(([0-9A-F]{1,4}:){4}(((:[0-9A-F]{1,4}){1,3})|((:[0-9A-F]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){3}(((:[0-9A-F]{1,4}){1,4})|((:[0-9A-F]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){2}(((:[0-9A-F]{1,4}){1,5})|((:[0-9A-F]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(([0-9A-F]{1,4}:){1}(((:[0-9A-F]{1,4}){1,6})|((:[0-9A-F]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:))|(:(((:[0-9A-F]{1,4}){1,7})|((:[0-9A-F]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})){3}))|:)))(%.+)?$/i;\n\n/**\n * 检测值是否为ipv6\n *\n * @static\n * @alias module:Validator.isIPv6\n * @since 1.1.0\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为ipv6\n * @example\n *\n * // 冒分十六进制表示法\n * isIPv6('2001:0DB8:0000:0023:0008:0800:200C:417A');\n * // => true\n *\n * // 前导0省略\n * isIPv6('2001:DB8:0:23:8:800:200C:417A');\n * // => true\n *\n * isIPv6('FF01:0:0:0:0:0:0:1101');\n * // => true\n *\n * // 0位压缩表示法\n * isIPv6('FF01::1101');\n * // => true\n *\n * isIPv6('::1');\n * // => true\n *\n * isIPv6('::');\n * // => true\n *\n * isIPv6('0:0:0:0:0:0:0:1');\n * // => true\n *\n * isIPv6('0:0:0:0:0:0:0:0');\n * // => true\n *\n * // 内嵌IPv4地址表示法\n * isIPv6('::192.168.1.1');\n * // => true\n *\n * isIPv6('::FFFF:192.168.1.1');\n * // => true\n *\n * isIPv6('192.168.1.1');\n * // => false\n *\n */\nfunction isIPv6(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isIPv6;\n","import convertToString from './utils/convertToString';\n\n// url正则\nconst reg = /(((^https?:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+(?::\\d+)?|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)$/;\n\n/**\n * 检测值是否为url\n *\n * @static\n * @alias module:Validator.isUrl\n * @since 3.4.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/统一资源定位符|统一资源定位符}\n * @param {*} value 要检测的值\n * @returns {boolean} 值是否为url\n * @example\n *\n * isUrl('');\n * // => false\n *\n * isUrl('8.8.8.8');\n * // => false\n *\n * isUrl('example.com');\n * // => true\n *\n * isUrl('http://example.com');\n * // => true\n *\n * isUrl('https://example.com:8080');\n * // => true\n *\n * isUrl('http://www.example.com/test/123');\n * // => true\n *\n * isUrl('http://www.example.com/test/123?foo=bar');\n * // => true\n */\nfunction isUrl(value) {\n const valueStr = convertToString(value);\n return reg.test(valueStr);\n}\n\nexport default isUrl;\n","import convertToString from './utils/convertToString';\n\n// 基础规则,由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\nconst baseReg = /^\\d{15}$/;\n\n/**\n * 计算校验码\n *\n * @private\n * @since 3.5.0\n * @param {string} preCode 营业执照前14位\n * @returns {number} 校验码\n */\nfunction sumCheckCode(preCode) {\n let retNum; // 校验位数字\n\n let pj = 10; // Pj+1 11,初始为10\n\n for (let j = 0; j < 14; j++) {\n const sj = pj + Number(preCode[j]);\n let sj10 = sj % 10;\n sj10 = sj10 === 0 ? 10 : sj10;\n const pj1 = sj10 * 2;\n pj = pj1 % 11;\n }\n\n // 反模10计算\n if (pj === 10 || pj === 1) {\n retNum = 1;\n } else {\n retNum = 11 - pj;\n }\n\n return retNum;\n}\n\n/**\n * 检测值是否为营业执照号,也叫工商注册号。由14位数字本体码和1位数字校验码组成,其中本体码从左至右依次为:6位首次登记机关码、8位顺序码。\n *\n * @static\n * @alias module:Validator.isBusinessLicense\n * @see 参考 {@link https://wenku.baidu.com/view/19873704cc1755270722087c.html|GS15—2006 工商行政管理市场主体注册号编制规则}\n * @since 3.5.0\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {boolean} [options.loose=false] 宽松模式。如果为true,不校验校验位。\n * @returns {boolean} 值是否为营业执照号\n * @example\n *\n * isBusinessLicense('310115600985533');\n * // => true\n *\n * isBusinessLicense('3101156009');\n * // => false\n *\n * isBusinessLicense('3101156009', { loose: true });\n * // => false\n *\n * isBusinessLicense('310115600985535');\n * // => false\n *\n * isBusinessLicense('310115600985535', { loose: true });\n * // => true\n */\nfunction isBusinessLicense(value, { loose = false } = {}) {\n const valueStr = convertToString(value);\n\n const passBaseRule = baseReg.test(valueStr);\n\n // 宽松模式 或 基础规则不通过直接返回\n if (loose || !passBaseRule) {\n return passBaseRule;\n }\n\n // 前14位\n const preCode = valueStr.substring(0, 14);\n // 校验码\n const lastCode = valueStr.substring(valueStr.length - 1);\n // 计算校验码\n const checkCode = sumCheckCode(preCode);\n\n return lastCode === String(checkCode);\n}\n\nexport default isBusinessLicense;\n","import convertToString from './utils/convertToString';\n\n// 港澳居民来往内地通行证正则\nconst regHMCard = /^[hm]{1}([0-9]{10}|[0-9]{8})$/i;\n\n/**\n * 检测值是否为港澳居民来往内地通行证,俗称回乡证或回乡卡。\n *\n * @static\n * @alias module:Validator.isHMCard\n * @since 4.0.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/港澳居民来往内地通行证|港澳居民来往内地通行证}\n * @param {*} value 要检测的值\n * @returns {boolean} 是否为港澳居民来往内地通行证\n */\nfunction isHMCard(value) {\n const valueStr = convertToString(value);\n return regHMCard.test(valueStr);\n}\n\nexport default isHMCard;\n","import convertToString from './utils/convertToString';\n\n// 台湾居民来往大陆通行证正则,支持一次性短期台胞证\nconst regTWCard = /^(\\d{8}|[\\da-z]{10})$/i;\n\n/**\n * 检测值是否为台湾居民来往大陆通行证,俗称台胞证。\n *\n * @static\n * @alias module:Validator.isTWCard\n * @since 4.0.0\n * @see 参考 {@link https://zh.wikipedia.org/wiki/台湾居民来往大陆通行证|台湾居民来往大陆通行证}\n * @param {*} value 要检测的值\n * @returns {boolean} 是否为台湾居民来往大陆通行证\n */\nfunction isTWCard(value) {\n const valueStr = convertToString(value);\n return regTWCard.test(valueStr);\n}\n\nexport default isTWCard;\n","// 最大安全数字\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n// 最小安全数字\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n","/**\n * 参考: https://github.com/nefe/number-precision/blob/master/src/index.ts\n *\n * 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。\n * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998\n */\n\nimport { MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from './constants';\nimport { config } from './config';\n\n/**\n * 是否为科学计数法数字\n *\n * @param {string} num 检查值\n * @returns {boolean}\n */\nexport function isScientificNumber(num) {\n return /\\d+\\.?\\d*e[\\+\\-]*\\d+/i.test(num);\n}\n\n/**\n * 把错误的数据转正\n *\n * @param {number} num 输入数\n * @param {number} [precision=12] 小数点的精度\n * @returns {number}\n * @example\n *\n * strip(0.09999999999999998)=0.1\n */\nexport function strip(num, precision = 12) {\n return +parseFloat(num.toPrecision(precision));\n}\n\n/**\n * 计算数字的小数点长度,支持科学记数法\n *\n * @param {number|string} num 输入数\n * @returns {number} 小数点长度\n */\nexport function digitLength(num) {\n // Get digit length of e\n const eSplit = num.toString().split(/e/i);\n const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\n return len > 0 ? len : 0;\n}\n\n/**\n * 把小数转成整数,支持科学计数法。如果是小数则放大成整数\n *\n * @param {number|string} num 输入数\n * @returns {number}\n */\nexport function float2Fixed(num) {\n if (!isScientificNumber(num.toString())) {\n return Number(num.toString().replace('.', ''));\n }\n const dLen = digitLength(num);\n return dLen > 0 ? strip(+num * Math.pow(10, dLen)) : +num;\n}\n\n/**\n * 检测数字是否越界,如果越界给出提示\n * @param {number} num 输入数\n * @returns\n */\nexport function checkBoundary(num) {\n if (+num > MAX_SAFE_INTEGER || +num < MIN_SAFE_INTEGER) {\n if (!config.disableWarning) {\n console.warn(`${num} is beyond boundary when transfer to integer, the results may not be accurate`);\n }\n }\n}\n\n/**\n * 去掉左边数字0\n *\n * @param {string} num 数字字符串\n * @returns {string}\n */\nexport function trimLeftZero(num) {\n const reg = /^([+-])?(0+)([0-9\\.]+)$/;\n const result = reg.exec(num);\n\n let sign;\n\n if (result) {\n sign = result[1] || '';\n return sign + (result[3][0] === '.' ? '0' + result[3] : result[3]);\n }\n\n return num;\n}\n\n/**\n * 科学计数法转换成普通数字\n *\n * JavaScript在以下情景会自动将数值转换为科学计数法:\n * 1.小数点前的数字个数大于等于22位\n * 2.小数点前边是0,小数点后十分位(包含十分位)之后连续零的个数大于等于6个\n *\n * @param {string | number} num 科学计数法数字\n * @returns {string} 转换后的数字字符串\n */\nexport function scientificToNumber(num) {\n if (isScientificNumber(num.toString())) {\n const zero = '0';\n const parts = String(num).toLowerCase().split('e');\n const e = parts.pop(); // 存储指数\n // @ts-ignore\n const l = Math.abs(e); // 取绝对值,l-1就是0的个数\n // @ts-ignore\n const sign = e / l; //判断正负\n const coeff_array = parts[0].split('.'); // 将系数按照小数点拆分\n\n //如果是小数\n if (sign === -1) {\n //拼接字符串,如果是小数,拼接0和小数点\n num = zero + '.' + new Array(l).join(zero) + coeff_array.join('');\n } else {\n const dec = coeff_array[1];\n\n //如果是整数,将整数除第一位之外的非零数字计入位数,相应的减少0的个数\n if (l - dec.length < 0) {\n num = trimLeftZero(coeff_array[0] + dec.substring(0, l)) + '.' + dec.substring(l);\n } else {\n //拼接字符串,如果是整数,不需要拼接小数点\n num = coeff_array.join('') + new Array(l - dec.length + 1).join(zero);\n }\n }\n }\n // @ts-ignore\n return num;\n}\n","import isType from './isType';\n\n/**\n * 检查值是否为NaN\n *\n * @static\n * @alias module:Type.isNaN\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为NaN\n * @example\n *\n * isNaN(NaN)\n * // => true\n *\n * isNaN(1)\n * // => false\n */\nfunction _isNaN(value) {\n return isType(value, 'Number') && isNaN(value);\n}\n\nexport default _isNaN;\n","import { checkBoundary, scientificToNumber, isScientificNumber } from './utils/math.util';\nimport isNaN from './utils/type/isNaN';\nimport { trimLeftZero } from './utils/math.util';\nimport { config } from './utils/config';\n\nconst reg = /^[+-]?\\d*\\.?\\d*$/;\n\n/**\n * 检查数字或数字字符串\n *\n * @private\n * @param {string} num\n * @returns 是否为数字\n */\nfunction checkNumber(num) {\n if (!(reg.test(num) || isScientificNumber(num)) || isNaN(num) || (typeof num !== 'number' && typeof num !== 'string') || num === '') {\n if (!config.disableWarning) {\n console.warn(`${num} invalid parameter.`);\n }\n\n return false;\n }\n\n // 数字超限如果不是是字符串,可能有异常\n // 如 1111111111111111111111 // => 1.1111111111111111e+21\n if (typeof num === 'number') {\n checkBoundary(num);\n }\n\n return true;\n}\n\n/**\n * 格式化整数部分\n *\n * @private\n * @param {string} intStr 数字字符串\n * @param {string} thousand 千分位符号\n * @returns 格式化后的值\n */\nfunction formatInt(intStr, thousand) {\n let txt = '';\n intStr = trimLeftZero(intStr);\n intStr = intStr[0] === '+' ? intStr.substring(1) : intStr; // 去掉+符号\n const negativeSymbol = Number(intStr) < 0 ? '-' : '';\n const reArr = negativeSymbol ? intStr.substring(1).split('').reverse() : intStr.split('').reverse();\n\n for (let i = 0; i < reArr.length; i++) {\n txt += reArr[i] + ((i + 1) % 3 === 0 && i + 1 !== reArr.length ? thousand : '');\n }\n\n return negativeSymbol + txt.split('').reverse().join('');\n}\n\n/**\n * 格式化小数部分,如果使用 toFixed,超大额数字会自动被截断\n *\n * @private\n * @param {string} decStr 小数点部分的字符串\n * @param {number} precision 保留位数\n * @param {string} decimal 小数点符号\n * @returns 格式化后的值\n */\nfunction formatDec(decStr, precision, decimal) {\n if (precision === 0) {\n return '';\n }\n\n const zero = 0;\n let ret = '';\n\n if (decStr && Number(decStr) > 0) {\n let tmpNum = parseFloat('0.' + decStr);\n ret = tmpNum.toFixed(precision).substring(2);\n } else {\n ret = zero.toFixed(precision).substring(2);\n }\n\n return decimal + ret;\n}\n\n/**\n * 格式化金额\n *\n * @static\n * @alias module:Processor.formatMoney\n * @since 1.1.0\n * @param {string | number} num 需转换金额 (最大:9007199254740991 最小: -9007199254740991)\n * @param {Object} [options] - 金额格式化配置\n * @param {string | number} [options.precision=2] - 保留位数 (最高:10位)\n * @param {string} [options.symbol] - 货币符号\n * @param {string} [options.thousand=\",\"] - 千分位符号\n * @param {string} [options.decimal=\".\"] - 小数位符号\n * @returns {string} 格式化的金额\n * @example\n *\n * // 整数\n * formatMoney('1000');\n * // => 1,000.00\n *\n * // 小数(默认保留2位小数)\n * formatMoney('3000.03');\n * // => 3,000.03\n *\n * // 保留4位小数\n * formatMoney('3000.0300', { precision: 4 });\n * // => 3,000.0300\n *\n * // 保留10位小数\n * formatMoney('1500.2', { precision: 10 });\n * // => 1,500.2000000000\n *\n * // 自定义单位符号\n * formatMoney(1000.00, { symbol: '$' });\n * // => $1,000.00\n *\n * // 自定义千位分割符(默认',')\n * formatMoney(1000.00, { thousand: '|' });\n * // => 1|000.00\n *\n * // 自定义小数位分割符(默认'.')\n * formatMoney(1000.00, { decimal: '&' });\n * // => 1,000&00\n */\nconst formatMoney = (num, { precision = 2, symbol, thousand = ',', decimal = '.' } = {}) => {\n // 数字参数不正确,返回空字符串\n // @ts-ignore\n if (!checkNumber(num)) {\n return '';\n }\n\n // 参数规整化\n if (typeof precision !== 'number' || isNaN(precision) || precision < 0) {\n precision = 2;\n } else if (precision > 10) {\n precision = 10;\n }\n symbol = typeof symbol === 'string' ? symbol : '';\n thousand = typeof thousand === 'string' ? thousand : ',';\n decimal = typeof decimal === 'string' ? decimal : '.';\n\n // 转换数字字符串,支持科学记数法\n const numStr = scientificToNumber(num) + '';\n // 整数和小数部分\n const [intStr, decStr] = numStr.split('.');\n\n return symbol + formatInt(intStr, thousand) + formatDec(decStr, precision, decimal);\n};\n\nexport default formatMoney;\n","import { checkBoundary } from './utils/math.util';\nimport { config } from './utils/config';\n\n// 简体\nconst chnNumberChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];\nconst chnUnitChar = ['', '十', '百', '千'];\n\n// 繁体\nconst big5NumberChar = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];\nconst big5UnitChar = ['', '拾', '佰', '仟'];\n\n// 数字字符、计数单位\n\n/**\n * @type {string[]}\n * @private\n */\nlet numberChar;\n\n/**\n * @type {string[]}\n * @private\n */\nlet unitChar;\n\n/**\n * @type {string[]}\n * @private\n */\nlet unitSection;\n\n/**\n * 每个小节的内部进行转化\n *\n * @private\n * @param {number} section 数字\n * @returns {string} 转化的数字\n */\nfunction sectionToChinese(section) {\n let str = '',\n chnstr = '',\n zero = false, //zero为是否进行补零, 第一次进行取余由于为个位数,默认不补零\n unitPos = 0;\n\n while (section > 0) {\n // 对数字取余10,得到的数即为个位数\n let v = section % 10;\n\n //如果数字为零,则对字符串进行补零\n if (v == 0) {\n if (zero) {\n //如果遇到连续多次取余都是0,那么只需补一个零即可\n zero = false;\n chnstr = numberChar[v] + chnstr;\n }\n } else {\n //第一次取余之后,如果再次取余为零,则需要补零\n zero = true;\n str = numberChar[v];\n str += unitChar[unitPos];\n chnstr = str + chnstr;\n }\n unitPos++;\n section = Math.floor(section / 10);\n }\n return chnstr;\n}\n\n/**\n * 转换整数\n *\n * @private\n * @param {number} num 要转换的数字\n * @returns {string} 中文数字\n */\nfunction convertInteger(num) {\n num = Math.floor(num);\n\n let unitPos = 0;\n let strIns = '',\n chnStr = '';\n let needZero = false;\n\n if (num === 0) {\n return numberChar[0];\n }\n while (num > 0) {\n var section = num % 10000;\n if (needZero) {\n chnStr = numberChar[0] + chnStr;\n }\n strIns = sectionToChinese(section);\n strIns += section !== 0 ? unitSection[unitPos] : unitSection[0];\n chnStr = strIns + chnStr;\n needZero = section < 1000 && section > 0;\n num = Math.floor(num / 10000);\n unitPos++;\n }\n return chnStr;\n}\n\n/**\n * 转换小数\n *\n * @private\n * @param {number} num 要转换的数字\n */\nfunction convertDecimal(num) {\n const numStr = num + '';\n const index = numStr.indexOf('.');\n\n let ret = '';\n\n if (index > -1) {\n let decimalStr = numStr.slice(index + 1);\n ret = mapNumberChar(parseInt(decimalStr));\n }\n\n return ret;\n}\n\n/**\n * 映射为中文数字\n *\n * @private\n * @param {number} num 要处理的数字\n * @returns {string} 返回中文数字的映射\n */\nfunction mapNumberChar(num) {\n const numStr = num + '';\n let ret = '';\n\n for (let i = 0, len = numStr.length; i < len; i++) {\n ret += numberChar[parseInt(numStr[i])];\n }\n\n return ret;\n}\n\n/**\n * 数字转中文数字\n * 不在安全数字 -9007199254740991~9007199254740991 内,处理会有异常\n *\n * @static\n * @alias module:Processor.numberToChinese\n * @since 1.2.0\n * @param {number} num 数字\n * @param {Object} [options] 配置项\n * @param {boolean} [options.big5=false] 繁体\n * @param {boolean} [options.unit=true] 计数单位\n * @param {string} [options.decimal=\"点\"] 中文小数点\n * @param {string} [options.zero=\"零\"] 设置0。常用配置 〇\n * @param {string} [options.negative=\"负\"] 负数前面的字\n * @param {Object} [options.unitConfig] 节点单位配置\n * @param {string} [options.unitConfig.w=\"万\"] 设置计数单位万。常用配置 萬\n * @param {string} [options.unitConfig.y=\"亿\"] 设置计数单位亿。常用配置 億\n * @returns {string} 中文数字\n * @example\n *\n * numberToChinese(100);\n * // => 一百\n *\n * numberToChinese(100.3);\n * // => 一百点三\n *\n * // 繁体\n * numberToChinese(100, {big5: true});\n * // => 壹佰\n *\n * numberToChinese(100.3, {big5: true});\n * // => 壹佰点叁\n *\n * numberToChinese(1234567890, {big5: true});\n * // => 壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾\n *\n * // 不带计数单位\n * numberToChinese(1990, {unit: false});\n * // => 一九九零\n *\n * // 不带计数单位,修改0\n * numberToChinese(1990, {unit: false, zero:'〇'});\n * // => 一九九〇\n *\n */\nfunction numberToChinese(\n num,\n {\n big5 = false,\n unit = true,\n decimal = '点',\n zero = '',\n negative = '负',\n unitConfig = {\n w: '万', // '萬'\n y: '亿' // '億'\n }\n } = {}\n) {\n // 非数字 或 NaN 不处理\n if (typeof num !== 'number' || isNaN(num)) {\n if (!config.disableWarning) {\n console.warn(`参数错误 ${num},请传入数字`);\n }\n\n return '';\n }\n\n // 超过安全数字提示\n checkBoundary(num);\n\n // 设置数字字符和计数单位\n if (big5) {\n numberChar = big5NumberChar.slice();\n unitChar = big5UnitChar.slice();\n } else {\n numberChar = chnNumberChar.slice();\n unitChar = chnUnitChar.slice();\n }\n\n // 设置节点计数单位,万、亿、万亿\n const defaultUnitWan = '万';\n const defaultUnitYi = '亿';\n unitSection = ['', unitConfig.w || defaultUnitWan, unitConfig.y || defaultUnitYi, unitConfig.w && unitConfig.y ? unitConfig.w + unitConfig.y : defaultUnitWan + defaultUnitYi];\n\n // 设置0\n if (zero) {\n numberChar[0] = zero;\n }\n\n // 前置字符,负数处理\n const preStr = num < 0 ? negative : '';\n\n // 整数和小数\n let chnInteger, chnDecimal;\n\n // 处理整数\n if (unit) {\n chnInteger = convertInteger(num);\n } else {\n chnInteger = mapNumberChar(Math.floor(num));\n }\n\n // 处理小数\n chnDecimal = convertDecimal(num);\n\n return chnDecimal ? `${preStr}${chnInteger}${decimal}${chnDecimal}` : `${preStr}${chnInteger}`;\n}\n\nexport default numberToChinese;\n","import isIdCard from './isIdCard';\n\nconst regIdCard = /^(?<province>\\d{2})(?<city>\\d{2})(?<area>\\d{2})(?<year>(?:\\d{2})?\\d{2})(?<month>\\d{2})(?<day>\\d{2})\\d{2}(?<gender>\\d)(?:\\d|X)?$/i;\n\nconst Provinces = [\n // 华北地区:北京市|110000,天津市|120000,河北省|130000,山西省|140000,内蒙古自治区|150000\n ['11', '北京市'],\n ['12', '天津市'],\n ['13', '河北省'],\n ['14', '山西省'],\n ['15', '内蒙古自治区'],\n\n // 东北地区: 辽宁省|210000,吉林省|220000,黑龙江省|230000\n ['21', '辽宁省'],\n ['22', '吉林省'],\n ['23', '黑龙江省'],\n\n // 华东地区: 上海市|310000,江苏省|320000,浙江省|330000,安徽省|340000,福建省|350000,江西省|360000,山东省|370000\n ['31', '上海市'],\n ['32', '江苏省'],\n ['33', '浙江省'],\n ['34', '安徽省'],\n ['35', '福建省'],\n ['36', '江西省'],\n ['37', '山东省'],\n\n // 华中地区: 河南省|410000,湖北省|420000,湖南省|430000\n ['41', '河南省'],\n ['42', '湖北省'],\n ['43', '湖南省'],\n\n // 华南地区:广东省|440000,广西壮族自治区|450000,海南省|460000\n ['44', '广东省'],\n ['45', '广西壮族自治区'],\n ['46', '海南省'],\n\n // 西南地区:重庆市|500000,四川省|510000,贵州省|520000,云南省|530000,西藏自治区|540000\n ['50', '重庆市'],\n ['51', '四川省'],\n ['52', '贵州省'],\n ['53', '云南省'],\n ['54', '西藏自治区'],\n\n // 西北地区: 陕西省|610000,甘肃省|620000,青海省|630000,宁夏回族自治区|640000,新疆维吾尔自治区|650000\n ['61', '陕西省'],\n ['62', '甘肃省'],\n ['63', '青海省'],\n ['64', '宁夏回族自治区'],\n ['65', '新疆维吾尔自治区'],\n\n // 台湾地区:台湾省|710000\n // 台湾居民公民身份号码地址码为830000,参考 http://www.wanweibaike.com/wiki-中华人民共和国行政区划代码_(7区)、https://zh.wikipedia.org/wiki/港澳台居民居住证\n ['71', '台湾省'],\n ['83', '台湾省'],\n\n // 港澳地区:香港特别行政区|810000,澳门特别行政区|820000\n ['81', '香港特别行政区'],\n ['82', '澳门特别行政区']\n];\n\n// 第一位数字是以前的大区制代码。第二位是大区所在省市编码。全国共分为8个大区:华北(1)、东北(2)、华东(3)、中南(4)、西南(5)、西北(6)、台湾(7)和港澳(8)。\n// const Regions = [\n// ['1', '华北地区'],\n// ['2', '东北地区'],\n// ['3', '华东地区'],\n// ['4', '中南地区'],\n// ['5', '西南地区'],\n// ['6', '西北地区'],\n// ['7', '台湾地区'],\n// ['8', '港澳地区']\n// ];\n\n/**\n * 解析身份证号码,支持15、18位身份证号码\n * \n * @static\n * @alias module:Processor.parseIdCard\n * @since 4.0.0\n * @see 参考 {@link https://baike.baidu.com/item/居民身份证号码|居民身份证号码}\n * @param {string} id 身份证号码,支持15位\n * @returns null 或 省份、生日、性别,省/市/区/年/月/日/性别编码\n * @example\n * parseIdCard('123456789123456');\n * // => null\n * \n * // 18位身份证号码\n * parseIdCard('130701199310302288')\n * // =>\n * {\n birthday: \"1993-10-30\",\n gender: \"女\",\n origin: { province: \"13\", city: \"07\", area: \"01\", year: \"1993\", month: \"10\", day: \"30\", gender: \"8\" },\n province: \"河北省\"\n}\n * // 15位身份证号码\n * parseIdCard('130701931030228');\n * // =>\n * {\n birthday: \"93-10-30\",\n gender: \"女\",\n origin: { province: \"13\", city: \"07\", area: \"01\", year: \"93\", month: \"10\", day: \"30\", gender: \"8\" },\n province: \"河北省\"\n}\n * \n */\nfunction parseIdCard(id) {\n if (!isIdCard(id, { loose: true })) {\n return null;\n }\n\n const info = regIdCard.exec(id);\n\n if (!info) {\n return null;\n }\n\n /**\n * @type {{ province: string, city: string, area: string, year: string, month: string, day: string, gender: string }}\n *\n */\n let origin = {\n province: '',\n city: '',\n area: '',\n year: '',\n month: '',\n day: '',\n gender: ''\n };\n\n if (info.groups) {\n // @ts-ignore\n origin = info.groups;\n } else {\n origin = {\n province: info[1],\n city: info[2],\n area: info[3],\n year: info[4],\n month: info[5],\n day: info[6],\n gender: info[7]\n };\n }\n\n const province = Provinces.find((item) => item[0] === origin.province);\n\n if (!province) {\n return null;\n }\n\n const birthday = `${origin.year}-${origin.month}-${origin.day}`;\n const gender = Number(origin.gender) % 2 === 0 ? '女' : '男';\n // const region = Regions.find(item => item[0] === origin.province?.substring(0, 1));\n\n return {\n // region,\n province: province[1],\n birthday,\n gender,\n origin\n };\n}\n\nexport default parseIdCard;\n","import isType from './isType';\n\n/**\n * 检查值是否为Number\n *\n * @static\n * @alias module:Type.isNumber\n * @since 1.1.0\n * @param {*} value 检查值\n * @returns {boolean} 是否为Number\n * @example\n *\n * isNumber(1)\n * // => true\n *\n * isNumber(Number.MIN_VALUE)\n * // => true\n *\n * isNumber(Infinity)\n * // => true\n *\n * isNumber(NaN)\n * // => true\n *\n * isNumber('1')\n * // => false\n */\nfunction isNumber(value) {\n return isType(value, 'Number');\n}\n\nexport default isNumber;\n","import { digitLength, float2Fixed, checkBoundary } from './utils/math.util';\nimport { isNumber, isNaN, isString } from './utils/type';\n\n/**\n * 精确乘法,支持多个数相乘\n *\n * @static\n * @alias module:Math.times\n * @since 3.1.0\n * @param {...number|string} nums 相乘的数\n * @returns {number} 乘积\n * @example\n *\n * times(3, 0.6);\n * // => 1.8\n *\n * times(3, 0.6, 2);\n * // => 3.6\n *\n * times(3, 0.6, 2, 10);\n * // => 36\n */\nfunction times(...nums) {\n const [num1, num2, ...rest] = nums;\n if (rest.length > 0) {\n return times(times(num1, num2), ...rest);\n }\n\n // 兼容处理,如果第2个参数为非数字或字符串时,返回第一个参数\n if ((!isNumber(num2) || isNaN(num2)) && !isString(num2)) {\n // @ts-ignore\n return num1;\n }\n\n const num1Changed = float2Fixed(num1);\n const num2Changed = float2Fixed(num2);\n const baseNum = digitLength(num1) + digitLength(num2);\n const leftValue = num1Changed * num2Changed;\n\n checkBoundary(leftValue);\n\n return leftValue / Math.pow(10, baseNum);\n}\n\nexport default times;\n","import { strip, digitLength, float2Fixed, checkBoundary } from './utils/math.util';\nimport times from './times';\nimport { isNumber, isNaN, isString } from './utils/type';\n\n/**\n * 精确除法,支持多个数相除\n *\n * @static\n * @alias module:Math.divide\n * @since 3.1.0\n * @param {...number|string} nums 除数和被除数\n * @returns {number} 商数\n * @example\n *\n * divide(1.21, 1.1);\n * // => 1.1\n *\n * divide(1000, 10, 10);\n * // => 10\n *\n * divide(1000, 10, 10, 10);\n * // => 1\n */\nfunction divide(...nums) {\n const [num1, num2, ...rest] = nums;\n\n if (rest.length > 0) {\n return divide(divide(num1, num2), ...rest);\n }\n\n // 兼容处理,如果第2个参数为非数字或字符串时,返回第一个参数\n if ((!isNumber(num2) || isNaN(num2)) && !isString(num2)) {\n // @ts-ignore\n return num1;\n }\n\n const num1Changed = float2Fixed(num1);\n const num2Changed = float2Fixed(num2);\n checkBoundary(num1Changed);\n checkBoundary(num2Changed);\n // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正\n return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\n}\n\nexport default divide;\n","// file、blob文件如何预览图片?\n// 方法1:将file或者blob类型文件转成base64数据,再作为src赋值给img标签\n// 方法2:使用 window.URL.createObjectURL(blob) 为blob、file 创建一个指向该参数对象的URL\n\n/**\n * 将 Blob 或 File 对象转成 data:URL 格式的 Base64 字符串。\n *\n * @static\n * @alias module:Processor.blobToDataURL\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL|FileReader.readAsDataURL()}\n * @since 4.1.0\n * @param {Blob} blob Blob 或 File 对象\n * @returns {Promise<string>} data:URL 格式的 Base64 字符串。\n * @example\n * const aFileParts = ['<a id=\"a\"><b id=\"b\">hey!</b></a>']; // 一个包含DOMString的数组\n * const htmlBlob = new Blob(aFileParts, { type: 'text/html' }); // 得到 blob\n *\n * blobToDataURL(htmlBlob).then(data=>{\n * console.log(data); // data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * });\n *\n * const textBlob = new Blob(aFileParts, { type: 'text/plain' });\n *\n * blobToDataURL(textBlob).then(data=>{\n * console.log(data); // data:text/plain;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * });\n */\nfunction blobToDataURL(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(blob);\n // @ts-ignore\n reader.onload = () => resolve(reader.result);\n reader.onerror = (error) => reject(error);\n });\n}\n\nexport default blobToDataURL;\n","/**\n * 字节转换存储单位,保留2位小数点\n *\n * @static\n * @alias module:Processor.bytesToSize\n * @since 3.8.0\n * @param {number} bytes 字节大小\n * @returns {string} 存储单位值\n * @example\n *\n * bytesToSize(0);\n * // => 0 B\n *\n * bytesToSize(1024);\n * // => 1 KB\n *\n * bytesToSize(3.213243*1024*1024);\n * // => 3.21 MB\n *\n * bytesToSize(1024*1024*1024);\n * // => 1 GB\n */\nfunction bytesToSize(bytes) {\n if (bytes === 0) return '0 B';\n const k = 1024;\n // 存储单位\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return sizes[i] ? `${Number((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}` : bytes + '';\n}\n\nexport default bytesToSize;\n","/**\n * 将 DataURL 转为 Blob 对象\n *\n * @static\n * @alias module:Processor.dataURLToBlob\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Glossary/Base64|Base64}\n * @since 4.1.0\n * @param {string} dataurl data: 协议的URL\n * @returns {Blob} Blob 对象\n * @example\n * const dataurl = 'data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';\n * dataURLToBlob(dataurl);\n */\nfunction dataURLToBlob(dataurl) {\n const arr = dataurl.split(',');\n // @ts-ignore\n const mime = arr[0].match(/:(.*?);/)[1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return new Blob([u8arr], { type: mime });\n}\n\nexport default dataURLToBlob;\n","/**\n * 格式化银行卡号\n *\n * @static\n * @alias module:Processor.formatBankCard\n * @since 1.1.0\n * @param {string} bankCardNo 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {string} [options.char=\" \"] 间隔字符\n * @param {number} [options.length=4] 间隔长度\n * @returns {string} 格式化的银行卡号\n * @example\n *\n * // 19位银行卡\n * formatBankCard('6228480402564890018');\n * // => 6228 4804 0256 4890 018\n *\n * // 16位银行卡\n * formatBankCard('6228480402564890');\n * // => 6228 4804 0256 4890\n *\n * // 脱敏银行卡\n * formatBankCard('6228********890');\n * // => 6228 **** **** 890\n *\n * // 16位银行卡,\"-\"间隔\n * formatBankCard('6228480402564890', {char: '-'});\n * // => 6228-4804-0256-4890\n *\n */\nfunction formatBankCard(bankCardNo = '', { char = ' ', length = 4 } = {}) {\n const reg = new RegExp(`(.{${length}})`, 'g');\n const regChar = new RegExp(`${char}`, 'g');\n\n const realValue = bankCardNo.replace(regChar, '');\n\n const needRemoveLastChar = realValue.length % length === 0;\n\n const str = realValue.replace(reg, `$1${char}`);\n\n return needRemoveLastChar ? str.substring(0, str.length - 1) : str;\n}\n\nexport default formatBankCard;\n","import validatePassword from './validatePassword';\n\n/**\n * 检测值是否符合密码强度\n * <p><strong>注意:该校验只校验是否存在不同字符(大小写字母、数字、特殊符号),不判断长度。</strong></p>\n * <p><i>如果需要更细致的验证,请使用 <a href=\"#.validatePassword\">validatePassword</a></i></p>\n *\n * @see 参考 {@link https://baike.baidu.com/item/ASCII#3|ASCII}\n * @static\n * @alias module:Validator.isPassword\n * @since 1.1.0\n * @requires module:Validator.validatePassword\n * @param {*} value 要检测的值\n * @param {Object} [options] 配置项\n * @param {number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)\n * @param {boolean} [options.ignoreCase=false] 是否忽略大小写,为 ture 时,大小写字母视为一种字符\n * @param {string} [options.special=\"!@#$%^&*()-=_+[]\\|{},./?<>~\"] 支持的特殊字符\n * @returns {boolean} 值是否符合密码强度\n * @example\n *\n * isPassword('a12345678');\n * // => true\n *\n * isPassword('a12345678', {level: 3});\n * // => false\n *\n * isPassword('Aa12345678', {level: 3});\n * // => true\n *\n * isPassword('Aa12345678', {level: 3, ignoreCase: true});\n * // => false\n *\n * isPassword('_Aa12345678', {level: 3, ignoreCase: true});\n * // => true\n *\n * // 仅支持 数字、字母、特殊字符,其他字符如中文字符是校验不通过的\n * isPassword('_Aa一二三45678', {level: 3, ignoreCase: true});\n * // => false\n *\n * isPassword(' _Aa12345678', {level: 3, ignoreCase: true});\n * // => false\n */\nfunction isPassword(value, { level = 2, ignoreCase = false, special = '\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E' } = {}) {\n return validatePassword(value, { level, ignoreCase, special }).validated;\n}\n\nexport default isPassword;\n","/**\n * 检测值是否类似Promise对象\n *\n * @static\n * @alias module:Validator.isPromiseLike\n * @since 3.8.0\n * @param {*} obj 要检测的值\n * @returns {boolean} 是否类似Promise对象\n * @example\n *\n * isPromiseLike([]);\n * => false\n *\n * isPromiseLike({then:()=>{}});\n * => true\n *\n * isPromiseLike(Promise.resolve());\n * => true\n */\nfunction isPromiseLike(obj) {\n return obj !== null && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';\n}\n\nexport default isPromiseLike;\n","import { digitLength } from './utils/math.util';\nimport times from './times';\nimport { isNumber, isNaN, isString } from './utils/type';\n\n/**\n * 精确减法,支持多个数相减\n *\n * @static\n * @alias module:Math.minus\n * @since 3.1.0\n * @param {...number|string} nums 相减的数\n * @returns {number} 差\n * @example\n *\n * minus(1, 0.9);\n * // => 0.1\n *\n * minus(1, 0.9, 0.02);\n * // => 0.08\n *\n * minus(1, 0.9, 0.02, 0.08);\n * // => 0\n */\nfunction minus(...nums) {\n const [num1, num2, ...rest] = nums;\n\n if (rest.length > 0) {\n return minus(minus(num1, num2), ...rest);\n }\n\n // 兼容处理,如果第2个参数为非数字或字符串时,返回第一个参数\n if ((!isNumber(num2) || isNaN(num2)) && !isString(num2)) {\n // @ts-ignore\n return num1;\n }\n\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\n}\n\nexport default minus;\n","import { digitLength } from './utils/math.util';\nimport times from './times';\nimport { isNumber, isNaN, isString } from './utils/type';\n\n/**\n * 精确加法,支持多个数相加\n *\n * @static\n * @alias module:Math.plus\n * @since 3.1.0\n * @param {...number|string} nums 相加的数\n * @returns {number} 总和\n * @example\n *\n * plus(0.1, 0.2);\n * // => 0.3\n *\n * plus(0.1, 0.2, 0.3);\n * // => 0.6\n *\n * plus(0.1, 0.2, 0.3, 0.4);\n * // => 1\n */\nfunction plus(...nums) {\n const [num1, num2, ...rest] = nums;\n\n if (rest.length > 0) {\n return plus(plus(num1, num2), ...rest);\n }\n\n // 兼容处理,如果第2个参数为非数字或字符串时,返回第一个参数\n if ((!isNumber(num2) || isNaN(num2)) && !isString(num2)) {\n // @ts-ignore\n return num1;\n }\n\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\n}\n\nexport default plus;\n","/**\n * 替换字符,应用场景如:脱敏\n *\n * @static\n * @alias module:Processor.replaceChar\n * @since 1.1.0\n * @param {string} str 要处理的字符串\n * @param {Object} [options] 配置项\n * @param {number} [options.start=3] 开始位置\n * @param {number} [options.end=-4] 结束位置\n * @param {string} [options.char=\"*\"] 替换字符\n * @param {number} [options.repeat] 替换字符的重复次数,默认为替换内容长度,可设置为固定值\n * @param {string} [options.exclude] 排除字符,如果指定排除项,repeat设置无效\n * @returns {string} 处理后的字符\n * @example\n *\n * // 手机号\n * replaceChar('13000000000');\n * // => 130****0000\n *\n * // 身份证\n * replaceChar('130701199310302288');\n * // => 130***********2288\n *\n * // 邮箱\n * const email = '12345@qq.com'\n * replaceChar(email, {start: 2, end: email.indexOf('@'), repeat: 4});\n * // => 12****@qq.com\n *\n * // 银行卡号\n * replaceChar('6228480402564890018', {start: 0, end: -4, repeat: 4});\n * // => ****0018\n *\n * // 带格式的银行卡号\n * replaceChar('6228 4804 0256 4890 018', {start: 4, end: -4, exclude: ' '});\n * // => 6228 **** **** **** 018\n *\n * // 用户名\n * replaceChar('林某某', {start: 1, end: Infinity, repeat: 2});\n * // => 林**\n * replaceChar('林某', {start: 1, end: Infinity, repeat: 2});\n * // => 林**\n * replaceChar('林某某某', {start: 1, end: Infinity, repeat: 2});\n * // => 林**\n *\n */\nfunction replaceChar(str = '', { start = 3, end = -4, char = '*', repeat, exclude } = {}) {\n const strLen = str.length;\n\n // 开始位置超过str长度\n if (Math.abs(start) >= strLen) {\n return str;\n }\n\n start = start >= 0 ? start : strLen + start;\n end = end >= 0 ? end : strLen + end;\n\n // 开始位置大于结束位置\n if (start >= end) {\n return str;\n }\n\n let middleStr = str.substring(start, end);\n\n if (exclude) {\n const reg = new RegExp(`[^${exclude}]`, 'g');\n middleStr = middleStr.replace(reg, char);\n } else {\n repeat = typeof repeat === 'number' && repeat >= 0 ? repeat : middleStr.length;\n middleStr = char.repeat(repeat);\n }\n\n return str.substring(0, start) + middleStr + str.substring(end);\n}\n\nexport default replaceChar;\n","import divide from './divide';\nimport times from './times';\n\n/**\n * 四舍五入,支持设置精度\n *\n * @static\n * @alias module:Math.round\n * @since 3.1.0\n * @param {number|string} num 要四舍五入的数字\n * @param {number} [precision=0] 四舍五入的精度\n * @returns {number} 四舍五入的数字\n * @example\n *\n * round(4.006);\n * // => 4\n *\n * round(4.006, 2);\n * // => 4.01\n *\n * round(4060, -2);\n * // => 4100\n */\nfunction round(num, precision = 0) {\n const base = Math.pow(10, precision);\n return divide(Math.round(times(num, base)), base);\n}\n\nexport default round;\n","/**\n * 设置 DataURL 前缀、MIME 类型、base64 标识。<br/><br/>\n *\n * 如果你需要获取DataURL 的 MIME 类型和数据本身,推荐使用 <a href=\"https://www.npmjs.com/package/data-urls\">data-urls</a>。\n *\n * @static\n * @alias module:Processor.setDataURLPrefix\n * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Data_URIs|Data URLs}\n * @param {string} data 数据本身\n * @param {string} [mimetype=\"image/png\"] MIME 类型\n * @param {boolean} [base64=true] 添加 base64 标识\n * @returns {string} DataURL 格式的字符串\n * @example\n * const data = 'PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';\n * setDataURLPrefix(data); // data:image/png;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'image/png', false); // data:image/png,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'image/jpg'); // data:image/jpg;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, 'text/html'); // data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, ''); // data:;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n * setDataURLPrefix(data, '', false); // data:,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=\n */\nfunction setDataURLPrefix(data, mimetype = 'image/png', base64 = true) {\n return `data:${mimetype}${base64 ? ';base64' : ''},${data}`;\n}\n\nexport default setDataURLPrefix;\n"],"names":["toString","Object","prototype","isType","value","typename","call","isString","convertToString","String","reg","regIdCard","isIdCard","loose","checkCode","valueStr","length","test","id","index","sum","num","Math","pow","Number","check","regLoose","baseReg","baseCodeArr","split","weightFactor","getBaseCodeIndex","code","ret","some","item","config","disableWarning","regNumber","regLowerCaseLetter","regUpperCaseLetter","regAllNumberAndLetter","hasHex","val","indexOf","validatePassword","level","ignoreCase","special","valStr","console","warn","currentLevel","containesNumber","containesLowerCaseLetter","hasLowerCaseLetter","containesUpperCaseLetter","hasUpperCaseLetter","containesSpecialCharacter","chars","specialChars","replace","regChars","RegExp","charItem","hasSpecialCharacter","containesUnallowableCharacter","hasUnallowableCharacter","validated","containes","number","lowerCaseLetter","upperCaseLetter","specialCharacter","unallowableCharacter","chineseDictionary","looseChineseRegExp","chineseRegExp","supportRegExpUnicode","hasOwnProperty","regHMCard","regTWCard","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","isScientificNumber","strip","precision","parseFloat","toPrecision","digitLength","eSplit","len","float2Fixed","dLen","checkBoundary","trimLeftZero","result","exec","sign","_isNaN","isNaN","chnNumberChar","chnUnitChar","big5NumberChar","big5UnitChar","numberChar","unitChar","unitSection","sectionToChinese","section","str","chnstr","zero","unitPos","v","floor","mapNumberChar","numStr","i","parseInt","Provinces","isNumber","times","nums","num1","num2","rest","num1Changed","num2Changed","baseNum","leftValue","divide","blob","Promise","resolve","reject","reader","FileReader","readAsDataURL","onload","onerror","error","bytes","sizes","log","toFixed","dataurl","arr","mime","match","bstr","atob","n","u8arr","Uint8Array","charCodeAt","Blob","type","bankCardNo","char","regChar","realValue","needRemoveLastChar","substring","symbol","thousand","decimal","checkNumber","parts","toLowerCase","e","pop","l","abs","coeff_array","Array","join","dec","scientificToNumber","intStr","decStr","txt","negativeSymbol","reArr","reverse","formatInt","formatDec","passBaseRule","preCode","lastCode","retNum","pj","j","sj10","sumCheckCode","undefined","obj","then","total","minus","max","big5","unit","negative","unitConfig","w","y","slice","defaultUnitWan","preStr","chnInteger","chnDecimal","strIns","chnStr","needZero","convertInteger","decimalStr","convertDecimal","info","origin","province","city","area","year","month","day","gender","groups","find","birthday","plus","start","end","repeat","exclude","strLen","middleStr","base","round","data","mimetype","base64","bool"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ // file、blob文件如何预览图片?
2
+ // 方法1:将file或者blob类型文件转成base64数据,再作为src赋值给img标签
3
+ // 方法2:使用 window.URL.createObjectURL(blob) 为blob、file 创建一个指向该参数对象的URL
4
+
5
+ /**
6
+ * 将 Blob 或 File 对象转成 data:URL 格式的 Base64 字符串。
7
+ *
8
+ * @static
9
+ * @alias module:Processor.blobToDataURL
10
+ * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL|FileReader.readAsDataURL()}
11
+ * @since 4.1.0
12
+ * @param {Blob} blob Blob 或 File 对象
13
+ * @returns {Promise<string>} data:URL 格式的 Base64 字符串。
14
+ * @example
15
+ * const aFileParts = ['<a id="a"><b id="b">hey!</b></a>']; // 一个包含DOMString的数组
16
+ * const htmlBlob = new Blob(aFileParts, { type: 'text/html' }); // 得到 blob
17
+ *
18
+ * blobToDataURL(htmlBlob).then(data=>{
19
+ * console.log(data); // data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=
20
+ * });
21
+ *
22
+ * const textBlob = new Blob(aFileParts, { type: 'text/plain' });
23
+ *
24
+ * blobToDataURL(textBlob).then(data=>{
25
+ * console.log(data); // data:text/plain;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=
26
+ * });
27
+ */
28
+ function blobToDataURL(blob) {
29
+ return new Promise(function (resolve, reject) {
30
+ var reader = new FileReader();
31
+ reader.readAsDataURL(blob); // @ts-ignore
32
+
33
+ reader.onload = function () {
34
+ return resolve(reader.result);
35
+ };
36
+
37
+ reader.onerror = function (error) {
38
+ return reject(error);
39
+ };
40
+ });
41
+ }
42
+
43
+ export default blobToDataURL;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 将 DataURL 转为 Blob 对象
3
+ *
4
+ * @static
5
+ * @alias module:Processor.dataURLToBlob
6
+ * @see 参考 {@link https://developer.mozilla.org/zh-CN/docs/Glossary/Base64|Base64}
7
+ * @since 4.1.0
8
+ * @param {string} dataurl data: 协议的URL
9
+ * @returns {Blob} Blob 对象
10
+ * @example
11
+ * const dataurl = 'data:text/html;base64,PGEgaWQ9ImEiPjxiIGlkPSJiIj5oZXkhPC9iPjwvYT4=';
12
+ * dataURLToBlob(dataurl);
13
+ */
14
+ function dataURLToBlob(dataurl) {
15
+ var arr = dataurl.split(','); // @ts-ignore
16
+
17
+ var mime = arr[0].match(/:(.*?);/)[1];
18
+ var bstr = atob(arr[1]);
19
+ var n = bstr.length;
20
+ var u8arr = new Uint8Array(n);
21
+
22
+ while (n--) {
23
+ u8arr[n] = bstr.charCodeAt(n);
24
+ }
25
+
26
+ return new Blob([u8arr], {
27
+ type: mime
28
+ });
29
+ }
30
+
31
+ export default dataURLToBlob;
package/esm/index.js CHANGED
@@ -38,6 +38,9 @@ export { default as replaceChar } from './replaceChar';
38
38
  export { default as numberToChinese } from './numberToChinese';
39
39
  export { default as bytesToSize } from './bytesToSize';
40
40
  export { default as parseIdCard } from './parseIdCard';
41
+ export { default as blobToDataURL } from './blobToDataURL';
42
+ export { default as dataURLToBlob } from './dataURLToBlob';
43
+ export { default as setDataURLPrefix } from './setDataURLPrefix';
41
44
  /**
42
45
  * 数学计算,修正浮点数计算问题
43
46
  *