{"_id":"@bernierllc/email-manager-client","_rev":"10-c337b18f16c1402fda2d4997d2d3709a","name":"@bernierllc/email-manager-client","dist-tags":{"latest":"0.8.0"},"versions":{"0.2.0":{"name":"@bernierllc/email-manager-client","version":"0.2.0","keywords":["email","manager","client","browser","http","api","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/email-manager-client@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":"bcf207ad10cf53a62b9f5259539e951c3184acbf","tarball":"https://registry.npmjs.org/@bernierllc/email-manager-client/-/email-manager-client-0.2.0.tgz","fileCount":9,"integrity":"sha512-EXyi3kSUj2yxw/3lUGV4mABdUCjzq4X+i3BU2+nifC+VBjzEtRlzWYp++OIE+caGBvfysmmQwFg4yZdo6ReD8A==","signatures":[{"sig":"MEQCIB97NfPHj0k16of9oMMGYAiORvAZ40fPZ1eQFaupYTwxAiAY6ueXPJ9PuqGlClUWJcH0LAEESuVpHNMqLyN6IV9ZdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26209},"main":"dist/index.js","type":"module","_from":"file:bernierllc-email-manager-client-0.2.0.tgz","types":"dist/index.d.ts","browser":"dist/index.js","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --forceExit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/9b4a2fe6fb1c8173cabf17ab0a2353d6/bernierllc-email-manager-client-0.2.0.tgz","_integrity":"sha512-EXyi3kSUj2yxw/3lUGV4mABdUCjzq4X+i3BU2+nifC+VBjzEtRlzWYp++OIE+caGBvfysmmQwFg4yZdo6ReD8A==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/suite/email-manager-client"},"_npmVersion":"11.7.0","description":"Browser-safe HTTP client for @bernierllc/email-manager - use this in frontend applications","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.4"},"publishConfig":{"access":"restricted","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0"},"_npmOperationalInternal":{"tmp":"tmp/email-manager-client_0.2.0_1766087520377_0.31614156460452336","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/email-manager-client","version":"0.3.0","keywords":["email","manager","client","browser","http","api","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/email-manager-client@0.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":"885a5f3954fbcba2154f83b8ecdcdc2bfa9ea7b5","tarball":"https://registry.npmjs.org/@bernierllc/email-manager-client/-/email-manager-client-0.3.0.tgz","fileCount":11,"integrity":"sha512-eINdB2/7jLNhLwDuCZn3gprMZO1BSiKgWRAc95eFBNxYzRKtt7C3+qDMsJcxY1oirhDvz3K7WCuqSKin+ewG8A==","signatures":[{"sig":"MEUCIHkQMpXVzvDANXHim4A1kcBogxXxlBh06W9uMslQl3qWAiEAujfdBACgVxgOfn9NXdENyo9dfcM6BO6/JKfk4VPphBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37676},"main":"dist/index.js","type":"module","_from":"file:bernierllc-email-manager-client-0.3.0.tgz","types":"dist/index.d.ts","browser":"dist/index.js","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --forceExit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7a89a3cc-2a32-4e27-bb65-850dd4247de7"}},"_resolved":"/tmp/926d224928e6858c53abf384b97b6607/bernierllc-email-manager-client-0.3.0.tgz","_integrity":"sha512-eINdB2/7jLNhLwDuCZn3gprMZO1BSiKgWRAc95eFBNxYzRKtt7C3+qDMsJcxY1oirhDvz3K7WCuqSKin+ewG8A==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/suite/email-manager-client"},"_npmVersion":"11.7.0","description":"Browser-safe HTTP client for @bernierllc/email-manager - use this in frontend applications","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.4"},"publishConfig":{"access":"restricted","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0"},"_npmOperationalInternal":{"tmp":"tmp/email-manager-client_0.3.0_1766608037776_0.21901390761379558","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/email-manager-client","version":"0.5.0","keywords":["email","manager","client","browser","http","api","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/email-manager-client@0.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":"8f2645810caff94daed7378f3947113b744909ba","tarball":"https://registry.npmjs.org/@bernierllc/email-manager-client/-/email-manager-client-0.5.0.tgz","fileCount":11,"integrity":"sha512-J62+pCrAWasYDbSPP2Xw38VgBuvVIwsQWFkVZgnIjmE6Lv9hQqS3+vyZ3QtddlTj1NHG5uoFQEA3VtwkFlVfQw==","signatures":[{"sig":"MEUCIQDUEPP2K44nAdo7tROuxn9zPxLcEU2e8blMd03qtyXb5QIgOb8QgK+r2buB3V3tCs84Qh1y0nyygzL2iaCx39xl8pw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37734},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","browser":"dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --forceExit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7a89a3cc-2a32-4e27-bb65-850dd4247de7"}},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/suite/email-manager-client"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Browser-safe HTTP client for @bernierllc/email-manager - use this in frontend applications","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.4"},"publishConfig":{"access":"restricted","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0"},"_npmOperationalInternal":{"tmp":"tmp/email-manager-client_0.5.0_1767642349916_0.8890125421607","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@bernierllc/email-manager-client","version":"0.6.0","keywords":["email","manager","client","browser","http","api","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/email-manager-client@0.6.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":"27da0aa25fcf7777781117830131f3f846c076e1","tarball":"https://registry.npmjs.org/@bernierllc/email-manager-client/-/email-manager-client-0.6.0.tgz","fileCount":11,"integrity":"sha512-QYZBAHa9vNrGrOj4ZNU1PHzOd7tHUvZSwtVkGLzIMMQsH6uYEWw3u5l1on4be0KlcIHt5fniK3gOT7M/HfDLTg==","signatures":[{"sig":"MEYCIQDpw++jWXSUk2o+doy5phETLEOpFPa0Nvi2bIb3G+Hh7gIhAI2ZfqOjgU+jBHQgf40Utto4ixIFoYc9VvzzVgV5oPs/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63675},"main":"dist/index.js","type":"module","_from":"file:bernierllc-email-manager-client-0.6.0.tgz","types":"dist/index.d.ts","browser":"dist/index.js","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --forceExit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7a89a3cc-2a32-4e27-bb65-850dd4247de7"}},"_resolved":"/tmp/4f7b0eb80b2e2f94fcbb5c8aceb09ddc/bernierllc-email-manager-client-0.6.0.tgz","_integrity":"sha512-QYZBAHa9vNrGrOj4ZNU1PHzOd7tHUvZSwtVkGLzIMMQsH6uYEWw3u5l1on4be0KlcIHt5fniK3gOT7M/HfDLTg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/suite/email-manager-client"},"_npmVersion":"11.11.0","description":"Browser-safe HTTP client for @bernierllc/email-manager - use this in frontend applications","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.22.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0"},"_npmOperationalInternal":{"tmp":"tmp/email-manager-client_0.6.0_1773078136808_0.8787940301653989","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@bernierllc/email-manager-client","version":"0.6.1","keywords":["email","manager","client","browser","http","api","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/email-manager-client@0.6.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":"1cbf4917d5b5b29572692498a0f6f20ac6cb11ea","tarball":"https://registry.npmjs.org/@bernierllc/email-manager-client/-/email-manager-client-0.6.1.tgz","fileCount":11,"integrity":"sha512-o7ge9vM2RS/IHz5f3pBYwFx3PmRsdedY+wcAGGVrmnPR/XxcBHE8m1QTnPcrl8IC2v1+/Np7X2k7GmdjAFyunA==","signatures":[{"sig":"MEQCIFC6+kB+4OPOX6pHUpfy+zP7Ry2sOx10ifYJuIV8W6sHAiB0T7TfoyPh0GtK5+L/B/+cxaRFK3svASDNkLM8mGEGXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63675},"main":"dist/index.js","type":"module","_from":"file:bernierllc-email-manager-client-0.6.1.tgz","types":"dist/index.d.ts","browser":"dist/index.js","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --forceExit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7a89a3cc-2a32-4e27-bb65-850dd4247de7"}},"_resolved":"/home/runner/work/tools/tools/packages/suite/email-manager-client/bernierllc-email-manager-client-0.6.1.tgz","_integrity":"sha512-o7ge9vM2RS/IHz5f3pBYwFx3PmRsdedY+wcAGGVrmnPR/XxcBHE8m1QTnPcrl8IC2v1+/Np7X2k7GmdjAFyunA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/suite/email-manager-client"},"_npmVersion":"11.11.0","description":"Browser-safe HTTP client for @bernierllc/email-manager - use this in frontend applications","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.22.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0"},"_npmOperationalInternal":{"tmp":"tmp/email-manager-client_0.6.1_1773083485980_0.9107790355200751","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@bernierllc/email-manager-client","version":"0.7.0","keywords":["email","manager","client","browser","http","api","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/email-manager-client@0.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":"77c4c86b1f3085ca0364f2fb18150a9d7665ec2a","tarball":"https://registry.npmjs.org/@bernierllc/email-manager-client/-/email-manager-client-0.7.0.tgz","fileCount":11,"integrity":"sha512-msYdEVhH2VJ0csWzObyTdjT7Q7DEJaXuOkiBmdrLBTKWcclqpfsePJmuWJtqVnH04TMc7XsBwYTuVKAL0Wrugw==","signatures":[{"sig":"MEUCIQC/jBB1QFA0Ei4zv8Y1Z+Fejs+PX/vFbLLqiXXzUB1QKAIgci5pRZSpiL6BTym+6h+zoCBEkwu0RHsnJZSybkWdhtw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63675},"main":"dist/index.js","type":"module","_from":"file:bernierllc-email-manager-client-0.7.0.tgz","types":"dist/index.d.ts","browser":"dist/index.js","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --forceExit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7a89a3cc-2a32-4e27-bb65-850dd4247de7"}},"_resolved":"/home/runner/work/tools/tools/packages/suite/email-manager-client/bernierllc-email-manager-client-0.7.0.tgz","_integrity":"sha512-msYdEVhH2VJ0csWzObyTdjT7Q7DEJaXuOkiBmdrLBTKWcclqpfsePJmuWJtqVnH04TMc7XsBwYTuVKAL0Wrugw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/suite/email-manager-client"},"_npmVersion":"11.14.1","description":"Browser-safe HTTP client for @bernierllc/email-manager - use this in frontend applications","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0"},"_npmOperationalInternal":{"tmp":"tmp/email-manager-client_0.7.0_1779241946717_0.8754082223000181","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@bernierllc/email-manager-client","version":"0.8.0","description":"Browser-safe HTTP client for @bernierllc/email-manager - use this in frontend applications","type":"module","main":"dist/index.js","types":"dist/index.d.ts","browser":"dist/index.js","keywords":["email","manager","client","browser","http","api","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","dependencies":{"zod":"^3.22.4"},"devDependencies":{"@types/jest":"^29.5.5","@types/node":"^20.6.0","jest":"^29.6.4","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2"},"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git","directory":"packages/suite/email-manager-client"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"engines":{"node":">=18.0.0"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"jest","test:run":"jest --forceExit","test:watch":"jest --watch","test:coverage":"jest --coverage","clean":"rimraf dist","prebuild":"npm run clean"},"_id":"@bernierllc/email-manager-client@0.8.0","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"homepage":"https://github.com/bernier-llc/tools#readme","_integrity":"sha512-jcDwcv5ljLVMVNkw17qpx05werx3Wr3MLK+J3Utjboepzx50/4FXukRlWvzEjK1eUYYRufq9Lf/bSHGOJKm/Iw==","_resolved":"/home/runner/work/tools/tools/packages/suite/email-manager-client/bernierllc-email-manager-client-0.8.0.tgz","_from":"file:bernierllc-email-manager-client-0.8.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-jcDwcv5ljLVMVNkw17qpx05werx3Wr3MLK+J3Utjboepzx50/4FXukRlWvzEjK1eUYYRufq9Lf/bSHGOJKm/Iw==","shasum":"7e0a9e07d064da8b8e7df9a02188e72aebfb56f9","tarball":"https://registry.npmjs.org/@bernierllc/email-manager-client/-/email-manager-client-0.8.0.tgz","fileCount":11,"unpackedSize":63675,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDPolP8klGrxzvEqf/SUZhtIiFrUDWyPIQA6ASTn4xRRAIgDyCITnN9R41WWCsfqszpda46qJOR6MytfThhey626U0="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7a89a3cc-2a32-4e27-bb65-850dd4247de7"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/email-manager-client_0.8.0_1779250698347_0.7363093470530286"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-18T19:52:00.220Z","modified":"2026-05-20T04:18:18.730Z","0.2.0":"2025-12-18T19:52:00.518Z","0.3.0":"2025-12-24T20:27:17.919Z","0.5.0":"2026-01-05T19:45:50.043Z","0.6.0":"2026-03-09T17:42:16.973Z","0.6.1":"2026-03-09T19:11:26.138Z","0.7.0":"2026-05-20T01:52:26.895Z","0.8.0":"2026-05-20T04:18:18.592Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"Bernier LLC","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["email","manager","client","browser","http","api","bernierllc"],"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git","directory":"packages/suite/email-manager-client"},"description":"Browser-safe HTTP client for @bernierllc/email-manager - use this in frontend applications","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/email-manager-client\n\n**Browser-safe HTTP client for @bernierllc/email-manager**\n\nUse this package in frontend/browser applications to interact with email-manager via HTTP API calls. This package has **zero Node.js dependencies** and can be safely bundled for browser use.\n\n## Why This Package Exists\n\nThe `@bernierllc/email-manager` package uses Node.js-only dependencies (like `nodemailer`) that cannot be bundled for browser use. This client package provides the same API surface but makes HTTP calls to a backend server instead.\n\n## Installation\n\n```bash\nnpm install @bernierllc/email-manager-client\n```\n\n## Quick Start\n\n```typescript\nimport { EmailManagerClient } from '@bernierllc/email-manager-client';\n\nconst client = new EmailManagerClient({\n  baseUrl: 'https://api.example.com/email',\n  apiKey: 'your-api-key'\n});\n\n// Send an email\nconst result = await client.sendEmail({\n  to: 'user@example.com',\n  subject: 'Hello World',\n  html: '<p>This is a test email</p>',\n  text: 'This is a test email'\n});\n\nif (result.success) {\n  console.log('Email sent:', result.messageId);\n}\n```\n\n## Configuration\n\n```typescript\ninterface EmailManagerClientConfig {\n  baseUrl: string;                       // Required: Backend API base URL\n  apiKey?: string;                       // Optional: API key for authentication\n  timeout?: number;                      // Optional: Request timeout in ms (default: 30000)\n  headers?: Record<string, string>;      // Optional: Additional headers\n}\n```\n\n## Backend Setup\n\nYou need a backend server that exposes the email-manager API. The backend should:\n\n1. Import and use `@bernierllc/email-manager` (Node.js-only)\n2. Expose HTTP endpoints that match the client API\n3. Handle authentication/authorization\n\n### Example Backend Route (Next.js API Route)\n\n```typescript\n// app/api/email/send/route.ts\nimport { EnhancedEmailManager } from '@bernierllc/email-manager';\nimport { NextRequest, NextResponse } from 'next/server';\n\nconst emailManager = new EnhancedEmailManager(/* config */);\n\nexport async function POST(request: NextRequest) {\n  try {\n    const emailData = await request.json();\n    const result = await emailManager.sendEmail(emailData);\n    return NextResponse.json(result);\n  } catch (error) {\n    return NextResponse.json(\n      { error: 'Failed to send email', message: error.message },\n      { status: 500 }\n    );\n  }\n}\n```\n\n---\n\n## API Reference\n\n### Email Sending\n\n#### `sendEmail(email)`\n\nSend an email immediately.\n\n```typescript\nconst result = await client.sendEmail({\n  to: 'user@example.com',\n  subject: 'Welcome!',\n  html: '<h1>Welcome</h1>',\n  text: 'Welcome',\n  priority: 'high',\n  metadata: { campaign: 'onboarding' }\n});\n// => { success: true, messageId: 'msg_abc123', provider: 'sendgrid', sentAt: '2025-01-15T...' }\n```\n\n#### `scheduleEmail(email, scheduledFor)`\n\nSchedule an email for future delivery.\n\n```typescript\nconst result = await client.scheduleEmail(\n  { to: 'user@example.com', subject: 'Reminder', html: '<p>Don\\'t forget!</p>' },\n  new Date('2025-03-01T09:00:00Z')\n);\n// => { success: true, scheduleId: 'sch_xyz', scheduledFor: '2025-03-01T09:00:00.000Z', emailId: '...', status: 'scheduled' }\n```\n\n#### `cancelScheduledEmail(scheduleId)`\n\n```typescript\nconst result = await client.cancelScheduledEmail('sch_xyz');\n// => { success: true, message: 'Scheduled email cancelled' }\n```\n\n#### `getScheduledEmail(scheduleId)` / `listScheduledEmails(options?)`\n\n```typescript\nconst email = await client.getScheduledEmail('sch_xyz');\nconst emails = await client.listScheduledEmails({ page: 1, pageSize: 20 });\n```\n\n---\n\n### Calendar Methods\n\n#### `sendCalendarInvite(event, recipients, options?)`\n\nSend a calendar invitation (iCal/ICS) to recipients.\n\n```typescript\nconst result = await client.sendCalendarInvite(\n  {\n    title: 'Sprint Planning',\n    description: 'Weekly sprint planning session',\n    start: '2025-02-01T14:00:00Z',\n    end: '2025-02-01T15:00:00Z',\n    location: 'Conference Room A',\n    organizer: { email: 'team-lead@example.com', name: 'Team Lead' },\n    attendees: [\n      { email: 'dev1@example.com', name: 'Developer 1' },\n      { email: 'dev2@example.com', name: 'Developer 2' }\n    ]\n  },\n  ['dev1@example.com', 'dev2@example.com'],\n  { subject: 'You are invited: Sprint Planning' }\n);\n// => { success: true, messageId: 'msg_cal_001', eventUid: 'evt_abc123' }\n```\n\n#### `cancelCalendarEvent(eventUid, organizer, attendees)`\n\nCancel a previously sent calendar event and notify all attendees.\n\n```typescript\nconst result = await client.cancelCalendarEvent(\n  'evt_abc123',\n  { email: 'team-lead@example.com', name: 'Team Lead' },\n  [{ email: 'dev1@example.com' }, { email: 'dev2@example.com' }]\n);\n// => { success: true, eventUid: 'evt_abc123' }\n```\n\n---\n\n### Batch Sending\n\n#### `sendBatch(emails, options?)`\n\nSend multiple emails in a single operation with configurable concurrency and failure handling.\n\n```typescript\nconst result = await client.sendBatch(\n  [\n    { to: 'user1@example.com', subject: 'Update', html: '<p>News for you</p>' },\n    { to: 'user2@example.com', subject: 'Update', html: '<p>News for you</p>' },\n    { to: 'user3@example.com', subject: 'Update', html: '<p>News for you</p>' }\n  ],\n  {\n    concurrency: 5,\n    rateLimit: { maxPerSecond: 10, maxPerMinute: 300 },\n    failureStrategy: 'continue',   // 'continue' | 'abort-on-first' | 'abort-on-threshold'\n    failureThreshold: 0.5          // Abort if 50% fail (used with 'abort-on-threshold')\n  }\n);\n// => {\n//   total: 3,\n//   succeeded: 2,\n//   failed: 1,\n//   results: [\n//     { recipient: 'user1@example.com', success: true, messageId: 'msg_1', attempts: 1 },\n//     { recipient: 'user2@example.com', success: true, messageId: 'msg_2', attempts: 1 },\n//     { recipient: 'user3@example.com', success: false, error: 'Invalid address', attempts: 2 }\n//   ],\n//   duration: 1234,\n//   aborted: false\n// }\n```\n\n**Failure strategies:**\n\n| Strategy | Behavior |\n|----------|----------|\n| `continue` | Send all emails regardless of individual failures |\n| `abort-on-first` | Stop immediately on the first failure |\n| `abort-on-threshold` | Stop when the failure rate exceeds `failureThreshold` |\n\n---\n\n### Template Management\n\n#### `createTemplate(template)` / `getTemplate(id)` / `updateTemplate(id, template)` / `deleteTemplate(id)`\n\n```typescript\nconst result = await client.createTemplate({\n  name: 'welcome',\n  subject: 'Welcome, {{name}}!',\n  htmlTemplate: '<h1>Welcome {{name}}</h1>',\n  variables: [{ name: 'name', type: 'string', required: true }],\n  isActive: true\n});\n\nconst template = await client.getTemplate('tmpl_abc');\nawait client.updateTemplate('tmpl_abc', { subject: 'Updated subject' });\nawait client.deleteTemplate('tmpl_abc');\n```\n\n#### `listTemplates(options?)` / `validateTemplate(template)`\n\n```typescript\nconst list = await client.listTemplates({ page: 1, pageSize: 10, category: 'marketing' });\n// => { templates: [...], total: 42, page: 1, pageSize: 10 }\n\nconst validation = await client.validateTemplate({ htmlTemplate: '<p>{{missing}}</p>' });\n// => { isValid: false, errors: ['Unknown variable: missing'] }\n```\n\n---\n\n### Provider Management\n\n#### `addProvider(provider)` / `getProvider(id)` / `updateProvider(id, provider)` / `deleteProvider(id)`\n\n```typescript\nconst result = await client.addProvider({\n  name: 'Primary SendGrid',\n  type: 'sendgrid',\n  config: { apiKey: '...' },\n  isActive: true,\n  priority: 1,\n  rateLimit: { maxPerMinute: 100, maxPerHour: 3000, maxPerDay: 50000 }\n});\n```\n\n#### `listProviders()` / `getProviderStatus(id)` / `testProvider(id)`\n\n```typescript\nconst providers = await client.listProviders();\n// => { providers: [...], total: 3 }\n\nconst status = await client.getProviderStatus('prov_123');\n// => { id: 'prov_123', isActive: true, isHealthy: true, lastHealthCheck: '...', currentUsage: { minute: 5, hour: 120, day: 2400 } }\n\nconst test = await client.testProvider('prov_123');\n// => { success: true, message: 'Connection successful' }\n```\n\n---\n\n### Analytics\n\n#### `getEmailStats(emailId)` / `getDeliveryReport(options?)` / `getBounceReport(options?)`\n\n```typescript\nconst stats = await client.getEmailStats('msg_abc');\n// => { emailId: 'msg_abc', sent: 1000, delivered: 985, opened: 450, clicked: 120, bounced: 15, deliveryRate: 0.985, openRate: 0.45, clickRate: 0.12 }\n\nconst report = await client.getDeliveryReport({\n  startDate: '2025-01-01T00:00:00Z',\n  endDate: '2025-01-31T23:59:59Z',\n  provider: 'sendgrid'\n});\n\nconst bounces = await client.getBounceReport({\n  startDate: '2025-01-01T00:00:00Z',\n  endDate: '2025-01-31T23:59:59Z'\n});\n```\n\n---\n\n### Subscription Management\n\n#### `createSubscriberList(name, description?)`\n\nCreate a new subscriber list for organizing recipients.\n\n```typescript\nconst list = await client.createSubscriberList('Weekly Newsletter', 'Subscribers to our weekly digest');\n// => { id: 'list_abc', name: 'Weekly Newsletter', description: '...', subscriberCount: 0, createdAt: '...', updatedAt: '...' }\n```\n\n#### `listSubscriberLists(options?)`\n\n```typescript\nconst result = await client.listSubscriberLists({ limit: 20, offset: 0 });\n// => { items: [{ id: 'list_abc', name: 'Weekly Newsletter', subscriberCount: 150, ... }], total: 3 }\n```\n\n#### `deleteSubscriberList(listId)`\n\n```typescript\nconst result = await client.deleteSubscriberList('list_abc');\n// => { success: true, message: 'List deleted' }\n```\n\n#### `addSubscriber(listId, subscriber)`\n\n```typescript\nawait client.addSubscriber('list_abc', {\n  email: 'reader@example.com',\n  name: 'Jane Reader'\n});\n```\n\n#### `removeSubscriber(listId, email)`\n\n```typescript\nawait client.removeSubscriber('list_abc', 'reader@example.com');\n```\n\n#### `getSubscriber(listId, email)`\n\n```typescript\nconst subscriber = await client.getSubscriber('list_abc', 'reader@example.com');\n// => { email: 'reader@example.com', name: 'Jane Reader', status: 'active', subscribedAt: '2025-01-10T...' }\n// Returns null if the subscriber is not found on the list.\n```\n\n---\n\n### Unsubscribe\n\n#### `generateUnsubscribeUrl(email, listId)`\n\nGenerate a secure, tokenized unsubscribe URL for inclusion in email footers.\n\n```typescript\nconst { url } = await client.generateUnsubscribeUrl('reader@example.com', 'list_abc');\n// => { url: 'https://api.example.com/unsubscribe?token=eyJhbGciOi...' }\n```\n\n#### `processUnsubscribe(token)`\n\nProcess an unsubscribe request using the token extracted from the URL.\n\n```typescript\nawait client.processUnsubscribe('eyJhbGciOi...');\n// Removes the subscriber from the associated list. No return value.\n```\n\n---\n\n### Suppression Management\n\nThe suppression list prevents emails from being sent to specific addresses, regardless of their subscription status. Suppressions can be scoped globally or to a specific list.\n\n#### `getSuppressions(options?)`\n\n```typescript\nconst result = await client.getSuppressions({ reason: 'hard_bounce' });\n// => {\n//   items: [\n//     { email: 'bounced@example.com', reason: 'hard_bounce', scope: 'global', createdAt: '2025-01-05T...' }\n//   ],\n//   total: 1\n// }\n```\n\n#### `addSuppression(email, reason, scope?)`\n\n```typescript\nawait client.addSuppression('spam-reporter@example.com', 'complaint', 'global');\n```\n\n#### `removeSuppression(email, scope?)`\n\n```typescript\nconst result = await client.removeSuppression('rehabilitated@example.com', 'global');\n// => { success: true }\n```\n\n#### `isSuppressed(email, listId?)`\n\nCheck whether an email address is on the suppression list before attempting to send.\n\n```typescript\nconst suppressed = await client.isSuppressed('user@example.com');\n// => true | false\n\nconst suppressedOnList = await client.isSuppressed('user@example.com', 'list_abc');\n// => true | false\n```\n\n---\n\n### Webhook Processing\n\n#### `processWebhookEvent(provider, payload)`\n\nForward incoming webhook payloads from email providers to the backend for processing. The backend will normalize the provider-specific format and update delivery statuses.\n\n```typescript\n// SendGrid webhook\nawait client.processWebhookEvent('sendgrid', [\n  { event: 'delivered', email: 'user@example.com', timestamp: 1706000000, sg_message_id: 'msg_123' },\n  { event: 'open', email: 'user@example.com', timestamp: 1706000060, sg_message_id: 'msg_123' }\n]);\n\n// Mailgun webhook\nawait client.processWebhookEvent('mailgun', {\n  signature: { timestamp: '1706000000', token: 'abc', signature: 'def' },\n  'event-data': { event: 'delivered', recipient: 'user@example.com' }\n});\n\n// Postmark webhook\nawait client.processWebhookEvent('postmark', {\n  RecordType: 'Delivery',\n  MessageID: 'msg_456',\n  Recipient: 'user@example.com',\n  DeliveredAt: '2025-01-23T12:00:00Z'\n});\n```\n\n---\n\n## Capability Matrix\n\nThe client package exports types for working with the capability matrix and routing metadata that the backend includes in API responses.\n\n### Capability Types\n\n```typescript\nimport type {\n  ClientCapabilitySource,    // 'provider' | 'platform' | 'enhanced'\n  ClientCapabilityEntry,     // Individual capability entry with source, description, limitations\n  ClientDegradationInfo,     // Degradation strategy and description\n  ClientRoutingMetadata,     // Routing info attached to SendResult\n  ClientProviderName,        // 'sendgrid' | 'mailgun' | 'postmark' | 'ses' | 'smtp'\n  ClientFeatureName,         // String key from the capability matrix\n} from '@bernierllc/email-manager-client';\n```\n\n### ClientCapabilityEntry\n\nDescribes how a specific provider supports a feature:\n\n```typescript\ninterface ClientCapabilityEntry {\n  source: ClientCapabilitySource;   // 'provider' | 'platform' | 'enhanced'\n  description: string;               // Human-readable description\n  limitations?: string;              // Known limitations\n  degradation?: ClientDegradationInfo | null;\n  overridable: boolean;              // Whether this entry can be overridden at runtime\n}\n\ninterface ClientDegradationInfo {\n  strategy: string;       // e.g., 'platform-managed', 'sequential-batch'\n  description: string;    // What the degradation means\n  docUrl?: string;        // Link to degradation documentation\n}\n```\n\n### RoutingMetadata in HTTP Responses\n\nWhen the backend has capability-aware routing enabled, the `SendResult` returned from `sendEmail()` includes a `routing` field:\n\n```typescript\nconst result = await client.sendEmail({\n  to: 'user@example.com',\n  subject: 'Hello',\n  html: '<p>Hello</p>',\n});\n\nif (result.routing) {\n  console.log('Feature:', result.routing.feature);\n  console.log('Provider:', result.routing.selectedProvider);\n  console.log('Source:', result.routing.source);        // 'provider' | 'platform' | 'enhanced'\n  console.log('Degraded:', result.routing.degraded);    // true if platform polyfill was used\n  console.log('Alternatives:', result.routing.alternativeProviders);\n  console.log('Resolved at:', result.routing.resolvedAt);\n\n  if (result.routing.degradation) {\n    console.log('Degradation strategy:', result.routing.degradation.strategy);\n    console.log('Degradation detail:', result.routing.degradation.description);\n  }\n}\n```\n\n### ClientRoutingMetadata Interface\n\n```typescript\ninterface ClientRoutingMetadata {\n  feature: string;                         // The feature that was routed (e.g., 'sendEmail')\n  selectedProvider: string;                // Provider ID that handled the request\n  source: ClientCapabilitySource;          // How the provider supports this feature\n  degraded: boolean;                       // Whether the feature was degraded\n  degradation?: ClientDegradationInfo | null;\n  alternativeProviders: string[];          // Other providers that could handle this feature\n  resolvedAt: string;                      // ISO date string of when routing was resolved\n}\n```\n\nThe `routing` field is only present when the backend has routing enabled. If the backend does not use capability-aware routing, `result.routing` will be `undefined`.\n\n---\n\n## Error Handling\n\nThe client uses a hierarchy of typed error classes with ES2022 `Error.cause` support for full error chain preservation.\n\n### Error Classes\n\n| Class | Code | Retryable | Description |\n|-------|------|-----------|-------------|\n| `EmailManagerClientError` | varies | varies | Base error for all API errors |\n| `NetworkError` | `NETWORK_ERROR` | yes | Network connectivity failure |\n| `TimeoutError` | `TIMEOUT_ERROR` | yes | Request exceeded timeout |\n| `RateLimitError` | `RATE_LIMITED` | yes | Too many requests (429) |\n| `UnauthorizedError` | `UNAUTHORIZED` | no | Invalid or missing API key (401) |\n| `NotFoundError` | `NOT_FOUND` | no | Resource does not exist (404) |\n\n### Error Codes\n\nAll errors carry a machine-readable `code` property:\n\n- `NETWORK_ERROR` - Network failure\n- `TIMEOUT_ERROR` - Request timed out\n- `API_ERROR` - General API error\n- `BAD_REQUEST` - Invalid request (400)\n- `UNAUTHORIZED` - Authentication failure (401)\n- `FORBIDDEN` - Insufficient permissions (403)\n- `NOT_FOUND` - Resource not found (404)\n- `RATE_LIMITED` - Rate limit exceeded (429)\n- `SERVER_ERROR` - Server-side error (5xx)\n\n### Usage\n\n```typescript\nimport {\n  EmailManagerClient,\n  EmailManagerClientError,\n  NetworkError,\n  TimeoutError,\n  RateLimitError,\n  NotFoundError\n} from '@bernierllc/email-manager-client';\n\ntry {\n  await client.sendEmail(emailData);\n} catch (error) {\n  if (error instanceof EmailManagerClientError) {\n    console.error('Code:', error.code);         // e.g. 'RATE_LIMITED'\n    console.error('Status:', error.statusCode);  // e.g. 429\n    console.error('Context:', error.context);    // Additional details\n\n    // Check retryability\n    if (error.isRetryable()) {\n      const retryAfter = error.getRetryAfter(); // Suggested delay in ms\n      console.log(`Retry after ${retryAfter}ms`);\n    }\n\n    // Inspect error chain\n    if (error.cause) {\n      console.error('Caused by:', (error.cause as Error).message);\n    }\n  }\n}\n```\n\n### Retry Pattern\n\n```typescript\nasync function sendWithRetry(client: EmailManagerClient, email: EmailData, maxRetries = 3) {\n  for (let attempt = 1; attempt <= maxRetries; attempt++) {\n    try {\n      return await client.sendEmail(email);\n    } catch (error) {\n      if (error instanceof EmailManagerClientError && error.isRetryable() && attempt < maxRetries) {\n        const delay = error.getRetryAfter() ?? (1000 * Math.pow(2, attempt));\n        await new Promise(resolve => setTimeout(resolve, delay));\n        continue;\n      }\n      throw error;\n    }\n  }\n}\n```\n\n---\n\n## TypeScript Types\n\nAll types are exported for use in your application:\n\n```typescript\nimport type {\n  // Configuration\n  EmailManagerClientConfig,\n\n  // Email\n  EmailData,\n  SendResult,\n  ScheduleResult,\n  ScheduledEmail,\n  CancelResult,\n\n  // Templates\n  EmailTemplate,\n  TemplateResult,\n  TemplateList,\n  ValidationResult,\n\n  // Providers\n  EmailProvider,\n  ProviderResult,\n  ProviderList,\n  ProviderStatus,\n  TestResult,\n\n  // Analytics\n  EmailStats,\n  DeliveryReport,\n  BounceReport,\n  ReportOptions,\n  ListOptions,\n  DeleteResult,\n\n  // Calendar\n  ClientCalendarEvent,\n  CalendarInviteResult,\n  CalendarCancelResult,\n\n  // Batch\n  ClientBatchSendOptions,\n  ClientBatchResult,\n\n  // Subscriptions\n  ClientSubscriberList,\n  ClientSubscriber,\n  ClientSuppression,\n\n  // Errors\n  EmailManagerClientErrorOptions,\n  EmailManagerClientErrorCodeType,\n} from '@bernierllc/email-manager-client';\n```\n\n---\n\n## Browser Compatibility\n\nThis package uses the native `fetch` API, which is available in:\n- Modern browsers (Chrome, Firefox, Safari, Edge)\n- Node.js 18+ (with native fetch)\n- For older environments, use a fetch polyfill\n\n## Differences from email-manager\n\n1. **No Node.js dependencies** - Can be bundled for browser\n2. **HTTP-based** - Makes API calls instead of direct function calls\n3. **Date handling** - Uses ISO date strings instead of Date objects in some places\n4. **Attachments** - Uses base64 strings instead of Buffer objects\n5. **Requires backend** - Needs a server running email-manager\n\n## Examples\n\nRunnable example files are available in the [`examples/`](./examples/) directory:\n\n- [`calendar-workflow.ts`](./examples/calendar-workflow.ts) - Send invites and cancel events\n- [`batch-operations.ts`](./examples/batch-operations.ts) - Batch send with failure strategies\n- [`subscription-lifecycle.ts`](./examples/subscription-lifecycle.ts) - Lists, subscribers, suppressions, unsubscribe\n- [`webhook-handler.ts`](./examples/webhook-handler.ts) - Process webhook events from providers\n\n## License\n\nBernier LLC - Restricted License\n","readmeFilename":"README.md"}