@zxcvbn-ts/matcher-pwned
Version:
HaveIBeenPwned Matcher for zxcvbn-ts
3 lines (2 loc) • 1.61 kB
JavaScript
this.zxcvbnts=this.zxcvbnts||{},this.zxcvbnts["matcher-pwned"]=function(e){"use strict";const t="undefined"!=typeof process&&process.release&&"node"===process.release.name,r=async e=>{const r=(e=>{if(t){const t=decodeURI(encodeURIComponent(e)),r=new Uint8Array(t.length);for(let e=0;e<t.length;e+=1)r[e]=t.charCodeAt(e);return r}try{return(new TextEncoder).encode(e)}catch(e){throw new Error(`No encoder found, ${e}`)}})(e);let n="";if(t){n=require("crypto").createHash("sha1").update(e).digest("hex").toUpperCase()}else if(crypto){const e=await crypto.subtle.digest("SHA-1",r);n=Array.from(new Uint8Array(e)).map((e=>e.toString(16).padStart(2,"0"))).join("").toUpperCase()}return n},n=e=>!1;var s=async(e,{universalFetch:t,url:s="https://api.pwnedpasswords.com/range/",networkErrorHandler:a=n})=>{if(!t||e.length<2)return null;const o=(await r(e)).toUpperCase(),c=o.slice(0,5),i=o.slice(5),d=await t(`${s}${c}`,{method:"GET",headers:{"Add-Padding":"true"}}).catch((e=>a(e)));if("boolean"==typeof d)return!1;if(d.status>=400)return a(d);return(await d.text()).split("\r\n").find((e=>e.split(":")[0]===i))},a=(e,{url:t,networkErrorHandler:r})=>class{async match({password:n}){const a=[],o=await s(n,{universalFetch:e,url:t,networkErrorHandler:r});return o&&a.push({pattern:"pwned",pwnedAmount:parseInt(o.split(":")[1],10),i:0,j:n.length-1,token:n}),a}},o=()=>1,c=e=>()=>({warning:e.translations.warnings.pwned,suggestions:[e.translations.suggestions.pwned]});return e.haveIBeenPwned=s,e.matcherPwnedFactory=(e,t,r={})=>({Matching:a(e,r),feedback:c(t),scoring:o}),e}({});
//# sourceMappingURL=zxcvbn-ts.min.js.map