@clerk/chrome-extension 3.0.0-snapshot.v20251203203405 → 3.0.0-snapshot.v20251204143242

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.
@@ -429,7 +429,7 @@ var BrowserStorageCache = createBrowserStorageCache();
429
429
  var clerk;
430
430
  noRhc.Clerk.sdkMetadata = {
431
431
  name: "@clerk/chrome-extension",
432
- version: "3.0.0-snapshot.v20251203203405"
432
+ version: "3.0.0-snapshot.v20251204143242"
433
433
  };
434
434
  function createClerkClient({
435
435
  __experimental_syncHostListener = false,
@@ -475,8 +475,8 @@ function createClerkClient({
475
475
  const listener = jwt.listener();
476
476
  listener == null ? void 0 : listener.add();
477
477
  }
478
- clerk.__unstable__onAfterResponse(responseHandler(jwt, { isProd }));
479
- clerk.__unstable__onBeforeRequest(requestHandler(jwt, { isProd }));
478
+ clerk.__internal_onAfterResponse(responseHandler(jwt, { isProd }));
479
+ clerk.__internal_onBeforeRequest(requestHandler(jwt, { isProd }));
480
480
  return clerk;
481
481
  }
482
482
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../shared/src/devBrowser.ts","../../../../shared/src/isomorphicAtob.ts","../../../../shared/src/keys.ts","../../../src/types.ts","../../../src/internal/constants.ts","../../../../shared/src/errors/clerkApiError.ts","../../../../shared/src/errors/clerkError.ts","../../../../shared/src/errors/clerkApiResponseError.ts","../../../../shared/src/errors/errorThrower.ts","../../../../shared/src/errors/clerkRuntimeError.ts","../../../src/internal/utils/errors.ts","../../../src/internal/utils/cookies.ts","../../../src/internal/utils/jwt-handler.ts","../../../src/internal/utils/manifest.ts","../../../src/internal/utils/request-handler.ts","../../../src/internal/utils/response-handler.ts","../../../src/internal/utils/storage.ts","../../../src/internal/clerk.ts","../../../src/background/clerk.ts"],"names":["decodedFrontendApi: string","_a","packageName","customMessages","browser","prodHandler","devHandler","Clerk","createClerkClient","clerk"],"mappings":"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","file":"index.js","sourcesContent":["export const DEV_BROWSER_JWT_KEY = '__clerk_db_jwt';\nexport const DEV_BROWSER_JWT_HEADER = 'Clerk-Db-Jwt';\n\n// Sets the dev_browser JWT in the hash or the search\n/**\n *\n */\nexport function setDevBrowserJWTInURL(url: URL, jwt: string): URL {\n const resultURL = new URL(url);\n\n // extract & strip existing jwt from search\n const jwtFromSearch = resultURL.searchParams.get(DEV_BROWSER_JWT_KEY);\n resultURL.searchParams.delete(DEV_BROWSER_JWT_KEY);\n\n // Existing jwt takes precedence\n const jwtToSet = jwtFromSearch || jwt;\n\n if (jwtToSet) {\n resultURL.searchParams.set(DEV_BROWSER_JWT_KEY, jwtToSet);\n }\n\n return resultURL;\n}\n\n/**\n * Gets the __clerk_db_jwt JWT from either the hash or the search\n * Side effect:\n * Removes __clerk_db_jwt JWT from the URL (hash and searchParams) and updates the browser history\n */\nexport function extractDevBrowserJWTFromURL(url: URL): string {\n const jwt = readDevBrowserJwtFromSearchParams(url);\n const cleanUrl = removeDevBrowserJwt(url);\n if (cleanUrl.href !== url.href && typeof globalThis.history !== 'undefined') {\n globalThis.history.replaceState(null, '', removeDevBrowserJwt(url));\n }\n return jwt;\n}\n\nconst readDevBrowserJwtFromSearchParams = (url: URL) => {\n return url.searchParams.get(DEV_BROWSER_JWT_KEY) || '';\n};\n\nconst removeDevBrowserJwt = (url: URL) => {\n return removeDevBrowserJwtFromURLSearchParams(removeLegacyDevBrowserJwt(url));\n};\n\nconst removeDevBrowserJwtFromURLSearchParams = (_url: URL) => {\n const url = new URL(_url);\n url.searchParams.delete(DEV_BROWSER_JWT_KEY);\n return url;\n};\n\n/**\n * Removes the __clerk_db_jwt JWT from the URL hash, as well as\n * the legacy __dev_session JWT from the URL searchParams\n * We no longer need to use this value, however, we should remove it from the URL\n * Existing v4 apps will write the JWT to the hash and the search params in order to ensure\n * backwards compatibility with older v4 apps.\n * The only use case where this is needed now is when a user upgrades to clerk@5 locally\n * without changing the component's version on their dashboard.\n * In this scenario, the AP@4 -> localhost@5 redirect will still have the JWT in the hash,\n * in which case we need to remove it.\n */\nconst removeLegacyDevBrowserJwt = (_url: URL) => {\n const DEV_BROWSER_JWT_MARKER_REGEXP = /__clerk_db_jwt\\[(.*)\\]/;\n const DEV_BROWSER_JWT_LEGACY_KEY = '__dev_session';\n const url = new URL(_url);\n url.searchParams.delete(DEV_BROWSER_JWT_LEGACY_KEY);\n url.hash = decodeURI(url.hash).replace(DEV_BROWSER_JWT_MARKER_REGEXP, '');\n if (url.href.endsWith('#')) {\n url.hash = '';\n }\n return url;\n};\n","/**\n * A function that decodes a string of data which has been encoded using base-64 encoding.\n * Uses `atob` if available, otherwise uses `Buffer` from `global`. If neither are available, returns the data as-is.\n */\nexport const isomorphicAtob = (data: string) => {\n if (typeof atob !== 'undefined' && typeof atob === 'function') {\n return atob(data);\n } else if (typeof global !== 'undefined' && global.Buffer) {\n return new global.Buffer(data, 'base64').toString();\n }\n return data;\n};\n","import { DEV_OR_STAGING_SUFFIXES, LEGACY_DEV_INSTANCE_SUFFIXES } from './constants';\nimport { isomorphicAtob } from './isomorphicAtob';\nimport { isomorphicBtoa } from './isomorphicBtoa';\nimport type { PublishableKey } from './types';\n\n/**\n * Configuration options for parsing publishable keys.\n */\ntype ParsePublishableKeyOptions = {\n /** Whether to throw an error if parsing fails */\n fatal?: boolean;\n /** Custom domain to use for satellite instances */\n domain?: string;\n /** Proxy URL to use instead of the decoded frontend API */\n proxyUrl?: string;\n /** Whether this is a satellite instance */\n isSatellite?: boolean;\n};\n\n/** Prefix used for production publishable keys */\nconst PUBLISHABLE_KEY_LIVE_PREFIX = 'pk_live_';\n\n/** Prefix used for development publishable keys */\nconst PUBLISHABLE_KEY_TEST_PREFIX = 'pk_test_';\n\n/**\n * Regular expression that matches development frontend API keys.\n * Matches patterns like: foo-bar-13.clerk.accounts.dev.\n */\nconst PUBLISHABLE_FRONTEND_API_DEV_REGEX = /^(([a-z]+)-){2}([0-9]{1,2})\\.clerk\\.accounts([a-z.]*)(dev|com)$/i;\n\n/**\n * Converts a frontend API URL into a base64-encoded publishable key.\n *\n * @param frontendApi - The frontend API URL (e.g., 'clerk.example.com').\n * @returns A base64-encoded publishable key with appropriate prefix (pk_live_ or pk_test_).\n */\nexport function buildPublishableKey(frontendApi: string): string {\n const isDevKey =\n PUBLISHABLE_FRONTEND_API_DEV_REGEX.test(frontendApi) ||\n (frontendApi.startsWith('clerk.') && LEGACY_DEV_INSTANCE_SUFFIXES.some(s => frontendApi.endsWith(s)));\n const keyPrefix = isDevKey ? PUBLISHABLE_KEY_TEST_PREFIX : PUBLISHABLE_KEY_LIVE_PREFIX;\n return `${keyPrefix}${isomorphicBtoa(`${frontendApi}$`)}`;\n}\n\n/**\n * Validates that a decoded publishable key has the correct format.\n * The decoded value should be a frontend API followed by exactly one '$' at the end.\n *\n * @param decoded - The decoded publishable key string to validate.\n * @returns `true` if the decoded key has valid format, `false` otherwise.\n */\nfunction isValidDecodedPublishableKey(decoded: string): boolean {\n if (!decoded.endsWith('$')) {\n return false;\n }\n\n const withoutTrailing = decoded.slice(0, -1);\n if (withoutTrailing.includes('$')) {\n return false;\n }\n\n return withoutTrailing.includes('.');\n}\n\nexport function parsePublishableKey(\n key: string | undefined,\n options: ParsePublishableKeyOptions & { fatal: true },\n): PublishableKey;\nexport function parsePublishableKey(\n key: string | undefined,\n options?: ParsePublishableKeyOptions,\n): PublishableKey | null;\n/**\n * Parses and validates a publishable key, extracting the frontend API and instance type.\n *\n * @param key - The publishable key to parse.\n * @param options - Configuration options for parsing.\n * @param options.fatal\n * @param options.domain\n * @param options.proxyUrl\n * @param options.isSatellite\n * @returns Parsed publishable key object with instanceType and frontendApi, or null if invalid.\n *\n * @throws {Error} When options.fatal is true and key is missing or invalid.\n */\nexport function parsePublishableKey(\n key: string | undefined,\n options: { fatal?: boolean; domain?: string; proxyUrl?: string; isSatellite?: boolean } = {},\n): PublishableKey | null {\n key = key || '';\n\n if (!key || !isPublishableKey(key)) {\n if (options.fatal && !key) {\n throw new Error(\n 'Publishable key is missing. Ensure that your publishable key is correctly configured. Double-check your environment configuration for your keys, or access them here: https://dashboard.clerk.com/last-active?path=api-keys',\n );\n }\n if (options.fatal && !isPublishableKey(key)) {\n throw new Error('Publishable key not valid.');\n }\n return null;\n }\n\n const instanceType = key.startsWith(PUBLISHABLE_KEY_LIVE_PREFIX) ? 'production' : 'development';\n\n let decodedFrontendApi: string;\n try {\n decodedFrontendApi = isomorphicAtob(key.split('_')[2]);\n } catch {\n if (options.fatal) {\n throw new Error('Publishable key not valid: Failed to decode key.');\n }\n return null;\n }\n\n if (!isValidDecodedPublishableKey(decodedFrontendApi)) {\n if (options.fatal) {\n throw new Error('Publishable key not valid: Decoded key has invalid format.');\n }\n return null;\n }\n\n let frontendApi = decodedFrontendApi.slice(0, -1);\n\n if (options.proxyUrl) {\n frontendApi = options.proxyUrl;\n } else if (instanceType !== 'development' && options.domain && options.isSatellite) {\n frontendApi = `clerk.${options.domain}`;\n }\n\n return {\n instanceType,\n frontendApi,\n };\n}\n\n/**\n * Checks if the provided key is a valid publishable key.\n *\n * @param key - The key to be checked. Defaults to an empty string if not provided.\n * @returns `true` if 'key' is a valid publishable key, `false` otherwise.\n */\nexport function isPublishableKey(key: string = '') {\n try {\n const hasValidPrefix = key.startsWith(PUBLISHABLE_KEY_LIVE_PREFIX) || key.startsWith(PUBLISHABLE_KEY_TEST_PREFIX);\n\n if (!hasValidPrefix) {\n return false;\n }\n\n const parts = key.split('_');\n if (parts.length !== 3) {\n return false;\n }\n\n const encodedPart = parts[2];\n if (!encodedPart) {\n return false;\n }\n\n const decoded = isomorphicAtob(encodedPart);\n return isValidDecodedPublishableKey(decoded);\n } catch {\n return false;\n }\n}\n\n/**\n * Creates a memoized cache for checking if URLs are development or staging environments.\n * Uses a Map to cache results for better performance on repeated checks.\n *\n * @returns An object with an isDevOrStagingUrl method that checks if a URL is dev/staging.\n */\nexport function createDevOrStagingUrlCache() {\n const devOrStagingUrlCache = new Map<string, boolean>();\n\n return {\n /**\n * Checks if a URL is a development or staging environment.\n *\n * @param url - The URL to check (string or URL object).\n * @returns `true` if the URL is a development or staging environment, `false` otherwise.\n */\n isDevOrStagingUrl: (url: string | URL): boolean => {\n if (!url) {\n return false;\n }\n\n const hostname = typeof url === 'string' ? url : url.hostname;\n let res = devOrStagingUrlCache.get(hostname);\n if (res === undefined) {\n res = DEV_OR_STAGING_SUFFIXES.some(s => hostname.endsWith(s));\n devOrStagingUrlCache.set(hostname, res);\n }\n return res;\n },\n };\n}\n\n/**\n * Checks if a publishable key is for a development environment.\n * Supports both legacy format (test_) and new format (pk_test_).\n *\n * @param apiKey - The API key to check.\n * @returns `true` if the key is for development, `false` otherwise.\n */\nexport function isDevelopmentFromPublishableKey(apiKey: string): boolean {\n return apiKey.startsWith('test_') || apiKey.startsWith('pk_test_');\n}\n\n/**\n * Checks if a publishable key is for a production environment.\n * Supports both legacy format (live_) and new format (pk_live_).\n *\n * @param apiKey - The API key to check.\n * @returns `true` if the key is for production, `false` otherwise.\n */\nexport function isProductionFromPublishableKey(apiKey: string): boolean {\n return apiKey.startsWith('live_') || apiKey.startsWith('pk_live_');\n}\n\n/**\n * Checks if a secret key is for a development environment.\n * Supports both legacy format (test_) and new format (sk_test_).\n *\n * @param apiKey - The secret key to check.\n * @returns `true` if the key is for development, `false` otherwise.\n */\nexport function isDevelopmentFromSecretKey(apiKey: string): boolean {\n return apiKey.startsWith('test_') || apiKey.startsWith('sk_test_');\n}\n\n/**\n * Checks if a secret key is for a production environment.\n * Supports both legacy format (live_) and new format (sk_live_).\n *\n * @param apiKey - The secret key to check.\n * @returns `true` if the key is for production, `false` otherwise.\n */\nexport function isProductionFromSecretKey(apiKey: string): boolean {\n return apiKey.startsWith('live_') || apiKey.startsWith('sk_live_');\n}\n\n/**\n * Generates a unique cookie suffix based on the publishable key using SHA-1 hashing.\n * The suffix is base64-encoded and URL-safe (+ and / characters are replaced).\n *\n * @param publishableKey - The publishable key to generate suffix from.\n * @param subtle - The SubtleCrypto interface to use for hashing (defaults to globalThis.crypto.subtle).\n * @returns A promise that resolves to an 8-character URL-safe base64 string.\n */\nexport async function getCookieSuffix(\n publishableKey: string,\n subtle: SubtleCrypto = globalThis.crypto.subtle,\n): Promise<string> {\n const data = new TextEncoder().encode(publishableKey);\n const digest = await subtle.digest('sha-1', data);\n const stringDigest = String.fromCharCode(...new Uint8Array(digest));\n // Base 64 Encoding with URL and Filename Safe Alphabet: https://datatracker.ietf.org/doc/html/rfc4648#section-5\n return isomorphicBtoa(stringDigest).replace(/\\+/gi, '-').replace(/\\//gi, '_').substring(0, 8);\n}\n\n/**\n * Creates a suffixed cookie name by appending the cookie suffix to the base name.\n * Used to create unique cookie names based on the publishable key.\n *\n * @param cookieName - The base cookie name.\n * @param cookieSuffix - The suffix to append (typically generated by getCookieSuffix).\n * @returns The suffixed cookie name in format: `${cookieName}_${cookieSuffix}`.\n */\nexport const getSuffixedCookieName = (cookieName: string, cookieSuffix: string): string => {\n return `${cookieName}_${cookieSuffix}`;\n};\n","export const SCOPE = {\n BACKGROUND: 'background',\n} as const;\n\nexport type Scope = (typeof SCOPE)[keyof typeof SCOPE];\n\nexport interface ClerkClientExtensionFeatures {\n background?: boolean;\n sync?: boolean;\n}\n","export const AUTH_HEADER = {\n PRODUCTION: 'Authorization',\n DEVELOPMENT: 'Clerk-Db-Jwt',\n};\n\nexport const CLIENT_JWT_KEY = '__client';\nexport const CLIENT_UAT_KEY = '__clerk_uat';\nexport const DEFAULT_LOCAL_HOST_PERMISSION = 'http://localhost';\nexport const STORAGE_KEY_CLIENT_JWT = '__clerk_client_jwt';\n","import type { ClerkAPIError as ClerkAPIErrorInterface, ClerkAPIErrorJSON } from '../types';\nimport { createErrorTypeGuard } from './createErrorTypeGuard';\n\nexport type ClerkApiErrorMeta = Record<string, unknown>;\n\n/**\n * This error contains the specific error message, code, and any additional metadata that was returned by the Clerk API.\n */\nexport class ClerkAPIError<Meta extends ClerkApiErrorMeta = any> implements ClerkAPIErrorInterface {\n static kind = 'ClerkApiError';\n readonly code: string;\n readonly message: string;\n readonly longMessage: string | undefined;\n readonly meta: Meta;\n\n constructor(json: ClerkAPIErrorJSON) {\n const parsedError = {\n code: json.code,\n message: json.message,\n longMessage: json.long_message,\n meta: {\n paramName: json.meta?.param_name,\n sessionId: json.meta?.session_id,\n emailAddresses: json.meta?.email_addresses,\n identifiers: json.meta?.identifiers,\n zxcvbn: json.meta?.zxcvbn,\n plan: json.meta?.plan,\n isPlanUpgradePossible: json.meta?.is_plan_upgrade_possible,\n } as unknown as Meta,\n };\n this.code = parsedError.code;\n this.message = parsedError.message;\n this.longMessage = parsedError.longMessage;\n this.meta = parsedError.meta;\n }\n}\n\n/**\n * Type guard to check if a value is a ClerkApiError instance.\n */\nexport const isClerkApiError = createErrorTypeGuard(ClerkAPIError);\n","import { createErrorTypeGuard } from './createErrorTypeGuard';\n\nexport interface ClerkErrorParams {\n /**\n * A message that describes the error. This is typically intented to be showed to the developers.\n * It should not be shown to the user or parsed directly as the message contents are not guaranteed\n * to be stable - use the `code` property instead.\n */\n message: string;\n /**\n * A machine-stable code that identifies the error.\n */\n code: string;\n /**\n * A user-friendly message that describes the error and can be displayed to the user.\n * This message defaults to English but can be usually translated to the user's language\n * by matching the `code` property to a localized message.\n */\n longMessage?: string;\n /**\n * The cause of the error, typically an `Error` instance that was caught and wrapped by the Clerk error handler.\n */\n cause?: Error;\n /**\n * A URL to the documentation for the error.\n */\n docsUrl?: string;\n}\n\n/**\n * A temporary placeholder, this will eventually be replaced with a\n * build-time flag that will actually perform DCE.\n */\nconst __DEV__ = true;\n\nexport class ClerkError extends Error {\n static kind = 'ClerkError';\n readonly clerkError = true as const;\n readonly code: string;\n readonly longMessage: string | undefined;\n readonly docsUrl: string | undefined;\n readonly cause: Error | undefined;\n\n get name() {\n return this.constructor.name;\n }\n\n constructor(opts: ClerkErrorParams) {\n super(new.target.formatMessage(new.target.kind, opts.message, opts.code, opts.docsUrl), { cause: opts.cause });\n Object.setPrototypeOf(this, ClerkError.prototype);\n this.code = opts.code;\n this.docsUrl = opts.docsUrl;\n this.longMessage = opts.longMessage;\n this.cause = opts.cause;\n }\n\n public toString() {\n return `[${this.name}]\\nMessage:${this.message}`;\n }\n\n protected static formatMessage(name: string, msg: string, code: string, docsUrl: string | undefined) {\n // Keeping the Clerk prefix for backward compatibility\n // msg = `${name}: ${msg.trim()}\\n\\n(code=\"${code}\")\\n\\n`;\n // We can remove the Clerk prefix in the next major version\n const prefix = 'Clerk:';\n const regex = new RegExp(prefix.replace(' ', '\\\\s*'), 'i');\n msg = msg.replace(regex, '');\n msg = `${prefix} ${msg.trim()}\\n\\n(code=\"${code}\")\\n\\n`;\n if (__DEV__ && docsUrl) {\n msg += `\\n\\nDocs: ${docsUrl}`;\n }\n return msg;\n }\n}\n\n/**\n * Type guard to check if a value is a ClerkError instance.\n */\nexport function isClerkError(val: unknown): val is ClerkError {\n const typeguard = createErrorTypeGuard(ClerkError);\n // Ths is the base error so we're being more defensive about the type guard\n return typeguard(val) || (!!val && typeof val === 'object' && 'clerkError' in val && val.clerkError === true);\n}\n","import type { ClerkAPIErrorJSON, ClerkAPIResponseError as ClerkAPIResponseErrorInterface } from '../types';\nimport { ClerkAPIError } from './clerkApiError';\nimport type { ClerkErrorParams } from './clerkError';\nimport { ClerkError } from './clerkError';\nimport { createErrorTypeGuard } from './createErrorTypeGuard';\n\ninterface ClerkAPIResponseOptions extends Omit<ClerkErrorParams, 'message' | 'code'> {\n data: ClerkAPIErrorJSON[];\n status: number;\n clerkTraceId?: string;\n retryAfter?: number;\n}\n\nexport class ClerkAPIResponseError extends ClerkError implements ClerkAPIResponseErrorInterface {\n static kind = 'ClerkAPIResponseError';\n status: number;\n clerkTraceId?: string;\n retryAfter?: number;\n errors: ClerkAPIError[];\n\n constructor(message: string, options: ClerkAPIResponseOptions) {\n const { data: errorsJson, status, clerkTraceId, retryAfter } = options;\n super({ ...options, message, code: 'api_response_error' });\n Object.setPrototypeOf(this, ClerkAPIResponseError.prototype);\n this.status = status;\n this.clerkTraceId = clerkTraceId;\n this.retryAfter = retryAfter;\n this.errors = (errorsJson || []).map(e => new ClerkAPIError(e));\n }\n\n public toString() {\n let message = `[${this.name}]\\nMessage:${this.message}\\nStatus:${this.status}\\nSerialized errors: ${this.errors.map(\n e => JSON.stringify(e),\n )}`;\n\n if (this.clerkTraceId) {\n message += `\\nClerk Trace ID: ${this.clerkTraceId}`;\n }\n\n return message;\n }\n\n // Override formatMessage to keep it unformatted for backward compatibility\n protected static override formatMessage(name: string, msg: string, _: string, __: string | undefined) {\n return msg;\n }\n}\n\n/**\n * Type guard to check if an error is a ClerkApiResponseError.\n * Can be called as a standalone function or as a method on an error object.\n *\n * @example\n * // As a standalone function\n * if (isClerkApiResponseError(error)) { ... }\n *\n * // As a method (when attached to error object)\n * if (error.isClerkApiResponseError()) { ... }\n */\nexport const isClerkApiResponseError = createErrorTypeGuard(ClerkAPIResponseError);\n","const DefaultMessages = Object.freeze({\n InvalidProxyUrlErrorMessage: `The proxyUrl passed to Clerk is invalid. The expected value for proxyUrl is an absolute URL or a relative path with a leading '/'. (key={{url}})`,\n InvalidPublishableKeyErrorMessage: `The publishableKey passed to Clerk is invalid. You can get your Publishable key at https://dashboard.clerk.com/last-active?path=api-keys. (key={{key}})`,\n MissingPublishableKeyErrorMessage: `Missing publishableKey. You can get your key at https://dashboard.clerk.com/last-active?path=api-keys.`,\n MissingSecretKeyErrorMessage: `Missing secretKey. You can get your key at https://dashboard.clerk.com/last-active?path=api-keys.`,\n MissingClerkProvider: `{{source}} can only be used within the <ClerkProvider /> component. Learn more: https://clerk.com/docs/components/clerk-provider`,\n});\n\ntype MessageKeys = keyof typeof DefaultMessages;\n\ntype Messages = Record<MessageKeys, string>;\n\ntype CustomMessages = Partial<Messages>;\n\nexport type ErrorThrowerOptions = {\n packageName: string;\n customMessages?: CustomMessages;\n};\n\nexport interface ErrorThrower {\n setPackageName(options: ErrorThrowerOptions): ErrorThrower;\n\n setMessages(options: ErrorThrowerOptions): ErrorThrower;\n\n throwInvalidPublishableKeyError(params: { key?: string }): never;\n\n throwInvalidProxyUrl(params: { url?: string }): never;\n\n throwMissingPublishableKeyError(): never;\n\n throwMissingSecretKeyError(): never;\n\n throwMissingClerkProviderError(params: { source?: string }): never;\n\n throw(message: string): never;\n}\n\n/**\n * Builds an error thrower.\n *\n * @internal\n */\nexport function buildErrorThrower({ packageName, customMessages }: ErrorThrowerOptions): ErrorThrower {\n let pkg = packageName;\n\n /**\n * Builds a message from a raw message and replacements.\n *\n * @internal\n */\n function buildMessage(rawMessage: string, replacements?: Record<string, string | number>) {\n if (!replacements) {\n return `${pkg}: ${rawMessage}`;\n }\n\n let msg = rawMessage;\n const matches = rawMessage.matchAll(/{{([a-zA-Z0-9-_]+)}}/g);\n\n for (const match of matches) {\n const replacement = (replacements[match[1]] || '').toString();\n msg = msg.replace(`{{${match[1]}}}`, replacement);\n }\n\n return `${pkg}: ${msg}`;\n }\n\n const messages = {\n ...DefaultMessages,\n ...customMessages,\n };\n\n return {\n setPackageName({ packageName }: ErrorThrowerOptions): ErrorThrower {\n if (typeof packageName === 'string') {\n pkg = packageName;\n }\n return this;\n },\n\n setMessages({ customMessages }: ErrorThrowerOptions): ErrorThrower {\n Object.assign(messages, customMessages || {});\n return this;\n },\n\n throwInvalidPublishableKeyError(params: { key?: string }): never {\n throw new Error(buildMessage(messages.InvalidPublishableKeyErrorMessage, params));\n },\n\n throwInvalidProxyUrl(params: { url?: string }): never {\n throw new Error(buildMessage(messages.InvalidProxyUrlErrorMessage, params));\n },\n\n throwMissingPublishableKeyError(): never {\n throw new Error(buildMessage(messages.MissingPublishableKeyErrorMessage));\n },\n\n throwMissingSecretKeyError(): never {\n throw new Error(buildMessage(messages.MissingSecretKeyErrorMessage));\n },\n\n throwMissingClerkProviderError(params: { source?: string }): never {\n throw new Error(buildMessage(messages.MissingClerkProvider, params));\n },\n\n throw(message: string): never {\n throw new Error(buildMessage(message));\n },\n };\n}\n","import type { ClerkErrorParams } from './clerkError';\nimport { ClerkError } from './clerkError';\nimport { createErrorTypeGuard } from './createErrorTypeGuard';\n\ntype ClerkRuntimeErrorOptions = Omit<ClerkErrorParams, 'message'>;\n\n/**\n * Custom error class for representing Clerk runtime errors.\n *\n * @class ClerkRuntimeError\n *\n * @example\n * throw new ClerkRuntimeError('An error occurred', { code: 'password_invalid' });\n */\nexport class ClerkRuntimeError extends ClerkError {\n static kind = 'ClerkRuntimeError';\n /**\n * @deprecated Use `clerkError` property instead. This property is maintained for backward compatibility.\n */\n readonly clerkRuntimeError = true as const;\n\n constructor(message: string, options: ClerkRuntimeErrorOptions) {\n super({ ...options, message });\n Object.setPrototypeOf(this, ClerkRuntimeError.prototype);\n }\n}\n\n/**\n * Type guard to check if an error is a ClerkRuntimeError.\n * Can be called as a standalone function or as a method on an error object.\n *\n * @example\n * // As a standalone function\n * if (isClerkRuntimeError(error)) { ... }\n *\n * // As a method (when attached to error object)\n * if (error.isClerkRuntimeError()) { ... }\n */\nexport const isClerkRuntimeError = createErrorTypeGuard(ClerkRuntimeError);\n","import { buildErrorThrower } from '@clerk/shared/error';\n\nexport type HostPermissionHintOpts = {\n hostHint: string;\n};\n\nexport const errorLogger = (err: Error) => console.error(err, err.stack);\nexport const errorThrower = buildErrorThrower({ packageName: '@clerk/chrome-extension' });\n\nexport const missingManifestKeyError = (key: string) => `Missing \\`${key}\\` entry in manifest.json`;\n\nexport function assertPublishableKey(publishableKey: unknown): asserts publishableKey {\n if (!publishableKey) {\n errorThrower.throwMissingPublishableKeyError();\n }\n}\n","import browser from 'webextension-polyfill';\n\nexport type FormattedUrl = `http${string}`;\n\nexport type GetClientCookieParams = {\n name: string;\n url: string;\n callback: (changeInfo: ChangeInfo) => Promise<void>;\n onListenerCallback?: () => void;\n};\n\nexport type ChangeInfo = {\n cookie: browser.Cookies.Cookie;\n cause: browser.Cookies.OnChangedCause;\n removed: boolean;\n};\n\nfunction ensureFormattedUrl(url: string): FormattedUrl {\n return url.startsWith('http') ? (url as FormattedUrl) : `https://${url}`;\n}\n\nexport async function getClientCookie({ url, name }: GetClientCookieParams) {\n return await browser.cookies.get({ name, url: ensureFormattedUrl(url) });\n}\n\nexport function createClientCookieListener({ url, name, callback }: GetClientCookieParams) {\n const domain = new URL(url).hostname;\n const cookieDomain = domain.startsWith('www.') ? domain.slice(4) : domain;\n\n const listener = (changeInfo: ChangeInfo) => {\n if (changeInfo.cookie.domain === cookieDomain && changeInfo.cookie.name === name) {\n void callback(changeInfo);\n }\n };\n\n return {\n add: () => browser.cookies.onChanged.addListener(listener),\n has: () => browser.cookies.onChanged.hasListener(listener),\n remove: () => browser.cookies.onChanged.removeListener(listener),\n };\n}\n","import { CLIENT_UAT_KEY, STORAGE_KEY_CLIENT_JWT } from '../constants';\nimport type { ChangeInfo, GetClientCookieParams } from './cookies';\nimport { createClientCookieListener, getClientCookie } from './cookies';\nimport { errorLogger } from './errors';\nimport type { StorageCache } from './storage';\n\nexport type JWTHandlerParams = { frontendApi: string } & (\n | {\n sync?: false;\n }\n | ({ sync: true } & GetClientCookieParams)\n);\n\nexport type JWTHandler = ReturnType<typeof JWTHandler>;\n\nfunction shouldSync(sync: boolean | undefined, _params: unknown): _params is GetClientCookieParams {\n return Boolean(sync);\n}\n\nexport function JWTHandler(store: StorageCache, params: JWTHandlerParams) {\n const { sync, frontendApi, ...cookieParams } = params;\n\n const CACHE_KEY = store.createKey(frontendApi, STORAGE_KEY_CLIENT_JWT, 'v2');\n\n /**\n * Sets the JWT value to the active\n * @param value: JWT generally from the cookie or authorization header\n */\n const set = async (value: string): Promise<void> => {\n return await store.set(CACHE_KEY, value).catch(errorLogger);\n };\n\n /**\n * Remove the JWT value\n */\n const remove = async (): Promise<void> => {\n return await store.remove(CACHE_KEY).catch(errorLogger);\n };\n\n /**\n * Gets the JWT value to the active store.\n * If not set, attempt to get it from the synced session and save for later use.\n */\n const get = async () => {\n if (shouldSync(sync, cookieParams)) {\n // Get client cookie from browser\n const syncedJWT = await getClientCookie(cookieParams).catch(errorLogger);\n\n if (syncedJWT) {\n // Set client cookie in StorageCache\n await set(syncedJWT.value);\n return syncedJWT.value;\n }\n }\n\n // Get current JWT from StorageCache\n return await store.get<string>(CACHE_KEY);\n };\n\n const listener = () => {\n if (!shouldSync(sync, cookieParams)) {\n return;\n }\n\n const { onListenerCallback, ...restCookieParams } = cookieParams;\n\n return createClientCookieListener({\n ...restCookieParams,\n callback: async (changeInfo: ChangeInfo) => {\n const existingJWT = await get();\n\n if (existingJWT === changeInfo.cookie.value) {\n const syncedUAT = await getClientCookie({ ...restCookieParams, name: CLIENT_UAT_KEY }).catch(errorLogger);\n\n if (!syncedUAT || syncedUAT?.value === '0') {\n onListenerCallback?.();\n }\n\n return;\n }\n\n await set(changeInfo.cookie.value);\n onListenerCallback?.();\n },\n });\n };\n\n return { get, listener, set, remove };\n}\n","import type { SetRequired } from 'type-fest';\nimport type { Manifest } from 'webextension-polyfill';\n\nimport type { ClerkClientExtensionFeatures } from '../../types';\nimport { errorThrower, missingManifestKeyError } from './errors';\n\nexport type ValidatedManifest = SetRequired<Manifest.WebExtensionManifest, 'permissions' | 'host_permissions'>;\nexport type ManifestKeys = keyof Manifest.WebExtensionManifest;\n\nfunction validateRootManifestKey(manifest: Manifest.WebExtensionManifest, key: ManifestKeys): void {\n if (!manifest[key]) {\n errorThrower.throw(missingManifestKeyError(key));\n }\n}\n\nfunction validateManifestPermission(manifest: Manifest.WebExtensionManifest, key: Manifest.Permission): void {\n if (!manifest.permissions?.includes(key)) {\n errorThrower.throw(missingManifestKeyError(`permissions.${key}`));\n }\n}\n\nfunction hasAdditionalFeatures(features: ClerkClientExtensionFeatures): boolean {\n return Boolean(features) && Object.keys(features).length > 0;\n}\n\nexport function validateManifest(\n manifest: Manifest.WebExtensionManifest,\n features: ClerkClientExtensionFeatures,\n): asserts manifest is ValidatedManifest {\n validateRootManifestKey(manifest, 'permissions');\n validateManifestPermission(manifest, 'storage');\n\n // If no additional features are provided, we can return success early\n if (!hasAdditionalFeatures(features)) {\n return;\n }\n\n if (features.background) {\n validateRootManifestKey(manifest, 'background');\n }\n\n if (features.sync) {\n validateManifestPermission(manifest, 'cookies');\n validateRootManifestKey(manifest, 'host_permissions');\n }\n}\n","import type { Clerk } from '@clerk/clerk-js';\n\nimport { AUTH_HEADER } from '../constants';\nimport type { JWTHandler } from './jwt-handler';\n\ntype Handler = Parameters<Clerk['__unstable__onBeforeRequest']>[0];\ntype Req = Parameters<Handler>[0];\n\n/** Append the JWT to the FAPI request */\nexport function requestHandler(jwtHandler: JWTHandler, { isProd }: { isProd: boolean }) {\n const handler: Handler = async requestInit => {\n requestInit.credentials = 'omit';\n\n const currentJWT = await jwtHandler.get();\n\n if (!currentJWT) {\n return;\n }\n\n if (isProd) {\n prodHandler(requestInit, currentJWT);\n } else {\n devHandler(requestInit, currentJWT);\n }\n };\n\n return handler;\n}\n\n/** Append the JWT to the FAPI request, per development instances */\nfunction devHandler(requestInit: Req, jwt: string) {\n requestInit.url?.searchParams.append('__clerk_db_jwt', jwt);\n}\n\n/** Append the JWT to the FAPI request, per production instances */\nfunction prodHandler(requestInit: Req, jwt: string) {\n requestInit.url?.searchParams.append('_is_native', '1');\n (requestInit.headers as Headers).set(AUTH_HEADER.PRODUCTION, `Bearer ${jwt}`);\n}\n","import type { Clerk } from '@clerk/clerk-js';\n\nimport { AUTH_HEADER } from '../constants';\nimport type { JWTHandler } from './jwt-handler';\n\ntype Handler = Parameters<Clerk['__unstable__onAfterResponse']>[0];\ntype Res = Parameters<Handler>[1];\n\n/** Retrieve the JWT to the FAPI response */\nexport function responseHandler(jwtHandler: JWTHandler, { isProd }: { isProd: boolean }) {\n const handler: Handler = async (_, response) => {\n if (isProd) {\n await prodHandler(response, jwtHandler);\n } else {\n await devHandler(response, jwtHandler);\n }\n };\n return handler;\n}\n\n/** Retrieve the JWT to the FAPI response, per development instances */\nasync function devHandler(response: Res, jwtHandler: JWTHandler) {\n const header = response?.headers.get(AUTH_HEADER.DEVELOPMENT);\n\n if (header) {\n await jwtHandler.set(header);\n } else {\n await jwtHandler.remove();\n }\n}\n\n/** Retrieve the JWT to the FAPI response, per production instances */\nasync function prodHandler(response: Res, jwtHandler: JWTHandler) {\n const header = response?.headers.get(AUTH_HEADER.PRODUCTION);\n\n if (header?.startsWith('Bearer')) {\n const jwt = header.split(' ')[1] || undefined;\n\n if (jwt) {\n await jwtHandler.set(jwt);\n } else {\n await jwtHandler.remove();\n }\n } else if (header) {\n await jwtHandler.set(header);\n }\n}\n","import browser from 'webextension-polyfill';\n\ntype StorageCacheOptions = {\n storageArea?: 'local' | 'sync';\n};\n\nexport type StorageCache = {\n createKey: (...keys: string[]) => string;\n get: <T = any>(key: string) => Promise<T | undefined>;\n remove: (key: string) => Promise<void>;\n set: (key: string, value: string) => Promise<void>;\n};\n\nconst createKey: StorageCache['createKey'] = (...keys: string[]) => keys.filter(Boolean).join('|');\n\n// Use browser.storage (local or sync) to persist Clerk client JWT.\n// More information at https://developer.chrome.com/docs/extensions/reference/storage\nconst createBrowserStorageCache = (opts: StorageCacheOptions = {}): StorageCache => {\n const __storageArea = opts.storageArea || 'local';\n\n return {\n createKey,\n get: <T>(key: string) => browser.storage[__storageArea].get(key).then(result => (result[key] as T) || undefined),\n remove: (key: string) => browser.storage[__storageArea].remove(key),\n set: (key: string, value: string) => browser.storage[__storageArea].set({ [key]: value }),\n };\n};\n\nconst createMemoryStorageCache = (): StorageCache => {\n const cache: Map<string, any> = new Map();\n\n return {\n createKey,\n get: (key: string) => Promise.resolve(cache.get(key)),\n remove: (key: string) => {\n cache.delete(key);\n return Promise.resolve();\n },\n set: (key: string, value: string) => {\n cache.set(key, value);\n return Promise.resolve();\n },\n };\n};\n\nexport const BrowserStorageCache = createBrowserStorageCache();\nexport const MemoryStorageCache = createMemoryStorageCache();\n","import { Clerk } from '@clerk/clerk-js/no-rhc';\nimport { DEV_BROWSER_JWT_KEY } from '@clerk/shared/devBrowser';\nimport { parsePublishableKey } from '@clerk/shared/keys';\nimport browser from 'webextension-polyfill';\n\nimport { SCOPE, type Scope } from '../types';\nimport { CLIENT_JWT_KEY, DEFAULT_LOCAL_HOST_PERMISSION } from './constants';\nimport { assertPublishableKey } from './utils/errors';\nimport type { JWTHandlerParams } from './utils/jwt-handler';\nimport { JWTHandler } from './utils/jwt-handler';\nimport { validateManifest } from './utils/manifest';\nimport { requestHandler } from './utils/request-handler';\nimport { responseHandler } from './utils/response-handler';\nimport { BrowserStorageCache, type StorageCache } from './utils/storage';\n\nexport let clerk: Clerk;\n\nClerk.sdkMetadata = {\n name: PACKAGE_NAME,\n version: PACKAGE_VERSION,\n};\n\nexport type CreateClerkClientOptions = {\n __experimental_syncHostListener?: boolean;\n publishableKey: string;\n scope?: Scope;\n storageCache?: StorageCache;\n syncHost?: string;\n};\n\nexport function createClerkClient({\n __experimental_syncHostListener = false,\n publishableKey,\n scope,\n storageCache = BrowserStorageCache,\n syncHost,\n}: CreateClerkClientOptions) {\n if (scope === SCOPE.BACKGROUND) {\n // TODO @nikos\n // @ts-expect-error will be replaced by clerk ui\n Clerk.mountComponentRenderer = undefined;\n }\n\n // Don't cache background scripts as it can result in out-of-sync client information.\n if (clerk && scope !== SCOPE.BACKGROUND) {\n return clerk;\n }\n\n // Sync is enabled if a `syncHost` is provided\n const sync = Boolean(syncHost);\n\n // Parse publishableKey and assert it's present/valid, throw if not\n const key = parsePublishableKey(publishableKey);\n assertPublishableKey(key);\n\n const isProd = key.instanceType === 'production';\n const manifest = browser.runtime.getManifest();\n\n // Will throw if manifest is invalid\n validateManifest(manifest, {\n background: scope === SCOPE.BACKGROUND,\n sync,\n });\n\n // Set up JWT handler and attempt to get JWT from storage on initialization\n const url = syncHost ? syncHost : DEFAULT_LOCAL_HOST_PERMISSION;\n\n // Create Clerk instance\n clerk = new Clerk(publishableKey, {});\n\n // @ts-expect-error - TODO: sync is evaluating to true vs boolean\n const jwtOptions: JWTHandlerParams = {\n frontendApi: key.frontendApi,\n name: isProd ? CLIENT_JWT_KEY : DEV_BROWSER_JWT_KEY,\n url,\n sync: sync,\n };\n\n if (jwtOptions.sync && __experimental_syncHostListener) {\n jwtOptions.onListenerCallback = () => {\n if (clerk.user) {\n clerk.user.reload();\n } else {\n window.location.reload();\n }\n };\n }\n\n const jwt = JWTHandler(storageCache, jwtOptions);\n\n // Add listener to sync host cookies if enabled\n if (jwtOptions.sync && __experimental_syncHostListener) {\n const listener = jwt.listener();\n listener?.add();\n }\n\n clerk.__unstable__onAfterResponse(responseHandler(jwt, { isProd }));\n clerk.__unstable__onBeforeRequest(requestHandler(jwt, { isProd }));\n\n return clerk;\n}\n","import type { Clerk } from '@clerk/clerk-js/no-rhc';\n\nimport {\n createClerkClient as _createClerkClient,\n type CreateClerkClientOptions as _CreateClerkClientOptions,\n} from '../internal';\nimport { SCOPE } from '../types';\n\nexport type CreateClerkClientOptions = Omit<_CreateClerkClientOptions, 'scope'>;\n\nexport async function createClerkClient(opts: CreateClerkClientOptions): Promise<Clerk> {\n const clerk = await _createClerkClient({ ...opts, scope: SCOPE.BACKGROUND });\n await clerk.load({ standardBrowser: false });\n return clerk;\n}\n"]}
1
+ {"version":3,"sources":["../../../../shared/src/devBrowser.ts","../../../../shared/src/isomorphicAtob.ts","../../../../shared/src/keys.ts","../../../src/types.ts","../../../src/internal/constants.ts","../../../../shared/src/errors/clerkApiError.ts","../../../../shared/src/errors/clerkError.ts","../../../../shared/src/errors/clerkApiResponseError.ts","../../../../shared/src/errors/errorThrower.ts","../../../../shared/src/errors/clerkRuntimeError.ts","../../../src/internal/utils/errors.ts","../../../src/internal/utils/cookies.ts","../../../src/internal/utils/jwt-handler.ts","../../../src/internal/utils/manifest.ts","../../../src/internal/utils/request-handler.ts","../../../src/internal/utils/response-handler.ts","../../../src/internal/utils/storage.ts","../../../src/internal/clerk.ts","../../../src/background/clerk.ts"],"names":["decodedFrontendApi: string","_a","packageName","customMessages","browser","prodHandler","devHandler","Clerk","createClerkClient","clerk"],"mappings":"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","file":"index.js","sourcesContent":["export const DEV_BROWSER_JWT_KEY = '__clerk_db_jwt';\nexport const DEV_BROWSER_JWT_HEADER = 'Clerk-Db-Jwt';\n\n// Sets the dev_browser JWT in the hash or the search\n/**\n *\n */\nexport function setDevBrowserJWTInURL(url: URL, jwt: string): URL {\n const resultURL = new URL(url);\n\n // extract & strip existing jwt from search\n const jwtFromSearch = resultURL.searchParams.get(DEV_BROWSER_JWT_KEY);\n resultURL.searchParams.delete(DEV_BROWSER_JWT_KEY);\n\n // Existing jwt takes precedence\n const jwtToSet = jwtFromSearch || jwt;\n\n if (jwtToSet) {\n resultURL.searchParams.set(DEV_BROWSER_JWT_KEY, jwtToSet);\n }\n\n return resultURL;\n}\n\n/**\n * Gets the __clerk_db_jwt JWT from either the hash or the search\n * Side effect:\n * Removes __clerk_db_jwt JWT from the URL (hash and searchParams) and updates the browser history\n */\nexport function extractDevBrowserJWTFromURL(url: URL): string {\n const jwt = readDevBrowserJwtFromSearchParams(url);\n const cleanUrl = removeDevBrowserJwt(url);\n if (cleanUrl.href !== url.href && typeof globalThis.history !== 'undefined') {\n globalThis.history.replaceState(null, '', removeDevBrowserJwt(url));\n }\n return jwt;\n}\n\nconst readDevBrowserJwtFromSearchParams = (url: URL) => {\n return url.searchParams.get(DEV_BROWSER_JWT_KEY) || '';\n};\n\nconst removeDevBrowserJwt = (url: URL) => {\n return removeDevBrowserJwtFromURLSearchParams(removeLegacyDevBrowserJwt(url));\n};\n\nconst removeDevBrowserJwtFromURLSearchParams = (_url: URL) => {\n const url = new URL(_url);\n url.searchParams.delete(DEV_BROWSER_JWT_KEY);\n return url;\n};\n\n/**\n * Removes the __clerk_db_jwt JWT from the URL hash, as well as\n * the legacy __dev_session JWT from the URL searchParams\n * We no longer need to use this value, however, we should remove it from the URL\n * Existing v4 apps will write the JWT to the hash and the search params in order to ensure\n * backwards compatibility with older v4 apps.\n * The only use case where this is needed now is when a user upgrades to clerk@5 locally\n * without changing the component's version on their dashboard.\n * In this scenario, the AP@4 -> localhost@5 redirect will still have the JWT in the hash,\n * in which case we need to remove it.\n */\nconst removeLegacyDevBrowserJwt = (_url: URL) => {\n const DEV_BROWSER_JWT_MARKER_REGEXP = /__clerk_db_jwt\\[(.*)\\]/;\n const DEV_BROWSER_JWT_LEGACY_KEY = '__dev_session';\n const url = new URL(_url);\n url.searchParams.delete(DEV_BROWSER_JWT_LEGACY_KEY);\n url.hash = decodeURI(url.hash).replace(DEV_BROWSER_JWT_MARKER_REGEXP, '');\n if (url.href.endsWith('#')) {\n url.hash = '';\n }\n return url;\n};\n","/**\n * A function that decodes a string of data which has been encoded using base-64 encoding.\n * Uses `atob` if available, otherwise uses `Buffer` from `global`. If neither are available, returns the data as-is.\n */\nexport const isomorphicAtob = (data: string) => {\n if (typeof atob !== 'undefined' && typeof atob === 'function') {\n return atob(data);\n } else if (typeof global !== 'undefined' && global.Buffer) {\n return new global.Buffer(data, 'base64').toString();\n }\n return data;\n};\n","import { DEV_OR_STAGING_SUFFIXES, LEGACY_DEV_INSTANCE_SUFFIXES } from './constants';\nimport { isomorphicAtob } from './isomorphicAtob';\nimport { isomorphicBtoa } from './isomorphicBtoa';\nimport type { PublishableKey } from './types';\n\n/**\n * Configuration options for parsing publishable keys.\n */\ntype ParsePublishableKeyOptions = {\n /** Whether to throw an error if parsing fails */\n fatal?: boolean;\n /** Custom domain to use for satellite instances */\n domain?: string;\n /** Proxy URL to use instead of the decoded frontend API */\n proxyUrl?: string;\n /** Whether this is a satellite instance */\n isSatellite?: boolean;\n};\n\n/** Prefix used for production publishable keys */\nconst PUBLISHABLE_KEY_LIVE_PREFIX = 'pk_live_';\n\n/** Prefix used for development publishable keys */\nconst PUBLISHABLE_KEY_TEST_PREFIX = 'pk_test_';\n\n/**\n * Regular expression that matches development frontend API keys.\n * Matches patterns like: foo-bar-13.clerk.accounts.dev.\n */\nconst PUBLISHABLE_FRONTEND_API_DEV_REGEX = /^(([a-z]+)-){2}([0-9]{1,2})\\.clerk\\.accounts([a-z.]*)(dev|com)$/i;\n\n/**\n * Converts a frontend API URL into a base64-encoded publishable key.\n *\n * @param frontendApi - The frontend API URL (e.g., 'clerk.example.com').\n * @returns A base64-encoded publishable key with appropriate prefix (pk_live_ or pk_test_).\n */\nexport function buildPublishableKey(frontendApi: string): string {\n const isDevKey =\n PUBLISHABLE_FRONTEND_API_DEV_REGEX.test(frontendApi) ||\n (frontendApi.startsWith('clerk.') && LEGACY_DEV_INSTANCE_SUFFIXES.some(s => frontendApi.endsWith(s)));\n const keyPrefix = isDevKey ? PUBLISHABLE_KEY_TEST_PREFIX : PUBLISHABLE_KEY_LIVE_PREFIX;\n return `${keyPrefix}${isomorphicBtoa(`${frontendApi}$`)}`;\n}\n\n/**\n * Validates that a decoded publishable key has the correct format.\n * The decoded value should be a frontend API followed by exactly one '$' at the end.\n *\n * @param decoded - The decoded publishable key string to validate.\n * @returns `true` if the decoded key has valid format, `false` otherwise.\n */\nfunction isValidDecodedPublishableKey(decoded: string): boolean {\n if (!decoded.endsWith('$')) {\n return false;\n }\n\n const withoutTrailing = decoded.slice(0, -1);\n if (withoutTrailing.includes('$')) {\n return false;\n }\n\n return withoutTrailing.includes('.');\n}\n\nexport function parsePublishableKey(\n key: string | undefined,\n options: ParsePublishableKeyOptions & { fatal: true },\n): PublishableKey;\nexport function parsePublishableKey(\n key: string | undefined,\n options?: ParsePublishableKeyOptions,\n): PublishableKey | null;\n/**\n * Parses and validates a publishable key, extracting the frontend API and instance type.\n *\n * @param key - The publishable key to parse.\n * @param options - Configuration options for parsing.\n * @param options.fatal\n * @param options.domain\n * @param options.proxyUrl\n * @param options.isSatellite\n * @returns Parsed publishable key object with instanceType and frontendApi, or null if invalid.\n *\n * @throws {Error} When options.fatal is true and key is missing or invalid.\n */\nexport function parsePublishableKey(\n key: string | undefined,\n options: { fatal?: boolean; domain?: string; proxyUrl?: string; isSatellite?: boolean } = {},\n): PublishableKey | null {\n key = key || '';\n\n if (!key || !isPublishableKey(key)) {\n if (options.fatal && !key) {\n throw new Error(\n 'Publishable key is missing. Ensure that your publishable key is correctly configured. Double-check your environment configuration for your keys, or access them here: https://dashboard.clerk.com/last-active?path=api-keys',\n );\n }\n if (options.fatal && !isPublishableKey(key)) {\n throw new Error('Publishable key not valid.');\n }\n return null;\n }\n\n const instanceType = key.startsWith(PUBLISHABLE_KEY_LIVE_PREFIX) ? 'production' : 'development';\n\n let decodedFrontendApi: string;\n try {\n decodedFrontendApi = isomorphicAtob(key.split('_')[2]);\n } catch {\n if (options.fatal) {\n throw new Error('Publishable key not valid: Failed to decode key.');\n }\n return null;\n }\n\n if (!isValidDecodedPublishableKey(decodedFrontendApi)) {\n if (options.fatal) {\n throw new Error('Publishable key not valid: Decoded key has invalid format.');\n }\n return null;\n }\n\n let frontendApi = decodedFrontendApi.slice(0, -1);\n\n if (options.proxyUrl) {\n frontendApi = options.proxyUrl;\n } else if (instanceType !== 'development' && options.domain && options.isSatellite) {\n frontendApi = `clerk.${options.domain}`;\n }\n\n return {\n instanceType,\n frontendApi,\n };\n}\n\n/**\n * Checks if the provided key is a valid publishable key.\n *\n * @param key - The key to be checked. Defaults to an empty string if not provided.\n * @returns `true` if 'key' is a valid publishable key, `false` otherwise.\n */\nexport function isPublishableKey(key: string = '') {\n try {\n const hasValidPrefix = key.startsWith(PUBLISHABLE_KEY_LIVE_PREFIX) || key.startsWith(PUBLISHABLE_KEY_TEST_PREFIX);\n\n if (!hasValidPrefix) {\n return false;\n }\n\n const parts = key.split('_');\n if (parts.length !== 3) {\n return false;\n }\n\n const encodedPart = parts[2];\n if (!encodedPart) {\n return false;\n }\n\n const decoded = isomorphicAtob(encodedPart);\n return isValidDecodedPublishableKey(decoded);\n } catch {\n return false;\n }\n}\n\n/**\n * Creates a memoized cache for checking if URLs are development or staging environments.\n * Uses a Map to cache results for better performance on repeated checks.\n *\n * @returns An object with an isDevOrStagingUrl method that checks if a URL is dev/staging.\n */\nexport function createDevOrStagingUrlCache() {\n const devOrStagingUrlCache = new Map<string, boolean>();\n\n return {\n /**\n * Checks if a URL is a development or staging environment.\n *\n * @param url - The URL to check (string or URL object).\n * @returns `true` if the URL is a development or staging environment, `false` otherwise.\n */\n isDevOrStagingUrl: (url: string | URL): boolean => {\n if (!url) {\n return false;\n }\n\n const hostname = typeof url === 'string' ? url : url.hostname;\n let res = devOrStagingUrlCache.get(hostname);\n if (res === undefined) {\n res = DEV_OR_STAGING_SUFFIXES.some(s => hostname.endsWith(s));\n devOrStagingUrlCache.set(hostname, res);\n }\n return res;\n },\n };\n}\n\n/**\n * Checks if a publishable key is for a development environment.\n * Supports both legacy format (test_) and new format (pk_test_).\n *\n * @param apiKey - The API key to check.\n * @returns `true` if the key is for development, `false` otherwise.\n */\nexport function isDevelopmentFromPublishableKey(apiKey: string): boolean {\n return apiKey.startsWith('test_') || apiKey.startsWith('pk_test_');\n}\n\n/**\n * Checks if a publishable key is for a production environment.\n * Supports both legacy format (live_) and new format (pk_live_).\n *\n * @param apiKey - The API key to check.\n * @returns `true` if the key is for production, `false` otherwise.\n */\nexport function isProductionFromPublishableKey(apiKey: string): boolean {\n return apiKey.startsWith('live_') || apiKey.startsWith('pk_live_');\n}\n\n/**\n * Checks if a secret key is for a development environment.\n * Supports both legacy format (test_) and new format (sk_test_).\n *\n * @param apiKey - The secret key to check.\n * @returns `true` if the key is for development, `false` otherwise.\n */\nexport function isDevelopmentFromSecretKey(apiKey: string): boolean {\n return apiKey.startsWith('test_') || apiKey.startsWith('sk_test_');\n}\n\n/**\n * Checks if a secret key is for a production environment.\n * Supports both legacy format (live_) and new format (sk_live_).\n *\n * @param apiKey - The secret key to check.\n * @returns `true` if the key is for production, `false` otherwise.\n */\nexport function isProductionFromSecretKey(apiKey: string): boolean {\n return apiKey.startsWith('live_') || apiKey.startsWith('sk_live_');\n}\n\n/**\n * Generates a unique cookie suffix based on the publishable key using SHA-1 hashing.\n * The suffix is base64-encoded and URL-safe (+ and / characters are replaced).\n *\n * @param publishableKey - The publishable key to generate suffix from.\n * @param subtle - The SubtleCrypto interface to use for hashing (defaults to globalThis.crypto.subtle).\n * @returns A promise that resolves to an 8-character URL-safe base64 string.\n */\nexport async function getCookieSuffix(\n publishableKey: string,\n subtle: SubtleCrypto = globalThis.crypto.subtle,\n): Promise<string> {\n const data = new TextEncoder().encode(publishableKey);\n const digest = await subtle.digest('sha-1', data);\n const stringDigest = String.fromCharCode(...new Uint8Array(digest));\n // Base 64 Encoding with URL and Filename Safe Alphabet: https://datatracker.ietf.org/doc/html/rfc4648#section-5\n return isomorphicBtoa(stringDigest).replace(/\\+/gi, '-').replace(/\\//gi, '_').substring(0, 8);\n}\n\n/**\n * Creates a suffixed cookie name by appending the cookie suffix to the base name.\n * Used to create unique cookie names based on the publishable key.\n *\n * @param cookieName - The base cookie name.\n * @param cookieSuffix - The suffix to append (typically generated by getCookieSuffix).\n * @returns The suffixed cookie name in format: `${cookieName}_${cookieSuffix}`.\n */\nexport const getSuffixedCookieName = (cookieName: string, cookieSuffix: string): string => {\n return `${cookieName}_${cookieSuffix}`;\n};\n","export const SCOPE = {\n BACKGROUND: 'background',\n} as const;\n\nexport type Scope = (typeof SCOPE)[keyof typeof SCOPE];\n\nexport interface ClerkClientExtensionFeatures {\n background?: boolean;\n sync?: boolean;\n}\n","export const AUTH_HEADER = {\n PRODUCTION: 'Authorization',\n DEVELOPMENT: 'Clerk-Db-Jwt',\n};\n\nexport const CLIENT_JWT_KEY = '__client';\nexport const CLIENT_UAT_KEY = '__clerk_uat';\nexport const DEFAULT_LOCAL_HOST_PERMISSION = 'http://localhost';\nexport const STORAGE_KEY_CLIENT_JWT = '__clerk_client_jwt';\n","import type { ClerkAPIError as ClerkAPIErrorInterface, ClerkAPIErrorJSON } from '../types';\nimport { createErrorTypeGuard } from './createErrorTypeGuard';\n\nexport type ClerkApiErrorMeta = Record<string, unknown>;\n\n/**\n * This error contains the specific error message, code, and any additional metadata that was returned by the Clerk API.\n */\nexport class ClerkAPIError<Meta extends ClerkApiErrorMeta = any> implements ClerkAPIErrorInterface {\n static kind = 'ClerkApiError';\n readonly code: string;\n readonly message: string;\n readonly longMessage: string | undefined;\n readonly meta: Meta;\n\n constructor(json: ClerkAPIErrorJSON) {\n const parsedError = {\n code: json.code,\n message: json.message,\n longMessage: json.long_message,\n meta: {\n paramName: json.meta?.param_name,\n sessionId: json.meta?.session_id,\n emailAddresses: json.meta?.email_addresses,\n identifiers: json.meta?.identifiers,\n zxcvbn: json.meta?.zxcvbn,\n plan: json.meta?.plan,\n isPlanUpgradePossible: json.meta?.is_plan_upgrade_possible,\n } as unknown as Meta,\n };\n this.code = parsedError.code;\n this.message = parsedError.message;\n this.longMessage = parsedError.longMessage;\n this.meta = parsedError.meta;\n }\n}\n\n/**\n * Type guard to check if a value is a ClerkApiError instance.\n */\nexport const isClerkApiError = createErrorTypeGuard(ClerkAPIError);\n","import { createErrorTypeGuard } from './createErrorTypeGuard';\n\nexport interface ClerkErrorParams {\n /**\n * A message that describes the error. This is typically intented to be showed to the developers.\n * It should not be shown to the user or parsed directly as the message contents are not guaranteed\n * to be stable - use the `code` property instead.\n */\n message: string;\n /**\n * A machine-stable code that identifies the error.\n */\n code: string;\n /**\n * A user-friendly message that describes the error and can be displayed to the user.\n * This message defaults to English but can be usually translated to the user's language\n * by matching the `code` property to a localized message.\n */\n longMessage?: string;\n /**\n * The cause of the error, typically an `Error` instance that was caught and wrapped by the Clerk error handler.\n */\n cause?: Error;\n /**\n * A URL to the documentation for the error.\n */\n docsUrl?: string;\n}\n\n/**\n * A temporary placeholder, this will eventually be replaced with a\n * build-time flag that will actually perform DCE.\n */\nconst __DEV__ = true;\n\nexport class ClerkError extends Error {\n static kind = 'ClerkError';\n readonly clerkError = true as const;\n readonly code: string;\n readonly longMessage: string | undefined;\n readonly docsUrl: string | undefined;\n readonly cause: Error | undefined;\n\n get name() {\n return this.constructor.name;\n }\n\n constructor(opts: ClerkErrorParams) {\n super(new.target.formatMessage(new.target.kind, opts.message, opts.code, opts.docsUrl), { cause: opts.cause });\n Object.setPrototypeOf(this, ClerkError.prototype);\n this.code = opts.code;\n this.docsUrl = opts.docsUrl;\n this.longMessage = opts.longMessage;\n this.cause = opts.cause;\n }\n\n public toString() {\n return `[${this.name}]\\nMessage:${this.message}`;\n }\n\n protected static formatMessage(name: string, msg: string, code: string, docsUrl: string | undefined) {\n // Keeping the Clerk prefix for backward compatibility\n // msg = `${name}: ${msg.trim()}\\n\\n(code=\"${code}\")\\n\\n`;\n // We can remove the Clerk prefix in the next major version\n const prefix = 'Clerk:';\n const regex = new RegExp(prefix.replace(' ', '\\\\s*'), 'i');\n msg = msg.replace(regex, '');\n msg = `${prefix} ${msg.trim()}\\n\\n(code=\"${code}\")\\n\\n`;\n if (__DEV__ && docsUrl) {\n msg += `\\n\\nDocs: ${docsUrl}`;\n }\n return msg;\n }\n}\n\n/**\n * Type guard to check if a value is a ClerkError instance.\n */\nexport function isClerkError(val: unknown): val is ClerkError {\n const typeguard = createErrorTypeGuard(ClerkError);\n // Ths is the base error so we're being more defensive about the type guard\n return typeguard(val) || (!!val && typeof val === 'object' && 'clerkError' in val && val.clerkError === true);\n}\n","import type { ClerkAPIErrorJSON, ClerkAPIResponseError as ClerkAPIResponseErrorInterface } from '../types';\nimport { ClerkAPIError } from './clerkApiError';\nimport type { ClerkErrorParams } from './clerkError';\nimport { ClerkError } from './clerkError';\nimport { createErrorTypeGuard } from './createErrorTypeGuard';\n\ninterface ClerkAPIResponseOptions extends Omit<ClerkErrorParams, 'message' | 'code'> {\n data: ClerkAPIErrorJSON[];\n status: number;\n clerkTraceId?: string;\n retryAfter?: number;\n}\n\nexport class ClerkAPIResponseError extends ClerkError implements ClerkAPIResponseErrorInterface {\n static kind = 'ClerkAPIResponseError';\n status: number;\n clerkTraceId?: string;\n retryAfter?: number;\n errors: ClerkAPIError[];\n\n constructor(message: string, options: ClerkAPIResponseOptions) {\n const { data: errorsJson, status, clerkTraceId, retryAfter } = options;\n super({ ...options, message, code: 'api_response_error' });\n Object.setPrototypeOf(this, ClerkAPIResponseError.prototype);\n this.status = status;\n this.clerkTraceId = clerkTraceId;\n this.retryAfter = retryAfter;\n this.errors = (errorsJson || []).map(e => new ClerkAPIError(e));\n }\n\n public toString() {\n let message = `[${this.name}]\\nMessage:${this.message}\\nStatus:${this.status}\\nSerialized errors: ${this.errors.map(\n e => JSON.stringify(e),\n )}`;\n\n if (this.clerkTraceId) {\n message += `\\nClerk Trace ID: ${this.clerkTraceId}`;\n }\n\n return message;\n }\n\n // Override formatMessage to keep it unformatted for backward compatibility\n protected static override formatMessage(name: string, msg: string, _: string, __: string | undefined) {\n return msg;\n }\n}\n\n/**\n * Type guard to check if an error is a ClerkApiResponseError.\n * Can be called as a standalone function or as a method on an error object.\n *\n * @example\n * // As a standalone function\n * if (isClerkApiResponseError(error)) { ... }\n *\n * // As a method (when attached to error object)\n * if (error.isClerkApiResponseError()) { ... }\n */\nexport const isClerkApiResponseError = createErrorTypeGuard(ClerkAPIResponseError);\n","const DefaultMessages = Object.freeze({\n InvalidProxyUrlErrorMessage: `The proxyUrl passed to Clerk is invalid. The expected value for proxyUrl is an absolute URL or a relative path with a leading '/'. (key={{url}})`,\n InvalidPublishableKeyErrorMessage: `The publishableKey passed to Clerk is invalid. You can get your Publishable key at https://dashboard.clerk.com/last-active?path=api-keys. (key={{key}})`,\n MissingPublishableKeyErrorMessage: `Missing publishableKey. You can get your key at https://dashboard.clerk.com/last-active?path=api-keys.`,\n MissingSecretKeyErrorMessage: `Missing secretKey. You can get your key at https://dashboard.clerk.com/last-active?path=api-keys.`,\n MissingClerkProvider: `{{source}} can only be used within the <ClerkProvider /> component. Learn more: https://clerk.com/docs/components/clerk-provider`,\n});\n\ntype MessageKeys = keyof typeof DefaultMessages;\n\ntype Messages = Record<MessageKeys, string>;\n\ntype CustomMessages = Partial<Messages>;\n\nexport type ErrorThrowerOptions = {\n packageName: string;\n customMessages?: CustomMessages;\n};\n\nexport interface ErrorThrower {\n setPackageName(options: ErrorThrowerOptions): ErrorThrower;\n\n setMessages(options: ErrorThrowerOptions): ErrorThrower;\n\n throwInvalidPublishableKeyError(params: { key?: string }): never;\n\n throwInvalidProxyUrl(params: { url?: string }): never;\n\n throwMissingPublishableKeyError(): never;\n\n throwMissingSecretKeyError(): never;\n\n throwMissingClerkProviderError(params: { source?: string }): never;\n\n throw(message: string): never;\n}\n\n/**\n * Builds an error thrower.\n *\n * @internal\n */\nexport function buildErrorThrower({ packageName, customMessages }: ErrorThrowerOptions): ErrorThrower {\n let pkg = packageName;\n\n /**\n * Builds a message from a raw message and replacements.\n *\n * @internal\n */\n function buildMessage(rawMessage: string, replacements?: Record<string, string | number>) {\n if (!replacements) {\n return `${pkg}: ${rawMessage}`;\n }\n\n let msg = rawMessage;\n const matches = rawMessage.matchAll(/{{([a-zA-Z0-9-_]+)}}/g);\n\n for (const match of matches) {\n const replacement = (replacements[match[1]] || '').toString();\n msg = msg.replace(`{{${match[1]}}}`, replacement);\n }\n\n return `${pkg}: ${msg}`;\n }\n\n const messages = {\n ...DefaultMessages,\n ...customMessages,\n };\n\n return {\n setPackageName({ packageName }: ErrorThrowerOptions): ErrorThrower {\n if (typeof packageName === 'string') {\n pkg = packageName;\n }\n return this;\n },\n\n setMessages({ customMessages }: ErrorThrowerOptions): ErrorThrower {\n Object.assign(messages, customMessages || {});\n return this;\n },\n\n throwInvalidPublishableKeyError(params: { key?: string }): never {\n throw new Error(buildMessage(messages.InvalidPublishableKeyErrorMessage, params));\n },\n\n throwInvalidProxyUrl(params: { url?: string }): never {\n throw new Error(buildMessage(messages.InvalidProxyUrlErrorMessage, params));\n },\n\n throwMissingPublishableKeyError(): never {\n throw new Error(buildMessage(messages.MissingPublishableKeyErrorMessage));\n },\n\n throwMissingSecretKeyError(): never {\n throw new Error(buildMessage(messages.MissingSecretKeyErrorMessage));\n },\n\n throwMissingClerkProviderError(params: { source?: string }): never {\n throw new Error(buildMessage(messages.MissingClerkProvider, params));\n },\n\n throw(message: string): never {\n throw new Error(buildMessage(message));\n },\n };\n}\n","import type { ClerkErrorParams } from './clerkError';\nimport { ClerkError } from './clerkError';\nimport { createErrorTypeGuard } from './createErrorTypeGuard';\n\ntype ClerkRuntimeErrorOptions = Omit<ClerkErrorParams, 'message'>;\n\n/**\n * Custom error class for representing Clerk runtime errors.\n *\n * @class ClerkRuntimeError\n *\n * @example\n * throw new ClerkRuntimeError('An error occurred', { code: 'password_invalid' });\n */\nexport class ClerkRuntimeError extends ClerkError {\n static kind = 'ClerkRuntimeError';\n /**\n * @deprecated Use `clerkError` property instead. This property is maintained for backward compatibility.\n */\n readonly clerkRuntimeError = true as const;\n\n constructor(message: string, options: ClerkRuntimeErrorOptions) {\n super({ ...options, message });\n Object.setPrototypeOf(this, ClerkRuntimeError.prototype);\n }\n}\n\n/**\n * Type guard to check if an error is a ClerkRuntimeError.\n * Can be called as a standalone function or as a method on an error object.\n *\n * @example\n * // As a standalone function\n * if (isClerkRuntimeError(error)) { ... }\n *\n * // As a method (when attached to error object)\n * if (error.isClerkRuntimeError()) { ... }\n */\nexport const isClerkRuntimeError = createErrorTypeGuard(ClerkRuntimeError);\n","import { buildErrorThrower } from '@clerk/shared/error';\n\nexport type HostPermissionHintOpts = {\n hostHint: string;\n};\n\nexport const errorLogger = (err: Error) => console.error(err, err.stack);\nexport const errorThrower = buildErrorThrower({ packageName: '@clerk/chrome-extension' });\n\nexport const missingManifestKeyError = (key: string) => `Missing \\`${key}\\` entry in manifest.json`;\n\nexport function assertPublishableKey(publishableKey: unknown): asserts publishableKey {\n if (!publishableKey) {\n errorThrower.throwMissingPublishableKeyError();\n }\n}\n","import browser from 'webextension-polyfill';\n\nexport type FormattedUrl = `http${string}`;\n\nexport type GetClientCookieParams = {\n name: string;\n url: string;\n callback: (changeInfo: ChangeInfo) => Promise<void>;\n onListenerCallback?: () => void;\n};\n\nexport type ChangeInfo = {\n cookie: browser.Cookies.Cookie;\n cause: browser.Cookies.OnChangedCause;\n removed: boolean;\n};\n\nfunction ensureFormattedUrl(url: string): FormattedUrl {\n return url.startsWith('http') ? (url as FormattedUrl) : `https://${url}`;\n}\n\nexport async function getClientCookie({ url, name }: GetClientCookieParams) {\n return await browser.cookies.get({ name, url: ensureFormattedUrl(url) });\n}\n\nexport function createClientCookieListener({ url, name, callback }: GetClientCookieParams) {\n const domain = new URL(url).hostname;\n const cookieDomain = domain.startsWith('www.') ? domain.slice(4) : domain;\n\n const listener = (changeInfo: ChangeInfo) => {\n if (changeInfo.cookie.domain === cookieDomain && changeInfo.cookie.name === name) {\n void callback(changeInfo);\n }\n };\n\n return {\n add: () => browser.cookies.onChanged.addListener(listener),\n has: () => browser.cookies.onChanged.hasListener(listener),\n remove: () => browser.cookies.onChanged.removeListener(listener),\n };\n}\n","import { CLIENT_UAT_KEY, STORAGE_KEY_CLIENT_JWT } from '../constants';\nimport type { ChangeInfo, GetClientCookieParams } from './cookies';\nimport { createClientCookieListener, getClientCookie } from './cookies';\nimport { errorLogger } from './errors';\nimport type { StorageCache } from './storage';\n\nexport type JWTHandlerParams = { frontendApi: string } & (\n | {\n sync?: false;\n }\n | ({ sync: true } & GetClientCookieParams)\n);\n\nexport type JWTHandler = ReturnType<typeof JWTHandler>;\n\nfunction shouldSync(sync: boolean | undefined, _params: unknown): _params is GetClientCookieParams {\n return Boolean(sync);\n}\n\nexport function JWTHandler(store: StorageCache, params: JWTHandlerParams) {\n const { sync, frontendApi, ...cookieParams } = params;\n\n const CACHE_KEY = store.createKey(frontendApi, STORAGE_KEY_CLIENT_JWT, 'v2');\n\n /**\n * Sets the JWT value to the active\n * @param value: JWT generally from the cookie or authorization header\n */\n const set = async (value: string): Promise<void> => {\n return await store.set(CACHE_KEY, value).catch(errorLogger);\n };\n\n /**\n * Remove the JWT value\n */\n const remove = async (): Promise<void> => {\n return await store.remove(CACHE_KEY).catch(errorLogger);\n };\n\n /**\n * Gets the JWT value to the active store.\n * If not set, attempt to get it from the synced session and save for later use.\n */\n const get = async () => {\n if (shouldSync(sync, cookieParams)) {\n // Get client cookie from browser\n const syncedJWT = await getClientCookie(cookieParams).catch(errorLogger);\n\n if (syncedJWT) {\n // Set client cookie in StorageCache\n await set(syncedJWT.value);\n return syncedJWT.value;\n }\n }\n\n // Get current JWT from StorageCache\n return await store.get<string>(CACHE_KEY);\n };\n\n const listener = () => {\n if (!shouldSync(sync, cookieParams)) {\n return;\n }\n\n const { onListenerCallback, ...restCookieParams } = cookieParams;\n\n return createClientCookieListener({\n ...restCookieParams,\n callback: async (changeInfo: ChangeInfo) => {\n const existingJWT = await get();\n\n if (existingJWT === changeInfo.cookie.value) {\n const syncedUAT = await getClientCookie({ ...restCookieParams, name: CLIENT_UAT_KEY }).catch(errorLogger);\n\n if (!syncedUAT || syncedUAT?.value === '0') {\n onListenerCallback?.();\n }\n\n return;\n }\n\n await set(changeInfo.cookie.value);\n onListenerCallback?.();\n },\n });\n };\n\n return { get, listener, set, remove };\n}\n","import type { SetRequired } from 'type-fest';\nimport type { Manifest } from 'webextension-polyfill';\n\nimport type { ClerkClientExtensionFeatures } from '../../types';\nimport { errorThrower, missingManifestKeyError } from './errors';\n\nexport type ValidatedManifest = SetRequired<Manifest.WebExtensionManifest, 'permissions' | 'host_permissions'>;\nexport type ManifestKeys = keyof Manifest.WebExtensionManifest;\n\nfunction validateRootManifestKey(manifest: Manifest.WebExtensionManifest, key: ManifestKeys): void {\n if (!manifest[key]) {\n errorThrower.throw(missingManifestKeyError(key));\n }\n}\n\nfunction validateManifestPermission(manifest: Manifest.WebExtensionManifest, key: Manifest.Permission): void {\n if (!manifest.permissions?.includes(key)) {\n errorThrower.throw(missingManifestKeyError(`permissions.${key}`));\n }\n}\n\nfunction hasAdditionalFeatures(features: ClerkClientExtensionFeatures): boolean {\n return Boolean(features) && Object.keys(features).length > 0;\n}\n\nexport function validateManifest(\n manifest: Manifest.WebExtensionManifest,\n features: ClerkClientExtensionFeatures,\n): asserts manifest is ValidatedManifest {\n validateRootManifestKey(manifest, 'permissions');\n validateManifestPermission(manifest, 'storage');\n\n // If no additional features are provided, we can return success early\n if (!hasAdditionalFeatures(features)) {\n return;\n }\n\n if (features.background) {\n validateRootManifestKey(manifest, 'background');\n }\n\n if (features.sync) {\n validateManifestPermission(manifest, 'cookies');\n validateRootManifestKey(manifest, 'host_permissions');\n }\n}\n","import type { Clerk } from '@clerk/clerk-js';\n\nimport { AUTH_HEADER } from '../constants';\nimport type { JWTHandler } from './jwt-handler';\n\ntype Handler = Parameters<Clerk['__internal_onBeforeRequest']>[0];\ntype Req = Parameters<Handler>[0];\n\n/** Append the JWT to the FAPI request */\nexport function requestHandler(jwtHandler: JWTHandler, { isProd }: { isProd: boolean }) {\n const handler: Handler = async requestInit => {\n requestInit.credentials = 'omit';\n\n const currentJWT = await jwtHandler.get();\n\n if (!currentJWT) {\n return;\n }\n\n if (isProd) {\n prodHandler(requestInit, currentJWT);\n } else {\n devHandler(requestInit, currentJWT);\n }\n };\n\n return handler;\n}\n\n/** Append the JWT to the FAPI request, per development instances */\nfunction devHandler(requestInit: Req, jwt: string) {\n requestInit.url?.searchParams.append('__clerk_db_jwt', jwt);\n}\n\n/** Append the JWT to the FAPI request, per production instances */\nfunction prodHandler(requestInit: Req, jwt: string) {\n requestInit.url?.searchParams.append('_is_native', '1');\n (requestInit.headers as Headers).set(AUTH_HEADER.PRODUCTION, `Bearer ${jwt}`);\n}\n","import type { Clerk } from '@clerk/clerk-js';\n\nimport { AUTH_HEADER } from '../constants';\nimport type { JWTHandler } from './jwt-handler';\n\ntype Handler = Parameters<Clerk['__internal_onAfterResponse']>[0];\ntype Res = Parameters<Handler>[1];\n\n/** Retrieve the JWT to the FAPI response */\nexport function responseHandler(jwtHandler: JWTHandler, { isProd }: { isProd: boolean }) {\n const handler: Handler = async (_, response) => {\n if (isProd) {\n await prodHandler(response, jwtHandler);\n } else {\n await devHandler(response, jwtHandler);\n }\n };\n return handler;\n}\n\n/** Retrieve the JWT to the FAPI response, per development instances */\nasync function devHandler(response: Res, jwtHandler: JWTHandler) {\n const header = response?.headers.get(AUTH_HEADER.DEVELOPMENT);\n\n if (header) {\n await jwtHandler.set(header);\n } else {\n await jwtHandler.remove();\n }\n}\n\n/** Retrieve the JWT to the FAPI response, per production instances */\nasync function prodHandler(response: Res, jwtHandler: JWTHandler) {\n const header = response?.headers.get(AUTH_HEADER.PRODUCTION);\n\n if (header?.startsWith('Bearer')) {\n const jwt = header.split(' ')[1] || undefined;\n\n if (jwt) {\n await jwtHandler.set(jwt);\n } else {\n await jwtHandler.remove();\n }\n } else if (header) {\n await jwtHandler.set(header);\n }\n}\n","import browser from 'webextension-polyfill';\n\ntype StorageCacheOptions = {\n storageArea?: 'local' | 'sync';\n};\n\nexport type StorageCache = {\n createKey: (...keys: string[]) => string;\n get: <T = any>(key: string) => Promise<T | undefined>;\n remove: (key: string) => Promise<void>;\n set: (key: string, value: string) => Promise<void>;\n};\n\nconst createKey: StorageCache['createKey'] = (...keys: string[]) => keys.filter(Boolean).join('|');\n\n// Use browser.storage (local or sync) to persist Clerk client JWT.\n// More information at https://developer.chrome.com/docs/extensions/reference/storage\nconst createBrowserStorageCache = (opts: StorageCacheOptions = {}): StorageCache => {\n const __storageArea = opts.storageArea || 'local';\n\n return {\n createKey,\n get: <T>(key: string) => browser.storage[__storageArea].get(key).then(result => (result[key] as T) || undefined),\n remove: (key: string) => browser.storage[__storageArea].remove(key),\n set: (key: string, value: string) => browser.storage[__storageArea].set({ [key]: value }),\n };\n};\n\nconst createMemoryStorageCache = (): StorageCache => {\n const cache: Map<string, any> = new Map();\n\n return {\n createKey,\n get: (key: string) => Promise.resolve(cache.get(key)),\n remove: (key: string) => {\n cache.delete(key);\n return Promise.resolve();\n },\n set: (key: string, value: string) => {\n cache.set(key, value);\n return Promise.resolve();\n },\n };\n};\n\nexport const BrowserStorageCache = createBrowserStorageCache();\nexport const MemoryStorageCache = createMemoryStorageCache();\n","import { Clerk } from '@clerk/clerk-js/no-rhc';\nimport { DEV_BROWSER_JWT_KEY } from '@clerk/shared/devBrowser';\nimport { parsePublishableKey } from '@clerk/shared/keys';\nimport browser from 'webextension-polyfill';\n\nimport { SCOPE, type Scope } from '../types';\nimport { CLIENT_JWT_KEY, DEFAULT_LOCAL_HOST_PERMISSION } from './constants';\nimport { assertPublishableKey } from './utils/errors';\nimport type { JWTHandlerParams } from './utils/jwt-handler';\nimport { JWTHandler } from './utils/jwt-handler';\nimport { validateManifest } from './utils/manifest';\nimport { requestHandler } from './utils/request-handler';\nimport { responseHandler } from './utils/response-handler';\nimport { BrowserStorageCache, type StorageCache } from './utils/storage';\n\nexport let clerk: Clerk;\n\nClerk.sdkMetadata = {\n name: PACKAGE_NAME,\n version: PACKAGE_VERSION,\n};\n\nexport type CreateClerkClientOptions = {\n __experimental_syncHostListener?: boolean;\n publishableKey: string;\n scope?: Scope;\n storageCache?: StorageCache;\n syncHost?: string;\n};\n\nexport function createClerkClient({\n __experimental_syncHostListener = false,\n publishableKey,\n scope,\n storageCache = BrowserStorageCache,\n syncHost,\n}: CreateClerkClientOptions) {\n if (scope === SCOPE.BACKGROUND) {\n // TODO @nikos\n // @ts-expect-error will be replaced by clerk ui\n Clerk.mountComponentRenderer = undefined;\n }\n\n // Don't cache background scripts as it can result in out-of-sync client information.\n if (clerk && scope !== SCOPE.BACKGROUND) {\n return clerk;\n }\n\n // Sync is enabled if a `syncHost` is provided\n const sync = Boolean(syncHost);\n\n // Parse publishableKey and assert it's present/valid, throw if not\n const key = parsePublishableKey(publishableKey);\n assertPublishableKey(key);\n\n const isProd = key.instanceType === 'production';\n const manifest = browser.runtime.getManifest();\n\n // Will throw if manifest is invalid\n validateManifest(manifest, {\n background: scope === SCOPE.BACKGROUND,\n sync,\n });\n\n // Set up JWT handler and attempt to get JWT from storage on initialization\n const url = syncHost ? syncHost : DEFAULT_LOCAL_HOST_PERMISSION;\n\n // Create Clerk instance\n clerk = new Clerk(publishableKey, {});\n\n // @ts-expect-error - TODO: sync is evaluating to true vs boolean\n const jwtOptions: JWTHandlerParams = {\n frontendApi: key.frontendApi,\n name: isProd ? CLIENT_JWT_KEY : DEV_BROWSER_JWT_KEY,\n url,\n sync: sync,\n };\n\n if (jwtOptions.sync && __experimental_syncHostListener) {\n jwtOptions.onListenerCallback = () => {\n if (clerk.user) {\n clerk.user.reload();\n } else {\n window.location.reload();\n }\n };\n }\n\n const jwt = JWTHandler(storageCache, jwtOptions);\n\n // Add listener to sync host cookies if enabled\n if (jwtOptions.sync && __experimental_syncHostListener) {\n const listener = jwt.listener();\n listener?.add();\n }\n\n clerk.__internal_onAfterResponse(responseHandler(jwt, { isProd }));\n clerk.__internal_onBeforeRequest(requestHandler(jwt, { isProd }));\n\n return clerk;\n}\n","import type { Clerk } from '@clerk/clerk-js/no-rhc';\n\nimport {\n createClerkClient as _createClerkClient,\n type CreateClerkClientOptions as _CreateClerkClientOptions,\n} from '../internal';\nimport { SCOPE } from '../types';\n\nexport type CreateClerkClientOptions = Omit<_CreateClerkClientOptions, 'scope'>;\n\nexport async function createClerkClient(opts: CreateClerkClientOptions): Promise<Clerk> {\n const clerk = await _createClerkClient({ ...opts, scope: SCOPE.BACKGROUND });\n await clerk.load({ standardBrowser: false });\n return clerk;\n}\n"]}
package/dist/cjs/index.js CHANGED
@@ -464,7 +464,7 @@ function getCurrentOrganizationMembership(organizationMemberships, organizationI
464
464
  var noop = (..._args) => {
465
465
  };
466
466
 
467
- // ../shared/dist/runtime/telemetry-B4xKE_qs.mjs
467
+ // ../shared/dist/runtime/telemetry-DnVD78JJ.mjs
468
468
  var EVENT_METHOD_CALLED = "METHOD_CALLED";
469
469
  var EVENT_SAMPLING_RATE$2 = 0.1;
470
470
  function eventMethodCalled(method, payload) {
@@ -3529,7 +3529,7 @@ var SignIn = withClerk(
3529
3529
  component,
3530
3530
  mount: clerk2.mountSignIn,
3531
3531
  unmount: clerk2.unmountSignIn,
3532
- updateProps: clerk2.__unstable__updateProps,
3532
+ updateProps: clerk2.__internal_updateProps,
3533
3533
  props,
3534
3534
  rootProps: rendererRootProps
3535
3535
  }
@@ -3550,7 +3550,7 @@ var SignUp = withClerk(
3550
3550
  component,
3551
3551
  mount: clerk2.mountSignUp,
3552
3552
  unmount: clerk2.unmountSignUp,
3553
- updateProps: clerk2.__unstable__updateProps,
3553
+ updateProps: clerk2.__internal_updateProps,
3554
3554
  props,
3555
3555
  rootProps: rendererRootProps
3556
3556
  }
@@ -3585,7 +3585,7 @@ var _UserProfile = withClerk(
3585
3585
  component,
3586
3586
  mount: clerk2.mountUserProfile,
3587
3587
  unmount: clerk2.unmountUserProfile,
3588
- updateProps: clerk2.__unstable__updateProps,
3588
+ updateProps: clerk2.__internal_updateProps,
3589
3589
  props: { ...props, customPages },
3590
3590
  rootProps: rendererRootProps
3591
3591
  },
@@ -3629,7 +3629,7 @@ var _UserButton = withClerk(
3629
3629
  const passableProps = {
3630
3630
  mount: clerk2.mountUserButton,
3631
3631
  unmount: clerk2.unmountUserButton,
3632
- updateProps: clerk2.__unstable__updateProps,
3632
+ updateProps: clerk2.__internal_updateProps,
3633
3633
  props: { ...props, userProfileProps, customMenuItems }
3634
3634
  };
3635
3635
  const portalProps = {
@@ -3708,7 +3708,7 @@ var _OrganizationProfile = withClerk(
3708
3708
  component,
3709
3709
  mount: clerk2.mountOrganizationProfile,
3710
3710
  unmount: clerk2.unmountOrganizationProfile,
3711
- updateProps: clerk2.__unstable__updateProps,
3711
+ updateProps: clerk2.__internal_updateProps,
3712
3712
  props: { ...props, customPages },
3713
3713
  rootProps: rendererRootProps
3714
3714
  },
@@ -3734,7 +3734,7 @@ var CreateOrganization = withClerk(
3734
3734
  component,
3735
3735
  mount: clerk2.mountCreateOrganization,
3736
3736
  unmount: clerk2.unmountCreateOrganization,
3737
- updateProps: clerk2.__unstable__updateProps,
3737
+ updateProps: clerk2.__internal_updateProps,
3738
3738
  props,
3739
3739
  rootProps: rendererRootProps
3740
3740
  }
@@ -3770,7 +3770,7 @@ var _OrganizationSwitcher = withClerk(
3770
3770
  const passableProps = {
3771
3771
  mount: clerk2.mountOrganizationSwitcher,
3772
3772
  unmount: clerk2.unmountOrganizationSwitcher,
3773
- updateProps: clerk2.__unstable__updateProps,
3773
+ updateProps: clerk2.__internal_updateProps,
3774
3774
  props: { ...props, organizationProfileProps },
3775
3775
  rootProps: rendererRootProps,
3776
3776
  component
@@ -3817,7 +3817,7 @@ var OrganizationList = withClerk(
3817
3817
  component,
3818
3818
  mount: clerk2.mountOrganizationList,
3819
3819
  unmount: clerk2.unmountOrganizationList,
3820
- updateProps: clerk2.__unstable__updateProps,
3820
+ updateProps: clerk2.__internal_updateProps,
3821
3821
  props,
3822
3822
  rootProps: rendererRootProps
3823
3823
  }
@@ -3838,7 +3838,7 @@ withClerk(
3838
3838
  component,
3839
3839
  open: clerk2.openGoogleOneTap,
3840
3840
  close: clerk2.closeGoogleOneTap,
3841
- updateProps: clerk2.__unstable__updateProps,
3841
+ updateProps: clerk2.__internal_updateProps,
3842
3842
  props,
3843
3843
  rootProps: rendererRootProps
3844
3844
  }
@@ -3859,7 +3859,7 @@ var Waitlist = withClerk(
3859
3859
  component,
3860
3860
  mount: clerk2.mountWaitlist,
3861
3861
  unmount: clerk2.unmountWaitlist,
3862
- updateProps: clerk2.__unstable__updateProps,
3862
+ updateProps: clerk2.__internal_updateProps,
3863
3863
  props,
3864
3864
  rootProps: rendererRootProps
3865
3865
  }
@@ -3883,7 +3883,7 @@ var PricingTable = withClerk(
3883
3883
  component,
3884
3884
  mount: clerk2.mountPricingTable,
3885
3885
  unmount: clerk2.unmountPricingTable,
3886
- updateProps: clerk2.__unstable__updateProps,
3886
+ updateProps: clerk2.__internal_updateProps,
3887
3887
  props,
3888
3888
  rootProps: rendererRootProps
3889
3889
  }
@@ -3904,7 +3904,7 @@ var APIKeys = withClerk(
3904
3904
  component,
3905
3905
  mount: clerk2.mountAPIKeys,
3906
3906
  unmount: clerk2.unmountAPIKeys,
3907
- updateProps: clerk2.__unstable__updateProps,
3907
+ updateProps: clerk2.__internal_updateProps,
3908
3908
  props,
3909
3909
  rootProps: rendererRootProps
3910
3910
  }
@@ -3925,7 +3925,7 @@ var UserAvatar = withClerk(
3925
3925
  component,
3926
3926
  mount: clerk2.mountUserAvatar,
3927
3927
  unmount: clerk2.unmountUserAvatar,
3928
- updateProps: clerk2.__unstable__updateProps,
3928
+ updateProps: clerk2.__internal_updateProps,
3929
3929
  props,
3930
3930
  rootProps: rendererRootProps
3931
3931
  }
@@ -3946,7 +3946,7 @@ withClerk(
3946
3946
  component,
3947
3947
  mount: clerk2.mountTaskChooseOrganization,
3948
3948
  unmount: clerk2.unmountTaskChooseOrganization,
3949
- updateProps: clerk2.__unstable__updateProps,
3949
+ updateProps: clerk2.__internal_updateProps,
3950
3950
  props,
3951
3951
  rootProps: rendererRootProps
3952
3952
  }
@@ -4077,12 +4077,12 @@ function addClerkPrefix(str) {
4077
4077
  return `clerk.${str.replace(regex, "")}`;
4078
4078
  }
4079
4079
 
4080
- // ../shared/dist/runtime/versionSelector-yQqWqz9J.mjs
4081
- var versionSelector = (clerkJSVersion, packageVersion = "6.0.0-snapshot.v20251203203405") => {
4080
+ // ../shared/dist/runtime/versionSelector-DAHukW82.mjs
4081
+ var versionSelector = (clerkJSVersion, packageVersion = "6.0.0-snapshot.v20251204143242") => {
4082
4082
  if (clerkJSVersion) return clerkJSVersion;
4083
4083
  const prereleaseTag = getPrereleaseTag(packageVersion);
4084
4084
  if (prereleaseTag) {
4085
- if (prereleaseTag === "snapshot") return "6.0.0-snapshot.v20251203203405";
4085
+ if (prereleaseTag === "snapshot") return "6.0.0-snapshot.v20251204143242";
4086
4086
  return prereleaseTag;
4087
4087
  }
4088
4088
  return getMajorVersion(packageVersion);
@@ -4100,7 +4100,7 @@ function isClerkGlobalProperlyLoaded(prop) {
4100
4100
  if (typeof window === "undefined" || !window[prop]) return false;
4101
4101
  return !!window[prop];
4102
4102
  }
4103
- var isClerkUiProperlyLoaded = () => isClerkGlobalProperlyLoaded("__unstable_ClerkUiCtor");
4103
+ var isClerkUiProperlyLoaded = () => isClerkGlobalProperlyLoaded("__internal_ClerkUiCtor");
4104
4104
  var loadClerkUiScript = async (opts) => {
4105
4105
  var _a5;
4106
4106
  const timeout = (_a5 = opts == null ? void 0 : opts.scriptLoadTimeout) != null ? _a5 : 15e3;
@@ -4774,7 +4774,7 @@ if (typeof globalThis.__BUILD_DISABLE_RHC__ === "undefined") {
4774
4774
  }
4775
4775
  var SDK_METADATA = {
4776
4776
  name: "@clerk/react",
4777
- version: "6.0.0-snapshot.v20251203203405",
4777
+ version: "6.0.0-snapshot.v20251204143242",
4778
4778
  environment: process.env.NODE_ENV
4779
4779
  };
4780
4780
  var _status;
@@ -5104,10 +5104,10 @@ var _IsomorphicClerk = class _IsomorphicClerk2 {
5104
5104
  this.__experimental_checkout = (...args) => {
5105
5105
  return this.loaded && this.clerkjs ? this.clerkjs.__experimental_checkout(...args) : __privateGet2(this, _stateProxy).checkoutSignal(...args);
5106
5106
  };
5107
- this.__unstable__updateProps = async (props) => {
5107
+ this.__internal_updateProps = async (props) => {
5108
5108
  const clerkjs = await __privateMethod2(this, _IsomorphicClerk_instances, waitForClerkJS_fn).call(this);
5109
- if (clerkjs && "__unstable__updateProps" in clerkjs) {
5110
- return clerkjs.__unstable__updateProps(props);
5109
+ if (clerkjs && "__internal_updateProps" in clerkjs) {
5110
+ return clerkjs.__internal_updateProps(props);
5111
5111
  }
5112
5112
  };
5113
5113
  this.setActive = (params) => {
@@ -5955,10 +5955,10 @@ var _IsomorphicClerk = class _IsomorphicClerk2 {
5955
5955
  domain: this.domain,
5956
5956
  nonce: this.options.nonce
5957
5957
  });
5958
- if (!global.__unstable_ClerkUiCtor) {
5958
+ if (!global.__internal_ClerkUiCtor) {
5959
5959
  throw new Error("Failed to download latest Clerk UI. Contact support@clerk.com.");
5960
5960
  }
5961
- return global.__unstable_ClerkUiCtor;
5961
+ return global.__internal_ClerkUiCtor;
5962
5962
  }
5963
5963
  get version() {
5964
5964
  var _a5;
@@ -5999,9 +5999,9 @@ var _IsomorphicClerk = class _IsomorphicClerk2 {
5999
5999
  return void 0;
6000
6000
  }
6001
6001
  }
6002
- get __unstable__environment() {
6002
+ get __internal_environment() {
6003
6003
  if (this.clerkjs) {
6004
- return this.clerkjs.__unstable__environment;
6004
+ return this.clerkjs.__internal_environment;
6005
6005
  } else {
6006
6006
  return void 0;
6007
6007
  }
@@ -6024,9 +6024,9 @@ var _IsomorphicClerk = class _IsomorphicClerk2 {
6024
6024
  var _a5;
6025
6025
  return (_a5 = this.clerkjs) == null ? void 0 : _a5.apiKeys;
6026
6026
  }
6027
- __unstable__setEnvironment(...args) {
6028
- if (this.clerkjs && "__unstable__setEnvironment" in this.clerkjs) {
6029
- this.clerkjs.__unstable__setEnvironment(args);
6027
+ __internal_setEnvironment(...args) {
6028
+ if (this.clerkjs && "__internal_setEnvironment" in this.clerkjs) {
6029
+ this.clerkjs.__internal_setEnvironment(args);
6030
6030
  } else {
6031
6031
  return void 0;
6032
6032
  }
@@ -6121,10 +6121,10 @@ var useLoadedIsomorphicClerk = (options) => {
6121
6121
  const isomorphicClerkRef = React7__default.default.useRef(IsomorphicClerk.getOrCreateInstance(options));
6122
6122
  const [clerkStatus, setClerkStatus] = React7__default.default.useState(isomorphicClerkRef.current.status);
6123
6123
  React7__default.default.useEffect(() => {
6124
- void isomorphicClerkRef.current.__unstable__updateProps({ appearance: options.appearance });
6124
+ void isomorphicClerkRef.current.__internal_updateProps({ appearance: options.appearance });
6125
6125
  }, [options.appearance]);
6126
6126
  React7__default.default.useEffect(() => {
6127
- void isomorphicClerkRef.current.__unstable__updateProps({ options });
6127
+ void isomorphicClerkRef.current.__internal_updateProps({ options });
6128
6128
  }, [options.localization]);
6129
6129
  React7__default.default.useEffect(() => {
6130
6130
  isomorphicClerkRef.current.on("status", setClerkStatus);
@@ -6353,7 +6353,7 @@ var BrowserStorageCache = createBrowserStorageCache();
6353
6353
  var clerk;
6354
6354
  noRhc.Clerk.sdkMetadata = {
6355
6355
  name: "@clerk/chrome-extension",
6356
- version: "3.0.0-snapshot.v20251203203405"
6356
+ version: "3.0.0-snapshot.v20251204143242"
6357
6357
  };
6358
6358
  function createClerkClient({
6359
6359
  __experimental_syncHostListener = false,
@@ -6399,8 +6399,8 @@ function createClerkClient({
6399
6399
  const listener = jwt.listener();
6400
6400
  listener == null ? void 0 : listener.add();
6401
6401
  }
6402
- clerk.__unstable__onAfterResponse(responseHandler(jwt, { isProd }));
6403
- clerk.__unstable__onBeforeRequest(requestHandler(jwt, { isProd }));
6402
+ clerk.__internal_onAfterResponse(responseHandler(jwt, { isProd }));
6403
+ clerk.__internal_onBeforeRequest(requestHandler(jwt, { isProd }));
6404
6404
  return clerk;
6405
6405
  }
6406
6406
  function ClerkProvider2(props) {