{"version":3,"sources":["../src/global-setup.ts","../src/server/process.ts","../src/server/binary.ts","../src/server/provider-mock.ts"],"sourcesContent":["import { startMailpit } from './server/process';\n\nfunction envInt(name: string): number | undefined {\n  const v = process.env[name];\n  return v ? Number(v) : undefined;\n}\n\n/**\n * Optional Playwright globalSetup that provides ONE Mailpit shared by the\n * whole run — use this when your app is started once via `webServer` and\n * needs a single SMTP endpoint.\n *\n * IMPORTANT: Playwright may start `webServer` before globalSetup runs, so\n * env vars set here do NOT reliably reach your app. Pin the ports in your\n * config and pass them to the app explicitly:\n *\n *   // playwright.config.ts\n *   process.env.PLAYWRIGHT_EMAIL_SMTP_PORT = '2525';\n *   process.env.PLAYWRIGHT_EMAIL_HTTP_PORT = '8025';\n *\n *   export default defineConfig({\n *     globalSetup: require.resolve('playwright-email/global-setup'),\n *     webServer: {\n *       command: 'npm run start:app',\n *       env: { SMTP_HOST: '127.0.0.1', SMTP_PORT: '2525' },\n *     },\n *   });\n *\n * If PLAYWRIGHT_EMAIL_URL is already set (docker-compose, staging), nothing\n * is spawned — the fixtures connect to that instance instead.\n */\nexport default async function globalSetup(): Promise<() => Promise<void>> {\n  // PLAYWRIGHT_EMAIL_PROVIDER_PORT pins the provider-API mock (SendGrid/\n  // Resend/Postmark) on a known port so a webServer app can be pointed at it.\n  const providerPort = envInt('PLAYWRIGHT_EMAIL_PROVIDER_PORT');\n  const providerMock = providerPort ? { port: providerPort } : undefined;\n\n  if (process.env.PLAYWRIGHT_EMAIL_URL) {\n    // External instance: verify it is reachable (and start the provider mock\n    // against it when requested).\n    const server = await startMailpit({\n      url: process.env.PLAYWRIGHT_EMAIL_URL,\n      smtpHost: process.env.PLAYWRIGHT_EMAIL_SMTP_HOST,\n      smtpPort: envInt('PLAYWRIGHT_EMAIL_SMTP_PORT'),\n      providerMock,\n    });\n    process.env.PLAYWRIGHT_EMAIL_SMTP_HOST = server.smtpHost;\n    process.env.PLAYWRIGHT_EMAIL_SMTP_PORT = String(server.smtpPort);\n    if (server.providerMock) process.env.PLAYWRIGHT_EMAIL_PROVIDER_URL = server.providerMock.url;\n    return async () => {\n      await server.stop();\n    };\n  }\n\n  const server = await startMailpit({\n    version: process.env.PLAYWRIGHT_EMAIL_MAILPIT_VERSION,\n    smtpPort: envInt('PLAYWRIGHT_EMAIL_SMTP_PORT'),\n    httpPort: envInt('PLAYWRIGHT_EMAIL_HTTP_PORT'),\n    providerMock,\n  });\n  // Workers inherit these and connect to the shared instance.\n  process.env.PLAYWRIGHT_EMAIL_URL = server.url;\n  process.env.PLAYWRIGHT_EMAIL_SMTP_HOST = server.smtpHost;\n  process.env.PLAYWRIGHT_EMAIL_SMTP_PORT = String(server.smtpPort);\n  if (server.providerMock) process.env.PLAYWRIGHT_EMAIL_PROVIDER_URL = server.providerMock.url;\n  return async () => {\n    await server.stop();\n  };\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport { mkdtemp, rm } from 'node:fs/promises';\nimport net from 'node:net';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { ensureMailpit } from './binary';\nimport { startProviderMock } from './provider-mock';\nimport type { EmailServerOptions } from '../types';\n\n/** A running (or externally provided) Mailpit instance. */\nexport interface MailpitHandle {\n  /** Base URL of the Mailpit HTTP API/UI, e.g. http://127.0.0.1:54321 */\n  url: string;\n  httpPort: number;\n  /** Host the app under test should send SMTP to. */\n  smtpHost: string;\n  /** Port the app under test should send SMTP to. */\n  smtpPort: number;\n  /** True when connected to a user-provided instance we must not stop. */\n  external: boolean;\n  /** The provider-API mock (SendGrid/Resend/Postmark), when enabled. */\n  providerMock?: { url: string; port: number };\n  stop(): Promise<void>;\n}\n\n/**\n * Attach the provider mock to a handle: reuse the one advertised via\n * PLAYWRIGHT_EMAIL_PROVIDER_URL (started by global-setup or the CLI), or\n * start one owned by this handle when the option asks for it.\n */\nasync function attachProviderMock(handle: MailpitHandle, opts: EmailServerOptions): Promise<MailpitHandle> {\n  const envUrl = process.env.PLAYWRIGHT_EMAIL_PROVIDER_URL;\n  if (envUrl) {\n    const parsed = new URL(envUrl);\n    handle.providerMock = { url: envUrl.replace(/\\/+$/, ''), port: Number(parsed.port) || 80 };\n    return handle;\n  }\n  if (!opts.providerMock) return handle;\n  const mock = await startProviderMock(handle.url, typeof opts.providerMock === 'object' ? opts.providerMock : {});\n  handle.providerMock = { url: mock.url, port: mock.port };\n  const stopServer = handle.stop;\n  handle.stop = async () => {\n    await mock.stop();\n    await stopServer();\n  };\n  return handle;\n}\n\nfunction delay(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Reserve two distinct free ports by holding both listeners open at once. */\nasync function twoFreePorts(): Promise<[number, number]> {\n  const listen = (): Promise<net.Server> =>\n    new Promise((resolve, reject) => {\n      const srv = net.createServer();\n      srv.once('error', reject);\n      srv.listen(0, '127.0.0.1', () => resolve(srv));\n    });\n  const close = (srv: net.Server): Promise<void> =>\n    new Promise((resolve) => srv.close(() => resolve()));\n\n  const [a, b] = await Promise.all([listen(), listen()]);\n  const portA = (a.address() as net.AddressInfo).port;\n  const portB = (b.address() as net.AddressInfo).port;\n  await Promise.all([close(a), close(b)]);\n  return [portA, portB];\n}\n\nasync function isReady(url: string): Promise<boolean> {\n  try {\n    const res = await fetch(`${url}/api/v1/info`, { signal: AbortSignal.timeout(2000) });\n    return res.ok;\n  } catch {\n    return false;\n  }\n}\n\nasync function waitUntilReady(\n  url: string,\n  timeoutMs: number,\n  hasExited: () => boolean,\n  getLogs: () => string,\n): Promise<void> {\n  const deadline = Date.now() + timeoutMs;\n  while (Date.now() < deadline) {\n    if (hasExited()) {\n      throw new Error(`playwright-email: Mailpit exited before becoming ready.\\n${getLogs()}`);\n    }\n    if (await isReady(url)) return;\n    await delay(100);\n  }\n  throw new Error(`playwright-email: Mailpit did not become ready within ${timeoutMs}ms at ${url}.\\n${getLogs()}`);\n}\n\n// Kill any still-running Mailpit children if the runner process itself dies.\nconst liveChildren = new Set<ChildProcess>();\nlet exitHookInstalled = false;\nfunction installExitHook(): void {\n  if (exitHookInstalled) return;\n  exitHookInstalled = true;\n  process.on('exit', () => {\n    for (const child of liveChildren) child.kill('SIGKILL');\n  });\n}\n\n/**\n * Start (or connect to) a Mailpit instance.\n *\n * With no options, downloads the pinned Mailpit release on first use and\n * spawns it on two free localhost ports with an isolated temp database.\n * With `url`, connects to an existing instance and never stops it.\n */\nexport async function startMailpit(opts: EmailServerOptions = {}): Promise<MailpitHandle> {\n  if (opts.url) {\n    const url = opts.url.replace(/\\/+$/, '');\n    const deadline = Date.now() + (opts.startTimeout ?? 15_000);\n    while (!(await isReady(url))) {\n      if (Date.now() > deadline) {\n        throw new Error(`playwright-email: cannot reach external Mailpit at ${url}/api/v1/info`);\n      }\n      await delay(200);\n    }\n    return attachProviderMock(\n      {\n        url,\n        httpPort: Number(new URL(url).port) || 80,\n        smtpHost: opts.smtpHost ?? new URL(url).hostname,\n        smtpPort: opts.smtpPort ?? 1025,\n        external: true,\n        stop: async () => {},\n      },\n      opts,\n    );\n  }\n\n  // A healthy instance already listening on the pinned HTTP port (e.g. one\n  // started with `npx playwright-email start` for live debugging) is reused\n  // instead of failing on a busy port — and never stopped by us.\n  if (opts.httpPort) {\n    const url = `http://127.0.0.1:${opts.httpPort}`;\n    if (await isReady(url)) {\n      return attachProviderMock(\n        {\n          url,\n          httpPort: opts.httpPort,\n          smtpHost: opts.smtpHost ?? '127.0.0.1',\n          smtpPort: opts.smtpPort ?? 1025,\n          external: true,\n          stop: async () => {},\n        },\n        opts,\n      );\n    }\n  }\n\n  const binary = await ensureMailpit(opts);\n  installExitHook();\n\n  let lastError: unknown;\n  for (let attempt = 0; attempt < 3; attempt++) {\n    const [freeA, freeB] = await twoFreePorts();\n    const smtpPort = opts.smtpPort ?? freeA;\n    const httpPort = opts.httpPort ?? freeB;\n    const dataDir = await mkdtemp(path.join(os.tmpdir(), 'playwright-email-'));\n    const args = [\n      '--smtp', `127.0.0.1:${smtpPort}`,\n      '--listen', `127.0.0.1:${httpPort}`,\n      '--database', path.join(dataDir, 'mailpit.db'),\n      ...(opts.args ?? []),\n    ];\n\n    const child = spawn(binary, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n    liveChildren.add(child);\n\n    const logs: string[] = [];\n    const pushLog = (chunk: Buffer) => {\n      logs.push(chunk.toString());\n      if (logs.length > 200) logs.shift();\n    };\n    child.stdout?.on('data', pushLog);\n    child.stderr?.on('data', pushLog);\n\n    let exited = false;\n    const exitPromise = new Promise<void>((resolve) => {\n      child.once('exit', () => {\n        exited = true;\n        liveChildren.delete(child);\n        resolve();\n      });\n    });\n\n    const url = `http://127.0.0.1:${httpPort}`;\n    const cleanup = async () => {\n      if (!exited) {\n        child.kill();\n        await Promise.race([exitPromise, delay(3000)]);\n      }\n      if (!exited) {\n        child.kill('SIGKILL');\n        await Promise.race([exitPromise, delay(2000)]);\n      }\n      await rm(dataDir, { recursive: true, force: true }).catch(() => {});\n    };\n\n    try {\n      await waitUntilReady(url, opts.startTimeout ?? 15_000, () => exited, () => logs.join(''));\n      return await attachProviderMock(\n        {\n          url,\n          httpPort,\n          smtpHost: '127.0.0.1',\n          smtpPort,\n          external: false,\n          stop: cleanup,\n        },\n        opts,\n      );\n    } catch (err) {\n      // Most likely a port-allocation race with another process — retry.\n      lastError = err;\n      await cleanup();\n    }\n  }\n  throw lastError;\n}\n","import { spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { createReadStream, createWriteStream } from 'node:fs';\nimport { chmod, mkdir, rm, stat } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\n\nexport const DEFAULT_MAILPIT_VERSION = 'v1.30.4';\n\nconst DEFAULT_DOWNLOAD_BASE = 'https://github.com/axllent/mailpit/releases/download';\n\n/**\n * SHA256 digests of the official release assets for the pinned version,\n * taken from the GitHub release metadata. Downloads are verified against\n * these; for other versions the digest is looked up from the GitHub API at\n * runtime (best effort).\n */\nconst KNOWN_CHECKSUMS: Record<string, Record<string, string>> = {\n  'v1.30.4': {\n    'mailpit-darwin-amd64.tar.gz': '67abb8dfd693eb2a511d6860b33c87bbbdfcf0a0eb7f494134a354e186b4e79b',\n    'mailpit-darwin-arm64.tar.gz': 'a8181bbed0e6f82961abbe64df47657efaf53ac7cc0673fb34f0114c925cdaad',\n    'mailpit-linux-386.tar.gz': '0441ee80b5157e037030080a6d26a25874a82d7b4f266370a187cd97918d8049',\n    'mailpit-linux-amd64.tar.gz': 'e9c104154c22b83ac4c7d19f9d665a5c933585a3caafcd790805d732fa8d03fb',\n    'mailpit-linux-arm.tar.gz': 'c6916cc26b91bb73cf49820d133d66f901a4ef7459f84efd5c62e5d814b1aaf4',\n    'mailpit-linux-arm64.tar.gz': '27f6556c4d922d5ee2afb8b85a799dc2445b894782e7ec0196a566598d107221',\n    'mailpit-windows-amd64.zip': '151378799345709c00e287a1b00bfee6f7ce5f5e8d0c00cc4133e3bbf2eaabdb',\n    'mailpit-windows-arm64.zip': '673487b82d979034d7ac6b9e8cbafeb7fcfd4d84bc9b6c619132c211d3dce0d7',\n  },\n};\n\nconst PLATFORM_MAP: Partial<Record<NodeJS.Platform, string>> = {\n  win32: 'windows',\n  darwin: 'darwin',\n  linux: 'linux',\n};\n\nconst ARCH_MAP: Partial<Record<string, string>> = {\n  x64: 'amd64',\n  arm64: 'arm64',\n  ia32: '386',\n  arm: 'arm',\n};\n\nexport function defaultCacheDir(): string {\n  if (process.env.PLAYWRIGHT_EMAIL_CACHE_DIR) return process.env.PLAYWRIGHT_EMAIL_CACHE_DIR;\n  if (process.platform === 'win32' && process.env.LOCALAPPDATA) {\n    return path.join(process.env.LOCALAPPDATA, 'playwright-email');\n  }\n  const base = process.env.XDG_CACHE_HOME ?? path.join(os.homedir(), '.cache');\n  return path.join(base, 'playwright-email');\n}\n\nasync function exists(p: string): Promise<boolean> {\n  try {\n    await stat(p);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction delay(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst LOCK_STALE_MS = 3 * 60_000;\n\n/** Atomic cross-process lock via mkdir. Returns true if we own the lock. */\nasync function acquireLock(lockDir: string): Promise<boolean> {\n  for (let attempt = 0; attempt < 2; attempt++) {\n    try {\n      await mkdir(lockDir);\n      return true;\n    } catch {\n      try {\n        const s = await stat(lockDir);\n        if (Date.now() - s.mtimeMs > LOCK_STALE_MS) {\n          await rm(lockDir, { recursive: true, force: true });\n          continue; // retry acquisition after removing a stale lock\n        }\n      } catch {\n        continue; // lock vanished between mkdir and stat — retry\n      }\n      return false;\n    }\n  }\n  return false;\n}\n\nexport async function computeSha256(filePath: string): Promise<string> {\n  const hash = createHash('sha256');\n  await pipeline(createReadStream(filePath), hash);\n  return hash.digest('hex');\n}\n\n/** Throws (and deletes the file) when its SHA256 does not match. */\nexport async function verifyChecksum(filePath: string, expectedHex: string): Promise<void> {\n  const actual = await computeSha256(filePath);\n  if (actual !== expectedHex.toLowerCase()) {\n    await rm(filePath, { force: true });\n    throw new Error(\n      `playwright-email: checksum mismatch for ${path.basename(filePath)} — expected ${expectedHex}, got ${actual}. ` +\n        'The download may be corrupted or tampered with; the file has been deleted.',\n    );\n  }\n}\n\nasync function lookupDigest(version: string, asset: string): Promise<string | undefined> {\n  const known = KNOWN_CHECKSUMS[version]?.[asset];\n  if (known) return known;\n  try {\n    const res = await fetch(`https://api.github.com/repos/axllent/mailpit/releases/tags/${version}`, {\n      signal: AbortSignal.timeout(10_000),\n    });\n    if (!res.ok) return undefined;\n    const release = (await res.json()) as { assets?: Array<{ name: string; digest?: string | null }> };\n    const digest = release.assets?.find((a) => a.name === asset)?.digest;\n    return digest?.startsWith('sha256:') ? digest.slice('sha256:'.length) : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nasync function download(url: string, dest: string): Promise<void> {\n  const res = await fetch(url, { redirect: 'follow' });\n  if (!res.ok || !res.body) {\n    throw new Error(`playwright-email: failed to download Mailpit from ${url} (HTTP ${res.status})`);\n  }\n  await pipeline(Readable.fromWeb(res.body as import('node:stream/web').ReadableStream), createWriteStream(dest));\n}\n\nfunction extract(archivePath: string, destDir: string): void {\n  // System tar handles .tar.gz everywhere; on Windows 10+ tar.exe is bsdtar,\n  // which extracts .zip as well.\n  const tar = spawnSync('tar', ['-xf', archivePath, '-C', destDir], { encoding: 'utf8' });\n  if (tar.status === 0) return;\n\n  if (process.platform === 'win32' && archivePath.endsWith('.zip')) {\n    const ps = spawnSync(\n      'powershell.exe',\n      ['-NoProfile', '-Command', `Expand-Archive -LiteralPath \"${archivePath}\" -DestinationPath \"${destDir}\" -Force`],\n      { encoding: 'utf8' },\n    );\n    if (ps.status === 0) return;\n    throw new Error(`playwright-email: failed to extract ${archivePath}: ${ps.stderr || tar.stderr}`);\n  }\n  throw new Error(`playwright-email: failed to extract ${archivePath}: ${tar.stderr ?? 'tar not found'}`);\n}\n\n/**\n * Ensure the Mailpit binary for this platform is present in the cache,\n * downloading it from GitHub releases on first use. Returns the binary path.\n */\nexport async function ensureMailpit(opts: { version?: string; cacheDir?: string } = {}): Promise<string> {\n  // Air-gapped / bring-your-own-binary escape hatch (e.g. installed via a\n  // package manager or baked into a Docker image).\n  if (process.env.PLAYWRIGHT_EMAIL_BINARY) {\n    const custom = process.env.PLAYWRIGHT_EMAIL_BINARY;\n    try {\n      await stat(custom);\n    } catch {\n      throw new Error(`playwright-email: PLAYWRIGHT_EMAIL_BINARY points to \"${custom}\" but no file exists there`);\n    }\n    return custom;\n  }\n\n  const version = opts.version ?? DEFAULT_MAILPIT_VERSION;\n  const platform = PLATFORM_MAP[process.platform];\n  const arch = ARCH_MAP[process.arch];\n  if (!platform || !arch) {\n    throw new Error(`playwright-email: unsupported platform ${process.platform}/${process.arch}`);\n  }\n\n  const dir = path.join(opts.cacheDir ?? defaultCacheDir(), version);\n  const binPath = path.join(dir, process.platform === 'win32' ? 'mailpit.exe' : 'mailpit');\n  if (await exists(binPath)) return binPath;\n\n  await mkdir(dir, { recursive: true });\n  const lockDir = path.join(dir, '.download-lock');\n\n  if (!(await acquireLock(lockDir))) {\n    // Another process is downloading — wait for the binary to appear.\n    const deadline = Date.now() + 120_000;\n    while (Date.now() < deadline) {\n      if (await exists(binPath)) return binPath;\n      await delay(250);\n    }\n    throw new Error('playwright-email: timed out waiting for another process to download Mailpit');\n  }\n\n  try {\n    if (await exists(binPath)) return binPath; // lost a race before locking\n\n    const ext = platform === 'windows' ? '.zip' : '.tar.gz';\n    const asset = `mailpit-${platform}-${arch}${ext}`;\n    const base = process.env.PLAYWRIGHT_EMAIL_DOWNLOAD_BASE?.replace(/\\/+$/, '') ?? DEFAULT_DOWNLOAD_BASE;\n    const url = `${base}/${version}/${asset}`;\n    const archivePath = path.join(dir, `${asset}.tmp`);\n\n    await download(url, archivePath);\n    const expected = await lookupDigest(version, asset);\n    if (expected) {\n      await verifyChecksum(archivePath, expected);\n    } else {\n      console.warn(`playwright-email: no SHA256 digest available for ${asset}@${version}; skipping verification.`);\n    }\n    extract(archivePath, dir);\n    await rm(archivePath, { force: true });\n\n    if (!(await exists(binPath))) {\n      throw new Error(`playwright-email: archive extracted but ${binPath} not found`);\n    }\n    if (process.platform !== 'win32') await chmod(binPath, 0o755);\n    return binPath;\n  } finally {\n    await rm(lockDir, { recursive: true, force: true });\n  }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\n\n/**\n * A tiny HTTP server that impersonates the send endpoints of popular\n * transactional-email providers and injects the messages into Mailpit.\n *\n * Modern apps often send email through a provider's REST API instead of\n * SMTP — for those apps an SMTP catcher alone never sees any mail. Point the\n * SDK's base URL at this mock and every \"sent\" email lands in the test\n * server, ready for `inbox.waitForEmail()`:\n *\n *   SendGrid  POST /v3/mail/send   -> 202 + X-Message-Id\n *   Resend    POST /emails         -> 200 { id }\n *   Postmark  POST /email          -> 200 { MessageID, ErrorCode: 0, ... }\n *\n * Authorization headers are accepted but not validated.\n */\nexport interface ProviderMockHandle {\n  url: string;\n  port: number;\n  stop(): Promise<void>;\n}\n\ninterface Address {\n  Email: string;\n  Name: string;\n}\n\ninterface MailpitSendRequest {\n  From: Address;\n  To: Address[];\n  Cc?: Address[];\n  Bcc?: string[];\n  Subject: string;\n  HTML?: string;\n  Text?: string;\n  ReplyTo?: Address[];\n}\n\n/** Parse 'Name <a@b>' or plain 'a@b' into a Mailpit address. */\nfunction parseAddress(value: string): Address {\n  const match = /^\\s*(?:\"?([^\"<]*)\"?\\s*)?<([^>]+)>\\s*$/.exec(value);\n  if (match) return { Email: match[2]!.trim(), Name: (match[1] ?? '').trim() };\n  return { Email: value.trim(), Name: '' };\n}\n\nfunction toList(value: string | string[] | undefined): Address[] {\n  if (!value) return [];\n  const items = Array.isArray(value) ? value : value.split(',');\n  return items.map((v) => parseAddress(v)).filter((a) => a.Email);\n}\n\n// --- per-provider payload translators ---------------------------------------\n\ninterface SendGridPayload {\n  personalizations?: Array<{\n    to?: Array<{ email: string; name?: string }>;\n    cc?: Array<{ email: string; name?: string }>;\n    bcc?: Array<{ email: string; name?: string }>;\n    subject?: string;\n  }>;\n  from?: { email: string; name?: string };\n  reply_to?: { email: string; name?: string };\n  subject?: string;\n  content?: Array<{ type: string; value: string }>;\n}\n\nfunction fromSendGrid(body: SendGridPayload): MailpitSendRequest {\n  const p = body.personalizations ?? [];\n  const objAddr = (a: { email: string; name?: string }): Address => ({ Email: a.email, Name: a.name ?? '' });\n  return {\n    From: body.from ? objAddr(body.from) : { Email: 'unknown@sendgrid.mock', Name: '' },\n    To: p.flatMap((x) => (x.to ?? []).map(objAddr)),\n    Cc: p.flatMap((x) => (x.cc ?? []).map(objAddr)),\n    Bcc: p.flatMap((x) => (x.bcc ?? []).map((a) => a.email)),\n    Subject: p[0]?.subject ?? body.subject ?? '',\n    HTML: body.content?.find((c) => c.type === 'text/html')?.value,\n    Text: body.content?.find((c) => c.type === 'text/plain')?.value,\n    ReplyTo: body.reply_to ? [objAddr(body.reply_to)] : undefined,\n  };\n}\n\ninterface ResendPayload {\n  from?: string;\n  to?: string | string[];\n  cc?: string | string[];\n  bcc?: string | string[];\n  reply_to?: string | string[];\n  subject?: string;\n  html?: string;\n  text?: string;\n}\n\nfunction fromResend(body: ResendPayload): MailpitSendRequest {\n  return {\n    From: parseAddress(body.from ?? 'unknown@resend.mock'),\n    To: toList(body.to),\n    Cc: toList(body.cc),\n    Bcc: toList(body.bcc).map((a) => a.Email),\n    Subject: body.subject ?? '',\n    HTML: body.html,\n    Text: body.text,\n    ReplyTo: body.reply_to ? toList(body.reply_to) : undefined,\n  };\n}\n\ninterface PostmarkPayload {\n  From?: string;\n  To?: string;\n  Cc?: string;\n  Bcc?: string;\n  ReplyTo?: string;\n  Subject?: string;\n  HtmlBody?: string;\n  TextBody?: string;\n}\n\nfunction fromPostmark(body: PostmarkPayload): MailpitSendRequest {\n  return {\n    From: parseAddress(body.From ?? 'unknown@postmark.mock'),\n    To: toList(body.To),\n    Cc: toList(body.Cc),\n    Bcc: toList(body.Bcc).map((a) => a.Email),\n    Subject: body.Subject ?? '',\n    HTML: body.HtmlBody,\n    Text: body.TextBody,\n    ReplyTo: body.ReplyTo ? toList(body.ReplyTo) : undefined,\n  };\n}\n\n// -----------------------------------------------------------------------------\n\nasync function readJson(req: IncomingMessage): Promise<unknown> {\n  let raw = '';\n  for await (const chunk of req) raw += chunk;\n  return raw ? JSON.parse(raw) : {};\n}\n\nasync function inject(mailpitUrl: string, mail: MailpitSendRequest): Promise<string> {\n  if (mail.To.length === 0) throw new Error('no recipients in payload');\n  const res = await fetch(`${mailpitUrl}/api/v1/send`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(mail),\n  });\n  if (!res.ok) {\n    throw new Error(`Mailpit rejected the message (HTTP ${res.status}): ${await res.text()}`);\n  }\n  const data = (await res.json()) as { ID?: string };\n  return data.ID ?? 'unknown';\n}\n\nconst INFO = {\n  service: 'playwright-email provider mock',\n  endpoints: {\n    sendgrid: 'POST /v3/mail/send',\n    resend: 'POST /emails',\n    postmark: 'POST /email',\n  },\n};\n\nexport async function startProviderMock(\n  mailpitUrl: string,\n  opts: { port?: number } = {},\n): Promise<ProviderMockHandle> {\n  const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n    const json = (status: number, body: unknown, headers: Record<string, string> = {}) => {\n      res.writeHead(status, { 'Content-Type': 'application/json', ...headers });\n      res.end(JSON.stringify(body));\n    };\n\n    try {\n      const route = `${req.method} ${new URL(req.url ?? '/', 'http://localhost').pathname}`;\n\n      if (route === 'GET /') return json(200, INFO);\n\n      if (route === 'POST /v3/mail/send') {\n        const id = await inject(mailpitUrl, fromSendGrid((await readJson(req)) as SendGridPayload));\n        res.writeHead(202, { 'X-Message-Id': id });\n        return res.end();\n      }\n\n      if (route === 'POST /emails') {\n        const id = await inject(mailpitUrl, fromResend((await readJson(req)) as ResendPayload));\n        return json(200, { id });\n      }\n\n      if (route === 'POST /email') {\n        const body = (await readJson(req)) as PostmarkPayload;\n        const id = await inject(mailpitUrl, fromPostmark(body));\n        return json(200, {\n          To: body.To ?? '',\n          SubmittedAt: new Date().toISOString(),\n          MessageID: id,\n          ErrorCode: 0,\n          Message: 'OK',\n        });\n      }\n\n      return json(404, {\n        error: `playwright-email provider mock: unsupported endpoint \"${route}\"`,\n        supported: INFO.endpoints,\n      });\n    } catch (err) {\n      return json(400, { error: err instanceof Error ? err.message : String(err) });\n    }\n  });\n\n  await new Promise<void>((resolve, reject) => {\n    server.once('error', reject);\n    server.listen(opts.port ?? 0, '127.0.0.1', () => resolve());\n  });\n\n  const port = (server.address() as { port: number }).port;\n  return {\n    url: `http://127.0.0.1:${port}`,\n    port,\n    stop: () => new Promise<void>((resolve) => server.close(() => resolve())),\n  };\n}\n"],"mappings":"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","names":["import_node_child_process","import_promises","import_node_os","import_node_path","import_promises","path","os","delay","net","path","os","server"]}