@clerk/testing
Version:
Utilities to help you create E2E test suites for apps using Clerk
1 lines • 9.19 kB
Source Map (JSON)
{"version":3,"sources":["../src/common/setup.ts","../src/common/helpers-utils.ts"],"sourcesContent":["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","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"],"mappings":"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","names":["createClerkClient","parsePublishableKey","dotenv","fetchEnvVars","options","debug","loadDotEnv","rest","log","msg","publishableKey","secretKey","testingToken","apiUrl","err","signInHelper","signInParams","windowObject","w","signIn","res","supportedFirstFactors","phoneFactor","factor","signInAttempt","emailFactor","err"]}