@clerk/testing
Version:
Utilities to help you create E2E test suites for apps using Clerk
10 lines (6 loc) • 6.33 kB
JavaScript
;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.
Example: +1XXX55501XX.
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.
Any email with the +clerk_test subaddress is a test email address.
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});
//# sourceMappingURL=index.js.map