@rohan9024/redact0 0.0.0-stage → 1.0.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.
package/dist/fhir.cjs ADDED
@@ -0,0 +1 @@
1
+ 'use strict';var st=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),it=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),O=new TextEncoder;function R(s,t){return s>>>t|s<<32-t}function I(s){let t=s.length*8,r=Math.ceil((s.length+9)/64)*64,n=new Uint8Array(r);n.set(s),n[s.length]=128;let i=new DataView(n.buffer),a=Math.floor(t/4294967296),o=t>>>0;i.setUint32(r-8,a,false),i.setUint32(r-4,o,false);let e=new Uint32Array(it),l=new Uint32Array(64);for(let c=0;c<r;c+=64){for(let f=0;f<16;f++)l[f]=i.getUint32(c+f*4,false);for(let f=16;f<64;f++){let v=l[f-15],k=l[f-2],D=R(v,7)^R(v,18)^v>>>3,N=R(k,17)^R(k,19)^k>>>10;l[f]=l[f-16]+D+l[f-7]+N>>>0;}let d=e[0],p=e[1],u=e[2],g=e[3],x=e[4],y=e[5],E=e[6],m=e[7];for(let f=0;f<64;f++){let v=R(x,6)^R(x,11)^R(x,25),k=x&y^~x&E,D=m+v+k+st[f]+l[f]>>>0,N=R(d,2)^R(d,13)^R(d,22),rt=d&p^d&u^p&u,nt=N+rt>>>0;m=E,E=y,y=x,x=g+D>>>0,g=u,u=p,p=d,d=D+nt>>>0;}e[0]=e[0]+d>>>0,e[1]=e[1]+p>>>0,e[2]=e[2]+u>>>0,e[3]=e[3]+g>>>0,e[4]=e[4]+x>>>0,e[5]=e[5]+y>>>0,e[6]=e[6]+E>>>0,e[7]=e[7]+m>>>0;}let h=new Uint8Array(32),b=new DataView(h.buffer);for(let c=0;c<8;c++)b.setUint32(c*4,e[c],false);return h}function P(s,t,r=64){let n=O.encode(s),i=n.length>64?I(n):n,a=new Uint8Array(64);a.set(i);let o=new Uint8Array(64),e=new Uint8Array(64);for(let p=0;p<64;p++){let u=a[p];o[p]=u^92,e[p]=u^54;}let l=O.encode(t),h=new Uint8Array(64+l.length);h.set(e,0),h.set(l,64);let b=I(h),c=new Uint8Array(96);c.set(o,0),c.set(b,64);let d=I(c);return z(d).slice(0,r)}function _(s,t=64){return z(I(O.encode(s))).slice(0,t)}function z(s){let t="";for(let r=0;r<s.length;r++)t+=s[r].toString(16).padStart(2,"0");return t}function V(s=8){let t=new Uint8Array(s);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(t);else for(let r=0;r<s;r++)t[r]=Math.floor(Math.random()*256);return z(t)}function T(s){return s.replace(/\D/g,"")}function Z(s){let t=T(s);if(t.length<13||t.length>19||/^(\d)\1+$/.test(t))return false;let r=0,n=false;for(let i=t.length-1;i>=0;i--){let a=t.charCodeAt(i)-48;n&&(a*=2,a>9&&(a-=9)),r+=a,n=!n;}return r%10===0}function U(s){let t=T(s);if(!/^[12]\d{9}$/.test(t))return false;let r="80840"+t,n=0,i=false;for(let a=r.length-1;a>=0;a--){let o=r.charCodeAt(a)-48;i&&(o*=2,o>9&&(o-=9)),n+=o,i=!i;}return n%10===0}function F(s){let t=s.trim().toUpperCase();if(!/^[ABFGMPRX][A-Z9]\d{7}$/.test(t))return false;let r=o=>t.charCodeAt(2+o)-48,n=r(0)+r(2)+r(4),i=r(1)+r(3)+r(5);return (n+2*i)%10===r(6)}var S="ACDEFGHJKMNPQRTUVWXY",K="0123456789"+S;function $(s){let t=s.replace(/-/g,"").toUpperCase();if(t.length!==11)return false;let r=t.charCodeAt(0);return !(r<49||r>57||!S.includes(t[1])||!K.includes(t[2])||!/\d/.test(t[3])||!S.includes(t[4])||!K.includes(t[5])||!/\d/.test(t[6])||!S.includes(t[7])||!S.includes(t[8])||!/\d\d/.test(t.slice(9,11)))}var at={AD:24,AE:23,AL:28,AT:20,AZ:28,BA:20,BE:16,BG:22,BH:22,BR:29,BY:28,CH:21,CR:22,CY:28,CZ:24,DE:22,DK:18,DO:28,EE:20,EG:29,ES:24,FI:18,FO:18,FR:27,GB:22,GE:22,GI:23,GL:18,GR:27,GT:28,HR:21,HU:28,IE:22,IL:23,IQ:23,IS:26,IT:27,JO:30,KW:30,KZ:20,LB:28,LC:32,LI:21,LT:20,LU:20,LV:21,MC:27,MD:24,ME:22,MK:19,MR:27,MT:31,MU:30,NL:18,NO:15,PK:24,PL:28,PS:29,PT:25,QA:29,RO:24,RS:22,SA:24,SE:24,SI:19,SK:24,SM:27,ST:25,SV:28,TL:23,TN:24,TR:26,UA:29,VA:22,VG:24,XK:20};function H(s){let t=s.replace(/[\s-]+/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(t))return false;let r=at[t.slice(0,2)];if(r!==void 0&&t.length!==r)return false;let n=t.slice(4)+t.slice(0,4),i=0;for(let a=0;a<n.length;a++){let o=n.charCodeAt(a);if(o>=48&&o<=57)i=(i*10+(o-48))%97;else if(o>=65&&o<=90){let e=o-55;i=(i*100+e)%97;}else return false}return i===1}function L(s){let t=T(s);if(t.length!==10||/^(\d)\1+$/.test(t))return false;let r=0;for(let a=0;a<9;a++)r+=(t.charCodeAt(a)-48)*(10-a);let i=11-r%11;return i===11&&(i=0),i===10?false:i===t.charCodeAt(9)-48}function Y(s,t){let r=s.trim(),n=/[-\s]/.test(r),i=T(r);if(i.length!==9)return false;let a=Number(i.slice(0,3)),o=Number(i.slice(3,5)),e=Number(i.slice(5,9));if(a===0||a===666||a>=900||o===0||e===0||/^(\d)\1+$/.test(i))return false;if(!n&&t){let l=t.fullText.slice(Math.max(0,t.start-36),t.start);return /\b(ssn|social[\s_-]?security|tin)\b/i.test(l)}return true}var ot=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],ct=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]];function B(s){let t=T(s);if(!/^[2-9]\d{11}$/.test(t))return false;let r=0;for(let n=0;n<t.length;n++){let i=t.charCodeAt(t.length-1-n)-48;r=ot[r][ct[n%8][i]];}return r===0}function G(s){let t=T(s);if(!/^[1-9]\d{10}$/.test(t))return false;let r=new Array(10).fill(0);for(let e=0;e<10;e++)r[t.charCodeAt(e)-48]+=1;let n=r.filter(e=>e===2||e===3).length,i=Math.max(...r);if(n!==1||i>3)return false;let a=10;for(let e=0;e<10;e++){let l=(t.charCodeAt(e)-48+a)%10;l===0&&(l=10),a=l*2%11;}let o=11-a;return o===10&&(o=0),o===t.charCodeAt(10)-48}function j(s){let t=s.split(".");if(t.length!==3)return false;let r=t[0];if(!r.startsWith("eyJ"))return false;try{let n=r.replace(/-/g,"+").replace(/_/g,"/"),i=(4-n.length%4)%4,a=atob(n+"=".repeat(i));return a.startsWith("{")&&a.includes('"')}catch{return false}}function J(s){let t=s.split(".").map(Number);if(t.length!==4)return false;let[r,n]=t;return r===void 0||n===void 0?false:r===10||r===127||r===0||r===192&&n===168||r===172&&n>=16&&n<=31||r===169&&n===254}function W(s){let t=s.split(".");if(t.length!==4)return false;for(let r of t){if(r.length===0||r.length>1&&r.startsWith("0"))return false;let n=Number(r);if(!Number.isInteger(n)||n<0||n>255)return false}return true}function q(s){if(s.length===0)return 0;let t=new Map;for(let i=0;i<s.length;i++){let a=s.charCodeAt(i);t.set(a,(t.get(a)??0)+1);}let r=0,n=s.length;for(let i of t.values()){let a=i/n;r-=a*Math.log2(a);}return r}var A=["default","secrets","hipaa","gdpr","strict"],w=["default","hipaa","gdpr","strict"],C=["hipaa","strict"],ut=["gdpr","strict"],X=[{id:"pem-private-key",category:"PRIVATE_KEY",priority:100,presets:A,pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----[\s\S]{16,8192}?-----END (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----/g},{id:"connection-uri-password",category:"CONNECTION_URI",priority:96,presets:A,captureGroup:1,pattern:/\b(?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis(?:s)?|amqp(?:s)?|mssql|clickhouse|cockroachdb):\/\/[^:\s/@]+:([^@\s/]{3,256})@[^\s"'<>]+/gi},{id:"anthropic-key",category:"API_KEY",priority:95,presets:A,pattern:/\bsk-ant-(?:api\d{2}|admin\d{2}|oat\d{2}|[a-z0-9]+)-[A-Za-z0-9_-]{24,}\b/g},{id:"openai-key",category:"API_KEY",priority:95,presets:A,pattern:/\bsk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{24,}\b|\bsk-[A-Za-z0-9]{16,}T3BlbkFJ[A-Za-z0-9]{16,}\b/g},{id:"github-token",category:"API_KEY",priority:95,presets:A,pattern:/\b(?:gh[pousr]_[A-Za-z0-9_]{36,}|github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{40,})\b/g},{id:"aws-access-key",category:"API_KEY",priority:94,presets:A,pattern:/\b(?:AKIA|ASIA|AROA|AIDA)[0-9A-Z]{16}\b/g},{id:"stripe-secret",category:"API_KEY",priority:94,presets:A,pattern:/\b(?:sk_live|rk_live|whsec)_[A-Za-z0-9]{20,}\b/g},{id:"google-api-key",category:"API_KEY",priority:93,presets:A,pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{id:"slack-token",category:"TOKEN",priority:93,presets:A,pattern:/\bxox[baprs]-[0-9A-Za-z-]{14,}\b|https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+/g},{id:"discord-webhook",category:"SECRET",priority:92,presets:A,pattern:/https:\/\/discord(?:app)?\.com\/api\/webhooks\/\d{16,22}\/[A-Za-z0-9_-]{40,}/g},{id:"provider-prefixed-keys",category:"API_KEY",priority:92,presets:A,pattern:/\b(?:hf_[A-Za-z0-9]{30,}|gsk_[A-Za-z0-9]{36,}|xai-[A-Za-z0-9]{36,}|pplx-[A-Za-z0-9]{36,}|sbp_[A-Za-z0-9]{36,}|sb_secret_[A-Za-z0-9_-]{24,}|re_[A-Za-z0-9_]{24,}|npm_[A-Za-z0-9]{36}|pypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}|SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43})\b/g},{id:"jwt-token",category:"JWT",priority:90,presets:A,pattern:/\beyJ[A-Za-z0-9_-]{6,}\.eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{8,}\b/g,validate:s=>j(s)},{id:"bearer-auth-header",category:"TOKEN",priority:88,presets:A,captureGroup:1,pattern:/\b(?:Authorization|Proxy-Authorization)\s*[:=]\s*["']?(?:Bearer|Basic|Token)\s+([A-Za-z0-9._~+/=-]{12,})["']?/gi},{id:"contextual-secret-assignment",category:"SECRET",priority:72,presets:A,captureGroup:1,pattern:/\b(?:api[_-]?key|secret[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|aws_secret_access_key|password|passwd|pwd|signing[_-]?secret)\b\s*[:=]\s*["']?([^\s"',;}{]{10,128})["']?/gi,validate:s=>!s.startsWith("[")&&!s.startsWith("<")&&q(s)>=2.8},{id:"medicare-mbi",category:"MBI",priority:84,presets:C,pattern:/\b[1-9][AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y]{2}\d{2}\b/gi,validate:s=>$(s)},{id:"us-dea",category:"DEA",priority:83,presets:C,pattern:/\b[ABFGMPRX][A-Z9]\d{7}\b/g,validate:s=>F(s)},{id:"us-npi",category:"NPI",priority:80,presets:C,contextWindow:40,contextRegex:/\b(?:npi|provider|prescriber|practitioner|physician)\b/i,pattern:/\b[12]\d{9}\b/g,validate:s=>U(s)},{id:"uk-nhs-number",category:"NHS",priority:80,presets:["hipaa","gdpr","strict"],contextWindow:40,contextRegex:/\b(?:nhs|patient|health|care|medical)\b/i,pattern:/\b\d{3}[-\s]?\d{3}[-\s]?\d{4}\b/g,validate:s=>L(s)},{id:"medical-record-number",category:"MRN",priority:78,presets:C,captureGroup:1,pattern:/\b(?:mrn|medical[\s_-]?record(?:[\s_-]?number)?|patient[\s_-]?id)\s*[:=#]?\s*([A-Z0-9-]{5,20})\b/gi},{id:"iban",category:"IBAN",priority:84,presets:w,pattern:/\b[A-Z]{2}\d{2}(?:[\s-]?[A-Z0-9]){11,30}\b/g,validate:s=>H(s)},{id:"credit-card",category:"CREDIT_CARD",priority:82,presets:w,pattern:/\b(?:\d[ -]?){13,18}\d\b/g,validate:s=>{let t=s.replace(/\D/g,"");return /^(?:4\d{12}(?:\d{3})?(?:\d{3})?|5[1-5]\d{14}|2(?:2[2-9]|[3-6]\d|7[01]|720)\d{12}|3[47]\d{13}|6(?:011|5\d\d)\d{12}|3(?:0[0-5]|[68]\d)\d{11}|(?:2131|1800|35\d{3})\d{11})$/.test(t)&&Z(t)}},{id:"us-ssn",category:"SSN",priority:81,presets:w,pattern:/\b\d{3}[-\s]\d{2}[-\s]\d{4}\b|\b\d{9}\b/g,validate:(s,t)=>Y(s,t)},{id:"aadhaar-in",category:"AADHAAR",priority:76,presets:["gdpr","strict"],contextWindow:40,contextRegex:/\b(?:aadhaar|aadhar|uidai)\b/i,pattern:/\b[2-9]\d{3}[-\s]?\d{4}[-\s]?\d{4}\b/g,validate:s=>B(s)},{id:"de-tax-id",category:"TAX_ID",priority:76,presets:ut,contextWindow:45,contextRegex:/\b(?:steuer|tax|tin|idnr|identifikationsnummer)\b/i,pattern:/\b[1-9]\d{10}\b/g,validate:s=>G(s)},{id:"email",category:"EMAIL",priority:75,presets:w,pattern:/\b[A-Za-z0-9._%+-]{1,64}@(?:[A-Za-z0-9-]{1,63}\.)+[A-Za-z]{2,24}\b/g},{id:"phone",category:"PHONE",priority:65,presets:w,pattern:/(?:\+\d{1,3}[-.\s]?)?(?:\(\d{2,4}\)[-.\s]?|\b\d{3}[-.\s])\d{3,4}[-.\s]\d{4}\b|\+\d{1,3}[-.\s]?\d{2,4}[-.\s]?\d{3,4}[-.\s]?\d{3,4}\b/g,validate:s=>{let t=s.replace(/\D/g,"");return t.length>=10&&t.length<=15&&!/^(\d)\1+$/.test(t)}},{id:"ipv4",category:"IP_ADDRESS",priority:60,presets:w,pattern:/\b(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}\b/g,validate:s=>W(s)},{id:"ipv6",category:"IP_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b|\b(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\b/g},{id:"mac-address",category:"MAC_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\b/g},{id:"labeled-person-name",category:"PERSON",priority:55,presets:["hipaa","strict"],captureGroup:1,pattern:/\b(?:Patient(?:\s+Name)?|Dr\.|Doctor|Clinician|Provider|Mr\.|Mrs\.|Ms\.|Full\s+Name|Beneficiary)\s*[:.]?\s*([A-Z][a-z]{1,24}(?:\s+[A-Z]\.?)?(?:\s+[A-Z][a-z]{1,24}){1,2})/g},{id:"dob-or-clinical-date",category:"DATE",priority:52,presets:C,contextWindow:40,contextRegex:/\b(?:dob|birth|born|admit(?:ted)?|discharg(?:e|ed)|visit|encounter|date)\b/i,pattern:/\b(?:\d{4}-\d{2}-\d{2}|(?:0?[1-9]|1[0-2])[/-](?:0?[1-9]|[12]\d|3[01])[/-](?:19|20)\d{2})\b/g}];var lt=/^(?:password|passwd|pwd|passphrase|secret|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|authorization|cookie|set-cookie|x-api-key|client[_-]?secret|private[_-]?key|ssn|social[_-]?security(?:[_-]?number)?|cvv|cvc|pin|iban|dob|birth[_-]?date|mrn)$/i,dt=/\[[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?\]|<[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?>/g;function Q(s){let t=s.toLowerCase();return t.includes("ssn")||t.includes("social")?"SSN":t.includes("iban")?"IBAN":t.includes("mrn")?"MRN":t.includes("dob")||t.includes("birth")?"DATE":t.includes("password")||t.includes("passwd")||t.includes("secret")||t==="cvv"||t==="cvc"||t==="pin"?"SECRET":t.includes("token")||t==="authorization"||t==="cookie"||t==="set-cookie"?"TOKEN":t.includes("key")?"API_KEY":"CUSTOM"}function ft(s){let t=s.preset??"default",r=s.rules?[...s.rules]:X.filter(a=>a.presets.includes(t)),i=[...(s.customRules??[]).map(a=>({id:a.id,category:a.category??"CUSTOM",pattern:a.pattern,captureGroup:a.captureGroup,priority:a.priority??85,presets:["default","secrets","hipaa","gdpr","strict"],validate:a.validate})),...r];if(s.categories?.length){let a=new Set(s.categories);i=i.filter(o=>a.has(o.category));}if(s.excludeCategories?.length){let a=new Set(s.excludeCategories);i=i.filter(o=>!a.has(o.category));}return i}function pt(s,t){let r=[];for(let n of t){if(!n||n.length<4)continue;let i=0;for(;;){let a=s.indexOf(n,i);if(a===-1)break;r.push({id:"literal-secret",category:"SECRET",priority:99,start:a,end:a+n.length,value:n}),i=a+n.length;}}return r}function tt(s,t,r){let n=[],i=r.allowlist?new Set(r.allowlist):void 0,a=r.redactPrivateIps??(r.preset==="strict"||r.preset==="hipaa");r.literals?.length&&n.push(...pt(s,r.literals));for(let e of t){let l=e.pattern.flags.includes("g")?e.pattern.flags:e.pattern.flags+"g",h=new RegExp(e.pattern.source,l),b;for(;(b=h.exec(s))!==null;){if(b[0].length===0){h.lastIndex+=1;continue}let c=b.index,d=b[0];if(e.captureGroup!==void 0&&b[e.captureGroup]!==void 0){let u=b[e.captureGroup],g=b[0].indexOf(u);g!==-1&&(c=b.index+g,d=u);}let p=c+d.length;if(!i?.has(d)&&!(e.id==="ipv4"&&!a&&J(d))){if(e.contextRegex){let u=e.contextWindow??40,g=s.slice(Math.max(0,c-u),c),x=s.slice(p,Math.min(s.length,p+u));if(!e.contextRegex.test(g)&&!e.contextRegex.test(x))continue}if(e.validate){let u={fullText:s,match:b,start:c,end:p,value:d};if(!e.validate(d,u))continue}n.push({id:e.id,category:e.category,priority:e.priority,start:c,end:p,value:d});}}}n.sort((e,l)=>{if(l.priority!==e.priority)return l.priority-e.priority;let h=l.end-l.start-(e.end-e.start);return h!==0?h:e.start-l.start});let o=[];for(let e of n){let l=false;for(let h of o)if(e.start<h.end&&e.end>h.start){l=true;break}l||o.push(e);}return o.sort((e,l)=>e.start-l.start),o}var M=class s{options;rules;tokenFormat;vaultKey;sensitiveKeyRe;forward=new Map;reverse=new Map;counters=new Map;reservedTokens=new Set;_version=0;constructor(t={}){this.options=t,this.rules=ft(t),this.tokenFormat=t.tokenFormat??"bracket",this.vaultKey=t.secret??V(16),this.sensitiveKeyRe=t.sensitiveKeys?.length?new RegExp(`^(?:${t.sensitiveKeys.map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$`,"i"):lt;}get version(){return this._version}fingerprint(t){return P(this.vaultKey,t,12)}reserveExistingTokens(t){let r=new RegExp(dt.source,"g"),n;for(;(n=r.exec(t))!==null;)this.reverse.has(n[0])||this.reservedTokens.add(n[0]);}tokenize(t,r){let n=`${t}:${r}`,i=this.forward.get(n);if(i!==void 0)return i;if(this.tokenFormat==="mask")return (this.options.maskChar??"*").repeat(Math.min(Math.max(r.length,4),16));if(this.tokenFormat==="hash"){let e=P(this.vaultKey,n,8),l=`[${t}:${e}]`;return this.forward.set(n,l),this.reverse.set(l,{category:t,value:r}),this._version+=1,l}let a=this.counters.get(t)??0,o;do if(a+=1,this.tokenFormat==="angle")o=`<${t}_${a}>`;else if(this.tokenFormat==="signed"){let e=P(this.vaultKey,`${t}:${a}:${r}`,4);o=`[${t}_${a}#${e}]`;}else o=`[${t}_${a}]`;while(this.reservedTokens.has(o)||this.reverse.has(o));return this.counters.set(t,a),this.forward.set(n,o),this.reverse.set(o,{category:t,value:r}),this._version+=1,o}scan(t){return typeof t!="string"||t.length===0?[]:tt(t,this.rules,this.options).map(n=>({id:n.id,category:n.category,start:n.start,end:n.end,token:`[${n.category}]`,length:n.value.length,fingerprint:_(n.value,12)}))}redactText(t){if(typeof t!="string"||t.length===0)return {value:t,findings:[],count:0};this.reserveExistingTokens(t);let r=tt(t,this.rules,this.options);if(r.length===0)return {value:t,findings:[],count:0};let n="",i=0,a=[];for(let o of r){n+=t.slice(i,o.start);let e=this.tokenize(o.category,o.value);n+=e,i=o.end,a.push({id:o.id,category:o.category,start:o.start,end:o.end,token:e,length:o.value.length,fingerprint:this.fingerprint(o.value)});}return n+=t.slice(i),{value:n,findings:a,count:a.length}}redactObject(t){let r=[],n=this.options.maxDepth??32,i=new WeakMap,a=(e,l,h)=>{if(e==null)return e;if(typeof e=="string"){if(h&&this.sensitiveKeyRe.test(h)&&e.length>0&&!this.reverse.has(e)){let d=Q(h),p=this.tokenize(d,e);return r.push({id:"sensitive-key",category:d,start:0,end:e.length,token:p,length:e.length,fingerprint:this.fingerprint(e)}),p}let c=this.redactText(e);return c.count>0&&r.push(...c.findings),c.value}if(typeof e!="object")return e;if(l>=n)return "[MAX_DEPTH_TRUNCATED]";if(i.has(e))return i.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof URL){let c=new URL(e.toString());c.password&&(c.password=this.tokenize("SECRET",c.password));let d=[];c.searchParams.forEach((p,u)=>{d.push([u,p]);});for(let[p,u]of d)if(this.sensitiveKeyRe.test(p)&&u)c.searchParams.set(p,this.tokenize(Q(p),u));else {let g=this.redactText(u);g.count>0&&(r.push(...g.findings),c.searchParams.set(p,g.value));}return c}if(typeof Headers<"u"&&e instanceof Headers){let c=new Headers;return e.forEach((d,p)=>{c.set(p,a(d,l+1,p));}),c}if(e instanceof Error){let c={name:e.name,message:this.options.redactErrors!==false?a(e.message,l+1):e.message};e.stack!==void 0&&(c.stack=this.options.redactErrors!==false?a(e.stack,l+1):e.stack),"cause"in e&&e.cause!==void 0&&(c.cause=a(e.cause,l+1));for(let d of Object.keys(e))c[d]=a(e[d],l+1,d);return c}if(Array.isArray(e)){let c=[];i.set(e,c);for(let d=0;d<e.length;d++)c.push(a(e[d],l+1,h));return c}if(e instanceof Map){let c=new Map;i.set(e,c);for(let[d,p]of e.entries()){let u=typeof d=="string"?d:void 0;c.set(a(d,l+1),a(p,l+1,u));}return c}if(e instanceof Set){let c=new Set;i.set(e,c);for(let d of e.values())c.add(a(d,l+1));return c}let b={};i.set(e,b);for(let[c,d]of Object.entries(e))b[c]=a(d,l+1,c);return b};return {value:a(t,0),findings:r,count:r.length}}redact(t){return typeof t=="string"?this.redactText(t):this.redactObject(t)}restore(t){if(typeof t!="string"||t.length===0||this.reverse.size===0)return t;let n=Array.from(this.reverse.keys()).sort((a,o)=>o.length-a.length).map(a=>a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),i=new RegExp(n.join("|"),"g");return t.replace(i,a=>this.reverse.get(a)?.value??a)}restoreObject(t){let r=new WeakMap,n=(i,a)=>{if(i==null)return i;if(typeof i=="string")return this.restore(i);if(typeof i!="object"||a>=32)return i;if(r.has(i))return r.get(i);if(Array.isArray(i)){let e=[];r.set(i,e);for(let l of i)e.push(n(l,a+1));return e}if(i instanceof Date||i instanceof RegExp||i instanceof URL)return i;let o={};r.set(i,o);for(let[e,l]of Object.entries(i))o[e]=n(l,a+1);return o};return n(t,0)}entries(){return Array.from(this.reverse.entries()).map(([t,r])=>({token:t,category:r.category,value:r.value}))}export(){let t={};for(let[r,n]of this.counters.entries())t[r]=n;return {version:1,tokenFormat:this.tokenFormat,counters:t,entries:this.entries()}}static fromJSON(t,r={}){let n=new s({...r,tokenFormat:t.tokenFormat});for(let[i,a]of Object.entries(t.counters))n.counters.set(i,a);for(let i of t.entries)n.forward.set(`${i.category}:${i.value}`,i.token),n.reverse.set(i.token,{category:i.category,value:i.value});return n._version+=1,n}clear(){this.forward.clear(),this.reverse.clear(),this.counters.clear(),this.reservedTokens.clear(),this._version+=1;}};var et=new Set(["036","059","063","102","203","556","692","790","821","823","830","831","878","879","884","890","893"]),gt=new Set([...et,"205","369"]),ht=new Set(["resourceType","coding","code","system","display","unit","valueQuantity","valueCodeableConcept","severity","clinicalStatus","verificationStatus","category","gender","status","intent","priority"]),yt=new Set(["name","family","given","prefix","suffix","maiden"]),bt=new Set(["text","line","city","district","use","note","description","title"]),xt=new Set(["photo","data"]),At=/^(\d{4})-(\d{2})-(\d{2})(.*)$/,mt=/^\d{4}$/;function vt(s,t){let r=t??String(s.export().entries.length)+"fhir",n=_(r,8),i=parseInt(n,16),a=30+i%151;return i%2===0?a:-a}function Rt(s,t){let r=At.exec(s);if(!r)return s;let n=Number(r[1]),i=Number(r[2]),a=Number(r[3]),o=r[4]??"",e=new Date(Date.UTC(n,i-1,a));if(Number.isNaN(e.getTime()))return s;e.setUTCDate(e.getUTCDate()+t);let l=e.getUTCFullYear().toString().padStart(4,"0"),h=(e.getUTCMonth()+1).toString().padStart(2,"0"),b=e.getUTCDate().toString().padStart(2,"0");return `${l}-${h}-${b}${o}`}function Et(s){let t=/^(\d{4})/.exec(s);if(!t)return false;let r=Number(t[1]);return new Date().getUTCFullYear()-r>89}function kt(s,t){let r=s.replace(/\D/g,"");if(r.length<3)return "000";let n=r.slice(0,3);return (t==="hhs-2000"?et:gt).has(n)?"000":n}function Ot(s,t={},r){let n=r??new M({...t,preset:t.preset??"hipaa"}),i=t.zipBaseline??"conservative-union",a=t.dateStrategy??"shift",o=t.capAgeOver89??true,e=t.preserveClinicalCodes??true,l=typeof s.id=="string"?s.id:JSON.stringify(s.identifier??"default"),h=t.dateShiftDays??vt(n,l),b=(u,g)=>{if(g&&o&&Et(u))return "90+";if(mt.test(u))return u;if(a==="redact")return n.tokenize("DATE",u);if(a==="year-only"){let x=/^(\d{4})/.exec(u);return x?x[1]:n.tokenize("DATE",u)}return Rt(u,h)},c=(u,g,x)=>{if(u==null)return u;let y=g[g.length-1]??"";if(typeof u=="string"){if(x&&y!=="display")return u;if(y==="postalCode")return kt(u,i);if(y==="birthDate")return b(u,true);if(y==="date"||y==="effectiveDateTime"||y==="authoredOn"||y==="onsetDateTime"||y==="recordedDate"||y==="issued"||y==="start"||y==="end")return b(u,false);if(y==="div")return n.redactText(u).value;if(yt.has(y))return n.tokenize("PERSON",u);if(y==="line"||y==="street"||y==="city")return n.tokenize("ADDRESS",u);if(y==="id"||g.includes("identifier")&&y==="value")return n.tokenize("MRN",u);if(g.includes("telecom")&&y==="value"){let f=n.redactText(u);return f.count>0?f.value:n.tokenize("CUSTOM",u)}return n.redactText(u).value}if(typeof u!="object")return u;if(Array.isArray(u))return u.map(f=>c(f,g,x));let E=u,m={};for(let[f,v]of Object.entries(E)){if(f==="resourceType"){m[f]=v;continue}if(xt.has(f)&&(g.includes("photo")||f==="photo")){m[f]=f==="photo"?[]:"[REDACTED_BIOMETRIC]";continue}if(f==="name"&&(E.resourceType==="Patient"||E.resourceType==="Practitioner"||E.resourceType==="RelatedPerson")){m[f]=c(v,[...g,f],false);continue}let k=e&&(x||ht.has(f));bt.has(f)&&!x?m[f]=c(v,[...g,f],false):m[f]=c(v,[...g,f],k);}return m},d=c(s,[],false),p=n.entries().map((u,g)=>({id:"fhir-phi",category:u.category,start:g,end:g,token:u.token,length:u.value.length,fingerprint:_(u.value,12)}));return {value:d,findings:p,count:p.length,vault:n}}exports.RESTRICTED_ZIP3_CONSERVATIVE=gt;exports.RESTRICTED_ZIP3_HHS_2000=et;exports.redactFHIR=Ot;
@@ -0,0 +1,21 @@
1
+ import { V as Vault } from './engine-CBII6Rkn.cjs';
2
+ import { F as FhirRedactOptions, a as RedactResult } from './types-DZbmtyhn.cjs';
3
+
4
+ /**
5
+ * 17 restricted 3-digit US ZIP prefixes under 20,000 population from HHS 45 CFR 164.514(b)(2)(i)(B)
6
+ * (2000 Census baseline).
7
+ */
8
+ declare const RESTRICTED_ZIP3_HHS_2000: Set<string>;
9
+ /**
10
+ * Conservative union of HHS 2000 + 2010 Census under-20k 3-digit ZIP prefixes (adds 205 & 369).
11
+ */
12
+ declare const RESTRICTED_ZIP3_CONSERVATIVE: Set<string>;
13
+ /**
14
+ * Scrubs a FHIR R4/R5 resource or Bundle in accordance with HIPAA Safe Harbor
15
+ * (45 CFR §164.514(b)) while preserving clinical codes and numerical observations.
16
+ */
17
+ declare function redactFHIR<T extends Record<string, unknown>>(resource: T, options?: FhirRedactOptions, existingVault?: Vault): RedactResult<T> & {
18
+ vault: Vault;
19
+ };
20
+
21
+ export { RESTRICTED_ZIP3_CONSERVATIVE, RESTRICTED_ZIP3_HHS_2000, redactFHIR };
package/dist/fhir.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { V as Vault } from './engine-DXYt06CR.js';
2
+ import { F as FhirRedactOptions, a as RedactResult } from './types-DZbmtyhn.js';
3
+
4
+ /**
5
+ * 17 restricted 3-digit US ZIP prefixes under 20,000 population from HHS 45 CFR 164.514(b)(2)(i)(B)
6
+ * (2000 Census baseline).
7
+ */
8
+ declare const RESTRICTED_ZIP3_HHS_2000: Set<string>;
9
+ /**
10
+ * Conservative union of HHS 2000 + 2010 Census under-20k 3-digit ZIP prefixes (adds 205 & 369).
11
+ */
12
+ declare const RESTRICTED_ZIP3_CONSERVATIVE: Set<string>;
13
+ /**
14
+ * Scrubs a FHIR R4/R5 resource or Bundle in accordance with HIPAA Safe Harbor
15
+ * (45 CFR §164.514(b)) while preserving clinical codes and numerical observations.
16
+ */
17
+ declare function redactFHIR<T extends Record<string, unknown>>(resource: T, options?: FhirRedactOptions, existingVault?: Vault): RedactResult<T> & {
18
+ vault: Vault;
19
+ };
20
+
21
+ export { RESTRICTED_ZIP3_CONSERVATIVE, RESTRICTED_ZIP3_HHS_2000, redactFHIR };
package/dist/fhir.mjs ADDED
@@ -0,0 +1 @@
1
+ var st=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),it=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),O=new TextEncoder;function R(s,t){return s>>>t|s<<32-t}function I(s){let t=s.length*8,r=Math.ceil((s.length+9)/64)*64,n=new Uint8Array(r);n.set(s),n[s.length]=128;let i=new DataView(n.buffer),a=Math.floor(t/4294967296),o=t>>>0;i.setUint32(r-8,a,false),i.setUint32(r-4,o,false);let e=new Uint32Array(it),l=new Uint32Array(64);for(let c=0;c<r;c+=64){for(let f=0;f<16;f++)l[f]=i.getUint32(c+f*4,false);for(let f=16;f<64;f++){let v=l[f-15],k=l[f-2],D=R(v,7)^R(v,18)^v>>>3,N=R(k,17)^R(k,19)^k>>>10;l[f]=l[f-16]+D+l[f-7]+N>>>0;}let d=e[0],p=e[1],u=e[2],g=e[3],x=e[4],y=e[5],E=e[6],m=e[7];for(let f=0;f<64;f++){let v=R(x,6)^R(x,11)^R(x,25),k=x&y^~x&E,D=m+v+k+st[f]+l[f]>>>0,N=R(d,2)^R(d,13)^R(d,22),rt=d&p^d&u^p&u,nt=N+rt>>>0;m=E,E=y,y=x,x=g+D>>>0,g=u,u=p,p=d,d=D+nt>>>0;}e[0]=e[0]+d>>>0,e[1]=e[1]+p>>>0,e[2]=e[2]+u>>>0,e[3]=e[3]+g>>>0,e[4]=e[4]+x>>>0,e[5]=e[5]+y>>>0,e[6]=e[6]+E>>>0,e[7]=e[7]+m>>>0;}let h=new Uint8Array(32),b=new DataView(h.buffer);for(let c=0;c<8;c++)b.setUint32(c*4,e[c],false);return h}function P(s,t,r=64){let n=O.encode(s),i=n.length>64?I(n):n,a=new Uint8Array(64);a.set(i);let o=new Uint8Array(64),e=new Uint8Array(64);for(let p=0;p<64;p++){let u=a[p];o[p]=u^92,e[p]=u^54;}let l=O.encode(t),h=new Uint8Array(64+l.length);h.set(e,0),h.set(l,64);let b=I(h),c=new Uint8Array(96);c.set(o,0),c.set(b,64);let d=I(c);return z(d).slice(0,r)}function _(s,t=64){return z(I(O.encode(s))).slice(0,t)}function z(s){let t="";for(let r=0;r<s.length;r++)t+=s[r].toString(16).padStart(2,"0");return t}function V(s=8){let t=new Uint8Array(s);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(t);else for(let r=0;r<s;r++)t[r]=Math.floor(Math.random()*256);return z(t)}function T(s){return s.replace(/\D/g,"")}function Z(s){let t=T(s);if(t.length<13||t.length>19||/^(\d)\1+$/.test(t))return false;let r=0,n=false;for(let i=t.length-1;i>=0;i--){let a=t.charCodeAt(i)-48;n&&(a*=2,a>9&&(a-=9)),r+=a,n=!n;}return r%10===0}function U(s){let t=T(s);if(!/^[12]\d{9}$/.test(t))return false;let r="80840"+t,n=0,i=false;for(let a=r.length-1;a>=0;a--){let o=r.charCodeAt(a)-48;i&&(o*=2,o>9&&(o-=9)),n+=o,i=!i;}return n%10===0}function F(s){let t=s.trim().toUpperCase();if(!/^[ABFGMPRX][A-Z9]\d{7}$/.test(t))return false;let r=o=>t.charCodeAt(2+o)-48,n=r(0)+r(2)+r(4),i=r(1)+r(3)+r(5);return (n+2*i)%10===r(6)}var S="ACDEFGHJKMNPQRTUVWXY",K="0123456789"+S;function $(s){let t=s.replace(/-/g,"").toUpperCase();if(t.length!==11)return false;let r=t.charCodeAt(0);return !(r<49||r>57||!S.includes(t[1])||!K.includes(t[2])||!/\d/.test(t[3])||!S.includes(t[4])||!K.includes(t[5])||!/\d/.test(t[6])||!S.includes(t[7])||!S.includes(t[8])||!/\d\d/.test(t.slice(9,11)))}var at={AD:24,AE:23,AL:28,AT:20,AZ:28,BA:20,BE:16,BG:22,BH:22,BR:29,BY:28,CH:21,CR:22,CY:28,CZ:24,DE:22,DK:18,DO:28,EE:20,EG:29,ES:24,FI:18,FO:18,FR:27,GB:22,GE:22,GI:23,GL:18,GR:27,GT:28,HR:21,HU:28,IE:22,IL:23,IQ:23,IS:26,IT:27,JO:30,KW:30,KZ:20,LB:28,LC:32,LI:21,LT:20,LU:20,LV:21,MC:27,MD:24,ME:22,MK:19,MR:27,MT:31,MU:30,NL:18,NO:15,PK:24,PL:28,PS:29,PT:25,QA:29,RO:24,RS:22,SA:24,SE:24,SI:19,SK:24,SM:27,ST:25,SV:28,TL:23,TN:24,TR:26,UA:29,VA:22,VG:24,XK:20};function H(s){let t=s.replace(/[\s-]+/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(t))return false;let r=at[t.slice(0,2)];if(r!==void 0&&t.length!==r)return false;let n=t.slice(4)+t.slice(0,4),i=0;for(let a=0;a<n.length;a++){let o=n.charCodeAt(a);if(o>=48&&o<=57)i=(i*10+(o-48))%97;else if(o>=65&&o<=90){let e=o-55;i=(i*100+e)%97;}else return false}return i===1}function L(s){let t=T(s);if(t.length!==10||/^(\d)\1+$/.test(t))return false;let r=0;for(let a=0;a<9;a++)r+=(t.charCodeAt(a)-48)*(10-a);let i=11-r%11;return i===11&&(i=0),i===10?false:i===t.charCodeAt(9)-48}function Y(s,t){let r=s.trim(),n=/[-\s]/.test(r),i=T(r);if(i.length!==9)return false;let a=Number(i.slice(0,3)),o=Number(i.slice(3,5)),e=Number(i.slice(5,9));if(a===0||a===666||a>=900||o===0||e===0||/^(\d)\1+$/.test(i))return false;if(!n&&t){let l=t.fullText.slice(Math.max(0,t.start-36),t.start);return /\b(ssn|social[\s_-]?security|tin)\b/i.test(l)}return true}var ot=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],ct=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]];function B(s){let t=T(s);if(!/^[2-9]\d{11}$/.test(t))return false;let r=0;for(let n=0;n<t.length;n++){let i=t.charCodeAt(t.length-1-n)-48;r=ot[r][ct[n%8][i]];}return r===0}function G(s){let t=T(s);if(!/^[1-9]\d{10}$/.test(t))return false;let r=new Array(10).fill(0);for(let e=0;e<10;e++)r[t.charCodeAt(e)-48]+=1;let n=r.filter(e=>e===2||e===3).length,i=Math.max(...r);if(n!==1||i>3)return false;let a=10;for(let e=0;e<10;e++){let l=(t.charCodeAt(e)-48+a)%10;l===0&&(l=10),a=l*2%11;}let o=11-a;return o===10&&(o=0),o===t.charCodeAt(10)-48}function j(s){let t=s.split(".");if(t.length!==3)return false;let r=t[0];if(!r.startsWith("eyJ"))return false;try{let n=r.replace(/-/g,"+").replace(/_/g,"/"),i=(4-n.length%4)%4,a=atob(n+"=".repeat(i));return a.startsWith("{")&&a.includes('"')}catch{return false}}function J(s){let t=s.split(".").map(Number);if(t.length!==4)return false;let[r,n]=t;return r===void 0||n===void 0?false:r===10||r===127||r===0||r===192&&n===168||r===172&&n>=16&&n<=31||r===169&&n===254}function W(s){let t=s.split(".");if(t.length!==4)return false;for(let r of t){if(r.length===0||r.length>1&&r.startsWith("0"))return false;let n=Number(r);if(!Number.isInteger(n)||n<0||n>255)return false}return true}function q(s){if(s.length===0)return 0;let t=new Map;for(let i=0;i<s.length;i++){let a=s.charCodeAt(i);t.set(a,(t.get(a)??0)+1);}let r=0,n=s.length;for(let i of t.values()){let a=i/n;r-=a*Math.log2(a);}return r}var A=["default","secrets","hipaa","gdpr","strict"],w=["default","hipaa","gdpr","strict"],C=["hipaa","strict"],ut=["gdpr","strict"],X=[{id:"pem-private-key",category:"PRIVATE_KEY",priority:100,presets:A,pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----[\s\S]{16,8192}?-----END (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----/g},{id:"connection-uri-password",category:"CONNECTION_URI",priority:96,presets:A,captureGroup:1,pattern:/\b(?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis(?:s)?|amqp(?:s)?|mssql|clickhouse|cockroachdb):\/\/[^:\s/@]+:([^@\s/]{3,256})@[^\s"'<>]+/gi},{id:"anthropic-key",category:"API_KEY",priority:95,presets:A,pattern:/\bsk-ant-(?:api\d{2}|admin\d{2}|oat\d{2}|[a-z0-9]+)-[A-Za-z0-9_-]{24,}\b/g},{id:"openai-key",category:"API_KEY",priority:95,presets:A,pattern:/\bsk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{24,}\b|\bsk-[A-Za-z0-9]{16,}T3BlbkFJ[A-Za-z0-9]{16,}\b/g},{id:"github-token",category:"API_KEY",priority:95,presets:A,pattern:/\b(?:gh[pousr]_[A-Za-z0-9_]{36,}|github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{40,})\b/g},{id:"aws-access-key",category:"API_KEY",priority:94,presets:A,pattern:/\b(?:AKIA|ASIA|AROA|AIDA)[0-9A-Z]{16}\b/g},{id:"stripe-secret",category:"API_KEY",priority:94,presets:A,pattern:/\b(?:sk_live|rk_live|whsec)_[A-Za-z0-9]{20,}\b/g},{id:"google-api-key",category:"API_KEY",priority:93,presets:A,pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{id:"slack-token",category:"TOKEN",priority:93,presets:A,pattern:/\bxox[baprs]-[0-9A-Za-z-]{14,}\b|https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+/g},{id:"discord-webhook",category:"SECRET",priority:92,presets:A,pattern:/https:\/\/discord(?:app)?\.com\/api\/webhooks\/\d{16,22}\/[A-Za-z0-9_-]{40,}/g},{id:"provider-prefixed-keys",category:"API_KEY",priority:92,presets:A,pattern:/\b(?:hf_[A-Za-z0-9]{30,}|gsk_[A-Za-z0-9]{36,}|xai-[A-Za-z0-9]{36,}|pplx-[A-Za-z0-9]{36,}|sbp_[A-Za-z0-9]{36,}|sb_secret_[A-Za-z0-9_-]{24,}|re_[A-Za-z0-9_]{24,}|npm_[A-Za-z0-9]{36}|pypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}|SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43})\b/g},{id:"jwt-token",category:"JWT",priority:90,presets:A,pattern:/\beyJ[A-Za-z0-9_-]{6,}\.eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{8,}\b/g,validate:s=>j(s)},{id:"bearer-auth-header",category:"TOKEN",priority:88,presets:A,captureGroup:1,pattern:/\b(?:Authorization|Proxy-Authorization)\s*[:=]\s*["']?(?:Bearer|Basic|Token)\s+([A-Za-z0-9._~+/=-]{12,})["']?/gi},{id:"contextual-secret-assignment",category:"SECRET",priority:72,presets:A,captureGroup:1,pattern:/\b(?:api[_-]?key|secret[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|aws_secret_access_key|password|passwd|pwd|signing[_-]?secret)\b\s*[:=]\s*["']?([^\s"',;}{]{10,128})["']?/gi,validate:s=>!s.startsWith("[")&&!s.startsWith("<")&&q(s)>=2.8},{id:"medicare-mbi",category:"MBI",priority:84,presets:C,pattern:/\b[1-9][AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y]{2}\d{2}\b/gi,validate:s=>$(s)},{id:"us-dea",category:"DEA",priority:83,presets:C,pattern:/\b[ABFGMPRX][A-Z9]\d{7}\b/g,validate:s=>F(s)},{id:"us-npi",category:"NPI",priority:80,presets:C,contextWindow:40,contextRegex:/\b(?:npi|provider|prescriber|practitioner|physician)\b/i,pattern:/\b[12]\d{9}\b/g,validate:s=>U(s)},{id:"uk-nhs-number",category:"NHS",priority:80,presets:["hipaa","gdpr","strict"],contextWindow:40,contextRegex:/\b(?:nhs|patient|health|care|medical)\b/i,pattern:/\b\d{3}[-\s]?\d{3}[-\s]?\d{4}\b/g,validate:s=>L(s)},{id:"medical-record-number",category:"MRN",priority:78,presets:C,captureGroup:1,pattern:/\b(?:mrn|medical[\s_-]?record(?:[\s_-]?number)?|patient[\s_-]?id)\s*[:=#]?\s*([A-Z0-9-]{5,20})\b/gi},{id:"iban",category:"IBAN",priority:84,presets:w,pattern:/\b[A-Z]{2}\d{2}(?:[\s-]?[A-Z0-9]){11,30}\b/g,validate:s=>H(s)},{id:"credit-card",category:"CREDIT_CARD",priority:82,presets:w,pattern:/\b(?:\d[ -]?){13,18}\d\b/g,validate:s=>{let t=s.replace(/\D/g,"");return /^(?:4\d{12}(?:\d{3})?(?:\d{3})?|5[1-5]\d{14}|2(?:2[2-9]|[3-6]\d|7[01]|720)\d{12}|3[47]\d{13}|6(?:011|5\d\d)\d{12}|3(?:0[0-5]|[68]\d)\d{11}|(?:2131|1800|35\d{3})\d{11})$/.test(t)&&Z(t)}},{id:"us-ssn",category:"SSN",priority:81,presets:w,pattern:/\b\d{3}[-\s]\d{2}[-\s]\d{4}\b|\b\d{9}\b/g,validate:(s,t)=>Y(s,t)},{id:"aadhaar-in",category:"AADHAAR",priority:76,presets:["gdpr","strict"],contextWindow:40,contextRegex:/\b(?:aadhaar|aadhar|uidai)\b/i,pattern:/\b[2-9]\d{3}[-\s]?\d{4}[-\s]?\d{4}\b/g,validate:s=>B(s)},{id:"de-tax-id",category:"TAX_ID",priority:76,presets:ut,contextWindow:45,contextRegex:/\b(?:steuer|tax|tin|idnr|identifikationsnummer)\b/i,pattern:/\b[1-9]\d{10}\b/g,validate:s=>G(s)},{id:"email",category:"EMAIL",priority:75,presets:w,pattern:/\b[A-Za-z0-9._%+-]{1,64}@(?:[A-Za-z0-9-]{1,63}\.)+[A-Za-z]{2,24}\b/g},{id:"phone",category:"PHONE",priority:65,presets:w,pattern:/(?:\+\d{1,3}[-.\s]?)?(?:\(\d{2,4}\)[-.\s]?|\b\d{3}[-.\s])\d{3,4}[-.\s]\d{4}\b|\+\d{1,3}[-.\s]?\d{2,4}[-.\s]?\d{3,4}[-.\s]?\d{3,4}\b/g,validate:s=>{let t=s.replace(/\D/g,"");return t.length>=10&&t.length<=15&&!/^(\d)\1+$/.test(t)}},{id:"ipv4",category:"IP_ADDRESS",priority:60,presets:w,pattern:/\b(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}\b/g,validate:s=>W(s)},{id:"ipv6",category:"IP_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b|\b(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\b/g},{id:"mac-address",category:"MAC_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\b/g},{id:"labeled-person-name",category:"PERSON",priority:55,presets:["hipaa","strict"],captureGroup:1,pattern:/\b(?:Patient(?:\s+Name)?|Dr\.|Doctor|Clinician|Provider|Mr\.|Mrs\.|Ms\.|Full\s+Name|Beneficiary)\s*[:.]?\s*([A-Z][a-z]{1,24}(?:\s+[A-Z]\.?)?(?:\s+[A-Z][a-z]{1,24}){1,2})/g},{id:"dob-or-clinical-date",category:"DATE",priority:52,presets:C,contextWindow:40,contextRegex:/\b(?:dob|birth|born|admit(?:ted)?|discharg(?:e|ed)|visit|encounter|date)\b/i,pattern:/\b(?:\d{4}-\d{2}-\d{2}|(?:0?[1-9]|1[0-2])[/-](?:0?[1-9]|[12]\d|3[01])[/-](?:19|20)\d{2})\b/g}];var lt=/^(?:password|passwd|pwd|passphrase|secret|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|authorization|cookie|set-cookie|x-api-key|client[_-]?secret|private[_-]?key|ssn|social[_-]?security(?:[_-]?number)?|cvv|cvc|pin|iban|dob|birth[_-]?date|mrn)$/i,dt=/\[[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?\]|<[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?>/g;function Q(s){let t=s.toLowerCase();return t.includes("ssn")||t.includes("social")?"SSN":t.includes("iban")?"IBAN":t.includes("mrn")?"MRN":t.includes("dob")||t.includes("birth")?"DATE":t.includes("password")||t.includes("passwd")||t.includes("secret")||t==="cvv"||t==="cvc"||t==="pin"?"SECRET":t.includes("token")||t==="authorization"||t==="cookie"||t==="set-cookie"?"TOKEN":t.includes("key")?"API_KEY":"CUSTOM"}function ft(s){let t=s.preset??"default",r=s.rules?[...s.rules]:X.filter(a=>a.presets.includes(t)),i=[...(s.customRules??[]).map(a=>({id:a.id,category:a.category??"CUSTOM",pattern:a.pattern,captureGroup:a.captureGroup,priority:a.priority??85,presets:["default","secrets","hipaa","gdpr","strict"],validate:a.validate})),...r];if(s.categories?.length){let a=new Set(s.categories);i=i.filter(o=>a.has(o.category));}if(s.excludeCategories?.length){let a=new Set(s.excludeCategories);i=i.filter(o=>!a.has(o.category));}return i}function pt(s,t){let r=[];for(let n of t){if(!n||n.length<4)continue;let i=0;for(;;){let a=s.indexOf(n,i);if(a===-1)break;r.push({id:"literal-secret",category:"SECRET",priority:99,start:a,end:a+n.length,value:n}),i=a+n.length;}}return r}function tt(s,t,r){let n=[],i=r.allowlist?new Set(r.allowlist):void 0,a=r.redactPrivateIps??(r.preset==="strict"||r.preset==="hipaa");r.literals?.length&&n.push(...pt(s,r.literals));for(let e of t){let l=e.pattern.flags.includes("g")?e.pattern.flags:e.pattern.flags+"g",h=new RegExp(e.pattern.source,l),b;for(;(b=h.exec(s))!==null;){if(b[0].length===0){h.lastIndex+=1;continue}let c=b.index,d=b[0];if(e.captureGroup!==void 0&&b[e.captureGroup]!==void 0){let u=b[e.captureGroup],g=b[0].indexOf(u);g!==-1&&(c=b.index+g,d=u);}let p=c+d.length;if(!i?.has(d)&&!(e.id==="ipv4"&&!a&&J(d))){if(e.contextRegex){let u=e.contextWindow??40,g=s.slice(Math.max(0,c-u),c),x=s.slice(p,Math.min(s.length,p+u));if(!e.contextRegex.test(g)&&!e.contextRegex.test(x))continue}if(e.validate){let u={fullText:s,match:b,start:c,end:p,value:d};if(!e.validate(d,u))continue}n.push({id:e.id,category:e.category,priority:e.priority,start:c,end:p,value:d});}}}n.sort((e,l)=>{if(l.priority!==e.priority)return l.priority-e.priority;let h=l.end-l.start-(e.end-e.start);return h!==0?h:e.start-l.start});let o=[];for(let e of n){let l=false;for(let h of o)if(e.start<h.end&&e.end>h.start){l=true;break}l||o.push(e);}return o.sort((e,l)=>e.start-l.start),o}var M=class s{options;rules;tokenFormat;vaultKey;sensitiveKeyRe;forward=new Map;reverse=new Map;counters=new Map;reservedTokens=new Set;_version=0;constructor(t={}){this.options=t,this.rules=ft(t),this.tokenFormat=t.tokenFormat??"bracket",this.vaultKey=t.secret??V(16),this.sensitiveKeyRe=t.sensitiveKeys?.length?new RegExp(`^(?:${t.sensitiveKeys.map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$`,"i"):lt;}get version(){return this._version}fingerprint(t){return P(this.vaultKey,t,12)}reserveExistingTokens(t){let r=new RegExp(dt.source,"g"),n;for(;(n=r.exec(t))!==null;)this.reverse.has(n[0])||this.reservedTokens.add(n[0]);}tokenize(t,r){let n=`${t}:${r}`,i=this.forward.get(n);if(i!==void 0)return i;if(this.tokenFormat==="mask")return (this.options.maskChar??"*").repeat(Math.min(Math.max(r.length,4),16));if(this.tokenFormat==="hash"){let e=P(this.vaultKey,n,8),l=`[${t}:${e}]`;return this.forward.set(n,l),this.reverse.set(l,{category:t,value:r}),this._version+=1,l}let a=this.counters.get(t)??0,o;do if(a+=1,this.tokenFormat==="angle")o=`<${t}_${a}>`;else if(this.tokenFormat==="signed"){let e=P(this.vaultKey,`${t}:${a}:${r}`,4);o=`[${t}_${a}#${e}]`;}else o=`[${t}_${a}]`;while(this.reservedTokens.has(o)||this.reverse.has(o));return this.counters.set(t,a),this.forward.set(n,o),this.reverse.set(o,{category:t,value:r}),this._version+=1,o}scan(t){return typeof t!="string"||t.length===0?[]:tt(t,this.rules,this.options).map(n=>({id:n.id,category:n.category,start:n.start,end:n.end,token:`[${n.category}]`,length:n.value.length,fingerprint:_(n.value,12)}))}redactText(t){if(typeof t!="string"||t.length===0)return {value:t,findings:[],count:0};this.reserveExistingTokens(t);let r=tt(t,this.rules,this.options);if(r.length===0)return {value:t,findings:[],count:0};let n="",i=0,a=[];for(let o of r){n+=t.slice(i,o.start);let e=this.tokenize(o.category,o.value);n+=e,i=o.end,a.push({id:o.id,category:o.category,start:o.start,end:o.end,token:e,length:o.value.length,fingerprint:this.fingerprint(o.value)});}return n+=t.slice(i),{value:n,findings:a,count:a.length}}redactObject(t){let r=[],n=this.options.maxDepth??32,i=new WeakMap,a=(e,l,h)=>{if(e==null)return e;if(typeof e=="string"){if(h&&this.sensitiveKeyRe.test(h)&&e.length>0&&!this.reverse.has(e)){let d=Q(h),p=this.tokenize(d,e);return r.push({id:"sensitive-key",category:d,start:0,end:e.length,token:p,length:e.length,fingerprint:this.fingerprint(e)}),p}let c=this.redactText(e);return c.count>0&&r.push(...c.findings),c.value}if(typeof e!="object")return e;if(l>=n)return "[MAX_DEPTH_TRUNCATED]";if(i.has(e))return i.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof URL){let c=new URL(e.toString());c.password&&(c.password=this.tokenize("SECRET",c.password));let d=[];c.searchParams.forEach((p,u)=>{d.push([u,p]);});for(let[p,u]of d)if(this.sensitiveKeyRe.test(p)&&u)c.searchParams.set(p,this.tokenize(Q(p),u));else {let g=this.redactText(u);g.count>0&&(r.push(...g.findings),c.searchParams.set(p,g.value));}return c}if(typeof Headers<"u"&&e instanceof Headers){let c=new Headers;return e.forEach((d,p)=>{c.set(p,a(d,l+1,p));}),c}if(e instanceof Error){let c={name:e.name,message:this.options.redactErrors!==false?a(e.message,l+1):e.message};e.stack!==void 0&&(c.stack=this.options.redactErrors!==false?a(e.stack,l+1):e.stack),"cause"in e&&e.cause!==void 0&&(c.cause=a(e.cause,l+1));for(let d of Object.keys(e))c[d]=a(e[d],l+1,d);return c}if(Array.isArray(e)){let c=[];i.set(e,c);for(let d=0;d<e.length;d++)c.push(a(e[d],l+1,h));return c}if(e instanceof Map){let c=new Map;i.set(e,c);for(let[d,p]of e.entries()){let u=typeof d=="string"?d:void 0;c.set(a(d,l+1),a(p,l+1,u));}return c}if(e instanceof Set){let c=new Set;i.set(e,c);for(let d of e.values())c.add(a(d,l+1));return c}let b={};i.set(e,b);for(let[c,d]of Object.entries(e))b[c]=a(d,l+1,c);return b};return {value:a(t,0),findings:r,count:r.length}}redact(t){return typeof t=="string"?this.redactText(t):this.redactObject(t)}restore(t){if(typeof t!="string"||t.length===0||this.reverse.size===0)return t;let n=Array.from(this.reverse.keys()).sort((a,o)=>o.length-a.length).map(a=>a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),i=new RegExp(n.join("|"),"g");return t.replace(i,a=>this.reverse.get(a)?.value??a)}restoreObject(t){let r=new WeakMap,n=(i,a)=>{if(i==null)return i;if(typeof i=="string")return this.restore(i);if(typeof i!="object"||a>=32)return i;if(r.has(i))return r.get(i);if(Array.isArray(i)){let e=[];r.set(i,e);for(let l of i)e.push(n(l,a+1));return e}if(i instanceof Date||i instanceof RegExp||i instanceof URL)return i;let o={};r.set(i,o);for(let[e,l]of Object.entries(i))o[e]=n(l,a+1);return o};return n(t,0)}entries(){return Array.from(this.reverse.entries()).map(([t,r])=>({token:t,category:r.category,value:r.value}))}export(){let t={};for(let[r,n]of this.counters.entries())t[r]=n;return {version:1,tokenFormat:this.tokenFormat,counters:t,entries:this.entries()}}static fromJSON(t,r={}){let n=new s({...r,tokenFormat:t.tokenFormat});for(let[i,a]of Object.entries(t.counters))n.counters.set(i,a);for(let i of t.entries)n.forward.set(`${i.category}:${i.value}`,i.token),n.reverse.set(i.token,{category:i.category,value:i.value});return n._version+=1,n}clear(){this.forward.clear(),this.reverse.clear(),this.counters.clear(),this.reservedTokens.clear(),this._version+=1;}};var et=new Set(["036","059","063","102","203","556","692","790","821","823","830","831","878","879","884","890","893"]),gt=new Set([...et,"205","369"]),ht=new Set(["resourceType","coding","code","system","display","unit","valueQuantity","valueCodeableConcept","severity","clinicalStatus","verificationStatus","category","gender","status","intent","priority"]),yt=new Set(["name","family","given","prefix","suffix","maiden"]),bt=new Set(["text","line","city","district","use","note","description","title"]),xt=new Set(["photo","data"]),At=/^(\d{4})-(\d{2})-(\d{2})(.*)$/,mt=/^\d{4}$/;function vt(s,t){let r=t??String(s.export().entries.length)+"fhir",n=_(r,8),i=parseInt(n,16),a=30+i%151;return i%2===0?a:-a}function Rt(s,t){let r=At.exec(s);if(!r)return s;let n=Number(r[1]),i=Number(r[2]),a=Number(r[3]),o=r[4]??"",e=new Date(Date.UTC(n,i-1,a));if(Number.isNaN(e.getTime()))return s;e.setUTCDate(e.getUTCDate()+t);let l=e.getUTCFullYear().toString().padStart(4,"0"),h=(e.getUTCMonth()+1).toString().padStart(2,"0"),b=e.getUTCDate().toString().padStart(2,"0");return `${l}-${h}-${b}${o}`}function Et(s){let t=/^(\d{4})/.exec(s);if(!t)return false;let r=Number(t[1]);return new Date().getUTCFullYear()-r>89}function kt(s,t){let r=s.replace(/\D/g,"");if(r.length<3)return "000";let n=r.slice(0,3);return (t==="hhs-2000"?et:gt).has(n)?"000":n}function Ot(s,t={},r){let n=r??new M({...t,preset:t.preset??"hipaa"}),i=t.zipBaseline??"conservative-union",a=t.dateStrategy??"shift",o=t.capAgeOver89??true,e=t.preserveClinicalCodes??true,l=typeof s.id=="string"?s.id:JSON.stringify(s.identifier??"default"),h=t.dateShiftDays??vt(n,l),b=(u,g)=>{if(g&&o&&Et(u))return "90+";if(mt.test(u))return u;if(a==="redact")return n.tokenize("DATE",u);if(a==="year-only"){let x=/^(\d{4})/.exec(u);return x?x[1]:n.tokenize("DATE",u)}return Rt(u,h)},c=(u,g,x)=>{if(u==null)return u;let y=g[g.length-1]??"";if(typeof u=="string"){if(x&&y!=="display")return u;if(y==="postalCode")return kt(u,i);if(y==="birthDate")return b(u,true);if(y==="date"||y==="effectiveDateTime"||y==="authoredOn"||y==="onsetDateTime"||y==="recordedDate"||y==="issued"||y==="start"||y==="end")return b(u,false);if(y==="div")return n.redactText(u).value;if(yt.has(y))return n.tokenize("PERSON",u);if(y==="line"||y==="street"||y==="city")return n.tokenize("ADDRESS",u);if(y==="id"||g.includes("identifier")&&y==="value")return n.tokenize("MRN",u);if(g.includes("telecom")&&y==="value"){let f=n.redactText(u);return f.count>0?f.value:n.tokenize("CUSTOM",u)}return n.redactText(u).value}if(typeof u!="object")return u;if(Array.isArray(u))return u.map(f=>c(f,g,x));let E=u,m={};for(let[f,v]of Object.entries(E)){if(f==="resourceType"){m[f]=v;continue}if(xt.has(f)&&(g.includes("photo")||f==="photo")){m[f]=f==="photo"?[]:"[REDACTED_BIOMETRIC]";continue}if(f==="name"&&(E.resourceType==="Patient"||E.resourceType==="Practitioner"||E.resourceType==="RelatedPerson")){m[f]=c(v,[...g,f],false);continue}let k=e&&(x||ht.has(f));bt.has(f)&&!x?m[f]=c(v,[...g,f],false):m[f]=c(v,[...g,f],k);}return m},d=c(s,[],false),p=n.entries().map((u,g)=>({id:"fhir-phi",category:u.category,start:g,end:g,token:u.token,length:u.value.length,fingerprint:_(u.value,12)}));return {value:d,findings:p,count:p.length,vault:n}}export{gt as RESTRICTED_ZIP3_CONSERVATIVE,et as RESTRICTED_ZIP3_HHS_2000,Ot as redactFHIR};
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ 'use strict';var se=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ne=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),V=new TextEncoder;function A(s,e){return s>>>e|s<<32-e}function C(s){let e=s.length*8,r=Math.ceil((s.length+9)/64)*64,a=new Uint8Array(r);a.set(s),a[s.length]=128;let n=new DataView(a.buffer),i=Math.floor(e/4294967296),o=e>>>0;n.setUint32(r-8,i,false),n.setUint32(r-4,o,false);let t=new Uint32Array(ne),l=new Uint32Array(64);for(let c=0;c<r;c+=64){for(let h=0;h<16;h++)l[h]=n.getUint32(c+h*4,false);for(let h=16;h<64;h++){let R=l[h-15],E=l[h-2],P=A(R,7)^A(R,18)^R>>>3,D=A(E,17)^A(E,19)^E>>>10;l[h]=l[h-16]+P+l[h-7]+D>>>0;}let u=t[0],d=t[1],f=t[2],b=t[3],x=t[4],S=t[5],I=t[6],M=t[7];for(let h=0;h<64;h++){let R=A(x,6)^A(x,11)^A(x,25),E=x&S^~x&I,P=M+R+E+se[h]+l[h]>>>0,D=A(u,2)^A(u,13)^A(u,22),te=u&d^u&f^d&f,re=D+te>>>0;M=I,I=S,S=x,x=b+P>>>0,b=f,f=d,d=u,u=P+re>>>0;}t[0]=t[0]+u>>>0,t[1]=t[1]+d>>>0,t[2]=t[2]+f>>>0,t[3]=t[3]+b>>>0,t[4]=t[4]+x>>>0,t[5]=t[5]+S>>>0,t[6]=t[6]+I>>>0,t[7]=t[7]+M>>>0;}let p=new Uint8Array(32),g=new DataView(p.buffer);for(let c=0;c<8;c++)g.setUint32(c*4,t[c],false);return p}function w(s,e,r=64){let a=V.encode(s),n=a.length>64?C(a):a,i=new Uint8Array(64);i.set(n);let o=new Uint8Array(64),t=new Uint8Array(64);for(let d=0;d<64;d++){let f=i[d];o[d]=f^92,t[d]=f^54;}let l=V.encode(e),p=new Uint8Array(64+l.length);p.set(t,0),p.set(l,64);let g=C(p),c=new Uint8Array(96);c.set(o,0),c.set(g,64);let u=C(c);return Z(u).slice(0,r)}function N(s,e=64){return Z(C(V.encode(s))).slice(0,e)}function Z(s){let e="";for(let r=0;r<s.length;r++)e+=s[r].toString(16).padStart(2,"0");return e}function q(s=8){let e=new Uint8Array(s);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(e);else for(let r=0;r<s;r++)e[r]=Math.floor(Math.random()*256);return Z(e)}function v(s){return s.replace(/\D/g,"")}function O(s){let e=v(s);if(e.length<13||e.length>19||/^(\d)\1+$/.test(e))return false;let r=0,a=false;for(let n=e.length-1;n>=0;n--){let i=e.charCodeAt(n)-48;a&&(i*=2,i>9&&(i-=9)),r+=i,a=!a;}return r%10===0}function z(s){let e=v(s);if(!/^[12]\d{9}$/.test(e))return false;let r="80840"+e,a=0,n=false;for(let i=r.length-1;i>=0;i--){let o=r.charCodeAt(i)-48;n&&(o*=2,o>9&&(o-=9)),a+=o,n=!n;}return a%10===0}function K(s){let e=s.trim().toUpperCase();if(!/^[ABFGMPRX][A-Z9]\d{7}$/.test(e))return false;let r=o=>e.charCodeAt(2+o)-48,a=r(0)+r(2)+r(4),n=r(1)+r(3)+r(5);return (a+2*n)%10===r(6)}var _="ACDEFGHJKMNPQRTUVWXY",X="0123456789"+_;function U(s){let e=s.replace(/-/g,"").toUpperCase();if(e.length!==11)return false;let r=e.charCodeAt(0);return !(r<49||r>57||!_.includes(e[1])||!X.includes(e[2])||!/\d/.test(e[3])||!_.includes(e[4])||!X.includes(e[5])||!/\d/.test(e[6])||!_.includes(e[7])||!_.includes(e[8])||!/\d\d/.test(e.slice(9,11)))}var ie={AD:24,AE:23,AL:28,AT:20,AZ:28,BA:20,BE:16,BG:22,BH:22,BR:29,BY:28,CH:21,CR:22,CY:28,CZ:24,DE:22,DK:18,DO:28,EE:20,EG:29,ES:24,FI:18,FO:18,FR:27,GB:22,GE:22,GI:23,GL:18,GR:27,GT:28,HR:21,HU:28,IE:22,IL:23,IQ:23,IS:26,IT:27,JO:30,KW:30,KZ:20,LB:28,LC:32,LI:21,LT:20,LU:20,LV:21,MC:27,MD:24,ME:22,MK:19,MR:27,MT:31,MU:30,NL:18,NO:15,PK:24,PL:28,PS:29,PT:25,QA:29,RO:24,RS:22,SA:24,SE:24,SI:19,SK:24,SM:27,ST:25,SV:28,TL:23,TN:24,TR:26,UA:29,VA:22,VG:24,XK:20};function F(s){let e=s.replace(/[\s-]+/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(e))return false;let r=ie[e.slice(0,2)];if(r!==void 0&&e.length!==r)return false;let a=e.slice(4)+e.slice(0,4),n=0;for(let i=0;i<a.length;i++){let o=a.charCodeAt(i);if(o>=48&&o<=57)n=(n*10+(o-48))%97;else if(o>=65&&o<=90){let t=o-55;n=(n*100+t)%97;}else return false}return n===1}function L(s){let e=v(s);if(e.length!==10||/^(\d)\1+$/.test(e))return false;let r=0;for(let i=0;i<9;i++)r+=(e.charCodeAt(i)-48)*(10-i);let n=11-r%11;return n===11&&(n=0),n===10?false:n===e.charCodeAt(9)-48}function $(s,e){let r=s.trim(),a=/[-\s]/.test(r),n=v(r);if(n.length!==9)return false;let i=Number(n.slice(0,3)),o=Number(n.slice(3,5)),t=Number(n.slice(5,9));if(i===0||i===666||i>=900||o===0||t===0||/^(\d)\1+$/.test(n))return false;if(!a&&e){let l=e.fullText.slice(Math.max(0,e.start-36),e.start);return /\b(ssn|social[\s_-]?security|tin)\b/i.test(l)}return true}var ae=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],oe=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]];function H(s){let e=v(s);if(!/^[2-9]\d{11}$/.test(e))return false;let r=0;for(let a=0;a<e.length;a++){let n=e.charCodeAt(e.length-1-a)-48;r=ae[r][oe[a%8][n]];}return r===0}function B(s){let e=v(s);if(!/^[1-9]\d{10}$/.test(e))return false;let r=new Array(10).fill(0);for(let t=0;t<10;t++)r[e.charCodeAt(t)-48]+=1;let a=r.filter(t=>t===2||t===3).length,n=Math.max(...r);if(a!==1||n>3)return false;let i=10;for(let t=0;t<10;t++){let l=(e.charCodeAt(t)-48+i)%10;l===0&&(l=10),i=l*2%11;}let o=11-i;return o===10&&(o=0),o===e.charCodeAt(10)-48}function G(s){let e=s.split(".");if(e.length!==3)return false;let r=e[0];if(!r.startsWith("eyJ"))return false;try{let a=r.replace(/-/g,"+").replace(/_/g,"/"),n=(4-a.length%4)%4,i=atob(a+"=".repeat(n));return i.startsWith("{")&&i.includes('"')}catch{return false}}function Y(s){let e=s.split(".").map(Number);if(e.length!==4)return false;let[r,a]=e;return r===void 0||a===void 0?false:r===10||r===127||r===0||r===192&&a===168||r===172&&a>=16&&a<=31||r===169&&a===254}function j(s){let e=s.split(".");if(e.length!==4)return false;for(let r of e){if(r.length===0||r.length>1&&r.startsWith("0"))return false;let a=Number(r);if(!Number.isInteger(a)||a<0||a>255)return false}return true}function J(s){if(s.length===0)return 0;let e=new Map;for(let n=0;n<s.length;n++){let i=s.charCodeAt(n);e.set(i,(e.get(i)??0)+1);}let r=0,a=s.length;for(let n of e.values()){let i=n/a;r-=i*Math.log2(i);}return r}var y=["default","secrets","hipaa","gdpr","strict"],k=["default","hipaa","gdpr","strict"],T=["hipaa","strict"],ce=["gdpr","strict"],W=[{id:"pem-private-key",category:"PRIVATE_KEY",priority:100,presets:y,pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----[\s\S]{16,8192}?-----END (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----/g},{id:"connection-uri-password",category:"CONNECTION_URI",priority:96,presets:y,captureGroup:1,pattern:/\b(?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis(?:s)?|amqp(?:s)?|mssql|clickhouse|cockroachdb):\/\/[^:\s/@]+:([^@\s/]{3,256})@[^\s"'<>]+/gi},{id:"anthropic-key",category:"API_KEY",priority:95,presets:y,pattern:/\bsk-ant-(?:api\d{2}|admin\d{2}|oat\d{2}|[a-z0-9]+)-[A-Za-z0-9_-]{24,}\b/g},{id:"openai-key",category:"API_KEY",priority:95,presets:y,pattern:/\bsk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{24,}\b|\bsk-[A-Za-z0-9]{16,}T3BlbkFJ[A-Za-z0-9]{16,}\b/g},{id:"github-token",category:"API_KEY",priority:95,presets:y,pattern:/\b(?:gh[pousr]_[A-Za-z0-9_]{36,}|github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{40,})\b/g},{id:"aws-access-key",category:"API_KEY",priority:94,presets:y,pattern:/\b(?:AKIA|ASIA|AROA|AIDA)[0-9A-Z]{16}\b/g},{id:"stripe-secret",category:"API_KEY",priority:94,presets:y,pattern:/\b(?:sk_live|rk_live|whsec)_[A-Za-z0-9]{20,}\b/g},{id:"google-api-key",category:"API_KEY",priority:93,presets:y,pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{id:"slack-token",category:"TOKEN",priority:93,presets:y,pattern:/\bxox[baprs]-[0-9A-Za-z-]{14,}\b|https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+/g},{id:"discord-webhook",category:"SECRET",priority:92,presets:y,pattern:/https:\/\/discord(?:app)?\.com\/api\/webhooks\/\d{16,22}\/[A-Za-z0-9_-]{40,}/g},{id:"provider-prefixed-keys",category:"API_KEY",priority:92,presets:y,pattern:/\b(?:hf_[A-Za-z0-9]{30,}|gsk_[A-Za-z0-9]{36,}|xai-[A-Za-z0-9]{36,}|pplx-[A-Za-z0-9]{36,}|sbp_[A-Za-z0-9]{36,}|sb_secret_[A-Za-z0-9_-]{24,}|re_[A-Za-z0-9_]{24,}|npm_[A-Za-z0-9]{36}|pypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}|SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43})\b/g},{id:"jwt-token",category:"JWT",priority:90,presets:y,pattern:/\beyJ[A-Za-z0-9_-]{6,}\.eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{8,}\b/g,validate:s=>G(s)},{id:"bearer-auth-header",category:"TOKEN",priority:88,presets:y,captureGroup:1,pattern:/\b(?:Authorization|Proxy-Authorization)\s*[:=]\s*["']?(?:Bearer|Basic|Token)\s+([A-Za-z0-9._~+/=-]{12,})["']?/gi},{id:"contextual-secret-assignment",category:"SECRET",priority:72,presets:y,captureGroup:1,pattern:/\b(?:api[_-]?key|secret[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|aws_secret_access_key|password|passwd|pwd|signing[_-]?secret)\b\s*[:=]\s*["']?([^\s"',;}{]{10,128})["']?/gi,validate:s=>!s.startsWith("[")&&!s.startsWith("<")&&J(s)>=2.8},{id:"medicare-mbi",category:"MBI",priority:84,presets:T,pattern:/\b[1-9][AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y]{2}\d{2}\b/gi,validate:s=>U(s)},{id:"us-dea",category:"DEA",priority:83,presets:T,pattern:/\b[ABFGMPRX][A-Z9]\d{7}\b/g,validate:s=>K(s)},{id:"us-npi",category:"NPI",priority:80,presets:T,contextWindow:40,contextRegex:/\b(?:npi|provider|prescriber|practitioner|physician)\b/i,pattern:/\b[12]\d{9}\b/g,validate:s=>z(s)},{id:"uk-nhs-number",category:"NHS",priority:80,presets:["hipaa","gdpr","strict"],contextWindow:40,contextRegex:/\b(?:nhs|patient|health|care|medical)\b/i,pattern:/\b\d{3}[-\s]?\d{3}[-\s]?\d{4}\b/g,validate:s=>L(s)},{id:"medical-record-number",category:"MRN",priority:78,presets:T,captureGroup:1,pattern:/\b(?:mrn|medical[\s_-]?record(?:[\s_-]?number)?|patient[\s_-]?id)\s*[:=#]?\s*([A-Z0-9-]{5,20})\b/gi},{id:"iban",category:"IBAN",priority:84,presets:k,pattern:/\b[A-Z]{2}\d{2}(?:[\s-]?[A-Z0-9]){11,30}\b/g,validate:s=>F(s)},{id:"credit-card",category:"CREDIT_CARD",priority:82,presets:k,pattern:/\b(?:\d[ -]?){13,18}\d\b/g,validate:s=>{let e=s.replace(/\D/g,"");return /^(?:4\d{12}(?:\d{3})?(?:\d{3})?|5[1-5]\d{14}|2(?:2[2-9]|[3-6]\d|7[01]|720)\d{12}|3[47]\d{13}|6(?:011|5\d\d)\d{12}|3(?:0[0-5]|[68]\d)\d{11}|(?:2131|1800|35\d{3})\d{11})$/.test(e)&&O(e)}},{id:"us-ssn",category:"SSN",priority:81,presets:k,pattern:/\b\d{3}[-\s]\d{2}[-\s]\d{4}\b|\b\d{9}\b/g,validate:(s,e)=>$(s,e)},{id:"aadhaar-in",category:"AADHAAR",priority:76,presets:["gdpr","strict"],contextWindow:40,contextRegex:/\b(?:aadhaar|aadhar|uidai)\b/i,pattern:/\b[2-9]\d{3}[-\s]?\d{4}[-\s]?\d{4}\b/g,validate:s=>H(s)},{id:"de-tax-id",category:"TAX_ID",priority:76,presets:ce,contextWindow:45,contextRegex:/\b(?:steuer|tax|tin|idnr|identifikationsnummer)\b/i,pattern:/\b[1-9]\d{10}\b/g,validate:s=>B(s)},{id:"email",category:"EMAIL",priority:75,presets:k,pattern:/\b[A-Za-z0-9._%+-]{1,64}@(?:[A-Za-z0-9-]{1,63}\.)+[A-Za-z]{2,24}\b/g},{id:"phone",category:"PHONE",priority:65,presets:k,pattern:/(?:\+\d{1,3}[-.\s]?)?(?:\(\d{2,4}\)[-.\s]?|\b\d{3}[-.\s])\d{3,4}[-.\s]\d{4}\b|\+\d{1,3}[-.\s]?\d{2,4}[-.\s]?\d{3,4}[-.\s]?\d{3,4}\b/g,validate:s=>{let e=s.replace(/\D/g,"");return e.length>=10&&e.length<=15&&!/^(\d)\1+$/.test(e)}},{id:"ipv4",category:"IP_ADDRESS",priority:60,presets:k,pattern:/\b(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}\b/g,validate:s=>j(s)},{id:"ipv6",category:"IP_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b|\b(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\b/g},{id:"mac-address",category:"MAC_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\b/g},{id:"labeled-person-name",category:"PERSON",priority:55,presets:["hipaa","strict"],captureGroup:1,pattern:/\b(?:Patient(?:\s+Name)?|Dr\.|Doctor|Clinician|Provider|Mr\.|Mrs\.|Ms\.|Full\s+Name|Beneficiary)\s*[:.]?\s*([A-Z][a-z]{1,24}(?:\s+[A-Z]\.?)?(?:\s+[A-Z][a-z]{1,24}){1,2})/g},{id:"dob-or-clinical-date",category:"DATE",priority:52,presets:T,contextWindow:40,contextRegex:/\b(?:dob|birth|born|admit(?:ted)?|discharg(?:e|ed)|visit|encounter|date)\b/i,pattern:/\b(?:\d{4}-\d{2}-\d{2}|(?:0?[1-9]|1[0-2])[/-](?:0?[1-9]|[12]\d|3[01])[/-](?:19|20)\d{2})\b/g}];var le=/^(?:password|passwd|pwd|passphrase|secret|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|authorization|cookie|set-cookie|x-api-key|client[_-]?secret|private[_-]?key|ssn|social[_-]?security(?:[_-]?number)?|cvv|cvc|pin|iban|dob|birth[_-]?date|mrn)$/i,ue=/\[[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?\]|<[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?>/g;function Q(s){let e=s.toLowerCase();return e.includes("ssn")||e.includes("social")?"SSN":e.includes("iban")?"IBAN":e.includes("mrn")?"MRN":e.includes("dob")||e.includes("birth")?"DATE":e.includes("password")||e.includes("passwd")||e.includes("secret")||e==="cvv"||e==="cvc"||e==="pin"?"SECRET":e.includes("token")||e==="authorization"||e==="cookie"||e==="set-cookie"?"TOKEN":e.includes("key")?"API_KEY":"CUSTOM"}function de(s){let e=s.preset??"default",r=s.rules?[...s.rules]:W.filter(i=>i.presets.includes(e)),n=[...(s.customRules??[]).map(i=>({id:i.id,category:i.category??"CUSTOM",pattern:i.pattern,captureGroup:i.captureGroup,priority:i.priority??85,presets:["default","secrets","hipaa","gdpr","strict"],validate:i.validate})),...r];if(s.categories?.length){let i=new Set(s.categories);n=n.filter(o=>i.has(o.category));}if(s.excludeCategories?.length){let i=new Set(s.excludeCategories);n=n.filter(o=>!i.has(o.category));}return n}function fe(s,e){let r=[];for(let a of e){if(!a||a.length<4)continue;let n=0;for(;;){let i=s.indexOf(a,n);if(i===-1)break;r.push({id:"literal-secret",category:"SECRET",priority:99,start:i,end:i+a.length,value:a}),n=i+a.length;}}return r}function ee(s,e,r){let a=[],n=r.allowlist?new Set(r.allowlist):void 0,i=r.redactPrivateIps??(r.preset==="strict"||r.preset==="hipaa");r.literals?.length&&a.push(...fe(s,r.literals));for(let t of e){let l=t.pattern.flags.includes("g")?t.pattern.flags:t.pattern.flags+"g",p=new RegExp(t.pattern.source,l),g;for(;(g=p.exec(s))!==null;){if(g[0].length===0){p.lastIndex+=1;continue}let c=g.index,u=g[0];if(t.captureGroup!==void 0&&g[t.captureGroup]!==void 0){let f=g[t.captureGroup],b=g[0].indexOf(f);b!==-1&&(c=g.index+b,u=f);}let d=c+u.length;if(!n?.has(u)&&!(t.id==="ipv4"&&!i&&Y(u))){if(t.contextRegex){let f=t.contextWindow??40,b=s.slice(Math.max(0,c-f),c),x=s.slice(d,Math.min(s.length,d+f));if(!t.contextRegex.test(b)&&!t.contextRegex.test(x))continue}if(t.validate){let f={fullText:s,match:g,start:c,end:d,value:u};if(!t.validate(u,f))continue}a.push({id:t.id,category:t.category,priority:t.priority,start:c,end:d,value:u});}}}a.sort((t,l)=>{if(l.priority!==t.priority)return l.priority-t.priority;let p=l.end-l.start-(t.end-t.start);return p!==0?p:t.start-l.start});let o=[];for(let t of a){let l=false;for(let p of o)if(t.start<p.end&&t.end>p.start){l=true;break}l||o.push(t);}return o.sort((t,l)=>t.start-l.start),o}var m=class s{options;rules;tokenFormat;vaultKey;sensitiveKeyRe;forward=new Map;reverse=new Map;counters=new Map;reservedTokens=new Set;_version=0;constructor(e={}){this.options=e,this.rules=de(e),this.tokenFormat=e.tokenFormat??"bracket",this.vaultKey=e.secret??q(16),this.sensitiveKeyRe=e.sensitiveKeys?.length?new RegExp(`^(?:${e.sensitiveKeys.map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$`,"i"):le;}get version(){return this._version}fingerprint(e){return w(this.vaultKey,e,12)}reserveExistingTokens(e){let r=new RegExp(ue.source,"g"),a;for(;(a=r.exec(e))!==null;)this.reverse.has(a[0])||this.reservedTokens.add(a[0]);}tokenize(e,r){let a=`${e}:${r}`,n=this.forward.get(a);if(n!==void 0)return n;if(this.tokenFormat==="mask")return (this.options.maskChar??"*").repeat(Math.min(Math.max(r.length,4),16));if(this.tokenFormat==="hash"){let t=w(this.vaultKey,a,8),l=`[${e}:${t}]`;return this.forward.set(a,l),this.reverse.set(l,{category:e,value:r}),this._version+=1,l}let i=this.counters.get(e)??0,o;do if(i+=1,this.tokenFormat==="angle")o=`<${e}_${i}>`;else if(this.tokenFormat==="signed"){let t=w(this.vaultKey,`${e}:${i}:${r}`,4);o=`[${e}_${i}#${t}]`;}else o=`[${e}_${i}]`;while(this.reservedTokens.has(o)||this.reverse.has(o));return this.counters.set(e,i),this.forward.set(a,o),this.reverse.set(o,{category:e,value:r}),this._version+=1,o}scan(e){return typeof e!="string"||e.length===0?[]:ee(e,this.rules,this.options).map(a=>({id:a.id,category:a.category,start:a.start,end:a.end,token:`[${a.category}]`,length:a.value.length,fingerprint:N(a.value,12)}))}redactText(e){if(typeof e!="string"||e.length===0)return {value:e,findings:[],count:0};this.reserveExistingTokens(e);let r=ee(e,this.rules,this.options);if(r.length===0)return {value:e,findings:[],count:0};let a="",n=0,i=[];for(let o of r){a+=e.slice(n,o.start);let t=this.tokenize(o.category,o.value);a+=t,n=o.end,i.push({id:o.id,category:o.category,start:o.start,end:o.end,token:t,length:o.value.length,fingerprint:this.fingerprint(o.value)});}return a+=e.slice(n),{value:a,findings:i,count:i.length}}redactObject(e){let r=[],a=this.options.maxDepth??32,n=new WeakMap,i=(t,l,p)=>{if(t==null)return t;if(typeof t=="string"){if(p&&this.sensitiveKeyRe.test(p)&&t.length>0&&!this.reverse.has(t)){let u=Q(p),d=this.tokenize(u,t);return r.push({id:"sensitive-key",category:u,start:0,end:t.length,token:d,length:t.length,fingerprint:this.fingerprint(t)}),d}let c=this.redactText(t);return c.count>0&&r.push(...c.findings),c.value}if(typeof t!="object")return t;if(l>=a)return "[MAX_DEPTH_TRUNCATED]";if(n.has(t))return n.get(t);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t.source,t.flags);if(t instanceof URL){let c=new URL(t.toString());c.password&&(c.password=this.tokenize("SECRET",c.password));let u=[];c.searchParams.forEach((d,f)=>{u.push([f,d]);});for(let[d,f]of u)if(this.sensitiveKeyRe.test(d)&&f)c.searchParams.set(d,this.tokenize(Q(d),f));else {let b=this.redactText(f);b.count>0&&(r.push(...b.findings),c.searchParams.set(d,b.value));}return c}if(typeof Headers<"u"&&t instanceof Headers){let c=new Headers;return t.forEach((u,d)=>{c.set(d,i(u,l+1,d));}),c}if(t instanceof Error){let c={name:t.name,message:this.options.redactErrors!==false?i(t.message,l+1):t.message};t.stack!==void 0&&(c.stack=this.options.redactErrors!==false?i(t.stack,l+1):t.stack),"cause"in t&&t.cause!==void 0&&(c.cause=i(t.cause,l+1));for(let u of Object.keys(t))c[u]=i(t[u],l+1,u);return c}if(Array.isArray(t)){let c=[];n.set(t,c);for(let u=0;u<t.length;u++)c.push(i(t[u],l+1,p));return c}if(t instanceof Map){let c=new Map;n.set(t,c);for(let[u,d]of t.entries()){let f=typeof u=="string"?u:void 0;c.set(i(u,l+1),i(d,l+1,f));}return c}if(t instanceof Set){let c=new Set;n.set(t,c);for(let u of t.values())c.add(i(u,l+1));return c}let g={};n.set(t,g);for(let[c,u]of Object.entries(t))g[c]=i(u,l+1,c);return g};return {value:i(e,0),findings:r,count:r.length}}redact(e){return typeof e=="string"?this.redactText(e):this.redactObject(e)}restore(e){if(typeof e!="string"||e.length===0||this.reverse.size===0)return e;let a=Array.from(this.reverse.keys()).sort((i,o)=>o.length-i.length).map(i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),n=new RegExp(a.join("|"),"g");return e.replace(n,i=>this.reverse.get(i)?.value??i)}restoreObject(e){let r=new WeakMap,a=(n,i)=>{if(n==null)return n;if(typeof n=="string")return this.restore(n);if(typeof n!="object"||i>=32)return n;if(r.has(n))return r.get(n);if(Array.isArray(n)){let t=[];r.set(n,t);for(let l of n)t.push(a(l,i+1));return t}if(n instanceof Date||n instanceof RegExp||n instanceof URL)return n;let o={};r.set(n,o);for(let[t,l]of Object.entries(n))o[t]=a(l,i+1);return o};return a(e,0)}entries(){return Array.from(this.reverse.entries()).map(([e,r])=>({token:e,category:r.category,value:r.value}))}export(){let e={};for(let[r,a]of this.counters.entries())e[r]=a;return {version:1,tokenFormat:this.tokenFormat,counters:e,entries:this.entries()}}static fromJSON(e,r={}){let a=new s({...r,tokenFormat:e.tokenFormat});for(let[n,i]of Object.entries(e.counters))a.counters.set(n,i);for(let n of e.entries)a.forward.set(`${n.category}:${n.value}`,n.token),a.reverse.set(n.token,{category:n.category,value:n.value});return a._version+=1,a}clear(){this.forward.clear(),this.reverse.clear(),this.counters.clear(),this.reservedTokens.clear(),this._version+=1;}};function pe(s={}){return new m(s)}function ge(s,e={}){return new m(e).redact(s).value}function he(s,e={}){return new m(e).redact(s)}function ye(s,e={}){return new m(e).scan(s)}exports.BUILTIN_RULES=W;exports.Vault=m;exports.createVault=pe;exports.hmacSha256Hex=w;exports.isPrivateOrLoopbackIpv4=Y;exports.isValidAadhaar=H;exports.isValidDeTaxId=B;exports.isValidDea=K;exports.isValidIban=F;exports.isValidIpv4=j;exports.isValidJwt=G;exports.isValidLuhn=O;exports.isValidMbi=U;exports.isValidNhs=L;exports.isValidNpi=z;exports.isValidSsn=$;exports.redact=ge;exports.redactDetailed=he;exports.scan=ye;exports.sha256Hex=N;exports.shannonEntropy=J;
@@ -0,0 +1,36 @@
1
+ import { D as DetectorRule, b as RuleMatchContext } from './types-DZbmtyhn.cjs';
2
+ export { C as CustomRuleInput, E as EntityCategory, F as FhirRedactOptions, c as Finding, P as PolicyPreset, R as RedactOptions, a as RedactResult, S as StreamRestorer, T as TokenFormat, V as VaultSnapshot } from './types-DZbmtyhn.cjs';
3
+ export { V as Vault, c as createVault, r as redact, a as redactDetailed, s as scan } from './engine-CBII6Rkn.cjs';
4
+
5
+ declare const BUILTIN_RULES: readonly DetectorRule[];
6
+
7
+ /** ISO/IEC 7812 Luhn Mod-10 check. */
8
+ declare function isValidLuhn(input: string): boolean;
9
+ /** CMS National Provider Identifier (10 digits; Luhn over "80840" + NPI). */
10
+ declare function isValidNpi(input: string): boolean;
11
+ /**
12
+ * US DEA Registration Number (2 letters + 7 digits).
13
+ * Checksum: ((d1 + d3 + d5) + 2 * (d2 + d4 + d6)) % 10 === d7
14
+ */
15
+ declare function isValidDea(input: string): boolean;
16
+ declare function isValidMbi(input: string): boolean;
17
+ /** ISO 13616 IBAN country length + Mod-97 check. */
18
+ declare function isValidIban(input: string): boolean;
19
+ /** UK NHS 10-digit Number Mod-11 check. */
20
+ declare function isValidNhs(input: string): boolean;
21
+ /** US SSN structural validation (rejects 000/666/9xx area, 00 group, 0000 serial). */
22
+ declare function isValidSsn(input: string, ctx?: RuleMatchContext): boolean;
23
+ /** 12-digit Indian Aadhaar Verhoeff checksum (starts 2-9). */
24
+ declare function isValidAadhaar(input: string): boolean;
25
+ /** German 11-digit Steuer-Identifikationsnummer (ISO 7064 Mod 11,10). */
26
+ declare function isValidDeTaxId(input: string): boolean;
27
+ /** Base64url JWT header sanity check (`{"alg":...}` or `{"typ":...}`). */
28
+ declare function isValidJwt(input: string): boolean;
29
+ declare function isPrivateOrLoopbackIpv4(ip: string): boolean;
30
+ declare function isValidIpv4(ip: string): boolean;
31
+ declare function shannonEntropy(input: string): number;
32
+
33
+ declare function hmacSha256Hex(key: string, message: string, hexLength?: number): string;
34
+ declare function sha256Hex(input: string, hexLength?: number): string;
35
+
36
+ export { BUILTIN_RULES, DetectorRule, RuleMatchContext, hmacSha256Hex, isPrivateOrLoopbackIpv4, isValidAadhaar, isValidDeTaxId, isValidDea, isValidIban, isValidIpv4, isValidJwt, isValidLuhn, isValidMbi, isValidNhs, isValidNpi, isValidSsn, sha256Hex, shannonEntropy };
@@ -0,0 +1,36 @@
1
+ import { D as DetectorRule, b as RuleMatchContext } from './types-DZbmtyhn.js';
2
+ export { C as CustomRuleInput, E as EntityCategory, F as FhirRedactOptions, c as Finding, P as PolicyPreset, R as RedactOptions, a as RedactResult, S as StreamRestorer, T as TokenFormat, V as VaultSnapshot } from './types-DZbmtyhn.js';
3
+ export { V as Vault, c as createVault, r as redact, a as redactDetailed, s as scan } from './engine-DXYt06CR.js';
4
+
5
+ declare const BUILTIN_RULES: readonly DetectorRule[];
6
+
7
+ /** ISO/IEC 7812 Luhn Mod-10 check. */
8
+ declare function isValidLuhn(input: string): boolean;
9
+ /** CMS National Provider Identifier (10 digits; Luhn over "80840" + NPI). */
10
+ declare function isValidNpi(input: string): boolean;
11
+ /**
12
+ * US DEA Registration Number (2 letters + 7 digits).
13
+ * Checksum: ((d1 + d3 + d5) + 2 * (d2 + d4 + d6)) % 10 === d7
14
+ */
15
+ declare function isValidDea(input: string): boolean;
16
+ declare function isValidMbi(input: string): boolean;
17
+ /** ISO 13616 IBAN country length + Mod-97 check. */
18
+ declare function isValidIban(input: string): boolean;
19
+ /** UK NHS 10-digit Number Mod-11 check. */
20
+ declare function isValidNhs(input: string): boolean;
21
+ /** US SSN structural validation (rejects 000/666/9xx area, 00 group, 0000 serial). */
22
+ declare function isValidSsn(input: string, ctx?: RuleMatchContext): boolean;
23
+ /** 12-digit Indian Aadhaar Verhoeff checksum (starts 2-9). */
24
+ declare function isValidAadhaar(input: string): boolean;
25
+ /** German 11-digit Steuer-Identifikationsnummer (ISO 7064 Mod 11,10). */
26
+ declare function isValidDeTaxId(input: string): boolean;
27
+ /** Base64url JWT header sanity check (`{"alg":...}` or `{"typ":...}`). */
28
+ declare function isValidJwt(input: string): boolean;
29
+ declare function isPrivateOrLoopbackIpv4(ip: string): boolean;
30
+ declare function isValidIpv4(ip: string): boolean;
31
+ declare function shannonEntropy(input: string): number;
32
+
33
+ declare function hmacSha256Hex(key: string, message: string, hexLength?: number): string;
34
+ declare function sha256Hex(input: string, hexLength?: number): string;
35
+
36
+ export { BUILTIN_RULES, DetectorRule, RuleMatchContext, hmacSha256Hex, isPrivateOrLoopbackIpv4, isValidAadhaar, isValidDeTaxId, isValidDea, isValidIban, isValidIpv4, isValidJwt, isValidLuhn, isValidMbi, isValidNhs, isValidNpi, isValidSsn, sha256Hex, shannonEntropy };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ var se=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ne=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),V=new TextEncoder;function A(s,e){return s>>>e|s<<32-e}function C(s){let e=s.length*8,r=Math.ceil((s.length+9)/64)*64,a=new Uint8Array(r);a.set(s),a[s.length]=128;let n=new DataView(a.buffer),i=Math.floor(e/4294967296),o=e>>>0;n.setUint32(r-8,i,false),n.setUint32(r-4,o,false);let t=new Uint32Array(ne),l=new Uint32Array(64);for(let c=0;c<r;c+=64){for(let h=0;h<16;h++)l[h]=n.getUint32(c+h*4,false);for(let h=16;h<64;h++){let R=l[h-15],E=l[h-2],P=A(R,7)^A(R,18)^R>>>3,D=A(E,17)^A(E,19)^E>>>10;l[h]=l[h-16]+P+l[h-7]+D>>>0;}let u=t[0],d=t[1],f=t[2],b=t[3],x=t[4],S=t[5],I=t[6],M=t[7];for(let h=0;h<64;h++){let R=A(x,6)^A(x,11)^A(x,25),E=x&S^~x&I,P=M+R+E+se[h]+l[h]>>>0,D=A(u,2)^A(u,13)^A(u,22),te=u&d^u&f^d&f,re=D+te>>>0;M=I,I=S,S=x,x=b+P>>>0,b=f,f=d,d=u,u=P+re>>>0;}t[0]=t[0]+u>>>0,t[1]=t[1]+d>>>0,t[2]=t[2]+f>>>0,t[3]=t[3]+b>>>0,t[4]=t[4]+x>>>0,t[5]=t[5]+S>>>0,t[6]=t[6]+I>>>0,t[7]=t[7]+M>>>0;}let p=new Uint8Array(32),g=new DataView(p.buffer);for(let c=0;c<8;c++)g.setUint32(c*4,t[c],false);return p}function w(s,e,r=64){let a=V.encode(s),n=a.length>64?C(a):a,i=new Uint8Array(64);i.set(n);let o=new Uint8Array(64),t=new Uint8Array(64);for(let d=0;d<64;d++){let f=i[d];o[d]=f^92,t[d]=f^54;}let l=V.encode(e),p=new Uint8Array(64+l.length);p.set(t,0),p.set(l,64);let g=C(p),c=new Uint8Array(96);c.set(o,0),c.set(g,64);let u=C(c);return Z(u).slice(0,r)}function N(s,e=64){return Z(C(V.encode(s))).slice(0,e)}function Z(s){let e="";for(let r=0;r<s.length;r++)e+=s[r].toString(16).padStart(2,"0");return e}function q(s=8){let e=new Uint8Array(s);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(e);else for(let r=0;r<s;r++)e[r]=Math.floor(Math.random()*256);return Z(e)}function v(s){return s.replace(/\D/g,"")}function O(s){let e=v(s);if(e.length<13||e.length>19||/^(\d)\1+$/.test(e))return false;let r=0,a=false;for(let n=e.length-1;n>=0;n--){let i=e.charCodeAt(n)-48;a&&(i*=2,i>9&&(i-=9)),r+=i,a=!a;}return r%10===0}function z(s){let e=v(s);if(!/^[12]\d{9}$/.test(e))return false;let r="80840"+e,a=0,n=false;for(let i=r.length-1;i>=0;i--){let o=r.charCodeAt(i)-48;n&&(o*=2,o>9&&(o-=9)),a+=o,n=!n;}return a%10===0}function K(s){let e=s.trim().toUpperCase();if(!/^[ABFGMPRX][A-Z9]\d{7}$/.test(e))return false;let r=o=>e.charCodeAt(2+o)-48,a=r(0)+r(2)+r(4),n=r(1)+r(3)+r(5);return (a+2*n)%10===r(6)}var _="ACDEFGHJKMNPQRTUVWXY",X="0123456789"+_;function U(s){let e=s.replace(/-/g,"").toUpperCase();if(e.length!==11)return false;let r=e.charCodeAt(0);return !(r<49||r>57||!_.includes(e[1])||!X.includes(e[2])||!/\d/.test(e[3])||!_.includes(e[4])||!X.includes(e[5])||!/\d/.test(e[6])||!_.includes(e[7])||!_.includes(e[8])||!/\d\d/.test(e.slice(9,11)))}var ie={AD:24,AE:23,AL:28,AT:20,AZ:28,BA:20,BE:16,BG:22,BH:22,BR:29,BY:28,CH:21,CR:22,CY:28,CZ:24,DE:22,DK:18,DO:28,EE:20,EG:29,ES:24,FI:18,FO:18,FR:27,GB:22,GE:22,GI:23,GL:18,GR:27,GT:28,HR:21,HU:28,IE:22,IL:23,IQ:23,IS:26,IT:27,JO:30,KW:30,KZ:20,LB:28,LC:32,LI:21,LT:20,LU:20,LV:21,MC:27,MD:24,ME:22,MK:19,MR:27,MT:31,MU:30,NL:18,NO:15,PK:24,PL:28,PS:29,PT:25,QA:29,RO:24,RS:22,SA:24,SE:24,SI:19,SK:24,SM:27,ST:25,SV:28,TL:23,TN:24,TR:26,UA:29,VA:22,VG:24,XK:20};function F(s){let e=s.replace(/[\s-]+/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(e))return false;let r=ie[e.slice(0,2)];if(r!==void 0&&e.length!==r)return false;let a=e.slice(4)+e.slice(0,4),n=0;for(let i=0;i<a.length;i++){let o=a.charCodeAt(i);if(o>=48&&o<=57)n=(n*10+(o-48))%97;else if(o>=65&&o<=90){let t=o-55;n=(n*100+t)%97;}else return false}return n===1}function L(s){let e=v(s);if(e.length!==10||/^(\d)\1+$/.test(e))return false;let r=0;for(let i=0;i<9;i++)r+=(e.charCodeAt(i)-48)*(10-i);let n=11-r%11;return n===11&&(n=0),n===10?false:n===e.charCodeAt(9)-48}function $(s,e){let r=s.trim(),a=/[-\s]/.test(r),n=v(r);if(n.length!==9)return false;let i=Number(n.slice(0,3)),o=Number(n.slice(3,5)),t=Number(n.slice(5,9));if(i===0||i===666||i>=900||o===0||t===0||/^(\d)\1+$/.test(n))return false;if(!a&&e){let l=e.fullText.slice(Math.max(0,e.start-36),e.start);return /\b(ssn|social[\s_-]?security|tin)\b/i.test(l)}return true}var ae=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],oe=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]];function H(s){let e=v(s);if(!/^[2-9]\d{11}$/.test(e))return false;let r=0;for(let a=0;a<e.length;a++){let n=e.charCodeAt(e.length-1-a)-48;r=ae[r][oe[a%8][n]];}return r===0}function B(s){let e=v(s);if(!/^[1-9]\d{10}$/.test(e))return false;let r=new Array(10).fill(0);for(let t=0;t<10;t++)r[e.charCodeAt(t)-48]+=1;let a=r.filter(t=>t===2||t===3).length,n=Math.max(...r);if(a!==1||n>3)return false;let i=10;for(let t=0;t<10;t++){let l=(e.charCodeAt(t)-48+i)%10;l===0&&(l=10),i=l*2%11;}let o=11-i;return o===10&&(o=0),o===e.charCodeAt(10)-48}function G(s){let e=s.split(".");if(e.length!==3)return false;let r=e[0];if(!r.startsWith("eyJ"))return false;try{let a=r.replace(/-/g,"+").replace(/_/g,"/"),n=(4-a.length%4)%4,i=atob(a+"=".repeat(n));return i.startsWith("{")&&i.includes('"')}catch{return false}}function Y(s){let e=s.split(".").map(Number);if(e.length!==4)return false;let[r,a]=e;return r===void 0||a===void 0?false:r===10||r===127||r===0||r===192&&a===168||r===172&&a>=16&&a<=31||r===169&&a===254}function j(s){let e=s.split(".");if(e.length!==4)return false;for(let r of e){if(r.length===0||r.length>1&&r.startsWith("0"))return false;let a=Number(r);if(!Number.isInteger(a)||a<0||a>255)return false}return true}function J(s){if(s.length===0)return 0;let e=new Map;for(let n=0;n<s.length;n++){let i=s.charCodeAt(n);e.set(i,(e.get(i)??0)+1);}let r=0,a=s.length;for(let n of e.values()){let i=n/a;r-=i*Math.log2(i);}return r}var y=["default","secrets","hipaa","gdpr","strict"],k=["default","hipaa","gdpr","strict"],T=["hipaa","strict"],ce=["gdpr","strict"],W=[{id:"pem-private-key",category:"PRIVATE_KEY",priority:100,presets:y,pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----[\s\S]{16,8192}?-----END (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----/g},{id:"connection-uri-password",category:"CONNECTION_URI",priority:96,presets:y,captureGroup:1,pattern:/\b(?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis(?:s)?|amqp(?:s)?|mssql|clickhouse|cockroachdb):\/\/[^:\s/@]+:([^@\s/]{3,256})@[^\s"'<>]+/gi},{id:"anthropic-key",category:"API_KEY",priority:95,presets:y,pattern:/\bsk-ant-(?:api\d{2}|admin\d{2}|oat\d{2}|[a-z0-9]+)-[A-Za-z0-9_-]{24,}\b/g},{id:"openai-key",category:"API_KEY",priority:95,presets:y,pattern:/\bsk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{24,}\b|\bsk-[A-Za-z0-9]{16,}T3BlbkFJ[A-Za-z0-9]{16,}\b/g},{id:"github-token",category:"API_KEY",priority:95,presets:y,pattern:/\b(?:gh[pousr]_[A-Za-z0-9_]{36,}|github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{40,})\b/g},{id:"aws-access-key",category:"API_KEY",priority:94,presets:y,pattern:/\b(?:AKIA|ASIA|AROA|AIDA)[0-9A-Z]{16}\b/g},{id:"stripe-secret",category:"API_KEY",priority:94,presets:y,pattern:/\b(?:sk_live|rk_live|whsec)_[A-Za-z0-9]{20,}\b/g},{id:"google-api-key",category:"API_KEY",priority:93,presets:y,pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{id:"slack-token",category:"TOKEN",priority:93,presets:y,pattern:/\bxox[baprs]-[0-9A-Za-z-]{14,}\b|https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+/g},{id:"discord-webhook",category:"SECRET",priority:92,presets:y,pattern:/https:\/\/discord(?:app)?\.com\/api\/webhooks\/\d{16,22}\/[A-Za-z0-9_-]{40,}/g},{id:"provider-prefixed-keys",category:"API_KEY",priority:92,presets:y,pattern:/\b(?:hf_[A-Za-z0-9]{30,}|gsk_[A-Za-z0-9]{36,}|xai-[A-Za-z0-9]{36,}|pplx-[A-Za-z0-9]{36,}|sbp_[A-Za-z0-9]{36,}|sb_secret_[A-Za-z0-9_-]{24,}|re_[A-Za-z0-9_]{24,}|npm_[A-Za-z0-9]{36}|pypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}|SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43})\b/g},{id:"jwt-token",category:"JWT",priority:90,presets:y,pattern:/\beyJ[A-Za-z0-9_-]{6,}\.eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{8,}\b/g,validate:s=>G(s)},{id:"bearer-auth-header",category:"TOKEN",priority:88,presets:y,captureGroup:1,pattern:/\b(?:Authorization|Proxy-Authorization)\s*[:=]\s*["']?(?:Bearer|Basic|Token)\s+([A-Za-z0-9._~+/=-]{12,})["']?/gi},{id:"contextual-secret-assignment",category:"SECRET",priority:72,presets:y,captureGroup:1,pattern:/\b(?:api[_-]?key|secret[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|aws_secret_access_key|password|passwd|pwd|signing[_-]?secret)\b\s*[:=]\s*["']?([^\s"',;}{]{10,128})["']?/gi,validate:s=>!s.startsWith("[")&&!s.startsWith("<")&&J(s)>=2.8},{id:"medicare-mbi",category:"MBI",priority:84,presets:T,pattern:/\b[1-9][AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y]{2}\d{2}\b/gi,validate:s=>U(s)},{id:"us-dea",category:"DEA",priority:83,presets:T,pattern:/\b[ABFGMPRX][A-Z9]\d{7}\b/g,validate:s=>K(s)},{id:"us-npi",category:"NPI",priority:80,presets:T,contextWindow:40,contextRegex:/\b(?:npi|provider|prescriber|practitioner|physician)\b/i,pattern:/\b[12]\d{9}\b/g,validate:s=>z(s)},{id:"uk-nhs-number",category:"NHS",priority:80,presets:["hipaa","gdpr","strict"],contextWindow:40,contextRegex:/\b(?:nhs|patient|health|care|medical)\b/i,pattern:/\b\d{3}[-\s]?\d{3}[-\s]?\d{4}\b/g,validate:s=>L(s)},{id:"medical-record-number",category:"MRN",priority:78,presets:T,captureGroup:1,pattern:/\b(?:mrn|medical[\s_-]?record(?:[\s_-]?number)?|patient[\s_-]?id)\s*[:=#]?\s*([A-Z0-9-]{5,20})\b/gi},{id:"iban",category:"IBAN",priority:84,presets:k,pattern:/\b[A-Z]{2}\d{2}(?:[\s-]?[A-Z0-9]){11,30}\b/g,validate:s=>F(s)},{id:"credit-card",category:"CREDIT_CARD",priority:82,presets:k,pattern:/\b(?:\d[ -]?){13,18}\d\b/g,validate:s=>{let e=s.replace(/\D/g,"");return /^(?:4\d{12}(?:\d{3})?(?:\d{3})?|5[1-5]\d{14}|2(?:2[2-9]|[3-6]\d|7[01]|720)\d{12}|3[47]\d{13}|6(?:011|5\d\d)\d{12}|3(?:0[0-5]|[68]\d)\d{11}|(?:2131|1800|35\d{3})\d{11})$/.test(e)&&O(e)}},{id:"us-ssn",category:"SSN",priority:81,presets:k,pattern:/\b\d{3}[-\s]\d{2}[-\s]\d{4}\b|\b\d{9}\b/g,validate:(s,e)=>$(s,e)},{id:"aadhaar-in",category:"AADHAAR",priority:76,presets:["gdpr","strict"],contextWindow:40,contextRegex:/\b(?:aadhaar|aadhar|uidai)\b/i,pattern:/\b[2-9]\d{3}[-\s]?\d{4}[-\s]?\d{4}\b/g,validate:s=>H(s)},{id:"de-tax-id",category:"TAX_ID",priority:76,presets:ce,contextWindow:45,contextRegex:/\b(?:steuer|tax|tin|idnr|identifikationsnummer)\b/i,pattern:/\b[1-9]\d{10}\b/g,validate:s=>B(s)},{id:"email",category:"EMAIL",priority:75,presets:k,pattern:/\b[A-Za-z0-9._%+-]{1,64}@(?:[A-Za-z0-9-]{1,63}\.)+[A-Za-z]{2,24}\b/g},{id:"phone",category:"PHONE",priority:65,presets:k,pattern:/(?:\+\d{1,3}[-.\s]?)?(?:\(\d{2,4}\)[-.\s]?|\b\d{3}[-.\s])\d{3,4}[-.\s]\d{4}\b|\+\d{1,3}[-.\s]?\d{2,4}[-.\s]?\d{3,4}[-.\s]?\d{3,4}\b/g,validate:s=>{let e=s.replace(/\D/g,"");return e.length>=10&&e.length<=15&&!/^(\d)\1+$/.test(e)}},{id:"ipv4",category:"IP_ADDRESS",priority:60,presets:k,pattern:/\b(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}\b/g,validate:s=>j(s)},{id:"ipv6",category:"IP_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b|\b(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\b/g},{id:"mac-address",category:"MAC_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\b/g},{id:"labeled-person-name",category:"PERSON",priority:55,presets:["hipaa","strict"],captureGroup:1,pattern:/\b(?:Patient(?:\s+Name)?|Dr\.|Doctor|Clinician|Provider|Mr\.|Mrs\.|Ms\.|Full\s+Name|Beneficiary)\s*[:.]?\s*([A-Z][a-z]{1,24}(?:\s+[A-Z]\.?)?(?:\s+[A-Z][a-z]{1,24}){1,2})/g},{id:"dob-or-clinical-date",category:"DATE",priority:52,presets:T,contextWindow:40,contextRegex:/\b(?:dob|birth|born|admit(?:ted)?|discharg(?:e|ed)|visit|encounter|date)\b/i,pattern:/\b(?:\d{4}-\d{2}-\d{2}|(?:0?[1-9]|1[0-2])[/-](?:0?[1-9]|[12]\d|3[01])[/-](?:19|20)\d{2})\b/g}];var le=/^(?:password|passwd|pwd|passphrase|secret|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|authorization|cookie|set-cookie|x-api-key|client[_-]?secret|private[_-]?key|ssn|social[_-]?security(?:[_-]?number)?|cvv|cvc|pin|iban|dob|birth[_-]?date|mrn)$/i,ue=/\[[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?\]|<[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?>/g;function Q(s){let e=s.toLowerCase();return e.includes("ssn")||e.includes("social")?"SSN":e.includes("iban")?"IBAN":e.includes("mrn")?"MRN":e.includes("dob")||e.includes("birth")?"DATE":e.includes("password")||e.includes("passwd")||e.includes("secret")||e==="cvv"||e==="cvc"||e==="pin"?"SECRET":e.includes("token")||e==="authorization"||e==="cookie"||e==="set-cookie"?"TOKEN":e.includes("key")?"API_KEY":"CUSTOM"}function de(s){let e=s.preset??"default",r=s.rules?[...s.rules]:W.filter(i=>i.presets.includes(e)),n=[...(s.customRules??[]).map(i=>({id:i.id,category:i.category??"CUSTOM",pattern:i.pattern,captureGroup:i.captureGroup,priority:i.priority??85,presets:["default","secrets","hipaa","gdpr","strict"],validate:i.validate})),...r];if(s.categories?.length){let i=new Set(s.categories);n=n.filter(o=>i.has(o.category));}if(s.excludeCategories?.length){let i=new Set(s.excludeCategories);n=n.filter(o=>!i.has(o.category));}return n}function fe(s,e){let r=[];for(let a of e){if(!a||a.length<4)continue;let n=0;for(;;){let i=s.indexOf(a,n);if(i===-1)break;r.push({id:"literal-secret",category:"SECRET",priority:99,start:i,end:i+a.length,value:a}),n=i+a.length;}}return r}function ee(s,e,r){let a=[],n=r.allowlist?new Set(r.allowlist):void 0,i=r.redactPrivateIps??(r.preset==="strict"||r.preset==="hipaa");r.literals?.length&&a.push(...fe(s,r.literals));for(let t of e){let l=t.pattern.flags.includes("g")?t.pattern.flags:t.pattern.flags+"g",p=new RegExp(t.pattern.source,l),g;for(;(g=p.exec(s))!==null;){if(g[0].length===0){p.lastIndex+=1;continue}let c=g.index,u=g[0];if(t.captureGroup!==void 0&&g[t.captureGroup]!==void 0){let f=g[t.captureGroup],b=g[0].indexOf(f);b!==-1&&(c=g.index+b,u=f);}let d=c+u.length;if(!n?.has(u)&&!(t.id==="ipv4"&&!i&&Y(u))){if(t.contextRegex){let f=t.contextWindow??40,b=s.slice(Math.max(0,c-f),c),x=s.slice(d,Math.min(s.length,d+f));if(!t.contextRegex.test(b)&&!t.contextRegex.test(x))continue}if(t.validate){let f={fullText:s,match:g,start:c,end:d,value:u};if(!t.validate(u,f))continue}a.push({id:t.id,category:t.category,priority:t.priority,start:c,end:d,value:u});}}}a.sort((t,l)=>{if(l.priority!==t.priority)return l.priority-t.priority;let p=l.end-l.start-(t.end-t.start);return p!==0?p:t.start-l.start});let o=[];for(let t of a){let l=false;for(let p of o)if(t.start<p.end&&t.end>p.start){l=true;break}l||o.push(t);}return o.sort((t,l)=>t.start-l.start),o}var m=class s{options;rules;tokenFormat;vaultKey;sensitiveKeyRe;forward=new Map;reverse=new Map;counters=new Map;reservedTokens=new Set;_version=0;constructor(e={}){this.options=e,this.rules=de(e),this.tokenFormat=e.tokenFormat??"bracket",this.vaultKey=e.secret??q(16),this.sensitiveKeyRe=e.sensitiveKeys?.length?new RegExp(`^(?:${e.sensitiveKeys.map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$`,"i"):le;}get version(){return this._version}fingerprint(e){return w(this.vaultKey,e,12)}reserveExistingTokens(e){let r=new RegExp(ue.source,"g"),a;for(;(a=r.exec(e))!==null;)this.reverse.has(a[0])||this.reservedTokens.add(a[0]);}tokenize(e,r){let a=`${e}:${r}`,n=this.forward.get(a);if(n!==void 0)return n;if(this.tokenFormat==="mask")return (this.options.maskChar??"*").repeat(Math.min(Math.max(r.length,4),16));if(this.tokenFormat==="hash"){let t=w(this.vaultKey,a,8),l=`[${e}:${t}]`;return this.forward.set(a,l),this.reverse.set(l,{category:e,value:r}),this._version+=1,l}let i=this.counters.get(e)??0,o;do if(i+=1,this.tokenFormat==="angle")o=`<${e}_${i}>`;else if(this.tokenFormat==="signed"){let t=w(this.vaultKey,`${e}:${i}:${r}`,4);o=`[${e}_${i}#${t}]`;}else o=`[${e}_${i}]`;while(this.reservedTokens.has(o)||this.reverse.has(o));return this.counters.set(e,i),this.forward.set(a,o),this.reverse.set(o,{category:e,value:r}),this._version+=1,o}scan(e){return typeof e!="string"||e.length===0?[]:ee(e,this.rules,this.options).map(a=>({id:a.id,category:a.category,start:a.start,end:a.end,token:`[${a.category}]`,length:a.value.length,fingerprint:N(a.value,12)}))}redactText(e){if(typeof e!="string"||e.length===0)return {value:e,findings:[],count:0};this.reserveExistingTokens(e);let r=ee(e,this.rules,this.options);if(r.length===0)return {value:e,findings:[],count:0};let a="",n=0,i=[];for(let o of r){a+=e.slice(n,o.start);let t=this.tokenize(o.category,o.value);a+=t,n=o.end,i.push({id:o.id,category:o.category,start:o.start,end:o.end,token:t,length:o.value.length,fingerprint:this.fingerprint(o.value)});}return a+=e.slice(n),{value:a,findings:i,count:i.length}}redactObject(e){let r=[],a=this.options.maxDepth??32,n=new WeakMap,i=(t,l,p)=>{if(t==null)return t;if(typeof t=="string"){if(p&&this.sensitiveKeyRe.test(p)&&t.length>0&&!this.reverse.has(t)){let u=Q(p),d=this.tokenize(u,t);return r.push({id:"sensitive-key",category:u,start:0,end:t.length,token:d,length:t.length,fingerprint:this.fingerprint(t)}),d}let c=this.redactText(t);return c.count>0&&r.push(...c.findings),c.value}if(typeof t!="object")return t;if(l>=a)return "[MAX_DEPTH_TRUNCATED]";if(n.has(t))return n.get(t);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t.source,t.flags);if(t instanceof URL){let c=new URL(t.toString());c.password&&(c.password=this.tokenize("SECRET",c.password));let u=[];c.searchParams.forEach((d,f)=>{u.push([f,d]);});for(let[d,f]of u)if(this.sensitiveKeyRe.test(d)&&f)c.searchParams.set(d,this.tokenize(Q(d),f));else {let b=this.redactText(f);b.count>0&&(r.push(...b.findings),c.searchParams.set(d,b.value));}return c}if(typeof Headers<"u"&&t instanceof Headers){let c=new Headers;return t.forEach((u,d)=>{c.set(d,i(u,l+1,d));}),c}if(t instanceof Error){let c={name:t.name,message:this.options.redactErrors!==false?i(t.message,l+1):t.message};t.stack!==void 0&&(c.stack=this.options.redactErrors!==false?i(t.stack,l+1):t.stack),"cause"in t&&t.cause!==void 0&&(c.cause=i(t.cause,l+1));for(let u of Object.keys(t))c[u]=i(t[u],l+1,u);return c}if(Array.isArray(t)){let c=[];n.set(t,c);for(let u=0;u<t.length;u++)c.push(i(t[u],l+1,p));return c}if(t instanceof Map){let c=new Map;n.set(t,c);for(let[u,d]of t.entries()){let f=typeof u=="string"?u:void 0;c.set(i(u,l+1),i(d,l+1,f));}return c}if(t instanceof Set){let c=new Set;n.set(t,c);for(let u of t.values())c.add(i(u,l+1));return c}let g={};n.set(t,g);for(let[c,u]of Object.entries(t))g[c]=i(u,l+1,c);return g};return {value:i(e,0),findings:r,count:r.length}}redact(e){return typeof e=="string"?this.redactText(e):this.redactObject(e)}restore(e){if(typeof e!="string"||e.length===0||this.reverse.size===0)return e;let a=Array.from(this.reverse.keys()).sort((i,o)=>o.length-i.length).map(i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),n=new RegExp(a.join("|"),"g");return e.replace(n,i=>this.reverse.get(i)?.value??i)}restoreObject(e){let r=new WeakMap,a=(n,i)=>{if(n==null)return n;if(typeof n=="string")return this.restore(n);if(typeof n!="object"||i>=32)return n;if(r.has(n))return r.get(n);if(Array.isArray(n)){let t=[];r.set(n,t);for(let l of n)t.push(a(l,i+1));return t}if(n instanceof Date||n instanceof RegExp||n instanceof URL)return n;let o={};r.set(n,o);for(let[t,l]of Object.entries(n))o[t]=a(l,i+1);return o};return a(e,0)}entries(){return Array.from(this.reverse.entries()).map(([e,r])=>({token:e,category:r.category,value:r.value}))}export(){let e={};for(let[r,a]of this.counters.entries())e[r]=a;return {version:1,tokenFormat:this.tokenFormat,counters:e,entries:this.entries()}}static fromJSON(e,r={}){let a=new s({...r,tokenFormat:e.tokenFormat});for(let[n,i]of Object.entries(e.counters))a.counters.set(n,i);for(let n of e.entries)a.forward.set(`${n.category}:${n.value}`,n.token),a.reverse.set(n.token,{category:n.category,value:n.value});return a._version+=1,a}clear(){this.forward.clear(),this.reverse.clear(),this.counters.clear(),this.reservedTokens.clear(),this._version+=1;}};function pe(s={}){return new m(s)}function ge(s,e={}){return new m(e).redact(s).value}function he(s,e={}){return new m(e).redact(s)}function ye(s,e={}){return new m(e).scan(s)}export{W as BUILTIN_RULES,m as Vault,pe as createVault,w as hmacSha256Hex,Y as isPrivateOrLoopbackIpv4,H as isValidAadhaar,B as isValidDeTaxId,K as isValidDea,F as isValidIban,j as isValidIpv4,G as isValidJwt,O as isValidLuhn,U as isValidMbi,L as isValidNhs,z as isValidNpi,$ as isValidSsn,ge as redact,he as redactDetailed,ye as scan,N as sha256Hex,J as shannonEntropy};
@@ -0,0 +1 @@
1
+ 'use strict';var se=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ie=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),N=new TextEncoder;function A(n,e){return n>>>e|n<<32-e}function C(n){let e=n.length*8,r=Math.ceil((n.length+9)/64)*64,a=new Uint8Array(r);a.set(n),a[n.length]=128;let s=new DataView(a.buffer),i=Math.floor(e/4294967296),o=e>>>0;s.setUint32(r-8,i,false),s.setUint32(r-4,o,false);let t=new Uint32Array(ie),l=new Uint32Array(64);for(let c=0;c<r;c+=64){for(let h=0;h<16;h++)l[h]=s.getUint32(c+h*4,false);for(let h=16;h<64;h++){let k=l[h-15],R=l[h-2],S=A(k,7)^A(k,18)^k>>>3,O=A(R,17)^A(R,19)^R>>>10;l[h]=l[h-16]+S+l[h-7]+O>>>0;}let u=t[0],d=t[1],f=t[2],y=t[3],x=t[4],T=t[5],_=t[6],D=t[7];for(let h=0;h<64;h++){let k=A(x,6)^A(x,11)^A(x,25),R=x&T^~x&_,S=D+k+R+se[h]+l[h]>>>0,O=A(u,2)^A(u,13)^A(u,22),re=u&d^u&f^d&f,ne=O+re>>>0;D=_,_=T,T=x,x=y+S>>>0,y=f,f=d,d=u,u=S+ne>>>0;}t[0]=t[0]+u>>>0,t[1]=t[1]+d>>>0,t[2]=t[2]+f>>>0,t[3]=t[3]+y>>>0,t[4]=t[4]+x>>>0,t[5]=t[5]+T>>>0,t[6]=t[6]+_>>>0,t[7]=t[7]+D>>>0;}let p=new Uint8Array(32),g=new DataView(p.buffer);for(let c=0;c<8;c++)g.setUint32(c*4,t[c],false);return p}function P(n,e,r=64){let a=N.encode(n),s=a.length>64?C(a):a,i=new Uint8Array(64);i.set(s);let o=new Uint8Array(64),t=new Uint8Array(64);for(let d=0;d<64;d++){let f=i[d];o[d]=f^92,t[d]=f^54;}let l=N.encode(e),p=new Uint8Array(64+l.length);p.set(t,0),p.set(l,64);let g=C(p),c=new Uint8Array(96);c.set(o,0),c.set(g,64);let u=C(c);return V(u).slice(0,r)}function Z(n,e=64){return V(C(N.encode(n))).slice(0,e)}function V(n){let e="";for(let r=0;r<n.length;r++)e+=n[r].toString(16).padStart(2,"0");return e}function z(n=8){let e=new Uint8Array(n);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(e);else for(let r=0;r<n;r++)e[r]=Math.floor(Math.random()*256);return V(e)}function m(n){return n.replace(/\D/g,"")}function F(n){let e=m(n);if(e.length<13||e.length>19||/^(\d)\1+$/.test(e))return false;let r=0,a=false;for(let s=e.length-1;s>=0;s--){let i=e.charCodeAt(s)-48;a&&(i*=2,i>9&&(i-=9)),r+=i,a=!a;}return r%10===0}function L(n){let e=m(n);if(!/^[12]\d{9}$/.test(e))return false;let r="80840"+e,a=0,s=false;for(let i=r.length-1;i>=0;i--){let o=r.charCodeAt(i)-48;s&&(o*=2,o>9&&(o-=9)),a+=o,s=!s;}return a%10===0}function U(n){let e=n.trim().toUpperCase();if(!/^[ABFGMPRX][A-Z9]\d{7}$/.test(e))return false;let r=o=>e.charCodeAt(2+o)-48,a=r(0)+r(2)+r(4),s=r(1)+r(3)+r(5);return (a+2*s)%10===r(6)}var w="ACDEFGHJKMNPQRTUVWXY",K="0123456789"+w;function $(n){let e=n.replace(/-/g,"").toUpperCase();if(e.length!==11)return false;let r=e.charCodeAt(0);return !(r<49||r>57||!w.includes(e[1])||!K.includes(e[2])||!/\d/.test(e[3])||!w.includes(e[4])||!K.includes(e[5])||!/\d/.test(e[6])||!w.includes(e[7])||!w.includes(e[8])||!/\d\d/.test(e.slice(9,11)))}var ae={AD:24,AE:23,AL:28,AT:20,AZ:28,BA:20,BE:16,BG:22,BH:22,BR:29,BY:28,CH:21,CR:22,CY:28,CZ:24,DE:22,DK:18,DO:28,EE:20,EG:29,ES:24,FI:18,FO:18,FR:27,GB:22,GE:22,GI:23,GL:18,GR:27,GT:28,HR:21,HU:28,IE:22,IL:23,IQ:23,IS:26,IT:27,JO:30,KW:30,KZ:20,LB:28,LC:32,LI:21,LT:20,LU:20,LV:21,MC:27,MD:24,ME:22,MK:19,MR:27,MT:31,MU:30,NL:18,NO:15,PK:24,PL:28,PS:29,PT:25,QA:29,RO:24,RS:22,SA:24,SE:24,SI:19,SK:24,SM:27,ST:25,SV:28,TL:23,TN:24,TR:26,UA:29,VA:22,VG:24,XK:20};function H(n){let e=n.replace(/[\s-]+/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(e))return false;let r=ae[e.slice(0,2)];if(r!==void 0&&e.length!==r)return false;let a=e.slice(4)+e.slice(0,4),s=0;for(let i=0;i<a.length;i++){let o=a.charCodeAt(i);if(o>=48&&o<=57)s=(s*10+(o-48))%97;else if(o>=65&&o<=90){let t=o-55;s=(s*100+t)%97;}else return false}return s===1}function B(n){let e=m(n);if(e.length!==10||/^(\d)\1+$/.test(e))return false;let r=0;for(let i=0;i<9;i++)r+=(e.charCodeAt(i)-48)*(10-i);let s=11-r%11;return s===11&&(s=0),s===10?false:s===e.charCodeAt(9)-48}function G(n,e){let r=n.trim(),a=/[-\s]/.test(r),s=m(r);if(s.length!==9)return false;let i=Number(s.slice(0,3)),o=Number(s.slice(3,5)),t=Number(s.slice(5,9));if(i===0||i===666||i>=900||o===0||t===0||/^(\d)\1+$/.test(s))return false;if(!a&&e){let l=e.fullText.slice(Math.max(0,e.start-36),e.start);return /\b(ssn|social[\s_-]?security|tin)\b/i.test(l)}return true}var oe=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],ce=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]];function Y(n){let e=m(n);if(!/^[2-9]\d{11}$/.test(e))return false;let r=0;for(let a=0;a<e.length;a++){let s=e.charCodeAt(e.length-1-a)-48;r=oe[r][ce[a%8][s]];}return r===0}function j(n){let e=m(n);if(!/^[1-9]\d{10}$/.test(e))return false;let r=new Array(10).fill(0);for(let t=0;t<10;t++)r[e.charCodeAt(t)-48]+=1;let a=r.filter(t=>t===2||t===3).length,s=Math.max(...r);if(a!==1||s>3)return false;let i=10;for(let t=0;t<10;t++){let l=(e.charCodeAt(t)-48+i)%10;l===0&&(l=10),i=l*2%11;}let o=11-i;return o===10&&(o=0),o===e.charCodeAt(10)-48}function W(n){let e=n.split(".");if(e.length!==3)return false;let r=e[0];if(!r.startsWith("eyJ"))return false;try{let a=r.replace(/-/g,"+").replace(/_/g,"/"),s=(4-a.length%4)%4,i=atob(a+"=".repeat(s));return i.startsWith("{")&&i.includes('"')}catch{return false}}function J(n){let e=n.split(".").map(Number);if(e.length!==4)return false;let[r,a]=e;return r===void 0||a===void 0?false:r===10||r===127||r===0||r===192&&a===168||r===172&&a>=16&&a<=31||r===169&&a===254}function q(n){let e=n.split(".");if(e.length!==4)return false;for(let r of e){if(r.length===0||r.length>1&&r.startsWith("0"))return false;let a=Number(r);if(!Number.isInteger(a)||a<0||a>255)return false}return true}function X(n){if(n.length===0)return 0;let e=new Map;for(let s=0;s<n.length;s++){let i=n.charCodeAt(s);e.set(i,(e.get(i)??0)+1);}let r=0,a=n.length;for(let s of e.values()){let i=s/a;r-=i*Math.log2(i);}return r}var b=["default","secrets","hipaa","gdpr","strict"],v=["default","hipaa","gdpr","strict"],E=["hipaa","strict"],le=["gdpr","strict"],Q=[{id:"pem-private-key",category:"PRIVATE_KEY",priority:100,presets:b,pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----[\s\S]{16,8192}?-----END (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----/g},{id:"connection-uri-password",category:"CONNECTION_URI",priority:96,presets:b,captureGroup:1,pattern:/\b(?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis(?:s)?|amqp(?:s)?|mssql|clickhouse|cockroachdb):\/\/[^:\s/@]+:([^@\s/]{3,256})@[^\s"'<>]+/gi},{id:"anthropic-key",category:"API_KEY",priority:95,presets:b,pattern:/\bsk-ant-(?:api\d{2}|admin\d{2}|oat\d{2}|[a-z0-9]+)-[A-Za-z0-9_-]{24,}\b/g},{id:"openai-key",category:"API_KEY",priority:95,presets:b,pattern:/\bsk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{24,}\b|\bsk-[A-Za-z0-9]{16,}T3BlbkFJ[A-Za-z0-9]{16,}\b/g},{id:"github-token",category:"API_KEY",priority:95,presets:b,pattern:/\b(?:gh[pousr]_[A-Za-z0-9_]{36,}|github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{40,})\b/g},{id:"aws-access-key",category:"API_KEY",priority:94,presets:b,pattern:/\b(?:AKIA|ASIA|AROA|AIDA)[0-9A-Z]{16}\b/g},{id:"stripe-secret",category:"API_KEY",priority:94,presets:b,pattern:/\b(?:sk_live|rk_live|whsec)_[A-Za-z0-9]{20,}\b/g},{id:"google-api-key",category:"API_KEY",priority:93,presets:b,pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{id:"slack-token",category:"TOKEN",priority:93,presets:b,pattern:/\bxox[baprs]-[0-9A-Za-z-]{14,}\b|https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+/g},{id:"discord-webhook",category:"SECRET",priority:92,presets:b,pattern:/https:\/\/discord(?:app)?\.com\/api\/webhooks\/\d{16,22}\/[A-Za-z0-9_-]{40,}/g},{id:"provider-prefixed-keys",category:"API_KEY",priority:92,presets:b,pattern:/\b(?:hf_[A-Za-z0-9]{30,}|gsk_[A-Za-z0-9]{36,}|xai-[A-Za-z0-9]{36,}|pplx-[A-Za-z0-9]{36,}|sbp_[A-Za-z0-9]{36,}|sb_secret_[A-Za-z0-9_-]{24,}|re_[A-Za-z0-9_]{24,}|npm_[A-Za-z0-9]{36}|pypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}|SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43})\b/g},{id:"jwt-token",category:"JWT",priority:90,presets:b,pattern:/\beyJ[A-Za-z0-9_-]{6,}\.eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{8,}\b/g,validate:n=>W(n)},{id:"bearer-auth-header",category:"TOKEN",priority:88,presets:b,captureGroup:1,pattern:/\b(?:Authorization|Proxy-Authorization)\s*[:=]\s*["']?(?:Bearer|Basic|Token)\s+([A-Za-z0-9._~+/=-]{12,})["']?/gi},{id:"contextual-secret-assignment",category:"SECRET",priority:72,presets:b,captureGroup:1,pattern:/\b(?:api[_-]?key|secret[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|aws_secret_access_key|password|passwd|pwd|signing[_-]?secret)\b\s*[:=]\s*["']?([^\s"',;}{]{10,128})["']?/gi,validate:n=>!n.startsWith("[")&&!n.startsWith("<")&&X(n)>=2.8},{id:"medicare-mbi",category:"MBI",priority:84,presets:E,pattern:/\b[1-9][AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y]{2}\d{2}\b/gi,validate:n=>$(n)},{id:"us-dea",category:"DEA",priority:83,presets:E,pattern:/\b[ABFGMPRX][A-Z9]\d{7}\b/g,validate:n=>U(n)},{id:"us-npi",category:"NPI",priority:80,presets:E,contextWindow:40,contextRegex:/\b(?:npi|provider|prescriber|practitioner|physician)\b/i,pattern:/\b[12]\d{9}\b/g,validate:n=>L(n)},{id:"uk-nhs-number",category:"NHS",priority:80,presets:["hipaa","gdpr","strict"],contextWindow:40,contextRegex:/\b(?:nhs|patient|health|care|medical)\b/i,pattern:/\b\d{3}[-\s]?\d{3}[-\s]?\d{4}\b/g,validate:n=>B(n)},{id:"medical-record-number",category:"MRN",priority:78,presets:E,captureGroup:1,pattern:/\b(?:mrn|medical[\s_-]?record(?:[\s_-]?number)?|patient[\s_-]?id)\s*[:=#]?\s*([A-Z0-9-]{5,20})\b/gi},{id:"iban",category:"IBAN",priority:84,presets:v,pattern:/\b[A-Z]{2}\d{2}(?:[\s-]?[A-Z0-9]){11,30}\b/g,validate:n=>H(n)},{id:"credit-card",category:"CREDIT_CARD",priority:82,presets:v,pattern:/\b(?:\d[ -]?){13,18}\d\b/g,validate:n=>{let e=n.replace(/\D/g,"");return /^(?:4\d{12}(?:\d{3})?(?:\d{3})?|5[1-5]\d{14}|2(?:2[2-9]|[3-6]\d|7[01]|720)\d{12}|3[47]\d{13}|6(?:011|5\d\d)\d{12}|3(?:0[0-5]|[68]\d)\d{11}|(?:2131|1800|35\d{3})\d{11})$/.test(e)&&F(e)}},{id:"us-ssn",category:"SSN",priority:81,presets:v,pattern:/\b\d{3}[-\s]\d{2}[-\s]\d{4}\b|\b\d{9}\b/g,validate:(n,e)=>G(n,e)},{id:"aadhaar-in",category:"AADHAAR",priority:76,presets:["gdpr","strict"],contextWindow:40,contextRegex:/\b(?:aadhaar|aadhar|uidai)\b/i,pattern:/\b[2-9]\d{3}[-\s]?\d{4}[-\s]?\d{4}\b/g,validate:n=>Y(n)},{id:"de-tax-id",category:"TAX_ID",priority:76,presets:le,contextWindow:45,contextRegex:/\b(?:steuer|tax|tin|idnr|identifikationsnummer)\b/i,pattern:/\b[1-9]\d{10}\b/g,validate:n=>j(n)},{id:"email",category:"EMAIL",priority:75,presets:v,pattern:/\b[A-Za-z0-9._%+-]{1,64}@(?:[A-Za-z0-9-]{1,63}\.)+[A-Za-z]{2,24}\b/g},{id:"phone",category:"PHONE",priority:65,presets:v,pattern:/(?:\+\d{1,3}[-.\s]?)?(?:\(\d{2,4}\)[-.\s]?|\b\d{3}[-.\s])\d{3,4}[-.\s]\d{4}\b|\+\d{1,3}[-.\s]?\d{2,4}[-.\s]?\d{3,4}[-.\s]?\d{3,4}\b/g,validate:n=>{let e=n.replace(/\D/g,"");return e.length>=10&&e.length<=15&&!/^(\d)\1+$/.test(e)}},{id:"ipv4",category:"IP_ADDRESS",priority:60,presets:v,pattern:/\b(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}\b/g,validate:n=>q(n)},{id:"ipv6",category:"IP_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b|\b(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\b/g},{id:"mac-address",category:"MAC_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\b/g},{id:"labeled-person-name",category:"PERSON",priority:55,presets:["hipaa","strict"],captureGroup:1,pattern:/\b(?:Patient(?:\s+Name)?|Dr\.|Doctor|Clinician|Provider|Mr\.|Mrs\.|Ms\.|Full\s+Name|Beneficiary)\s*[:.]?\s*([A-Z][a-z]{1,24}(?:\s+[A-Z]\.?)?(?:\s+[A-Z][a-z]{1,24}){1,2})/g},{id:"dob-or-clinical-date",category:"DATE",priority:52,presets:E,contextWindow:40,contextRegex:/\b(?:dob|birth|born|admit(?:ted)?|discharg(?:e|ed)|visit|encounter|date)\b/i,pattern:/\b(?:\d{4}-\d{2}-\d{2}|(?:0?[1-9]|1[0-2])[/-](?:0?[1-9]|[12]\d|3[01])[/-](?:19|20)\d{2})\b/g}];var ue=/^(?:password|passwd|pwd|passphrase|secret|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|authorization|cookie|set-cookie|x-api-key|client[_-]?secret|private[_-]?key|ssn|social[_-]?security(?:[_-]?number)?|cvv|cvc|pin|iban|dob|birth[_-]?date|mrn)$/i,de=/\[[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?\]|<[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?>/g;function ee(n){let e=n.toLowerCase();return e.includes("ssn")||e.includes("social")?"SSN":e.includes("iban")?"IBAN":e.includes("mrn")?"MRN":e.includes("dob")||e.includes("birth")?"DATE":e.includes("password")||e.includes("passwd")||e.includes("secret")||e==="cvv"||e==="cvc"||e==="pin"?"SECRET":e.includes("token")||e==="authorization"||e==="cookie"||e==="set-cookie"?"TOKEN":e.includes("key")?"API_KEY":"CUSTOM"}function fe(n){let e=n.preset??"default",r=n.rules?[...n.rules]:Q.filter(i=>i.presets.includes(e)),s=[...(n.customRules??[]).map(i=>({id:i.id,category:i.category??"CUSTOM",pattern:i.pattern,captureGroup:i.captureGroup,priority:i.priority??85,presets:["default","secrets","hipaa","gdpr","strict"],validate:i.validate})),...r];if(n.categories?.length){let i=new Set(n.categories);s=s.filter(o=>i.has(o.category));}if(n.excludeCategories?.length){let i=new Set(n.excludeCategories);s=s.filter(o=>!i.has(o.category));}return s}function pe(n,e){let r=[];for(let a of e){if(!a||a.length<4)continue;let s=0;for(;;){let i=n.indexOf(a,s);if(i===-1)break;r.push({id:"literal-secret",category:"SECRET",priority:99,start:i,end:i+a.length,value:a}),s=i+a.length;}}return r}function te(n,e,r){let a=[],s=r.allowlist?new Set(r.allowlist):void 0,i=r.redactPrivateIps??(r.preset==="strict"||r.preset==="hipaa");r.literals?.length&&a.push(...pe(n,r.literals));for(let t of e){let l=t.pattern.flags.includes("g")?t.pattern.flags:t.pattern.flags+"g",p=new RegExp(t.pattern.source,l),g;for(;(g=p.exec(n))!==null;){if(g[0].length===0){p.lastIndex+=1;continue}let c=g.index,u=g[0];if(t.captureGroup!==void 0&&g[t.captureGroup]!==void 0){let f=g[t.captureGroup],y=g[0].indexOf(f);y!==-1&&(c=g.index+y,u=f);}let d=c+u.length;if(!s?.has(u)&&!(t.id==="ipv4"&&!i&&J(u))){if(t.contextRegex){let f=t.contextWindow??40,y=n.slice(Math.max(0,c-f),c),x=n.slice(d,Math.min(n.length,d+f));if(!t.contextRegex.test(y)&&!t.contextRegex.test(x))continue}if(t.validate){let f={fullText:n,match:g,start:c,end:d,value:u};if(!t.validate(u,f))continue}a.push({id:t.id,category:t.category,priority:t.priority,start:c,end:d,value:u});}}}a.sort((t,l)=>{if(l.priority!==t.priority)return l.priority-t.priority;let p=l.end-l.start-(t.end-t.start);return p!==0?p:t.start-l.start});let o=[];for(let t of a){let l=false;for(let p of o)if(t.start<p.end&&t.end>p.start){l=true;break}l||o.push(t);}return o.sort((t,l)=>t.start-l.start),o}var I=class n{options;rules;tokenFormat;vaultKey;sensitiveKeyRe;forward=new Map;reverse=new Map;counters=new Map;reservedTokens=new Set;_version=0;constructor(e={}){this.options=e,this.rules=fe(e),this.tokenFormat=e.tokenFormat??"bracket",this.vaultKey=e.secret??z(16),this.sensitiveKeyRe=e.sensitiveKeys?.length?new RegExp(`^(?:${e.sensitiveKeys.map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$`,"i"):ue;}get version(){return this._version}fingerprint(e){return P(this.vaultKey,e,12)}reserveExistingTokens(e){let r=new RegExp(de.source,"g"),a;for(;(a=r.exec(e))!==null;)this.reverse.has(a[0])||this.reservedTokens.add(a[0]);}tokenize(e,r){let a=`${e}:${r}`,s=this.forward.get(a);if(s!==void 0)return s;if(this.tokenFormat==="mask")return (this.options.maskChar??"*").repeat(Math.min(Math.max(r.length,4),16));if(this.tokenFormat==="hash"){let t=P(this.vaultKey,a,8),l=`[${e}:${t}]`;return this.forward.set(a,l),this.reverse.set(l,{category:e,value:r}),this._version+=1,l}let i=this.counters.get(e)??0,o;do if(i+=1,this.tokenFormat==="angle")o=`<${e}_${i}>`;else if(this.tokenFormat==="signed"){let t=P(this.vaultKey,`${e}:${i}:${r}`,4);o=`[${e}_${i}#${t}]`;}else o=`[${e}_${i}]`;while(this.reservedTokens.has(o)||this.reverse.has(o));return this.counters.set(e,i),this.forward.set(a,o),this.reverse.set(o,{category:e,value:r}),this._version+=1,o}scan(e){return typeof e!="string"||e.length===0?[]:te(e,this.rules,this.options).map(a=>({id:a.id,category:a.category,start:a.start,end:a.end,token:`[${a.category}]`,length:a.value.length,fingerprint:Z(a.value,12)}))}redactText(e){if(typeof e!="string"||e.length===0)return {value:e,findings:[],count:0};this.reserveExistingTokens(e);let r=te(e,this.rules,this.options);if(r.length===0)return {value:e,findings:[],count:0};let a="",s=0,i=[];for(let o of r){a+=e.slice(s,o.start);let t=this.tokenize(o.category,o.value);a+=t,s=o.end,i.push({id:o.id,category:o.category,start:o.start,end:o.end,token:t,length:o.value.length,fingerprint:this.fingerprint(o.value)});}return a+=e.slice(s),{value:a,findings:i,count:i.length}}redactObject(e){let r=[],a=this.options.maxDepth??32,s=new WeakMap,i=(t,l,p)=>{if(t==null)return t;if(typeof t=="string"){if(p&&this.sensitiveKeyRe.test(p)&&t.length>0&&!this.reverse.has(t)){let u=ee(p),d=this.tokenize(u,t);return r.push({id:"sensitive-key",category:u,start:0,end:t.length,token:d,length:t.length,fingerprint:this.fingerprint(t)}),d}let c=this.redactText(t);return c.count>0&&r.push(...c.findings),c.value}if(typeof t!="object")return t;if(l>=a)return "[MAX_DEPTH_TRUNCATED]";if(s.has(t))return s.get(t);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t.source,t.flags);if(t instanceof URL){let c=new URL(t.toString());c.password&&(c.password=this.tokenize("SECRET",c.password));let u=[];c.searchParams.forEach((d,f)=>{u.push([f,d]);});for(let[d,f]of u)if(this.sensitiveKeyRe.test(d)&&f)c.searchParams.set(d,this.tokenize(ee(d),f));else {let y=this.redactText(f);y.count>0&&(r.push(...y.findings),c.searchParams.set(d,y.value));}return c}if(typeof Headers<"u"&&t instanceof Headers){let c=new Headers;return t.forEach((u,d)=>{c.set(d,i(u,l+1,d));}),c}if(t instanceof Error){let c={name:t.name,message:this.options.redactErrors!==false?i(t.message,l+1):t.message};t.stack!==void 0&&(c.stack=this.options.redactErrors!==false?i(t.stack,l+1):t.stack),"cause"in t&&t.cause!==void 0&&(c.cause=i(t.cause,l+1));for(let u of Object.keys(t))c[u]=i(t[u],l+1,u);return c}if(Array.isArray(t)){let c=[];s.set(t,c);for(let u=0;u<t.length;u++)c.push(i(t[u],l+1,p));return c}if(t instanceof Map){let c=new Map;s.set(t,c);for(let[u,d]of t.entries()){let f=typeof u=="string"?u:void 0;c.set(i(u,l+1),i(d,l+1,f));}return c}if(t instanceof Set){let c=new Set;s.set(t,c);for(let u of t.values())c.add(i(u,l+1));return c}let g={};s.set(t,g);for(let[c,u]of Object.entries(t))g[c]=i(u,l+1,c);return g};return {value:i(e,0),findings:r,count:r.length}}redact(e){return typeof e=="string"?this.redactText(e):this.redactObject(e)}restore(e){if(typeof e!="string"||e.length===0||this.reverse.size===0)return e;let a=Array.from(this.reverse.keys()).sort((i,o)=>o.length-i.length).map(i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),s=new RegExp(a.join("|"),"g");return e.replace(s,i=>this.reverse.get(i)?.value??i)}restoreObject(e){let r=new WeakMap,a=(s,i)=>{if(s==null)return s;if(typeof s=="string")return this.restore(s);if(typeof s!="object"||i>=32)return s;if(r.has(s))return r.get(s);if(Array.isArray(s)){let t=[];r.set(s,t);for(let l of s)t.push(a(l,i+1));return t}if(s instanceof Date||s instanceof RegExp||s instanceof URL)return s;let o={};r.set(s,o);for(let[t,l]of Object.entries(s))o[t]=a(l,i+1);return o};return a(e,0)}entries(){return Array.from(this.reverse.entries()).map(([e,r])=>({token:e,category:r.category,value:r.value}))}export(){let e={};for(let[r,a]of this.counters.entries())e[r]=a;return {version:1,tokenFormat:this.tokenFormat,counters:e,entries:this.entries()}}static fromJSON(e,r={}){let a=new n({...r,tokenFormat:e.tokenFormat});for(let[s,i]of Object.entries(e.counters))a.counters.set(s,i);for(let s of e.entries)a.forward.set(`${s.category}:${s.value}`,s.token),a.reverse.set(s.token,{category:s.category,value:s.value});return a._version+=1,a}clear(){this.forward.clear(),this.reverse.clear(),this.counters.clear(),this.reservedTokens.clear(),this._version+=1;}};function M(n){return new I({...n,tokenFormat:n.tokenFormat??n.logTokenFormat??"mask"})}function Re(n={}){let e=M(n);return {hooks:{logMethod(r,a){let s=r.map(i=>e.redact(i).value);return a.apply(this,s)}},serializers:{err(r){return e.redact(r).value},req(r){return e.redact(r).value},res(r){return e.redact(r).value}}}}function we(n={}){let e=M(n);return {transform(r){return e.redactObject(r).value}}}function Ee(n,e={}){return M(e).redactObject(n).value}function Te(n={}){let e=M(n),r=["log","info","warn","error","debug"],a=new Map;for(let s of r){let i=console[s].bind(console);a.set(s,i),console[s]=(...o)=>{i(...o.map(t=>e.redact(t).value));};}return ()=>{for(let[s,i]of a.entries())console[s]=i;}}exports.patchConsole=Te;exports.pinoRedactor=Re;exports.redactAttributes=Ee;exports.winstonFormat=we;
@@ -0,0 +1,36 @@
1
+ import { R as RedactOptions } from './types-DZbmtyhn.cjs';
2
+
3
+ interface LoggerRedactorOptions extends RedactOptions {
4
+ /** Use fixed masking instead of numbered vault tokens by default for logs ('mask' | 'hash' | 'bracket'). Default 'mask'. */
5
+ logTokenFormat?: 'mask' | 'hash' | 'bracket';
6
+ }
7
+ /**
8
+ * Drop-in configuration object for Pino (`pino(pinoRedactor())`).
9
+ * Scrubs all log arguments, nested objects, Error stacks/messages, and HTTP request headers.
10
+ */
11
+ declare function pinoRedactor(options?: LoggerRedactorOptions): {
12
+ hooks: {
13
+ logMethod(this: unknown, inputArgs: unknown[], method: (...args: unknown[]) => void): void;
14
+ };
15
+ serializers: {
16
+ err(err: unknown): unknown;
17
+ req(req: Record<string, unknown>): Record<string, unknown>;
18
+ res(res: Record<string, unknown>): Record<string, unknown>;
19
+ };
20
+ };
21
+ /**
22
+ * Drop-in Winston format compatible with `winston.format.combine(winstonFormat(), ...)`.
23
+ */
24
+ declare function winstonFormat(options?: LoggerRedactorOptions): {
25
+ transform(info: Record<string, unknown>): Record<string, unknown>;
26
+ };
27
+ /**
28
+ * Sanitizes OpenTelemetry span/metric attribute records.
29
+ */
30
+ declare function redactAttributes<T extends Record<string, unknown>>(attributes: T, options?: LoggerRedactorOptions): T;
31
+ /**
32
+ * Patches global `console.log/info/warn/error/debug` in-place; returns restore function.
33
+ */
34
+ declare function patchConsole(options?: LoggerRedactorOptions): () => void;
35
+
36
+ export { type LoggerRedactorOptions, patchConsole, pinoRedactor, redactAttributes, winstonFormat };
@@ -0,0 +1,36 @@
1
+ import { R as RedactOptions } from './types-DZbmtyhn.js';
2
+
3
+ interface LoggerRedactorOptions extends RedactOptions {
4
+ /** Use fixed masking instead of numbered vault tokens by default for logs ('mask' | 'hash' | 'bracket'). Default 'mask'. */
5
+ logTokenFormat?: 'mask' | 'hash' | 'bracket';
6
+ }
7
+ /**
8
+ * Drop-in configuration object for Pino (`pino(pinoRedactor())`).
9
+ * Scrubs all log arguments, nested objects, Error stacks/messages, and HTTP request headers.
10
+ */
11
+ declare function pinoRedactor(options?: LoggerRedactorOptions): {
12
+ hooks: {
13
+ logMethod(this: unknown, inputArgs: unknown[], method: (...args: unknown[]) => void): void;
14
+ };
15
+ serializers: {
16
+ err(err: unknown): unknown;
17
+ req(req: Record<string, unknown>): Record<string, unknown>;
18
+ res(res: Record<string, unknown>): Record<string, unknown>;
19
+ };
20
+ };
21
+ /**
22
+ * Drop-in Winston format compatible with `winston.format.combine(winstonFormat(), ...)`.
23
+ */
24
+ declare function winstonFormat(options?: LoggerRedactorOptions): {
25
+ transform(info: Record<string, unknown>): Record<string, unknown>;
26
+ };
27
+ /**
28
+ * Sanitizes OpenTelemetry span/metric attribute records.
29
+ */
30
+ declare function redactAttributes<T extends Record<string, unknown>>(attributes: T, options?: LoggerRedactorOptions): T;
31
+ /**
32
+ * Patches global `console.log/info/warn/error/debug` in-place; returns restore function.
33
+ */
34
+ declare function patchConsole(options?: LoggerRedactorOptions): () => void;
35
+
36
+ export { type LoggerRedactorOptions, patchConsole, pinoRedactor, redactAttributes, winstonFormat };
@@ -0,0 +1 @@
1
+ var se=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ie=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),N=new TextEncoder;function A(n,e){return n>>>e|n<<32-e}function C(n){let e=n.length*8,r=Math.ceil((n.length+9)/64)*64,a=new Uint8Array(r);a.set(n),a[n.length]=128;let s=new DataView(a.buffer),i=Math.floor(e/4294967296),o=e>>>0;s.setUint32(r-8,i,false),s.setUint32(r-4,o,false);let t=new Uint32Array(ie),l=new Uint32Array(64);for(let c=0;c<r;c+=64){for(let h=0;h<16;h++)l[h]=s.getUint32(c+h*4,false);for(let h=16;h<64;h++){let k=l[h-15],R=l[h-2],S=A(k,7)^A(k,18)^k>>>3,O=A(R,17)^A(R,19)^R>>>10;l[h]=l[h-16]+S+l[h-7]+O>>>0;}let u=t[0],d=t[1],f=t[2],y=t[3],x=t[4],T=t[5],_=t[6],D=t[7];for(let h=0;h<64;h++){let k=A(x,6)^A(x,11)^A(x,25),R=x&T^~x&_,S=D+k+R+se[h]+l[h]>>>0,O=A(u,2)^A(u,13)^A(u,22),re=u&d^u&f^d&f,ne=O+re>>>0;D=_,_=T,T=x,x=y+S>>>0,y=f,f=d,d=u,u=S+ne>>>0;}t[0]=t[0]+u>>>0,t[1]=t[1]+d>>>0,t[2]=t[2]+f>>>0,t[3]=t[3]+y>>>0,t[4]=t[4]+x>>>0,t[5]=t[5]+T>>>0,t[6]=t[6]+_>>>0,t[7]=t[7]+D>>>0;}let p=new Uint8Array(32),g=new DataView(p.buffer);for(let c=0;c<8;c++)g.setUint32(c*4,t[c],false);return p}function P(n,e,r=64){let a=N.encode(n),s=a.length>64?C(a):a,i=new Uint8Array(64);i.set(s);let o=new Uint8Array(64),t=new Uint8Array(64);for(let d=0;d<64;d++){let f=i[d];o[d]=f^92,t[d]=f^54;}let l=N.encode(e),p=new Uint8Array(64+l.length);p.set(t,0),p.set(l,64);let g=C(p),c=new Uint8Array(96);c.set(o,0),c.set(g,64);let u=C(c);return V(u).slice(0,r)}function Z(n,e=64){return V(C(N.encode(n))).slice(0,e)}function V(n){let e="";for(let r=0;r<n.length;r++)e+=n[r].toString(16).padStart(2,"0");return e}function z(n=8){let e=new Uint8Array(n);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(e);else for(let r=0;r<n;r++)e[r]=Math.floor(Math.random()*256);return V(e)}function m(n){return n.replace(/\D/g,"")}function F(n){let e=m(n);if(e.length<13||e.length>19||/^(\d)\1+$/.test(e))return false;let r=0,a=false;for(let s=e.length-1;s>=0;s--){let i=e.charCodeAt(s)-48;a&&(i*=2,i>9&&(i-=9)),r+=i,a=!a;}return r%10===0}function L(n){let e=m(n);if(!/^[12]\d{9}$/.test(e))return false;let r="80840"+e,a=0,s=false;for(let i=r.length-1;i>=0;i--){let o=r.charCodeAt(i)-48;s&&(o*=2,o>9&&(o-=9)),a+=o,s=!s;}return a%10===0}function U(n){let e=n.trim().toUpperCase();if(!/^[ABFGMPRX][A-Z9]\d{7}$/.test(e))return false;let r=o=>e.charCodeAt(2+o)-48,a=r(0)+r(2)+r(4),s=r(1)+r(3)+r(5);return (a+2*s)%10===r(6)}var w="ACDEFGHJKMNPQRTUVWXY",K="0123456789"+w;function $(n){let e=n.replace(/-/g,"").toUpperCase();if(e.length!==11)return false;let r=e.charCodeAt(0);return !(r<49||r>57||!w.includes(e[1])||!K.includes(e[2])||!/\d/.test(e[3])||!w.includes(e[4])||!K.includes(e[5])||!/\d/.test(e[6])||!w.includes(e[7])||!w.includes(e[8])||!/\d\d/.test(e.slice(9,11)))}var ae={AD:24,AE:23,AL:28,AT:20,AZ:28,BA:20,BE:16,BG:22,BH:22,BR:29,BY:28,CH:21,CR:22,CY:28,CZ:24,DE:22,DK:18,DO:28,EE:20,EG:29,ES:24,FI:18,FO:18,FR:27,GB:22,GE:22,GI:23,GL:18,GR:27,GT:28,HR:21,HU:28,IE:22,IL:23,IQ:23,IS:26,IT:27,JO:30,KW:30,KZ:20,LB:28,LC:32,LI:21,LT:20,LU:20,LV:21,MC:27,MD:24,ME:22,MK:19,MR:27,MT:31,MU:30,NL:18,NO:15,PK:24,PL:28,PS:29,PT:25,QA:29,RO:24,RS:22,SA:24,SE:24,SI:19,SK:24,SM:27,ST:25,SV:28,TL:23,TN:24,TR:26,UA:29,VA:22,VG:24,XK:20};function H(n){let e=n.replace(/[\s-]+/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(e))return false;let r=ae[e.slice(0,2)];if(r!==void 0&&e.length!==r)return false;let a=e.slice(4)+e.slice(0,4),s=0;for(let i=0;i<a.length;i++){let o=a.charCodeAt(i);if(o>=48&&o<=57)s=(s*10+(o-48))%97;else if(o>=65&&o<=90){let t=o-55;s=(s*100+t)%97;}else return false}return s===1}function B(n){let e=m(n);if(e.length!==10||/^(\d)\1+$/.test(e))return false;let r=0;for(let i=0;i<9;i++)r+=(e.charCodeAt(i)-48)*(10-i);let s=11-r%11;return s===11&&(s=0),s===10?false:s===e.charCodeAt(9)-48}function G(n,e){let r=n.trim(),a=/[-\s]/.test(r),s=m(r);if(s.length!==9)return false;let i=Number(s.slice(0,3)),o=Number(s.slice(3,5)),t=Number(s.slice(5,9));if(i===0||i===666||i>=900||o===0||t===0||/^(\d)\1+$/.test(s))return false;if(!a&&e){let l=e.fullText.slice(Math.max(0,e.start-36),e.start);return /\b(ssn|social[\s_-]?security|tin)\b/i.test(l)}return true}var oe=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],ce=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]];function Y(n){let e=m(n);if(!/^[2-9]\d{11}$/.test(e))return false;let r=0;for(let a=0;a<e.length;a++){let s=e.charCodeAt(e.length-1-a)-48;r=oe[r][ce[a%8][s]];}return r===0}function j(n){let e=m(n);if(!/^[1-9]\d{10}$/.test(e))return false;let r=new Array(10).fill(0);for(let t=0;t<10;t++)r[e.charCodeAt(t)-48]+=1;let a=r.filter(t=>t===2||t===3).length,s=Math.max(...r);if(a!==1||s>3)return false;let i=10;for(let t=0;t<10;t++){let l=(e.charCodeAt(t)-48+i)%10;l===0&&(l=10),i=l*2%11;}let o=11-i;return o===10&&(o=0),o===e.charCodeAt(10)-48}function W(n){let e=n.split(".");if(e.length!==3)return false;let r=e[0];if(!r.startsWith("eyJ"))return false;try{let a=r.replace(/-/g,"+").replace(/_/g,"/"),s=(4-a.length%4)%4,i=atob(a+"=".repeat(s));return i.startsWith("{")&&i.includes('"')}catch{return false}}function J(n){let e=n.split(".").map(Number);if(e.length!==4)return false;let[r,a]=e;return r===void 0||a===void 0?false:r===10||r===127||r===0||r===192&&a===168||r===172&&a>=16&&a<=31||r===169&&a===254}function q(n){let e=n.split(".");if(e.length!==4)return false;for(let r of e){if(r.length===0||r.length>1&&r.startsWith("0"))return false;let a=Number(r);if(!Number.isInteger(a)||a<0||a>255)return false}return true}function X(n){if(n.length===0)return 0;let e=new Map;for(let s=0;s<n.length;s++){let i=n.charCodeAt(s);e.set(i,(e.get(i)??0)+1);}let r=0,a=n.length;for(let s of e.values()){let i=s/a;r-=i*Math.log2(i);}return r}var b=["default","secrets","hipaa","gdpr","strict"],v=["default","hipaa","gdpr","strict"],E=["hipaa","strict"],le=["gdpr","strict"],Q=[{id:"pem-private-key",category:"PRIVATE_KEY",priority:100,presets:b,pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----[\s\S]{16,8192}?-----END (?:RSA |EC |DSA |OPENSSH |PGP |ENCRYPTED )?PRIVATE KEY-----/g},{id:"connection-uri-password",category:"CONNECTION_URI",priority:96,presets:b,captureGroup:1,pattern:/\b(?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis(?:s)?|amqp(?:s)?|mssql|clickhouse|cockroachdb):\/\/[^:\s/@]+:([^@\s/]{3,256})@[^\s"'<>]+/gi},{id:"anthropic-key",category:"API_KEY",priority:95,presets:b,pattern:/\bsk-ant-(?:api\d{2}|admin\d{2}|oat\d{2}|[a-z0-9]+)-[A-Za-z0-9_-]{24,}\b/g},{id:"openai-key",category:"API_KEY",priority:95,presets:b,pattern:/\bsk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{24,}\b|\bsk-[A-Za-z0-9]{16,}T3BlbkFJ[A-Za-z0-9]{16,}\b/g},{id:"github-token",category:"API_KEY",priority:95,presets:b,pattern:/\b(?:gh[pousr]_[A-Za-z0-9_]{36,}|github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{40,})\b/g},{id:"aws-access-key",category:"API_KEY",priority:94,presets:b,pattern:/\b(?:AKIA|ASIA|AROA|AIDA)[0-9A-Z]{16}\b/g},{id:"stripe-secret",category:"API_KEY",priority:94,presets:b,pattern:/\b(?:sk_live|rk_live|whsec)_[A-Za-z0-9]{20,}\b/g},{id:"google-api-key",category:"API_KEY",priority:93,presets:b,pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{id:"slack-token",category:"TOKEN",priority:93,presets:b,pattern:/\bxox[baprs]-[0-9A-Za-z-]{14,}\b|https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+/g},{id:"discord-webhook",category:"SECRET",priority:92,presets:b,pattern:/https:\/\/discord(?:app)?\.com\/api\/webhooks\/\d{16,22}\/[A-Za-z0-9_-]{40,}/g},{id:"provider-prefixed-keys",category:"API_KEY",priority:92,presets:b,pattern:/\b(?:hf_[A-Za-z0-9]{30,}|gsk_[A-Za-z0-9]{36,}|xai-[A-Za-z0-9]{36,}|pplx-[A-Za-z0-9]{36,}|sbp_[A-Za-z0-9]{36,}|sb_secret_[A-Za-z0-9_-]{24,}|re_[A-Za-z0-9_]{24,}|npm_[A-Za-z0-9]{36}|pypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}|SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43})\b/g},{id:"jwt-token",category:"JWT",priority:90,presets:b,pattern:/\beyJ[A-Za-z0-9_-]{6,}\.eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{8,}\b/g,validate:n=>W(n)},{id:"bearer-auth-header",category:"TOKEN",priority:88,presets:b,captureGroup:1,pattern:/\b(?:Authorization|Proxy-Authorization)\s*[:=]\s*["']?(?:Bearer|Basic|Token)\s+([A-Za-z0-9._~+/=-]{12,})["']?/gi},{id:"contextual-secret-assignment",category:"SECRET",priority:72,presets:b,captureGroup:1,pattern:/\b(?:api[_-]?key|secret[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|aws_secret_access_key|password|passwd|pwd|signing[_-]?secret)\b\s*[:=]\s*["']?([^\s"',;}{]{10,128})["']?/gi,validate:n=>!n.startsWith("[")&&!n.startsWith("<")&&X(n)>=2.8},{id:"medicare-mbi",category:"MBI",priority:84,presets:E,pattern:/\b[1-9][AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y][0-9AC-HJKMNP-RT-Y]-?\d[AC-HJKMNP-RT-Y]{2}\d{2}\b/gi,validate:n=>$(n)},{id:"us-dea",category:"DEA",priority:83,presets:E,pattern:/\b[ABFGMPRX][A-Z9]\d{7}\b/g,validate:n=>U(n)},{id:"us-npi",category:"NPI",priority:80,presets:E,contextWindow:40,contextRegex:/\b(?:npi|provider|prescriber|practitioner|physician)\b/i,pattern:/\b[12]\d{9}\b/g,validate:n=>L(n)},{id:"uk-nhs-number",category:"NHS",priority:80,presets:["hipaa","gdpr","strict"],contextWindow:40,contextRegex:/\b(?:nhs|patient|health|care|medical)\b/i,pattern:/\b\d{3}[-\s]?\d{3}[-\s]?\d{4}\b/g,validate:n=>B(n)},{id:"medical-record-number",category:"MRN",priority:78,presets:E,captureGroup:1,pattern:/\b(?:mrn|medical[\s_-]?record(?:[\s_-]?number)?|patient[\s_-]?id)\s*[:=#]?\s*([A-Z0-9-]{5,20})\b/gi},{id:"iban",category:"IBAN",priority:84,presets:v,pattern:/\b[A-Z]{2}\d{2}(?:[\s-]?[A-Z0-9]){11,30}\b/g,validate:n=>H(n)},{id:"credit-card",category:"CREDIT_CARD",priority:82,presets:v,pattern:/\b(?:\d[ -]?){13,18}\d\b/g,validate:n=>{let e=n.replace(/\D/g,"");return /^(?:4\d{12}(?:\d{3})?(?:\d{3})?|5[1-5]\d{14}|2(?:2[2-9]|[3-6]\d|7[01]|720)\d{12}|3[47]\d{13}|6(?:011|5\d\d)\d{12}|3(?:0[0-5]|[68]\d)\d{11}|(?:2131|1800|35\d{3})\d{11})$/.test(e)&&F(e)}},{id:"us-ssn",category:"SSN",priority:81,presets:v,pattern:/\b\d{3}[-\s]\d{2}[-\s]\d{4}\b|\b\d{9}\b/g,validate:(n,e)=>G(n,e)},{id:"aadhaar-in",category:"AADHAAR",priority:76,presets:["gdpr","strict"],contextWindow:40,contextRegex:/\b(?:aadhaar|aadhar|uidai)\b/i,pattern:/\b[2-9]\d{3}[-\s]?\d{4}[-\s]?\d{4}\b/g,validate:n=>Y(n)},{id:"de-tax-id",category:"TAX_ID",priority:76,presets:le,contextWindow:45,contextRegex:/\b(?:steuer|tax|tin|idnr|identifikationsnummer)\b/i,pattern:/\b[1-9]\d{10}\b/g,validate:n=>j(n)},{id:"email",category:"EMAIL",priority:75,presets:v,pattern:/\b[A-Za-z0-9._%+-]{1,64}@(?:[A-Za-z0-9-]{1,63}\.)+[A-Za-z]{2,24}\b/g},{id:"phone",category:"PHONE",priority:65,presets:v,pattern:/(?:\+\d{1,3}[-.\s]?)?(?:\(\d{2,4}\)[-.\s]?|\b\d{3}[-.\s])\d{3,4}[-.\s]\d{4}\b|\+\d{1,3}[-.\s]?\d{2,4}[-.\s]?\d{3,4}[-.\s]?\d{3,4}\b/g,validate:n=>{let e=n.replace(/\D/g,"");return e.length>=10&&e.length<=15&&!/^(\d)\1+$/.test(e)}},{id:"ipv4",category:"IP_ADDRESS",priority:60,presets:v,pattern:/\b(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}\b/g,validate:n=>q(n)},{id:"ipv6",category:"IP_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b|\b(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\b/g},{id:"mac-address",category:"MAC_ADDRESS",priority:58,presets:["hipaa","gdpr","strict"],pattern:/\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\b/g},{id:"labeled-person-name",category:"PERSON",priority:55,presets:["hipaa","strict"],captureGroup:1,pattern:/\b(?:Patient(?:\s+Name)?|Dr\.|Doctor|Clinician|Provider|Mr\.|Mrs\.|Ms\.|Full\s+Name|Beneficiary)\s*[:.]?\s*([A-Z][a-z]{1,24}(?:\s+[A-Z]\.?)?(?:\s+[A-Z][a-z]{1,24}){1,2})/g},{id:"dob-or-clinical-date",category:"DATE",priority:52,presets:E,contextWindow:40,contextRegex:/\b(?:dob|birth|born|admit(?:ted)?|discharg(?:e|ed)|visit|encounter|date)\b/i,pattern:/\b(?:\d{4}-\d{2}-\d{2}|(?:0?[1-9]|1[0-2])[/-](?:0?[1-9]|[12]\d|3[01])[/-](?:19|20)\d{2})\b/g}];var ue=/^(?:password|passwd|pwd|passphrase|secret|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|authorization|cookie|set-cookie|x-api-key|client[_-]?secret|private[_-]?key|ssn|social[_-]?security(?:[_-]?number)?|cvv|cvc|pin|iban|dob|birth[_-]?date|mrn)$/i,de=/\[[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?\]|<[A-Z_]+_\d+(?:#[a-f0-9]{4,8})?>/g;function ee(n){let e=n.toLowerCase();return e.includes("ssn")||e.includes("social")?"SSN":e.includes("iban")?"IBAN":e.includes("mrn")?"MRN":e.includes("dob")||e.includes("birth")?"DATE":e.includes("password")||e.includes("passwd")||e.includes("secret")||e==="cvv"||e==="cvc"||e==="pin"?"SECRET":e.includes("token")||e==="authorization"||e==="cookie"||e==="set-cookie"?"TOKEN":e.includes("key")?"API_KEY":"CUSTOM"}function fe(n){let e=n.preset??"default",r=n.rules?[...n.rules]:Q.filter(i=>i.presets.includes(e)),s=[...(n.customRules??[]).map(i=>({id:i.id,category:i.category??"CUSTOM",pattern:i.pattern,captureGroup:i.captureGroup,priority:i.priority??85,presets:["default","secrets","hipaa","gdpr","strict"],validate:i.validate})),...r];if(n.categories?.length){let i=new Set(n.categories);s=s.filter(o=>i.has(o.category));}if(n.excludeCategories?.length){let i=new Set(n.excludeCategories);s=s.filter(o=>!i.has(o.category));}return s}function pe(n,e){let r=[];for(let a of e){if(!a||a.length<4)continue;let s=0;for(;;){let i=n.indexOf(a,s);if(i===-1)break;r.push({id:"literal-secret",category:"SECRET",priority:99,start:i,end:i+a.length,value:a}),s=i+a.length;}}return r}function te(n,e,r){let a=[],s=r.allowlist?new Set(r.allowlist):void 0,i=r.redactPrivateIps??(r.preset==="strict"||r.preset==="hipaa");r.literals?.length&&a.push(...pe(n,r.literals));for(let t of e){let l=t.pattern.flags.includes("g")?t.pattern.flags:t.pattern.flags+"g",p=new RegExp(t.pattern.source,l),g;for(;(g=p.exec(n))!==null;){if(g[0].length===0){p.lastIndex+=1;continue}let c=g.index,u=g[0];if(t.captureGroup!==void 0&&g[t.captureGroup]!==void 0){let f=g[t.captureGroup],y=g[0].indexOf(f);y!==-1&&(c=g.index+y,u=f);}let d=c+u.length;if(!s?.has(u)&&!(t.id==="ipv4"&&!i&&J(u))){if(t.contextRegex){let f=t.contextWindow??40,y=n.slice(Math.max(0,c-f),c),x=n.slice(d,Math.min(n.length,d+f));if(!t.contextRegex.test(y)&&!t.contextRegex.test(x))continue}if(t.validate){let f={fullText:n,match:g,start:c,end:d,value:u};if(!t.validate(u,f))continue}a.push({id:t.id,category:t.category,priority:t.priority,start:c,end:d,value:u});}}}a.sort((t,l)=>{if(l.priority!==t.priority)return l.priority-t.priority;let p=l.end-l.start-(t.end-t.start);return p!==0?p:t.start-l.start});let o=[];for(let t of a){let l=false;for(let p of o)if(t.start<p.end&&t.end>p.start){l=true;break}l||o.push(t);}return o.sort((t,l)=>t.start-l.start),o}var I=class n{options;rules;tokenFormat;vaultKey;sensitiveKeyRe;forward=new Map;reverse=new Map;counters=new Map;reservedTokens=new Set;_version=0;constructor(e={}){this.options=e,this.rules=fe(e),this.tokenFormat=e.tokenFormat??"bracket",this.vaultKey=e.secret??z(16),this.sensitiveKeyRe=e.sensitiveKeys?.length?new RegExp(`^(?:${e.sensitiveKeys.map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$`,"i"):ue;}get version(){return this._version}fingerprint(e){return P(this.vaultKey,e,12)}reserveExistingTokens(e){let r=new RegExp(de.source,"g"),a;for(;(a=r.exec(e))!==null;)this.reverse.has(a[0])||this.reservedTokens.add(a[0]);}tokenize(e,r){let a=`${e}:${r}`,s=this.forward.get(a);if(s!==void 0)return s;if(this.tokenFormat==="mask")return (this.options.maskChar??"*").repeat(Math.min(Math.max(r.length,4),16));if(this.tokenFormat==="hash"){let t=P(this.vaultKey,a,8),l=`[${e}:${t}]`;return this.forward.set(a,l),this.reverse.set(l,{category:e,value:r}),this._version+=1,l}let i=this.counters.get(e)??0,o;do if(i+=1,this.tokenFormat==="angle")o=`<${e}_${i}>`;else if(this.tokenFormat==="signed"){let t=P(this.vaultKey,`${e}:${i}:${r}`,4);o=`[${e}_${i}#${t}]`;}else o=`[${e}_${i}]`;while(this.reservedTokens.has(o)||this.reverse.has(o));return this.counters.set(e,i),this.forward.set(a,o),this.reverse.set(o,{category:e,value:r}),this._version+=1,o}scan(e){return typeof e!="string"||e.length===0?[]:te(e,this.rules,this.options).map(a=>({id:a.id,category:a.category,start:a.start,end:a.end,token:`[${a.category}]`,length:a.value.length,fingerprint:Z(a.value,12)}))}redactText(e){if(typeof e!="string"||e.length===0)return {value:e,findings:[],count:0};this.reserveExistingTokens(e);let r=te(e,this.rules,this.options);if(r.length===0)return {value:e,findings:[],count:0};let a="",s=0,i=[];for(let o of r){a+=e.slice(s,o.start);let t=this.tokenize(o.category,o.value);a+=t,s=o.end,i.push({id:o.id,category:o.category,start:o.start,end:o.end,token:t,length:o.value.length,fingerprint:this.fingerprint(o.value)});}return a+=e.slice(s),{value:a,findings:i,count:i.length}}redactObject(e){let r=[],a=this.options.maxDepth??32,s=new WeakMap,i=(t,l,p)=>{if(t==null)return t;if(typeof t=="string"){if(p&&this.sensitiveKeyRe.test(p)&&t.length>0&&!this.reverse.has(t)){let u=ee(p),d=this.tokenize(u,t);return r.push({id:"sensitive-key",category:u,start:0,end:t.length,token:d,length:t.length,fingerprint:this.fingerprint(t)}),d}let c=this.redactText(t);return c.count>0&&r.push(...c.findings),c.value}if(typeof t!="object")return t;if(l>=a)return "[MAX_DEPTH_TRUNCATED]";if(s.has(t))return s.get(t);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t.source,t.flags);if(t instanceof URL){let c=new URL(t.toString());c.password&&(c.password=this.tokenize("SECRET",c.password));let u=[];c.searchParams.forEach((d,f)=>{u.push([f,d]);});for(let[d,f]of u)if(this.sensitiveKeyRe.test(d)&&f)c.searchParams.set(d,this.tokenize(ee(d),f));else {let y=this.redactText(f);y.count>0&&(r.push(...y.findings),c.searchParams.set(d,y.value));}return c}if(typeof Headers<"u"&&t instanceof Headers){let c=new Headers;return t.forEach((u,d)=>{c.set(d,i(u,l+1,d));}),c}if(t instanceof Error){let c={name:t.name,message:this.options.redactErrors!==false?i(t.message,l+1):t.message};t.stack!==void 0&&(c.stack=this.options.redactErrors!==false?i(t.stack,l+1):t.stack),"cause"in t&&t.cause!==void 0&&(c.cause=i(t.cause,l+1));for(let u of Object.keys(t))c[u]=i(t[u],l+1,u);return c}if(Array.isArray(t)){let c=[];s.set(t,c);for(let u=0;u<t.length;u++)c.push(i(t[u],l+1,p));return c}if(t instanceof Map){let c=new Map;s.set(t,c);for(let[u,d]of t.entries()){let f=typeof u=="string"?u:void 0;c.set(i(u,l+1),i(d,l+1,f));}return c}if(t instanceof Set){let c=new Set;s.set(t,c);for(let u of t.values())c.add(i(u,l+1));return c}let g={};s.set(t,g);for(let[c,u]of Object.entries(t))g[c]=i(u,l+1,c);return g};return {value:i(e,0),findings:r,count:r.length}}redact(e){return typeof e=="string"?this.redactText(e):this.redactObject(e)}restore(e){if(typeof e!="string"||e.length===0||this.reverse.size===0)return e;let a=Array.from(this.reverse.keys()).sort((i,o)=>o.length-i.length).map(i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),s=new RegExp(a.join("|"),"g");return e.replace(s,i=>this.reverse.get(i)?.value??i)}restoreObject(e){let r=new WeakMap,a=(s,i)=>{if(s==null)return s;if(typeof s=="string")return this.restore(s);if(typeof s!="object"||i>=32)return s;if(r.has(s))return r.get(s);if(Array.isArray(s)){let t=[];r.set(s,t);for(let l of s)t.push(a(l,i+1));return t}if(s instanceof Date||s instanceof RegExp||s instanceof URL)return s;let o={};r.set(s,o);for(let[t,l]of Object.entries(s))o[t]=a(l,i+1);return o};return a(e,0)}entries(){return Array.from(this.reverse.entries()).map(([e,r])=>({token:e,category:r.category,value:r.value}))}export(){let e={};for(let[r,a]of this.counters.entries())e[r]=a;return {version:1,tokenFormat:this.tokenFormat,counters:e,entries:this.entries()}}static fromJSON(e,r={}){let a=new n({...r,tokenFormat:e.tokenFormat});for(let[s,i]of Object.entries(e.counters))a.counters.set(s,i);for(let s of e.entries)a.forward.set(`${s.category}:${s.value}`,s.token),a.reverse.set(s.token,{category:s.category,value:s.value});return a._version+=1,a}clear(){this.forward.clear(),this.reverse.clear(),this.counters.clear(),this.reservedTokens.clear(),this._version+=1;}};function M(n){return new I({...n,tokenFormat:n.tokenFormat??n.logTokenFormat??"mask"})}function Re(n={}){let e=M(n);return {hooks:{logMethod(r,a){let s=r.map(i=>e.redact(i).value);return a.apply(this,s)}},serializers:{err(r){return e.redact(r).value},req(r){return e.redact(r).value},res(r){return e.redact(r).value}}}}function we(n={}){let e=M(n);return {transform(r){return e.redactObject(r).value}}}function Ee(n,e={}){return M(e).redactObject(n).value}function Te(n={}){let e=M(n),r=["log","info","warn","error","debug"],a=new Map;for(let s of r){let i=console[s].bind(console);a.set(s,i),console[s]=(...o)=>{i(...o.map(t=>e.redact(t).value));};}return ()=>{for(let[s,i]of a.entries())console[s]=i;}}export{Te as patchConsole,Re as pinoRedactor,Ee as redactAttributes,we as winstonFormat};