@clerk/testing 1.13.8-snapshot.v20251021095452 → 1.13.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ import{a as p,b as i}from"./chunk-M5YIJ3SE.mjs";var h=async({context:c,options:l,page:T})=>{let o=c??T?.context();if(!o)throw new Error("Either context or page must be provided to setup testing token");let r=l?.frontendApiUrl||process.env.CLERK_FAPI;if(!r)throw new Error(i);let g=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),f=new RegExp(`^https://${g}/v1/.*?(\\?.*)?$`);await o.route(f,async e=>{let s=new URL(e.request().url()),n=process.env.CLERK_TESTING_TOKEN;n&&s.searchParams.set(p,n);try{let a=await e.fetch({url:s.toString()}),t=await a.json();t?.response?.captcha_bypass===!1&&(t.response.captcha_bypass=!0),t?.client?.captcha_bypass===!1&&(t.client.captcha_bypass=!0),await e.fulfill({response:a,json:t})}catch{await e.continue({url:s.toString()}).catch(console.error)}})};export{h as a};
2
+ //# sourceMappingURL=chunk-YFUXUEZ5.mjs.map
@@ -0,0 +1 @@
1
+ {"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\n const escapedFapiUrl = fapiUrl.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const apiUrl = new RegExp(`^https://${escapedFapiUrl}/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,EAGhD,IAAMC,EAAiBF,EAAQ,QAAQ,sBAAuB,MAAM,EAC9DG,EAAS,IAAI,OAAO,YAAYD,CAAc,kBAAkB,EAEtE,MAAMH,EAAe,MAAMI,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","escapedFapiUrl","apiUrl","route","originalUrl","testingToken","TESTING_TOKEN_PARAM","response","json"]}
@@ -1,10 +1,10 @@
1
- "use strict";var S=Object.create;var p=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var F=(e,s)=>{for(var t in s)p(e,t,{get:s[t],enumerable:!0})},w=(e,s,t,o)=>{if(s&&typeof s=="object"||typeof s=="function")for(let n of L(s))!R.call(e,n)&&n!==t&&p(e,n,{get:()=>s[n],enumerable:!(o=I(s,n))||o.enumerable});return e};var v=(e,s,t)=>(t=e!=null?S(K(e)):{},w(s||!e||!e.__esModule?p(t,"default",{value:e,enumerable:!0}):t,e)),A=e=>w(p({},"__esModule",{value:!0}),e);var N={};F(N,{clerk:()=>P,clerkSetup:()=>y,setupClerkTestingToken:()=>d});module.exports=A(N);var u="__clerk_testing_token";var C=require("@clerk/backend"),E=require("@clerk/shared/keys"),h=v(require("dotenv")),f=async e=>{let{debug:s=!1,dotenv:t=!0,...o}=e||{},n=l=>{s&&console.log(`Clerk: ${l}`)};n("Setting up Clerk..."),t&&h.default.config({path:[".env.local",".env"]});let i=o.publishableKey||process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY||process.env.VITE_CLERK_PUBLISHABLE_KEY||process.env.CLERK_PUBLISHABLE_KEY||process.env.REACT_APP_CLERK_PUBLISHABLE_KEY||process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY,r=o.secretKey||process.env.CLERK_SECRET_KEY,a=process.env.CLERK_TESTING_TOKEN;if(!i)throw new Error("You need to set the CLERK_PUBLISHABLE_KEY environment variable.");if(!r&&!a)throw new Error("You need to set the CLERK_SECRET_KEY or the CLERK_TESTING_TOKEN environment variable.");if(r&&!a){n("Fetching testing token from Clerk Backend API...");try{let l=o?.apiUrl||process.env.CLERK_API_URL;a=(await(0,C.createClerkClient)({secretKey:r,apiUrl:l}).testingTokens.createTestingToken()).token}catch(l){throw console.error("Failed to fetch testing token from Clerk API."),l}}return{CLERK_FAPI:e?.frontendApiUrl||(0,E.parsePublishableKey)(i)?.frontendApi,CLERK_TESTING_TOKEN:a}};var _="The Clerk Frontend API URL is required to bypass bot protection. Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.";var k=async({signInParams:e,windowObject:s})=>{try{let t=s||window;if(!t.Clerk.client)return;let o=t.Clerk.client.signIn;switch(e.strategy){case"password":{let n=await o.create(e);await t.Clerk.setActive({session:n.createdSessionId});break}case"ticket":{let n=await o.create({strategy:"ticket",ticket:e.ticket});if(n.status==="complete")await t.Clerk.setActive({session:n.createdSessionId});else throw new Error(`Sign-in with ticket failed. Status: ${n.status}`);break}case"phone_code":{if(!/^\+1\d{3}55501\d{2}$/.test(e.identifier))throw new Error(`Phone number should be a test phone number.
1
+ "use strict";var I=Object.create;var p=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var v=(e,r)=>{for(var t in r)p(e,t,{get:r[t],enumerable:!0})},u=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of K(r))!F.call(e,s)&&s!==t&&p(e,s,{get:()=>r[s],enumerable:!(n=L(r,s))||n.enumerable});return e};var A=(e,r,t)=>(t=e!=null?I(R(e)):{},u(r||!e||!e.__esModule?p(t,"default",{value:e,enumerable:!0}):t,e)),O=e=>u(p({},"__esModule",{value:!0}),e);var U={};v(U,{clerk:()=>S,clerkSetup:()=>T,setupClerkTestingToken:()=>d});module.exports=O(U);var C="__clerk_testing_token";var E=require("@clerk/backend"),h=require("@clerk/shared/keys"),f=A(require("dotenv")),_=async e=>{let{debug:r=!1,dotenv:t=!0,...n}=e||{},s=l=>{r&&console.log(`Clerk: ${l}`)};s("Setting up Clerk..."),t&&f.default.config({path:[".env.local",".env"]});let i=n.publishableKey||process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY||process.env.VITE_CLERK_PUBLISHABLE_KEY||process.env.CLERK_PUBLISHABLE_KEY||process.env.REACT_APP_CLERK_PUBLISHABLE_KEY||process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY,o=n.secretKey||process.env.CLERK_SECRET_KEY,a=process.env.CLERK_TESTING_TOKEN;if(!i)throw new Error("You need to set the CLERK_PUBLISHABLE_KEY environment variable.");if(!o&&!a)throw new Error("You need to set the CLERK_SECRET_KEY or the CLERK_TESTING_TOKEN environment variable.");if(o&&!a){s("Fetching testing token from Clerk Backend API...");try{let l=n?.apiUrl||process.env.CLERK_API_URL;a=(await(0,E.createClerkClient)({secretKey:o,apiUrl:l}).testingTokens.createTestingToken()).token}catch(l){throw console.error("Failed to fetch testing token from Clerk API."),l}}return{CLERK_FAPI:e?.frontendApiUrl||(0,h.parsePublishableKey)(i)?.frontendApi,CLERK_TESTING_TOKEN:a}};var y="The Clerk Frontend API URL is required to bypass bot protection. Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.";var m=async({signInParams:e,windowObject:r})=>{try{let t=r||window;if(!t.Clerk.client)return;let n=t.Clerk.client.signIn;switch(e.strategy){case"password":{let s=await n.create(e);await t.Clerk.setActive({session:s.createdSessionId});break}case"ticket":{let s=await n.create({strategy:"ticket",ticket:e.ticket});if(s.status==="complete")await t.Clerk.setActive({session:s.createdSessionId});else throw new Error(`Sign-in with ticket failed. Status: ${s.status}`);break}case"phone_code":{if(!/^\+1\d{3}55501\d{2}$/.test(e.identifier))throw new Error(`Phone number should be a test phone number.
2
2
 
3
3
  Example: +1XXX55501XX.
4
4
 
5
- Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#phone-numbers`);let{supportedFirstFactors:n}=await o.create({identifier:e.identifier}),i=n?.find(r=>r.strategy==="phone_code");if(i){await o.prepareFirstFactor({strategy:"phone_code",phoneNumberId:i.phoneNumberId});let r=await o.attemptFirstFactor({strategy:"phone_code",code:"424242"});if(r.status==="complete")await t.Clerk.setActive({session:r.createdSessionId});else throw new Error(`Status is ${r.status}`)}else throw new Error("phone_code is not enabled.");break}case"email_code":{if(!e.identifier.includes("+clerk_test"))throw new Error(`Email should be a test email.
5
+ Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#phone-numbers`);let{supportedFirstFactors:s}=await n.create({identifier:e.identifier}),i=s?.find(o=>o.strategy==="phone_code");if(i){await n.prepareFirstFactor({strategy:"phone_code",phoneNumberId:i.phoneNumberId});let o=await n.attemptFirstFactor({strategy:"phone_code",code:"424242"});if(o.status==="complete")await t.Clerk.setActive({session:o.createdSessionId});else throw new Error(`Status is ${o.status}`)}else throw new Error("phone_code is not enabled.");break}case"email_code":{if(!e.identifier.includes("+clerk_test"))throw new Error(`Email should be a test email.
6
6
 
7
7
  Any email with the +clerk_test subaddress is a test email address.
8
8
 
9
- Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#email-addresses`);let{supportedFirstFactors:n}=await o.create({identifier:e.identifier}),i=n?.find(r=>r.strategy==="email_code");if(i){await o.prepareFirstFactor({strategy:"email_code",emailAddressId:i.emailAddressId});let r=await o.attemptFirstFactor({strategy:"email_code",code:"424242"});if(r.status==="complete")await t.Clerk.setActive({session:r.createdSessionId});else throw new Error(`Status is ${r.status}`)}else throw new Error("email_code is not enabled.");break}default:throw new Error(`Unsupported strategy: ${e.strategy}`)}}catch(t){throw new Error(`Clerk: Failed to sign in: ${t?.message}`)}};var y=async e=>{let{CLERK_FAPI:s,CLERK_TESTING_TOKEN:t}=await f(e);process.env.CLERK_FAPI=s,process.env.CLERK_TESTING_TOKEN=t};var d=async({context:e,options:s,page:t})=>{let o=e??t?.context();if(!o)throw new Error("Either context or page must be provided to setup testing token");let n=s?.frontendApiUrl||process.env.CLERK_FAPI;if(!n)throw new Error(_);let i=`https://${n}/v1/**/*`;await o.route(i,async r=>{let a=new URL(r.request().url()),l=process.env.CLERK_TESTING_TOKEN;l&&a.searchParams.set(u,l);try{let g=await r.fetch({url:a.toString()}),c=await g.json();c?.response?.captcha_bypass===!1&&(c.response.captcha_bypass=!0),c?.client?.captcha_bypass===!1&&(c.client.captcha_bypass=!0),await r.fulfill({response:g,json:c})}catch{await r.continue({url:a.toString()}).catch(console.error)}})};var T=require("@clerk/backend");var m=async({page:e})=>{await e.waitForFunction(()=>window.Clerk!==void 0),await e.waitForFunction(()=>window.Clerk.loaded)},O=async e=>{let s=e.page.context();if(!s)throw new Error("Page context is not available. Make sure the page is properly initialized.");if(await d({context:s,options:"setupClerkTestingTokenOptions"in e?e.setupClerkTestingTokenOptions:void 0}),await m({page:e.page}),"emailAddress"in e){let{emailAddress:t,page:o}=e,n=process.env.CLERK_SECRET_KEY;if(!n)throw new Error("CLERK_SECRET_KEY environment variable is required for email-based sign-in");let i=(0,T.createClerkClient)({secretKey:n});try{let r=await i.users.getUserList({emailAddress:[t]});if(!r.data||r.data.length===0)throw new Error(`No user found with email: ${t}`);let a=r.data[0],l=await i.signInTokens.createSignInToken({userId:a.id,expiresInSeconds:300});await o.evaluate(k,{signInParams:{strategy:"ticket",ticket:l.token}}),await o.waitForFunction(()=>window.Clerk?.user!==null)}catch(r){throw new Error(`Failed to sign in with email ${t}: ${r?.message}`)}}else{let{page:t,signInParams:o}=e;await t.evaluate(k,{signInParams:o})}},b=async({page:e,signOutOptions:s})=>{await m({page:e}),await e.evaluate(async t=>{await window.Clerk.signOut(t)},s)},P={signIn:O,signOut:b,loaded:m};0&&(module.exports={clerk,clerkSetup,setupClerkTestingToken});
9
+ Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#email-addresses`);let{supportedFirstFactors:s}=await n.create({identifier:e.identifier}),i=s?.find(o=>o.strategy==="email_code");if(i){await n.prepareFirstFactor({strategy:"email_code",emailAddressId:i.emailAddressId});let o=await n.attemptFirstFactor({strategy:"email_code",code:"424242"});if(o.status==="complete")await t.Clerk.setActive({session:o.createdSessionId});else throw new Error(`Status is ${o.status}`)}else throw new Error("email_code is not enabled.");break}default:throw new Error(`Unsupported strategy: ${e.strategy}`)}}catch(t){throw new Error(`Clerk: Failed to sign in: ${t?.message}`)}};var T=async e=>{let{CLERK_FAPI:r,CLERK_TESTING_TOKEN:t}=await _(e);process.env.CLERK_FAPI=r,process.env.CLERK_TESTING_TOKEN=t};var d=async({context:e,options:r,page:t})=>{let n=e??t?.context();if(!n)throw new Error("Either context or page must be provided to setup testing token");let s=r?.frontendApiUrl||process.env.CLERK_FAPI;if(!s)throw new Error(y);let i=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`^https://${i}/v1/.*?(\\?.*)?$`);await n.route(o,async a=>{let l=new URL(a.request().url()),g=process.env.CLERK_TESTING_TOKEN;g&&l.searchParams.set(C,g);try{let k=await a.fetch({url:l.toString()}),c=await k.json();c?.response?.captcha_bypass===!1&&(c.response.captcha_bypass=!0),c?.client?.captcha_bypass===!1&&(c.client.captcha_bypass=!0),await a.fulfill({response:k,json:c})}catch{await a.continue({url:l.toString()}).catch(console.error)}})};var P=require("@clerk/backend");var w=async({page:e})=>{await e.waitForFunction(()=>window.Clerk!==void 0),await e.waitForFunction(()=>window.Clerk.loaded)},b=async e=>{let r=e.page.context();if(!r)throw new Error("Page context is not available. Make sure the page is properly initialized.");if(await d({context:r,options:"setupClerkTestingTokenOptions"in e?e.setupClerkTestingTokenOptions:void 0}),await w({page:e.page}),"emailAddress"in e){let{emailAddress:t,page:n}=e,s=process.env.CLERK_SECRET_KEY;if(!s)throw new Error("CLERK_SECRET_KEY environment variable is required for email-based sign-in");let i=(0,P.createClerkClient)({secretKey:s});try{let o=await i.users.getUserList({emailAddress:[t]});if(!o.data||o.data.length===0)throw new Error(`No user found with email: ${t}`);let a=o.data[0],l=await i.signInTokens.createSignInToken({userId:a.id,expiresInSeconds:300});await n.evaluate(m,{signInParams:{strategy:"ticket",ticket:l.token}}),await n.waitForFunction(()=>window.Clerk?.user!==null)}catch(o){throw new Error(`Failed to sign in with email ${t}: ${o?.message}`)}}else{let{page:t,signInParams:n}=e;await t.evaluate(m,{signInParams:n})}},N=async({page:e,signOutOptions:r})=>{await w({page:e}),await e.evaluate(async t=>{await window.Clerk.signOut(t)},r)},S={signIn:b,signOut:N,loaded:w};0&&(module.exports={clerk,clerkSetup,setupClerkTestingToken});
10
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/playwright/index.ts","../../src/common/constants.ts","../../src/common/setup.ts","../../src/common/errors.ts","../../src/common/helpers-utils.ts","../../src/playwright/setup.ts","../../src/playwright/setupClerkTestingToken.ts","../../src/playwright/helpers.ts"],"sourcesContent":["export { clerkSetup } from './setup';\nexport { setupClerkTestingToken } from './setupClerkTestingToken';\nexport { clerk } from './helpers';\n","export const TESTING_TOKEN_PARAM = '__clerk_testing_token';\n","import { createClerkClient } from '@clerk/backend';\nimport { parsePublishableKey } from '@clerk/shared/keys';\nimport dotenv from 'dotenv';\n\nimport type { ClerkSetupOptions, ClerkSetupReturn } from './types';\n\nexport const fetchEnvVars = async (options?: ClerkSetupOptions): Promise<ClerkSetupReturn> => {\n const { debug = false, dotenv: loadDotEnv = true, ...rest } = options || {};\n\n const log = (msg: string) => {\n if (debug) {\n console.log(`Clerk: ${msg}`);\n }\n };\n\n log('Setting up Clerk...');\n\n if (loadDotEnv) {\n dotenv.config({ path: ['.env.local', '.env'] });\n }\n\n const publishableKey =\n rest.publishableKey ||\n process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY ||\n process.env.VITE_CLERK_PUBLISHABLE_KEY ||\n process.env.CLERK_PUBLISHABLE_KEY ||\n process.env.REACT_APP_CLERK_PUBLISHABLE_KEY ||\n process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY;\n\n const secretKey = rest.secretKey || process.env.CLERK_SECRET_KEY;\n let testingToken = process.env.CLERK_TESTING_TOKEN;\n\n if (!publishableKey) {\n throw new Error('You need to set the CLERK_PUBLISHABLE_KEY environment variable.');\n }\n\n if (!secretKey && !testingToken) {\n throw new Error('You need to set the CLERK_SECRET_KEY or the CLERK_TESTING_TOKEN environment variable.');\n }\n\n if (secretKey && !testingToken) {\n log('Fetching testing token from Clerk Backend API...');\n\n try {\n const apiUrl = (rest as any)?.apiUrl || process.env.CLERK_API_URL;\n const clerkClient = createClerkClient({ secretKey, apiUrl });\n const tokenData = await clerkClient.testingTokens.createTestingToken();\n testingToken = tokenData.token;\n } catch (err) {\n console.error('Failed to fetch testing token from Clerk API.');\n throw err;\n }\n }\n\n return {\n CLERK_FAPI: options?.frontendApiUrl || parsePublishableKey(publishableKey)?.frontendApi,\n CLERK_TESTING_TOKEN: testingToken,\n };\n};\n","export const ERROR_MISSING_FRONTEND_API_URL =\n 'The Clerk Frontend API URL is required to bypass bot protection. ' +\n 'Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.';\n","import type { EmailCodeFactor, PhoneCodeFactor, SignInFirstFactor } from '@clerk/types';\n\nimport type { SignInHelperParams } from './types';\n\n// This function is serialized and executed in the browser context\nexport const signInHelper = async ({ signInParams, windowObject }: SignInHelperParams) => {\n try {\n const w = windowObject || window;\n if (!w.Clerk.client) {\n return;\n }\n\n const signIn = w.Clerk.client.signIn;\n\n switch (signInParams.strategy) {\n case 'password': {\n const res = await signIn.create(signInParams);\n await w.Clerk.setActive({\n session: res.createdSessionId,\n });\n break;\n }\n\n case 'ticket': {\n const res = await signIn.create({\n strategy: 'ticket',\n ticket: signInParams.ticket,\n });\n\n if (res.status === 'complete') {\n await w.Clerk.setActive({\n session: res.createdSessionId,\n });\n } else {\n throw new Error(`Sign-in with ticket failed. Status: ${res.status}`);\n }\n break;\n }\n\n case 'phone_code': {\n // Assert that the identifier is a test phone number\n if (!/^\\+1\\d{3}55501\\d{2}$/.test(signInParams.identifier)) {\n throw new Error(\n `Phone number should be a test phone number.\\n\n Example: +1XXX55501XX.\\n\n Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#phone-numbers`,\n );\n }\n\n // Sign in with phone code\n const { supportedFirstFactors } = await signIn.create({\n identifier: signInParams.identifier,\n });\n const phoneFactor = supportedFirstFactors?.find(\n (factor: SignInFirstFactor): factor is PhoneCodeFactor => factor.strategy === 'phone_code',\n );\n\n if (phoneFactor) {\n await signIn.prepareFirstFactor({\n strategy: 'phone_code',\n phoneNumberId: phoneFactor.phoneNumberId,\n });\n const signInAttempt = await signIn.attemptFirstFactor({\n strategy: 'phone_code',\n code: '424242',\n });\n\n if (signInAttempt.status === 'complete') {\n await w.Clerk.setActive({ session: signInAttempt.createdSessionId });\n } else {\n throw new Error(`Status is ${signInAttempt.status}`);\n }\n } else {\n throw new Error('phone_code is not enabled.');\n }\n break;\n }\n\n case 'email_code': {\n // Assert that the identifier is a test email\n if (!signInParams.identifier.includes('+clerk_test')) {\n throw new Error(\n `Email should be a test email.\\n\n Any email with the +clerk_test subaddress is a test email address.\\n\n Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#email-addresses`,\n );\n }\n\n // Sign in with email code\n const { supportedFirstFactors } = await signIn.create({\n identifier: signInParams.identifier,\n });\n const emailFactor = supportedFirstFactors?.find(\n (factor: SignInFirstFactor): factor is EmailCodeFactor => factor.strategy === 'email_code',\n );\n\n if (emailFactor) {\n await signIn.prepareFirstFactor({\n strategy: 'email_code',\n emailAddressId: emailFactor.emailAddressId,\n });\n const signInAttempt = await signIn.attemptFirstFactor({\n strategy: 'email_code',\n code: '424242',\n });\n\n if (signInAttempt.status === 'complete') {\n await w.Clerk.setActive({ session: signInAttempt.createdSessionId });\n } else {\n throw new Error(`Status is ${signInAttempt.status}`);\n }\n } else {\n throw new Error('email_code is not enabled.');\n }\n break;\n }\n\n default:\n throw new Error(`Unsupported strategy: ${(signInParams as any).strategy}`);\n }\n } catch (err: any) {\n throw new Error(`Clerk: Failed to sign in: ${err?.message}`);\n }\n};\n","import type { ClerkSetupOptions } from '../common';\nimport { fetchEnvVars } from '../common';\n\n/**\n * Sets up Clerk for testing by fetching the testing token from the Clerk Backend API.\n *\n * @param options.publishableKey - The publishable key for your Clerk dev instance.\n * @param options.frontendApiUrl - The frontend API URL for your Clerk dev instance, without the protocol. It overrides the Frontend API URL parsed from the publishable key.\n * @param options.debug - Enable debug logs.\n * @returns A promise that resolves when Clerk is set up.\n *\n * @throws An error if the publishable key or the secret key is not provided.\n * @throws An error if the secret key is from a production instance.\n * @throws An error if the testing token cannot be fetched from the Clerk Backend API.\n */\nexport const clerkSetup = async (options?: ClerkSetupOptions) => {\n const { CLERK_FAPI, CLERK_TESTING_TOKEN } = await fetchEnvVars(options);\n process.env.CLERK_FAPI = CLERK_FAPI;\n process.env.CLERK_TESTING_TOKEN = CLERK_TESTING_TOKEN;\n};\n","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","import { createClerkClient } from '@clerk/backend';\nimport type { Clerk, SignOutOptions } from '@clerk/types';\nimport type { Page } from '@playwright/test';\n\nimport type { ClerkSignInParams, SetupClerkTestingTokenOptions } from '../common';\nimport { signInHelper } from '../common';\nimport { setupClerkTestingToken } from './setupClerkTestingToken';\n\ndeclare global {\n interface Window {\n Clerk: Clerk;\n }\n}\n\ntype PlaywrightClerkLoadedParams = {\n page: Page;\n};\n\ntype PlaywrightClerkSignInParamsWithEmail = {\n page: Page;\n emailAddress: string;\n setupClerkTestingTokenOptions?: SetupClerkTestingTokenOptions;\n};\n\ntype ClerkHelperParams = {\n /**\n * Signs in a user using Clerk. This helper supports multiple sign-in strategies:\n * 1. Using signInParams object (password, phone_code, email_code strategies)\n * 2. Using emailAddress for automatic ticket-based sign-in\n *\n * Multi-factor is not supported.\n * This helper is using the `setupClerkTestingToken` internally.\n * It is required to call `page.goto` before calling this helper, and navigate to a not protected page that loads Clerk.\n *\n * For strategy-based sign-in:\n * If the strategy is password, the helper will sign in the user using the provided password and identifier.\n * If the strategy is phone_code, you are required to have a user with a test phone number as an identifier (e.g. +15555550100).\n * If the strategy is email_code, you are required to have a user with a test email as an identifier (e.g. your_email+clerk_test@example.com).\n *\n * For email-based sign-in:\n * The helper finds the user by email, creates a sign-in token using Clerk's backend API, and uses the ticket strategy.\n *\n * @example Strategy-based sign-in\n * import { clerk } from \"@clerk/testing/playwright\";\n *\n * test(\"sign in with strategy\", async ({ page }) => {\n * await page.goto(\"/\");\n * await clerk.signIn({\n * page,\n * signInParams: { strategy: 'phone_code', identifier: '+15555550100' },\n * });\n * await page.goto(\"/protected\");\n * });\n *\n * @example Email-based sign-in\n * import { clerk } from \"@clerk/testing/playwright\";\n *\n * test(\"sign in with email\", async ({ page }) => {\n * await page.goto(\"/\");\n * await clerk.signIn({ emailAddress: \"bryce@clerk.dev\", page });\n * await page.goto(\"/protected\");\n * });\n */\n signIn: {\n (opts: PlaywrightClerkSignInParams): Promise<void>;\n (opts: PlaywrightClerkSignInParamsWithEmail): Promise<void>;\n };\n /**\n * Signs out the current user using Clerk.\n * It is required to call `page.goto` before calling this helper, and navigate to a page that loads Clerk.\n * @param opts.signOutOptions - A SignOutOptions object.\n * @param opts.page - The Playwright page object.\n *\n * @example\n * import { clerk } from \"@clerk/testing/playwright\";\n *\n * test(\"sign out\", async ({ page }) => {\n * await page.goto(\"/\");\n * await clerk.signIn({\n * page,\n * signInParams: { strategy: 'phone_code', identifier: '+15555550100' },\n * });\n * await page.goto(\"/protected\");\n * await clerk.signOut({ page });\n * await page.goto(\"/protected\");\n * // should redirect to sign in page\n * });\n */\n signOut: (opts: PlaywrightClerkSignOutParams) => Promise<void>;\n /**\n * Asserts that Clerk has been loaded.\n * It is required to call `page.goto` before calling this helper, and navigate to a page that loads Clerk.\n *\n * @param opts.page - The Playwright page object.\n */\n loaded: (opts: PlaywrightClerkLoadedParams) => Promise<void>;\n};\n\nconst loaded = async ({ page }: PlaywrightClerkLoadedParams) => {\n await page.waitForFunction(() => window.Clerk !== undefined);\n await page.waitForFunction(() => window.Clerk.loaded);\n};\n\ntype PlaywrightClerkSignInParams = {\n page: Page;\n signInParams: ClerkSignInParams;\n setupClerkTestingTokenOptions?: SetupClerkTestingTokenOptions;\n};\n\nconst signIn = async (opts: PlaywrightClerkSignInParams | PlaywrightClerkSignInParamsWithEmail) => {\n const context = opts.page.context();\n if (!context) {\n throw new Error('Page context is not available. Make sure the page is properly initialized.');\n }\n\n await setupClerkTestingToken({\n context,\n options: 'setupClerkTestingTokenOptions' in opts ? opts.setupClerkTestingTokenOptions : undefined,\n });\n await loaded({ page: opts.page });\n\n if ('emailAddress' in opts) {\n // Email-based sign-in using ticket strategy\n const { emailAddress, page } = opts;\n\n const secretKey = process.env.CLERK_SECRET_KEY;\n if (!secretKey) {\n throw new Error('CLERK_SECRET_KEY environment variable is required for email-based sign-in');\n }\n\n const clerkClient = createClerkClient({ secretKey });\n\n try {\n // Find user by email\n const userList = await clerkClient.users.getUserList({ emailAddress: [emailAddress] });\n if (!userList.data || userList.data.length === 0) {\n throw new Error(`No user found with email: ${emailAddress}`);\n }\n\n const user = userList.data[0];\n\n const signInToken = await clerkClient.signInTokens.createSignInToken({\n userId: user.id,\n expiresInSeconds: 300, // 5 minutes\n });\n\n await page.evaluate(signInHelper, {\n signInParams: { strategy: 'ticket' as const, ticket: signInToken.token },\n });\n\n await page.waitForFunction(() => window.Clerk?.user !== null);\n } catch (err: any) {\n throw new Error(`Failed to sign in with email ${emailAddress}: ${err?.message}`);\n }\n } else {\n // Strategy-based sign-in: signIn(opts)\n const { page, signInParams } = opts;\n await page.evaluate(signInHelper, { signInParams });\n }\n};\n\ntype PlaywrightClerkSignOutParams = {\n page: Page;\n signOutOptions?: SignOutOptions;\n};\n\nconst signOut = async ({ page, signOutOptions }: PlaywrightClerkSignOutParams) => {\n await loaded({ page });\n\n await page.evaluate(async options => {\n await window.Clerk.signOut(options);\n }, signOutOptions);\n};\n\nexport const clerk: ClerkHelperParams = {\n signIn: signIn as ClerkHelperParams['signIn'],\n signOut,\n loaded,\n};\n"],"mappings":"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","names":["playwright_exports","__export","clerk","clerkSetup","setupClerkTestingToken","__toCommonJS","TESTING_TOKEN_PARAM","import_backend","import_keys","import_dotenv","fetchEnvVars","options","debug","loadDotEnv","rest","log","msg","dotenv","publishableKey","secretKey","testingToken","apiUrl","err","ERROR_MISSING_FRONTEND_API_URL","signInHelper","signInParams","windowObject","w","signIn","res","supportedFirstFactors","phoneFactor","factor","signInAttempt","emailFactor","err","clerkSetup","options","CLERK_FAPI","CLERK_TESTING_TOKEN","fetchEnvVars","setupClerkTestingToken","context","options","page","browserContext","fapiUrl","ERROR_MISSING_FRONTEND_API_URL","apiUrl","route","originalUrl","testingToken","TESTING_TOKEN_PARAM","response","json","import_backend","loaded","page","signIn","opts","context","setupClerkTestingToken","emailAddress","secretKey","clerkClient","userList","user","signInToken","signInHelper","err","signInParams","signOut","signOutOptions","options","clerk"]}
1
+ {"version":3,"sources":["../../src/playwright/index.ts","../../src/common/constants.ts","../../src/common/setup.ts","../../src/common/errors.ts","../../src/common/helpers-utils.ts","../../src/playwright/setup.ts","../../src/playwright/setupClerkTestingToken.ts","../../src/playwright/helpers.ts"],"sourcesContent":["export { clerkSetup } from './setup';\nexport { setupClerkTestingToken } from './setupClerkTestingToken';\nexport { clerk } from './helpers';\n","export const TESTING_TOKEN_PARAM = '__clerk_testing_token';\n","import { createClerkClient } from '@clerk/backend';\nimport { parsePublishableKey } from '@clerk/shared/keys';\nimport dotenv from 'dotenv';\n\nimport type { ClerkSetupOptions, ClerkSetupReturn } from './types';\n\nexport const fetchEnvVars = async (options?: ClerkSetupOptions): Promise<ClerkSetupReturn> => {\n const { debug = false, dotenv: loadDotEnv = true, ...rest } = options || {};\n\n const log = (msg: string) => {\n if (debug) {\n console.log(`Clerk: ${msg}`);\n }\n };\n\n log('Setting up Clerk...');\n\n if (loadDotEnv) {\n dotenv.config({ path: ['.env.local', '.env'] });\n }\n\n const publishableKey =\n rest.publishableKey ||\n process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY ||\n process.env.VITE_CLERK_PUBLISHABLE_KEY ||\n process.env.CLERK_PUBLISHABLE_KEY ||\n process.env.REACT_APP_CLERK_PUBLISHABLE_KEY ||\n process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY;\n\n const secretKey = rest.secretKey || process.env.CLERK_SECRET_KEY;\n let testingToken = process.env.CLERK_TESTING_TOKEN;\n\n if (!publishableKey) {\n throw new Error('You need to set the CLERK_PUBLISHABLE_KEY environment variable.');\n }\n\n if (!secretKey && !testingToken) {\n throw new Error('You need to set the CLERK_SECRET_KEY or the CLERK_TESTING_TOKEN environment variable.');\n }\n\n if (secretKey && !testingToken) {\n log('Fetching testing token from Clerk Backend API...');\n\n try {\n const apiUrl = (rest as any)?.apiUrl || process.env.CLERK_API_URL;\n const clerkClient = createClerkClient({ secretKey, apiUrl });\n const tokenData = await clerkClient.testingTokens.createTestingToken();\n testingToken = tokenData.token;\n } catch (err) {\n console.error('Failed to fetch testing token from Clerk API.');\n throw err;\n }\n }\n\n return {\n CLERK_FAPI: options?.frontendApiUrl || parsePublishableKey(publishableKey)?.frontendApi,\n CLERK_TESTING_TOKEN: testingToken,\n };\n};\n","export const ERROR_MISSING_FRONTEND_API_URL =\n 'The Clerk Frontend API URL is required to bypass bot protection. ' +\n 'Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.';\n","import type { EmailCodeFactor, PhoneCodeFactor, SignInFirstFactor } from '@clerk/types';\n\nimport type { SignInHelperParams } from './types';\n\n// This function is serialized and executed in the browser context\nexport const signInHelper = async ({ signInParams, windowObject }: SignInHelperParams) => {\n try {\n const w = windowObject || window;\n if (!w.Clerk.client) {\n return;\n }\n\n const signIn = w.Clerk.client.signIn;\n\n switch (signInParams.strategy) {\n case 'password': {\n const res = await signIn.create(signInParams);\n await w.Clerk.setActive({\n session: res.createdSessionId,\n });\n break;\n }\n\n case 'ticket': {\n const res = await signIn.create({\n strategy: 'ticket',\n ticket: signInParams.ticket,\n });\n\n if (res.status === 'complete') {\n await w.Clerk.setActive({\n session: res.createdSessionId,\n });\n } else {\n throw new Error(`Sign-in with ticket failed. Status: ${res.status}`);\n }\n break;\n }\n\n case 'phone_code': {\n // Assert that the identifier is a test phone number\n if (!/^\\+1\\d{3}55501\\d{2}$/.test(signInParams.identifier)) {\n throw new Error(\n `Phone number should be a test phone number.\\n\n Example: +1XXX55501XX.\\n\n Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#phone-numbers`,\n );\n }\n\n // Sign in with phone code\n const { supportedFirstFactors } = await signIn.create({\n identifier: signInParams.identifier,\n });\n const phoneFactor = supportedFirstFactors?.find(\n (factor: SignInFirstFactor): factor is PhoneCodeFactor => factor.strategy === 'phone_code',\n );\n\n if (phoneFactor) {\n await signIn.prepareFirstFactor({\n strategy: 'phone_code',\n phoneNumberId: phoneFactor.phoneNumberId,\n });\n const signInAttempt = await signIn.attemptFirstFactor({\n strategy: 'phone_code',\n code: '424242',\n });\n\n if (signInAttempt.status === 'complete') {\n await w.Clerk.setActive({ session: signInAttempt.createdSessionId });\n } else {\n throw new Error(`Status is ${signInAttempt.status}`);\n }\n } else {\n throw new Error('phone_code is not enabled.');\n }\n break;\n }\n\n case 'email_code': {\n // Assert that the identifier is a test email\n if (!signInParams.identifier.includes('+clerk_test')) {\n throw new Error(\n `Email should be a test email.\\n\n Any email with the +clerk_test subaddress is a test email address.\\n\n Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#email-addresses`,\n );\n }\n\n // Sign in with email code\n const { supportedFirstFactors } = await signIn.create({\n identifier: signInParams.identifier,\n });\n const emailFactor = supportedFirstFactors?.find(\n (factor: SignInFirstFactor): factor is EmailCodeFactor => factor.strategy === 'email_code',\n );\n\n if (emailFactor) {\n await signIn.prepareFirstFactor({\n strategy: 'email_code',\n emailAddressId: emailFactor.emailAddressId,\n });\n const signInAttempt = await signIn.attemptFirstFactor({\n strategy: 'email_code',\n code: '424242',\n });\n\n if (signInAttempt.status === 'complete') {\n await w.Clerk.setActive({ session: signInAttempt.createdSessionId });\n } else {\n throw new Error(`Status is ${signInAttempt.status}`);\n }\n } else {\n throw new Error('email_code is not enabled.');\n }\n break;\n }\n\n default:\n throw new Error(`Unsupported strategy: ${(signInParams as any).strategy}`);\n }\n } catch (err: any) {\n throw new Error(`Clerk: Failed to sign in: ${err?.message}`);\n }\n};\n","import type { ClerkSetupOptions } from '../common';\nimport { fetchEnvVars } from '../common';\n\n/**\n * Sets up Clerk for testing by fetching the testing token from the Clerk Backend API.\n *\n * @param options.publishableKey - The publishable key for your Clerk dev instance.\n * @param options.frontendApiUrl - The frontend API URL for your Clerk dev instance, without the protocol. It overrides the Frontend API URL parsed from the publishable key.\n * @param options.debug - Enable debug logs.\n * @returns A promise that resolves when Clerk is set up.\n *\n * @throws An error if the publishable key or the secret key is not provided.\n * @throws An error if the secret key is from a production instance.\n * @throws An error if the testing token cannot be fetched from the Clerk Backend API.\n */\nexport const clerkSetup = async (options?: ClerkSetupOptions) => {\n const { CLERK_FAPI, CLERK_TESTING_TOKEN } = await fetchEnvVars(options);\n process.env.CLERK_FAPI = CLERK_FAPI;\n process.env.CLERK_TESTING_TOKEN = CLERK_TESTING_TOKEN;\n};\n","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\n const escapedFapiUrl = fapiUrl.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const apiUrl = new RegExp(`^https://${escapedFapiUrl}/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","import { createClerkClient } from '@clerk/backend';\nimport type { Clerk, SignOutOptions } from '@clerk/types';\nimport type { Page } from '@playwright/test';\n\nimport type { ClerkSignInParams, SetupClerkTestingTokenOptions } from '../common';\nimport { signInHelper } from '../common';\nimport { setupClerkTestingToken } from './setupClerkTestingToken';\n\ndeclare global {\n interface Window {\n Clerk: Clerk;\n }\n}\n\ntype PlaywrightClerkLoadedParams = {\n page: Page;\n};\n\ntype PlaywrightClerkSignInParamsWithEmail = {\n page: Page;\n emailAddress: string;\n setupClerkTestingTokenOptions?: SetupClerkTestingTokenOptions;\n};\n\ntype ClerkHelperParams = {\n /**\n * Signs in a user using Clerk. This helper supports multiple sign-in strategies:\n * 1. Using signInParams object (password, phone_code, email_code strategies)\n * 2. Using emailAddress for automatic ticket-based sign-in\n *\n * Multi-factor is not supported.\n * This helper is using the `setupClerkTestingToken` internally.\n * It is required to call `page.goto` before calling this helper, and navigate to a not protected page that loads Clerk.\n *\n * For strategy-based sign-in:\n * If the strategy is password, the helper will sign in the user using the provided password and identifier.\n * If the strategy is phone_code, you are required to have a user with a test phone number as an identifier (e.g. +15555550100).\n * If the strategy is email_code, you are required to have a user with a test email as an identifier (e.g. your_email+clerk_test@example.com).\n *\n * For email-based sign-in:\n * The helper finds the user by email, creates a sign-in token using Clerk's backend API, and uses the ticket strategy.\n *\n * @example Strategy-based sign-in\n * import { clerk } from \"@clerk/testing/playwright\";\n *\n * test(\"sign in with strategy\", async ({ page }) => {\n * await page.goto(\"/\");\n * await clerk.signIn({\n * page,\n * signInParams: { strategy: 'phone_code', identifier: '+15555550100' },\n * });\n * await page.goto(\"/protected\");\n * });\n *\n * @example Email-based sign-in\n * import { clerk } from \"@clerk/testing/playwright\";\n *\n * test(\"sign in with email\", async ({ page }) => {\n * await page.goto(\"/\");\n * await clerk.signIn({ emailAddress: \"bryce@clerk.dev\", page });\n * await page.goto(\"/protected\");\n * });\n */\n signIn: {\n (opts: PlaywrightClerkSignInParams): Promise<void>;\n (opts: PlaywrightClerkSignInParamsWithEmail): Promise<void>;\n };\n /**\n * Signs out the current user using Clerk.\n * It is required to call `page.goto` before calling this helper, and navigate to a page that loads Clerk.\n * @param opts.signOutOptions - A SignOutOptions object.\n * @param opts.page - The Playwright page object.\n *\n * @example\n * import { clerk } from \"@clerk/testing/playwright\";\n *\n * test(\"sign out\", async ({ page }) => {\n * await page.goto(\"/\");\n * await clerk.signIn({\n * page,\n * signInParams: { strategy: 'phone_code', identifier: '+15555550100' },\n * });\n * await page.goto(\"/protected\");\n * await clerk.signOut({ page });\n * await page.goto(\"/protected\");\n * // should redirect to sign in page\n * });\n */\n signOut: (opts: PlaywrightClerkSignOutParams) => Promise<void>;\n /**\n * Asserts that Clerk has been loaded.\n * It is required to call `page.goto` before calling this helper, and navigate to a page that loads Clerk.\n *\n * @param opts.page - The Playwright page object.\n */\n loaded: (opts: PlaywrightClerkLoadedParams) => Promise<void>;\n};\n\nconst loaded = async ({ page }: PlaywrightClerkLoadedParams) => {\n await page.waitForFunction(() => window.Clerk !== undefined);\n await page.waitForFunction(() => window.Clerk.loaded);\n};\n\ntype PlaywrightClerkSignInParams = {\n page: Page;\n signInParams: ClerkSignInParams;\n setupClerkTestingTokenOptions?: SetupClerkTestingTokenOptions;\n};\n\nconst signIn = async (opts: PlaywrightClerkSignInParams | PlaywrightClerkSignInParamsWithEmail) => {\n const context = opts.page.context();\n if (!context) {\n throw new Error('Page context is not available. Make sure the page is properly initialized.');\n }\n\n await setupClerkTestingToken({\n context,\n options: 'setupClerkTestingTokenOptions' in opts ? opts.setupClerkTestingTokenOptions : undefined,\n });\n await loaded({ page: opts.page });\n\n if ('emailAddress' in opts) {\n // Email-based sign-in using ticket strategy\n const { emailAddress, page } = opts;\n\n const secretKey = process.env.CLERK_SECRET_KEY;\n if (!secretKey) {\n throw new Error('CLERK_SECRET_KEY environment variable is required for email-based sign-in');\n }\n\n const clerkClient = createClerkClient({ secretKey });\n\n try {\n // Find user by email\n const userList = await clerkClient.users.getUserList({ emailAddress: [emailAddress] });\n if (!userList.data || userList.data.length === 0) {\n throw new Error(`No user found with email: ${emailAddress}`);\n }\n\n const user = userList.data[0];\n\n const signInToken = await clerkClient.signInTokens.createSignInToken({\n userId: user.id,\n expiresInSeconds: 300, // 5 minutes\n });\n\n await page.evaluate(signInHelper, {\n signInParams: { strategy: 'ticket' as const, ticket: signInToken.token },\n });\n\n await page.waitForFunction(() => window.Clerk?.user !== null);\n } catch (err: any) {\n throw new Error(`Failed to sign in with email ${emailAddress}: ${err?.message}`);\n }\n } else {\n // Strategy-based sign-in: signIn(opts)\n const { page, signInParams } = opts;\n await page.evaluate(signInHelper, { signInParams });\n }\n};\n\ntype PlaywrightClerkSignOutParams = {\n page: Page;\n signOutOptions?: SignOutOptions;\n};\n\nconst signOut = async ({ page, signOutOptions }: PlaywrightClerkSignOutParams) => {\n await loaded({ page });\n\n await page.evaluate(async options => {\n await window.Clerk.signOut(options);\n }, signOutOptions);\n};\n\nexport const clerk: ClerkHelperParams = {\n signIn: signIn as ClerkHelperParams['signIn'],\n signOut,\n loaded,\n};\n"],"mappings":"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","names":["playwright_exports","__export","clerk","clerkSetup","setupClerkTestingToken","__toCommonJS","TESTING_TOKEN_PARAM","import_backend","import_keys","import_dotenv","fetchEnvVars","options","debug","loadDotEnv","rest","log","msg","dotenv","publishableKey","secretKey","testingToken","apiUrl","err","ERROR_MISSING_FRONTEND_API_URL","signInHelper","signInParams","windowObject","w","signIn","res","supportedFirstFactors","phoneFactor","factor","signInAttempt","emailFactor","err","clerkSetup","options","CLERK_FAPI","CLERK_TESTING_TOKEN","fetchEnvVars","setupClerkTestingToken","context","options","page","browserContext","fapiUrl","ERROR_MISSING_FRONTEND_API_URL","escapedFapiUrl","apiUrl","route","originalUrl","testingToken","TESTING_TOKEN_PARAM","response","json","import_backend","loaded","page","signIn","opts","context","setupClerkTestingToken","emailAddress","secretKey","clerkClient","userList","user","signInToken","signInHelper","err","signInParams","signOut","signOutOptions","options","clerk"]}
@@ -1,2 +1,2 @@
1
- import{a as p,b as a}from"../chunk-XQ3MBH5Q.mjs";import{a as s}from"../chunk-YVI6XYHN.mjs";import"../chunk-M5YIJ3SE.mjs";var c=async e=>{let{CLERK_FAPI:r,CLERK_TESTING_TOKEN:t}=await p(e);process.env.CLERK_FAPI=r,process.env.CLERK_TESTING_TOKEN=t};import{createClerkClient as w}from"@clerk/backend";var o=async({page:e})=>{await e.waitForFunction(()=>window.Clerk!==void 0),await e.waitForFunction(()=>window.Clerk.loaded)},C=async e=>{let r=e.page.context();if(!r)throw new Error("Page context is not available. Make sure the page is properly initialized.");if(await s({context:r,options:"setupClerkTestingTokenOptions"in e?e.setupClerkTestingTokenOptions:void 0}),await o({page:e.page}),"emailAddress"in e){let{emailAddress:t,page:n}=e,l=process.env.CLERK_SECRET_KEY;if(!l)throw new Error("CLERK_SECRET_KEY environment variable is required for email-based sign-in");let g=w({secretKey:l});try{let i=await g.users.getUserList({emailAddress:[t]});if(!i.data||i.data.length===0)throw new Error(`No user found with email: ${t}`);let m=i.data[0],k=await g.signInTokens.createSignInToken({userId:m.id,expiresInSeconds:300});await n.evaluate(a,{signInParams:{strategy:"ticket",ticket:k.token}}),await n.waitForFunction(()=>window.Clerk?.user!==null)}catch(i){throw new Error(`Failed to sign in with email ${t}: ${i?.message}`)}}else{let{page:t,signInParams:n}=e;await t.evaluate(a,{signInParams:n})}},d=async({page:e,signOutOptions:r})=>{await o({page:e}),await e.evaluate(async t=>{await window.Clerk.signOut(t)},r)},P={signIn:C,signOut:d,loaded:o};export{P as clerk,c as clerkSetup,s as setupClerkTestingToken};
1
+ import{a as p,b as a}from"../chunk-XQ3MBH5Q.mjs";import{a as s}from"../chunk-YFUXUEZ5.mjs";import"../chunk-M5YIJ3SE.mjs";var c=async e=>{let{CLERK_FAPI:r,CLERK_TESTING_TOKEN:t}=await p(e);process.env.CLERK_FAPI=r,process.env.CLERK_TESTING_TOKEN=t};import{createClerkClient as w}from"@clerk/backend";var o=async({page:e})=>{await e.waitForFunction(()=>window.Clerk!==void 0),await e.waitForFunction(()=>window.Clerk.loaded)},C=async e=>{let r=e.page.context();if(!r)throw new Error("Page context is not available. Make sure the page is properly initialized.");if(await s({context:r,options:"setupClerkTestingTokenOptions"in e?e.setupClerkTestingTokenOptions:void 0}),await o({page:e.page}),"emailAddress"in e){let{emailAddress:t,page:n}=e,l=process.env.CLERK_SECRET_KEY;if(!l)throw new Error("CLERK_SECRET_KEY environment variable is required for email-based sign-in");let g=w({secretKey:l});try{let i=await g.users.getUserList({emailAddress:[t]});if(!i.data||i.data.length===0)throw new Error(`No user found with email: ${t}`);let m=i.data[0],k=await g.signInTokens.createSignInToken({userId:m.id,expiresInSeconds:300});await n.evaluate(a,{signInParams:{strategy:"ticket",ticket:k.token}}),await n.waitForFunction(()=>window.Clerk?.user!==null)}catch(i){throw new Error(`Failed to sign in with email ${t}: ${i?.message}`)}}else{let{page:t,signInParams:n}=e;await t.evaluate(a,{signInParams:n})}},d=async({page:e,signOutOptions:r})=>{await o({page:e}),await e.evaluate(async t=>{await window.Clerk.signOut(t)},r)},P={signIn:C,signOut:d,loaded:o};export{P as clerk,c as clerkSetup,s as setupClerkTestingToken};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var Q=(a,e)=>{for(var r in e)d(a,r,{get:e[r],enumerable:!0})},X=(a,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Y(e))!Z.call(a,o)&&o!==r&&d(a,o,{get:()=>e[o],enumerable:!(t=J(e,o))||t.enumerable});return a};var ee=a=>X(d({},"__esModule",{value:!0}),a);var te={};Q(te,{createAppPageObject:()=>g,createPageObjects:()=>K});module.exports=ee(te);var s=({page:a})=>{let e={continue:()=>a.getByRole("button",{name:"Continue",exact:!0}).click(),setEmailAddress:r=>e.getEmailAddressInput().fill(r),setPassword:r=>e.getPasswordInput().fill(r),setPasswordConfirmation:r=>a.locator("input[name=confirmPassword]").fill(r),enterOtpCode:async(r,t)=>{let{name:o="Enter verification code",awaitAttempt:n=!0,awaitPrepare:i=!0,awaitRequests:l=!0}=t??{};l&&i&&await a.waitForResponse(u=>u.request().method()==="POST"&&(u.url().includes("prepare_verification")||u.url().includes("prepare_first_factor")));let c=a.getByRole("textbox",{name:"Enter verification code. Digit 1"});await c.isVisible()?(console.warn("Using the original OTP input"),await c.click(),await a.keyboard.type(r,{delay:100})):await a.getByLabel(o).fill(r),l&&n&&await a.waitForResponse(u=>u.request().method()==="POST"&&(u.url().includes("attempt_verification")||u.url().includes("attempt_first_factor")))},enterTestOtpCode:async r=>e.enterOtpCode("424242",r),fillTestOtpCode:async(r,t)=>e.enterOtpCode("424242",{name:r,...t}),getIdentifierInput:()=>a.locator("input[name=identifier]"),getEmailAddressInput:()=>a.locator("input[name=emailAddress]"),getPhoneNumberInput:()=>a.locator("input[name=phoneNumber]"),getUsernameInput:()=>a.locator("input[name=username]"),getPasswordInput:()=>a.locator("input[name=password]"),getLegalAccepted:()=>a.locator("input[name=legalAccepted]"),getFirstNameInput:()=>a.locator("input[name=firstName]"),getLastNameInput:()=>a.locator("input[name=lastName]"),waitForSession:async()=>a.waitForFunction(()=>!!window.Clerk?.session)};return e};var h=a=>{let{page:e}=a,r={never:"Never","1d":"1 Day","7d":"7 Days","30d":"30 Days","60d":"60 Days","90d":"90 Days","180d":"180 Days","1y":"1 Year"};return{...s(a),waitForMounted:()=>e.waitForSelector(".cl-apiKeys-root",{state:"attached"}),clickAddButton:()=>e.getByText(/Add new key/i).click(),waitForFormOpened:()=>e.waitForSelector(".cl-apiKeysCreateForm",{state:"attached"}),waitForFormClosed:()=>e.waitForSelector(".cl-apiKeysCreateForm",{state:"detached"}),waitForRevokeModalOpened:()=>e.waitForSelector(".cl-apiKeysRevokeModal",{state:"attached"}),waitForRevokeModalClosed:()=>e.waitForSelector(".cl-apiKeysRevokeModal",{state:"detached"}),typeName:o=>e.getByLabel(/Secret key name/i).fill(o),typeDescription:o=>e.getByLabel(/Description/i).fill(o),selectExpiration:async o=>(await e.getByRole("button",{name:/Select date/i}).click(),e.getByText(r[o??"never"],{exact:!0}).click({force:!0})),clickSaveButton:()=>e.getByText(/Create key/i).click(),typeRevokeConfirmation:o=>e.getByLabel(/Type "Revoke" to confirm/i).fill(o),clickConfirmRevokeButton:()=>e.getByText(/Revoke key/i).click()}};var b="__clerk_testing_token";var P="The Clerk Frontend API URL is required to bypass bot protection. Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.";var m=async({context:a,options:e,page:r})=>{let t=a??r?.context();if(!t)throw new Error("Either context or page must be provided to setup testing token");let o=e?.frontendApiUrl||process.env.CLERK_FAPI;if(!o)throw new Error(P);let n=`https://${o}/v1/**/*`;await t.route(n,async i=>{let l=new URL(i.request().url()),c=process.env.CLERK_TESTING_TOKEN;c&&l.searchParams.set(b,c);try{let p=await i.fetch({url:l.toString()}),u=await p.json();u?.response?.captcha_bypass===!1&&(u.response.captcha_bypass=!0),u?.client?.captcha_bypass===!1&&(u.client.captcha_bypass=!0),await i.fulfill({response:p,json:u})}catch{await i.continue({url:l.toString()}).catch(console.error)}})};var g=(a,e)=>{let{page:r,useTestingToken:t=!0}=a,o=Object.create(r);return Object.assign(o,{goToAppHome:async()=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");try{t&&await m({page:r}),await r.goto(e.baseURL)}catch{}},goToRelative:async(i,l={})=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");let c;try{r.url().includes("about:blank")?c=new URL(i,e.baseURL):c=new URL(i,r.url())}catch{c=new URL(i,e.baseURL)}return l.searchParams&&(c.search=l.searchParams.toString()),t&&await m({page:r}),r.goto(c.toString(),{timeout:l.timeout??2e4,waitUntil:l.waitUntil})},waitForClerkJsLoaded:async()=>r.waitForFunction(()=>window.Clerk?.loaded),signOut:async()=>r.waitForFunction(()=>window.Clerk?.signOut({})),waitForClerkComponentMounted:async()=>r.waitForSelector(".cl-rootBox",{state:"attached"}),waitForAppUrl:async i=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");return r.waitForURL(new URL(i,e.baseURL).toString())},cookies:async()=>{let i=await r.context().cookies(),l=i.reduce((c,p)=>(p.name.match(/^(__.*_)(.{8})$/)?c.set(p.name.replace(/^(__.*_)(.{8})$/,"$1*"),p):c.set(p.name,p),c),new Map);return Object.assign(l,{raw:()=>i})}})};var F=a=>{let{page:e}=a,r={...s(a),waitForMounted:(t=".cl-checkout-root")=>e.waitForSelector(t,{state:"attached",timeout:2e4}),closeDrawer:()=>e.locator(".cl-drawerClose").click(),fillTestCard:async()=>{await r.fillCard({number:"4242424242424242",expiration:"1234",cvc:"123",country:"United States",zip:"12345"})},fillCard:async t=>{await r.waitForStripeElements({state:"visible"});let o=e.frameLocator('iframe[src*="elements-inner-payment"]');await o.getByLabel("Card number").fill(t.number),await o.getByLabel("Expiration date").fill(t.expiration),await o.getByLabel("Security code").fill(t.cvc),await o.getByLabel("Country").selectOption(t.country),await o.getByLabel("ZIP code").fill(t.zip)},waitForStripeElements:async({state:t="visible"}={})=>{let o=e.locator('iframe[src*="elements-inner-payment"]');t==="visible"?(await o.waitFor({state:"attached",timeout:2e4}),await e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"visible",timeout:2e4})):await e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"hidden",timeout:2e4})},clickPayOrSubscribe:async()=>{await r.root.getByRole("button",{name:/subscribe|pay\s\$|start/i}).click()},waitForSubscribeButton:async()=>{await r.root.getByRole("button",{name:/^subscribe$/i}).waitFor({state:"visible"})},confirmAndContinue:async()=>{await r.root.getByRole("button",{name:/^continue$/i}).click()},clickAddPaymentMethod:async()=>{await r.root.getByRole("radio",{name:"Add payment method"}).click()},clickPaymentMethods:async()=>{await r.root.getByRole("radio",{name:"Payment Methods"}).click()},root:e.locator(".cl-checkout-root")};return r};var k=({page:a})=>({toBeLoaded:async()=>a.waitForFunction(()=>!!window.Clerk?.loaded),getClientSideActor:()=>a.evaluate(()=>window.Clerk?.session?.actor),toBeLoading:async()=>a.waitForFunction(()=>window.Clerk?.status==="loading"),toBeReady:async()=>a.waitForFunction(()=>window.Clerk?.status==="ready"),toBeDegraded:async()=>a.waitForFunction(()=>window.Clerk?.status==="degraded"),getClientSideUser:()=>a.evaluate(()=>window.Clerk?.user)});var w=require("@playwright/test"),S=({page:a})=>({toBeHandshake:async e=>{let r=await e.request().redirectedFrom()?.redirectedFrom()?.response();(0,w.expect)(r?.status()).toBe(307),(0,w.expect)(r?.headers()["x-clerk-auth-status"]).toContain("handshake")},toBeSignedOut:e=>a.waitForFunction(()=>!window.Clerk?.user,null,{timeout:e?.timeOut}),toBeSignedIn:async()=>a.waitForFunction(()=>!!window.Clerk?.user),toBeSignedInAsActor:async()=>a.waitForFunction(()=>!!window.Clerk?.session?.actor),toHaveResolvedTask:async()=>a.waitForFunction(()=>!window.Clerk?.session?.currentTask)});var T=a=>{let{page:e}=a;return{waitForMounted:(t=".cl-impersonationFab")=>e.waitForSelector(t,{state:"attached"}),getSignOutLink:()=>e.locator(".cl-impersonationFab").getByText("Sign out")}};var R=a=>{let{page:e}=a,r="#--clerk-keyless-prompt-button";return{waitForMounted:()=>e.waitForSelector(r,{state:"attached"}),waitForUnmounted:()=>e.waitForSelector(r,{state:"detached"}),isExpanded:()=>e.locator(r).getAttribute("aria-expanded").then(o=>o==="true"),toggle:()=>e.locator(r).click(),promptsToClaim:()=>e.getByRole("link",{name:/^claim application$/i}),promptToUseClaimedKeys:()=>e.getByRole("link",{name:/^get api keys$/i}),promptToDismiss:()=>e.getByRole("button",{name:/^dismiss$/i})}};var f=require("@playwright/test");var C=a=>{let{page:e}=a,r={...s(a),goTo:async(t="/switcher")=>(await e.goToRelative(t),r.waitForMounted()),waitForMounted:()=>e.waitForSelector(".cl-organizationSwitcher-root",{state:"attached"}),expectNoOrganizationSelected:()=>(0,f.expect)(e.getByText(/No organization selected/i)).toBeVisible(),expectPersonalAccount:()=>(0,f.expect)(e.getByText(/personal account/i)).toBeVisible(),toggleTrigger:()=>e.locator(".cl-organizationSwitcherTrigger").click(),waitForAnOrganizationToSelected:()=>e.waitForSelector(".cl-userPreviewMainIdentifier__personalWorkspace",{state:"detached"})};return r};var B=a=>{let{page:e}=a;return{...s(a),waitForMounted:(t=".cl-planDetails-root")=>e.waitForSelector(t,{state:"attached"}),root:e.locator(".cl-planDetails-root")}};var O=a=>{let{page:e}=a,r={toggle:n=>e.locator(`.cl-pricingTableCard__${n} .cl-pricingTableCardPeriodToggle`),indicator:n=>e.locator(`.cl-pricingTableCard__${n} .cl-switchIndicator`),badge:n=>e.locator(`.cl-pricingTableCard__${n} .cl-badge`),footer:n=>e.locator(`.cl-pricingTableCard__${n} .cl-pricingTableCardFooter`)},t=async(n,i)=>{async function l(p,u,z,W=5e3){return e.waitForFunction(({sel:q,attr:G,val:H})=>document.querySelector(q)?.getAttribute(G)===H,{sel:p,attr:u,val:z},{timeout:W}).then(()=>!0).catch(()=>!1)}let c=await l(`.cl-pricingTableCard__${n} .cl-switchIndicator`,"data-checked","true",500);c&&i==="monthly"&&await r.toggle(n).click(),!c&&i==="annually"&&await r.toggle(n).click()};return{...s(a),waitForMounted:(n=".cl-pricingTable-root")=>e.waitForSelector(n,{state:"attached"}),clickResubscribe:async()=>{await e.getByText("Re-subscribe").click()},waitToBeActive:async({planSlug:n})=>r.badge(n).getByText("Active").waitFor({state:"visible"}),waitToBeFreeTrial:async({planSlug:n})=>r.badge(n).getByText("Free trial").waitFor({state:"visible"}),getPlanCardCTA:({planSlug:n})=>r.footer(n).getByRole("button",{name:/get|switch|subscribe/i}),startCheckout:async({planSlug:n,shouldSwitch:i,period:l})=>{let c=i===!0?"Switch to this plan":i===!1?/subscribe/i:/get|switch|subscribe|Start \d+-day free trial/i;l&&await t(n,l),await r.footer(n).getByRole("button",{name:c}).click()}}};var E=require("@playwright/test");var x=a=>{let{page:e}=a;return{...s(a),resolveForceOrganizationSelectionTask:async t=>{let o=e.getByRole("button",{name:/continue/i});await(0,E.expect)(o).toBeVisible(),await e.locator("input[name=name]").fill(t.name),await e.locator("input[name=slug]").fill(t.slug),await o.click()}}};var y=require("@playwright/test");var U=a=>{let{page:e}=a,r={...s(a),goTo:async t=>{let o=await e.goToRelative("/sign-in",t);return typeof t?.headlessSelector<"u"?await r.waitForMounted(t.headlessSelector):await r.waitForMounted(),o},waitForMounted:(t=".cl-signIn-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signIn-root)",{state:t==="closed"?"detached":"attached"}),setIdentifier:t=>r.getIdentifierInput().fill(t),setInstantPassword:async t=>{let o=r.getPasswordInput();await(0,y.expect)(o).toBeVisible(),await o.fill(t,{force:!0})},usePhoneNumberIdentifier:()=>e.getByRole("link",{name:/^use phone/i}),useEmailIdentifier:()=>e.getByRole("link",{name:/^use email/i}),useUsernameIdentifier:()=>e.getByRole("link",{name:/^username$/i}),getForgotPassword:()=>e.getByRole("link",{name:/forgot password/i}),getGoToSignUp:()=>e.getByRole("link",{name:/sign up/i}),getResetPassword:()=>e.getByRole("button",{name:/(reset password|reset your password)/i}),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i}),signInWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signInWithEmailAndInstantPassword:async({email:t,password:o,waitForSession:n=!0})=>{let i=r.getIdentifierInput();await(0,y.expect)(i).toBeVisible(),await i.fill(t),await r.setInstantPassword(o),await r.continue(),n&&await r.waitForSession()}};return r};var v=a=>{let{page:e}=a,r={...s(a),goTo:async t=>(await e.goToRelative("/sign-up",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-signUp-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signUp-root)",{state:t==="closed"?"detached":"attached"}),signUpWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signUp:async t=>{t.firstName&&await r.getFirstNameInput().fill(t.firstName),t.lastName&&await r.getLastNameInput().fill(t.lastName),t.email&&await r.getEmailAddressInput().fill(t.email),t.username&&await r.getUsernameInput().fill(t.username),t.phoneNumber&&await r.getPhoneNumberInput().fill(t.phoneNumber),t.password&&await r.getPasswordInput().fill(t.password),t.legalAccepted&&await r.getLegalAccepted().check(),await r.continue()},signUpWithEmailAndPassword:async t=>{await r.signUp({email:t.email,password:t.password})},waitForEmailVerificationScreen:async()=>{await e.waitForURL(/verify/),await e.getByRole("heading",{name:/Verify your email/i}).waitFor()}};return r};var I=a=>{let{page:e}=a,r={...s(a),waitForMounted:(t=".cl-subscriptionDetails-root")=>e.waitForSelector(t,{state:"attached"}),waitForUnmounted:()=>r.root.locator(".cl-drawerRoot").waitFor({state:"detached"}),closeDrawer:()=>r.root.locator(".cl-drawerClose").click(),root:e.locator(".cl-subscriptionDetails-root")};return r};var L=({page:a})=>({setup:async()=>m({page:a})});var j=require("@playwright/test"),A=".cl-userAvatarBox",M=a=>{let{page:e}=a,r={goTo:async t=>(await e.goToRelative("/user-avatar",t),r.waitForMounted()),waitForMounted:(t=A)=>e.waitForSelector(t,{state:"attached"}),toBeVisible:async(t=A)=>await(0,j.expect)(e.locator(t).getByRole("img")).toBeVisible()};return r};var _=require("@playwright/test"),N=a=>{let{page:e}=a;return{waitForMounted:()=>e.waitForSelector(".cl-userButtonTrigger",{state:"attached"}),toggleTrigger:()=>e.locator(".cl-userButtonTrigger").click(),waitForPopover:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"visible"}),waitForPopoverClosed:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"detached"}),toHaveVisibleMenuItems:async t=>{(typeof t=="string"||t instanceof RegExp)&&(t=[t]);for(let o of t)await(0,_.expect)(e.getByRole("menuitem",{name:o})).toBeVisible()},triggerSignOut:()=>e.getByRole("menuitem",{name:/Sign out$/i}).click(),triggerManageAccount:()=>e.getByRole("menuitem",{name:/Manage account/i}).click(),switchAccount:t=>e.getByText(t).click()}};var D=a=>{let{page:e}=a,r={...s(a),goTo:async t=>(await e.goToRelative("/user",t),r.waitForMounted()),switchToSecurityTab:async()=>{await e.getByText(/Security/i).click()},switchToBillingTab:async()=>{await e.getByText(/Billing/i).click()},waitForMounted:()=>e.waitForSelector(".cl-userProfile-root",{state:"attached"}),clickSetUsername:()=>e.getByText(/Set username/i).click(),clickToUpdateProfile:()=>e.getByText(/update profile/i).click(),clickUpdateUsername:()=>e.getByText(/update username/i).click(),clickSetPassword:()=>e.getByText(/Set password/i).click(),waitForSectionCard:(t,o)=>e.waitForSelector(`.cl-profileSectionContent__${t} .cl-headerTitle`,{state:o?"visible":"detached"}),waitForSectionCardOpened:t=>r.waitForSectionCard(t,!0),waitForSectionCardClosed:t=>r.waitForSectionCard(t,!1),typeUsername:t=>r.getUsernameInput().fill(t),typeFirstName:t=>r.getFirstNameInput().fill(t),typeLastName:t=>r.getLastNameInput().fill(t),typePhoneNumber:t=>r.getPhoneNumberInput().fill(t),clickAddEmailAddress:()=>e.getByText(/add email address/i).click(),clickAddPhoneNumber:()=>e.getByText(/add phone number/i).click(),typeEmailAddress:t=>e.getByLabel(/Email address/i).fill(t),waitForUserProfileModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-userProfile-root)",{state:t==="closed"?"detached":"attached"})};return r};var V=a=>{let{page:e}=a;return{...s(a),waitForMounted:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"attached"}),waitForClosed:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"detached"}),closeReverificationModal:()=>e.getByLabel("Close modal").click(),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i})}};var $=a=>{let{page:e}=a,r={...s(a),goTo:async t=>(await e.goToRelative("/waitlist",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-waitlist-root")=>e.waitForSelector(t,{state:"attached"}),joinWaitlist:async t=>{await r.getEmailAddressInput().fill(t.email),await r.joinWaitlistContinue()},joinWaitlistContinue:()=>e.getByRole("button",{name:"Join the waitlist",exact:!0}).click()};return r};var K=({page:a,useTestingToken:e=!0,baseURL:r})=>{let t=g({page:a,useTestingToken:e},{baseURL:r}),o={page:t};return{page:t,clerk:k(o),checkout:F(o),expect:S(o),impersonation:T(o),keylessPopover:R(o),organizationSwitcher:C(o),pricingTable:O(o),sessionTask:x(o),signIn:U(o),signUp:v(o),testingToken:L(o),userAvatar:M(o),userButton:N(o),userProfile:D(o),userVerification:V(o),waitlist:$(o),apiKeys:h(o),subscriptionDetails:I(o),planDetails:B(o)}};0&&(module.exports={createAppPageObject,createPageObjects});
1
+ "use strict";var w=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var Q=(a,e)=>{for(var r in e)w(a,r,{get:e[r],enumerable:!0})},X=(a,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Y(e))!Z.call(a,o)&&o!==r&&w(a,o,{get:()=>e[o],enumerable:!(t=J(e,o))||t.enumerable});return a};var ee=a=>X(w({},"__esModule",{value:!0}),a);var te={};Q(te,{createAppPageObject:()=>d,createPageObjects:()=>z});module.exports=ee(te);var i=({page:a})=>{let e={continue:()=>a.getByRole("button",{name:"Continue",exact:!0}).click(),setEmailAddress:r=>e.getEmailAddressInput().fill(r),setPassword:r=>e.getPasswordInput().fill(r),setPasswordConfirmation:r=>a.locator("input[name=confirmPassword]").fill(r),enterOtpCode:async(r,t)=>{let{name:o="Enter verification code",awaitAttempt:n=!0,awaitPrepare:s=!0,awaitRequests:l=!0}=t??{};l&&s&&await a.waitForResponse(p=>p.request().method()==="POST"&&(p.url().includes("prepare_verification")||p.url().includes("prepare_first_factor")));let c=a.getByRole("textbox",{name:"Enter verification code. Digit 1"});await c.isVisible()?(console.warn("Using the original OTP input"),await c.click(),await a.keyboard.type(r,{delay:100})):await a.getByLabel(o).fill(r),l&&n&&await a.waitForResponse(p=>p.request().method()==="POST"&&(p.url().includes("attempt_verification")||p.url().includes("attempt_first_factor")))},enterTestOtpCode:async r=>e.enterOtpCode("424242",r),fillTestOtpCode:async(r,t)=>e.enterOtpCode("424242",{name:r,...t}),getIdentifierInput:()=>a.locator("input[name=identifier]"),getEmailAddressInput:()=>a.locator("input[name=emailAddress]"),getPhoneNumberInput:()=>a.locator("input[name=phoneNumber]"),getUsernameInput:()=>a.locator("input[name=username]"),getPasswordInput:()=>a.locator("input[name=password]"),getLegalAccepted:()=>a.locator("input[name=legalAccepted]"),getFirstNameInput:()=>a.locator("input[name=firstName]"),getLastNameInput:()=>a.locator("input[name=lastName]"),waitForSession:async()=>a.waitForFunction(()=>!!window.Clerk?.session)};return e};var b=a=>{let{page:e}=a,r={never:"Never","1d":"1 Day","7d":"7 Days","30d":"30 Days","60d":"60 Days","90d":"90 Days","180d":"180 Days","1y":"1 Year"};return{...i(a),waitForMounted:()=>e.waitForSelector(".cl-apiKeys-root",{state:"attached"}),clickAddButton:()=>e.getByText(/Add new key/i).click(),waitForFormOpened:()=>e.waitForSelector(".cl-apiKeysCreateForm",{state:"attached"}),waitForFormClosed:()=>e.waitForSelector(".cl-apiKeysCreateForm",{state:"detached"}),waitForRevokeModalOpened:()=>e.waitForSelector(".cl-apiKeysRevokeModal",{state:"attached"}),waitForRevokeModalClosed:()=>e.waitForSelector(".cl-apiKeysRevokeModal",{state:"detached"}),typeName:o=>e.getByLabel(/Secret key name/i).fill(o),typeDescription:o=>e.getByLabel(/Description/i).fill(o),selectExpiration:async o=>(await e.getByRole("button",{name:/Select date/i}).click(),e.getByText(r[o??"never"],{exact:!0}).click({force:!0})),clickSaveButton:()=>e.getByText(/Create key/i).click(),typeRevokeConfirmation:o=>e.getByLabel(/Type "Revoke" to confirm/i).fill(o),clickConfirmRevokeButton:()=>e.getByText(/Revoke key/i).click()}};var P="__clerk_testing_token";var F="The Clerk Frontend API URL is required to bypass bot protection. Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.";var g=async({context:a,options:e,page:r})=>{let t=a??r?.context();if(!t)throw new Error("Either context or page must be provided to setup testing token");let o=e?.frontendApiUrl||process.env.CLERK_FAPI;if(!o)throw new Error(F);let n=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^https://${n}/v1/.*?(\\?.*)?$`);await t.route(s,async l=>{let c=new URL(l.request().url()),u=process.env.CLERK_TESTING_TOKEN;u&&c.searchParams.set(P,u);try{let p=await l.fetch({url:c.toString()}),m=await p.json();m?.response?.captcha_bypass===!1&&(m.response.captcha_bypass=!0),m?.client?.captcha_bypass===!1&&(m.client.captcha_bypass=!0),await l.fulfill({response:p,json:m})}catch{await l.continue({url:c.toString()}).catch(console.error)}})};var d=(a,e)=>{let{page:r,useTestingToken:t=!0}=a,o=Object.create(r);return Object.assign(o,{goToAppHome:async()=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");try{t&&await g({page:r}),await r.goto(e.baseURL)}catch{}},goToRelative:async(s,l={})=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");let c;try{r.url().includes("about:blank")?c=new URL(s,e.baseURL):c=new URL(s,r.url())}catch{c=new URL(s,e.baseURL)}return l.searchParams&&(c.search=l.searchParams.toString()),t&&await g({page:r}),r.goto(c.toString(),{timeout:l.timeout??2e4,waitUntil:l.waitUntil})},waitForClerkJsLoaded:async()=>r.waitForFunction(()=>window.Clerk?.loaded),signOut:async()=>r.waitForFunction(()=>window.Clerk?.signOut({})),waitForClerkComponentMounted:async()=>r.waitForSelector(".cl-rootBox",{state:"attached"}),waitForAppUrl:async s=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");return r.waitForURL(new URL(s,e.baseURL).toString())},cookies:async()=>{let s=await r.context().cookies(),l=s.reduce((c,u)=>(u.name.match(/^(__.*_)(.{8})$/)?c.set(u.name.replace(/^(__.*_)(.{8})$/,"$1*"),u):c.set(u.name,u),c),new Map);return Object.assign(l,{raw:()=>s})}})};var k=a=>{let{page:e}=a,r={...i(a),waitForMounted:(t=".cl-checkout-root")=>e.waitForSelector(t,{state:"attached",timeout:2e4}),closeDrawer:()=>e.locator(".cl-drawerClose").click(),fillTestCard:async()=>{await r.fillCard({number:"4242424242424242",expiration:"1234",cvc:"123",country:"United States",zip:"12345"})},fillCard:async t=>{await r.waitForStripeElements({state:"visible"});let o=e.frameLocator('iframe[src*="elements-inner-payment"]');await o.getByLabel("Card number").fill(t.number),await o.getByLabel("Expiration date").fill(t.expiration),await o.getByLabel("Security code").fill(t.cvc),await o.getByLabel("Country").selectOption(t.country),await o.getByLabel("ZIP code").fill(t.zip)},waitForStripeElements:async({state:t="visible"}={})=>{let o=e.locator('iframe[src*="elements-inner-payment"]');t==="visible"?(await o.waitFor({state:"attached",timeout:2e4}),await e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"visible",timeout:2e4})):await e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"hidden",timeout:2e4})},clickPayOrSubscribe:async()=>{await r.root.getByRole("button",{name:/subscribe|pay\s\$|start/i}).click()},waitForSubscribeButton:async()=>{await r.root.getByRole("button",{name:/^subscribe$/i}).waitFor({state:"visible"})},confirmAndContinue:async()=>{await r.root.getByRole("button",{name:/^continue$/i}).click()},clickAddPaymentMethod:async()=>{await r.root.getByRole("radio",{name:"Add payment method"}).click()},clickPaymentMethods:async()=>{await r.root.getByRole("radio",{name:"Payment Methods"}).click()},root:e.locator(".cl-checkout-root")};return r};var S=({page:a})=>({toBeLoaded:async()=>a.waitForFunction(()=>!!window.Clerk?.loaded),getClientSideActor:()=>a.evaluate(()=>window.Clerk?.session?.actor),toBeLoading:async()=>a.waitForFunction(()=>window.Clerk?.status==="loading"),toBeReady:async()=>a.waitForFunction(()=>window.Clerk?.status==="ready"),toBeDegraded:async()=>a.waitForFunction(()=>window.Clerk?.status==="degraded"),getClientSideUser:()=>a.evaluate(()=>window.Clerk?.user)});var f=require("@playwright/test"),T=({page:a})=>({toBeHandshake:async e=>{let r=await e.request().redirectedFrom()?.redirectedFrom()?.response();(0,f.expect)(r?.status()).toBe(307),(0,f.expect)(r?.headers()["x-clerk-auth-status"]).toContain("handshake")},toBeSignedOut:e=>a.waitForFunction(()=>!window.Clerk?.user,null,{timeout:e?.timeOut}),toBeSignedIn:async()=>a.waitForFunction(()=>!!window.Clerk?.user),toBeSignedInAsActor:async()=>a.waitForFunction(()=>!!window.Clerk?.session?.actor),toHaveResolvedTask:async()=>a.waitForFunction(()=>!window.Clerk?.session?.currentTask)});var R=a=>{let{page:e}=a;return{waitForMounted:(t=".cl-impersonationFab")=>e.waitForSelector(t,{state:"attached"}),getSignOutLink:()=>e.locator(".cl-impersonationFab").getByText("Sign out")}};var C=a=>{let{page:e}=a,r="#--clerk-keyless-prompt-button";return{waitForMounted:()=>e.waitForSelector(r,{state:"attached"}),waitForUnmounted:()=>e.waitForSelector(r,{state:"detached"}),isExpanded:()=>e.locator(r).getAttribute("aria-expanded").then(o=>o==="true"),toggle:()=>e.locator(r).click(),promptsToClaim:()=>e.getByRole("link",{name:/^claim application$/i}),promptToUseClaimedKeys:()=>e.getByRole("link",{name:/^get api keys$/i}),promptToDismiss:()=>e.getByRole("button",{name:/^dismiss$/i})}};var y=require("@playwright/test");var B=a=>{let{page:e}=a,r={...i(a),goTo:async(t="/switcher")=>(await e.goToRelative(t),r.waitForMounted()),waitForMounted:()=>e.waitForSelector(".cl-organizationSwitcher-root",{state:"attached"}),expectNoOrganizationSelected:()=>(0,y.expect)(e.getByText(/No organization selected/i)).toBeVisible(),expectPersonalAccount:()=>(0,y.expect)(e.getByText(/personal account/i)).toBeVisible(),toggleTrigger:()=>e.locator(".cl-organizationSwitcherTrigger").click(),waitForAnOrganizationToSelected:()=>e.waitForSelector(".cl-userPreviewMainIdentifier__personalWorkspace",{state:"detached"})};return r};var O=a=>{let{page:e}=a;return{...i(a),waitForMounted:(t=".cl-planDetails-root")=>e.waitForSelector(t,{state:"attached"}),root:e.locator(".cl-planDetails-root")}};var E=a=>{let{page:e}=a,r={toggle:n=>e.locator(`.cl-pricingTableCard__${n} .cl-pricingTableCardPeriodToggle`),indicator:n=>e.locator(`.cl-pricingTableCard__${n} .cl-switchIndicator`),badge:n=>e.locator(`.cl-pricingTableCard__${n} .cl-badge`),footer:n=>e.locator(`.cl-pricingTableCard__${n} .cl-pricingTableCardFooter`)},t=async(n,s)=>{async function l(u,p,m,W=5e3){return e.waitForFunction(({sel:q,attr:G,val:H})=>document.querySelector(q)?.getAttribute(G)===H,{sel:u,attr:p,val:m},{timeout:W}).then(()=>!0).catch(()=>!1)}let c=await l(`.cl-pricingTableCard__${n} .cl-switchIndicator`,"data-checked","true",500);c&&s==="monthly"&&await r.toggle(n).click(),!c&&s==="annually"&&await r.toggle(n).click()};return{...i(a),waitForMounted:(n=".cl-pricingTable-root")=>e.waitForSelector(n,{state:"attached"}),clickResubscribe:async()=>{await e.getByText("Re-subscribe").click()},waitToBeActive:async({planSlug:n})=>r.badge(n).getByText("Active").waitFor({state:"visible"}),waitToBeFreeTrial:async({planSlug:n})=>r.badge(n).getByText("Free trial").waitFor({state:"visible"}),getPlanCardCTA:({planSlug:n})=>r.footer(n).getByRole("button",{name:/get|switch|subscribe/i}),startCheckout:async({planSlug:n,shouldSwitch:s,period:l})=>{let c=s===!0?"Switch to this plan":s===!1?/subscribe/i:/get|switch|subscribe|Start \d+-day free trial/i;l&&await t(n,l),await r.footer(n).getByRole("button",{name:c}).click()}}};var x=require("@playwright/test");var U=a=>{let{page:e}=a;return{...i(a),resolveForceOrganizationSelectionTask:async t=>{let o=e.getByRole("button",{name:/continue/i});await(0,x.expect)(o).toBeVisible(),await e.locator("input[name=name]").fill(t.name),await e.locator("input[name=slug]").fill(t.slug),await o.click()}}};var h=require("@playwright/test");var v=a=>{let{page:e}=a,r={...i(a),goTo:async t=>{let o=await e.goToRelative("/sign-in",t);return typeof t?.headlessSelector<"u"?await r.waitForMounted(t.headlessSelector):await r.waitForMounted(),o},waitForMounted:(t=".cl-signIn-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signIn-root)",{state:t==="closed"?"detached":"attached"}),setIdentifier:t=>r.getIdentifierInput().fill(t),setInstantPassword:async t=>{let o=r.getPasswordInput();await(0,h.expect)(o).toBeVisible(),await o.fill(t,{force:!0})},usePhoneNumberIdentifier:()=>e.getByRole("link",{name:/^use phone/i}),useEmailIdentifier:()=>e.getByRole("link",{name:/^use email/i}),useUsernameIdentifier:()=>e.getByRole("link",{name:/^username$/i}),getForgotPassword:()=>e.getByRole("link",{name:/forgot password/i}),getGoToSignUp:()=>e.getByRole("link",{name:/sign up/i}),getResetPassword:()=>e.getByRole("button",{name:/(reset password|reset your password)/i}),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i}),signInWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signInWithEmailAndInstantPassword:async({email:t,password:o,waitForSession:n=!0})=>{let s=r.getIdentifierInput();await(0,h.expect)(s).toBeVisible(),await s.fill(t),await r.setInstantPassword(o),await r.continue(),n&&await r.waitForSession()}};return r};var I=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/sign-up",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-signUp-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signUp-root)",{state:t==="closed"?"detached":"attached"}),signUpWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signUp:async t=>{t.firstName&&await r.getFirstNameInput().fill(t.firstName),t.lastName&&await r.getLastNameInput().fill(t.lastName),t.email&&await r.getEmailAddressInput().fill(t.email),t.username&&await r.getUsernameInput().fill(t.username),t.phoneNumber&&await r.getPhoneNumberInput().fill(t.phoneNumber),t.password&&await r.getPasswordInput().fill(t.password),t.legalAccepted&&await r.getLegalAccepted().check(),await r.continue()},signUpWithEmailAndPassword:async t=>{await r.signUp({email:t.email,password:t.password})},waitForEmailVerificationScreen:async()=>{await e.waitForURL(/verify/),await e.getByRole("heading",{name:/Verify your email/i}).waitFor()}};return r};var L=a=>{let{page:e}=a,r={...i(a),waitForMounted:(t=".cl-subscriptionDetails-root")=>e.waitForSelector(t,{state:"attached"}),waitForUnmounted:()=>r.root.locator(".cl-drawerRoot").waitFor({state:"detached"}),closeDrawer:()=>r.root.locator(".cl-drawerClose").click(),root:e.locator(".cl-subscriptionDetails-root")};return r};var A=({page:a})=>({setup:async()=>g({page:a})});var M=require("@playwright/test"),j=".cl-userAvatarBox",_=a=>{let{page:e}=a,r={goTo:async t=>(await e.goToRelative("/user-avatar",t),r.waitForMounted()),waitForMounted:(t=j)=>e.waitForSelector(t,{state:"attached"}),toBeVisible:async(t=j)=>await(0,M.expect)(e.locator(t).getByRole("img")).toBeVisible()};return r};var N=require("@playwright/test"),D=a=>{let{page:e}=a;return{waitForMounted:()=>e.waitForSelector(".cl-userButtonTrigger",{state:"attached"}),toggleTrigger:()=>e.locator(".cl-userButtonTrigger").click(),waitForPopover:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"visible"}),waitForPopoverClosed:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"detached"}),toHaveVisibleMenuItems:async t=>{(typeof t=="string"||t instanceof RegExp)&&(t=[t]);for(let o of t)await(0,N.expect)(e.getByRole("menuitem",{name:o})).toBeVisible()},triggerSignOut:()=>e.getByRole("menuitem",{name:/Sign out$/i}).click(),triggerManageAccount:()=>e.getByRole("menuitem",{name:/Manage account/i}).click(),switchAccount:t=>e.getByText(t).click()}};var $=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/user",t),r.waitForMounted()),switchToSecurityTab:async()=>{await e.getByText(/Security/i).click()},switchToBillingTab:async()=>{await e.getByText(/Billing/i).click()},waitForMounted:()=>e.waitForSelector(".cl-userProfile-root",{state:"attached"}),clickSetUsername:()=>e.getByText(/Set username/i).click(),clickToUpdateProfile:()=>e.getByText(/update profile/i).click(),clickUpdateUsername:()=>e.getByText(/update username/i).click(),clickSetPassword:()=>e.getByText(/Set password/i).click(),waitForSectionCard:(t,o)=>e.waitForSelector(`.cl-profileSectionContent__${t} .cl-headerTitle`,{state:o?"visible":"detached"}),waitForSectionCardOpened:t=>r.waitForSectionCard(t,!0),waitForSectionCardClosed:t=>r.waitForSectionCard(t,!1),typeUsername:t=>r.getUsernameInput().fill(t),typeFirstName:t=>r.getFirstNameInput().fill(t),typeLastName:t=>r.getLastNameInput().fill(t),typePhoneNumber:t=>r.getPhoneNumberInput().fill(t),clickAddEmailAddress:()=>e.getByText(/add email address/i).click(),clickAddPhoneNumber:()=>e.getByText(/add phone number/i).click(),typeEmailAddress:t=>e.getByLabel(/Email address/i).fill(t),waitForUserProfileModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-userProfile-root)",{state:t==="closed"?"detached":"attached"})};return r};var V=a=>{let{page:e}=a;return{...i(a),waitForMounted:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"attached"}),waitForClosed:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"detached"}),closeReverificationModal:()=>e.getByLabel("Close modal").click(),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i})}};var K=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/waitlist",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-waitlist-root")=>e.waitForSelector(t,{state:"attached"}),joinWaitlist:async t=>{await r.getEmailAddressInput().fill(t.email),await r.joinWaitlistContinue()},joinWaitlistContinue:()=>e.getByRole("button",{name:"Join the waitlist",exact:!0}).click()};return r};var z=({page:a,useTestingToken:e=!0,baseURL:r})=>{let t=d({page:a,useTestingToken:e},{baseURL:r}),o={page:t};return{page:t,clerk:S(o),checkout:k(o),expect:T(o),impersonation:R(o),keylessPopover:C(o),organizationSwitcher:B(o),pricingTable:E(o),sessionTask:U(o),signIn:v(o),signUp:I(o),testingToken:A(o),userAvatar:_(o),userButton:D(o),userProfile:$(o),userVerification:V(o),waitlist:K(o),apiKeys:b(o),subscriptionDetails:L(o),planDetails:O(o)}};0&&(module.exports={createAppPageObject,createPageObjects});
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/playwright/unstable/index.ts","../../../src/playwright/unstable/page-objects/common.ts","../../../src/playwright/unstable/page-objects/apiKeys.ts","../../../src/common/constants.ts","../../../src/common/errors.ts","../../../src/playwright/setupClerkTestingToken.ts","../../../src/playwright/unstable/page-objects/app.ts","../../../src/playwright/unstable/page-objects/checkout.ts","../../../src/playwright/unstable/page-objects/clerk.ts","../../../src/playwright/unstable/page-objects/expect.ts","../../../src/playwright/unstable/page-objects/impersonation.ts","../../../src/playwright/unstable/page-objects/keylessPopover.ts","../../../src/playwright/unstable/page-objects/organizationSwitcher.ts","../../../src/playwright/unstable/page-objects/planDetails.ts","../../../src/playwright/unstable/page-objects/pricingTable.ts","../../../src/playwright/unstable/page-objects/sessionTask.ts","../../../src/playwright/unstable/page-objects/signIn.ts","../../../src/playwright/unstable/page-objects/signUp.ts","../../../src/playwright/unstable/page-objects/subscriptionDetails.ts","../../../src/playwright/unstable/page-objects/testingToken.ts","../../../src/playwright/unstable/page-objects/userAvatar.ts","../../../src/playwright/unstable/page-objects/userButton.ts","../../../src/playwright/unstable/page-objects/userProfile.ts","../../../src/playwright/unstable/page-objects/userVerification.ts","../../../src/playwright/unstable/page-objects/waitlist.ts","../../../src/playwright/unstable/page-objects/index.ts"],"sourcesContent":["import { createPageObjects } from './page-objects';\nimport { createAppPageObject } from './page-objects/app';\n\nexport type { EnhancedPage } from './page-objects/app';\nexport { createPageObjects, createAppPageObject };\n","import type { EnhancedPage } from './app';\n\ntype EnterOtpCodeOptions = {\n name?: string;\n awaitRequests?: boolean;\n awaitPrepare?: boolean;\n awaitAttempt?: boolean;\n};\n\nexport const common = ({ page }: { page: EnhancedPage }) => {\n const self = {\n continue: () => {\n return page.getByRole('button', { name: 'Continue', exact: true }).click();\n },\n setEmailAddress: (val: string) => {\n return self.getEmailAddressInput().fill(val);\n },\n setPassword: (val: string) => {\n return self.getPasswordInput().fill(val);\n },\n setPasswordConfirmation: (val: string) => {\n return page.locator('input[name=confirmPassword]').fill(val);\n },\n enterOtpCode: async (code: string, opts?: EnterOtpCodeOptions) => {\n const {\n name = 'Enter verification code',\n awaitAttempt = true,\n awaitPrepare = true,\n awaitRequests = true,\n } = opts ?? {};\n\n if (awaitRequests && awaitPrepare) {\n const prepareVerificationPromise = page.waitForResponse(\n response =>\n response.request().method() === 'POST' &&\n (response.url().includes('prepare_verification') || response.url().includes('prepare_first_factor')),\n );\n await prepareVerificationPromise;\n }\n\n // Handle the case for both OTP input versions\n const originalInput = page.getByRole('textbox', { name: 'Enter verification code. Digit 1' });\n if (await originalInput.isVisible()) {\n console.warn('Using the original OTP input');\n await originalInput.click();\n await page.keyboard.type(code, { delay: 100 });\n } else {\n await page.getByLabel(name).fill(code);\n }\n\n if (awaitRequests && awaitAttempt) {\n const attemptVerificationPromise = page.waitForResponse(\n response =>\n response.request().method() === 'POST' &&\n (response.url().includes('attempt_verification') || response.url().includes('attempt_first_factor')),\n );\n await attemptVerificationPromise;\n }\n },\n enterTestOtpCode: async (opts?: EnterOtpCodeOptions) => {\n return self.enterOtpCode('424242', opts);\n },\n // @deprecated Use .enterTestOtpCode({ name: '...' }) instead\n fillTestOtpCode: async (name: string, opts?: Omit<EnterOtpCodeOptions, 'name'>) => {\n return self.enterOtpCode('424242', { name, ...opts });\n },\n getIdentifierInput: () => {\n return page.locator('input[name=identifier]');\n },\n getEmailAddressInput: () => {\n return page.locator('input[name=emailAddress]');\n },\n getPhoneNumberInput: () => {\n return page.locator('input[name=phoneNumber]');\n },\n getUsernameInput: () => {\n return page.locator('input[name=username]');\n },\n getPasswordInput: () => {\n return page.locator('input[name=password]');\n },\n getLegalAccepted: () => {\n return page.locator('input[name=legalAccepted]');\n },\n getFirstNameInput: () => {\n return page.locator('input[name=firstName]');\n },\n getLastNameInput: () => {\n return page.locator('input[name=lastName]');\n },\n waitForSession: async () => {\n return page.waitForFunction(() => {\n return !!window.Clerk?.session;\n });\n },\n };\n\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createAPIKeysComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const expirationOptions = {\n never: 'Never',\n '1d': '1 Day',\n '7d': '7 Days',\n '30d': '30 Days',\n '60d': '60 Days',\n '90d': '90 Days',\n '180d': '180 Days',\n '1y': '1 Year',\n } as const;\n\n const self = {\n ...common(testArgs),\n waitForMounted: () => {\n return page.waitForSelector('.cl-apiKeys-root', { state: 'attached' });\n },\n clickAddButton: () => {\n return page.getByText(/Add new key/i).click();\n },\n waitForFormOpened: () => {\n return page.waitForSelector('.cl-apiKeysCreateForm', { state: 'attached' });\n },\n waitForFormClosed: () => {\n return page.waitForSelector('.cl-apiKeysCreateForm', { state: 'detached' });\n },\n waitForRevokeModalOpened: () => {\n return page.waitForSelector('.cl-apiKeysRevokeModal', { state: 'attached' });\n },\n waitForRevokeModalClosed: () => {\n return page.waitForSelector('.cl-apiKeysRevokeModal', { state: 'detached' });\n },\n typeName: (value: string) => {\n return page.getByLabel(/Secret key name/i).fill(value);\n },\n typeDescription: (value: string) => {\n return page.getByLabel(/Description/i).fill(value);\n },\n selectExpiration: async (value?: keyof typeof expirationOptions) => {\n await page.getByRole('button', { name: /Select date/i }).click();\n return page.getByText(expirationOptions[value ?? 'never'], { exact: true }).click({ force: true });\n },\n clickSaveButton: () => {\n return page.getByText(/Create key/i).click();\n },\n typeRevokeConfirmation: (value: string) => {\n return page.getByLabel(/Type \"Revoke\" to confirm/i).fill(value);\n },\n clickConfirmRevokeButton: () => {\n return page.getByText(/Revoke key/i).click();\n },\n };\n return self;\n};\n","export const TESTING_TOKEN_PARAM = '__clerk_testing_token';\n","export const ERROR_MISSING_FRONTEND_API_URL =\n 'The Clerk Frontend API URL is required to bypass bot protection. ' +\n 'Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.';\n","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","import type { Page } from '@playwright/test';\n\nimport { setupClerkTestingToken } from '../../setupClerkTestingToken';\n\nexport type EnhancedPage = ReturnType<typeof createAppPageObject>;\nexport const createAppPageObject = (testArgs: { page: Page; useTestingToken?: boolean }, app: { baseURL?: string }) => {\n const { page, useTestingToken = true } = testArgs;\n const appPage = Object.create(page) as Page;\n const helpers = {\n goToAppHome: async () => {\n if (!app.baseURL) {\n throw new Error(\n 'Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.',\n );\n }\n\n try {\n if (useTestingToken) {\n await setupClerkTestingToken({ page });\n }\n\n await page.goto(app.baseURL);\n } catch {\n // do not fail the test if interstitial is returned (401)\n }\n },\n goToRelative: async (\n path: string,\n opts: { waitUntil?: any; searchParams?: URLSearchParams; timeout?: number } = {},\n ) => {\n if (!app.baseURL) {\n throw new Error(\n 'Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.',\n );\n }\n let url: URL;\n\n try {\n // When testing applications using real domains we want to manually navigate to the domain first\n // and not follow serverUrl (localhost) by default, as this is usually proxied\n if (page.url().includes('about:blank')) {\n url = new URL(path, app.baseURL);\n } else {\n url = new URL(path, page.url());\n }\n } catch {\n // However, in most tests we don't need to manually navigate to the domain\n // as the test is using a localhost app directly\n // This handles the case where the page is at about:blank\n // and instead it uses the serverUrl\n url = new URL(path, app.baseURL);\n }\n\n if (opts.searchParams) {\n url.search = opts.searchParams.toString();\n }\n\n if (useTestingToken) {\n await setupClerkTestingToken({ page });\n }\n\n return page.goto(url.toString(), { timeout: opts.timeout ?? 20000, waitUntil: opts.waitUntil });\n },\n waitForClerkJsLoaded: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.loaded;\n });\n },\n signOut: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.signOut({});\n });\n },\n waitForClerkComponentMounted: async () => {\n return page.waitForSelector('.cl-rootBox', { state: 'attached' });\n },\n waitForAppUrl: async (relativePath: string) => {\n if (!app.baseURL) {\n throw new Error(\n 'Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.',\n );\n }\n return page.waitForURL(new URL(relativePath, app.baseURL).toString());\n },\n /**\n * Get the cookies for the URL the page is currently at.\n * Suffixed cookies can be accessed by using the wildcard character `*` at the end of the cookie name,\n * eg `get('__session')` and `get('__session_*')`.\n */\n cookies: async () => {\n const array = await page.context().cookies();\n const map = array.reduce((acc, cookie) => {\n // If a suffixed cookie is found, we usually don't care about the suffix itself\n // Instead, simply replace the suffix with _* so we can easily read it\n // TODO: deal with collisions if neede\n // TODO: might be too much magic here\n // Maybe extract this into a different helper?\n if (cookie.name.match(/^(__.*_)(.{8})$/)) {\n acc.set(cookie.name.replace(/^(__.*_)(.{8})$/, '$1*'), cookie);\n } else {\n acc.set(cookie.name, cookie);\n }\n return acc;\n }, new Map<string, (typeof array)[number]>());\n return Object.assign(map, { raw: () => array });\n },\n };\n return Object.assign(appPage, helpers);\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createCheckoutPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-checkout-root') => {\n return page.waitForSelector(selector, { state: 'attached', timeout: 20000 });\n },\n closeDrawer: () => {\n return page.locator('.cl-drawerClose').click();\n },\n fillTestCard: async () => {\n await self.fillCard({\n number: '4242424242424242',\n expiration: '1234',\n cvc: '123',\n country: 'United States',\n zip: '12345',\n });\n },\n fillCard: async (card: { number: string; expiration: string; cvc: string; country: string; zip: string }) => {\n await self.waitForStripeElements({ state: 'visible' });\n const frame = page.frameLocator('iframe[src*=\"elements-inner-payment\"]');\n await frame.getByLabel('Card number').fill(card.number);\n await frame.getByLabel('Expiration date').fill(card.expiration);\n await frame.getByLabel('Security code').fill(card.cvc);\n await frame.getByLabel('Country').selectOption(card.country);\n await frame.getByLabel('ZIP code').fill(card.zip);\n },\n waitForStripeElements: async ({ state = 'visible' }: { state?: 'visible' | 'hidden' } = {}) => {\n const iframe = page.locator('iframe[src*=\"elements-inner-payment\"]');\n if (state === 'visible') {\n await iframe.waitFor({ state: 'attached', timeout: 20000 });\n await page.frameLocator('iframe[src*=\"elements-inner-payment\"]').getByLabel('Card number').waitFor({\n state: 'visible',\n timeout: 20000,\n });\n } else {\n await page.frameLocator('iframe[src*=\"elements-inner-payment\"]').getByLabel('Card number').waitFor({\n state: 'hidden',\n timeout: 20000,\n });\n }\n },\n clickPayOrSubscribe: async () => {\n await self.root.getByRole('button', { name: /subscribe|pay\\s\\$|start/i }).click();\n },\n waitForSubscribeButton: async () => {\n await self.root.getByRole('button', { name: /^subscribe$/i }).waitFor({ state: 'visible' });\n },\n confirmAndContinue: async () => {\n await self.root.getByRole('button', { name: /^continue$/i }).click();\n },\n clickAddPaymentMethod: async () => {\n await self.root.getByRole('radio', { name: 'Add payment method' }).click();\n },\n clickPaymentMethods: async () => {\n await self.root.getByRole('radio', { name: 'Payment Methods' }).click();\n },\n root: page.locator('.cl-checkout-root'),\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\n\nexport const createClerkPageObject = ({ page }: { page: EnhancedPage }) => {\n return {\n toBeLoaded: async () => {\n return page.waitForFunction(() => {\n return !!window.Clerk?.loaded;\n });\n },\n getClientSideActor: () => {\n return page.evaluate(() => {\n return window.Clerk?.session?.actor;\n });\n },\n toBeLoading: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.status === 'loading';\n });\n },\n toBeReady: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.status === 'ready';\n });\n },\n toBeDegraded: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.status === 'degraded';\n });\n },\n getClientSideUser: () => {\n return page.evaluate(() => {\n return window.Clerk?.user;\n });\n },\n };\n};\n","import type { Response } from '@playwright/test';\nimport { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\n\nexport const createExpectPageObject = ({ page }: { page: EnhancedPage }) => {\n return {\n toBeHandshake: async (res: Response) => {\n // Travel the redirect chain until we find the handshake header\n // TODO: Loop through the redirects until we find a handshake header, or timeout trying\n const redirect = await res.request().redirectedFrom()?.redirectedFrom()?.response();\n expect(redirect?.status()).toBe(307);\n expect(redirect?.headers()['x-clerk-auth-status']).toContain('handshake');\n },\n toBeSignedOut: (args?: { timeOut: number }) => {\n return page.waitForFunction(\n () => {\n return !window.Clerk?.user;\n },\n null,\n { timeout: args?.timeOut },\n );\n },\n toBeSignedIn: async () => {\n return page.waitForFunction(() => {\n return !!window.Clerk?.user;\n });\n },\n toBeSignedInAsActor: async () => {\n return page.waitForFunction(() => {\n return !!window.Clerk?.session?.actor;\n });\n },\n toHaveResolvedTask: async () => {\n return page.waitForFunction(() => {\n return !window.Clerk?.session?.currentTask;\n });\n },\n };\n};\n","import type { EnhancedPage } from './app';\n\nexport const createImpersonationPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n waitForMounted: (selector = '.cl-impersonationFab') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n getSignOutLink: () => {\n return page.locator('.cl-impersonationFab').getByText('Sign out');\n },\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\n\nexport const createKeylessPopoverPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n // TODO: Is this the ID we really want ?\n const elementId = '#--clerk-keyless-prompt-button';\n const self = {\n waitForMounted: () => page.waitForSelector(elementId, { state: 'attached' }),\n waitForUnmounted: () => page.waitForSelector(elementId, { state: 'detached' }),\n isExpanded: () =>\n page\n .locator(elementId)\n .getAttribute('aria-expanded')\n .then(val => val === 'true'),\n toggle: () => page.locator(elementId).click(),\n\n promptsToClaim: () => {\n return page.getByRole('link', { name: /^claim application$/i });\n },\n promptToUseClaimedKeys: () => {\n return page.getByRole('link', { name: /^get api keys$/i });\n },\n promptToDismiss: () => {\n return page.getByRole('button', { name: /^dismiss$/i });\n },\n };\n return self;\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createOrganizationSwitcherComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n ...common(testArgs),\n goTo: async (relativePath = '/switcher') => {\n await page.goToRelative(relativePath);\n return self.waitForMounted();\n },\n waitForMounted: () => {\n return page.waitForSelector('.cl-organizationSwitcher-root', { state: 'attached' });\n },\n expectNoOrganizationSelected: () => {\n return expect(page.getByText(/No organization selected/i)).toBeVisible();\n },\n expectPersonalAccount: () => {\n return expect(page.getByText(/personal account/i)).toBeVisible();\n },\n toggleTrigger: () => {\n return page.locator('.cl-organizationSwitcherTrigger').click();\n },\n waitForAnOrganizationToSelected: () => {\n return page.waitForSelector('.cl-userPreviewMainIdentifier__personalWorkspace', { state: 'detached' });\n },\n };\n\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createPlanDetailsPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-planDetails-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n root: page.locator('.cl-planDetails-root'),\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\ntype BillingPeriod = 'monthly' | 'annually';\n\nexport const createPricingTablePageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const locators = {\n toggle: (planSlug: string) => page.locator(`.cl-pricingTableCard__${planSlug} .cl-pricingTableCardPeriodToggle`),\n indicator: (planSlug: string) => page.locator(`.cl-pricingTableCard__${planSlug} .cl-switchIndicator`),\n badge: (planSlug: string) => page.locator(`.cl-pricingTableCard__${planSlug} .cl-badge`),\n footer: (planSlug: string) => page.locator(`.cl-pricingTableCard__${planSlug} .cl-pricingTableCardFooter`),\n };\n\n const ensurePricingPeriod = async (planSlug: string, period: BillingPeriod): Promise<void> => {\n async function waitForAttribute(selector: string, attribute: string, value: string, timeout = 5000) {\n return page\n .waitForFunction(\n ({ sel, attr, val }) => {\n const element = document.querySelector(sel);\n return element?.getAttribute(attr) === val;\n },\n { sel: selector, attr: attribute, val: value },\n { timeout },\n )\n .then(() => {\n return true;\n })\n .catch(() => {\n return false;\n });\n }\n\n const isAnnually = await waitForAttribute(\n `.cl-pricingTableCard__${planSlug} .cl-switchIndicator`,\n 'data-checked',\n 'true',\n 500,\n );\n\n if (isAnnually && period === 'monthly') {\n await locators.toggle(planSlug).click();\n }\n\n if (!isAnnually && period === 'annually') {\n await locators.toggle(planSlug).click();\n }\n };\n\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-pricingTable-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n clickResubscribe: async () => {\n await page.getByText('Re-subscribe').click();\n },\n waitToBeActive: async ({ planSlug }: { planSlug: string }) => {\n return locators.badge(planSlug).getByText('Active').waitFor({ state: 'visible' });\n },\n waitToBeFreeTrial: async ({ planSlug }: { planSlug: string }) => {\n return locators.badge(planSlug).getByText('Free trial').waitFor({ state: 'visible' });\n },\n getPlanCardCTA: ({ planSlug }: { planSlug: string }) => {\n return locators.footer(planSlug).getByRole('button', {\n name: /get|switch|subscribe/i,\n });\n },\n startCheckout: async ({\n planSlug,\n shouldSwitch,\n period,\n }: {\n planSlug: string;\n shouldSwitch?: boolean;\n period?: BillingPeriod;\n }) => {\n const targetButtonName =\n shouldSwitch === true\n ? 'Switch to this plan'\n : shouldSwitch === false\n ? /subscribe/i\n : /get|switch|subscribe|Start \\d+-day free trial/i;\n\n if (period) {\n await ensurePricingPeriod(planSlug, period);\n }\n\n await locators\n .footer(planSlug)\n .getByRole('button', {\n name: targetButtonName,\n })\n .click();\n },\n };\n return self;\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createSessionTaskComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n ...common(testArgs),\n resolveForceOrganizationSelectionTask: async (fakeOrganization: { name: string; slug: string }) => {\n const createOrganizationButton = page.getByRole('button', { name: /continue/i });\n\n await expect(createOrganizationButton).toBeVisible();\n\n await page.locator('input[name=name]').fill(fakeOrganization.name);\n await page.locator('input[name=slug]').fill(fakeOrganization.slug);\n\n await createOrganizationButton.click();\n },\n };\n\n return self;\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createSignInComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n goTo: async (opts?: { searchParams?: URLSearchParams; headlessSelector?: string; timeout?: number }) => {\n const navRes = await page.goToRelative('/sign-in', opts);\n\n if (typeof opts?.headlessSelector !== 'undefined') {\n await self.waitForMounted(opts.headlessSelector);\n } else {\n await self.waitForMounted();\n }\n return navRes;\n },\n waitForMounted: (selector = '.cl-signIn-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n waitForModal: (state?: 'open' | 'closed') => {\n return page.waitForSelector('.cl-modalContent:has(.cl-signIn-root)', {\n state: state === 'closed' ? 'detached' : 'attached',\n });\n },\n setIdentifier: (val: string) => {\n return self.getIdentifierInput().fill(val);\n },\n setInstantPassword: async (val: string) => {\n const passField = self.getPasswordInput();\n await expect(passField).toBeVisible();\n await passField.fill(val, { force: true });\n },\n usePhoneNumberIdentifier: () => {\n return page.getByRole('link', { name: /^use phone/i });\n },\n useEmailIdentifier: () => {\n return page.getByRole('link', { name: /^use email/i });\n },\n useUsernameIdentifier: () => {\n return page.getByRole('link', { name: /^username$/i });\n },\n getForgotPassword: () => {\n return page.getByRole('link', { name: /forgot password/i });\n },\n getGoToSignUp: () => {\n return page.getByRole('link', { name: /sign up/i });\n },\n getResetPassword: () => {\n return page.getByRole('button', { name: /(reset password|reset your password)/i });\n },\n getUseAnotherMethodLink: () => {\n return page.getByRole('link', { name: /use another method/i });\n },\n getAltMethodsEmailCodeButton: () => {\n return page.getByRole('button', { name: /email code to/i });\n },\n getAltMethodsEmailLinkButton: () => {\n return page.getByRole('button', { name: /email link to/i });\n },\n signInWithOauth: (provider: string) => {\n return page.getByRole('button', { name: new RegExp(`continue with ${provider}`, 'gi') });\n },\n signInWithEmailAndInstantPassword: async ({\n email,\n password,\n waitForSession = true,\n }: {\n email: string;\n password: string;\n waitForSession?: boolean;\n }) => {\n const identifierField = self.getIdentifierInput();\n await expect(identifierField).toBeVisible();\n\n await identifierField.fill(email);\n await self.setInstantPassword(password);\n await self.continue();\n\n if (waitForSession) {\n await self.waitForSession();\n }\n },\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\ntype SignUpFormInputs = {\n email?: string;\n password?: string;\n firstName?: string;\n lastName?: string;\n username?: string;\n phoneNumber?: string;\n legalAccepted?: boolean;\n};\n\nexport const createSignUpComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n ...common(testArgs),\n goTo: async (opts?: { searchParams?: URLSearchParams; headlessSelector?: string }) => {\n await page.goToRelative('/sign-up', { searchParams: opts?.searchParams });\n\n if (typeof opts?.headlessSelector !== 'undefined') {\n return self.waitForMounted(opts.headlessSelector);\n }\n return self.waitForMounted();\n },\n waitForMounted: (selector = '.cl-signUp-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n waitForModal: (state?: 'open' | 'closed') => {\n return page.waitForSelector('.cl-modalContent:has(.cl-signUp-root)', {\n state: state === 'closed' ? 'detached' : 'attached',\n });\n },\n signUpWithOauth: (provider: string) => {\n return page.getByRole('button', { name: new RegExp(`continue with ${provider}`, 'gi') });\n },\n signUp: async (opts: SignUpFormInputs) => {\n if (opts.firstName) {\n await self.getFirstNameInput().fill(opts.firstName);\n }\n\n if (opts.lastName) {\n await self.getLastNameInput().fill(opts.lastName);\n }\n\n if (opts.email) {\n await self.getEmailAddressInput().fill(opts.email);\n }\n\n if (opts.username) {\n await self.getUsernameInput().fill(opts.username);\n }\n\n if (opts.phoneNumber) {\n await self.getPhoneNumberInput().fill(opts.phoneNumber);\n }\n\n if (opts.password) {\n await self.getPasswordInput().fill(opts.password);\n }\n\n if (opts.legalAccepted) {\n await self.getLegalAccepted().check();\n }\n\n await self.continue();\n },\n signUpWithEmailAndPassword: async (opts: Pick<SignUpFormInputs, 'email' | 'password'>) => {\n await self.signUp({ email: opts.email, password: opts.password });\n },\n waitForEmailVerificationScreen: async () => {\n await page.waitForURL(/verify/);\n await page.getByRole('heading', { name: /Verify your email/i }).waitFor();\n },\n };\n\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createSubscriptionDetailsPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-subscriptionDetails-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n waitForUnmounted: () => {\n return self.root.locator('.cl-drawerRoot').waitFor({ state: 'detached' });\n },\n closeDrawer: () => {\n return self.root.locator('.cl-drawerClose').click();\n },\n root: page.locator('.cl-subscriptionDetails-root'),\n };\n return self;\n};\n","import { setupClerkTestingToken } from '../../setupClerkTestingToken';\nimport type { EnhancedPage } from './app';\n\nexport const createTestingTokenPageObject = ({ page }: { page: EnhancedPage }) => {\n return {\n setup: async () => setupClerkTestingToken({ page }),\n };\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\n\nconst SELECTOR = '.cl-userAvatarBox';\n\nexport const createUserAvatarPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n goTo: async (opts?: { searchParams: URLSearchParams }) => {\n await page.goToRelative('/user-avatar', opts);\n return self.waitForMounted();\n },\n waitForMounted: (selector = SELECTOR) => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n toBeVisible: async (selector = SELECTOR) => {\n return await expect(page.locator(selector).getByRole('img')).toBeVisible();\n },\n };\n\n return self;\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\n\nexport const createUserButtonPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n waitForMounted: () => {\n return page.waitForSelector('.cl-userButtonTrigger', { state: 'attached' });\n },\n toggleTrigger: () => {\n return page.locator('.cl-userButtonTrigger').click();\n },\n waitForPopover: () => {\n return page.waitForSelector('.cl-userButtonPopoverCard', { state: 'visible' });\n },\n waitForPopoverClosed: () => {\n return page.waitForSelector('.cl-userButtonPopoverCard', { state: 'detached' });\n },\n toHaveVisibleMenuItems: async (menuItems: string | RegExp | Array<string | RegExp>) => {\n if (typeof menuItems === 'string' || menuItems instanceof RegExp) {\n menuItems = [menuItems];\n }\n for (const menuItem of menuItems) {\n await expect(page.getByRole('menuitem', { name: menuItem })).toBeVisible();\n }\n },\n triggerSignOut: () => {\n return page.getByRole('menuitem', { name: /Sign out$/i }).click();\n },\n triggerManageAccount: () => {\n return page.getByRole('menuitem', { name: /Manage account/i }).click();\n },\n switchAccount: (emailAddress: string) => {\n return page.getByText(emailAddress).click();\n },\n };\n\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport type Sections = 'profile' | 'emailAddresses' | 'username' | 'phoneNumbers' | 'danger';\n\nexport const createUserProfileComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n goTo: async (opts?: { searchParams: URLSearchParams }) => {\n await page.goToRelative('/user', opts);\n return self.waitForMounted();\n },\n switchToSecurityTab: async () => {\n await page.getByText(/Security/i).click();\n },\n switchToBillingTab: async () => {\n await page.getByText(/Billing/i).click();\n },\n waitForMounted: () => {\n return page.waitForSelector('.cl-userProfile-root', { state: 'attached' });\n },\n clickSetUsername: () => {\n return page.getByText(/Set username/i).click();\n },\n clickToUpdateProfile: () => {\n return page.getByText(/update profile/i).click();\n },\n clickUpdateUsername: () => {\n return page.getByText(/update username/i).click();\n },\n clickSetPassword: () => {\n return page.getByText(/Set password/i).click();\n },\n waitForSectionCard: (section: Sections, opened: boolean) => {\n return page.waitForSelector(`.cl-profileSectionContent__${section} .cl-headerTitle`, {\n state: opened ? 'visible' : 'detached',\n });\n },\n waitForSectionCardOpened: (section: Sections) => {\n return self.waitForSectionCard(section, true);\n },\n waitForSectionCardClosed: (section: Sections) => {\n return self.waitForSectionCard(section, false);\n },\n typeUsername: (value: string) => {\n return self.getUsernameInput().fill(value);\n },\n typeFirstName: (value: string) => {\n return self.getFirstNameInput().fill(value);\n },\n typeLastName: (value: string) => {\n return self.getLastNameInput().fill(value);\n },\n typePhoneNumber: (value: string) => {\n return self.getPhoneNumberInput().fill(value);\n },\n clickAddEmailAddress: () => {\n return page.getByText(/add email address/i).click();\n },\n clickAddPhoneNumber: () => {\n return page.getByText(/add phone number/i).click();\n },\n typeEmailAddress: (value: string) => {\n return page.getByLabel(/Email address/i).fill(value);\n },\n waitForUserProfileModal: (state?: 'open' | 'closed') => {\n return page.waitForSelector('.cl-modalContent:has(.cl-userProfile-root)', {\n state: state === 'closed' ? 'detached' : 'attached',\n });\n },\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createUserVerificationComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-userVerification-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n waitForClosed: (selector = '.cl-userVerification-root') => {\n return page.waitForSelector(selector, { state: 'detached' });\n },\n closeReverificationModal: () => {\n return page.getByLabel('Close modal').click();\n },\n getUseAnotherMethodLink: () => {\n return page.getByRole('link', { name: /use another method/i });\n },\n getAltMethodsEmailCodeButton: () => {\n return page.getByRole('button', { name: /email code to/i });\n },\n getAltMethodsEmailLinkButton: () => {\n return page.getByRole('button', { name: /email link to/i });\n },\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\ntype WaitlistFormInputs = {\n email: string;\n};\n\nexport const createWaitlistComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n ...common(testArgs),\n goTo: async (opts?: { searchParams?: URLSearchParams; headlessSelector?: string }) => {\n await page.goToRelative('/waitlist', { searchParams: opts?.searchParams });\n\n if (typeof opts?.headlessSelector !== 'undefined') {\n return self.waitForMounted(opts.headlessSelector);\n }\n return self.waitForMounted();\n },\n waitForMounted: (selector = '.cl-waitlist-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n joinWaitlist: async (opts: WaitlistFormInputs) => {\n await self.getEmailAddressInput().fill(opts.email);\n\n await self.joinWaitlistContinue();\n },\n joinWaitlistContinue: () => {\n return page.getByRole('button', { name: 'Join the waitlist', exact: true }).click();\n },\n };\n\n return self;\n};\n","import type { Page } from '@playwright/test';\n\nimport { createAPIKeysComponentPageObject } from './apiKeys';\nimport { createAppPageObject } from './app';\nimport { createCheckoutPageObject } from './checkout';\nimport { createClerkPageObject } from './clerk';\nimport { createExpectPageObject } from './expect';\nimport { createImpersonationPageObject } from './impersonation';\nimport { createKeylessPopoverPageObject } from './keylessPopover';\nimport { createOrganizationSwitcherComponentPageObject } from './organizationSwitcher';\nimport { createPlanDetailsPageObject } from './planDetails';\nimport { createPricingTablePageObject } from './pricingTable';\nimport { createSessionTaskComponentPageObject } from './sessionTask';\nimport { createSignInComponentPageObject } from './signIn';\nimport { createSignUpComponentPageObject } from './signUp';\nimport { createSubscriptionDetailsPageObject } from './subscriptionDetails';\nimport { createTestingTokenPageObject } from './testingToken';\nimport { createUserAvatarPageObject } from './userAvatar';\nimport { createUserButtonPageObject } from './userButton';\nimport { createUserProfileComponentPageObject } from './userProfile';\nimport { createUserVerificationComponentPageObject } from './userVerification';\nimport { createWaitlistComponentPageObject } from './waitlist';\n\nexport const createPageObjects = ({\n page,\n useTestingToken = true,\n baseURL,\n}: {\n page: Page;\n useTestingToken?: boolean;\n baseURL?: string;\n}) => {\n const app = createAppPageObject({ page, useTestingToken }, { baseURL });\n const testArgs = { page: app };\n\n return {\n page: app,\n clerk: createClerkPageObject(testArgs),\n checkout: createCheckoutPageObject(testArgs),\n expect: createExpectPageObject(testArgs),\n impersonation: createImpersonationPageObject(testArgs),\n keylessPopover: createKeylessPopoverPageObject(testArgs),\n organizationSwitcher: createOrganizationSwitcherComponentPageObject(testArgs),\n pricingTable: createPricingTablePageObject(testArgs),\n sessionTask: createSessionTaskComponentPageObject(testArgs),\n signIn: createSignInComponentPageObject(testArgs),\n signUp: createSignUpComponentPageObject(testArgs),\n testingToken: createTestingTokenPageObject(testArgs),\n userAvatar: createUserAvatarPageObject(testArgs),\n userButton: createUserButtonPageObject(testArgs),\n userProfile: createUserProfileComponentPageObject(testArgs),\n userVerification: createUserVerificationComponentPageObject(testArgs),\n waitlist: createWaitlistComponentPageObject(testArgs),\n apiKeys: createAPIKeysComponentPageObject(testArgs),\n subscriptionDetails: createSubscriptionDetailsPageObject(testArgs),\n planDetails: createPlanDetailsPageObject(testArgs),\n };\n};\n"],"mappings":"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","names":["unstable_exports","__export","createAppPageObject","createPageObjects","__toCommonJS","common","page","self","val","code","opts","name","awaitAttempt","awaitPrepare","awaitRequests","response","originalInput","createAPIKeysComponentPageObject","testArgs","page","expirationOptions","common","value","TESTING_TOKEN_PARAM","ERROR_MISSING_FRONTEND_API_URL","setupClerkTestingToken","context","options","page","browserContext","fapiUrl","ERROR_MISSING_FRONTEND_API_URL","apiUrl","route","originalUrl","testingToken","TESTING_TOKEN_PARAM","response","json","createAppPageObject","testArgs","app","page","useTestingToken","appPage","setupClerkTestingToken","path","opts","url","relativePath","array","map","acc","cookie","createCheckoutPageObject","testArgs","page","self","common","selector","card","frame","state","iframe","createClerkPageObject","page","import_test","createExpectPageObject","page","res","redirect","args","createImpersonationPageObject","testArgs","page","selector","createKeylessPopoverPageObject","testArgs","page","elementId","val","import_test","createOrganizationSwitcherComponentPageObject","testArgs","page","self","common","relativePath","createPlanDetailsPageObject","testArgs","page","common","selector","createPricingTablePageObject","testArgs","page","locators","planSlug","ensurePricingPeriod","period","waitForAttribute","selector","attribute","value","timeout","sel","attr","val","isAnnually","common","shouldSwitch","targetButtonName","import_test","createSessionTaskComponentPageObject","testArgs","page","common","fakeOrganization","createOrganizationButton","import_test","createSignInComponentPageObject","testArgs","page","self","common","opts","navRes","selector","state","val","passField","provider","email","password","waitForSession","identifierField","createSignUpComponentPageObject","testArgs","page","self","common","opts","selector","state","provider","createSubscriptionDetailsPageObject","testArgs","page","self","common","selector","createTestingTokenPageObject","page","setupClerkTestingToken","import_test","SELECTOR","createUserAvatarPageObject","testArgs","page","self","opts","selector","import_test","createUserButtonPageObject","testArgs","page","menuItems","menuItem","emailAddress","createUserProfileComponentPageObject","testArgs","page","self","common","opts","section","opened","value","state","createUserVerificationComponentPageObject","testArgs","page","common","selector","createWaitlistComponentPageObject","testArgs","page","self","common","opts","selector","createPageObjects","page","useTestingToken","baseURL","app","createAppPageObject","testArgs","createClerkPageObject","createCheckoutPageObject","createExpectPageObject","createImpersonationPageObject","createKeylessPopoverPageObject","createOrganizationSwitcherComponentPageObject","createPricingTablePageObject","createSessionTaskComponentPageObject","createSignInComponentPageObject","createSignUpComponentPageObject","createTestingTokenPageObject","createUserAvatarPageObject","createUserButtonPageObject","createUserProfileComponentPageObject","createUserVerificationComponentPageObject","createWaitlistComponentPageObject","createAPIKeysComponentPageObject","createSubscriptionDetailsPageObject","createPlanDetailsPageObject"]}
1
+ {"version":3,"sources":["../../../src/playwright/unstable/index.ts","../../../src/playwright/unstable/page-objects/common.ts","../../../src/playwright/unstable/page-objects/apiKeys.ts","../../../src/common/constants.ts","../../../src/common/errors.ts","../../../src/playwright/setupClerkTestingToken.ts","../../../src/playwright/unstable/page-objects/app.ts","../../../src/playwright/unstable/page-objects/checkout.ts","../../../src/playwright/unstable/page-objects/clerk.ts","../../../src/playwright/unstable/page-objects/expect.ts","../../../src/playwright/unstable/page-objects/impersonation.ts","../../../src/playwright/unstable/page-objects/keylessPopover.ts","../../../src/playwright/unstable/page-objects/organizationSwitcher.ts","../../../src/playwright/unstable/page-objects/planDetails.ts","../../../src/playwright/unstable/page-objects/pricingTable.ts","../../../src/playwright/unstable/page-objects/sessionTask.ts","../../../src/playwright/unstable/page-objects/signIn.ts","../../../src/playwright/unstable/page-objects/signUp.ts","../../../src/playwright/unstable/page-objects/subscriptionDetails.ts","../../../src/playwright/unstable/page-objects/testingToken.ts","../../../src/playwright/unstable/page-objects/userAvatar.ts","../../../src/playwright/unstable/page-objects/userButton.ts","../../../src/playwright/unstable/page-objects/userProfile.ts","../../../src/playwright/unstable/page-objects/userVerification.ts","../../../src/playwright/unstable/page-objects/waitlist.ts","../../../src/playwright/unstable/page-objects/index.ts"],"sourcesContent":["import { createPageObjects } from './page-objects';\nimport { createAppPageObject } from './page-objects/app';\n\nexport type { EnhancedPage } from './page-objects/app';\nexport { createPageObjects, createAppPageObject };\n","import type { EnhancedPage } from './app';\n\ntype EnterOtpCodeOptions = {\n name?: string;\n awaitRequests?: boolean;\n awaitPrepare?: boolean;\n awaitAttempt?: boolean;\n};\n\nexport const common = ({ page }: { page: EnhancedPage }) => {\n const self = {\n continue: () => {\n return page.getByRole('button', { name: 'Continue', exact: true }).click();\n },\n setEmailAddress: (val: string) => {\n return self.getEmailAddressInput().fill(val);\n },\n setPassword: (val: string) => {\n return self.getPasswordInput().fill(val);\n },\n setPasswordConfirmation: (val: string) => {\n return page.locator('input[name=confirmPassword]').fill(val);\n },\n enterOtpCode: async (code: string, opts?: EnterOtpCodeOptions) => {\n const {\n name = 'Enter verification code',\n awaitAttempt = true,\n awaitPrepare = true,\n awaitRequests = true,\n } = opts ?? {};\n\n if (awaitRequests && awaitPrepare) {\n const prepareVerificationPromise = page.waitForResponse(\n response =>\n response.request().method() === 'POST' &&\n (response.url().includes('prepare_verification') || response.url().includes('prepare_first_factor')),\n );\n await prepareVerificationPromise;\n }\n\n // Handle the case for both OTP input versions\n const originalInput = page.getByRole('textbox', { name: 'Enter verification code. Digit 1' });\n if (await originalInput.isVisible()) {\n console.warn('Using the original OTP input');\n await originalInput.click();\n await page.keyboard.type(code, { delay: 100 });\n } else {\n await page.getByLabel(name).fill(code);\n }\n\n if (awaitRequests && awaitAttempt) {\n const attemptVerificationPromise = page.waitForResponse(\n response =>\n response.request().method() === 'POST' &&\n (response.url().includes('attempt_verification') || response.url().includes('attempt_first_factor')),\n );\n await attemptVerificationPromise;\n }\n },\n enterTestOtpCode: async (opts?: EnterOtpCodeOptions) => {\n return self.enterOtpCode('424242', opts);\n },\n // @deprecated Use .enterTestOtpCode({ name: '...' }) instead\n fillTestOtpCode: async (name: string, opts?: Omit<EnterOtpCodeOptions, 'name'>) => {\n return self.enterOtpCode('424242', { name, ...opts });\n },\n getIdentifierInput: () => {\n return page.locator('input[name=identifier]');\n },\n getEmailAddressInput: () => {\n return page.locator('input[name=emailAddress]');\n },\n getPhoneNumberInput: () => {\n return page.locator('input[name=phoneNumber]');\n },\n getUsernameInput: () => {\n return page.locator('input[name=username]');\n },\n getPasswordInput: () => {\n return page.locator('input[name=password]');\n },\n getLegalAccepted: () => {\n return page.locator('input[name=legalAccepted]');\n },\n getFirstNameInput: () => {\n return page.locator('input[name=firstName]');\n },\n getLastNameInput: () => {\n return page.locator('input[name=lastName]');\n },\n waitForSession: async () => {\n return page.waitForFunction(() => {\n return !!window.Clerk?.session;\n });\n },\n };\n\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createAPIKeysComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const expirationOptions = {\n never: 'Never',\n '1d': '1 Day',\n '7d': '7 Days',\n '30d': '30 Days',\n '60d': '60 Days',\n '90d': '90 Days',\n '180d': '180 Days',\n '1y': '1 Year',\n } as const;\n\n const self = {\n ...common(testArgs),\n waitForMounted: () => {\n return page.waitForSelector('.cl-apiKeys-root', { state: 'attached' });\n },\n clickAddButton: () => {\n return page.getByText(/Add new key/i).click();\n },\n waitForFormOpened: () => {\n return page.waitForSelector('.cl-apiKeysCreateForm', { state: 'attached' });\n },\n waitForFormClosed: () => {\n return page.waitForSelector('.cl-apiKeysCreateForm', { state: 'detached' });\n },\n waitForRevokeModalOpened: () => {\n return page.waitForSelector('.cl-apiKeysRevokeModal', { state: 'attached' });\n },\n waitForRevokeModalClosed: () => {\n return page.waitForSelector('.cl-apiKeysRevokeModal', { state: 'detached' });\n },\n typeName: (value: string) => {\n return page.getByLabel(/Secret key name/i).fill(value);\n },\n typeDescription: (value: string) => {\n return page.getByLabel(/Description/i).fill(value);\n },\n selectExpiration: async (value?: keyof typeof expirationOptions) => {\n await page.getByRole('button', { name: /Select date/i }).click();\n return page.getByText(expirationOptions[value ?? 'never'], { exact: true }).click({ force: true });\n },\n clickSaveButton: () => {\n return page.getByText(/Create key/i).click();\n },\n typeRevokeConfirmation: (value: string) => {\n return page.getByLabel(/Type \"Revoke\" to confirm/i).fill(value);\n },\n clickConfirmRevokeButton: () => {\n return page.getByText(/Revoke key/i).click();\n },\n };\n return self;\n};\n","export const TESTING_TOKEN_PARAM = '__clerk_testing_token';\n","export const ERROR_MISSING_FRONTEND_API_URL =\n 'The Clerk Frontend API URL is required to bypass bot protection. ' +\n 'Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.';\n","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\n const escapedFapiUrl = fapiUrl.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const apiUrl = new RegExp(`^https://${escapedFapiUrl}/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","import type { Page } from '@playwright/test';\n\nimport { setupClerkTestingToken } from '../../setupClerkTestingToken';\n\nexport type EnhancedPage = ReturnType<typeof createAppPageObject>;\nexport const createAppPageObject = (testArgs: { page: Page; useTestingToken?: boolean }, app: { baseURL?: string }) => {\n const { page, useTestingToken = true } = testArgs;\n const appPage = Object.create(page) as Page;\n const helpers = {\n goToAppHome: async () => {\n if (!app.baseURL) {\n throw new Error(\n 'Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.',\n );\n }\n\n try {\n if (useTestingToken) {\n await setupClerkTestingToken({ page });\n }\n\n await page.goto(app.baseURL);\n } catch {\n // do not fail the test if interstitial is returned (401)\n }\n },\n goToRelative: async (\n path: string,\n opts: { waitUntil?: any; searchParams?: URLSearchParams; timeout?: number } = {},\n ) => {\n if (!app.baseURL) {\n throw new Error(\n 'Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.',\n );\n }\n let url: URL;\n\n try {\n // When testing applications using real domains we want to manually navigate to the domain first\n // and not follow serverUrl (localhost) by default, as this is usually proxied\n if (page.url().includes('about:blank')) {\n url = new URL(path, app.baseURL);\n } else {\n url = new URL(path, page.url());\n }\n } catch {\n // However, in most tests we don't need to manually navigate to the domain\n // as the test is using a localhost app directly\n // This handles the case where the page is at about:blank\n // and instead it uses the serverUrl\n url = new URL(path, app.baseURL);\n }\n\n if (opts.searchParams) {\n url.search = opts.searchParams.toString();\n }\n\n if (useTestingToken) {\n await setupClerkTestingToken({ page });\n }\n\n return page.goto(url.toString(), { timeout: opts.timeout ?? 20000, waitUntil: opts.waitUntil });\n },\n waitForClerkJsLoaded: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.loaded;\n });\n },\n signOut: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.signOut({});\n });\n },\n waitForClerkComponentMounted: async () => {\n return page.waitForSelector('.cl-rootBox', { state: 'attached' });\n },\n waitForAppUrl: async (relativePath: string) => {\n if (!app.baseURL) {\n throw new Error(\n 'Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.',\n );\n }\n return page.waitForURL(new URL(relativePath, app.baseURL).toString());\n },\n /**\n * Get the cookies for the URL the page is currently at.\n * Suffixed cookies can be accessed by using the wildcard character `*` at the end of the cookie name,\n * eg `get('__session')` and `get('__session_*')`.\n */\n cookies: async () => {\n const array = await page.context().cookies();\n const map = array.reduce((acc, cookie) => {\n // If a suffixed cookie is found, we usually don't care about the suffix itself\n // Instead, simply replace the suffix with _* so we can easily read it\n // TODO: deal with collisions if neede\n // TODO: might be too much magic here\n // Maybe extract this into a different helper?\n if (cookie.name.match(/^(__.*_)(.{8})$/)) {\n acc.set(cookie.name.replace(/^(__.*_)(.{8})$/, '$1*'), cookie);\n } else {\n acc.set(cookie.name, cookie);\n }\n return acc;\n }, new Map<string, (typeof array)[number]>());\n return Object.assign(map, { raw: () => array });\n },\n };\n return Object.assign(appPage, helpers);\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createCheckoutPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-checkout-root') => {\n return page.waitForSelector(selector, { state: 'attached', timeout: 20000 });\n },\n closeDrawer: () => {\n return page.locator('.cl-drawerClose').click();\n },\n fillTestCard: async () => {\n await self.fillCard({\n number: '4242424242424242',\n expiration: '1234',\n cvc: '123',\n country: 'United States',\n zip: '12345',\n });\n },\n fillCard: async (card: { number: string; expiration: string; cvc: string; country: string; zip: string }) => {\n await self.waitForStripeElements({ state: 'visible' });\n const frame = page.frameLocator('iframe[src*=\"elements-inner-payment\"]');\n await frame.getByLabel('Card number').fill(card.number);\n await frame.getByLabel('Expiration date').fill(card.expiration);\n await frame.getByLabel('Security code').fill(card.cvc);\n await frame.getByLabel('Country').selectOption(card.country);\n await frame.getByLabel('ZIP code').fill(card.zip);\n },\n waitForStripeElements: async ({ state = 'visible' }: { state?: 'visible' | 'hidden' } = {}) => {\n const iframe = page.locator('iframe[src*=\"elements-inner-payment\"]');\n if (state === 'visible') {\n await iframe.waitFor({ state: 'attached', timeout: 20000 });\n await page.frameLocator('iframe[src*=\"elements-inner-payment\"]').getByLabel('Card number').waitFor({\n state: 'visible',\n timeout: 20000,\n });\n } else {\n await page.frameLocator('iframe[src*=\"elements-inner-payment\"]').getByLabel('Card number').waitFor({\n state: 'hidden',\n timeout: 20000,\n });\n }\n },\n clickPayOrSubscribe: async () => {\n await self.root.getByRole('button', { name: /subscribe|pay\\s\\$|start/i }).click();\n },\n waitForSubscribeButton: async () => {\n await self.root.getByRole('button', { name: /^subscribe$/i }).waitFor({ state: 'visible' });\n },\n confirmAndContinue: async () => {\n await self.root.getByRole('button', { name: /^continue$/i }).click();\n },\n clickAddPaymentMethod: async () => {\n await self.root.getByRole('radio', { name: 'Add payment method' }).click();\n },\n clickPaymentMethods: async () => {\n await self.root.getByRole('radio', { name: 'Payment Methods' }).click();\n },\n root: page.locator('.cl-checkout-root'),\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\n\nexport const createClerkPageObject = ({ page }: { page: EnhancedPage }) => {\n return {\n toBeLoaded: async () => {\n return page.waitForFunction(() => {\n return !!window.Clerk?.loaded;\n });\n },\n getClientSideActor: () => {\n return page.evaluate(() => {\n return window.Clerk?.session?.actor;\n });\n },\n toBeLoading: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.status === 'loading';\n });\n },\n toBeReady: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.status === 'ready';\n });\n },\n toBeDegraded: async () => {\n return page.waitForFunction(() => {\n return window.Clerk?.status === 'degraded';\n });\n },\n getClientSideUser: () => {\n return page.evaluate(() => {\n return window.Clerk?.user;\n });\n },\n };\n};\n","import type { Response } from '@playwright/test';\nimport { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\n\nexport const createExpectPageObject = ({ page }: { page: EnhancedPage }) => {\n return {\n toBeHandshake: async (res: Response) => {\n // Travel the redirect chain until we find the handshake header\n // TODO: Loop through the redirects until we find a handshake header, or timeout trying\n const redirect = await res.request().redirectedFrom()?.redirectedFrom()?.response();\n expect(redirect?.status()).toBe(307);\n expect(redirect?.headers()['x-clerk-auth-status']).toContain('handshake');\n },\n toBeSignedOut: (args?: { timeOut: number }) => {\n return page.waitForFunction(\n () => {\n return !window.Clerk?.user;\n },\n null,\n { timeout: args?.timeOut },\n );\n },\n toBeSignedIn: async () => {\n return page.waitForFunction(() => {\n return !!window.Clerk?.user;\n });\n },\n toBeSignedInAsActor: async () => {\n return page.waitForFunction(() => {\n return !!window.Clerk?.session?.actor;\n });\n },\n toHaveResolvedTask: async () => {\n return page.waitForFunction(() => {\n return !window.Clerk?.session?.currentTask;\n });\n },\n };\n};\n","import type { EnhancedPage } from './app';\n\nexport const createImpersonationPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n waitForMounted: (selector = '.cl-impersonationFab') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n getSignOutLink: () => {\n return page.locator('.cl-impersonationFab').getByText('Sign out');\n },\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\n\nexport const createKeylessPopoverPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n // TODO: Is this the ID we really want ?\n const elementId = '#--clerk-keyless-prompt-button';\n const self = {\n waitForMounted: () => page.waitForSelector(elementId, { state: 'attached' }),\n waitForUnmounted: () => page.waitForSelector(elementId, { state: 'detached' }),\n isExpanded: () =>\n page\n .locator(elementId)\n .getAttribute('aria-expanded')\n .then(val => val === 'true'),\n toggle: () => page.locator(elementId).click(),\n\n promptsToClaim: () => {\n return page.getByRole('link', { name: /^claim application$/i });\n },\n promptToUseClaimedKeys: () => {\n return page.getByRole('link', { name: /^get api keys$/i });\n },\n promptToDismiss: () => {\n return page.getByRole('button', { name: /^dismiss$/i });\n },\n };\n return self;\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createOrganizationSwitcherComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n ...common(testArgs),\n goTo: async (relativePath = '/switcher') => {\n await page.goToRelative(relativePath);\n return self.waitForMounted();\n },\n waitForMounted: () => {\n return page.waitForSelector('.cl-organizationSwitcher-root', { state: 'attached' });\n },\n expectNoOrganizationSelected: () => {\n return expect(page.getByText(/No organization selected/i)).toBeVisible();\n },\n expectPersonalAccount: () => {\n return expect(page.getByText(/personal account/i)).toBeVisible();\n },\n toggleTrigger: () => {\n return page.locator('.cl-organizationSwitcherTrigger').click();\n },\n waitForAnOrganizationToSelected: () => {\n return page.waitForSelector('.cl-userPreviewMainIdentifier__personalWorkspace', { state: 'detached' });\n },\n };\n\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createPlanDetailsPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-planDetails-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n root: page.locator('.cl-planDetails-root'),\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\ntype BillingPeriod = 'monthly' | 'annually';\n\nexport const createPricingTablePageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const locators = {\n toggle: (planSlug: string) => page.locator(`.cl-pricingTableCard__${planSlug} .cl-pricingTableCardPeriodToggle`),\n indicator: (planSlug: string) => page.locator(`.cl-pricingTableCard__${planSlug} .cl-switchIndicator`),\n badge: (planSlug: string) => page.locator(`.cl-pricingTableCard__${planSlug} .cl-badge`),\n footer: (planSlug: string) => page.locator(`.cl-pricingTableCard__${planSlug} .cl-pricingTableCardFooter`),\n };\n\n const ensurePricingPeriod = async (planSlug: string, period: BillingPeriod): Promise<void> => {\n async function waitForAttribute(selector: string, attribute: string, value: string, timeout = 5000) {\n return page\n .waitForFunction(\n ({ sel, attr, val }) => {\n const element = document.querySelector(sel);\n return element?.getAttribute(attr) === val;\n },\n { sel: selector, attr: attribute, val: value },\n { timeout },\n )\n .then(() => {\n return true;\n })\n .catch(() => {\n return false;\n });\n }\n\n const isAnnually = await waitForAttribute(\n `.cl-pricingTableCard__${planSlug} .cl-switchIndicator`,\n 'data-checked',\n 'true',\n 500,\n );\n\n if (isAnnually && period === 'monthly') {\n await locators.toggle(planSlug).click();\n }\n\n if (!isAnnually && period === 'annually') {\n await locators.toggle(planSlug).click();\n }\n };\n\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-pricingTable-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n clickResubscribe: async () => {\n await page.getByText('Re-subscribe').click();\n },\n waitToBeActive: async ({ planSlug }: { planSlug: string }) => {\n return locators.badge(planSlug).getByText('Active').waitFor({ state: 'visible' });\n },\n waitToBeFreeTrial: async ({ planSlug }: { planSlug: string }) => {\n return locators.badge(planSlug).getByText('Free trial').waitFor({ state: 'visible' });\n },\n getPlanCardCTA: ({ planSlug }: { planSlug: string }) => {\n return locators.footer(planSlug).getByRole('button', {\n name: /get|switch|subscribe/i,\n });\n },\n startCheckout: async ({\n planSlug,\n shouldSwitch,\n period,\n }: {\n planSlug: string;\n shouldSwitch?: boolean;\n period?: BillingPeriod;\n }) => {\n const targetButtonName =\n shouldSwitch === true\n ? 'Switch to this plan'\n : shouldSwitch === false\n ? /subscribe/i\n : /get|switch|subscribe|Start \\d+-day free trial/i;\n\n if (period) {\n await ensurePricingPeriod(planSlug, period);\n }\n\n await locators\n .footer(planSlug)\n .getByRole('button', {\n name: targetButtonName,\n })\n .click();\n },\n };\n return self;\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createSessionTaskComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n ...common(testArgs),\n resolveForceOrganizationSelectionTask: async (fakeOrganization: { name: string; slug: string }) => {\n const createOrganizationButton = page.getByRole('button', { name: /continue/i });\n\n await expect(createOrganizationButton).toBeVisible();\n\n await page.locator('input[name=name]').fill(fakeOrganization.name);\n await page.locator('input[name=slug]').fill(fakeOrganization.slug);\n\n await createOrganizationButton.click();\n },\n };\n\n return self;\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createSignInComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n goTo: async (opts?: { searchParams?: URLSearchParams; headlessSelector?: string; timeout?: number }) => {\n const navRes = await page.goToRelative('/sign-in', opts);\n\n if (typeof opts?.headlessSelector !== 'undefined') {\n await self.waitForMounted(opts.headlessSelector);\n } else {\n await self.waitForMounted();\n }\n return navRes;\n },\n waitForMounted: (selector = '.cl-signIn-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n waitForModal: (state?: 'open' | 'closed') => {\n return page.waitForSelector('.cl-modalContent:has(.cl-signIn-root)', {\n state: state === 'closed' ? 'detached' : 'attached',\n });\n },\n setIdentifier: (val: string) => {\n return self.getIdentifierInput().fill(val);\n },\n setInstantPassword: async (val: string) => {\n const passField = self.getPasswordInput();\n await expect(passField).toBeVisible();\n await passField.fill(val, { force: true });\n },\n usePhoneNumberIdentifier: () => {\n return page.getByRole('link', { name: /^use phone/i });\n },\n useEmailIdentifier: () => {\n return page.getByRole('link', { name: /^use email/i });\n },\n useUsernameIdentifier: () => {\n return page.getByRole('link', { name: /^username$/i });\n },\n getForgotPassword: () => {\n return page.getByRole('link', { name: /forgot password/i });\n },\n getGoToSignUp: () => {\n return page.getByRole('link', { name: /sign up/i });\n },\n getResetPassword: () => {\n return page.getByRole('button', { name: /(reset password|reset your password)/i });\n },\n getUseAnotherMethodLink: () => {\n return page.getByRole('link', { name: /use another method/i });\n },\n getAltMethodsEmailCodeButton: () => {\n return page.getByRole('button', { name: /email code to/i });\n },\n getAltMethodsEmailLinkButton: () => {\n return page.getByRole('button', { name: /email link to/i });\n },\n signInWithOauth: (provider: string) => {\n return page.getByRole('button', { name: new RegExp(`continue with ${provider}`, 'gi') });\n },\n signInWithEmailAndInstantPassword: async ({\n email,\n password,\n waitForSession = true,\n }: {\n email: string;\n password: string;\n waitForSession?: boolean;\n }) => {\n const identifierField = self.getIdentifierInput();\n await expect(identifierField).toBeVisible();\n\n await identifierField.fill(email);\n await self.setInstantPassword(password);\n await self.continue();\n\n if (waitForSession) {\n await self.waitForSession();\n }\n },\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\ntype SignUpFormInputs = {\n email?: string;\n password?: string;\n firstName?: string;\n lastName?: string;\n username?: string;\n phoneNumber?: string;\n legalAccepted?: boolean;\n};\n\nexport const createSignUpComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n ...common(testArgs),\n goTo: async (opts?: { searchParams?: URLSearchParams; headlessSelector?: string }) => {\n await page.goToRelative('/sign-up', { searchParams: opts?.searchParams });\n\n if (typeof opts?.headlessSelector !== 'undefined') {\n return self.waitForMounted(opts.headlessSelector);\n }\n return self.waitForMounted();\n },\n waitForMounted: (selector = '.cl-signUp-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n waitForModal: (state?: 'open' | 'closed') => {\n return page.waitForSelector('.cl-modalContent:has(.cl-signUp-root)', {\n state: state === 'closed' ? 'detached' : 'attached',\n });\n },\n signUpWithOauth: (provider: string) => {\n return page.getByRole('button', { name: new RegExp(`continue with ${provider}`, 'gi') });\n },\n signUp: async (opts: SignUpFormInputs) => {\n if (opts.firstName) {\n await self.getFirstNameInput().fill(opts.firstName);\n }\n\n if (opts.lastName) {\n await self.getLastNameInput().fill(opts.lastName);\n }\n\n if (opts.email) {\n await self.getEmailAddressInput().fill(opts.email);\n }\n\n if (opts.username) {\n await self.getUsernameInput().fill(opts.username);\n }\n\n if (opts.phoneNumber) {\n await self.getPhoneNumberInput().fill(opts.phoneNumber);\n }\n\n if (opts.password) {\n await self.getPasswordInput().fill(opts.password);\n }\n\n if (opts.legalAccepted) {\n await self.getLegalAccepted().check();\n }\n\n await self.continue();\n },\n signUpWithEmailAndPassword: async (opts: Pick<SignUpFormInputs, 'email' | 'password'>) => {\n await self.signUp({ email: opts.email, password: opts.password });\n },\n waitForEmailVerificationScreen: async () => {\n await page.waitForURL(/verify/);\n await page.getByRole('heading', { name: /Verify your email/i }).waitFor();\n },\n };\n\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createSubscriptionDetailsPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-subscriptionDetails-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n waitForUnmounted: () => {\n return self.root.locator('.cl-drawerRoot').waitFor({ state: 'detached' });\n },\n closeDrawer: () => {\n return self.root.locator('.cl-drawerClose').click();\n },\n root: page.locator('.cl-subscriptionDetails-root'),\n };\n return self;\n};\n","import { setupClerkTestingToken } from '../../setupClerkTestingToken';\nimport type { EnhancedPage } from './app';\n\nexport const createTestingTokenPageObject = ({ page }: { page: EnhancedPage }) => {\n return {\n setup: async () => setupClerkTestingToken({ page }),\n };\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\n\nconst SELECTOR = '.cl-userAvatarBox';\n\nexport const createUserAvatarPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n goTo: async (opts?: { searchParams: URLSearchParams }) => {\n await page.goToRelative('/user-avatar', opts);\n return self.waitForMounted();\n },\n waitForMounted: (selector = SELECTOR) => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n toBeVisible: async (selector = SELECTOR) => {\n return await expect(page.locator(selector).getByRole('img')).toBeVisible();\n },\n };\n\n return self;\n};\n","import { expect } from '@playwright/test';\n\nimport type { EnhancedPage } from './app';\n\nexport const createUserButtonPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n waitForMounted: () => {\n return page.waitForSelector('.cl-userButtonTrigger', { state: 'attached' });\n },\n toggleTrigger: () => {\n return page.locator('.cl-userButtonTrigger').click();\n },\n waitForPopover: () => {\n return page.waitForSelector('.cl-userButtonPopoverCard', { state: 'visible' });\n },\n waitForPopoverClosed: () => {\n return page.waitForSelector('.cl-userButtonPopoverCard', { state: 'detached' });\n },\n toHaveVisibleMenuItems: async (menuItems: string | RegExp | Array<string | RegExp>) => {\n if (typeof menuItems === 'string' || menuItems instanceof RegExp) {\n menuItems = [menuItems];\n }\n for (const menuItem of menuItems) {\n await expect(page.getByRole('menuitem', { name: menuItem })).toBeVisible();\n }\n },\n triggerSignOut: () => {\n return page.getByRole('menuitem', { name: /Sign out$/i }).click();\n },\n triggerManageAccount: () => {\n return page.getByRole('menuitem', { name: /Manage account/i }).click();\n },\n switchAccount: (emailAddress: string) => {\n return page.getByText(emailAddress).click();\n },\n };\n\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport type Sections = 'profile' | 'emailAddresses' | 'username' | 'phoneNumbers' | 'danger';\n\nexport const createUserProfileComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n goTo: async (opts?: { searchParams: URLSearchParams }) => {\n await page.goToRelative('/user', opts);\n return self.waitForMounted();\n },\n switchToSecurityTab: async () => {\n await page.getByText(/Security/i).click();\n },\n switchToBillingTab: async () => {\n await page.getByText(/Billing/i).click();\n },\n waitForMounted: () => {\n return page.waitForSelector('.cl-userProfile-root', { state: 'attached' });\n },\n clickSetUsername: () => {\n return page.getByText(/Set username/i).click();\n },\n clickToUpdateProfile: () => {\n return page.getByText(/update profile/i).click();\n },\n clickUpdateUsername: () => {\n return page.getByText(/update username/i).click();\n },\n clickSetPassword: () => {\n return page.getByText(/Set password/i).click();\n },\n waitForSectionCard: (section: Sections, opened: boolean) => {\n return page.waitForSelector(`.cl-profileSectionContent__${section} .cl-headerTitle`, {\n state: opened ? 'visible' : 'detached',\n });\n },\n waitForSectionCardOpened: (section: Sections) => {\n return self.waitForSectionCard(section, true);\n },\n waitForSectionCardClosed: (section: Sections) => {\n return self.waitForSectionCard(section, false);\n },\n typeUsername: (value: string) => {\n return self.getUsernameInput().fill(value);\n },\n typeFirstName: (value: string) => {\n return self.getFirstNameInput().fill(value);\n },\n typeLastName: (value: string) => {\n return self.getLastNameInput().fill(value);\n },\n typePhoneNumber: (value: string) => {\n return self.getPhoneNumberInput().fill(value);\n },\n clickAddEmailAddress: () => {\n return page.getByText(/add email address/i).click();\n },\n clickAddPhoneNumber: () => {\n return page.getByText(/add phone number/i).click();\n },\n typeEmailAddress: (value: string) => {\n return page.getByLabel(/Email address/i).fill(value);\n },\n waitForUserProfileModal: (state?: 'open' | 'closed') => {\n return page.waitForSelector('.cl-modalContent:has(.cl-userProfile-root)', {\n state: state === 'closed' ? 'detached' : 'attached',\n });\n },\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\nexport const createUserVerificationComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n const self = {\n ...common(testArgs),\n waitForMounted: (selector = '.cl-userVerification-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n waitForClosed: (selector = '.cl-userVerification-root') => {\n return page.waitForSelector(selector, { state: 'detached' });\n },\n closeReverificationModal: () => {\n return page.getByLabel('Close modal').click();\n },\n getUseAnotherMethodLink: () => {\n return page.getByRole('link', { name: /use another method/i });\n },\n getAltMethodsEmailCodeButton: () => {\n return page.getByRole('button', { name: /email code to/i });\n },\n getAltMethodsEmailLinkButton: () => {\n return page.getByRole('button', { name: /email link to/i });\n },\n };\n return self;\n};\n","import type { EnhancedPage } from './app';\nimport { common } from './common';\n\ntype WaitlistFormInputs = {\n email: string;\n};\n\nexport const createWaitlistComponentPageObject = (testArgs: { page: EnhancedPage }) => {\n const { page } = testArgs;\n\n const self = {\n ...common(testArgs),\n goTo: async (opts?: { searchParams?: URLSearchParams; headlessSelector?: string }) => {\n await page.goToRelative('/waitlist', { searchParams: opts?.searchParams });\n\n if (typeof opts?.headlessSelector !== 'undefined') {\n return self.waitForMounted(opts.headlessSelector);\n }\n return self.waitForMounted();\n },\n waitForMounted: (selector = '.cl-waitlist-root') => {\n return page.waitForSelector(selector, { state: 'attached' });\n },\n joinWaitlist: async (opts: WaitlistFormInputs) => {\n await self.getEmailAddressInput().fill(opts.email);\n\n await self.joinWaitlistContinue();\n },\n joinWaitlistContinue: () => {\n return page.getByRole('button', { name: 'Join the waitlist', exact: true }).click();\n },\n };\n\n return self;\n};\n","import type { Page } from '@playwright/test';\n\nimport { createAPIKeysComponentPageObject } from './apiKeys';\nimport { createAppPageObject } from './app';\nimport { createCheckoutPageObject } from './checkout';\nimport { createClerkPageObject } from './clerk';\nimport { createExpectPageObject } from './expect';\nimport { createImpersonationPageObject } from './impersonation';\nimport { createKeylessPopoverPageObject } from './keylessPopover';\nimport { createOrganizationSwitcherComponentPageObject } from './organizationSwitcher';\nimport { createPlanDetailsPageObject } from './planDetails';\nimport { createPricingTablePageObject } from './pricingTable';\nimport { createSessionTaskComponentPageObject } from './sessionTask';\nimport { createSignInComponentPageObject } from './signIn';\nimport { createSignUpComponentPageObject } from './signUp';\nimport { createSubscriptionDetailsPageObject } from './subscriptionDetails';\nimport { createTestingTokenPageObject } from './testingToken';\nimport { createUserAvatarPageObject } from './userAvatar';\nimport { createUserButtonPageObject } from './userButton';\nimport { createUserProfileComponentPageObject } from './userProfile';\nimport { createUserVerificationComponentPageObject } from './userVerification';\nimport { createWaitlistComponentPageObject } from './waitlist';\n\nexport const createPageObjects = ({\n page,\n useTestingToken = true,\n baseURL,\n}: {\n page: Page;\n useTestingToken?: boolean;\n baseURL?: string;\n}) => {\n const app = createAppPageObject({ page, useTestingToken }, { baseURL });\n const testArgs = { page: app };\n\n return {\n page: app,\n clerk: createClerkPageObject(testArgs),\n checkout: createCheckoutPageObject(testArgs),\n expect: createExpectPageObject(testArgs),\n impersonation: createImpersonationPageObject(testArgs),\n keylessPopover: createKeylessPopoverPageObject(testArgs),\n organizationSwitcher: createOrganizationSwitcherComponentPageObject(testArgs),\n pricingTable: createPricingTablePageObject(testArgs),\n sessionTask: createSessionTaskComponentPageObject(testArgs),\n signIn: createSignInComponentPageObject(testArgs),\n signUp: createSignUpComponentPageObject(testArgs),\n testingToken: createTestingTokenPageObject(testArgs),\n userAvatar: createUserAvatarPageObject(testArgs),\n userButton: createUserButtonPageObject(testArgs),\n userProfile: createUserProfileComponentPageObject(testArgs),\n userVerification: createUserVerificationComponentPageObject(testArgs),\n waitlist: createWaitlistComponentPageObject(testArgs),\n apiKeys: createAPIKeysComponentPageObject(testArgs),\n subscriptionDetails: createSubscriptionDetailsPageObject(testArgs),\n planDetails: createPlanDetailsPageObject(testArgs),\n };\n};\n"],"mappings":"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","names":["unstable_exports","__export","createAppPageObject","createPageObjects","__toCommonJS","common","page","self","val","code","opts","name","awaitAttempt","awaitPrepare","awaitRequests","response","originalInput","createAPIKeysComponentPageObject","testArgs","page","expirationOptions","common","value","TESTING_TOKEN_PARAM","ERROR_MISSING_FRONTEND_API_URL","setupClerkTestingToken","context","options","page","browserContext","fapiUrl","ERROR_MISSING_FRONTEND_API_URL","escapedFapiUrl","apiUrl","route","originalUrl","testingToken","TESTING_TOKEN_PARAM","response","json","createAppPageObject","testArgs","app","page","useTestingToken","appPage","setupClerkTestingToken","path","opts","url","relativePath","array","map","acc","cookie","createCheckoutPageObject","testArgs","page","self","common","selector","card","frame","state","iframe","createClerkPageObject","page","import_test","createExpectPageObject","page","res","redirect","args","createImpersonationPageObject","testArgs","page","selector","createKeylessPopoverPageObject","testArgs","page","elementId","val","import_test","createOrganizationSwitcherComponentPageObject","testArgs","page","self","common","relativePath","createPlanDetailsPageObject","testArgs","page","common","selector","createPricingTablePageObject","testArgs","page","locators","planSlug","ensurePricingPeriod","period","waitForAttribute","selector","attribute","value","timeout","sel","attr","val","isAnnually","common","shouldSwitch","targetButtonName","import_test","createSessionTaskComponentPageObject","testArgs","page","common","fakeOrganization","createOrganizationButton","import_test","createSignInComponentPageObject","testArgs","page","self","common","opts","navRes","selector","state","val","passField","provider","email","password","waitForSession","identifierField","createSignUpComponentPageObject","testArgs","page","self","common","opts","selector","state","provider","createSubscriptionDetailsPageObject","testArgs","page","self","common","selector","createTestingTokenPageObject","page","setupClerkTestingToken","import_test","SELECTOR","createUserAvatarPageObject","testArgs","page","self","opts","selector","import_test","createUserButtonPageObject","testArgs","page","menuItems","menuItem","emailAddress","createUserProfileComponentPageObject","testArgs","page","self","common","opts","section","opened","value","state","createUserVerificationComponentPageObject","testArgs","page","common","selector","createWaitlistComponentPageObject","testArgs","page","self","common","opts","selector","createPageObjects","page","useTestingToken","baseURL","app","createAppPageObject","testArgs","createClerkPageObject","createCheckoutPageObject","createExpectPageObject","createImpersonationPageObject","createKeylessPopoverPageObject","createOrganizationSwitcherComponentPageObject","createPricingTablePageObject","createSessionTaskComponentPageObject","createSignInComponentPageObject","createSignUpComponentPageObject","createTestingTokenPageObject","createUserAvatarPageObject","createUserButtonPageObject","createUserProfileComponentPageObject","createUserVerificationComponentPageObject","createWaitlistComponentPageObject","createAPIKeysComponentPageObject","createSubscriptionDetailsPageObject","createPlanDetailsPageObject"]}
@@ -1,2 +1,2 @@
1
- import{a as p}from"../../chunk-YVI6XYHN.mjs";import"../../chunk-M5YIJ3SE.mjs";var i=({page:a})=>{let e={continue:()=>a.getByRole("button",{name:"Continue",exact:!0}).click(),setEmailAddress:r=>e.getEmailAddressInput().fill(r),setPassword:r=>e.getPasswordInput().fill(r),setPasswordConfirmation:r=>a.locator("input[name=confirmPassword]").fill(r),enterOtpCode:async(r,t)=>{let{name:o="Enter verification code",awaitAttempt:n=!0,awaitPrepare:c=!0,awaitRequests:l=!0}=t??{};l&&c&&await a.waitForResponse(m=>m.request().method()==="POST"&&(m.url().includes("prepare_verification")||m.url().includes("prepare_first_factor")));let s=a.getByRole("textbox",{name:"Enter verification code. Digit 1"});await s.isVisible()?(console.warn("Using the original OTP input"),await s.click(),await a.keyboard.type(r,{delay:100})):await a.getByLabel(o).fill(r),l&&n&&await a.waitForResponse(m=>m.request().method()==="POST"&&(m.url().includes("attempt_verification")||m.url().includes("attempt_first_factor")))},enterTestOtpCode:async r=>e.enterOtpCode("424242",r),fillTestOtpCode:async(r,t)=>e.enterOtpCode("424242",{name:r,...t}),getIdentifierInput:()=>a.locator("input[name=identifier]"),getEmailAddressInput:()=>a.locator("input[name=emailAddress]"),getPhoneNumberInput:()=>a.locator("input[name=phoneNumber]"),getUsernameInput:()=>a.locator("input[name=username]"),getPasswordInput:()=>a.locator("input[name=password]"),getLegalAccepted:()=>a.locator("input[name=legalAccepted]"),getFirstNameInput:()=>a.locator("input[name=firstName]"),getLastNameInput:()=>a.locator("input[name=lastName]"),waitForSession:async()=>a.waitForFunction(()=>!!window.Clerk?.session)};return e};var d=a=>{let{page:e}=a,r={never:"Never","1d":"1 Day","7d":"7 Days","30d":"30 Days","60d":"60 Days","90d":"90 Days","180d":"180 Days","1y":"1 Year"};return{...i(a),waitForMounted:()=>e.waitForSelector(".cl-apiKeys-root",{state:"attached"}),clickAddButton:()=>e.getByText(/Add new key/i).click(),waitForFormOpened:()=>e.waitForSelector(".cl-apiKeysCreateForm",{state:"attached"}),waitForFormClosed:()=>e.waitForSelector(".cl-apiKeysCreateForm",{state:"detached"}),waitForRevokeModalOpened:()=>e.waitForSelector(".cl-apiKeysRevokeModal",{state:"attached"}),waitForRevokeModalClosed:()=>e.waitForSelector(".cl-apiKeysRevokeModal",{state:"detached"}),typeName:o=>e.getByLabel(/Secret key name/i).fill(o),typeDescription:o=>e.getByLabel(/Description/i).fill(o),selectExpiration:async o=>(await e.getByRole("button",{name:/Select date/i}).click(),e.getByText(r[o??"never"],{exact:!0}).click({force:!0})),clickSaveButton:()=>e.getByText(/Create key/i).click(),typeRevokeConfirmation:o=>e.getByLabel(/Type "Revoke" to confirm/i).fill(o),clickConfirmRevokeButton:()=>e.getByText(/Revoke key/i).click()}};var g=(a,e)=>{let{page:r,useTestingToken:t=!0}=a,o=Object.create(r);return Object.assign(o,{goToAppHome:async()=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");try{t&&await p({page:r}),await r.goto(e.baseURL)}catch{}},goToRelative:async(c,l={})=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");let s;try{r.url().includes("about:blank")?s=new URL(c,e.baseURL):s=new URL(c,r.url())}catch{s=new URL(c,e.baseURL)}return l.searchParams&&(s.search=l.searchParams.toString()),t&&await p({page:r}),r.goto(s.toString(),{timeout:l.timeout??2e4,waitUntil:l.waitUntil})},waitForClerkJsLoaded:async()=>r.waitForFunction(()=>window.Clerk?.loaded),signOut:async()=>r.waitForFunction(()=>window.Clerk?.signOut({})),waitForClerkComponentMounted:async()=>r.waitForSelector(".cl-rootBox",{state:"attached"}),waitForAppUrl:async c=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");return r.waitForURL(new URL(c,e.baseURL).toString())},cookies:async()=>{let c=await r.context().cookies(),l=c.reduce((s,u)=>(u.name.match(/^(__.*_)(.{8})$/)?s.set(u.name.replace(/^(__.*_)(.{8})$/,"$1*"),u):s.set(u.name,u),s),new Map);return Object.assign(l,{raw:()=>c})}})};var w=a=>{let{page:e}=a,r={...i(a),waitForMounted:(t=".cl-checkout-root")=>e.waitForSelector(t,{state:"attached",timeout:2e4}),closeDrawer:()=>e.locator(".cl-drawerClose").click(),fillTestCard:async()=>{await r.fillCard({number:"4242424242424242",expiration:"1234",cvc:"123",country:"United States",zip:"12345"})},fillCard:async t=>{await r.waitForStripeElements({state:"visible"});let o=e.frameLocator('iframe[src*="elements-inner-payment"]');await o.getByLabel("Card number").fill(t.number),await o.getByLabel("Expiration date").fill(t.expiration),await o.getByLabel("Security code").fill(t.cvc),await o.getByLabel("Country").selectOption(t.country),await o.getByLabel("ZIP code").fill(t.zip)},waitForStripeElements:async({state:t="visible"}={})=>{let o=e.locator('iframe[src*="elements-inner-payment"]');t==="visible"?(await o.waitFor({state:"attached",timeout:2e4}),await e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"visible",timeout:2e4})):await e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"hidden",timeout:2e4})},clickPayOrSubscribe:async()=>{await r.root.getByRole("button",{name:/subscribe|pay\s\$|start/i}).click()},waitForSubscribeButton:async()=>{await r.root.getByRole("button",{name:/^subscribe$/i}).waitFor({state:"visible"})},confirmAndContinue:async()=>{await r.root.getByRole("button",{name:/^continue$/i}).click()},clickAddPaymentMethod:async()=>{await r.root.getByRole("radio",{name:"Add payment method"}).click()},clickPaymentMethods:async()=>{await r.root.getByRole("radio",{name:"Payment Methods"}).click()},root:e.locator(".cl-checkout-root")};return r};var f=({page:a})=>({toBeLoaded:async()=>a.waitForFunction(()=>!!window.Clerk?.loaded),getClientSideActor:()=>a.evaluate(()=>window.Clerk?.session?.actor),toBeLoading:async()=>a.waitForFunction(()=>window.Clerk?.status==="loading"),toBeReady:async()=>a.waitForFunction(()=>window.Clerk?.status==="ready"),toBeDegraded:async()=>a.waitForFunction(()=>window.Clerk?.status==="degraded"),getClientSideUser:()=>a.evaluate(()=>window.Clerk?.user)});import{expect as y}from"@playwright/test";var b=({page:a})=>({toBeHandshake:async e=>{let r=await e.request().redirectedFrom()?.redirectedFrom()?.response();y(r?.status()).toBe(307),y(r?.headers()["x-clerk-auth-status"]).toContain("handshake")},toBeSignedOut:e=>a.waitForFunction(()=>!window.Clerk?.user,null,{timeout:e?.timeOut}),toBeSignedIn:async()=>a.waitForFunction(()=>!!window.Clerk?.user),toBeSignedInAsActor:async()=>a.waitForFunction(()=>!!window.Clerk?.session?.actor),toHaveResolvedTask:async()=>a.waitForFunction(()=>!window.Clerk?.session?.currentTask)});var h=a=>{let{page:e}=a;return{waitForMounted:(t=".cl-impersonationFab")=>e.waitForSelector(t,{state:"attached"}),getSignOutLink:()=>e.locator(".cl-impersonationFab").getByText("Sign out")}};var P=a=>{let{page:e}=a,r="#--clerk-keyless-prompt-button";return{waitForMounted:()=>e.waitForSelector(r,{state:"attached"}),waitForUnmounted:()=>e.waitForSelector(r,{state:"detached"}),isExpanded:()=>e.locator(r).getAttribute("aria-expanded").then(o=>o==="true"),toggle:()=>e.locator(r).click(),promptsToClaim:()=>e.getByRole("link",{name:/^claim application$/i}),promptToUseClaimedKeys:()=>e.getByRole("link",{name:/^get api keys$/i}),promptToDismiss:()=>e.getByRole("button",{name:/^dismiss$/i})}};import{expect as F}from"@playwright/test";var k=a=>{let{page:e}=a,r={...i(a),goTo:async(t="/switcher")=>(await e.goToRelative(t),r.waitForMounted()),waitForMounted:()=>e.waitForSelector(".cl-organizationSwitcher-root",{state:"attached"}),expectNoOrganizationSelected:()=>F(e.getByText(/No organization selected/i)).toBeVisible(),expectPersonalAccount:()=>F(e.getByText(/personal account/i)).toBeVisible(),toggleTrigger:()=>e.locator(".cl-organizationSwitcherTrigger").click(),waitForAnOrganizationToSelected:()=>e.waitForSelector(".cl-userPreviewMainIdentifier__personalWorkspace",{state:"detached"})};return r};var S=a=>{let{page:e}=a;return{...i(a),waitForMounted:(t=".cl-planDetails-root")=>e.waitForSelector(t,{state:"attached"}),root:e.locator(".cl-planDetails-root")}};var B=a=>{let{page:e}=a,r={toggle:n=>e.locator(`.cl-pricingTableCard__${n} .cl-pricingTableCardPeriodToggle`),indicator:n=>e.locator(`.cl-pricingTableCard__${n} .cl-switchIndicator`),badge:n=>e.locator(`.cl-pricingTableCard__${n} .cl-badge`),footer:n=>e.locator(`.cl-pricingTableCard__${n} .cl-pricingTableCardFooter`)},t=async(n,c)=>{async function l(u,m,M,N=5e3){return e.waitForFunction(({sel:_,attr:D,val:V})=>document.querySelector(_)?.getAttribute(D)===V,{sel:u,attr:m,val:M},{timeout:N}).then(()=>!0).catch(()=>!1)}let s=await l(`.cl-pricingTableCard__${n} .cl-switchIndicator`,"data-checked","true",500);s&&c==="monthly"&&await r.toggle(n).click(),!s&&c==="annually"&&await r.toggle(n).click()};return{...i(a),waitForMounted:(n=".cl-pricingTable-root")=>e.waitForSelector(n,{state:"attached"}),clickResubscribe:async()=>{await e.getByText("Re-subscribe").click()},waitToBeActive:async({planSlug:n})=>r.badge(n).getByText("Active").waitFor({state:"visible"}),waitToBeFreeTrial:async({planSlug:n})=>r.badge(n).getByText("Free trial").waitFor({state:"visible"}),getPlanCardCTA:({planSlug:n})=>r.footer(n).getByRole("button",{name:/get|switch|subscribe/i}),startCheckout:async({planSlug:n,shouldSwitch:c,period:l})=>{let s=c===!0?"Switch to this plan":c===!1?/subscribe/i:/get|switch|subscribe|Start \d+-day free trial/i;l&&await t(n,l),await r.footer(n).getByRole("button",{name:s}).click()}}};import{expect as $}from"@playwright/test";var C=a=>{let{page:e}=a;return{...i(a),resolveForceOrganizationSelectionTask:async t=>{let o=e.getByRole("button",{name:/continue/i});await $(o).toBeVisible(),await e.locator("input[name=name]").fill(t.name),await e.locator("input[name=slug]").fill(t.slug),await o.click()}}};import{expect as R}from"@playwright/test";var T=a=>{let{page:e}=a,r={...i(a),goTo:async t=>{let o=await e.goToRelative("/sign-in",t);return typeof t?.headlessSelector<"u"?await r.waitForMounted(t.headlessSelector):await r.waitForMounted(),o},waitForMounted:(t=".cl-signIn-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signIn-root)",{state:t==="closed"?"detached":"attached"}),setIdentifier:t=>r.getIdentifierInput().fill(t),setInstantPassword:async t=>{let o=r.getPasswordInput();await R(o).toBeVisible(),await o.fill(t,{force:!0})},usePhoneNumberIdentifier:()=>e.getByRole("link",{name:/^use phone/i}),useEmailIdentifier:()=>e.getByRole("link",{name:/^use email/i}),useUsernameIdentifier:()=>e.getByRole("link",{name:/^username$/i}),getForgotPassword:()=>e.getByRole("link",{name:/forgot password/i}),getGoToSignUp:()=>e.getByRole("link",{name:/sign up/i}),getResetPassword:()=>e.getByRole("button",{name:/(reset password|reset your password)/i}),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i}),signInWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signInWithEmailAndInstantPassword:async({email:t,password:o,waitForSession:n=!0})=>{let c=r.getIdentifierInput();await R(c).toBeVisible(),await c.fill(t),await r.setInstantPassword(o),await r.continue(),n&&await r.waitForSession()}};return r};var O=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/sign-up",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-signUp-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signUp-root)",{state:t==="closed"?"detached":"attached"}),signUpWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signUp:async t=>{t.firstName&&await r.getFirstNameInput().fill(t.firstName),t.lastName&&await r.getLastNameInput().fill(t.lastName),t.email&&await r.getEmailAddressInput().fill(t.email),t.username&&await r.getUsernameInput().fill(t.username),t.phoneNumber&&await r.getPhoneNumberInput().fill(t.phoneNumber),t.password&&await r.getPasswordInput().fill(t.password),t.legalAccepted&&await r.getLegalAccepted().check(),await r.continue()},signUpWithEmailAndPassword:async t=>{await r.signUp({email:t.email,password:t.password})},waitForEmailVerificationScreen:async()=>{await e.waitForURL(/verify/),await e.getByRole("heading",{name:/Verify your email/i}).waitFor()}};return r};var E=a=>{let{page:e}=a,r={...i(a),waitForMounted:(t=".cl-subscriptionDetails-root")=>e.waitForSelector(t,{state:"attached"}),waitForUnmounted:()=>r.root.locator(".cl-drawerRoot").waitFor({state:"detached"}),closeDrawer:()=>r.root.locator(".cl-drawerClose").click(),root:e.locator(".cl-subscriptionDetails-root")};return r};var x=({page:a})=>({setup:async()=>p({page:a})});import{expect as z}from"@playwright/test";var U=".cl-userAvatarBox",v=a=>{let{page:e}=a,r={goTo:async t=>(await e.goToRelative("/user-avatar",t),r.waitForMounted()),waitForMounted:(t=U)=>e.waitForSelector(t,{state:"attached"}),toBeVisible:async(t=U)=>await z(e.locator(t).getByRole("img")).toBeVisible()};return r};import{expect as W}from"@playwright/test";var L=a=>{let{page:e}=a;return{waitForMounted:()=>e.waitForSelector(".cl-userButtonTrigger",{state:"attached"}),toggleTrigger:()=>e.locator(".cl-userButtonTrigger").click(),waitForPopover:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"visible"}),waitForPopoverClosed:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"detached"}),toHaveVisibleMenuItems:async t=>{(typeof t=="string"||t instanceof RegExp)&&(t=[t]);for(let o of t)await W(e.getByRole("menuitem",{name:o})).toBeVisible()},triggerSignOut:()=>e.getByRole("menuitem",{name:/Sign out$/i}).click(),triggerManageAccount:()=>e.getByRole("menuitem",{name:/Manage account/i}).click(),switchAccount:t=>e.getByText(t).click()}};var I=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/user",t),r.waitForMounted()),switchToSecurityTab:async()=>{await e.getByText(/Security/i).click()},switchToBillingTab:async()=>{await e.getByText(/Billing/i).click()},waitForMounted:()=>e.waitForSelector(".cl-userProfile-root",{state:"attached"}),clickSetUsername:()=>e.getByText(/Set username/i).click(),clickToUpdateProfile:()=>e.getByText(/update profile/i).click(),clickUpdateUsername:()=>e.getByText(/update username/i).click(),clickSetPassword:()=>e.getByText(/Set password/i).click(),waitForSectionCard:(t,o)=>e.waitForSelector(`.cl-profileSectionContent__${t} .cl-headerTitle`,{state:o?"visible":"detached"}),waitForSectionCardOpened:t=>r.waitForSectionCard(t,!0),waitForSectionCardClosed:t=>r.waitForSectionCard(t,!1),typeUsername:t=>r.getUsernameInput().fill(t),typeFirstName:t=>r.getFirstNameInput().fill(t),typeLastName:t=>r.getLastNameInput().fill(t),typePhoneNumber:t=>r.getPhoneNumberInput().fill(t),clickAddEmailAddress:()=>e.getByText(/add email address/i).click(),clickAddPhoneNumber:()=>e.getByText(/add phone number/i).click(),typeEmailAddress:t=>e.getByLabel(/Email address/i).fill(t),waitForUserProfileModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-userProfile-root)",{state:t==="closed"?"detached":"attached"})};return r};var j=a=>{let{page:e}=a;return{...i(a),waitForMounted:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"attached"}),waitForClosed:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"detached"}),closeReverificationModal:()=>e.getByLabel("Close modal").click(),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i})}};var A=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/waitlist",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-waitlist-root")=>e.waitForSelector(t,{state:"attached"}),joinWaitlist:async t=>{await r.getEmailAddressInput().fill(t.email),await r.joinWaitlistContinue()},joinWaitlistContinue:()=>e.getByRole("button",{name:"Join the waitlist",exact:!0}).click()};return r};var K=({page:a,useTestingToken:e=!0,baseURL:r})=>{let t=g({page:a,useTestingToken:e},{baseURL:r}),o={page:t};return{page:t,clerk:f(o),checkout:w(o),expect:b(o),impersonation:h(o),keylessPopover:P(o),organizationSwitcher:k(o),pricingTable:B(o),sessionTask:C(o),signIn:T(o),signUp:O(o),testingToken:x(o),userAvatar:v(o),userButton:L(o),userProfile:I(o),userVerification:j(o),waitlist:A(o),apiKeys:d(o),subscriptionDetails:E(o),planDetails:S(o)}};export{g as createAppPageObject,K as createPageObjects};
1
+ import{a as p}from"../../chunk-YFUXUEZ5.mjs";import"../../chunk-M5YIJ3SE.mjs";var i=({page:a})=>{let e={continue:()=>a.getByRole("button",{name:"Continue",exact:!0}).click(),setEmailAddress:r=>e.getEmailAddressInput().fill(r),setPassword:r=>e.getPasswordInput().fill(r),setPasswordConfirmation:r=>a.locator("input[name=confirmPassword]").fill(r),enterOtpCode:async(r,t)=>{let{name:o="Enter verification code",awaitAttempt:n=!0,awaitPrepare:c=!0,awaitRequests:l=!0}=t??{};l&&c&&await a.waitForResponse(m=>m.request().method()==="POST"&&(m.url().includes("prepare_verification")||m.url().includes("prepare_first_factor")));let s=a.getByRole("textbox",{name:"Enter verification code. Digit 1"});await s.isVisible()?(console.warn("Using the original OTP input"),await s.click(),await a.keyboard.type(r,{delay:100})):await a.getByLabel(o).fill(r),l&&n&&await a.waitForResponse(m=>m.request().method()==="POST"&&(m.url().includes("attempt_verification")||m.url().includes("attempt_first_factor")))},enterTestOtpCode:async r=>e.enterOtpCode("424242",r),fillTestOtpCode:async(r,t)=>e.enterOtpCode("424242",{name:r,...t}),getIdentifierInput:()=>a.locator("input[name=identifier]"),getEmailAddressInput:()=>a.locator("input[name=emailAddress]"),getPhoneNumberInput:()=>a.locator("input[name=phoneNumber]"),getUsernameInput:()=>a.locator("input[name=username]"),getPasswordInput:()=>a.locator("input[name=password]"),getLegalAccepted:()=>a.locator("input[name=legalAccepted]"),getFirstNameInput:()=>a.locator("input[name=firstName]"),getLastNameInput:()=>a.locator("input[name=lastName]"),waitForSession:async()=>a.waitForFunction(()=>!!window.Clerk?.session)};return e};var d=a=>{let{page:e}=a,r={never:"Never","1d":"1 Day","7d":"7 Days","30d":"30 Days","60d":"60 Days","90d":"90 Days","180d":"180 Days","1y":"1 Year"};return{...i(a),waitForMounted:()=>e.waitForSelector(".cl-apiKeys-root",{state:"attached"}),clickAddButton:()=>e.getByText(/Add new key/i).click(),waitForFormOpened:()=>e.waitForSelector(".cl-apiKeysCreateForm",{state:"attached"}),waitForFormClosed:()=>e.waitForSelector(".cl-apiKeysCreateForm",{state:"detached"}),waitForRevokeModalOpened:()=>e.waitForSelector(".cl-apiKeysRevokeModal",{state:"attached"}),waitForRevokeModalClosed:()=>e.waitForSelector(".cl-apiKeysRevokeModal",{state:"detached"}),typeName:o=>e.getByLabel(/Secret key name/i).fill(o),typeDescription:o=>e.getByLabel(/Description/i).fill(o),selectExpiration:async o=>(await e.getByRole("button",{name:/Select date/i}).click(),e.getByText(r[o??"never"],{exact:!0}).click({force:!0})),clickSaveButton:()=>e.getByText(/Create key/i).click(),typeRevokeConfirmation:o=>e.getByLabel(/Type "Revoke" to confirm/i).fill(o),clickConfirmRevokeButton:()=>e.getByText(/Revoke key/i).click()}};var g=(a,e)=>{let{page:r,useTestingToken:t=!0}=a,o=Object.create(r);return Object.assign(o,{goToAppHome:async()=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");try{t&&await p({page:r}),await r.goto(e.baseURL)}catch{}},goToRelative:async(c,l={})=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");let s;try{r.url().includes("about:blank")?s=new URL(c,e.baseURL):s=new URL(c,r.url())}catch{s=new URL(c,e.baseURL)}return l.searchParams&&(s.search=l.searchParams.toString()),t&&await p({page:r}),r.goto(s.toString(),{timeout:l.timeout??2e4,waitUntil:l.waitUntil})},waitForClerkJsLoaded:async()=>r.waitForFunction(()=>window.Clerk?.loaded),signOut:async()=>r.waitForFunction(()=>window.Clerk?.signOut({})),waitForClerkComponentMounted:async()=>r.waitForSelector(".cl-rootBox",{state:"attached"}),waitForAppUrl:async c=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");return r.waitForURL(new URL(c,e.baseURL).toString())},cookies:async()=>{let c=await r.context().cookies(),l=c.reduce((s,u)=>(u.name.match(/^(__.*_)(.{8})$/)?s.set(u.name.replace(/^(__.*_)(.{8})$/,"$1*"),u):s.set(u.name,u),s),new Map);return Object.assign(l,{raw:()=>c})}})};var w=a=>{let{page:e}=a,r={...i(a),waitForMounted:(t=".cl-checkout-root")=>e.waitForSelector(t,{state:"attached",timeout:2e4}),closeDrawer:()=>e.locator(".cl-drawerClose").click(),fillTestCard:async()=>{await r.fillCard({number:"4242424242424242",expiration:"1234",cvc:"123",country:"United States",zip:"12345"})},fillCard:async t=>{await r.waitForStripeElements({state:"visible"});let o=e.frameLocator('iframe[src*="elements-inner-payment"]');await o.getByLabel("Card number").fill(t.number),await o.getByLabel("Expiration date").fill(t.expiration),await o.getByLabel("Security code").fill(t.cvc),await o.getByLabel("Country").selectOption(t.country),await o.getByLabel("ZIP code").fill(t.zip)},waitForStripeElements:async({state:t="visible"}={})=>{let o=e.locator('iframe[src*="elements-inner-payment"]');t==="visible"?(await o.waitFor({state:"attached",timeout:2e4}),await e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"visible",timeout:2e4})):await e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"hidden",timeout:2e4})},clickPayOrSubscribe:async()=>{await r.root.getByRole("button",{name:/subscribe|pay\s\$|start/i}).click()},waitForSubscribeButton:async()=>{await r.root.getByRole("button",{name:/^subscribe$/i}).waitFor({state:"visible"})},confirmAndContinue:async()=>{await r.root.getByRole("button",{name:/^continue$/i}).click()},clickAddPaymentMethod:async()=>{await r.root.getByRole("radio",{name:"Add payment method"}).click()},clickPaymentMethods:async()=>{await r.root.getByRole("radio",{name:"Payment Methods"}).click()},root:e.locator(".cl-checkout-root")};return r};var f=({page:a})=>({toBeLoaded:async()=>a.waitForFunction(()=>!!window.Clerk?.loaded),getClientSideActor:()=>a.evaluate(()=>window.Clerk?.session?.actor),toBeLoading:async()=>a.waitForFunction(()=>window.Clerk?.status==="loading"),toBeReady:async()=>a.waitForFunction(()=>window.Clerk?.status==="ready"),toBeDegraded:async()=>a.waitForFunction(()=>window.Clerk?.status==="degraded"),getClientSideUser:()=>a.evaluate(()=>window.Clerk?.user)});import{expect as y}from"@playwright/test";var b=({page:a})=>({toBeHandshake:async e=>{let r=await e.request().redirectedFrom()?.redirectedFrom()?.response();y(r?.status()).toBe(307),y(r?.headers()["x-clerk-auth-status"]).toContain("handshake")},toBeSignedOut:e=>a.waitForFunction(()=>!window.Clerk?.user,null,{timeout:e?.timeOut}),toBeSignedIn:async()=>a.waitForFunction(()=>!!window.Clerk?.user),toBeSignedInAsActor:async()=>a.waitForFunction(()=>!!window.Clerk?.session?.actor),toHaveResolvedTask:async()=>a.waitForFunction(()=>!window.Clerk?.session?.currentTask)});var h=a=>{let{page:e}=a;return{waitForMounted:(t=".cl-impersonationFab")=>e.waitForSelector(t,{state:"attached"}),getSignOutLink:()=>e.locator(".cl-impersonationFab").getByText("Sign out")}};var P=a=>{let{page:e}=a,r="#--clerk-keyless-prompt-button";return{waitForMounted:()=>e.waitForSelector(r,{state:"attached"}),waitForUnmounted:()=>e.waitForSelector(r,{state:"detached"}),isExpanded:()=>e.locator(r).getAttribute("aria-expanded").then(o=>o==="true"),toggle:()=>e.locator(r).click(),promptsToClaim:()=>e.getByRole("link",{name:/^claim application$/i}),promptToUseClaimedKeys:()=>e.getByRole("link",{name:/^get api keys$/i}),promptToDismiss:()=>e.getByRole("button",{name:/^dismiss$/i})}};import{expect as F}from"@playwright/test";var k=a=>{let{page:e}=a,r={...i(a),goTo:async(t="/switcher")=>(await e.goToRelative(t),r.waitForMounted()),waitForMounted:()=>e.waitForSelector(".cl-organizationSwitcher-root",{state:"attached"}),expectNoOrganizationSelected:()=>F(e.getByText(/No organization selected/i)).toBeVisible(),expectPersonalAccount:()=>F(e.getByText(/personal account/i)).toBeVisible(),toggleTrigger:()=>e.locator(".cl-organizationSwitcherTrigger").click(),waitForAnOrganizationToSelected:()=>e.waitForSelector(".cl-userPreviewMainIdentifier__personalWorkspace",{state:"detached"})};return r};var S=a=>{let{page:e}=a;return{...i(a),waitForMounted:(t=".cl-planDetails-root")=>e.waitForSelector(t,{state:"attached"}),root:e.locator(".cl-planDetails-root")}};var B=a=>{let{page:e}=a,r={toggle:n=>e.locator(`.cl-pricingTableCard__${n} .cl-pricingTableCardPeriodToggle`),indicator:n=>e.locator(`.cl-pricingTableCard__${n} .cl-switchIndicator`),badge:n=>e.locator(`.cl-pricingTableCard__${n} .cl-badge`),footer:n=>e.locator(`.cl-pricingTableCard__${n} .cl-pricingTableCardFooter`)},t=async(n,c)=>{async function l(u,m,M,N=5e3){return e.waitForFunction(({sel:_,attr:D,val:V})=>document.querySelector(_)?.getAttribute(D)===V,{sel:u,attr:m,val:M},{timeout:N}).then(()=>!0).catch(()=>!1)}let s=await l(`.cl-pricingTableCard__${n} .cl-switchIndicator`,"data-checked","true",500);s&&c==="monthly"&&await r.toggle(n).click(),!s&&c==="annually"&&await r.toggle(n).click()};return{...i(a),waitForMounted:(n=".cl-pricingTable-root")=>e.waitForSelector(n,{state:"attached"}),clickResubscribe:async()=>{await e.getByText("Re-subscribe").click()},waitToBeActive:async({planSlug:n})=>r.badge(n).getByText("Active").waitFor({state:"visible"}),waitToBeFreeTrial:async({planSlug:n})=>r.badge(n).getByText("Free trial").waitFor({state:"visible"}),getPlanCardCTA:({planSlug:n})=>r.footer(n).getByRole("button",{name:/get|switch|subscribe/i}),startCheckout:async({planSlug:n,shouldSwitch:c,period:l})=>{let s=c===!0?"Switch to this plan":c===!1?/subscribe/i:/get|switch|subscribe|Start \d+-day free trial/i;l&&await t(n,l),await r.footer(n).getByRole("button",{name:s}).click()}}};import{expect as $}from"@playwright/test";var C=a=>{let{page:e}=a;return{...i(a),resolveForceOrganizationSelectionTask:async t=>{let o=e.getByRole("button",{name:/continue/i});await $(o).toBeVisible(),await e.locator("input[name=name]").fill(t.name),await e.locator("input[name=slug]").fill(t.slug),await o.click()}}};import{expect as R}from"@playwright/test";var T=a=>{let{page:e}=a,r={...i(a),goTo:async t=>{let o=await e.goToRelative("/sign-in",t);return typeof t?.headlessSelector<"u"?await r.waitForMounted(t.headlessSelector):await r.waitForMounted(),o},waitForMounted:(t=".cl-signIn-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signIn-root)",{state:t==="closed"?"detached":"attached"}),setIdentifier:t=>r.getIdentifierInput().fill(t),setInstantPassword:async t=>{let o=r.getPasswordInput();await R(o).toBeVisible(),await o.fill(t,{force:!0})},usePhoneNumberIdentifier:()=>e.getByRole("link",{name:/^use phone/i}),useEmailIdentifier:()=>e.getByRole("link",{name:/^use email/i}),useUsernameIdentifier:()=>e.getByRole("link",{name:/^username$/i}),getForgotPassword:()=>e.getByRole("link",{name:/forgot password/i}),getGoToSignUp:()=>e.getByRole("link",{name:/sign up/i}),getResetPassword:()=>e.getByRole("button",{name:/(reset password|reset your password)/i}),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i}),signInWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signInWithEmailAndInstantPassword:async({email:t,password:o,waitForSession:n=!0})=>{let c=r.getIdentifierInput();await R(c).toBeVisible(),await c.fill(t),await r.setInstantPassword(o),await r.continue(),n&&await r.waitForSession()}};return r};var O=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/sign-up",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-signUp-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signUp-root)",{state:t==="closed"?"detached":"attached"}),signUpWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signUp:async t=>{t.firstName&&await r.getFirstNameInput().fill(t.firstName),t.lastName&&await r.getLastNameInput().fill(t.lastName),t.email&&await r.getEmailAddressInput().fill(t.email),t.username&&await r.getUsernameInput().fill(t.username),t.phoneNumber&&await r.getPhoneNumberInput().fill(t.phoneNumber),t.password&&await r.getPasswordInput().fill(t.password),t.legalAccepted&&await r.getLegalAccepted().check(),await r.continue()},signUpWithEmailAndPassword:async t=>{await r.signUp({email:t.email,password:t.password})},waitForEmailVerificationScreen:async()=>{await e.waitForURL(/verify/),await e.getByRole("heading",{name:/Verify your email/i}).waitFor()}};return r};var E=a=>{let{page:e}=a,r={...i(a),waitForMounted:(t=".cl-subscriptionDetails-root")=>e.waitForSelector(t,{state:"attached"}),waitForUnmounted:()=>r.root.locator(".cl-drawerRoot").waitFor({state:"detached"}),closeDrawer:()=>r.root.locator(".cl-drawerClose").click(),root:e.locator(".cl-subscriptionDetails-root")};return r};var x=({page:a})=>({setup:async()=>p({page:a})});import{expect as z}from"@playwright/test";var U=".cl-userAvatarBox",v=a=>{let{page:e}=a,r={goTo:async t=>(await e.goToRelative("/user-avatar",t),r.waitForMounted()),waitForMounted:(t=U)=>e.waitForSelector(t,{state:"attached"}),toBeVisible:async(t=U)=>await z(e.locator(t).getByRole("img")).toBeVisible()};return r};import{expect as W}from"@playwright/test";var L=a=>{let{page:e}=a;return{waitForMounted:()=>e.waitForSelector(".cl-userButtonTrigger",{state:"attached"}),toggleTrigger:()=>e.locator(".cl-userButtonTrigger").click(),waitForPopover:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"visible"}),waitForPopoverClosed:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"detached"}),toHaveVisibleMenuItems:async t=>{(typeof t=="string"||t instanceof RegExp)&&(t=[t]);for(let o of t)await W(e.getByRole("menuitem",{name:o})).toBeVisible()},triggerSignOut:()=>e.getByRole("menuitem",{name:/Sign out$/i}).click(),triggerManageAccount:()=>e.getByRole("menuitem",{name:/Manage account/i}).click(),switchAccount:t=>e.getByText(t).click()}};var I=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/user",t),r.waitForMounted()),switchToSecurityTab:async()=>{await e.getByText(/Security/i).click()},switchToBillingTab:async()=>{await e.getByText(/Billing/i).click()},waitForMounted:()=>e.waitForSelector(".cl-userProfile-root",{state:"attached"}),clickSetUsername:()=>e.getByText(/Set username/i).click(),clickToUpdateProfile:()=>e.getByText(/update profile/i).click(),clickUpdateUsername:()=>e.getByText(/update username/i).click(),clickSetPassword:()=>e.getByText(/Set password/i).click(),waitForSectionCard:(t,o)=>e.waitForSelector(`.cl-profileSectionContent__${t} .cl-headerTitle`,{state:o?"visible":"detached"}),waitForSectionCardOpened:t=>r.waitForSectionCard(t,!0),waitForSectionCardClosed:t=>r.waitForSectionCard(t,!1),typeUsername:t=>r.getUsernameInput().fill(t),typeFirstName:t=>r.getFirstNameInput().fill(t),typeLastName:t=>r.getLastNameInput().fill(t),typePhoneNumber:t=>r.getPhoneNumberInput().fill(t),clickAddEmailAddress:()=>e.getByText(/add email address/i).click(),clickAddPhoneNumber:()=>e.getByText(/add phone number/i).click(),typeEmailAddress:t=>e.getByLabel(/Email address/i).fill(t),waitForUserProfileModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-userProfile-root)",{state:t==="closed"?"detached":"attached"})};return r};var j=a=>{let{page:e}=a;return{...i(a),waitForMounted:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"attached"}),waitForClosed:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"detached"}),closeReverificationModal:()=>e.getByLabel("Close modal").click(),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i})}};var A=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/waitlist",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-waitlist-root")=>e.waitForSelector(t,{state:"attached"}),joinWaitlist:async t=>{await r.getEmailAddressInput().fill(t.email),await r.joinWaitlistContinue()},joinWaitlistContinue:()=>e.getByRole("button",{name:"Join the waitlist",exact:!0}).click()};return r};var K=({page:a,useTestingToken:e=!0,baseURL:r})=>{let t=g({page:a,useTestingToken:e},{baseURL:r}),o={page:t};return{page:t,clerk:f(o),checkout:w(o),expect:b(o),impersonation:h(o),keylessPopover:P(o),organizationSwitcher:k(o),pricingTable:B(o),sessionTask:C(o),signIn:T(o),signUp:O(o),testingToken:x(o),userAvatar:v(o),userButton:L(o),userProfile:I(o),userVerification:j(o),waitlist:A(o),apiKeys:d(o),subscriptionDetails:E(o),planDetails:S(o)}};export{g as createAppPageObject,K as createPageObjects};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"setupClerkTestingToken.d.ts","sourceRoot":"","sources":["../../../src/playwright/setupClerkTestingToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAG/D,KAAK,4BAA4B,GAAG;IAClC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,6BAA6B,CAAC;CACzC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,sBAAsB,GAAU,4BAA4B,4BAA4B,kBAkDpG,CAAC"}
1
+ {"version":3,"file":"setupClerkTestingToken.d.ts","sourceRoot":"","sources":["../../../src/playwright/setupClerkTestingToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAG/D,KAAK,4BAA4B,GAAG;IAClC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,6BAA6B,CAAC;CACzC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,sBAAsB,GAAU,4BAA4B,4BAA4B,kBAoDpG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clerk/testing",
3
- "version": "1.13.8-snapshot.v20251021095452",
3
+ "version": "1.13.8",
4
4
  "description": "Utilities to help you create E2E test suites for apps using Clerk",
5
5
  "keywords": [
6
6
  "auth",
@@ -67,9 +67,9 @@
67
67
  ],
68
68
  "dependencies": {
69
69
  "dotenv": "17.2.2",
70
- "@clerk/types": "^4.95.1-snapshot.v20251021095452",
71
- "@clerk/shared": "^3.28.3-snapshot.v20251021095452",
72
- "@clerk/backend": "^2.18.4-snapshot.v20251021095452"
70
+ "@clerk/backend": "^2.19.0",
71
+ "@clerk/shared": "^3.28.3",
72
+ "@clerk/types": "^4.95.1"
73
73
  },
74
74
  "devDependencies": {
75
75
  "@playwright/test": "^1.54.1",
@@ -1,2 +0,0 @@
1
- import{a as i,b as p}from"./chunk-M5YIJ3SE.mjs";var w=async({context:c,options:l,page:T})=>{let s=c??T?.context();if(!s)throw new Error("Either context or page must be provided to setup testing token");let r=l?.frontendApiUrl||process.env.CLERK_FAPI;if(!r)throw new Error(p);let f=`https://${r}/v1/**/*`;await s.route(f,async e=>{let o=new URL(e.request().url()),n=process.env.CLERK_TESTING_TOKEN;n&&o.searchParams.set(i,n);try{let a=await e.fetch({url:o.toString()}),t=await a.json();t?.response?.captcha_bypass===!1&&(t.response.captcha_bypass=!0),t?.client?.captcha_bypass===!1&&(t.client.captcha_bypass=!0),await e.fulfill({response:a,json:t})}catch{await e.continue({url:o.toString()}).catch(console.error)}})};export{w as a};
2
- //# sourceMappingURL=chunk-YVI6XYHN.mjs.map
@@ -1 +0,0 @@
1
- {"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"]}