{"_id":"@bernierllc/jest-email-testing","_rev":"8-1c4eca28d91cdeecef7df8e200b7aa54","name":"@bernierllc/jest-email-testing","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.2":{"name":"@bernierllc/jest-email-testing","version":"0.1.2","keywords":["jest","email","testing","matchers","plugin","test-assertions"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/jest-email-testing@0.1.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"b86e2d02283c683da8679f5a1ebbb6a0f7ce3acc","tarball":"https://registry.npmjs.org/@bernierllc/jest-email-testing/-/jest-email-testing-0.1.2.tgz","fileCount":51,"integrity":"sha512-3rHWZU6sHJx5en2fYesYuy10WBQkkwzAwpsIhNlfRJJ65qOe3qnC4JrKiPqDjXNfFvDuvC+FTLfRiY7zbT/whg==","signatures":[{"sig":"MEUCIQC1Pg6tZZ08HxGGMe4xpqKW80e+HgQO7Jfq1Tl924w76QIgZlocWN7r2GP0pq8V6Rz9F3fmfTdfBuF4QR1htE+chjE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146867},"main":"dist/index.js","_from":"file:bernierllc-jest-email-testing-0.1.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --runInBand --no-cache","test:coverage":"jest --coverage --runInBand --no-cache"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/43da971db6a39c2d32890dfc4ca50cbf/bernierllc-jest-email-testing-0.1.2.tgz","_integrity":"sha512-3rHWZU6sHJx5en2fYesYuy10WBQkkwzAwpsIhNlfRJJ65qOe3qnC4JrKiPqDjXNfFvDuvC+FTLfRiY7zbT/whg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/integration/jest-email-testing"},"_npmVersion":"11.6.2","description":"Jest plugin and matchers for comprehensive email testing","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@types/jest":"^29.5.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"jest":"^29.0.0","@jest/globals":"^29.0.0"},"_npmOperationalInternal":{"tmp":"tmp/jest-email-testing_0.1.2_1764635056255_0.7537412247479354","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bernierllc/jest-email-testing","version":"0.1.3","keywords":["jest","email","testing","matchers","plugin","test-assertions"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/jest-email-testing@0.1.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"fab208ad410b60a3b91c015a2412b94ef30c82b2","tarball":"https://registry.npmjs.org/@bernierllc/jest-email-testing/-/jest-email-testing-0.1.3.tgz","fileCount":51,"integrity":"sha512-Z+wQ9RcGALv82iF7C0HRmd0dsvTzPpISZmW+KwtohNC19/dWgVfFca7JV2JbvXJisIy6G0thc6I3MCSw413vRg==","signatures":[{"sig":"MEYCIQCH4o1aDVziHM6Rlo8+hWR2SmEmoiqiAURvhTDx6J8E6gIhAPZ0U2b+nVAVZzrmwNbQY57VmG/YcJ6giSwt4pGaN1Sh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146916},"main":"dist/index.js","_from":"file:bernierllc-jest-email-testing-0.1.3.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --runInBand --no-cache","test:coverage":"jest --coverage --runInBand --no-cache"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/3150b50bbc13df03990c1018982e4057/bernierllc-jest-email-testing-0.1.3.tgz","_integrity":"sha512-Z+wQ9RcGALv82iF7C0HRmd0dsvTzPpISZmW+KwtohNC19/dWgVfFca7JV2JbvXJisIy6G0thc6I3MCSw413vRg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/integration/jest-email-testing"},"_npmVersion":"11.6.2","description":"Jest plugin and matchers for comprehensive email testing","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@types/jest":"^29.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"jest":"^29.0.0","@jest/globals":"^29.0.0"},"_npmOperationalInternal":{"tmp":"tmp/jest-email-testing_0.1.3_1764635212937_0.661233367075412","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/jest-email-testing","version":"0.3.0","keywords":["jest","email","testing","matchers","plugin","test-assertions"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/jest-email-testing@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"38bd547844d0ad7928e62056ad05a26aa7903b86","tarball":"https://registry.npmjs.org/@bernierllc/jest-email-testing/-/jest-email-testing-0.3.0.tgz","fileCount":51,"integrity":"sha512-4Ssx6CXW14SeR53/j2iKh431wf9eOh4Y3/5cI2sP+QIe0VsdZZ/G2j7Aq6EJ5X+G1ef8h9U5+GXJQrwWYiJSXw==","signatures":[{"sig":"MEUCIQCxBxnOLghPjr53pAh1ll2x2bIV9lZ+HzpvWydxyEwb2QIgEgkNdpbSL78JIVn/1wfXpjZDUxnq8uPOdk4uZe5aHnI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147021},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --runInBand --no-cache","test:coverage":"jest --coverage --runInBand --no-cache"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c382991a-514c-4658-a3ee-410708ecc28e"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/integration/jest-email-testing"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Jest plugin and matchers for comprehensive email testing","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@types/jest":"^29.5.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"jest":"^29.0.0","@jest/globals":"^29.0.0"},"_npmOperationalInternal":{"tmp":"tmp/jest-email-testing_0.3.0_1767642339630_0.35961130506688277","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bernierllc/jest-email-testing","version":"0.3.1","keywords":["jest","email","testing","matchers","plugin","test-assertions"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/jest-email-testing@0.3.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"89130647a778b62d81273f3a5e1d8fb6adf80518","tarball":"https://registry.npmjs.org/@bernierllc/jest-email-testing/-/jest-email-testing-0.3.1.tgz","fileCount":51,"integrity":"sha512-e28quTutnx30gAC8oLqR1hJT8nQmbjcsePcKaZ3O68nPEtH2w7boZDXPQlyjiJBgjWmadqlfWhzSSKicCq+MHg==","signatures":[{"sig":"MEQCIE9CJzTTMvispcZu/JMqmmfseibStD5beZcqiRrr0jf7AiAhpJ0+2xt9u9GSf/lxdGm14P/DERnVNuB995+N/L1kUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146963},"main":"dist/index.js","_from":"file:bernierllc-jest-email-testing-0.3.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --runInBand --no-cache","test:coverage":"jest --coverage --runInBand --no-cache"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c382991a-514c-4658-a3ee-410708ecc28e"}},"_resolved":"/tmp/8ccf966e94e857f5c08508cd51136678/bernierllc-jest-email-testing-0.3.1.tgz","_integrity":"sha512-e28quTutnx30gAC8oLqR1hJT8nQmbjcsePcKaZ3O68nPEtH2w7boZDXPQlyjiJBgjWmadqlfWhzSSKicCq+MHg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/integration/jest-email-testing"},"_npmVersion":"11.11.0","description":"Jest plugin and matchers for comprehensive email testing","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@types/jest":"^29.5.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"jest":"^29.0.0","@jest/globals":"^29.0.0"},"_npmOperationalInternal":{"tmp":"tmp/jest-email-testing_0.3.1_1773078097828_0.07490864727788216","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bernierllc/jest-email-testing","version":"0.3.2","keywords":["jest","email","testing","matchers","plugin","test-assertions"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/jest-email-testing@0.3.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"963a0e0645c95ec91df1a0003cf50fafc9ed3cc8","tarball":"https://registry.npmjs.org/@bernierllc/jest-email-testing/-/jest-email-testing-0.3.2.tgz","fileCount":51,"integrity":"sha512-8cqh79n0+xMdm6VWsd/H2KpG+XQJkxA3US7OKdwQO/yvS+E2Rg2W1e9VAGt/vouajTYd2TWb8b6fhVQipg9zgA==","signatures":[{"sig":"MEQCIEhu4cF+IB8n5hjbNq+1Gyo2RNUgdSrrkGNtH4ZZOPz1AiAwAnsjnDl98stKCcf1/mP+01TC78AhhmpMB0hizDIkAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146963},"main":"dist/index.js","_from":"file:bernierllc-jest-email-testing-0.3.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --runInBand --no-cache","test:coverage":"jest --coverage --runInBand --no-cache"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c382991a-514c-4658-a3ee-410708ecc28e"}},"_resolved":"/home/runner/work/tools/tools/packages/integration/jest-email-testing/bernierllc-jest-email-testing-0.3.2.tgz","_integrity":"sha512-8cqh79n0+xMdm6VWsd/H2KpG+XQJkxA3US7OKdwQO/yvS+E2Rg2W1e9VAGt/vouajTYd2TWb8b6fhVQipg9zgA==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/integration/jest-email-testing"},"_npmVersion":"11.11.0","description":"Jest plugin and matchers for comprehensive email testing","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@types/jest":"^29.5.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"jest":"^29.0.0","@jest/globals":"^29.0.0"},"_npmOperationalInternal":{"tmp":"tmp/jest-email-testing_0.3.2_1773163379353_0.7020137051132218","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bernierllc/jest-email-testing","version":"0.4.0","keywords":["jest","email","testing","matchers","plugin","test-assertions"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/jest-email-testing@0.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"b71dc92109e84dc22c6ebda458590be11c451528","tarball":"https://registry.npmjs.org/@bernierllc/jest-email-testing/-/jest-email-testing-0.4.0.tgz","fileCount":51,"integrity":"sha512-FIwIGlIGCI+eYQZFQK0ZSewxaqSNMQApj1TxgwpaXg+l+8zYiFOrWxdz2sk8WSrviJbiLDG3664ax8KYDq+dYQ==","signatures":[{"sig":"MEMCHwLiiudCAYSq2ee2346nq9qVyBx8YAFmW5JBPVqZCYICIC52qiHEdNlawg9qbm8VGiy2uk1ApvUeCXm38cSnjmii","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146963},"main":"dist/index.js","_from":"file:bernierllc-jest-email-testing-0.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --runInBand --no-cache","test:coverage":"jest --coverage --runInBand --no-cache"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c382991a-514c-4658-a3ee-410708ecc28e"}},"_resolved":"/home/runner/work/tools/tools/packages/integration/jest-email-testing/bernierllc-jest-email-testing-0.4.0.tgz","_integrity":"sha512-FIwIGlIGCI+eYQZFQK0ZSewxaqSNMQApj1TxgwpaXg+l+8zYiFOrWxdz2sk8WSrviJbiLDG3664ax8KYDq+dYQ==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/integration/jest-email-testing"},"_npmVersion":"11.14.1","description":"Jest plugin and matchers for comprehensive email testing","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@types/jest":"^29.5.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"jest":"^29.0.0","@jest/globals":"^29.0.0"},"_npmOperationalInternal":{"tmp":"tmp/jest-email-testing_0.4.0_1779241509971_0.7626523458222572","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/jest-email-testing","version":"0.5.0","description":"Jest plugin and matchers for comprehensive email testing","main":"dist/index.js","types":"dist/index.d.ts","keywords":["jest","email","testing","matchers","plugin","test-assertions"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/integration/jest-email-testing"},"peerDependencies":{"@jest/globals":"^29.0.0","jest":"^29.0.0"},"dependencies":{"@types/jest":"^29.5.0"},"devDependencies":{"@types/node":"^18.15.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.40.0","jest":"^29.5.0","ts-jest":"^29.0.5","typescript":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","test":"jest","test:run":"jest --runInBand --no-cache","test:coverage":"jest --coverage --runInBand --no-cache","lint":"eslint src --ext .ts","clean":"rm -rf dist"},"_id":"@bernierllc/jest-email-testing@0.5.0","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"homepage":"https://github.com/bernierllc/tools#readme","_integrity":"sha512-UIS4J6CyV++01SxGQHoPq1J/78hBrIuZcfs8rjgCTRgzFsyVvGPROq92zYnxKOwMvH/AjyaxmgCm++ieb97uBQ==","_resolved":"/home/runner/work/tools/tools/packages/integration/jest-email-testing/bernierllc-jest-email-testing-0.5.0.tgz","_from":"file:bernierllc-jest-email-testing-0.5.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-UIS4J6CyV++01SxGQHoPq1J/78hBrIuZcfs8rjgCTRgzFsyVvGPROq92zYnxKOwMvH/AjyaxmgCm++ieb97uBQ==","shasum":"d88a306d35885edf5c0c7f1cf31babbc406f5439","tarball":"https://registry.npmjs.org/@bernierllc/jest-email-testing/-/jest-email-testing-0.5.0.tgz","fileCount":51,"unpackedSize":146963,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBK4INWJKV7Bzqn4K23SDkL5EkcMawLTkF4PdcegCXJFAiAxNPNJ9pCrdiIcN+YKZ1Pql9OrfeU7H/Y2eiRySMVkKg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c382991a-514c-4658-a3ee-410708ecc28e"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jest-email-testing_0.5.0_1779250256145_0.5255806227271667"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-02T00:24:16.254Z","modified":"2026-05-20T04:10:56.440Z","0.1.2":"2025-12-02T00:24:16.440Z","0.1.3":"2025-12-02T00:26:53.143Z","0.3.0":"2026-01-05T19:45:39.799Z","0.3.1":"2026-03-09T17:41:37.969Z","0.3.2":"2026-03-10T17:22:59.515Z","0.4.0":"2026-05-20T01:45:10.144Z","0.5.0":"2026-05-20T04:10:56.287Z"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"UNLICENSED","homepage":"https://github.com/bernierllc/tools#readme","keywords":["jest","email","testing","matchers","plugin","test-assertions"],"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/integration/jest-email-testing"},"description":"Jest plugin and matchers for comprehensive email testing","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/jest-email-testing\n\nJest plugin and matchers for comprehensive email testing. Provides custom Jest matchers for email assertions, test utilities, and helpers for common email testing patterns.\n\n## Installation\n\n```bash\nnpm install --save-dev @bernierllc/jest-email-testing\n```\n\n## Usage\n\n### Setup Jest Configuration\n\nAdd to your `jest.config.js`:\n\n```javascript\nmodule.exports = {\n  setupFilesAfterEnv: ['@bernierllc/jest-email-testing/dist/setup.js']\n};\n```\n\n### Use Custom Matchers in Tests\n\n```typescript\nimport { createTestEmail } from '@bernierllc/jest-email-testing';\n\ndescribe('Email Testing', () => {\n  test('should send welcome email', () => {\n    const email = createTestEmail({\n      headers: {\n        from: 'noreply@example.com',\n        to: 'user@example.com',\n        subject: 'Welcome to our service!'\n      },\n      body: {\n        text: 'Welcome! Click to unsubscribe. 123 Main St, CA 94105'\n      }\n    });\n\n    expect(email).toHaveEmailRecipient('user@example.com');\n    expect(email).toHaveEmailSubject(/Welcome/);\n    expect(email).toHaveCompletedTemplate();\n    expect(email).toBeCompliantEmail('US');\n  });\n});\n```\n\n## Custom Matchers\n\n### Basic Email Assertions\n\n#### `toHaveEmailRecipient(email: string)`\n\nChecks if the email has the specified recipient.\n\n```typescript\nexpect(email).toHaveEmailRecipient('user@example.com');\n```\n\n#### `toHaveEmailSender(email: string)`\n\nChecks if the email has the specified sender.\n\n```typescript\nexpect(email).toHaveEmailSender('noreply@example.com');\n```\n\n#### `toHaveEmailSubject(subject: string | RegExp)`\n\nChecks if the email has the specified subject (exact match or regex).\n\n```typescript\nexpect(email).toHaveEmailSubject('Welcome to our service');\nexpect(email).toHaveEmailSubject(/Welcome/);\n```\n\n### Content Assertions\n\n#### `toHaveEmailContent(content: string | RegExp)`\n\nChecks if the email contains the specified content in text or HTML body.\n\n```typescript\nexpect(email).toHaveEmailContent('verification code');\nexpect(email).toHaveEmailContent(/code: \\d+/);\n```\n\n#### `toHaveHtmlContent(html: string | RegExp)`\n\nChecks if the email's HTML body contains the specified content.\n\n```typescript\nexpect(email).toHaveHtmlContent('<div class=\"header\">');\nexpect(email).toHaveHtmlContent(/class=\"header\"/);\n```\n\n#### `toHaveTextContent(text: string | RegExp)`\n\nChecks if the email's text body contains the specified content.\n\n```typescript\nexpect(email).toHaveTextContent('Plain text message');\n```\n\n### Template Assertions\n\n#### `toHaveCompletedTemplate()`\n\nChecks if the email template has all variables replaced (no `{{var}}`, `${var}`, or `%VAR%` patterns).\n\n```typescript\nexpect(email).toHaveCompletedTemplate();\n```\n\n### Compliance Assertions\n\n#### `toBeCompliantEmail(region?: 'US' | 'EU' | 'GLOBAL')`\n\nChecks if the email meets compliance requirements for the specified region.\n\n- **US (CAN-SPAM)**: Requires unsubscribe link + physical address\n- **EU (GDPR)**: Requires unsubscribe link\n- **GLOBAL**: Requires both unsubscribe link + physical address\n\n```typescript\nexpect(email).toBeCompliantEmail('US');\nexpect(email).toBeCompliantEmail('EU');\nexpect(email).toBeCompliantEmail('GLOBAL');\n```\n\n#### `toHaveUnsubscribeLink()`\n\nChecks if the email contains an unsubscribe mechanism.\n\n```typescript\nexpect(email).toHaveUnsubscribeLink();\n```\n\n#### `toHavePhysicalAddress()`\n\nChecks if the email contains a physical address.\n\n```typescript\nexpect(email).toHavePhysicalAddress();\n```\n\n### Attachment Assertions\n\n#### `toHaveAttachment(filename: string)`\n\nChecks if the email has an attachment with the specified filename.\n\n```typescript\nexpect(email).toHaveAttachment('invoice.pdf');\n```\n\n#### `toHaveAttachmentOfType(mimeType: string)`\n\nChecks if the email has an attachment of the specified MIME type.\n\n```typescript\nexpect(email).toHaveAttachmentOfType('application/pdf');\nexpect(email).toHaveAttachmentOfType('image/png');\n```\n\n#### `toHaveAttachmentCount(count: number)`\n\nChecks if the email has the specified number of attachments.\n\n```typescript\nexpect(email).toHaveAttachmentCount(2);\nexpect(email).toHaveAttachmentCount(0);\n```\n\n## Test Utilities\n\n### `createTestEmail(overrides?: Partial<CapturedEmail>)`\n\nCreates a test email object with sensible defaults that can be overridden.\n\n```typescript\nimport { createTestEmail } from '@bernierllc/jest-email-testing';\n\nconst email = createTestEmail({\n  headers: {\n    from: 'custom@example.com',\n    to: 'user@example.com',\n    subject: 'Custom Subject'\n  },\n  body: {\n    text: 'Custom content',\n    html: '<p>Custom HTML</p>'\n  },\n  attachments: [\n    { filename: 'file.pdf', contentType: 'application/pdf', size: 1024 }\n  ]\n});\n```\n\n### `createEmailSnapshot(email: CapturedEmail, region?: ComplianceRegion)`\n\nCreates a normalized snapshot of an email for snapshot testing.\n\n```typescript\nimport { createEmailSnapshot } from '@bernierllc/jest-email-testing';\n\nconst snapshot = createEmailSnapshot(email, 'US');\nexpect(snapshot).toMatchSnapshot();\n```\n\n### `normalizeHtml(html: string | undefined)`\n\nNormalizes HTML content for consistent comparison (removes extra whitespace, normalizes line endings).\n\n```typescript\nimport { normalizeHtml } from '@bernierllc/jest-email-testing';\n\nconst normalized = normalizeHtml('<div>  <p>  Text  </p>  </div>');\n// Returns: '<div><p> Text </p></div>'\n```\n\n### `extractEmailStructure(email: CapturedEmail)`\n\nExtracts structural information from an email.\n\n```typescript\nimport { extractEmailStructure } from '@bernierllc/jest-email-testing';\n\nconst structure = extractEmailStructure(email);\n// Returns: {\n//   hasHtml: true,\n//   hasText: true,\n//   hasAttachments: false,\n//   attachmentCount: 0,\n//   hasUnsubscribeLink: true,\n//   hasPhysicalAddress: true\n// }\n```\n\n### `getComplianceInfo(email: CapturedEmail, region?: ComplianceRegion)`\n\nGets compliance information for an email.\n\n```typescript\nimport { getComplianceInfo } from '@bernierllc/jest-email-testing';\n\nconst info = getComplianceInfo(email, 'US');\n// Returns: {\n//   hasUnsubscribeLink: true,\n//   hasPhysicalAddress: true,\n//   region: 'US',\n//   compliant: true\n// }\n```\n\n### `waitForCondition(condition: () => boolean | Promise<boolean>, timeout?: number, interval?: number)`\n\nWaits for a condition to become true with timeout.\n\n```typescript\nimport { waitForCondition } from '@bernierllc/jest-email-testing';\n\nawait waitForCondition(\n  () => emailsSent.length > 0,\n  5000, // timeout in ms\n  100   // check interval in ms\n);\n```\n\n## API\n\n### Custom Matchers API\n\nAll matchers are automatically registered when you include the setup file in your Jest configuration.\n\n**Available Matchers:**\n- `toHaveEmailRecipient(email: string)` - Verify recipient email address\n- `toHaveEmailSender(email: string)` - Verify sender email address\n- `toHaveEmailSubject(subject: string | RegExp)` - Verify subject line\n- `toHaveEmailContent(content: string | RegExp)` - Verify email content\n- `toHaveHtmlContent(html: string | RegExp)` - Verify HTML body content\n- `toHaveTextContent(text: string | RegExp)` - Verify text body content\n- `toHaveCompletedTemplate()` - Verify template variables are replaced\n- `toBeCompliantEmail(region?: 'US' | 'EU' | 'GLOBAL')` - Verify compliance requirements\n- `toHaveUnsubscribeLink()` - Verify unsubscribe mechanism exists\n- `toHavePhysicalAddress()` - Verify physical address exists\n- `toHaveAttachment(filename: string)` - Verify attachment by filename\n- `toHaveAttachmentOfType(mimeType: string)` - Verify attachment by MIME type\n- `toHaveAttachmentCount(count: number)` - Verify number of attachments\n\n### Utility Functions API\n\n**Email Creation:**\n- `createTestEmail(overrides?: Partial<CapturedEmail>): CapturedEmail` - Create test email with defaults\n\n**Email Analysis:**\n- `extractEmailStructure(email: CapturedEmail): EmailStructure` - Extract structural information\n- `getComplianceInfo(email: CapturedEmail, region?: ComplianceRegion): ComplianceInfo` - Get compliance status\n- `createEmailSnapshot(email: CapturedEmail, region?: ComplianceRegion): EmailSnapshot` - Create snapshot for testing\n\n**Content Normalization:**\n- `normalizeHtml(html: string | undefined): string` - Normalize HTML for comparison\n\n**Test Helpers:**\n- `waitForCondition(condition: () => boolean | Promise<boolean>, timeout?: number, interval?: number): Promise<void>` - Wait for async condition\n\n## Integration Documentation\n\n### Logger Integration\n\nThis package supports optional integration with `@bernierllc/logger`:\n\n```typescript\nimport { detectLogger } from '@bernierllc/jest-email-testing';\n\n// Auto-detect logger (optional)\nconst logger = await detectLogger();\nif (logger) {\n  logger.debug('Using jest-email-testing matchers');\n}\n```\n\n**Logger Detection:** The package will automatically detect and use `@bernierllc/logger` if available in your project. If not found, the package operates normally without logging.\n\n**Graceful Degradation:** All functionality works without a logger. Logging is purely optional and used for debugging test execution.\n\n### NeverHub Integration\n\nThis package supports optional integration with `@bernierllc/neverhub-adapter`:\n\n```typescript\nimport { detectNeverHub } from '@bernierllc/jest-email-testing';\n\n// Auto-detect NeverHub (optional)\nconst neverhub = await detectNeverHub();\nif (neverhub) {\n  await neverhub.register({\n    type: 'jest-email-testing',\n    capabilities: ['email-matchers', 'compliance-checking']\n  });\n}\n```\n\n**NeverHub Detection:** The package will automatically detect and register with `@bernierllc/neverhub-adapter` if available. This enables enhanced email testing features and centralized test result tracking.\n\n**Graceful Degradation:** All core functionality (matchers, utilities, compliance checking) works without NeverHub. Integration features are additive only.\n\n### Integration Best Practices\n\n1. **Optional Dependencies:** Both logger and NeverHub integrations are optional. Install them only if needed:\n   ```bash\n   npm install --save-dev @bernierllc/logger @bernierllc/neverhub-adapter\n   ```\n\n2. **Auto-Detection:** Detection happens automatically at setup. No manual configuration required.\n\n3. **Environment Variables:** Control integration behavior via environment:\n   ```bash\n   DISABLE_LOGGER=true npm test  # Disable logger even if available\n   DISABLE_NEVERHUB=true npm test  # Disable NeverHub even if available\n   ```\n\n## TypeScript Support\n\nFull TypeScript support with type definitions included.\n\n```typescript\nimport type {\n  CapturedEmail,\n  EmailCriteria,\n  ComplianceRegion,\n  EmailSnapshot,\n  EmailStructure,\n  ComplianceInfo\n} from '@bernierllc/jest-email-testing';\n```\n\n## Testing Patterns\n\n### Template Testing\n\n```typescript\ndescribe('Email Templates', () => {\n  test('welcome email template', () => {\n    const email = createTestEmail({\n      body: {\n        text: 'Hello John, welcome to our service!'\n      }\n    });\n\n    expect(email).toHaveCompletedTemplate();\n    expect(email).toHaveEmailContent('welcome');\n  });\n\n  test('should reject unreplaced variables', () => {\n    const email = createTestEmail({\n      body: {\n        text: 'Hello {{name}}, welcome!'\n      }\n    });\n\n    expect(email).not.toHaveCompletedTemplate();\n  });\n});\n```\n\n### Compliance Testing\n\n```typescript\ndescribe('Email Compliance', () => {\n  test('marketing email should be CAN-SPAM compliant', () => {\n    const email = createTestEmail({\n      body: {\n        text: 'Newsletter content. Unsubscribe here. 123 Main St, CA 94105'\n      }\n    });\n\n    expect(email).toBeCompliantEmail('US');\n    expect(email).toHaveUnsubscribeLink();\n    expect(email).toHavePhysicalAddress();\n  });\n\n  test('EU email should have unsubscribe', () => {\n    const email = createTestEmail({\n      body: { text: 'Content. Click to unsubscribe.' }\n    });\n\n    expect(email).toBeCompliantEmail('EU');\n  });\n});\n```\n\n### Attachment Testing\n\n```typescript\ndescribe('Email Attachments', () => {\n  test('invoice email should have PDF attachment', () => {\n    const email = createTestEmail({\n      attachments: [\n        { filename: 'invoice.pdf', contentType: 'application/pdf', size: 1024 }\n      ]\n    });\n\n    expect(email).toHaveAttachment('invoice.pdf');\n    expect(email).toHaveAttachmentOfType('application/pdf');\n    expect(email).toHaveAttachmentCount(1);\n  });\n});\n```\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n\nThis file is licensed to the client under a limited-use license. The client may use and modify this code *only within the scope of the project it was delivered for*. Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n","readmeFilename":"README.md"}