@visulima/email-verifier 1.0.2 → 1.0.4
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/CHANGELOG.md +4 -0
- package/dist/checks/character.js +1 -1
- package/dist/checks/mx.js +1 -1
- package/dist/checks/role.js +1 -1
- package/dist/checks/smtp.js +4 -4
- package/dist/checks/symbol.js +1 -1
- package/dist/checks/syntax.js +1 -1
- package/dist/checks/tag.js +1 -1
- package/dist/enrich/name.js +1 -1
- package/dist/enrich/provider.js +1 -1
- package/dist/enrich/typo.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/packem_shared/{InMemoryCache-DyBUMeKq.js → InMemoryCache-DhoO8sQL.js} +1 -1
- package/dist/packem_shared/extractDomain-C7YvhtJH.js +1 -0
- package/dist/score.js +1 -1
- package/dist/verify-email.d.ts +2 -2
- package/dist/verify-email.js +1 -1
- package/package.json +2 -2
- package/dist/packem_shared/extractDomain-CYJf1_0N.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
## @visulima/email-verifier [1.0.4](https://github.com/visulima/visulima/compare/%40visulima%2Femail-verifier%401.0.3...%40visulima%2Femail-verifier%401.0.4) (2026-08-18)
|
|
2
|
+
|
|
3
|
+
## @visulima/email-verifier [1.0.3](https://github.com/visulima/visulima/compare/%40visulima%2Femail-verifier%401.0.2...%40visulima%2Femail-verifier%401.0.3) (2026-08-17)
|
|
4
|
+
|
|
1
5
|
## @visulima/email-verifier [1.0.2](https://github.com/visulima/visulima/compare/%40visulima%2Femail-verifier%401.0.1...%40visulima%2Femail-verifier%401.0.2) (2026-08-02)
|
|
2
6
|
|
|
3
7
|
|
package/dist/checks/character.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitAddress as
|
|
1
|
+
import{splitAddress as a}from"../packem_shared/extractDomain-C7YvhtJH.js";const i=30,c=.6,g=7,h=/\d/g,l=/[bcdfghj-np-tvwxz]{7,}/,u=/(.)\1{4,}/,R=r=>{const e=a(r);if(!e)return{digitRatio:0,irregular:!0,length:0,reasons:["invalid-format"]};const{localPart:t}=e,n=[],o=(t.match(h)??[]).length,s=t.length===0?0:o/t.length;return t.length>i&&n.push("excessive-length"),s>=c&&t.length>4&&n.push("digit-heavy"),l.test(t)&&n.push(`consonant-run-${String(g)}+`),u.test(t)&&n.push("repeated-character"),{digitRatio:s,irregular:n.length>0,length:t.length,reasons:n}};export{R as analyzeCharacters,R as default};
|
package/dist/checks/mx.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire as f}from"node:module";let h;const v=e=>(h??=f(import.meta.url))(e),
|
|
1
|
+
import{createRequire as f}from"node:module";let h;const v=e=>(h??=f(import.meta.url))(e),o=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,g=e=>{if(typeof o<"u"&&o.versions&&o.versions.node){const[r,s]=o.versions.node.split(".").map(Number);if(r>22||r===22&&s>=3||r===20&&s>=16)return o.getBuiltinModule(e)}return v(e)},{resolveMx:_,resolve4:y,resolve6:E}=g("node:dns/promises"),R=new Set(["EAI_AGAIN","ECONNREFUSED","EREFUSED","ESERVFAIL","ETIMEDOUT","ETIMEOUT"]),p=e=>{const{code:r}=e??{};return r!==void 0&&R.has(r)},l=async e=>{try{if((await y(e)).length>0)return!0}catch{}try{return(await E(e)).length>0}catch{return!1}},u=e=>({domainResolves:!0,records:[{exchange:e,priority:0}],resolvedVia:"address",valid:!0}),m=async(e,r)=>{try{const c=(await _(e)).map(t=>({exchange:t.exchange,priority:t.priority}));return c.length>0?{domainResolves:!0,records:c.toSorted((t,a)=>t.priority-a.priority),resolvedVia:"mx",valid:!0}:r&&await l(e)?u(e):{domainResolves:!1,records:[],resolvedVia:"none",valid:!1}}catch(s){return r&&await l(e)?u(e):{deferred:p(s),domainResolves:!1,error:s instanceof Error?s.message:String(s),resolvedVia:"none",valid:!1}}},i=new Map,A=async(e,r={})=>{const{fallbackToAddress:s=!0}=r,c=r.ttl??36e5,t=`${e}:${String(s)}`;if(r.cache){const n=await r.cache.get(t);if(n!==void 0)return n}const a=i.get(t);if(a)return a;const d=(async()=>{const n=await m(e,s);return r.cache&&!n.deferred&&await r.cache.set(t,n,c),n})();i.set(t,d);try{return await d}finally{i.delete(t)}};export{A as checkMxRecords,A as default};
|
package/dist/checks/role.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitAddress as m}from"../packem_shared/extractDomain-
|
|
1
|
+
import{splitAddress as m}from"../packem_shared/extractDomain-C7YvhtJH.js";const p=new Set(["do-not-reply","do_not_reply","donotreply","no-reply","no_reply","noreply","notification","notifications","notify"]),i=new Set(["abuse","accounting","accounts","admin","administrator","all","billing","board","career","careers","ceo","cfo","compliance","contact","contacts","cto","customercare","customerservice","dev","developer","devnull","do-not-reply","do_not_reply","donotreply","enquiries","enquiry","everyone","feedback","finance","ftp","hello","help","helpdesk","hi","hostmaster","hr","info","information","inquiries","inquiry","investor","investors","it","jobs","legal","list","list-request","mail","mailer-daemon","mailerdaemon","majordomo","marketing","media","members","newsletter","no-reply","no_reply","noc","noreply","notification","notifications","notify","office","operations","order","orders","postmaster","press","privacy","purchasing","recruitment","register","registration","root","sales","secretary","security","service","services","shop","spam","staff","subscribe","support","sysadmin","team","tech","test","unsubscribe","usenet","uucp","webmaster","welcome","www"]),u=/[.\-_+]/,r=(o,e,t)=>e.has(o)||(t?.has(o)??!1),d=(o,e)=>{const t=m(o);if(!t)return!1;const{localPart:a}=t,c=a.split("+")[0],s=e?new Set([...e].map(n=>n.toLowerCase())):void 0;if(r(a,i,s)||r(c,i,s))return!0;const l=c.split(u).filter(Boolean);return l.length>1&&l.some(n=>r(n,i,s))},y=o=>{const e=m(o);if(!e)return!1;const t=e.localPart.split("+")[0];return r(e.localPart,p)||r(t,p)};export{p as NO_REPLY_PREFIXES,i as ROLE_ACCOUNT_PREFIXES,d as default,y as isNoReply,d as isRoleAccount};
|
package/dist/checks/smtp.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{createRequire as
|
|
1
|
+
import{createRequire as b}from"node:module";import{splitAddress as T}from"../packem_shared/extractDomain-C7YvhtJH.js";import{checkMxRecords as j}from"./mx.js";let _;const x=r=>(_??=b(import.meta.url))(r),h=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,L=r=>{if(typeof h<"u"&&h.versions&&h.versions.node){const[e,t]=h.versions.node.split(".").map(Number);if(e>22||e===22&&t>=3||e===20&&t>=16)return h.getBuiltinModule(r)}return x(r)},{Socket:C}=L("node:net"),E=/[\u0000-\u001F\u007F]/,M=/\b([245]\.\d{1,3}\.\d{1,3})\b/,P=/^(\d{3})(?: |$)/,$=/\r?\n/,R="abcdefghijklmnopqrstuvwxyz0123456789",A=(r=20)=>{let e="";for(let t=0;t<r;t+=1)e+=R[Math.floor(Math.random()*R.length)]??"";return e},S=async r=>new Promise(e=>{setTimeout(e,r)});class H{transcript="";buffer="";completed=[];failure;finished=!1;socket;waiter;constructor(e){this.socket=e,e.on("data",n=>{this.transcript+=n.toString(),this.buffer+=n.toString(),this.drain()});const t=n=>{this.finished=!0,this.failure=n??new Error("Connection closed by server"),this.completed.length===0&&this.waiter&&(this.waiter.reject(this.failure),this.waiter=void 0)};e.on("error",t),e.on("close",()=>{t()}),e.on("timeout",()=>{t(new Error("SMTP socket timeout")),e.destroy()})}async command(e){return this.transcript+=`${e}\r
|
|
2
2
|
`,this.socket.write(`${e}\r
|
|
3
3
|
`),this.readReply()}close(){try{this.socket.write(`QUIT\r
|
|
4
|
-
`)}catch{}this.socket.removeAllListeners(),this.socket.destroy()}async readReply(){if(this.completed.length>0)return this.completed.shift();if(this.finished)throw this.failure??new Error("Connection closed");return new Promise((e,t)=>{this.waiter={reject:t,resolve:e}})}drain(){const e=this.buffer.split(
|
|
5
|
-
`),l=
|
|
4
|
+
`)}catch{}this.socket.removeAllListeners(),this.socket.destroy()}async readReply(){if(this.completed.length>0)return this.completed.shift();if(this.finished)throw this.failure??new Error("Connection closed");return new Promise((e,t)=>{this.waiter={reject:t,resolve:e}})}drain(){const e=this.buffer.split($);this.buffer=e.pop()??"";let t=[];for(const n of e){t.push(n);const c=P.exec(n);if(c){const o=t.join(`
|
|
5
|
+
`),l=M.exec(o)?.[1];this.completed.push({code:Number.parseInt(c[1],10),enhanced:l,text:o}),t=[]}}if(t.length>0&&(this.buffer=`${t.join(`
|
|
6
6
|
`)}
|
|
7
|
-
${this.buffer}`),this.waiter&&this.completed.length>0){const{resolve:
|
|
7
|
+
${this.buffer}`),this.waiter&&this.completed.length>0){const{resolve:n}=this.waiter;this.waiter=void 0,n(this.completed.shift())}}}const I=r=>{const{code:e,enhanced:t}=r;return e>=200&&e<300?{code:e,enhancedCode:t,valid:!0}:e===452||e===552||t==="4.2.2"||t==="5.2.2"?{code:e,deferred:e===452,enhancedCode:t,mailboxFull:!0,valid:!1}:e>=400&&e<500?{code:e,deferred:!0,enhancedCode:t,valid:!1}:{code:e,enhancedCode:t,valid:!1}},O=async(r,e,t)=>new Promise((n,c)=>{const o=new C;o.setTimeout(t);const l=a=>{o.removeAllListeners(),o.destroy(),c(a)},i=()=>{l(new Error("SMTP connection timeout"))};o.once("error",l),o.once("timeout",i),o.connect(e,r,()=>{o.removeListener("error",l),o.removeListener("timeout",i),n(new H(o))})}),k=async(r,e,t,n)=>{const{catchAllProbes:c=1,port:o=25,timeout:l=5e3}=n,i=n.heloHost??e,a=n.fromEmail??`verify@${i}`;let d;try{d=await O(t.exchange,o,l);const m=await d.readReply();if(m.code!==220)return{connectionLevel:!0,deferred:!0,error:`Unexpected greeting: ${m.text}`,valid:!1};let s=await d.command(`EHLO ${i}`);if(s.code!==250&&(s=await d.command(`HELO ${i}`),s.code!==250))return{connectionLevel:!0,deferred:!0,error:`HELO rejected: ${s.text}`,valid:!1};const u=await d.command(`MAIL FROM:<${a}>`);if(u.code!==250)return{connectionLevel:!0,deferred:!0,error:`MAIL FROM rejected: ${u.text}`,valid:!1};const f=await d.command(`RCPT TO:<${r}>`),w=I(f);let p;if(w.valid&&c>0){p=!0;for(let g=0;g<c;g+=1){const y=await d.command(`RCPT TO:<${A()}@${e}>`);if(y.code<200||y.code>=300){p=!1;break}}}return{...w,acceptAll:p,smtpResponse:d.transcript}}finally{d?.close()}},N=async(r,e,t,n)=>{let c="SMTP verification did not complete",o;for(const l of t){let i;try{i=await k(r,e,l,n)}catch(a){c=a instanceof Error?a.message:String(a);continue}if(i.connectionLevel){o=i;continue}return i}if(o){const{connectionLevel:l,...i}=o;return i}return{deferred:!0,error:c,valid:!1}},F=r=>{if(r.heloHost!==void 0&&E.test(r.heloHost))return{error:"Invalid heloHost: control characters are not allowed",valid:!1};if(r.fromEmail!==void 0&&E.test(r.fromEmail))return{error:"Invalid fromEmail: control characters are not allowed",valid:!1}},v=new Map,B=async(r,e={})=>{const t=T(r);if(!t)return{error:"Invalid email format",valid:!1};const{domain:n}=t,c=F(e);if(c)return c;const{retries:o=1,retryDelay:l=5e3,ttl:i=36e5}=e,a=["smtp",t.address,e.fromEmail??"",String(e.port??25),e.heloHost??"",String(e.catchAllProbes??1),(e.mxRecords??[]).map(s=>s.exchange).join(",")].join("|");if(e.smtpCache){const s=await e.smtpCache.get(a);if(s!==void 0)return s}const d=v.get(a);if(d)return d;const m=(async()=>{let s=e.mxRecords;if(!s||s.length===0){const f=await j(n,{cache:e.cache,fallbackToAddress:!1});if(!f.valid||!f.records||f.records.length===0)return{error:f.error??"No MX records found",mxRecords:f.records,valid:!1};s=f.records}let u={error:"SMTP verification did not complete",valid:!1};for(let f=0;f<=o&&(u=await N(t.address,n,s,e),!(!u.deferred||f===o));f+=1)await S(l);return u={...u,mxRecords:s},e.smtpCache&&!u.deferred&&await e.smtpCache.set(a,u,i),u})();v.set(a,m);try{return await m}finally{v.delete(a)}};export{B as default,B as verifySmtp};
|
package/dist/checks/symbol.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitAddress as
|
|
1
|
+
import{splitAddress as r}from"../packem_shared/extractDomain-C7YvhtJH.js";const c=new RegExp("\\P{ASCII}","u"),l=new RegExp("\\p{S}","u"),a=[["Latin",new RegExp("\\p{Script=Latin}","u")],["Cyrillic",new RegExp("\\p{Script=Cyrillic}","u")],["Greek",new RegExp("\\p{Script=Greek}","u")],["Han",new RegExp("\\p{Script=Han}","u")],["Hiragana",new RegExp("\\p{Script=Hiragana}","u")],["Katakana",new RegExp("\\p{Script=Katakana}","u")],["Hangul",new RegExp("\\p{Script=Hangul}","u")],["Arabic",new RegExp("\\p{Script=Arabic}","u")],["Hebrew",new RegExp("\\p{Script=Hebrew}","u")]],E=n=>{const e=r(n);if(!e)return{hasMixedScripts:!1,hasNonAscii:!1,hasSymbols:!1,scripts:[]};const s=`${e.localPart}${e.domain}`,p=a.filter(([,t])=>t.test(s)).map(([t])=>t);return{hasMixedScripts:[e.localPart,...e.domain.split(".").filter(Boolean)].some(t=>a.filter(([,i])=>i.test(t)).length>1),hasNonAscii:c.test(e.address),hasSymbols:l.test(s),scripts:p}};export{E as analyzeSymbols,E as default};
|
package/dist/checks/syntax.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitAddress as
|
|
1
|
+
import{splitAddress as i}from"../packem_shared/extractDomain-C7YvhtJH.js";const f=/^[^\s@]+@[^\s@][^\s.@]*\.[^\s@]+$/,a=/^[\p{L}\p{N}-]+$/u,u=t=>{if(!t||typeof t!="string"||!f.test(t)||t.includes(".."))return!1;const e=i(t);if(!e)return!1;const{domain:s,localPart:n}=e;return n.startsWith(".")||n.endsWith(".")||!s.includes(".")||s.startsWith("-")||s.endsWith("-")?!1:s.split(".").every(r=>r.length>0&&!r.startsWith("-")&&!r.endsWith("-")&&a.test(r))};export{u as default,u as validateSyntax};
|
package/dist/checks/tag.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitAddress as c}from"../packem_shared/extractDomain-
|
|
1
|
+
import{splitAddress as c}from"../packem_shared/extractDomain-C7YvhtJH.js";const l=new Set(["fastmail.com","fastmail.fm","yahoo.co.uk","yahoo.com"]),i=o=>{const e=c(o);if(!e)return{baseLocalPart:"",hasTag:!1};const{domain:r,localPart:a}=e,s=a.indexOf("+");if(s>0)return{baseLocalPart:a.slice(0,s),hasTag:!0,separator:"+",tag:a.slice(s+1)};if(l.has(r)){const t=a.indexOf("-");if(t>0)return{baseLocalPart:a.slice(0,t),hasTag:!0,separator:"-",tag:a.slice(t+1)}}return{baseLocalPart:a,hasTag:!1}};export{i as default,i as detectTag};
|
package/dist/enrich/name.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitAddress as
|
|
1
|
+
import{splitAddress as m}from"../packem_shared/extractDomain-C7YvhtJH.js";const f=/[.\-_]/,u=/^[a-z]+(?:[A-Z][a-z]+)+$/,d=/\d+$/,A=/\d/,r=e=>e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),E=e=>e.replaceAll(/([a-z])([A-Z])/g,"$1 $2").split(" "),_=e=>{const l=m(e);if(!l)return{confidence:"none"};const a=e.trim().lastIndexOf("@"),t=(a>0?e.trim().slice(0,a):l.localPart).split("+")[0].replace(d,"");if(t.length===0)return{confidence:"none"};let s,c;if(f.test(t))s=t.split(f).filter(Boolean),c="high";else if(u.test(t))s=E(t),c="medium";else return A.test(t)?{confidence:"none"}:{confidence:"low",firstName:r(t),fullName:r(t)};const n=s.map(p=>p.replace(d,"")).filter(Boolean);if(n.length===0)return{confidence:"none"};const o=r(n[0]);if(n.length===1)return{confidence:"low",firstName:o,fullName:o};const i=r(n.at(-1));return{confidence:c,firstName:o,fullName:`${o} ${i}`,lastName:i}};export{_ as default,_ as parseName};
|
package/dist/enrich/provider.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{classifyMxRecords as t}from"@visulima/email-provider-mx";import{classifyMx as
|
|
1
|
+
import{classifyMxRecords as t}from"@visulima/email-provider-mx";import{classifyMx as u,classifyMxRecords as h,isSecureEmailGateway as p}from"@visulima/email-provider-mx";import{checkMxRecords as o}from"../checks/mx.js";import{extractDomain as i}from"../packem_shared/extractDomain-C7YvhtJH.js";const n=async(s,r={})=>{const a=i(s);if(!a)return{isSecureEmailGateway:!1,mxRecords:[]};const e=(await o(a,{cache:r.cache,fallbackToAddress:!1,ttl:r.ttl})).records??[];if(e.length===0)return{isSecureEmailGateway:!1,mxRecords:e};const c=t(e);return{isSecureEmailGateway:c?.type==="seg",mxRecords:e,provider:c}};export{u as classifyMx,h as classifyMxRecords,n as default,n as enrichProvider,p as isSecureEmailGateway};
|
package/dist/enrich/typo.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitAddress as
|
|
1
|
+
import{splitAddress as g}from"../packem_shared/extractDomain-C7YvhtJH.js";const h=["aol.com","fastmail.com","gmail.com","googlemail.com","hotmail.com","hotmail.co.uk","icloud.com","live.com","mail.com","me.com","msn.com","outlook.com","proton.me","protonmail.com","yahoo.com","yahoo.co.uk","ymail.com","zoho.com"],L=["aol","fastmail","gmail","googlemail","hotmail","icloud","live","mail","me","msn","outlook","proton","protonmail","yahoo","ymail","zoho"],f=["co.uk","com","de","edu","fr","gov","info","io","me","net","org"],v=5,D=(n,o,e)=>{for(let t=0;t<v;t+=1){if(e+t<n.length&&n[e+t]===o[e])return{offset1:t,offset2:0};if(e+t<o.length&&n[e]===o[e+t])return{offset1:0,offset2:t}}return{offset1:0,offset2:0}},p=(n,o)=>{if(n.length===0)return o.length;if(o.length===0)return n.length;let e=0,t=0,l=0,i=0;for(;e+t<n.length&&e+l<o.length;)n[e+t]===o[e+l]?i+=1:{offset1:t,offset2:l}=D(n,o,e),e+=1;return(n.length+o.length)/2-i},r=(n,o,e)=>{let t=Number.POSITIVE_INFINITY,l;for(const i of o){if(n===i)return n;const s=p(n,i);s<t&&(t=s,l=i)}return t<=e?l:void 0},T=n=>{const o=n.split(".");return o.length>=3&&f.includes(o.slice(-2).join("."))?{secondLevel:o.slice(0,-2).join("."),topLevel:o.slice(-2).join(".")}:{secondLevel:o.slice(0,-1).join("."),topLevel:o.at(-1)??""}},E=(n,o={})=>{const e=n.toLowerCase().trim(),t=o.domains??h,l=o.secondLevelDomains??L,i=o.topLevelDomains??f;if(t.includes(e))return;const s=r(e,t,o.domainThreshold??2);if(s&&s!==e)return s;const{secondLevel:c,topLevel:m}=T(e);if(!c||!m)return;const d=r(c,l,o.secondLevelThreshold??2)??c,u=r(m,i,o.topLevelThreshold??2)??m,a=`${d}.${u}`;return a===e?void 0:a},A=(n,o={})=>{const e=g(n);if(!e)return;const t=E(e.domain,o);if(t)return{domain:t,full:`${e.localPart}@${t}`}};export{A as default,p as sift3Distance,E as suggestDomain,A as suggestEmailTypo};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
export { type CharacterResult, analyzeCharacters } from "./checks/character.js";
|
|
2
|
-
export { type DisposableEmailOptions, areDisposableEmails, isDisposableDomain, isDisposableEmail } from '@visulima/disposable-email-domains';
|
|
3
|
-
export { type FreeEmailOptions, areFreeEmails, isFreeDomain, isFreeEmail } from '@visulima/free-email-domains';
|
|
4
2
|
export { type C as Cache, I as InMemoryCache, type a as InMemoryCacheOptions, type M as MxCheckOptions, type b as MxCheckResult, type c as MxRecord, type d as MxResolution, e as checkMxRecords } from "./packem_shared/mx.d-HxIDdxvR.js";
|
|
5
3
|
export { NO_REPLY_PREFIXES, ROLE_ACCOUNT_PREFIXES, isNoReply, default as isRoleAccount } from "./checks/role.js";
|
|
6
4
|
export { type SmtpVerificationOptions, type SmtpVerificationResult, default as verifySmtp } from "./checks/smtp.js";
|
|
@@ -12,6 +10,8 @@ export { type ProviderDetails, type ProviderEnrichOptions, default as enrichProv
|
|
|
12
10
|
export { type TypoOptions, type TypoSuggestion, sift3Distance, suggestDomain, default as suggestEmailTypo } from "./enrich/typo.js";
|
|
13
11
|
export { D as DEFAULT_WEIGHTS, type a as DomainReport, type E as EmailVerificationReport, type S as ScoreInput, type b as ScoreResult, type c as ScoreWeights, type V as VerificationState, s as scoreReport } from "./packem_shared/score.d-a6cl6fPu.js";
|
|
14
12
|
export { type VerifyEmailOptions, default as verifyEmail } from "./verify-email.js";
|
|
13
|
+
export { type DisposableEmailOptions, areDisposableEmails, isDisposableDomain, isDisposableEmail } from '@visulima/disposable-email-domains';
|
|
14
|
+
export { type FreeEmailOptions, areFreeEmails, isFreeDomain, isFreeEmail } from '@visulima/free-email-domains';
|
|
15
15
|
export { type MxProviderInfo, classifyMx, classifyMxRecords, isSecureEmailGateway } from '@visulima/email-provider-mx';
|
|
16
16
|
/**
|
|
17
17
|
* The split parts of an email address.
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{analyzeCharacters as a}from"./checks/character.js";import{checkMxRecords as s}from"./checks/mx.js";import{NO_REPLY_PREFIXES as m,ROLE_ACCOUNT_PREFIXES as f,isNoReply as i,default as l}from"./checks/role.js";import{default as x}from"./checks/smtp.js";import{analyzeSymbols as d}from"./checks/symbol.js";import{default as u}from"./checks/syntax.js";import{default as n}from"./checks/tag.js";import{default as R}from"./enrich/name.js";import{default as F}from"./enrich/provider.js";import{sift3Distance as T,suggestDomain as _,default as b}from"./enrich/typo.js";import{extractDomain as v,splitAddress as A}from"./packem_shared/extractDomain-
|
|
1
|
+
import{analyzeCharacters as a}from"./checks/character.js";import{checkMxRecords as s}from"./checks/mx.js";import{NO_REPLY_PREFIXES as m,ROLE_ACCOUNT_PREFIXES as f,isNoReply as i,default as l}from"./checks/role.js";import{default as x}from"./checks/smtp.js";import{analyzeSymbols as d}from"./checks/symbol.js";import{default as u}from"./checks/syntax.js";import{default as n}from"./checks/tag.js";import{default as R}from"./enrich/name.js";import{default as F}from"./enrich/provider.js";import{sift3Distance as T,suggestDomain as _,default as b}from"./enrich/typo.js";import{extractDomain as v,splitAddress as A}from"./packem_shared/extractDomain-C7YvhtJH.js";import{InMemoryCache as I}from"./packem_shared/InMemoryCache-DhoO8sQL.js";import{DEFAULT_WEIGHTS as N,default as P}from"./score.js";import{default as O}from"./verify-email.js";import{areDisposableEmails as G,isDisposableDomain as U,isDisposableEmail as X}from"@visulima/disposable-email-domains";import{areFreeEmails as w,isFreeDomain as H,isFreeEmail as W}from"@visulima/free-email-domains";import{classifyMx as j,classifyMxRecords as q,isSecureEmailGateway as B}from"@visulima/email-provider-mx";export{N as DEFAULT_WEIGHTS,I as InMemoryCache,m as NO_REPLY_PREFIXES,f as ROLE_ACCOUNT_PREFIXES,a as analyzeCharacters,d as analyzeSymbols,G as areDisposableEmails,w as areFreeEmails,s as checkMxRecords,j as classifyMx,q as classifyMxRecords,n as detectTag,F as enrichProvider,v as extractDomain,U as isDisposableDomain,X as isDisposableEmail,H as isFreeDomain,W as isFreeEmail,i as isNoReply,l as isRoleAccount,B as isSecureEmailGateway,R as parseName,P as scoreReport,T as sift3Distance,A as splitAddress,_ as suggestDomain,b as suggestEmailTypo,u as validateSyntax,O as verifyEmail,x as verifySmtp};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{LRUCache as a}from"lru-cache";class
|
|
1
|
+
import{LRUCache as a}from"lru-cache";class n{cache;constructor(c={}){const{max:e=500,ttl:t=36e5}=c;this.cache=new a({max:e,ttl:t})}clear=async()=>{this.cache.clear()};delete=async c=>{this.cache.delete(c)};get=async c=>this.cache.get(c);set=async(c,e,t)=>{this.cache.set(c,e,{ttl:t})}}export{n as InMemoryCache};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=/\.$/,i=/\s/,c=n=>{if(!n||typeof n!="string")return;const t=n.trim().toLowerCase();if(i.test(t))return;const o=t.lastIndexOf("@");if(o<=0||o===t.length-1)return;const r=t.slice(0,o),s=t.slice(o+1).replace(e,"");if(!(!r||!s))return{address:t,domain:s,localPart:r}},d=n=>c(n)?.domain;export{d as extractDomain,c as splitAddress};
|
package/dist/score.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const t={acceptAll:25,character:15,deferred:15,didYouMean:20,disposable:60,free:5,knownProvider:5,mailboxFull:40,mixedScripts:30,noReply:25,role:25,smtpUnverified:10,symbol:10},
|
|
1
|
+
const t={acceptAll:25,character:15,deferred:15,didYouMean:20,disposable:60,free:5,knownProvider:5,mailboxFull:40,mixedScripts:30,noReply:25,role:25,smtpUnverified:10,symbol:10},d=e=>Math.max(0,Math.min(100,Math.round(e))),i=e=>e.smtp!==void 0&&!e.smtp.valid&&!e.smtp.deferred&&!e.mailboxFull&&(e.smtp.code??0)>=500,n=e=>e.disposable?{reason:"disposable_mailbox",state:"risky"}:e.mailboxFull?{reason:"mailbox_full",state:"risky"}:e.acceptAll?{reason:"accept_all",state:"risky"}:e.noReply?{reason:"no_reply",state:"risky"}:e.role?{reason:"role_account",state:"risky"}:{reason:"accepted_email",state:"deliverable"},c=e=>i(e)?{reason:"rejected_email",state:"undeliverable"}:e.smtp?.valid?n(e):e.mailboxFull?{reason:"mailbox_full",state:"risky"}:e.smtp?.deferred?{reason:"greylisted",state:"unknown"}:{reason:"unknown",state:"unknown"},f=e=>e.syntaxValid?e.domain.resolvedVia!=="unchecked"&&!e.domain.valid?e.domain.deferred?{reason:"dns_error",state:"unknown"}:{reason:e.domain.resolvedVia==="none"?"no_mx_records":"invalid_domain",state:"undeliverable"}:e.smtp?c(e):e.disposable?{reason:"disposable_mailbox",state:"risky"}:{reason:"smtp_not_checked",state:"unknown"}:{reason:"invalid_syntax",state:"undeliverable"},m=(e,l={})=>{const a={...t,...l},{reason:o,state:s}=f(e);if(s==="undeliverable")return{reason:o,score:0,state:s};let r=100;return e.smtp?.valid!==!0&&(r-=a.smtpUnverified),e.deferred&&(r-=a.deferred),e.disposable&&(r-=a.disposable),e.acceptAll&&(r-=a.acceptAll),e.mailboxFull&&(r-=a.mailboxFull),e.role&&(r-=a.role),e.noReply&&(r-=a.noReply),e.free&&(r-=a.free),e.character.irregular&&(r-=a.character),e.symbol.hasMixedScripts?r-=a.mixedScripts:e.symbol.hasSymbols&&(r-=a.symbol),e.didYouMean&&(r-=a.didYouMean),e.provider&&(r+=a.knownProvider),{reason:o,score:d(r),state:s}};export{t as DEFAULT_WEIGHTS,m as default,m as scoreReport};
|
package/dist/verify-email.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { DisposableEmailOptions } from '@visulima/disposable-email-domains';
|
|
2
|
-
import { FreeEmailOptions } from '@visulima/free-email-domains';
|
|
3
1
|
import { b as MxCheckResult, C as Cache } from "./packem_shared/mx.d-HxIDdxvR.js";
|
|
4
2
|
import { SmtpVerificationOptions } from "./checks/smtp.js";
|
|
5
3
|
import { TypoOptions } from "./enrich/typo.js";
|
|
6
4
|
import { c as ScoreWeights, E as EmailVerificationReport } from "./packem_shared/score.d-a6cl6fPu.js";
|
|
7
5
|
export type { V as VerificationState } from "./packem_shared/score.d-a6cl6fPu.js";
|
|
6
|
+
import { DisposableEmailOptions } from '@visulima/disposable-email-domains';
|
|
7
|
+
import { FreeEmailOptions } from '@visulima/free-email-domains';
|
|
8
8
|
import "./checks/character.js";
|
|
9
9
|
import "./checks/symbol.js";
|
|
10
10
|
import "./checks/tag.js";
|
package/dist/verify-email.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{analyzeCharacters as
|
|
1
|
+
import{analyzeCharacters as x}from"./checks/character.js";import{checkMxRecords as v}from"./checks/mx.js";import b,{isNoReply as g}from"./checks/role.js";import k from"./checks/smtp.js";import{analyzeSymbols as R}from"./checks/symbol.js";import V from"./checks/syntax.js";import w from"./checks/tag.js";import C from"./enrich/name.js";import E from"./enrich/typo.js";import{splitAddress as A}from"./packem_shared/extractDomain-C7YvhtJH.js";import n from"./score.js";import{classifyMxRecords as F}from"@visulima/email-provider-mx";import{isFreeEmail as S}from"@visulima/free-email-domains";import{isDisposableEmail as z}from"@visulima/disposable-email-domains";const p=(e,r)=>({character:x(e),didYouMean:E(e,r.typo)?.full,disposable:z(e,r.disposable),free:S(e,r.free),name:C(e),noReply:g(e),role:b(e,r.roleCustomPrefixes),symbol:R(e),tag:w(e)}),K=async(e,r={})=>{const{checkSmtp:y=!0,offline:u=!1}=r,s=A(e),d=s?.address??(typeof e=="string"?e.trim().toLowerCase():"");if(!V(s?.address??e)||!s){const m={...p(d,r),acceptAll:!1,deferred:!1,domain:{records:[],resolvedVia:"unchecked",valid:!1},email:d,mailboxFull:!1,secureEmailGateway:!1,syntaxValid:!1};return{...m,...n(m,r.weights)}}const h=p(s.address,r);let c={records:[],resolvedVia:"unchecked",valid:!1},o,t,f=!1;if(!u){const a=await v(s.domain,{cache:r.cache});c={deferred:a.deferred,records:a.records??[],resolvedVia:a.resolvedVia,valid:a.valid};const l=a.records??[];a.valid&&l.length>0&&(t=F(l),f=t?.type==="seg",y&&(o=await k(s.address,{cache:r.cache,...r.smtp,mxRecords:l})))}const i={...h,acceptAll:o?.acceptAll??!1,deferred:o?.deferred??!1,domain:c,email:s.address,mailboxFull:o?.mailboxFull??!1,provider:t,secureEmailGateway:f,smtp:o,syntaxValid:!0};return{...i,...n(i,r.weights)}};export{K as default,K as verifyEmail};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/email-verifier",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Mailer-free email address verification and enrichment: syntax, MX/SMTP probing, disposable/free/role detection, catch-all, provider & secure-email-gateway classification, typo suggestions, and a 0–100 quality score.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"accept-all",
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"@visulima/disposable-email-domains": "1.1.0",
|
|
118
118
|
"@visulima/email-provider-mx": "1.0.1",
|
|
119
119
|
"@visulima/free-email-domains": "1.0.1",
|
|
120
|
-
"lru-cache": "11.5.
|
|
120
|
+
"lru-cache": "11.5.2"
|
|
121
121
|
},
|
|
122
122
|
"engines": {
|
|
123
123
|
"node": "^22.14.0 || >=24.10.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const a=/\.$/,i=/\s/,o=s=>{if(!s||typeof s!="string")return;const e=s.trim().toLowerCase();if(i.test(e))return;const t=e.lastIndexOf("@");if(t<=0||t===e.length-1)return;const r=e.slice(0,t),n=e.slice(t+1).replace(a,"");if(!(!r||!n))return{address:e,domain:n,localPart:r}},c=s=>o(s)?.domain;export{c as extractDomain,o as splitAddress};
|