{"version":3,"sources":["../src/playwright/setupClerkTestingToken.ts"],"sourcesContent":["import type { BrowserContext, Page } from '@playwright/test';\n\nimport type { SetupClerkTestingTokenOptions } from '../common';\nimport { ERROR_MISSING_FRONTEND_API_URL, TESTING_TOKEN_PARAM } from '../common';\n\ntype SetupClerkTestingTokenParams = {\n  context?: BrowserContext;\n  page?: Page;\n  options?: SetupClerkTestingTokenOptions;\n};\n\n/**\n * Bypasses bot protection by appending the testing token in the Frontend API requests.\n *\n * @param params.context - The Playwright browser context object.\n * @param params.page - The Playwright page object.\n * @param params.options.frontendApiUrl - The frontend API URL for your Clerk dev instance, without the protocol.\n * @returns A promise that resolves when the bot protection bypass is set up.\n * @throws An error if the Frontend API URL is not provided.\n * @example\n * import { setupClerkTestingToken } from '@clerk/testing/playwright';\n *\n * test('should bypass bot protection', async ({ context }) => {\n *    await setupClerkTestingToken({ context });\n *    const page = await context.newPage();\n *    await page.goto('https://your-app.com');\n *    // Continue with your test...\n *  });\n */\nexport const setupClerkTestingToken = async ({ context, options, page }: SetupClerkTestingTokenParams) => {\n  const browserContext = context ?? page?.context();\n\n  if (!browserContext) {\n    throw new Error('Either context or page must be provided to setup testing token');\n  }\n\n  const fapiUrl = options?.frontendApiUrl || process.env.CLERK_FAPI;\n  if (!fapiUrl) {\n    throw new Error(ERROR_MISSING_FRONTEND_API_URL);\n  }\n  const apiUrl = `https://${fapiUrl}/v1/**/*`;\n\n  await browserContext.route(apiUrl, async route => {\n    const originalUrl = new URL(route.request().url());\n    const testingToken = process.env.CLERK_TESTING_TOKEN;\n\n    if (testingToken) {\n      originalUrl.searchParams.set(TESTING_TOKEN_PARAM, testingToken);\n    }\n\n    try {\n      const response = await route.fetch({\n        url: originalUrl.toString(),\n      });\n\n      const json = await response.json();\n\n      // Override captcha_bypass in /v1/client\n      if (json?.response?.captcha_bypass === false) {\n        json.response.captcha_bypass = true;\n      }\n\n      // Override captcha_bypass in piggybacking\n      if (json?.client?.captcha_bypass === false) {\n        json.client.captcha_bypass = true;\n      }\n\n      await route.fulfill({\n        response,\n        json,\n      });\n    } catch {\n      await route\n        .continue({\n          url: originalUrl.toString(),\n        })\n        .catch(console.error);\n    }\n  });\n};\n"],"mappings":"gDA6BO,IAAMA,EAAyB,MAAO,CAAE,QAAAC,EAAS,QAAAC,EAAS,KAAAC,CAAK,IAAoC,CACxG,IAAMC,EAAiBH,GAAWE,GAAM,QAAQ,EAEhD,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,gEAAgE,EAGlF,IAAMC,EAAUH,GAAS,gBAAkB,QAAQ,IAAI,WACvD,GAAI,CAACG,EACH,MAAM,IAAI,MAAMC,CAA8B,EAEhD,IAAMC,EAAS,WAAWF,CAAO,WAEjC,MAAMD,EAAe,MAAMG,EAAQ,MAAMC,GAAS,CAChD,IAAMC,EAAc,IAAI,IAAID,EAAM,QAAQ,EAAE,IAAI,CAAC,EAC3CE,EAAe,QAAQ,IAAI,oBAE7BA,GACFD,EAAY,aAAa,IAAIE,EAAqBD,CAAY,EAGhE,GAAI,CACF,IAAME,EAAW,MAAMJ,EAAM,MAAM,CACjC,IAAKC,EAAY,SAAS,CAC5B,CAAC,EAEKI,EAAO,MAAMD,EAAS,KAAK,EAG7BC,GAAM,UAAU,iBAAmB,KACrCA,EAAK,SAAS,eAAiB,IAI7BA,GAAM,QAAQ,iBAAmB,KACnCA,EAAK,OAAO,eAAiB,IAG/B,MAAML,EAAM,QAAQ,CAClB,SAAAI,EACA,KAAAC,CACF,CAAC,CACH,MAAQ,CACN,MAAML,EACH,SAAS,CACR,IAAKC,EAAY,SAAS,CAC5B,CAAC,EACA,MAAM,QAAQ,KAAK,CACxB,CACF,CAAC,CACH","names":["setupClerkTestingToken","context","options","page","browserContext","fapiUrl","ERROR_MISSING_FRONTEND_API_URL","apiUrl","route","originalUrl","testingToken","TESTING_TOKEN_PARAM","response","json"]}