diff --git a/.changeset/hip-ideas-cheat.md b/.changeset/hip-ideas-cheat.md new file mode 100644 index 00000000000..2e86b105013 --- /dev/null +++ b/.changeset/hip-ideas-cheat.md @@ -0,0 +1,7 @@ +--- +'@clerk/clerk-js': minor +'@clerk/clerk-react': minor +'@clerk/types': minor +--- + +Expose the frontend api version the clerk instance is using via `Clerk.apiVersion`. diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 7bcc3910e05..d657127f3a4 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -126,7 +126,13 @@ import { memoizeListenerCallback } from '../utils/memoizeStateListenerCallback'; import { RedirectUrls } from '../utils/redirectUrls'; import { AuthCookieService } from './auth/AuthCookieService'; import { CaptchaHeartbeat } from './auth/CaptchaHeartbeat'; -import { CLERK_SATELLITE_URL, CLERK_SUFFIXED_COOKIES, CLERK_SYNCED, ERROR_CODES } from './constants'; +import { + CLERK_SATELLITE_URL, + CLERK_SUFFIXED_COOKIES, + CLERK_SYNCED, + ERROR_CODES, + SUPPORTED_FAPI_VERSION, +} from './constants'; import { clerkErrorInitFailed, clerkInvalidSignInUrlFormat, @@ -275,6 +281,19 @@ export class Clerk implements ClerkInterface { return Clerk.sdkMetadata; } + debug() { + return { + info: Object.freeze({ + version: this.version, + frontendApi: Object.freeze({ + version: SUPPORTED_FAPI_VERSION, + host: this.frontendApi, + }), + loadedOptions: { ...this.#options }, + }), + }; + } + get loaded(): boolean { return this.status === 'degraded' || this.status === 'ready'; } diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index 8e7deb0ce02..1fe822117e7 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -104,6 +104,7 @@ type IsomorphicLoadedClerk = Without< | '__internal_reloadInitialResources' | 'billing' | 'apiKeys' + | 'debug' | '__internal_setComponentNavigationContext' | '__internal_setActiveInProgress' | '__internal_hasAfterAuthFlows' @@ -111,6 +112,7 @@ type IsomorphicLoadedClerk = Without< client: ClientResource | undefined; billing: CommerceBillingNamespace | undefined; apiKeys: APIKeysNamespace | undefined; + debug: ReturnType; }; export class IsomorphicClerk implements IsomorphicLoadedClerk { @@ -652,6 +654,10 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { return this.clerkjs?.version; } + get debug() { + return this.clerkjs?.debug?.() as ReturnType; + } + get client(): ClientResource | undefined { if (this.clerkjs) { return this.clerkjs.client; diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 290d0adaafb..54a7e918c46 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -171,6 +171,20 @@ export interface Clerk { */ sdkMetadata: SDKMetadata | undefined; + /** + * Returns a snapshot of data through the `info` property. It can be used during debugging sessions. + */ + debug: () => { + info: { + version: string; + frontendApi: { + version: string; + host: string; + }; + loadedOptions?: ClerkOptions; + }; + }; + /** * If true the bootstrapping of Clerk.load() has completed successfully. */