@telestack/auth-sdk 1.1.2 → 1.2.1

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 CHANGED
@@ -6628,6 +6628,102 @@ declare const createTelestackAuth: (config: TelestackConfig) => {
6628
6628
  code?: string | undefined;
6629
6629
  message?: string | undefined;
6630
6630
  }, FetchOptions["throw"] extends true ? true : boolean>>;
6631
+ sendPhoneOtp: <FetchOptions extends better_auth.ClientFetchOption<Partial<{
6632
+ phoneNumber: string;
6633
+ }> & Record<string, any>, Partial<Record<string, any>> & Record<string, any>, Record<string, any> | undefined>>(data_0: better_auth.Prettify<{
6634
+ phoneNumber: string;
6635
+ } & {
6636
+ fetchOptions?: FetchOptions | undefined;
6637
+ }>, data_1?: FetchOptions | undefined) => Promise<_better_fetch_fetch.BetterFetchResponse<{
6638
+ message: string;
6639
+ }, {
6640
+ code?: string | undefined;
6641
+ message?: string | undefined;
6642
+ }, FetchOptions["throw"] extends true ? true : boolean>>;
6643
+ verifyPhoneOtp: <FetchOptions extends better_auth.ClientFetchOption<Partial<{
6644
+ phoneNumber: string;
6645
+ code: string;
6646
+ disableSession?: boolean | undefined;
6647
+ updatePhoneNumber?: boolean | undefined;
6648
+ } & Record<string, any>> & Record<string, any>, Partial<Record<string, any>> & Record<string, any>, Record<string, any> | undefined>>(data_0: better_auth.Prettify<{
6649
+ phoneNumber: string;
6650
+ code: string;
6651
+ disableSession?: boolean | undefined;
6652
+ updatePhoneNumber?: boolean | undefined;
6653
+ } & Record<string, any> & {
6654
+ fetchOptions?: FetchOptions | undefined;
6655
+ }>, data_1?: FetchOptions | undefined) => Promise<_better_fetch_fetch.BetterFetchResponse<(Omit<{
6656
+ status: boolean;
6657
+ token: string;
6658
+ user: {
6659
+ id: string;
6660
+ createdAt: Date;
6661
+ updatedAt: Date;
6662
+ email: string;
6663
+ emailVerified: boolean;
6664
+ name: string;
6665
+ image?: string | null | undefined;
6666
+ } & better_auth_plugins.UserWithPhoneNumber;
6667
+ }, "user"> & {
6668
+ user: better_auth.StripEmptyObjects<{
6669
+ id: string;
6670
+ createdAt: Date;
6671
+ updatedAt: Date;
6672
+ email: string;
6673
+ emailVerified: boolean;
6674
+ name: string;
6675
+ image?: string | null | undefined;
6676
+ } & {
6677
+ twoFactorEnabled: boolean | null | undefined;
6678
+ } & {} & {} & {
6679
+ username?: string | null | undefined;
6680
+ displayUsername?: string | null | undefined;
6681
+ } & {
6682
+ banned: boolean | null | undefined;
6683
+ } & {
6684
+ role?: string | null | undefined;
6685
+ banReason?: string | null | undefined;
6686
+ banExpires?: Date | null | undefined;
6687
+ } & {} & {
6688
+ phoneNumber?: string | null | undefined;
6689
+ phoneNumberVerified?: boolean | null | undefined;
6690
+ } & {
6691
+ isAnonymous: boolean | null | undefined;
6692
+ } & {}>;
6693
+ }) | (Omit<{
6694
+ status: boolean;
6695
+ token: null;
6696
+ user: better_auth_plugins.UserWithPhoneNumber;
6697
+ }, "user"> & {
6698
+ user: better_auth.StripEmptyObjects<{
6699
+ id: string;
6700
+ createdAt: Date;
6701
+ updatedAt: Date;
6702
+ email: string;
6703
+ emailVerified: boolean;
6704
+ name: string;
6705
+ image?: string | null | undefined;
6706
+ } & {
6707
+ twoFactorEnabled: boolean | null | undefined;
6708
+ } & {} & {} & {
6709
+ username?: string | null | undefined;
6710
+ displayUsername?: string | null | undefined;
6711
+ } & {
6712
+ banned: boolean | null | undefined;
6713
+ } & {
6714
+ role?: string | null | undefined;
6715
+ banReason?: string | null | undefined;
6716
+ banExpires?: Date | null | undefined;
6717
+ } & {} & {
6718
+ phoneNumber?: string | null | undefined;
6719
+ phoneNumberVerified?: boolean | null | undefined;
6720
+ } & {
6721
+ isAnonymous: boolean | null | undefined;
6722
+ } & {}>;
6723
+ }), {
6724
+ code?: string | undefined;
6725
+ message?: string | undefined;
6726
+ }, FetchOptions["throw"] extends true ? true : boolean>>;
6631
6727
  signInWithGoogle: (options?: Parameters<(<FetchOptions extends better_auth.ClientFetchOption<Partial<{
6632
6728
  provider: (string & {}) | "linear" | "huggingface" | "github" | "apple" | "atlassian" | "cognito" | "discord" | "facebook" | "figma" | "microsoft" | "google" | "slack" | "spotify" | "twitch" | "twitter" | "dropbox" | "kick" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "salesforce" | "vk" | "zoom" | "notion" | "kakao" | "naver" | "line" | "paybin" | "paypal" | "polar" | "railway" | "vercel";
6633
6729
  callbackURL?: string | undefined;
package/dist/index.d.ts CHANGED
@@ -6628,6 +6628,102 @@ declare const createTelestackAuth: (config: TelestackConfig) => {
6628
6628
  code?: string | undefined;
6629
6629
  message?: string | undefined;
6630
6630
  }, FetchOptions["throw"] extends true ? true : boolean>>;
6631
+ sendPhoneOtp: <FetchOptions extends better_auth.ClientFetchOption<Partial<{
6632
+ phoneNumber: string;
6633
+ }> & Record<string, any>, Partial<Record<string, any>> & Record<string, any>, Record<string, any> | undefined>>(data_0: better_auth.Prettify<{
6634
+ phoneNumber: string;
6635
+ } & {
6636
+ fetchOptions?: FetchOptions | undefined;
6637
+ }>, data_1?: FetchOptions | undefined) => Promise<_better_fetch_fetch.BetterFetchResponse<{
6638
+ message: string;
6639
+ }, {
6640
+ code?: string | undefined;
6641
+ message?: string | undefined;
6642
+ }, FetchOptions["throw"] extends true ? true : boolean>>;
6643
+ verifyPhoneOtp: <FetchOptions extends better_auth.ClientFetchOption<Partial<{
6644
+ phoneNumber: string;
6645
+ code: string;
6646
+ disableSession?: boolean | undefined;
6647
+ updatePhoneNumber?: boolean | undefined;
6648
+ } & Record<string, any>> & Record<string, any>, Partial<Record<string, any>> & Record<string, any>, Record<string, any> | undefined>>(data_0: better_auth.Prettify<{
6649
+ phoneNumber: string;
6650
+ code: string;
6651
+ disableSession?: boolean | undefined;
6652
+ updatePhoneNumber?: boolean | undefined;
6653
+ } & Record<string, any> & {
6654
+ fetchOptions?: FetchOptions | undefined;
6655
+ }>, data_1?: FetchOptions | undefined) => Promise<_better_fetch_fetch.BetterFetchResponse<(Omit<{
6656
+ status: boolean;
6657
+ token: string;
6658
+ user: {
6659
+ id: string;
6660
+ createdAt: Date;
6661
+ updatedAt: Date;
6662
+ email: string;
6663
+ emailVerified: boolean;
6664
+ name: string;
6665
+ image?: string | null | undefined;
6666
+ } & better_auth_plugins.UserWithPhoneNumber;
6667
+ }, "user"> & {
6668
+ user: better_auth.StripEmptyObjects<{
6669
+ id: string;
6670
+ createdAt: Date;
6671
+ updatedAt: Date;
6672
+ email: string;
6673
+ emailVerified: boolean;
6674
+ name: string;
6675
+ image?: string | null | undefined;
6676
+ } & {
6677
+ twoFactorEnabled: boolean | null | undefined;
6678
+ } & {} & {} & {
6679
+ username?: string | null | undefined;
6680
+ displayUsername?: string | null | undefined;
6681
+ } & {
6682
+ banned: boolean | null | undefined;
6683
+ } & {
6684
+ role?: string | null | undefined;
6685
+ banReason?: string | null | undefined;
6686
+ banExpires?: Date | null | undefined;
6687
+ } & {} & {
6688
+ phoneNumber?: string | null | undefined;
6689
+ phoneNumberVerified?: boolean | null | undefined;
6690
+ } & {
6691
+ isAnonymous: boolean | null | undefined;
6692
+ } & {}>;
6693
+ }) | (Omit<{
6694
+ status: boolean;
6695
+ token: null;
6696
+ user: better_auth_plugins.UserWithPhoneNumber;
6697
+ }, "user"> & {
6698
+ user: better_auth.StripEmptyObjects<{
6699
+ id: string;
6700
+ createdAt: Date;
6701
+ updatedAt: Date;
6702
+ email: string;
6703
+ emailVerified: boolean;
6704
+ name: string;
6705
+ image?: string | null | undefined;
6706
+ } & {
6707
+ twoFactorEnabled: boolean | null | undefined;
6708
+ } & {} & {} & {
6709
+ username?: string | null | undefined;
6710
+ displayUsername?: string | null | undefined;
6711
+ } & {
6712
+ banned: boolean | null | undefined;
6713
+ } & {
6714
+ role?: string | null | undefined;
6715
+ banReason?: string | null | undefined;
6716
+ banExpires?: Date | null | undefined;
6717
+ } & {} & {
6718
+ phoneNumber?: string | null | undefined;
6719
+ phoneNumberVerified?: boolean | null | undefined;
6720
+ } & {
6721
+ isAnonymous: boolean | null | undefined;
6722
+ } & {}>;
6723
+ }), {
6724
+ code?: string | undefined;
6725
+ message?: string | undefined;
6726
+ }, FetchOptions["throw"] extends true ? true : boolean>>;
6631
6727
  signInWithGoogle: (options?: Parameters<(<FetchOptions extends better_auth.ClientFetchOption<Partial<{
6632
6728
  provider: (string & {}) | "linear" | "huggingface" | "github" | "apple" | "atlassian" | "cognito" | "discord" | "facebook" | "figma" | "microsoft" | "google" | "slack" | "spotify" | "twitch" | "twitter" | "dropbox" | "kick" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "salesforce" | "vk" | "zoom" | "notion" | "kakao" | "naver" | "line" | "paybin" | "paypal" | "polar" | "railway" | "vercel";
6633
6729
  callbackURL?: string | undefined;
package/dist/index.js CHANGED
@@ -80,6 +80,8 @@ var createTelestackAuth = (config) => {
80
80
  signInWithEmail: rawClient.signIn.email,
81
81
  signInWithUsername: rawClient.signIn.username,
82
82
  signInWithPhone: rawClient.signIn.phoneNumber,
83
+ sendPhoneOtp: rawClient.phoneNumber.sendOtp,
84
+ verifyPhoneOtp: rawClient.phoneNumber.verify,
83
85
  signInWithGoogle: (options) => rawClient.signIn.social({ provider: "google", ...options }),
84
86
  signInWithGithub: (options) => rawClient.signIn.social({ provider: "github", ...options }),
85
87
  signInWithPasskey: rawClient.signIn.passkey,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createAuthClient } from \"better-auth/client\";\r\nimport {\r\n magicLinkClient,\r\n organizationClient,\r\n twoFactorClient,\r\n usernameClient,\r\n multiSessionClient,\r\n jwtClient,\r\n adminClient,\r\n phoneNumberClient,\r\n emailOTPClient,\r\n oneTapClient,\r\n genericOAuthClient,\r\n oneTimeTokenClient,\r\n deviceAuthorizationClient,\r\n anonymousClient,\r\n} from \"better-auth/client/plugins\";\r\nimport { passkeyClient } from \"@better-auth/passkey/client\";\r\nimport { ssoClient } from \"@better-auth/sso/client\";\r\nimport { apiKeyClient } from \"@better-auth/api-key/client\";\r\n\r\nexport interface TelestackConfig {\r\n url: string;\r\n tenantId: string;\r\n apiKey?: string;\r\n googleClientId?: string;\r\n fetchOptions?: any;\r\n}\r\n\r\n// Internal factory to preserve strict typing when wrapping methods\r\nexport const createTelestackAuth = (config: TelestackConfig) => {\r\n let internalSession: any = null;\r\n let internalActiveOrg: any = null;\r\n let internalOrgs: any = null;\r\n\r\n // Inlining the plugins array is MANDATORY for Better Auth strict TypeScript inference.\r\n const rawClient = createAuthClient({\r\n baseURL: `${config.url}/api/v1/${config.tenantId}/auth`,\r\n fetchOptions: {\r\n ...config.fetchOptions,\r\n headers: {\r\n ...config.fetchOptions?.headers,\r\n ...(config.apiKey ? { \"X-Telestack-API-Key\": config.apiKey } : {})\r\n }\r\n },\r\n plugins: [\r\n magicLinkClient(),\r\n passkeyClient(),\r\n organizationClient(),\r\n ssoClient(),\r\n twoFactorClient(),\r\n usernameClient(),\r\n multiSessionClient(),\r\n jwtClient(),\r\n adminClient(),\r\n apiKeyClient(),\r\n phoneNumberClient(),\r\n emailOTPClient(),\r\n anonymousClient(),\r\n genericOAuthClient(),\r\n oneTimeTokenClient(),\r\n deviceAuthorizationClient(),\r\n ...(config?.googleClientId ? [oneTapClient({ clientId: config.googleClientId })] : [])\r\n ]\r\n });\r\n\r\n // Subscribe to atoms for live updates while the closure lives\r\n const sessionAtom = (rawClient as any).useSession;\r\n if (sessionAtom) {\r\n sessionAtom.subscribe((state: any) => {\r\n internalSession = state?.data;\r\n });\r\n }\r\n\r\n const activeOrgAtom = (rawClient as any).organization?.useActiveOrganization;\r\n if (activeOrgAtom) {\r\n activeOrgAtom.subscribe((state: any) => {\r\n internalActiveOrg = state?.data;\r\n });\r\n }\r\n\r\n return {\r\n rawClient,\r\n auth: {\r\n signInWithEmail: rawClient.signIn.email,\r\n signInWithUsername: rawClient.signIn.username,\r\n signInWithPhone: rawClient.signIn.phoneNumber,\r\n signInWithGoogle: (options?: Parameters<typeof rawClient.signIn.social>[0]) => rawClient.signIn.social({ provider: \"google\", ...options }),\r\n signInWithGithub: (options?: Parameters<typeof rawClient.signIn.social>[0]) => rawClient.signIn.social({ provider: \"github\", ...options }),\r\n signInWithPasskey: rawClient.signIn.passkey,\r\n signInAnonymously: rawClient.signIn.anonymous,\r\n sendMagicLink: async (options: { email: string; callbackURL?: string }) => {\r\n return await rawClient.signIn.magicLink({\r\n email: options.email,\r\n callbackURL: options.callbackURL || window.location.href,\r\n });\r\n },\r\n signInWithMagicLink: rawClient.signIn.magicLink,\r\n sendOtp: async (options: { email: string }) => {\r\n return await rawClient.emailOtp.sendVerificationOtp({\r\n email: options.email,\r\n type: \"sign-in\"\r\n });\r\n },\r\n signInWithOtp: rawClient.signIn.emailOtp,\r\n signInWithSiwe: (rawClient as any).siwe?.signIn,\r\n signUpWithEmail: rawClient.signUp.email,\r\n signOut: rawClient.signOut,\r\n verifyEmail: rawClient.verifyEmail,\r\n forgetPassword: rawClient.forgetPassword,\r\n resetPassword: rawClient.resetPassword,\r\n },\r\n mfa: {\r\n enableTwoFactor: rawClient.twoFactor.enable,\r\n disableTwoFactor: rawClient.twoFactor.disable,\r\n sendOtp: rawClient.twoFactor.sendOtp,\r\n verifyOtp: rawClient.twoFactor.verifyTotp,\r\n },\r\n user: {\r\n getSession: async () => {\r\n const res = await (rawClient.getSession() as any);\r\n internalSession = res?.data;\r\n return res;\r\n },\r\n listSessions: rawClient.listSessions,\r\n updateProfile: rawClient.updateUser,\r\n changeEmail: rawClient.changeEmail,\r\n changePassword: rawClient.changePassword,\r\n deleteAccount: rawClient.deleteUser,\r\n },\r\n organization: {\r\n create: rawClient.organization.create,\r\n update: rawClient.organization.update,\r\n setActive: rawClient.organization.setActive,\r\n list: async () => {\r\n const res = await (rawClient.organization.list() as any);\r\n internalOrgs = res?.data;\r\n return res;\r\n },\r\n inviteMember: rawClient.organization.inviteMember,\r\n acceptInvitation: rawClient.organization.acceptInvitation,\r\n rejectInvitation: rawClient.organization.rejectInvitation,\r\n removeMember: rawClient.organization.removeMember,\r\n },\r\n admin: {\r\n listUsers: rawClient.admin.listUsers,\r\n impersonateUser: rawClient.admin.impersonateUser,\r\n banUser: rawClient.admin.banUser,\r\n },\r\n sso: {\r\n signIn: rawClient.signIn.sso,\r\n register: rawClient.sso.register,\r\n },\r\n apiKey: {\r\n create: rawClient.apiKey.create,\r\n list: rawClient.apiKey.list,\r\n delete: rawClient.apiKey.delete\r\n },\r\n /**\r\n * The Advanced User Context. Provides stateful access to user attributes,\r\n * security status, and organizational roles without constant API calls.\r\n */\r\n get currentUser() {\r\n return {\r\n get profile() {\r\n return internalSession?.user;\r\n },\r\n get security() {\r\n return {\r\n mfaEnabled: internalSession?.user?.twoFactorEnabled || false,\r\n lastLogin: internalSession?.user?.updatedAt,\r\n isAnonymous: internalSession?.user?.isAnonymous || false,\r\n };\r\n },\r\n get organizations() {\r\n return {\r\n active: internalActiveOrg,\r\n all: internalOrgs,\r\n };\r\n },\r\n get session() {\r\n return {\r\n id: internalSession?.session?.id,\r\n expiresAt: internalSession?.session?.expiresAt,\r\n userAgent: internalSession?.session?.userAgent,\r\n };\r\n },\r\n };\r\n },\r\n /**\r\n * Listens for authentication state changes (sign-in, sign-out, session refresh).\r\n */\r\n onAuthStateChanged(callback: (user: any | null) => void) {\r\n const atom = (rawClient as any).useSession;\r\n if (atom) {\r\n return atom.subscribe((state: any) => {\r\n callback(state?.data?.user || null);\r\n });\r\n }\r\n return () => { };\r\n },\r\n /**\r\n * Forces a synchronization of the local auth state with the server.\r\n */\r\n async syncState() {\r\n const session = await (rawClient.getSession() as any);\r\n internalSession = session?.data;\r\n if (rawClient.organization) {\r\n const [orgs, activeOrg] = await Promise.all([\r\n (rawClient.organization as any).list(),\r\n (rawClient.organization as any).getActiveOrganization()\r\n ]);\r\n internalOrgs = (orgs as any)?.data;\r\n internalActiveOrg = (activeOrg as any)?.data;\r\n }\r\n return session;\r\n }\r\n };\r\n};\r\n\r\nexport type TelestackAuthInstance = ReturnType<typeof createTelestackAuth>;\r\n\r\n/**\r\n * The core singleton SDK for TelestackAuth.\r\n * Designed entirely for extreme developer experience and Firebase-style fluency.\r\n */\r\nexport class TelestackAuth {\r\n private static instance: TelestackAuthInstance | null = null;\r\n private static config: TelestackConfig | null = null;\r\n\r\n /**\r\n * Initializes the TelestackAuth SDK. Must be called once at app startup.\r\n */\r\n public static initialize(config: TelestackConfig): TelestackAuthInstance {\r\n this.config = config;\r\n this.instance = createTelestackAuth(config);\r\n return this.instance;\r\n }\r\n\r\n /**\r\n * Updates the SDK configuration (e.g., adding a token).\r\n */\r\n public static updateConfig(config: Partial<TelestackConfig>): TelestackAuthInstance {\r\n if (!this.config) throw new Error(\"Initialize SDK first\");\r\n this.config = { ...this.config, ...config };\r\n this.instance = createTelestackAuth(this.config);\r\n return this.instance;\r\n }\r\n\r\n /**\r\n * Sets the Bearer token for all subsequent requests.\r\n */\r\n public static setToken(token: string): TelestackAuthInstance {\r\n if (!this.config) throw new Error(\"Initialize SDK first\");\r\n return this.updateConfig({\r\n fetchOptions: {\r\n ...this.config.fetchOptions,\r\n headers: {\r\n ...this.config.fetchOptions?.headers,\r\n \"Authorization\": `Bearer ${token}`\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves the initialized instance of the SDK.\r\n */\r\n public static getInstance(): TelestackAuthInstance {\r\n if (!this.instance) {\r\n throw new Error(\"TelestackAuth has not been initialized. Call initialize(config) first.\");\r\n }\r\n return this.instance;\r\n }\r\n}\r\n\r\n"],"mappings":"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","names":["import_client"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createAuthClient } from \"better-auth/client\";\r\nimport {\r\n magicLinkClient,\r\n organizationClient,\r\n twoFactorClient,\r\n usernameClient,\r\n multiSessionClient,\r\n jwtClient,\r\n adminClient,\r\n phoneNumberClient,\r\n emailOTPClient,\r\n oneTapClient,\r\n genericOAuthClient,\r\n oneTimeTokenClient,\r\n deviceAuthorizationClient,\r\n anonymousClient,\r\n} from \"better-auth/client/plugins\";\r\nimport { passkeyClient } from \"@better-auth/passkey/client\";\r\nimport { ssoClient } from \"@better-auth/sso/client\";\r\nimport { apiKeyClient } from \"@better-auth/api-key/client\";\r\n\r\nexport interface TelestackConfig {\r\n url: string;\r\n tenantId: string;\r\n apiKey?: string;\r\n googleClientId?: string;\r\n fetchOptions?: any;\r\n}\r\n\r\n// Internal factory to preserve strict typing when wrapping methods\r\nexport const createTelestackAuth = (config: TelestackConfig) => {\r\n let internalSession: any = null;\r\n let internalActiveOrg: any = null;\r\n let internalOrgs: any = null;\r\n\r\n // Inlining the plugins array is MANDATORY for Better Auth strict TypeScript inference.\r\n const rawClient = createAuthClient({\r\n baseURL: `${config.url}/api/v1/${config.tenantId}/auth`,\r\n fetchOptions: {\r\n ...config.fetchOptions,\r\n headers: {\r\n ...config.fetchOptions?.headers,\r\n ...(config.apiKey ? { \"X-Telestack-API-Key\": config.apiKey } : {})\r\n }\r\n },\r\n plugins: [\r\n magicLinkClient(),\r\n passkeyClient(),\r\n organizationClient(),\r\n ssoClient(),\r\n twoFactorClient(),\r\n usernameClient(),\r\n multiSessionClient(),\r\n jwtClient(),\r\n adminClient(),\r\n apiKeyClient(),\r\n phoneNumberClient(),\r\n emailOTPClient(),\r\n anonymousClient(),\r\n genericOAuthClient(),\r\n oneTimeTokenClient(),\r\n deviceAuthorizationClient(),\r\n ...(config?.googleClientId ? [oneTapClient({ clientId: config.googleClientId })] : [])\r\n ]\r\n });\r\n\r\n // Subscribe to atoms for live updates while the closure lives\r\n const sessionAtom = (rawClient as any).useSession;\r\n if (sessionAtom) {\r\n sessionAtom.subscribe((state: any) => {\r\n internalSession = state?.data;\r\n });\r\n }\r\n\r\n const activeOrgAtom = (rawClient as any).organization?.useActiveOrganization;\r\n if (activeOrgAtom) {\r\n activeOrgAtom.subscribe((state: any) => {\r\n internalActiveOrg = state?.data;\r\n });\r\n }\r\n\r\n return {\r\n rawClient,\r\n auth: {\r\n signInWithEmail: rawClient.signIn.email,\r\n signInWithUsername: rawClient.signIn.username,\r\n signInWithPhone: rawClient.signIn.phoneNumber,\r\n sendPhoneOtp: rawClient.phoneNumber.sendOtp,\r\n verifyPhoneOtp: rawClient.phoneNumber.verify,\r\n signInWithGoogle: (options?: Parameters<typeof rawClient.signIn.social>[0]) => rawClient.signIn.social({ provider: \"google\", ...options }),\r\n signInWithGithub: (options?: Parameters<typeof rawClient.signIn.social>[0]) => rawClient.signIn.social({ provider: \"github\", ...options }),\r\n signInWithPasskey: rawClient.signIn.passkey,\r\n signInAnonymously: rawClient.signIn.anonymous,\r\n sendMagicLink: async (options: { email: string; callbackURL?: string }) => {\r\n return await rawClient.signIn.magicLink({\r\n email: options.email,\r\n callbackURL: options.callbackURL || window.location.href,\r\n });\r\n },\r\n signInWithMagicLink: rawClient.signIn.magicLink,\r\n sendOtp: async (options: { email: string }) => {\r\n return await rawClient.emailOtp.sendVerificationOtp({\r\n email: options.email,\r\n type: \"sign-in\"\r\n });\r\n },\r\n signInWithOtp: rawClient.signIn.emailOtp,\r\n signInWithSiwe: (rawClient as any).siwe?.signIn,\r\n signUpWithEmail: rawClient.signUp.email,\r\n signOut: rawClient.signOut,\r\n verifyEmail: rawClient.verifyEmail,\r\n forgetPassword: rawClient.forgetPassword,\r\n resetPassword: rawClient.resetPassword,\r\n },\r\n mfa: {\r\n enableTwoFactor: rawClient.twoFactor.enable,\r\n disableTwoFactor: rawClient.twoFactor.disable,\r\n sendOtp: rawClient.twoFactor.sendOtp,\r\n verifyOtp: rawClient.twoFactor.verifyTotp,\r\n },\r\n user: {\r\n getSession: async () => {\r\n const res = await (rawClient.getSession() as any);\r\n internalSession = res?.data;\r\n return res;\r\n },\r\n listSessions: rawClient.listSessions,\r\n updateProfile: rawClient.updateUser,\r\n changeEmail: rawClient.changeEmail,\r\n changePassword: rawClient.changePassword,\r\n deleteAccount: rawClient.deleteUser,\r\n },\r\n organization: {\r\n create: rawClient.organization.create,\r\n update: rawClient.organization.update,\r\n setActive: rawClient.organization.setActive,\r\n list: async () => {\r\n const res = await (rawClient.organization.list() as any);\r\n internalOrgs = res?.data;\r\n return res;\r\n },\r\n inviteMember: rawClient.organization.inviteMember,\r\n acceptInvitation: rawClient.organization.acceptInvitation,\r\n rejectInvitation: rawClient.organization.rejectInvitation,\r\n removeMember: rawClient.organization.removeMember,\r\n },\r\n admin: {\r\n listUsers: rawClient.admin.listUsers,\r\n impersonateUser: rawClient.admin.impersonateUser,\r\n banUser: rawClient.admin.banUser,\r\n },\r\n sso: {\r\n signIn: rawClient.signIn.sso,\r\n register: rawClient.sso.register,\r\n },\r\n apiKey: {\r\n create: rawClient.apiKey.create,\r\n list: rawClient.apiKey.list,\r\n delete: rawClient.apiKey.delete\r\n },\r\n /**\r\n * The Advanced User Context. Provides stateful access to user attributes,\r\n * security status, and organizational roles without constant API calls.\r\n */\r\n get currentUser() {\r\n return {\r\n get profile() {\r\n return internalSession?.user;\r\n },\r\n get security() {\r\n return {\r\n mfaEnabled: internalSession?.user?.twoFactorEnabled || false,\r\n lastLogin: internalSession?.user?.updatedAt,\r\n isAnonymous: internalSession?.user?.isAnonymous || false,\r\n };\r\n },\r\n get organizations() {\r\n return {\r\n active: internalActiveOrg,\r\n all: internalOrgs,\r\n };\r\n },\r\n get session() {\r\n return {\r\n id: internalSession?.session?.id,\r\n expiresAt: internalSession?.session?.expiresAt,\r\n userAgent: internalSession?.session?.userAgent,\r\n };\r\n },\r\n };\r\n },\r\n /**\r\n * Listens for authentication state changes (sign-in, sign-out, session refresh).\r\n */\r\n onAuthStateChanged(callback: (user: any | null) => void) {\r\n const atom = (rawClient as any).useSession;\r\n if (atom) {\r\n return atom.subscribe((state: any) => {\r\n callback(state?.data?.user || null);\r\n });\r\n }\r\n return () => { };\r\n },\r\n /**\r\n * Forces a synchronization of the local auth state with the server.\r\n */\r\n async syncState() {\r\n const session = await (rawClient.getSession() as any);\r\n internalSession = session?.data;\r\n if (rawClient.organization) {\r\n const [orgs, activeOrg] = await Promise.all([\r\n (rawClient.organization as any).list(),\r\n (rawClient.organization as any).getActiveOrganization()\r\n ]);\r\n internalOrgs = (orgs as any)?.data;\r\n internalActiveOrg = (activeOrg as any)?.data;\r\n }\r\n return session;\r\n }\r\n };\r\n};\r\n\r\nexport type TelestackAuthInstance = ReturnType<typeof createTelestackAuth>;\r\n\r\n/**\r\n * The core singleton SDK for TelestackAuth.\r\n * Designed entirely for extreme developer experience and Firebase-style fluency.\r\n */\r\nexport class TelestackAuth {\r\n private static instance: TelestackAuthInstance | null = null;\r\n private static config: TelestackConfig | null = null;\r\n\r\n /**\r\n * Initializes the TelestackAuth SDK. Must be called once at app startup.\r\n */\r\n public static initialize(config: TelestackConfig): TelestackAuthInstance {\r\n this.config = config;\r\n this.instance = createTelestackAuth(config);\r\n return this.instance;\r\n }\r\n\r\n /**\r\n * Updates the SDK configuration (e.g., adding a token).\r\n */\r\n public static updateConfig(config: Partial<TelestackConfig>): TelestackAuthInstance {\r\n if (!this.config) throw new Error(\"Initialize SDK first\");\r\n this.config = { ...this.config, ...config };\r\n this.instance = createTelestackAuth(this.config);\r\n return this.instance;\r\n }\r\n\r\n /**\r\n * Sets the Bearer token for all subsequent requests.\r\n */\r\n public static setToken(token: string): TelestackAuthInstance {\r\n if (!this.config) throw new Error(\"Initialize SDK first\");\r\n return this.updateConfig({\r\n fetchOptions: {\r\n ...this.config.fetchOptions,\r\n headers: {\r\n ...this.config.fetchOptions?.headers,\r\n \"Authorization\": `Bearer ${token}`\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves the initialized instance of the SDK.\r\n */\r\n public static getInstance(): TelestackAuthInstance {\r\n if (!this.instance) {\r\n throw new Error(\"TelestackAuth has not been initialized. Call initialize(config) first.\");\r\n }\r\n return this.instance;\r\n }\r\n}\r\n\r\n"],"mappings":"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","names":["import_client"]}
package/dist/index.mjs CHANGED
@@ -70,6 +70,8 @@ var createTelestackAuth = (config) => {
70
70
  signInWithEmail: rawClient.signIn.email,
71
71
  signInWithUsername: rawClient.signIn.username,
72
72
  signInWithPhone: rawClient.signIn.phoneNumber,
73
+ sendPhoneOtp: rawClient.phoneNumber.sendOtp,
74
+ verifyPhoneOtp: rawClient.phoneNumber.verify,
73
75
  signInWithGoogle: (options) => rawClient.signIn.social({ provider: "google", ...options }),
74
76
  signInWithGithub: (options) => rawClient.signIn.social({ provider: "github", ...options }),
75
77
  signInWithPasskey: rawClient.signIn.passkey,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createAuthClient } from \"better-auth/client\";\r\nimport {\r\n magicLinkClient,\r\n organizationClient,\r\n twoFactorClient,\r\n usernameClient,\r\n multiSessionClient,\r\n jwtClient,\r\n adminClient,\r\n phoneNumberClient,\r\n emailOTPClient,\r\n oneTapClient,\r\n genericOAuthClient,\r\n oneTimeTokenClient,\r\n deviceAuthorizationClient,\r\n anonymousClient,\r\n} from \"better-auth/client/plugins\";\r\nimport { passkeyClient } from \"@better-auth/passkey/client\";\r\nimport { ssoClient } from \"@better-auth/sso/client\";\r\nimport { apiKeyClient } from \"@better-auth/api-key/client\";\r\n\r\nexport interface TelestackConfig {\r\n url: string;\r\n tenantId: string;\r\n apiKey?: string;\r\n googleClientId?: string;\r\n fetchOptions?: any;\r\n}\r\n\r\n// Internal factory to preserve strict typing when wrapping methods\r\nexport const createTelestackAuth = (config: TelestackConfig) => {\r\n let internalSession: any = null;\r\n let internalActiveOrg: any = null;\r\n let internalOrgs: any = null;\r\n\r\n // Inlining the plugins array is MANDATORY for Better Auth strict TypeScript inference.\r\n const rawClient = createAuthClient({\r\n baseURL: `${config.url}/api/v1/${config.tenantId}/auth`,\r\n fetchOptions: {\r\n ...config.fetchOptions,\r\n headers: {\r\n ...config.fetchOptions?.headers,\r\n ...(config.apiKey ? { \"X-Telestack-API-Key\": config.apiKey } : {})\r\n }\r\n },\r\n plugins: [\r\n magicLinkClient(),\r\n passkeyClient(),\r\n organizationClient(),\r\n ssoClient(),\r\n twoFactorClient(),\r\n usernameClient(),\r\n multiSessionClient(),\r\n jwtClient(),\r\n adminClient(),\r\n apiKeyClient(),\r\n phoneNumberClient(),\r\n emailOTPClient(),\r\n anonymousClient(),\r\n genericOAuthClient(),\r\n oneTimeTokenClient(),\r\n deviceAuthorizationClient(),\r\n ...(config?.googleClientId ? [oneTapClient({ clientId: config.googleClientId })] : [])\r\n ]\r\n });\r\n\r\n // Subscribe to atoms for live updates while the closure lives\r\n const sessionAtom = (rawClient as any).useSession;\r\n if (sessionAtom) {\r\n sessionAtom.subscribe((state: any) => {\r\n internalSession = state?.data;\r\n });\r\n }\r\n\r\n const activeOrgAtom = (rawClient as any).organization?.useActiveOrganization;\r\n if (activeOrgAtom) {\r\n activeOrgAtom.subscribe((state: any) => {\r\n internalActiveOrg = state?.data;\r\n });\r\n }\r\n\r\n return {\r\n rawClient,\r\n auth: {\r\n signInWithEmail: rawClient.signIn.email,\r\n signInWithUsername: rawClient.signIn.username,\r\n signInWithPhone: rawClient.signIn.phoneNumber,\r\n signInWithGoogle: (options?: Parameters<typeof rawClient.signIn.social>[0]) => rawClient.signIn.social({ provider: \"google\", ...options }),\r\n signInWithGithub: (options?: Parameters<typeof rawClient.signIn.social>[0]) => rawClient.signIn.social({ provider: \"github\", ...options }),\r\n signInWithPasskey: rawClient.signIn.passkey,\r\n signInAnonymously: rawClient.signIn.anonymous,\r\n sendMagicLink: async (options: { email: string; callbackURL?: string }) => {\r\n return await rawClient.signIn.magicLink({\r\n email: options.email,\r\n callbackURL: options.callbackURL || window.location.href,\r\n });\r\n },\r\n signInWithMagicLink: rawClient.signIn.magicLink,\r\n sendOtp: async (options: { email: string }) => {\r\n return await rawClient.emailOtp.sendVerificationOtp({\r\n email: options.email,\r\n type: \"sign-in\"\r\n });\r\n },\r\n signInWithOtp: rawClient.signIn.emailOtp,\r\n signInWithSiwe: (rawClient as any).siwe?.signIn,\r\n signUpWithEmail: rawClient.signUp.email,\r\n signOut: rawClient.signOut,\r\n verifyEmail: rawClient.verifyEmail,\r\n forgetPassword: rawClient.forgetPassword,\r\n resetPassword: rawClient.resetPassword,\r\n },\r\n mfa: {\r\n enableTwoFactor: rawClient.twoFactor.enable,\r\n disableTwoFactor: rawClient.twoFactor.disable,\r\n sendOtp: rawClient.twoFactor.sendOtp,\r\n verifyOtp: rawClient.twoFactor.verifyTotp,\r\n },\r\n user: {\r\n getSession: async () => {\r\n const res = await (rawClient.getSession() as any);\r\n internalSession = res?.data;\r\n return res;\r\n },\r\n listSessions: rawClient.listSessions,\r\n updateProfile: rawClient.updateUser,\r\n changeEmail: rawClient.changeEmail,\r\n changePassword: rawClient.changePassword,\r\n deleteAccount: rawClient.deleteUser,\r\n },\r\n organization: {\r\n create: rawClient.organization.create,\r\n update: rawClient.organization.update,\r\n setActive: rawClient.organization.setActive,\r\n list: async () => {\r\n const res = await (rawClient.organization.list() as any);\r\n internalOrgs = res?.data;\r\n return res;\r\n },\r\n inviteMember: rawClient.organization.inviteMember,\r\n acceptInvitation: rawClient.organization.acceptInvitation,\r\n rejectInvitation: rawClient.organization.rejectInvitation,\r\n removeMember: rawClient.organization.removeMember,\r\n },\r\n admin: {\r\n listUsers: rawClient.admin.listUsers,\r\n impersonateUser: rawClient.admin.impersonateUser,\r\n banUser: rawClient.admin.banUser,\r\n },\r\n sso: {\r\n signIn: rawClient.signIn.sso,\r\n register: rawClient.sso.register,\r\n },\r\n apiKey: {\r\n create: rawClient.apiKey.create,\r\n list: rawClient.apiKey.list,\r\n delete: rawClient.apiKey.delete\r\n },\r\n /**\r\n * The Advanced User Context. Provides stateful access to user attributes,\r\n * security status, and organizational roles without constant API calls.\r\n */\r\n get currentUser() {\r\n return {\r\n get profile() {\r\n return internalSession?.user;\r\n },\r\n get security() {\r\n return {\r\n mfaEnabled: internalSession?.user?.twoFactorEnabled || false,\r\n lastLogin: internalSession?.user?.updatedAt,\r\n isAnonymous: internalSession?.user?.isAnonymous || false,\r\n };\r\n },\r\n get organizations() {\r\n return {\r\n active: internalActiveOrg,\r\n all: internalOrgs,\r\n };\r\n },\r\n get session() {\r\n return {\r\n id: internalSession?.session?.id,\r\n expiresAt: internalSession?.session?.expiresAt,\r\n userAgent: internalSession?.session?.userAgent,\r\n };\r\n },\r\n };\r\n },\r\n /**\r\n * Listens for authentication state changes (sign-in, sign-out, session refresh).\r\n */\r\n onAuthStateChanged(callback: (user: any | null) => void) {\r\n const atom = (rawClient as any).useSession;\r\n if (atom) {\r\n return atom.subscribe((state: any) => {\r\n callback(state?.data?.user || null);\r\n });\r\n }\r\n return () => { };\r\n },\r\n /**\r\n * Forces a synchronization of the local auth state with the server.\r\n */\r\n async syncState() {\r\n const session = await (rawClient.getSession() as any);\r\n internalSession = session?.data;\r\n if (rawClient.organization) {\r\n const [orgs, activeOrg] = await Promise.all([\r\n (rawClient.organization as any).list(),\r\n (rawClient.organization as any).getActiveOrganization()\r\n ]);\r\n internalOrgs = (orgs as any)?.data;\r\n internalActiveOrg = (activeOrg as any)?.data;\r\n }\r\n return session;\r\n }\r\n };\r\n};\r\n\r\nexport type TelestackAuthInstance = ReturnType<typeof createTelestackAuth>;\r\n\r\n/**\r\n * The core singleton SDK for TelestackAuth.\r\n * Designed entirely for extreme developer experience and Firebase-style fluency.\r\n */\r\nexport class TelestackAuth {\r\n private static instance: TelestackAuthInstance | null = null;\r\n private static config: TelestackConfig | null = null;\r\n\r\n /**\r\n * Initializes the TelestackAuth SDK. Must be called once at app startup.\r\n */\r\n public static initialize(config: TelestackConfig): TelestackAuthInstance {\r\n this.config = config;\r\n this.instance = createTelestackAuth(config);\r\n return this.instance;\r\n }\r\n\r\n /**\r\n * Updates the SDK configuration (e.g., adding a token).\r\n */\r\n public static updateConfig(config: Partial<TelestackConfig>): TelestackAuthInstance {\r\n if (!this.config) throw new Error(\"Initialize SDK first\");\r\n this.config = { ...this.config, ...config };\r\n this.instance = createTelestackAuth(this.config);\r\n return this.instance;\r\n }\r\n\r\n /**\r\n * Sets the Bearer token for all subsequent requests.\r\n */\r\n public static setToken(token: string): TelestackAuthInstance {\r\n if (!this.config) throw new Error(\"Initialize SDK first\");\r\n return this.updateConfig({\r\n fetchOptions: {\r\n ...this.config.fetchOptions,\r\n headers: {\r\n ...this.config.fetchOptions?.headers,\r\n \"Authorization\": `Bearer ${token}`\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves the initialized instance of the SDK.\r\n */\r\n public static getInstance(): TelestackAuthInstance {\r\n if (!this.instance) {\r\n throw new Error(\"TelestackAuth has not been initialized. Call initialize(config) first.\");\r\n }\r\n return this.instance;\r\n }\r\n}\r\n\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createAuthClient } from \"better-auth/client\";\r\nimport {\r\n magicLinkClient,\r\n organizationClient,\r\n twoFactorClient,\r\n usernameClient,\r\n multiSessionClient,\r\n jwtClient,\r\n adminClient,\r\n phoneNumberClient,\r\n emailOTPClient,\r\n oneTapClient,\r\n genericOAuthClient,\r\n oneTimeTokenClient,\r\n deviceAuthorizationClient,\r\n anonymousClient,\r\n} from \"better-auth/client/plugins\";\r\nimport { passkeyClient } from \"@better-auth/passkey/client\";\r\nimport { ssoClient } from \"@better-auth/sso/client\";\r\nimport { apiKeyClient } from \"@better-auth/api-key/client\";\r\n\r\nexport interface TelestackConfig {\r\n url: string;\r\n tenantId: string;\r\n apiKey?: string;\r\n googleClientId?: string;\r\n fetchOptions?: any;\r\n}\r\n\r\n// Internal factory to preserve strict typing when wrapping methods\r\nexport const createTelestackAuth = (config: TelestackConfig) => {\r\n let internalSession: any = null;\r\n let internalActiveOrg: any = null;\r\n let internalOrgs: any = null;\r\n\r\n // Inlining the plugins array is MANDATORY for Better Auth strict TypeScript inference.\r\n const rawClient = createAuthClient({\r\n baseURL: `${config.url}/api/v1/${config.tenantId}/auth`,\r\n fetchOptions: {\r\n ...config.fetchOptions,\r\n headers: {\r\n ...config.fetchOptions?.headers,\r\n ...(config.apiKey ? { \"X-Telestack-API-Key\": config.apiKey } : {})\r\n }\r\n },\r\n plugins: [\r\n magicLinkClient(),\r\n passkeyClient(),\r\n organizationClient(),\r\n ssoClient(),\r\n twoFactorClient(),\r\n usernameClient(),\r\n multiSessionClient(),\r\n jwtClient(),\r\n adminClient(),\r\n apiKeyClient(),\r\n phoneNumberClient(),\r\n emailOTPClient(),\r\n anonymousClient(),\r\n genericOAuthClient(),\r\n oneTimeTokenClient(),\r\n deviceAuthorizationClient(),\r\n ...(config?.googleClientId ? [oneTapClient({ clientId: config.googleClientId })] : [])\r\n ]\r\n });\r\n\r\n // Subscribe to atoms for live updates while the closure lives\r\n const sessionAtom = (rawClient as any).useSession;\r\n if (sessionAtom) {\r\n sessionAtom.subscribe((state: any) => {\r\n internalSession = state?.data;\r\n });\r\n }\r\n\r\n const activeOrgAtom = (rawClient as any).organization?.useActiveOrganization;\r\n if (activeOrgAtom) {\r\n activeOrgAtom.subscribe((state: any) => {\r\n internalActiveOrg = state?.data;\r\n });\r\n }\r\n\r\n return {\r\n rawClient,\r\n auth: {\r\n signInWithEmail: rawClient.signIn.email,\r\n signInWithUsername: rawClient.signIn.username,\r\n signInWithPhone: rawClient.signIn.phoneNumber,\r\n sendPhoneOtp: rawClient.phoneNumber.sendOtp,\r\n verifyPhoneOtp: rawClient.phoneNumber.verify,\r\n signInWithGoogle: (options?: Parameters<typeof rawClient.signIn.social>[0]) => rawClient.signIn.social({ provider: \"google\", ...options }),\r\n signInWithGithub: (options?: Parameters<typeof rawClient.signIn.social>[0]) => rawClient.signIn.social({ provider: \"github\", ...options }),\r\n signInWithPasskey: rawClient.signIn.passkey,\r\n signInAnonymously: rawClient.signIn.anonymous,\r\n sendMagicLink: async (options: { email: string; callbackURL?: string }) => {\r\n return await rawClient.signIn.magicLink({\r\n email: options.email,\r\n callbackURL: options.callbackURL || window.location.href,\r\n });\r\n },\r\n signInWithMagicLink: rawClient.signIn.magicLink,\r\n sendOtp: async (options: { email: string }) => {\r\n return await rawClient.emailOtp.sendVerificationOtp({\r\n email: options.email,\r\n type: \"sign-in\"\r\n });\r\n },\r\n signInWithOtp: rawClient.signIn.emailOtp,\r\n signInWithSiwe: (rawClient as any).siwe?.signIn,\r\n signUpWithEmail: rawClient.signUp.email,\r\n signOut: rawClient.signOut,\r\n verifyEmail: rawClient.verifyEmail,\r\n forgetPassword: rawClient.forgetPassword,\r\n resetPassword: rawClient.resetPassword,\r\n },\r\n mfa: {\r\n enableTwoFactor: rawClient.twoFactor.enable,\r\n disableTwoFactor: rawClient.twoFactor.disable,\r\n sendOtp: rawClient.twoFactor.sendOtp,\r\n verifyOtp: rawClient.twoFactor.verifyTotp,\r\n },\r\n user: {\r\n getSession: async () => {\r\n const res = await (rawClient.getSession() as any);\r\n internalSession = res?.data;\r\n return res;\r\n },\r\n listSessions: rawClient.listSessions,\r\n updateProfile: rawClient.updateUser,\r\n changeEmail: rawClient.changeEmail,\r\n changePassword: rawClient.changePassword,\r\n deleteAccount: rawClient.deleteUser,\r\n },\r\n organization: {\r\n create: rawClient.organization.create,\r\n update: rawClient.organization.update,\r\n setActive: rawClient.organization.setActive,\r\n list: async () => {\r\n const res = await (rawClient.organization.list() as any);\r\n internalOrgs = res?.data;\r\n return res;\r\n },\r\n inviteMember: rawClient.organization.inviteMember,\r\n acceptInvitation: rawClient.organization.acceptInvitation,\r\n rejectInvitation: rawClient.organization.rejectInvitation,\r\n removeMember: rawClient.organization.removeMember,\r\n },\r\n admin: {\r\n listUsers: rawClient.admin.listUsers,\r\n impersonateUser: rawClient.admin.impersonateUser,\r\n banUser: rawClient.admin.banUser,\r\n },\r\n sso: {\r\n signIn: rawClient.signIn.sso,\r\n register: rawClient.sso.register,\r\n },\r\n apiKey: {\r\n create: rawClient.apiKey.create,\r\n list: rawClient.apiKey.list,\r\n delete: rawClient.apiKey.delete\r\n },\r\n /**\r\n * The Advanced User Context. Provides stateful access to user attributes,\r\n * security status, and organizational roles without constant API calls.\r\n */\r\n get currentUser() {\r\n return {\r\n get profile() {\r\n return internalSession?.user;\r\n },\r\n get security() {\r\n return {\r\n mfaEnabled: internalSession?.user?.twoFactorEnabled || false,\r\n lastLogin: internalSession?.user?.updatedAt,\r\n isAnonymous: internalSession?.user?.isAnonymous || false,\r\n };\r\n },\r\n get organizations() {\r\n return {\r\n active: internalActiveOrg,\r\n all: internalOrgs,\r\n };\r\n },\r\n get session() {\r\n return {\r\n id: internalSession?.session?.id,\r\n expiresAt: internalSession?.session?.expiresAt,\r\n userAgent: internalSession?.session?.userAgent,\r\n };\r\n },\r\n };\r\n },\r\n /**\r\n * Listens for authentication state changes (sign-in, sign-out, session refresh).\r\n */\r\n onAuthStateChanged(callback: (user: any | null) => void) {\r\n const atom = (rawClient as any).useSession;\r\n if (atom) {\r\n return atom.subscribe((state: any) => {\r\n callback(state?.data?.user || null);\r\n });\r\n }\r\n return () => { };\r\n },\r\n /**\r\n * Forces a synchronization of the local auth state with the server.\r\n */\r\n async syncState() {\r\n const session = await (rawClient.getSession() as any);\r\n internalSession = session?.data;\r\n if (rawClient.organization) {\r\n const [orgs, activeOrg] = await Promise.all([\r\n (rawClient.organization as any).list(),\r\n (rawClient.organization as any).getActiveOrganization()\r\n ]);\r\n internalOrgs = (orgs as any)?.data;\r\n internalActiveOrg = (activeOrg as any)?.data;\r\n }\r\n return session;\r\n }\r\n };\r\n};\r\n\r\nexport type TelestackAuthInstance = ReturnType<typeof createTelestackAuth>;\r\n\r\n/**\r\n * The core singleton SDK for TelestackAuth.\r\n * Designed entirely for extreme developer experience and Firebase-style fluency.\r\n */\r\nexport class TelestackAuth {\r\n private static instance: TelestackAuthInstance | null = null;\r\n private static config: TelestackConfig | null = null;\r\n\r\n /**\r\n * Initializes the TelestackAuth SDK. Must be called once at app startup.\r\n */\r\n public static initialize(config: TelestackConfig): TelestackAuthInstance {\r\n this.config = config;\r\n this.instance = createTelestackAuth(config);\r\n return this.instance;\r\n }\r\n\r\n /**\r\n * Updates the SDK configuration (e.g., adding a token).\r\n */\r\n public static updateConfig(config: Partial<TelestackConfig>): TelestackAuthInstance {\r\n if (!this.config) throw new Error(\"Initialize SDK first\");\r\n this.config = { ...this.config, ...config };\r\n this.instance = createTelestackAuth(this.config);\r\n return this.instance;\r\n }\r\n\r\n /**\r\n * Sets the Bearer token for all subsequent requests.\r\n */\r\n public static setToken(token: string): TelestackAuthInstance {\r\n if (!this.config) throw new Error(\"Initialize SDK first\");\r\n return this.updateConfig({\r\n fetchOptions: {\r\n ...this.config.fetchOptions,\r\n headers: {\r\n ...this.config.fetchOptions?.headers,\r\n \"Authorization\": `Bearer ${token}`\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves the initialized instance of the SDK.\r\n */\r\n public static getInstance(): TelestackAuthInstance {\r\n if (!this.instance) {\r\n throw new Error(\"TelestackAuth has not been initialized. Call initialize(config) first.\");\r\n }\r\n return this.instance;\r\n }\r\n}\r\n\r\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telestack/auth-sdk",
3
- "version": "1.1.2",
3
+ "version": "1.2.1",
4
4
  "description": "Firebase-style fluent SDK for TelestackAuth",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",