{"_id":"@bernierllc/email-sender","_rev":"23-9467a2411c66c9b8da9bbbe8b1cfa311","name":"@bernierllc/email-sender","dist-tags":{"latest":"5.10.0"},"versions":{"0.2.0":{"name":"@bernierllc/email-sender","version":"0.2.0","keywords":["email","sender","smtp","sendgrid","ses","mailgun","postmark","provider","typescript"],"author":{"name":"Bernier LLC"},"license":"ISC","_id":"@bernierllc/email-sender@0.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"48a6315093449bc0fdc644acfeb787355566e2e3","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-0.2.0.tgz","fileCount":39,"integrity":"sha512-FmX8m+SdCGVsFXr07jCejdOmvPuqkdozRY8fT2QFOtk1RBQi0nbG9DiY1H6cBc1gGJ96rZwQqZJI/scwCxZ8iA==","signatures":[{"sig":"MEYCIQDT3nc/znFwKEvqVnHLReSA9UGmG7bjpLHIskvVzROLQQIhALnHiRVGtq+i3H40TZeGYQ7rlBnGdeP9cnwtBMDjlke1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185833},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"722a9d7cc125381918f49fa43680e3ba811b2425","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"A core utility for basic email sending with provider-agnostic interface","directories":{},"_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_0.2.0_1753745209010_0.7314201752331304","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bernierllc/email-sender","version":"0.2.2","keywords":["email","sender","smtp","sendgrid","ses","mailgun","postmark","provider","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@0.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"cba94e23e8dfd1e889d90010f21affd9b0b434b1","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-0.2.2.tgz","fileCount":39,"integrity":"sha512-/zNlSOO5rLPl5PtZZTQzmovC0DA57DSJFEfxrZchAm9Bye0ZAFlBaCSmqjz4wzxCz8+MtdRIcQxsE42e2cAgYA==","signatures":[{"sig":"MEUCIQCFiMycGQWqYC4j0Ba3YaME3/iDpoYXFAHoCELSsL46zAIgR2wMWOJLWPtD49YcBViOv8ISi2XaWwncwfmriau+MdY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185834},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"8c293d5c7b3ffd34a3e853d24b70549003e9670e","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"A core utility for basic email sending with provider-agnostic interface","directories":{},"_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_0.2.2_1754241913503_0.511666648050076","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@bernierllc/email-sender","version":"0.2.4","keywords":["email","sender","smtp","sendgrid","ses","mailgun","postmark","provider","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@0.2.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"833d8c6694f03a3cc5e6cb8b69776a3784fbd003","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-0.2.4.tgz","fileCount":39,"integrity":"sha512-usoQ/rDm1pH/Jh+B5I4n8Kg/0JtUcNnUdq5x10OJWNowfCwq0/X7wy6rIUaIWCLUKbs+iVMhp0+D/8a0NnyEGg==","signatures":[{"sig":"MEQCIFFvAHP5oLDsyONsRlUFXGWZAYx3j/hfAtnDuBrMDujDAiBtleVj0HlhuSyonF206e4WcM2Q84X2Xt1Prewy2GcBgA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185834},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"3aa57eeec5eb204b45bb76dc0754b85639af5db4","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"A core utility for basic email sending with provider-agnostic interface","directories":{},"_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_0.2.4_1756844809611_0.08930495607594313","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@bernierllc/email-sender","version":"2.0.2","keywords":["email","sender","smtp","sendgrid","ses","mailgun","postmark","provider","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@2.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"1e108b80c8130f57172f90bc36273ebfffda8020","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-2.0.2.tgz","fileCount":39,"integrity":"sha512-bpbkJPd1FrW2HEaFZ12MtLUv+YVRYAzWqSpop8rur/+M5cquV25RaK9DwUF2b4K/959rVFi5mwr2jrckjGJgrQ==","signatures":[{"sig":"MEUCIQC8Isf1qxVQPDwFLXD56zhhabJZXzkQhn1sljAYrkGMDQIgSa4QH7XAPfGFxZiRtNyVvFEFilFSKKeyThb0Hyxx51w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187788},"main":"dist/index.js","_from":"file:bernierllc-email-sender-2.0.2.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/8748760a77573a78aed7aa231586e9fd/bernierllc-email-sender-2.0.2.tgz","_integrity":"sha512-bpbkJPd1FrW2HEaFZ12MtLUv+YVRYAzWqSpop8rur/+M5cquV25RaK9DwUF2b4K/959rVFi5mwr2jrckjGJgrQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.6.0","description":"A core utility for basic email sending with provider-agnostic interface","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_2.0.2_1762042963374_0.5395874640654559","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"@bernierllc/email-sender","version":"3.0.3","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@3.0.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"fdd2fe1ca5f889ed19cd72522f74a0f2f8de24ff","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-3.0.3.tgz","fileCount":75,"integrity":"sha512-v8mc2m3NmD5mjz6TX+bVkZi8Q35mY6zr2q7WCENXzuIO1/PfoKQ5yXXRn8HdV84jI2lV4OcIMm/rRuSOEZS9iQ==","signatures":[{"sig":"MEUCIHzRO95iJGs2pQZl/sV7NwLrMNbwXxeFRtGC+xPDB/CJAiEAzIfT+c6kPITuJqTJ29LwTdm5ngRVQwfWrVXrcmpnQ2E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":270913},"main":"dist/index.js","_from":"file:bernierllc-email-sender-3.0.3.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/21f8df2f81eb53e613aef7bf3f56b045/bernierllc-email-sender-3.0.3.tgz","_integrity":"sha512-v8mc2m3NmD5mjz6TX+bVkZi8Q35mY6zr2q7WCENXzuIO1/PfoKQ5yXXRn8HdV84jI2lV4OcIMm/rRuSOEZS9iQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.6.0","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_3.0.3_1762108934239_0.6205966342239873","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"@bernierllc/email-sender","version":"3.0.5","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@3.0.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"ec6c1cfe2a11a50415ee950b470eda6064ace956","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-3.0.5.tgz","fileCount":79,"integrity":"sha512-HUrt3hrIvAZlFp1jE2km0ZAZbHPGcTihlR+sX3nBzI4Oln83UiWVTlCfSCU+5XSXA7JCbsgK4k9/bG6vivUESQ==","signatures":[{"sig":"MEUCIB9+C6KGj4BJhx06j6CTkdlg8lnXi0EMmYhXvt5s/sViAiEA/GRxlpDgTykGSSiS3eGY8r7lktjlOAI5wTFWSI0Ed7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287082},"main":"dist/index.js","_from":"file:bernierllc-email-sender-3.0.5.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/4584f1cd38f74ca5cd0b7f3984f83be3/bernierllc-email-sender-3.0.5.tgz","_integrity":"sha512-HUrt3hrIvAZlFp1jE2km0ZAZbHPGcTihlR+sX3nBzI4Oln83UiWVTlCfSCU+5XSXA7JCbsgK4k9/bG6vivUESQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.7.0","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_3.0.5_1766283484667_0.6866604374914196","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@bernierllc/email-sender","version":"3.1.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@3.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"345622c1c751552b6562683ee9fae4407fec550e","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-3.1.0.tgz","fileCount":83,"integrity":"sha512-ikr0bmpyglwZgnRRT3gNxtFEJeHpaa80t+uQ2cArMcT0yMJ6hpHhIc1qonJKDnEHqlC2TQg1byk+UxwSiYpsrw==","signatures":[{"sig":"MEQCIFHiAI9KE15JIo2NCtdkxDbyVrhNW9Y0l/nLeapnPOXEAiATDHVk1VJh5HhWYjrDsaP7FuYoxN9tTE/1KNx7DDVH5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":317584},"main":"dist/index.js","_from":"file:bernierllc-email-sender-3.1.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/tmp/d6b524fbade4d75ab60de677da665397/bernierllc-email-sender-3.1.0.tgz","_integrity":"sha512-ikr0bmpyglwZgnRRT3gNxtFEJeHpaa80t+uQ2cArMcT0yMJ6hpHhIc1qonJKDnEHqlC2TQg1byk+UxwSiYpsrw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.7.0","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_3.1.0_1766454403349_0.7411161040747178","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@bernierllc/email-sender","version":"5.0.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"383c2b74ad436ed50398cfc881cbc128e7eaab99","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.0.0.tgz","fileCount":83,"integrity":"sha512-TpDKhhpjre2RNRmQvlHKOdmTayRcE09Y1X/sISugASPGXJPPdpDVBTf1cVn0k6beU5xHi8brzcQPetCszL1p5A==","signatures":[{"sig":"MEUCIQDx0qcKHMOSMwTJ6Ik1s9Q+BjjCoHVJISFt2k/fM5S5hQIgW915iXuSDMbpGZKWZ+izWwj3T7g/wNxR7/gzSo8uZpA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":317642},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.0.0_1767642301682_0.42804373555255393","host":"s3://npm-registry-packages-npm-production"}},"5.1.1":{"name":"@bernierllc/email-sender","version":"5.1.1","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"c40c15b29e28207935b1e3829ab9ab411dea5028","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.1.1.tgz","fileCount":83,"integrity":"sha512-2nmrlWL6W5NaAFbQiaPQmG/dHoQLNIJk8oYmlJQc+DlpPgv6KDjW9VD6IMBWVOm46HIucO48CgPLO/m40CcEAA==","signatures":[{"sig":"MEUCIQDvUSaFWRZsPYt/PLW2da9iw/8x7jtUcU/4jbs8vklfQgIgPula0xmLg3wQ+cNE5hx+PktLkTCkwM+ZNcKhure/cqU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340711},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.1.1.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/Users/mattbernier/projects/tools/packages/core/email-sender/bernierllc-email-sender-5.1.1.tgz","_integrity":"sha512-2nmrlWL6W5NaAFbQiaPQmG/dHoQLNIJk8oYmlJQc+DlpPgv6KDjW9VD6IMBWVOm46HIucO48CgPLO/m40CcEAA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.6.2","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.1.1_1772563549517_0.4355656739087874","host":"s3://npm-registry-packages-npm-production"}},"5.2.0":{"name":"@bernierllc/email-sender","version":"5.2.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"7d36fc837a03580b64978ddb0c22a2a3fe081df6","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.2.0.tgz","fileCount":91,"integrity":"sha512-OVaqvlgNEuWw1PRO0N+dfjYTdPBTZlkuKpMP/48gjvas1W7Ajz4HsJ2q5oXXxwNi6Rnutd9zvAfrFJjm8Ej4Mw==","signatures":[{"sig":"MEUCIFpo607oDWEpZBvJKG1M58cabtcph8NcX37abZvbj1pNAiEA2txjKuj7nmOxu94Ja9bEM5+lVmeuXdLc4bUfXC154Sw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":380308},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.2.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/tmp/0f2d7bf9a4807496bb1e0f22db240c77/bernierllc-email-sender-5.2.0.tgz","_integrity":"sha512-OVaqvlgNEuWw1PRO0N+dfjYTdPBTZlkuKpMP/48gjvas1W7Ajz4HsJ2q5oXXxwNi6Rnutd9zvAfrFJjm8Ej4Mw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.2.0_1773081180719_0.8273544714206644","host":"s3://npm-registry-packages-npm-production"}},"5.2.1":{"name":"@bernierllc/email-sender","version":"5.2.1","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"6008e8aab2d10cb265f6594b237a2ff691a2e7ec","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.2.1.tgz","fileCount":91,"integrity":"sha512-nMeSVlhjtusyJ/pLDMLBuGpJTQzMEdLLU5HNbDNiBfDPB0MXJ100nOzroGzjbGUiJgcjxtseIytxhesiGY34hg==","signatures":[{"sig":"MEUCIFv5+VnghUtU2FF4hxr++efWBf11CnaTnhFsphuD1nwRAiEAzWZD/PVCcJW73RwtKYyujnGQcABoV4RsBwznWIBE3Rk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":393106},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.2.1.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/home/runner/work/tools/tools/packages/core/email-sender/bernierllc-email-sender-5.2.1.tgz","_integrity":"sha512-nMeSVlhjtusyJ/pLDMLBuGpJTQzMEdLLU5HNbDNiBfDPB0MXJ100nOzroGzjbGUiJgcjxtseIytxhesiGY34hg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.1","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.2.1_1773869720472_0.7206272271831373","host":"s3://npm-registry-packages-npm-production"}},"5.3.0":{"name":"@bernierllc/email-sender","version":"5.3.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"038083a6be4a18ef27bd38d9bb1a196708c8623e","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.3.0.tgz","fileCount":103,"integrity":"sha512-aT3oV3bd2le3HZrXe7NdUx+v97N+9PdgeHbAUMkuA/jWHSP0Ft35CaTbrq2AnpPuva/aYA/e40lxq8e8xqY23g==","signatures":[{"sig":"MEUCIQDbU1qpTJnV5ORBPYKpCNuAWviQRJXuv8mcuMq60C9uXgIgAdgbpvYYqTw7BnSxVR1yEXCvDOZ0EllJpr5SVFa2m4k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550326},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.3.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/home/runner/work/tools/tools/packages/core/email-sender/bernierllc-email-sender-5.3.0.tgz","_integrity":"sha512-aT3oV3bd2le3HZrXe7NdUx+v97N+9PdgeHbAUMkuA/jWHSP0Ft35CaTbrq2AnpPuva/aYA/e40lxq8e8xqY23g==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.12.0","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0","@bernierllc/email-sender-manager":"1.3.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.3.0_1774131056788_0.2086003701299215","host":"s3://npm-registry-packages-npm-production"}},"5.4.0":{"name":"@bernierllc/email-sender","version":"5.4.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"b230c11b7fea9a05163e80584994a4401eb1c827","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.4.0.tgz","fileCount":103,"integrity":"sha512-eHLrkS9+4ZgR3t7msWhkg2MN+H3GvQs6Iv7zSIm+52jDcR5Xy/UUIV9nyUqg+FgM/9/v9rqlFdulG/GRn66mKA==","signatures":[{"sig":"MEUCIQD1tWknQ9b58a2nJvcdMptH0VjpKRS0MlNTdCbwsSBXPAIgOQ9/QElZck5ovWOuhgD4OZlWdAy8Vzoip1tNGTifEZs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550326},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.4.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/home/runner/work/tools/tools/packages/core/email-sender/bernierllc-email-sender-5.4.0.tgz","_integrity":"sha512-eHLrkS9+4ZgR3t7msWhkg2MN+H3GvQs6Iv7zSIm+52jDcR5Xy/UUIV9nyUqg+FgM/9/v9rqlFdulG/GRn66mKA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0","@bernierllc/email-sender-manager":"1.5.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.4.0_1779241138936_0.07510884074428925","host":"s3://npm-registry-packages-npm-production"}},"5.5.0":{"name":"@bernierllc/email-sender","version":"5.5.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"a5d639e2c69ad7d3238783cec353eec7f4a0c0dd","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.5.0.tgz","fileCount":103,"integrity":"sha512-H5hnJ/RptTins5rtbdbsaGXTgSPzOk+UO3797MbaxwFtbCvJmdcZBtz7fvi+Lr4Te8hl32H+7wv+W/B0qkZ0bg==","signatures":[{"sig":"MEUCIHKdYm2fBf/7ixMXi1ipB+Z6x3Fa+QsSUCY43UmaJ6zDAiEAxSwKHUsEytX6/uARg8DF07IIKgVOBBADXb30HM+JNf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550326},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.5.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/home/runner/work/tools/tools/packages/core/email-sender/bernierllc-email-sender-5.5.0.tgz","_integrity":"sha512-H5hnJ/RptTins5rtbdbsaGXTgSPzOk+UO3797MbaxwFtbCvJmdcZBtz7fvi+Lr4Te8hl32H+7wv+W/B0qkZ0bg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0","@bernierllc/email-sender-manager":"1.6.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.5.0_1779249883788_0.6577728744003684","host":"s3://npm-registry-packages-npm-production"}},"5.7.0":{"name":"@bernierllc/email-sender","version":"5.7.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.7.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"3b16144162b2cf1d82aaa96d47e791cde1f0aa9c","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.7.0.tgz","fileCount":103,"integrity":"sha512-uZuhQ4G0+RjE7+yW0aiSteMvBncAf+PIOUhBDkzOIHi9w9ZgEuh23pioEZYpnYQhW0L7EuFW7QslO6pfeRMDKQ==","signatures":[{"sig":"MEUCIEdSKwS8FGx76+RmODfo4698xMLevYFZ3aid1+U/vubgAiEAqvvTCp08teM3ASAx/X0yHaNcUkUmbPBoQ+qHG6hZT74=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":551802},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.7.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/home/runner/work/tools/tools/packages/core/email-sender/bernierllc-email-sender-5.7.0.tgz","_integrity":"sha512-uZuhQ4G0+RjE7+yW0aiSteMvBncAf+PIOUhBDkzOIHi9w9ZgEuh23pioEZYpnYQhW0L7EuFW7QslO6pfeRMDKQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0","@bernierllc/email-sender-manager":"1.6.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.7.0_1779251923961_0.6786917117740887","host":"s3://npm-registry-packages-npm-production"}},"5.8.0":{"name":"@bernierllc/email-sender","version":"5.8.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.8.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"5c3fc96f7cff8727535113308799cd59453712c0","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.8.0.tgz","fileCount":103,"integrity":"sha512-ov0JSQxQ/AJ7gaga5XoXQoGsO0pI27eEPWsd4nPNX/etT2OCLIaiIBOh3QeIaI6Iv4YEUF0kRr83W1xLxZd2nA==","signatures":[{"sig":"MEUCIGi16/qer0zn2gUGvxb7DUoK3E/xPk+7EaDw0A18VackAiEAjLdqp6icJQw2dkjwJH6BoZVGwfkxHGiBn/myc9sE3Ew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":553569},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.8.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/home/runner/work/tools/tools/packages/core/email-sender/bernierllc-email-sender-5.8.0.tgz","_integrity":"sha512-ov0JSQxQ/AJ7gaga5XoXQoGsO0pI27eEPWsd4nPNX/etT2OCLIaiIBOh3QeIaI6Iv4YEUF0kRr83W1xLxZd2nA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"12.0.2","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0","@bernierllc/email-sender-manager":"1.6.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.8.0_1788112327936_0.20453176708349452","host":"s3://npm-registry-packages-npm-production"}},"5.9.0":{"name":"@bernierllc/email-sender","version":"5.9.0","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/email-sender@5.9.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"34334595a761fca59a66b0cb4b459efd4efedda4","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.9.0.tgz","fileCount":103,"integrity":"sha512-AuwPZva9NcwdvcEj75YnqdRAaImg3SLg1+a90uOhmWeZczYdZP88QqYn8NgaMVbRIjbr/hkIE4gJmUwZVMxdHA==","signatures":[{"sig":"MEYCIQD13n0UVQcOtWfvqC7cOWVZR2Ll3qwyLx9sCFArxX/UwAIhAIIULkncfJyjb8FT5JLzd2B5XxLGBm784kb8vWUTe3b5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDQardMYBODVVb112yAac3XsQT5qC3bTu+FQzEQ/g+pMAiEAnOEFlj6UdsSBTAt2IqFsNuEGKvmzs5kDTF7igEpEMI8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550906},"main":"dist/index.js","_from":"file:bernierllc-email-sender-5.9.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"_resolved":"/home/runner/work/tools/tools/packages/core/email-sender/bernierllc-email-sender-5.9.0.tgz","_integrity":"sha512-AuwPZva9NcwdvcEj75YnqdRAaImg3SLg1+a90uOhmWeZczYdZP88QqYn8NgaMVbRIjbr/hkIE4gJmUwZVMxdHA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"12.1.0","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0","@bernierllc/email-sender-manager":"1.6.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"tmp":"tmp/email-sender_5.9.0_1790709136353_0.747791262645821","host":"s3://npm-registry-packages-npm-production"}},"5.10.0":{"_id":"@bernierllc/email-sender@5.10.0","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"b87dff14797393585aebf90b00099c9f236ead97","tarball":"https://registry.npmjs.org/@bernierllc/email-sender/-/email-sender-5.10.0.tgz","fileCount":103,"integrity":"sha512-l1IArKXaIOBv7tgj5txhT5IyEXj93o+tS7YA4OiJX8te5JHMakdr7ELshRNNTKqPFbhSRRMAhrYqYfMS4qoM0w==","signatures":[{"sig":"MEUCIFYG6Ojj6lwQntrnWHbj/XcL+RoknfEQlW7fGn6u+kCFAiEAxyJbllXXuO5xpcld5G6Q6XtG59mEwaWEbrdX9ZFWfD0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIES8DIx1W6XgDUoTo/jxd8kDrB+Jg2XXzYP5bhJtq4FKAiEAvqTwZpwy61fHLFAtkZ/zyIzVIAFZAPFes274DzMkFH4="}],"unpackedSize":552941},"main":"dist/index.js","name":"@bernierllc/email-sender","_from":"file:bernierllc-email-sender-5.10.0.tgz","types":"dist/index.d.ts","author":{"name":"Bernier LLC"},"engines":{"node":">=18.0.0"},"license":"MIT","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"version":"5.10.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"56d656cd-eb9e-4025-80b5-3fce97c8fabf"}},"homepage":"https://github.com/bernier-llc/tools#readme","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"_resolved":"/home/runner/work/tools/tools/packages/core/email-sender/bernierllc-email-sender-5.10.0.tgz","_integrity":"sha512-l1IArKXaIOBv7tgj5txhT5IyEXj93o+tS7YA4OiJX8te5JHMakdr7ELshRNNTKqPFbhSRRMAhrYqYfMS4qoM0w==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"12.2.0","description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","nodemailer":"^6.9.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/nodemailer":"^6.4.0","@bernierllc/email-sender-manager":"1.6.0"},"peerDependencies":{"aws-sdk":"^2.1000.0","nodemailer":"^6.9.0","@sendgrid/mail":"^8.1.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/email-sender_5.10.0_1790902293362_0.30605599335430234"}}},"time":{"created":"2025-07-28T23:26:48.547Z","modified":"2026-10-02T00:51:33.634Z","0.2.0":"2025-07-28T23:26:49.170Z","0.2.2":"2025-08-03T17:25:13.723Z","0.2.4":"2025-09-02T20:26:49.801Z","2.0.2":"2025-11-02T00:22:43.632Z","3.0.3":"2025-11-02T18:42:14.434Z","3.0.5":"2025-12-21T02:18:04.827Z","3.1.0":"2025-12-23T01:46:43.525Z","5.0.0":"2026-01-05T19:45:01.853Z","5.1.1":"2026-03-03T18:45:49.716Z","5.2.0":"2026-03-09T18:33:00.916Z","5.2.1":"2026-03-18T21:35:20.631Z","5.3.0":"2026-03-21T22:10:56.926Z","5.4.0":"2026-05-20T01:38:59.086Z","5.5.0":"2026-05-20T04:04:43.989Z","5.7.0":"2026-05-20T04:38:44.136Z","5.8.0":"2026-08-30T17:52:08.109Z","5.9.0":"2026-09-29T19:12:16.523Z","5.10.0":"2026-10-02T00:51:33.463Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"MIT","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["email","sender","smtp","sendgrid","sendgrid-templates","verified-senders","ses","mailgun","postmark","provider","rate-limiting","template-management","typescript"],"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"description":"Email sending with provider-agnostic interface and SendGrid advanced features (templates, verified senders, rate limiting)","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/email-sender\n\nA core utility for basic email sending with provider-agnostic interface.\n\n## Features\n\n- **Provider-Agnostic**: Support for multiple email providers (SMTP, SendGrid, SES, Mailgun, Postmark)\n- **Staging Email Safety**: Prevent accidental email sends in non-production environments\n- **TypeScript**: Full TypeScript support with strict typing\n- **Validation**: Comprehensive email and configuration validation\n- **Attachments**: Support for file attachments\n- **Batch Sending**: Send multiple emails efficiently\n- **Error Handling**: Robust error handling and reporting\n- **Testing**: Comprehensive test coverage\n\n## Installation\n\n```bash\nnpm install @bernierllc/email-sender\n```\n\n**Note**: This package uses peer dependencies. You must install them separately:\n\n```bash\n# For SMTP provider\nnpm install nodemailer\n\n# For AWS SES provider\nnpm install aws-sdk\n```\n\n## Quick Start\n\n### Basic Usage\n\n```typescript\nimport { EmailSender } from '@bernierllc/email-sender';\n\n// Configure SMTP provider\nconst config = {\n  provider: 'smtp' as const,\n  host: 'smtp.gmail.com',\n  port: 587,\n  secure: false,\n  username: 'your-email@gmail.com',\n  password: 'your-app-password',\n  fromEmail: 'noreply@yourdomain.com',\n  fromName: 'Your App',\n};\n\n// Create email sender\nconst emailSender = new EmailSender(config);\n\n// Send an email\nconst result = await emailSender.sendEmail({\n  toEmail: 'recipient@example.com',\n  toName: 'John Doe',\n  subject: 'Welcome to our app!',\n  htmlContent: '<h1>Welcome!</h1><p>Thank you for joining us.</p>',\n  textContent: 'Welcome! Thank you for joining us.',\n});\n\nif (result.success) {\n  console.log('Email sent successfully:', result.messageId);\n} else {\n  console.error('Failed to send email:', result.errorMessage);\n}\n```\n\n### SendGrid Configuration\n\n```typescript\nimport { EmailSender } from '@bernierllc/email-sender';\n\nconst config = {\n  provider: 'sendgrid' as const,\n  apiKey: 'your-sendgrid-api-key',\n  fromEmail: 'noreply@yourdomain.com',\n  fromName: 'Your App',\n  // Optional: point every SendGrid call (mail send, templates, senders) at\n  // another host, e.g. a local mock in tests. Give the bare origin; a\n  // trailing `/v3` is also accepted. Defaults to https://api.sendgrid.com.\n  endpoint: process.env.SENDGRID_API_BASE_URL,\n};\n\nconst emailSender = new EmailSender(config);\n```\n\n### AWS SES Configuration\n\n```typescript\nimport { EmailSender } from '@bernierllc/email-sender';\n\nconst config = {\n  provider: 'ses' as const,\n  apiKey: 'your-aws-access-key',\n  secretKey: 'your-aws-secret-key',\n  region: 'us-east-1',\n  fromEmail: 'noreply@yourdomain.com',\n  fromName: 'Your App',\n  sandbox: false, // Set to true if in SES sandbox mode\n};\n\nconst emailSender = new EmailSender(config);\n```\n\n### Mailgun Configuration\n\n```typescript\nimport { EmailSender } from '@bernierllc/email-sender';\n\nconst config = {\n  provider: 'mailgun' as const,\n  apiKey: 'your-mailgun-api-key',\n  domain: 'yourdomain.com',\n  region: 'us', // or 'eu' for European region\n  fromEmail: 'noreply@yourdomain.com',\n  fromName: 'Your App',\n};\n\nconst emailSender = new EmailSender(config);\n```\n\n### Postmark Configuration\n\n```typescript\nimport { EmailSender } from '@bernierllc/email-sender';\n\nconst config = {\n  provider: 'postmark' as const,\n  apiKey: 'your-postmark-api-key',\n  accountToken: 'your-postmark-account-token', // Optional, for template operations\n  fromEmail: 'noreply@yourdomain.com',\n  fromName: 'Your App',\n};\n\nconst emailSender = new EmailSender(config);\n```\n\n## API Reference\n\n### EmailSender\n\nThe main class for sending emails.\n\n#### Constructor\n\n```typescript\nnew EmailSender(config: EmailProviderConfig)\n```\n\n#### Methods\n\n##### `sendEmail(email: EmailMessage): Promise<SendResult>`\n\nSend a single email.\n\n```typescript\nconst result = await emailSender.sendEmail({\n  toEmail: 'recipient@example.com',\n  subject: 'Test Email',\n  htmlContent: '<h1>Hello</h1>',\n});\n```\n\n##### `sendBatch(emails: EmailMessage[]): Promise<SendResult[]>`\n\nSend multiple emails in a batch.\n\n```typescript\nconst results = await emailSender.sendBatch([\n  { toEmail: 'user1@example.com', subject: 'Email 1', htmlContent: '<h1>Email 1</h1>' },\n  { toEmail: 'user2@example.com', subject: 'Email 2', htmlContent: '<h1>Email 2</h1>' },\n]);\n```\n\n##### `validateConfiguration(): EmailValidationResult`\n\nValidate the provider configuration.\n\n```typescript\nconst validation = emailSender.validateConfiguration();\nif (!validation.isValid) {\n  console.error('Configuration errors:', validation.errors);\n}\n```\n\n##### `validateEmailMessage(email: EmailMessage): EmailValidationResult`\n\nValidate an email message before sending.\n\n```typescript\nconst validation = emailSender.validateEmailMessage(email);\nif (!validation.isValid) {\n  console.error('Email validation errors:', validation.errors);\n}\n```\n\n##### `testConnection(): Promise<boolean>`\n\nTest the connection to the email provider.\n\n```typescript\nconst isConnected = await emailSender.testConnection();\nif (isConnected) {\n  console.log('Connection successful');\n} else {\n  console.error('Connection failed');\n}\n```\n\n##### `getCapabilities(): EmailProviderCapabilities`\n\nGet the capabilities of the current provider.\n\n```typescript\nconst capabilities = emailSender.getCapabilities();\nconsole.log('Supports attachments:', capabilities.supportsAttachments);\nconsole.log('Max batch size:', capabilities.maxBatchSize);\n```\n\n### Types\n\n#### EmailMessage\n\n```typescript\ninterface EmailMessage {\n  toEmail: string;\n  toName?: string;\n  fromEmail?: string;\n  fromName?: string;\n  subject: string;\n  htmlContent?: string;\n  textContent?: string;\n  replyTo?: string;\n  headers?: Record<string, string>;\n  attachments?: EmailAttachment[];\n  metadata?: Record<string, any>;\n}\n```\n\n#### EmailAttachment\n\n```typescript\ninterface EmailAttachment {\n  filename: string;\n  content: string; // Base64 encoded\n  contentType?: string;\n  disposition?: 'attachment' | 'inline';\n}\n```\n\n#### SendResult\n\n```typescript\ninterface SendResult {\n  success: boolean;\n  messageId?: string;\n  errorMessage?: string;\n  providerResponse?: any;\n  metadata?: Record<string, any>;\n}\n```\n\n#### EmailProviderConfig\n\n```typescript\ninterface EmailProviderConfig {\n  provider: 'sendgrid' | 'ses' | 'mailgun' | 'postmark' | 'smtp';\n  apiKey?: string;\n  region?: string;\n  endpoint?: string;\n  fromEmail: string;\n  fromName?: string;\n  replyTo?: string;\n  webhookUrl?: string;\n  webhookSecret?: string;\n  sandbox?: boolean;\n  // SMTP specific options\n  host?: string;\n  port?: number;\n  secure?: boolean;\n  username?: string;\n  password?: string;\n}\n```\n\n## Provider Capabilities\n\nEach provider exposes its capabilities through the `getCapabilities()` method. The capabilities interface includes both legacy boolean flags and an expanded `features` map for fine-grained capability inspection.\n\n### EmailProviderCapabilities Interface\n\n```typescript\ninterface EmailProviderCapabilities {\n  // Legacy boolean flags (always available)\n  supportsBatch: boolean;\n  supportsTemplates: boolean;\n  supportsWebhooks: boolean;\n  supportsAttachments: boolean;\n  supportsCustomHeaders: boolean;\n  supportsDeliveryTracking: boolean;\n  maxBatchSize: number;\n  maxAttachmentSize: number;\n\n  // Expanded feature map (optional, populated by capability-aware providers)\n  features?: Record<string, CapabilityEntry>;\n}\n```\n\n### CapabilityEntry\n\nEach entry in the `features` map describes how a specific feature is supported:\n\n```typescript\ntype CapabilitySource = 'provider' | 'platform' | 'enhanced' | 'unsupported';\n\ninterface CapabilityEntry {\n  source: CapabilitySource;      // How the feature is implemented\n  description: string;           // Human-readable description\n  limitations?: string;          // Known limitations (e.g., \"72hr max scheduling window\")\n  degradation?: {                // Present when platform polyfill has a degradation strategy\n    strategy: string;\n    description: string;\n    docUrl: string;\n  } | null;\n  overridable: boolean;          // Whether the entry can be overridden at runtime\n}\n```\n\n### Per-Provider Capability Summary\n\n| Provider | Batch | Templates | Webhooks | Attachments | Custom Headers | Delivery Tracking |\n|----------|-------|-----------|----------|-------------|----------------|-------------------|\n| SendGrid | Yes (personalizations) | Yes (dynamic templates) | Yes (Event Webhook) | Yes | Yes | Yes |\n| Mailgun | Yes (recipient variables) | Yes (stored templates) | Yes | Yes | Yes | Yes |\n| Postmark | Yes (batch API) | Yes (server-side) | Yes | Yes | Yes | Yes |\n| SES | Yes (SendBulkEmail) | Yes (email templates) | Yes (via SNS) | Yes (raw email) | Yes | Yes (via SNS) |\n| SMTP | Sequential* | No server-side | No | Yes (MIME) | Yes | No |\n\n*SMTP batch sending is handled sequentially by the platform, not natively by the provider.\n\n### Declaring Capabilities in Custom Providers\n\nWhen implementing a custom provider, declare capabilities by returning the appropriate values from `getCapabilities()`:\n\n```typescript\nimport { EmailProvider, EmailProviderCapabilities, CapabilityEntry } from '@bernierllc/email-sender';\n\nclass CustomProvider extends EmailProvider {\n  getCapabilities(): EmailProviderCapabilities {\n    return {\n      supportsBatch: true,\n      supportsTemplates: false,\n      supportsWebhooks: true,\n      supportsAttachments: true,\n      supportsCustomHeaders: true,\n      supportsDeliveryTracking: true,\n      maxBatchSize: 500,\n      maxAttachmentSize: 10 * 1024 * 1024, // 10 MB\n\n      // Optional: declare fine-grained features for capability-aware routing\n      features: {\n        sendEmail: {\n          source: 'provider',\n          description: 'Send email via custom API',\n          degradation: null,\n          overridable: false,\n        },\n        batchSend: {\n          source: 'provider',\n          description: 'Batch send via custom API bulk endpoint',\n          degradation: null,\n          overridable: true,\n        },\n        scheduledSend: {\n          source: 'unsupported',\n          description: 'Custom provider does not support scheduled send',\n          degradation: null,\n          overridable: false,\n        },\n      },\n    };\n  }\n}\n```\n\nWhen the `features` map is present, the `@bernierllc/email-manager` capability router uses it for intelligent provider selection. When absent, the router falls back to the static capability matrix.\n\n### Zod Validation\n\nBoth `CapabilityEntry` and `DegradationInfo` have Zod schemas for runtime validation:\n\n```typescript\nimport { capabilityEntrySchema, degradationInfoSchema } from '@bernierllc/email-sender';\n\nconst result = capabilityEntrySchema.safeParse(entry);\nif (!result.success) {\n  console.error('Invalid capability entry:', result.error.issues);\n}\n```\n\n---\n\n## Staging Email Safety\n\nPrevent accidental email sends in non-production environments by using the staging safety feature.\n\n### Staging with Whitelist (Block Non-Whitelisted)\n\n```typescript\nimport { EmailSender } from '@bernierllc/email-sender';\n\nconst emailSender = new EmailSender({\n  provider: 'smtp' as const,\n  host: 'smtp.example.com',\n  port: 587,\n  username: 'user',\n  password: 'pass',\n  fromEmail: 'sender@example.com',\n  stagingSafety: {\n    enabled: true,\n    environment: 'staging',\n    whitelist: ['test@example.com', 'admin@example.com', 'qa@example.com'],\n    blockNonWhitelisted: true,\n    logBlocked: true,\n  },\n});\n\n// This will send (whitelisted)\nawait emailSender.sendEmail({\n  toEmail: 'test@example.com',\n  subject: 'Test Email',\n  htmlContent: '<p>This email will be sent</p>',\n});\n\n// This will be blocked (not whitelisted)\nconst result = await emailSender.sendEmail({\n  toEmail: 'customer@example.com',\n  subject: 'Test Email',\n  htmlContent: '<p>This email will be blocked</p>',\n});\nconsole.log(result.success); // false\nconsole.log(result.errorMessage); // \"Email blocked by safety manager: ...\"\n```\n\n### Staging with Rewrite (Redirect to Test Email)\n\n```typescript\nconst emailSender = new EmailSender({\n  provider: 'smtp' as const,\n  host: 'smtp.example.com',\n  port: 587,\n  username: 'user',\n  password: 'pass',\n  fromEmail: 'sender@example.com',\n  stagingSafety: {\n    enabled: true,\n    environment: 'staging',\n    whitelist: ['admin@example.com'], // Admin emails go through normally\n    rewriteTo: 'staging-test@example.com', // All other emails redirected here\n    blockNonWhitelisted: false,\n    logBlocked: true,\n  },\n});\n\n// This will be sent to staging-test@example.com instead\nawait emailSender.sendEmail({\n  toEmail: 'customer@example.com',\n  subject: 'Test Email',\n  htmlContent: '<p>This will be sent to staging-test@example.com</p>',\n});\n```\n\n### Production (All Emails Allowed)\n\n```typescript\nconst emailSender = new EmailSender({\n  provider: 'smtp' as const,\n  host: 'smtp.example.com',\n  port: 587,\n  username: 'user',\n  password: 'pass',\n  fromEmail: 'sender@example.com',\n  stagingSafety: {\n    enabled: true,\n    environment: 'production',\n    whitelist: [], // Not used in production\n    blockNonWhitelisted: false,\n    logBlocked: false,\n  },\n});\n\n// All emails are allowed in production\nawait emailSender.sendEmail({\n  toEmail: 'customer@example.com',\n  subject: 'Production Email',\n  htmlContent: '<p>This email will be sent</p>',\n});\n```\n\n### Check Recipient Safety Before Sending\n\n```typescript\nconst safetyResult = emailSender.checkRecipientSafety('test@example.com');\nconsole.log('Safety check result:', safetyResult);\n\nif (safetyResult && !safetyResult.allowed) {\n  console.log('Email would be blocked:', safetyResult.reason);\n}\n```\n\n### Dynamic Configuration Based on Environment\n\n```typescript\nconst environment = process.env.NODE_ENV || 'development';\n\nconst emailSender = new EmailSender({\n  provider: 'smtp' as const,\n  host: 'smtp.example.com',\n  port: 587,\n  username: 'user',\n  password: 'pass',\n  fromEmail: 'sender@example.com',\n  stagingSafety: {\n    enabled: environment !== 'production',\n    environment: environment as 'development' | 'staging' | 'production',\n    whitelist: environment === 'staging'\n      ? ['qa@example.com', 'test@example.com']\n      : [],\n    rewriteTo: environment === 'development' ? 'dev@example.com' : undefined,\n    blockNonWhitelisted: environment === 'staging',\n    logBlocked: true,\n  },\n});\n\nconsole.log('Current environment:', environment);\nconsole.log('Safety enabled:', emailSender.isSafetyEnabled());\nconsole.log('Safety config:', emailSender.getSafetyConfig());\n```\n\n## Examples\n\n### Send Email with Attachment\n\n```typescript\nimport { EmailSender } from '@bernierllc/email-sender';\nimport fs from 'fs';\n\nconst emailSender = new EmailSender(config);\n\nconst attachment = {\n  filename: 'report.pdf',\n  content: fs.readFileSync('report.pdf').toString('base64'),\n  contentType: 'application/pdf',\n  disposition: 'attachment' as const,\n};\n\nconst result = await emailSender.sendEmail({\n  toEmail: 'recipient@example.com',\n  subject: 'Monthly Report',\n  htmlContent: '<h1>Monthly Report</h1><p>Please find the attached report.</p>',\n  attachments: [attachment],\n});\n```\n\n### Send Email with Custom Headers\n\n```typescript\nconst result = await emailSender.sendEmail({\n  toEmail: 'recipient@example.com',\n  subject: 'Priority Message',\n  htmlContent: '<h1>Important Update</h1>',\n  headers: {\n    'X-Priority': '1',\n    'X-Custom-Header': 'custom-value',\n  },\n});\n```\n\n### Batch Email with Different Content\n\n```typescript\nconst emails = [\n  {\n    toEmail: 'user1@example.com',\n    toName: 'User One',\n    subject: 'Personalized Email 1',\n    htmlContent: '<h1>Hello User One!</h1>',\n  },\n  {\n    toEmail: 'user2@example.com',\n    toName: 'User Two',\n    subject: 'Personalized Email 2',\n    htmlContent: '<h1>Hello User Two!</h1>',\n  },\n];\n\nconst results = await emailSender.sendBatch(emails);\n```\n\n### Error Handling\n\n```typescript\ntry {\n  const result = await emailSender.sendEmail(email);\n  \n  if (result.success) {\n    console.log('Email sent successfully');\n  } else {\n    console.error('Email failed:', result.errorMessage);\n    \n    // Check if it's a validation error\n    const validation = emailSender.validateEmailMessage(email);\n    if (!validation.isValid) {\n      console.error('Validation errors:', validation.errors);\n    }\n  }\n} catch (error) {\n  console.error('Unexpected error:', error);\n}\n```\n\n## Provider Support\n\n### Currently Supported\n\n- **SMTP**: Full support with nodemailer\n- **SendGrid**: Full support with SendGrid API\n- **AWS SES**: Full support with AWS SDK (requires `aws-sdk` peer dependency)\n- **Mailgun**: Full support with Mailgun API\n- **Postmark**: Full support with Postmark API\n\n### Adding New Providers\n\nTo add a new provider, extend the `EmailProvider` base class:\n\n```typescript\nimport { EmailProvider, EmailMessage, SendResult } from '@bernierllc/email-sender';\n\nexport class CustomProvider extends EmailProvider {\n  async sendEmail(email: EmailMessage): Promise<SendResult> {\n    // Implement your provider logic here\n  }\n  \n  async sendBatch(emails: EmailMessage[]): Promise<SendResult[]> {\n    // Implement batch sending logic\n  }\n  \n  async getDeliveryStatus(messageId: string): Promise<DeliveryStatus | null> {\n    // Implement delivery status checking\n  }\n  \n  async processWebhook(payload: any, signature: string): Promise<WebhookEvent[]> {\n    // Implement webhook processing\n  }\n}\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\nnpm test\n```\n\nRun tests with coverage:\n\n```bash\nnpm run test:coverage\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests for new functionality\n5. Ensure all tests pass\n6. Submit a pull request\n\n## Integration Status\n\n- **Logger integration**: not-applicable - Email-sender is a low-level utility that doesn't require @bernierllc/logger integration. Consumer applications should handle logging as needed.\n- **Docs-Suite**: ready - Complete TypeDoc/JSDoc documentation available. Markdown-based README with extensive examples.\n- **NeverHub integration**: not-applicable - Email-sender is a stateless utility focused on email delivery. @bernierllc/neverhub-adapter is not needed for this use case.\n\n### Graceful Degradation\n\nThis package is designed to work standalone without external dependencies beyond the configured email provider. All functionality is self-contained with clear error handling and validation.\n\n## License\n\nISC License - see LICENSE file for details.\n\n## Support\n\nFor support and questions, please open an issue on GitHub or contact Bernier LLC. ","readmeFilename":"README.md"}