@weirdfingers/boards-auth-clerk 0.10.0 → 0.10.2
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.
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -37,7 +37,6 @@ module.exports = __toCommonJS(index_exports);
|
|
|
37
37
|
// src/ClerkAuthProvider.ts
|
|
38
38
|
var import_boards = require("@weirdfingers/boards");
|
|
39
39
|
var ClerkAuthProvider = class extends import_boards.BaseAuthProvider {
|
|
40
|
-
// Will be typed properly when @clerk/clerk-js is available
|
|
41
40
|
constructor(config) {
|
|
42
41
|
super(config);
|
|
43
42
|
this.listeners = [];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/ClerkAuthProvider.ts"],"sourcesContent":["/**\n * Clerk authentication provider package for Boards.\n */\n\nexport { ClerkAuthProvider } from './ClerkAuthProvider';\nexport type { ClerkConfig } from './types';\n\n// Re-export core types for convenience\nexport type {\n AuthState,\n User,\n AuthProviderConfig,\n AuthContextValue\n} from '@weirdfingers/boards';\n","/**\n * Clerk authentication provider.\n */\n\nimport { BaseAuthProvider, AuthState, User } from \"@weirdfingers/boards\";\nimport type { ClerkConfig } from \"./types\";\n\nexport class ClerkAuthProvider extends BaseAuthProvider {\n protected config: ClerkConfig;\n private listeners: ((state: AuthState) => void)[] = [];\n private currentState: AuthState;\n private clerk: any; // Will be typed properly when @clerk/clerk-js is available\n\n constructor(config: ClerkConfig) {\n super(config);\n this.config = config;\n\n this.currentState = {\n user: null,\n status: \"loading\",\n signIn: this.signIn.bind(this) as any,\n signOut: this.signOut.bind(this),\n getToken: this.getToken.bind(this),\n refreshToken: async () => null,\n };\n }\n\n async initialize(): Promise<void> {\n try {\n // Dynamically import Clerk\n const Clerk = (await import(\"@clerk/clerk-js\")).default;\n\n this.clerk = new Clerk(this.config.publishableKey);\n\n await this.clerk.load({\n ...this.config.options,\n });\n\n // Set up auth state listener\n this.clerk.addListener(this.handleClerkUpdate.bind(this));\n\n // Get initial state\n this.handleClerkUpdate();\n } catch (error) {\n console.error(\"Failed to initialize Clerk:\", error);\n this.updateState({ user: null, status: \"unauthenticated\" });\n throw error;\n }\n }\n\n async getAuthState(): Promise<AuthState> {\n return this.currentState;\n }\n\n async signIn(\n options: {\n strategy?:\n | \"oauth_google\"\n | \"oauth_github\"\n | \"oauth_discord\"\n | \"email_code\"\n | \"password\";\n identifier?: string; // email or username\n password?: string;\n code?: string;\n redirectUrl?: string;\n [key: string]: unknown;\n } = {}\n ): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n this.updateState({ status: \"loading\" });\n\n try {\n // OAuth strategies\n if (options.strategy?.startsWith(\"oauth_\")) {\n await this.clerk.authenticateWithRedirect({\n strategy: options.strategy,\n redirectUrl: options.redirectUrl || window.location.href,\n redirectUrlComplete: options.redirectUrl || window.location.origin,\n });\n return; // Redirects, so we don't update state here\n }\n\n // Email code strategy\n if (options.strategy === \"email_code\" && options.identifier) {\n const signIn = await this.clerk.client.signIn.create({\n identifier: options.identifier,\n });\n\n await signIn.prepareFirstFactor({\n strategy: \"email_code\",\n emailAddressId: signIn.supportedFirstFactors[0].emailAddressId,\n });\n\n // Return so user can enter code\n this.updateState({ status: \"unauthenticated\" });\n return;\n }\n\n // Password strategy\n if (\n options.strategy === \"password\" &&\n options.identifier &&\n options.password\n ) {\n const signIn = await this.clerk.client.signIn.create({\n identifier: options.identifier,\n password: options.password,\n });\n\n if (signIn.status === \"complete\") {\n await this.clerk.setActive({ session: signIn.createdSessionId });\n return; // State will update via listener\n }\n\n throw new Error(\"Sign in incomplete\");\n }\n\n // Default: open Clerk sign-in modal\n await this.clerk.openSignIn({\n redirectUrl: options.redirectUrl || window.location.href,\n });\n } catch (error) {\n this.updateState({ user: null, status: \"unauthenticated\" });\n throw error;\n }\n }\n\n async signOut(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.signOut();\n // State will update via listener\n }\n\n async getToken(): Promise<string | null> {\n if (!this.clerk || !this.clerk.session) return null;\n\n try {\n return await this.clerk.session.getToken();\n } catch (error) {\n console.error(\"Failed to get token:\", error);\n return null;\n }\n }\n\n async getUser(): Promise<User | null> {\n return this.currentState.user;\n }\n\n onAuthStateChange(callback: (state: AuthState) => void): () => void {\n this.listeners.push(callback);\n return () => {\n const index = this.listeners.indexOf(callback);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n async destroy(): Promise<void> {\n this.listeners = [];\n if (this.clerk) {\n this.clerk.removeListener(this.handleClerkUpdate.bind(this));\n }\n }\n\n private handleClerkUpdate(): void {\n if (!this.clerk) return;\n\n if (this.clerk.user) {\n const user: User = {\n id: this.clerk.user.id,\n email: this.clerk.user.primaryEmailAddress?.emailAddress,\n name:\n this.clerk.user.fullName ||\n this.clerk.user.firstName ||\n this.clerk.user.username ||\n this.clerk.user.primaryEmailAddress?.emailAddress?.split(\"@\")[0],\n avatar: this.clerk.user.imageUrl,\n metadata: { provider: \"clerk\", subject: this.clerk.user.id },\n credits: { balance: 0, reserved: 0 },\n };\n\n this.updateState({ user, status: \"authenticated\" });\n } else {\n this.updateState({ user: null, status: \"unauthenticated\" });\n }\n }\n\n private updateState(updates: Partial<AuthState>): void {\n this.currentState = { ...this.currentState, ...updates };\n this.listeners.forEach((listener) => listener(this.currentState));\n }\n\n /**\n * Get the underlying Clerk instance for advanced operations.\n */\n getClerkInstance() {\n return this.clerk;\n }\n\n /**\n * Open Clerk user profile modal.\n */\n async openUserProfile(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.openUserProfile();\n }\n\n /**\n * Open Clerk organization switcher.\n */\n async openOrganizationSwitcher(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.openOrganizationSwitcher();\n }\n\n /**\n * Verify an email code (after email_code sign in).\n */\n async verifyEmailCode(code: string): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n const signIn = this.clerk.client.signIn;\n if (!signIn) {\n throw new Error(\"No active sign in attempt\");\n }\n\n const result = await signIn.attemptFirstFactor({\n strategy: \"email_code\",\n code,\n });\n\n if (result.status === \"complete\") {\n await this.clerk.setActive({ session: result.createdSessionId });\n } else {\n throw new Error(\"Verification failed\");\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/ClerkAuthProvider.ts"],"sourcesContent":["/**\n * Clerk authentication provider package for Boards.\n */\n\nexport { ClerkAuthProvider } from './ClerkAuthProvider';\nexport type { ClerkConfig } from './types';\n\n// Re-export core types for convenience\nexport type {\n AuthState,\n User,\n AuthProviderConfig,\n AuthContextValue\n} from '@weirdfingers/boards';\n","/**\n * Clerk authentication provider.\n */\n\nimport { BaseAuthProvider, AuthState, User } from \"@weirdfingers/boards\";\nimport type { ClerkConfig } from \"./types\";\n\nexport class ClerkAuthProvider extends BaseAuthProvider {\n protected config: ClerkConfig;\n private listeners: ((state: AuthState) => void)[] = [];\n private currentState: AuthState;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Clerk instance is dynamically imported\n private clerk: any;\n\n constructor(config: ClerkConfig) {\n super(config);\n this.config = config;\n\n this.currentState = {\n user: null,\n status: \"loading\",\n signIn: this.signIn.bind(this) as AuthState[\"signIn\"],\n signOut: this.signOut.bind(this),\n getToken: this.getToken.bind(this),\n refreshToken: async () => null,\n };\n }\n\n async initialize(): Promise<void> {\n try {\n // Dynamically import Clerk\n const Clerk = (await import(\"@clerk/clerk-js\")).default;\n\n this.clerk = new Clerk(this.config.publishableKey);\n\n await this.clerk.load({\n ...this.config.options,\n });\n\n // Set up auth state listener\n this.clerk.addListener(this.handleClerkUpdate.bind(this));\n\n // Get initial state\n this.handleClerkUpdate();\n } catch (error) {\n console.error(\"Failed to initialize Clerk:\", error);\n this.updateState({ user: null, status: \"unauthenticated\" });\n throw error;\n }\n }\n\n async getAuthState(): Promise<AuthState> {\n return this.currentState;\n }\n\n async signIn(\n options: {\n strategy?:\n | \"oauth_google\"\n | \"oauth_github\"\n | \"oauth_discord\"\n | \"email_code\"\n | \"password\";\n identifier?: string; // email or username\n password?: string;\n code?: string;\n redirectUrl?: string;\n [key: string]: unknown;\n } = {}\n ): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n this.updateState({ status: \"loading\" });\n\n try {\n // OAuth strategies\n if (options.strategy?.startsWith(\"oauth_\")) {\n await this.clerk.authenticateWithRedirect({\n strategy: options.strategy,\n redirectUrl: options.redirectUrl || window.location.href,\n redirectUrlComplete: options.redirectUrl || window.location.origin,\n });\n return; // Redirects, so we don't update state here\n }\n\n // Email code strategy\n if (options.strategy === \"email_code\" && options.identifier) {\n const signIn = await this.clerk.client.signIn.create({\n identifier: options.identifier,\n });\n\n await signIn.prepareFirstFactor({\n strategy: \"email_code\",\n emailAddressId: signIn.supportedFirstFactors[0].emailAddressId,\n });\n\n // Return so user can enter code\n this.updateState({ status: \"unauthenticated\" });\n return;\n }\n\n // Password strategy\n if (\n options.strategy === \"password\" &&\n options.identifier &&\n options.password\n ) {\n const signIn = await this.clerk.client.signIn.create({\n identifier: options.identifier,\n password: options.password,\n });\n\n if (signIn.status === \"complete\") {\n await this.clerk.setActive({ session: signIn.createdSessionId });\n return; // State will update via listener\n }\n\n throw new Error(\"Sign in incomplete\");\n }\n\n // Default: open Clerk sign-in modal\n await this.clerk.openSignIn({\n redirectUrl: options.redirectUrl || window.location.href,\n });\n } catch (error) {\n this.updateState({ user: null, status: \"unauthenticated\" });\n throw error;\n }\n }\n\n async signOut(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.signOut();\n // State will update via listener\n }\n\n async getToken(): Promise<string | null> {\n if (!this.clerk || !this.clerk.session) return null;\n\n try {\n return await this.clerk.session.getToken();\n } catch (error) {\n console.error(\"Failed to get token:\", error);\n return null;\n }\n }\n\n async getUser(): Promise<User | null> {\n return this.currentState.user;\n }\n\n onAuthStateChange(callback: (state: AuthState) => void): () => void {\n this.listeners.push(callback);\n return () => {\n const index = this.listeners.indexOf(callback);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n async destroy(): Promise<void> {\n this.listeners = [];\n if (this.clerk) {\n this.clerk.removeListener(this.handleClerkUpdate.bind(this));\n }\n }\n\n private handleClerkUpdate(): void {\n if (!this.clerk) return;\n\n if (this.clerk.user) {\n const user: User = {\n id: this.clerk.user.id,\n email: this.clerk.user.primaryEmailAddress?.emailAddress,\n name:\n this.clerk.user.fullName ||\n this.clerk.user.firstName ||\n this.clerk.user.username ||\n this.clerk.user.primaryEmailAddress?.emailAddress?.split(\"@\")[0],\n avatar: this.clerk.user.imageUrl,\n metadata: { provider: \"clerk\", subject: this.clerk.user.id },\n credits: { balance: 0, reserved: 0 },\n };\n\n this.updateState({ user, status: \"authenticated\" });\n } else {\n this.updateState({ user: null, status: \"unauthenticated\" });\n }\n }\n\n private updateState(updates: Partial<AuthState>): void {\n this.currentState = { ...this.currentState, ...updates };\n this.listeners.forEach((listener) => listener(this.currentState));\n }\n\n /**\n * Get the underlying Clerk instance for advanced operations.\n */\n getClerkInstance() {\n return this.clerk;\n }\n\n /**\n * Open Clerk user profile modal.\n */\n async openUserProfile(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.openUserProfile();\n }\n\n /**\n * Open Clerk organization switcher.\n */\n async openOrganizationSwitcher(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.openOrganizationSwitcher();\n }\n\n /**\n * Verify an email code (after email_code sign in).\n */\n async verifyEmailCode(code: string): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n const signIn = this.clerk.client.signIn;\n if (!signIn) {\n throw new Error(\"No active sign in attempt\");\n }\n\n const result = await signIn.attemptFirstFactor({\n strategy: \"email_code\",\n code,\n });\n\n if (result.status === \"complete\") {\n await this.clerk.setActive({ session: result.createdSessionId });\n } else {\n throw new Error(\"Verification failed\");\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// src/ClerkAuthProvider.ts
|
|
2
2
|
import { BaseAuthProvider } from "@weirdfingers/boards";
|
|
3
3
|
var ClerkAuthProvider = class extends BaseAuthProvider {
|
|
4
|
-
// Will be typed properly when @clerk/clerk-js is available
|
|
5
4
|
constructor(config) {
|
|
6
5
|
super(config);
|
|
7
6
|
this.listeners = [];
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ClerkAuthProvider.ts"],"sourcesContent":["/**\n * Clerk authentication provider.\n */\n\nimport { BaseAuthProvider, AuthState, User } from \"@weirdfingers/boards\";\nimport type { ClerkConfig } from \"./types\";\n\nexport class ClerkAuthProvider extends BaseAuthProvider {\n protected config: ClerkConfig;\n private listeners: ((state: AuthState) => void)[] = [];\n private currentState: AuthState;\n private clerk: any; // Will be typed properly when @clerk/clerk-js is available\n\n constructor(config: ClerkConfig) {\n super(config);\n this.config = config;\n\n this.currentState = {\n user: null,\n status: \"loading\",\n signIn: this.signIn.bind(this) as any,\n signOut: this.signOut.bind(this),\n getToken: this.getToken.bind(this),\n refreshToken: async () => null,\n };\n }\n\n async initialize(): Promise<void> {\n try {\n // Dynamically import Clerk\n const Clerk = (await import(\"@clerk/clerk-js\")).default;\n\n this.clerk = new Clerk(this.config.publishableKey);\n\n await this.clerk.load({\n ...this.config.options,\n });\n\n // Set up auth state listener\n this.clerk.addListener(this.handleClerkUpdate.bind(this));\n\n // Get initial state\n this.handleClerkUpdate();\n } catch (error) {\n console.error(\"Failed to initialize Clerk:\", error);\n this.updateState({ user: null, status: \"unauthenticated\" });\n throw error;\n }\n }\n\n async getAuthState(): Promise<AuthState> {\n return this.currentState;\n }\n\n async signIn(\n options: {\n strategy?:\n | \"oauth_google\"\n | \"oauth_github\"\n | \"oauth_discord\"\n | \"email_code\"\n | \"password\";\n identifier?: string; // email or username\n password?: string;\n code?: string;\n redirectUrl?: string;\n [key: string]: unknown;\n } = {}\n ): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n this.updateState({ status: \"loading\" });\n\n try {\n // OAuth strategies\n if (options.strategy?.startsWith(\"oauth_\")) {\n await this.clerk.authenticateWithRedirect({\n strategy: options.strategy,\n redirectUrl: options.redirectUrl || window.location.href,\n redirectUrlComplete: options.redirectUrl || window.location.origin,\n });\n return; // Redirects, so we don't update state here\n }\n\n // Email code strategy\n if (options.strategy === \"email_code\" && options.identifier) {\n const signIn = await this.clerk.client.signIn.create({\n identifier: options.identifier,\n });\n\n await signIn.prepareFirstFactor({\n strategy: \"email_code\",\n emailAddressId: signIn.supportedFirstFactors[0].emailAddressId,\n });\n\n // Return so user can enter code\n this.updateState({ status: \"unauthenticated\" });\n return;\n }\n\n // Password strategy\n if (\n options.strategy === \"password\" &&\n options.identifier &&\n options.password\n ) {\n const signIn = await this.clerk.client.signIn.create({\n identifier: options.identifier,\n password: options.password,\n });\n\n if (signIn.status === \"complete\") {\n await this.clerk.setActive({ session: signIn.createdSessionId });\n return; // State will update via listener\n }\n\n throw new Error(\"Sign in incomplete\");\n }\n\n // Default: open Clerk sign-in modal\n await this.clerk.openSignIn({\n redirectUrl: options.redirectUrl || window.location.href,\n });\n } catch (error) {\n this.updateState({ user: null, status: \"unauthenticated\" });\n throw error;\n }\n }\n\n async signOut(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.signOut();\n // State will update via listener\n }\n\n async getToken(): Promise<string | null> {\n if (!this.clerk || !this.clerk.session) return null;\n\n try {\n return await this.clerk.session.getToken();\n } catch (error) {\n console.error(\"Failed to get token:\", error);\n return null;\n }\n }\n\n async getUser(): Promise<User | null> {\n return this.currentState.user;\n }\n\n onAuthStateChange(callback: (state: AuthState) => void): () => void {\n this.listeners.push(callback);\n return () => {\n const index = this.listeners.indexOf(callback);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n async destroy(): Promise<void> {\n this.listeners = [];\n if (this.clerk) {\n this.clerk.removeListener(this.handleClerkUpdate.bind(this));\n }\n }\n\n private handleClerkUpdate(): void {\n if (!this.clerk) return;\n\n if (this.clerk.user) {\n const user: User = {\n id: this.clerk.user.id,\n email: this.clerk.user.primaryEmailAddress?.emailAddress,\n name:\n this.clerk.user.fullName ||\n this.clerk.user.firstName ||\n this.clerk.user.username ||\n this.clerk.user.primaryEmailAddress?.emailAddress?.split(\"@\")[0],\n avatar: this.clerk.user.imageUrl,\n metadata: { provider: \"clerk\", subject: this.clerk.user.id },\n credits: { balance: 0, reserved: 0 },\n };\n\n this.updateState({ user, status: \"authenticated\" });\n } else {\n this.updateState({ user: null, status: \"unauthenticated\" });\n }\n }\n\n private updateState(updates: Partial<AuthState>): void {\n this.currentState = { ...this.currentState, ...updates };\n this.listeners.forEach((listener) => listener(this.currentState));\n }\n\n /**\n * Get the underlying Clerk instance for advanced operations.\n */\n getClerkInstance() {\n return this.clerk;\n }\n\n /**\n * Open Clerk user profile modal.\n */\n async openUserProfile(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.openUserProfile();\n }\n\n /**\n * Open Clerk organization switcher.\n */\n async openOrganizationSwitcher(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.openOrganizationSwitcher();\n }\n\n /**\n * Verify an email code (after email_code sign in).\n */\n async verifyEmailCode(code: string): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n const signIn = this.clerk.client.signIn;\n if (!signIn) {\n throw new Error(\"No active sign in attempt\");\n }\n\n const result = await signIn.attemptFirstFactor({\n strategy: \"email_code\",\n code,\n });\n\n if (result.status === \"complete\") {\n await this.clerk.setActive({ session: result.createdSessionId });\n } else {\n throw new Error(\"Verification failed\");\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/ClerkAuthProvider.ts"],"sourcesContent":["/**\n * Clerk authentication provider.\n */\n\nimport { BaseAuthProvider, AuthState, User } from \"@weirdfingers/boards\";\nimport type { ClerkConfig } from \"./types\";\n\nexport class ClerkAuthProvider extends BaseAuthProvider {\n protected config: ClerkConfig;\n private listeners: ((state: AuthState) => void)[] = [];\n private currentState: AuthState;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Clerk instance is dynamically imported\n private clerk: any;\n\n constructor(config: ClerkConfig) {\n super(config);\n this.config = config;\n\n this.currentState = {\n user: null,\n status: \"loading\",\n signIn: this.signIn.bind(this) as AuthState[\"signIn\"],\n signOut: this.signOut.bind(this),\n getToken: this.getToken.bind(this),\n refreshToken: async () => null,\n };\n }\n\n async initialize(): Promise<void> {\n try {\n // Dynamically import Clerk\n const Clerk = (await import(\"@clerk/clerk-js\")).default;\n\n this.clerk = new Clerk(this.config.publishableKey);\n\n await this.clerk.load({\n ...this.config.options,\n });\n\n // Set up auth state listener\n this.clerk.addListener(this.handleClerkUpdate.bind(this));\n\n // Get initial state\n this.handleClerkUpdate();\n } catch (error) {\n console.error(\"Failed to initialize Clerk:\", error);\n this.updateState({ user: null, status: \"unauthenticated\" });\n throw error;\n }\n }\n\n async getAuthState(): Promise<AuthState> {\n return this.currentState;\n }\n\n async signIn(\n options: {\n strategy?:\n | \"oauth_google\"\n | \"oauth_github\"\n | \"oauth_discord\"\n | \"email_code\"\n | \"password\";\n identifier?: string; // email or username\n password?: string;\n code?: string;\n redirectUrl?: string;\n [key: string]: unknown;\n } = {}\n ): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n this.updateState({ status: \"loading\" });\n\n try {\n // OAuth strategies\n if (options.strategy?.startsWith(\"oauth_\")) {\n await this.clerk.authenticateWithRedirect({\n strategy: options.strategy,\n redirectUrl: options.redirectUrl || window.location.href,\n redirectUrlComplete: options.redirectUrl || window.location.origin,\n });\n return; // Redirects, so we don't update state here\n }\n\n // Email code strategy\n if (options.strategy === \"email_code\" && options.identifier) {\n const signIn = await this.clerk.client.signIn.create({\n identifier: options.identifier,\n });\n\n await signIn.prepareFirstFactor({\n strategy: \"email_code\",\n emailAddressId: signIn.supportedFirstFactors[0].emailAddressId,\n });\n\n // Return so user can enter code\n this.updateState({ status: \"unauthenticated\" });\n return;\n }\n\n // Password strategy\n if (\n options.strategy === \"password\" &&\n options.identifier &&\n options.password\n ) {\n const signIn = await this.clerk.client.signIn.create({\n identifier: options.identifier,\n password: options.password,\n });\n\n if (signIn.status === \"complete\") {\n await this.clerk.setActive({ session: signIn.createdSessionId });\n return; // State will update via listener\n }\n\n throw new Error(\"Sign in incomplete\");\n }\n\n // Default: open Clerk sign-in modal\n await this.clerk.openSignIn({\n redirectUrl: options.redirectUrl || window.location.href,\n });\n } catch (error) {\n this.updateState({ user: null, status: \"unauthenticated\" });\n throw error;\n }\n }\n\n async signOut(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.signOut();\n // State will update via listener\n }\n\n async getToken(): Promise<string | null> {\n if (!this.clerk || !this.clerk.session) return null;\n\n try {\n return await this.clerk.session.getToken();\n } catch (error) {\n console.error(\"Failed to get token:\", error);\n return null;\n }\n }\n\n async getUser(): Promise<User | null> {\n return this.currentState.user;\n }\n\n onAuthStateChange(callback: (state: AuthState) => void): () => void {\n this.listeners.push(callback);\n return () => {\n const index = this.listeners.indexOf(callback);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n async destroy(): Promise<void> {\n this.listeners = [];\n if (this.clerk) {\n this.clerk.removeListener(this.handleClerkUpdate.bind(this));\n }\n }\n\n private handleClerkUpdate(): void {\n if (!this.clerk) return;\n\n if (this.clerk.user) {\n const user: User = {\n id: this.clerk.user.id,\n email: this.clerk.user.primaryEmailAddress?.emailAddress,\n name:\n this.clerk.user.fullName ||\n this.clerk.user.firstName ||\n this.clerk.user.username ||\n this.clerk.user.primaryEmailAddress?.emailAddress?.split(\"@\")[0],\n avatar: this.clerk.user.imageUrl,\n metadata: { provider: \"clerk\", subject: this.clerk.user.id },\n credits: { balance: 0, reserved: 0 },\n };\n\n this.updateState({ user, status: \"authenticated\" });\n } else {\n this.updateState({ user: null, status: \"unauthenticated\" });\n }\n }\n\n private updateState(updates: Partial<AuthState>): void {\n this.currentState = { ...this.currentState, ...updates };\n this.listeners.forEach((listener) => listener(this.currentState));\n }\n\n /**\n * Get the underlying Clerk instance for advanced operations.\n */\n getClerkInstance() {\n return this.clerk;\n }\n\n /**\n * Open Clerk user profile modal.\n */\n async openUserProfile(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.openUserProfile();\n }\n\n /**\n * Open Clerk organization switcher.\n */\n async openOrganizationSwitcher(): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n await this.clerk.openOrganizationSwitcher();\n }\n\n /**\n * Verify an email code (after email_code sign in).\n */\n async verifyEmailCode(code: string): Promise<void> {\n if (!this.clerk) {\n throw new Error(\"Clerk not initialized\");\n }\n\n const signIn = this.clerk.client.signIn;\n if (!signIn) {\n throw new Error(\"No active sign in attempt\");\n }\n\n const result = await signIn.attemptFirstFactor({\n strategy: \"email_code\",\n code,\n });\n\n if (result.status === \"complete\") {\n await this.clerk.setActive({ session: result.createdSessionId });\n } else {\n throw new Error(\"Verification failed\");\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weirdfingers/boards-auth-clerk",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"description": "Clerk authentication provider for Boards",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"peerDependencies": {
|
|
18
18
|
"@clerk/clerk-js": "^4.0.0",
|
|
19
19
|
"react": "^18.0.0",
|
|
20
|
-
"@weirdfingers/boards": "0.10.
|
|
20
|
+
"@weirdfingers/boards": "0.10.2"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/react": "^18.0.0",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"tsup": "^8.0.0",
|
|
28
28
|
"typescript": "^5.0.0",
|
|
29
29
|
"vitest": "^1.0.0",
|
|
30
|
-
"@weirdfingers/boards": "0.10.
|
|
30
|
+
"@weirdfingers/boards": "0.10.2"
|
|
31
31
|
},
|
|
32
32
|
"files": [
|
|
33
33
|
"dist",
|