@uninspired/auth-client 0.0.18 → 1.0.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/README.md CHANGED
@@ -12,4 +12,4 @@ To run:
12
12
  bun run src/index.ts
13
13
  ```
14
14
 
15
- This project was created using `bun init` in bun v1.2.22. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime.
15
+ This project was created using `bun init` in bun v1.2.3. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
@@ -0,0 +1,24 @@
1
+ import { UserPurchases } from "./types/src/purchases.js";
2
+ import { Session } from "./types/src/session.js";
3
+ //#region src/AuthClient.d.ts
4
+ declare class AuthClient {
5
+ #private;
6
+ constructor(apiUrl: string, frontendUrl: string, cookie?: string);
7
+ getSession: () => Promise<Session | null>;
8
+ getPurchases: () => Promise<UserPurchases | null>;
9
+ getLoginUrl: (options?: {
10
+ redirectUrl?: string;
11
+ appName?: string;
12
+ }) => string;
13
+ getCheckoutUrl: (options: {
14
+ priceId: string;
15
+ discountCode?: string;
16
+ successUrl?: string;
17
+ quantity?: number;
18
+ }) => string;
19
+ newsletterSubscribe: (email: string, userGroup?: string, callbackUrl?: string) => Promise<void>;
20
+ newsletterUnsubscribe: (email: string) => Promise<void>;
21
+ }
22
+ //#endregion
23
+ export { AuthClient };
24
+ //# sourceMappingURL=AuthClient.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{emailOTPClient as e,magicLinkClient as t}from"better-auth/client/plugins";import{passkeyClient as n}from"@better-auth/passkey/client";import{createAuthClient as r}from"better-auth/client";import{hc as i}from"hono/client";var a=class{#e;#t;#n;#r;constructor(a,o,s){this.#e=o,this.#t=r({baseURL:a,plugins:[t(),e(),n()],headers:{cookie:s}}),this.#n=i(new URL(`/api/app`,a).toString(),{fetch:(e,t)=>fetch(e,{...t,credentials:`include`})}),this.#r=i(new URL(`/api/mailing-list`,a).toString(),{fetch:(e,t)=>fetch(e,{...t,credentials:`include`})})}getSession=async()=>{let{data:e,error:t}=await this.#t.getSession();if(t)throw t;return e};getPurchases=async()=>{let e=await this.#n.purchases.$get();if(!e.ok)throw Error(`Failed to get purchases`,{cause:await e.text()});return await e.json()};#i=(e,t)=>JSON.stringify({type:`redirect`,redirectUrl:e,appName:t});getLoginUrl=e=>{let t=new URL(`/login`,this.#e);return e?.redirectUrl&&t.searchParams.set(`intent`,this.#i(e.redirectUrl,e.appName)),t.toString()};getCheckoutUrl=e=>{let t=new URL(`/auth/checkout`,this.#e);return t.searchParams.set(`priceId`,e.priceId),e.discountCode&&t.searchParams.set(`discountCode`,e.discountCode),e.successUrl&&t.searchParams.set(`successUrl`,e.successUrl),t.searchParams.set(`quantity`,e.quantity?.toString()??`1`),t.toString()};newsletterSubscribe=async(e,t,n)=>{let r=await this.#r.subscribe.$post({json:{email:e,userGroup:t??`us-auth`,callbackUrl:n??``}});if(!r.ok)throw Error(await r.text())};newsletterUnsubscribe=async e=>{let t=await this.#r.unsubscribe.$post({query:{email:e}});if(!t.ok)throw Error(await t.text())}};export{a as AuthClient};
2
+ //# sourceMappingURL=AuthClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthClient.js","names":["#frontendUrl","#authClient","#appClient","#mailingListClient","#getRedirectIntent"],"sources":["../src/AuthClient.ts"],"sourcesContent":["import { magicLinkClient, emailOTPClient } from \"better-auth/client/plugins\";\nimport { passkeyClient } from \"@better-auth/passkey/client\";\nimport { createAuthClient } from \"better-auth/client\";\nimport { hc } from \"hono/client\";\nimport type { AppRouter, MailingListRouter } from \"@us-auth/api\";\nimport type { UserPurchases, Session, RedirectIntent } from \"@us-auth/types\";\n\nexport class AuthClient {\n #frontendUrl: string;\n #authClient;\n #appClient: ReturnType<typeof hc<AppRouter>>;\n #mailingListClient: ReturnType<typeof hc<MailingListRouter>>;\n\n constructor(apiUrl: string, frontendUrl: string, cookie?: string) {\n this.#frontendUrl = frontendUrl;\n this.#authClient = createAuthClient({\n baseURL: apiUrl,\n plugins: [magicLinkClient(), emailOTPClient(), passkeyClient()],\n headers: {\n cookie,\n },\n });\n this.#appClient = hc<AppRouter>(new URL(\"/api/app\", apiUrl).toString(), {\n fetch: (url: any, init: any) =>\n fetch(url, {\n ...init,\n credentials: \"include\",\n }),\n });\n this.#mailingListClient = hc<MailingListRouter>(\n new URL(\"/api/mailing-list\", apiUrl).toString(),\n {\n fetch: (url: any, init: any) =>\n fetch(url, {\n ...init,\n credentials: \"include\",\n }),\n },\n );\n }\n\n getSession = async (): Promise<Session | null> => {\n const { data, error } = await this.#authClient.getSession();\n if (error) {\n throw error;\n }\n return data;\n };\n\n getPurchases = async (): Promise<UserPurchases | null> => {\n const res = await this.#appClient.purchases.$get();\n if (!res.ok) {\n throw new Error(\"Failed to get purchases\", {\n cause: await res.text(),\n });\n }\n const data = await res.json();\n return data;\n };\n\n #getRedirectIntent = (redirectUrl: string, appName?: string) => {\n return JSON.stringify({\n type: \"redirect\",\n redirectUrl,\n appName,\n } satisfies RedirectIntent);\n };\n\n getLoginUrl = (options?: { redirectUrl?: string; appName?: string }) => {\n const url = new URL(\"/login\", this.#frontendUrl);\n if (options?.redirectUrl) {\n url.searchParams.set(\n \"intent\",\n this.#getRedirectIntent(options.redirectUrl, options.appName),\n );\n }\n return url.toString();\n };\n\n getCheckoutUrl = (options: {\n priceId: string;\n discountCode?: string;\n successUrl?: string;\n quantity?: number;\n }) => {\n const url = new URL(\"/auth/checkout\", this.#frontendUrl);\n url.searchParams.set(\"priceId\", options.priceId);\n if (options.discountCode) {\n url.searchParams.set(\"discountCode\", options.discountCode);\n }\n if (options.successUrl) {\n url.searchParams.set(\"successUrl\", options.successUrl);\n }\n url.searchParams.set(\"quantity\", options.quantity?.toString() ?? \"1\");\n return url.toString();\n };\n\n newsletterSubscribe = async (\n email: string,\n userGroup?: string,\n callbackUrl?: string,\n ): Promise<void> => {\n const res = await this.#mailingListClient.subscribe.$post({\n json: {\n email,\n userGroup: userGroup ?? \"us-auth\",\n callbackUrl: callbackUrl ?? \"\",\n },\n });\n if (!res.ok) {\n throw new Error(await res.text());\n }\n return;\n };\n\n newsletterUnsubscribe = async (email: string): Promise<void> => {\n const res = await this.#mailingListClient.unsubscribe.$post({\n query: {\n email,\n },\n });\n if (!res.ok) {\n throw new Error(await res.text());\n }\n return;\n };\n}\n"],"mappings":"oOAOA,IAAa,EAAb,KAAwB,CACtB,GACA,GACA,GACA,GAEA,YAAY,EAAgB,EAAqB,EAAiB,CAChE,MAAA,EAAoB,EACpB,MAAA,EAAmB,EAAiB,CAClC,QAAS,EACT,QAAS,CAAC,GAAiB,CAAE,GAAgB,CAAE,GAAe,CAAC,CAC/D,QAAS,CACP,SACD,CACF,CAAC,CACF,MAAA,EAAkB,EAAc,IAAI,IAAI,WAAY,EAAO,CAAC,UAAU,CAAE,CACtE,OAAQ,EAAU,IAChB,MAAM,EAAK,CACT,GAAG,EACH,YAAa,UACd,CAAC,CACL,CAAC,CACF,MAAA,EAA0B,EACxB,IAAI,IAAI,oBAAqB,EAAO,CAAC,UAAU,CAC/C,CACE,OAAQ,EAAU,IAChB,MAAM,EAAK,CACT,GAAG,EACH,YAAa,UACd,CAAC,CACL,CACF,CAGH,WAAa,SAAqC,CAChD,GAAM,CAAE,OAAM,SAAU,MAAM,MAAA,EAAiB,YAAY,CAC3D,GAAI,EACF,MAAM,EAER,OAAO,GAGT,aAAe,SAA2C,CACxD,IAAM,EAAM,MAAM,MAAA,EAAgB,UAAU,MAAM,CAClD,GAAI,CAAC,EAAI,GACP,MAAU,MAAM,0BAA2B,CACzC,MAAO,MAAM,EAAI,MAAM,CACxB,CAAC,CAGJ,OADa,MAAM,EAAI,MAAM,EAI/B,IAAsB,EAAqB,IAClC,KAAK,UAAU,CACpB,KAAM,WACN,cACA,UACD,CAA0B,CAG7B,YAAe,GAAyD,CACtE,IAAM,EAAM,IAAI,IAAI,SAAU,MAAA,EAAkB,CAOhD,OANI,GAAS,aACX,EAAI,aAAa,IACf,SACA,MAAA,EAAwB,EAAQ,YAAa,EAAQ,QAAQ,CAC9D,CAEI,EAAI,UAAU,EAGvB,eAAkB,GAKZ,CACJ,IAAM,EAAM,IAAI,IAAI,iBAAkB,MAAA,EAAkB,CASxD,OARA,EAAI,aAAa,IAAI,UAAW,EAAQ,QAAQ,CAC5C,EAAQ,cACV,EAAI,aAAa,IAAI,eAAgB,EAAQ,aAAa,CAExD,EAAQ,YACV,EAAI,aAAa,IAAI,aAAc,EAAQ,WAAW,CAExD,EAAI,aAAa,IAAI,WAAY,EAAQ,UAAU,UAAU,EAAI,IAAI,CAC9D,EAAI,UAAU,EAGvB,oBAAsB,MACpB,EACA,EACA,IACkB,CAClB,IAAM,EAAM,MAAM,MAAA,EAAwB,UAAU,MAAM,CACxD,KAAM,CACJ,QACA,UAAW,GAAa,UACxB,YAAa,GAAe,GAC7B,CACF,CAAC,CACF,GAAI,CAAC,EAAI,GACP,MAAU,MAAM,MAAM,EAAI,MAAM,CAAC,EAKrC,sBAAwB,KAAO,IAAiC,CAC9D,IAAM,EAAM,MAAM,MAAA,EAAwB,YAAY,MAAM,CAC1D,MAAO,CACL,QACD,CACF,CAAC,CACF,GAAI,CAAC,EAAI,GACP,MAAU,MAAM,MAAM,EAAI,MAAM,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { UserPurchases } from "./types/src/purchases.js";
2
+ import { Session } from "./types/src/session.js";
3
+ import { AuthClient } from "./AuthClient.js";
4
+ import { AuthContext, AuthContextType } from "./react/AuthContext.js";
5
+ import { AuthProvider, AuthProviderProps } from "./react/AuthProvider.js";
6
+ import { useAuth } from "./react/useAuth.js";
7
+ export { AuthClient, AuthContext, AuthContextType, AuthProvider, AuthProviderProps, type Session, type UserPurchases, useAuth };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import{AuthClient as e}from"./AuthClient.js";import{AuthContext as t}from"./react/AuthContext.js";import{AuthProvider as n}from"./react/AuthProvider.js";import{useAuth as r}from"./react/useAuth.js";import"./react/index.js";export{e as AuthClient,t as AuthContext,n as AuthProvider,r as useAuth};
@@ -0,0 +1,22 @@
1
+ import { UserPurchases } from "../types/src/purchases.js";
2
+ import { Session } from "../types/src/session.js";
3
+ import { AuthClient } from "../AuthClient.js";
4
+ import * as react from "react";
5
+
6
+ //#region src/react/AuthContext.d.ts
7
+ type AuthContextType = {
8
+ session: Session | null;
9
+ isSessionFetching: boolean;
10
+ refetchSession: () => Promise<void>;
11
+ purchases: UserPurchases | null;
12
+ isPurchasesFetching: boolean;
13
+ refetchPurchases: () => Promise<void>;
14
+ getLoginUrl: AuthClient["getLoginUrl"];
15
+ getCheckoutUrl: AuthClient["getCheckoutUrl"];
16
+ isPurchased: (priceIds: string[]) => boolean;
17
+ isSubscribed: (priceIds: string[]) => boolean;
18
+ } | null;
19
+ declare const AuthContext: react.Context<AuthContextType>;
20
+ //#endregion
21
+ export { AuthContext, AuthContextType };
22
+ //# sourceMappingURL=AuthContext.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{createContext as e}from"react";const t=e(null);export{t as AuthContext};
2
+ //# sourceMappingURL=AuthContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthContext.js","names":[],"sources":["../../src/react/AuthContext.ts"],"sourcesContent":["import { createContext } from \"react\";\nimport type { UserPurchases, Session } from \"@us-auth/types\";\nimport type { AuthClient } from \"../AuthClient\";\n\nexport type AuthContextType = {\n session: Session | null;\n isSessionFetching: boolean;\n refetchSession: () => Promise<void>;\n purchases: UserPurchases | null;\n isPurchasesFetching: boolean;\n refetchPurchases: () => Promise<void>;\n getLoginUrl: AuthClient[\"getLoginUrl\"];\n getCheckoutUrl: AuthClient[\"getCheckoutUrl\"];\n isPurchased: (priceIds: string[]) => boolean;\n isSubscribed: (priceIds: string[]) => boolean;\n} | null;\n\nexport const AuthContext = createContext<AuthContextType>(null);\n"],"mappings":"sCAiBA,MAAa,EAAc,EAA+B,KAAK"}
@@ -0,0 +1,28 @@
1
+ import { UserPurchases } from "../types/src/purchases.js";
2
+ import { Session } from "../types/src/session.js";
3
+ import { AuthClient } from "../AuthClient.js";
4
+ import { PropsWithChildren } from "react";
5
+ import { QueryClient } from "@tanstack/react-query";
6
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
7
+
8
+ //#region src/react/AuthProvider.d.ts
9
+ interface AuthProviderProps extends PropsWithChildren {
10
+ authClient?: AuthClient;
11
+ queryClient?: QueryClient;
12
+ baseUrl: string;
13
+ frontendUrl: string;
14
+ initialSession?: Session | null;
15
+ initialPurchases?: UserPurchases | null;
16
+ }
17
+ declare const AuthProvider: ({
18
+ children,
19
+ baseUrl,
20
+ frontendUrl,
21
+ initialSession,
22
+ initialPurchases,
23
+ authClient: providedAuthClient,
24
+ queryClient: providedQueryClient
25
+ }: AuthProviderProps) => react_jsx_runtime0.JSX.Element;
26
+ //#endregion
27
+ export { AuthProvider, AuthProviderProps };
28
+ //# sourceMappingURL=AuthProvider.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{AuthClient as e}from"../AuthClient.js";import{AuthContext as t}from"./AuthContext.js";import{useCallback as n,useEffect as r,useMemo as i}from"react";import{QueryClient as a,useQuery as o}from"@tanstack/react-query";import{usePostHog as s}from"@posthog/react";import{jsx as c}from"react/jsx-runtime";const l=({children:l,baseUrl:u,frontendUrl:d,initialSession:f,initialPurchases:p,authClient:m,queryClient:h})=>{let g=s(),_=i(()=>m??new e(u,d),[u,m]),v=i(()=>h??new a,[h]),{data:y,isFetching:b,refetch:x}=o({queryKey:[`us-auth-session`],staleTime:10,initialData:f,queryFn:_.getSession},v);r(()=>{y?.user&&g&&g.get_distinct_id()!==y.user.id&&g.identify(y.user.id,{email:y.user.email})},[y,g]);let{data:S,isFetching:C,refetch:w}=o({queryKey:[`us-auth-purchases`],staleTime:10,initialData:p,queryFn:_.getPurchases},v),T=i(()=>_.getLoginUrl,[_]),E=i(()=>_.getCheckoutUrl,[_]),D=n(e=>S?S.paddle.transactions.some(t=>t.items.some(t=>e.includes(t))&&!t.adjustments.some(e=>e.status===`approved`&&e.action===`refund`&&e.type===`full`)):!1,[S]),O=n(e=>{if(!S)return!1;let t=S.paddle.subscriptions.some(t=>t.items.some(t=>e.includes(t))&&t.status===`active`),n=S.stripe.some(t=>t.status===`active`&&t.items.some(t=>e.includes(t)));return t||n},[S]);return c(t.Provider,{value:{session:y??null,isSessionFetching:b,refetchSession:async()=>{await x()},purchases:S??null,isPurchasesFetching:C,refetchPurchases:async()=>{await w()},getLoginUrl:T,getCheckoutUrl:E,isSubscribed:O,isPurchased:D},children:l})};export{l as AuthProvider};
2
+ //# sourceMappingURL=AuthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProvider.js","names":[],"sources":["../../src/react/AuthProvider.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, type PropsWithChildren } from \"react\";\nimport { AuthContext } from \"./AuthContext\";\nimport { AuthClient } from \"../AuthClient\";\nimport type { Session, UserPurchases } from \"@us-auth/types\";\nimport { QueryClient, useQuery } from \"@tanstack/react-query\";\nimport { usePostHog } from \"@posthog/react\";\n\nexport interface AuthProviderProps extends PropsWithChildren {\n authClient?: AuthClient;\n queryClient?: QueryClient;\n baseUrl: string;\n frontendUrl: string;\n initialSession?: Session | null;\n initialPurchases?: UserPurchases | null;\n}\n\nexport const AuthProvider = ({\n children,\n baseUrl,\n frontendUrl,\n initialSession,\n initialPurchases,\n authClient: providedAuthClient,\n queryClient: providedQueryClient,\n}: AuthProviderProps) => {\n const ph = usePostHog();\n\n const authClient = useMemo(\n () => providedAuthClient ?? new AuthClient(baseUrl, frontendUrl),\n [baseUrl, providedAuthClient],\n );\n const queryClient = useMemo(\n () => providedQueryClient ?? new QueryClient(),\n [providedQueryClient],\n );\n\n const {\n data: session,\n isFetching: isSessionFetching,\n refetch: refetchSession,\n } = useQuery(\n {\n queryKey: [\"us-auth-session\"],\n staleTime: 10,\n initialData: initialSession,\n queryFn: authClient.getSession,\n },\n queryClient,\n );\n\n useEffect(() => {\n if (session?.user && ph) {\n const distinctId = ph.get_distinct_id();\n if (distinctId !== session.user.id) {\n ph.identify(session.user.id, {\n email: session.user.email,\n });\n }\n }\n }, [session, ph]);\n\n const {\n data: purchases,\n isFetching: isPurchasesFetching,\n refetch: refetchPurchases,\n } = useQuery(\n {\n queryKey: [\"us-auth-purchases\"],\n staleTime: 10,\n initialData: initialPurchases,\n queryFn: authClient.getPurchases,\n },\n queryClient,\n );\n\n const getLoginUrl = useMemo(() => authClient.getLoginUrl, [authClient]);\n const getCheckoutUrl = useMemo(() => authClient.getCheckoutUrl, [authClient]);\n\n const isPurchased = useCallback(\n (priceIds: string[]): boolean => {\n if (!purchases) return false;\n return purchases.paddle.transactions.some(\n (tra) =>\n tra.items.some((item) => priceIds.includes(item)) &&\n !tra.adjustments.some(\n (adj) =>\n adj.status === \"approved\" &&\n adj.action === \"refund\" &&\n adj.type === \"full\",\n ),\n );\n },\n [purchases],\n );\n\n const isSubscribed = useCallback(\n (priceIds: string[]): boolean => {\n if (!purchases) return false;\n\n const paddleSubscriptions = purchases.paddle.subscriptions.some(\n (sub) =>\n sub.items.some((item) => priceIds.includes(item)) &&\n sub.status === \"active\",\n );\n\n const stripeSubscriptions = purchases.stripe.some(\n (sub) =>\n sub.status === \"active\" &&\n sub.items.some((item) => priceIds.includes(item)),\n );\n\n return paddleSubscriptions || stripeSubscriptions;\n },\n [purchases],\n );\n\n return (\n <AuthContext.Provider\n value={{\n session: session ?? null,\n isSessionFetching,\n refetchSession: async () => {\n await refetchSession();\n },\n purchases: purchases ?? null,\n isPurchasesFetching,\n refetchPurchases: async () => {\n await refetchPurchases();\n },\n getLoginUrl,\n getCheckoutUrl,\n isSubscribed,\n isPurchased,\n }}\n >\n {children}\n </AuthContext.Provider>\n );\n};\n"],"mappings":"mTAgBA,MAAa,GAAgB,CAC3B,WACA,UACA,cACA,iBACA,mBACA,WAAY,EACZ,YAAa,KACU,CACvB,IAAM,EAAK,GAAY,CAEjB,EAAa,MACX,GAAsB,IAAI,EAAW,EAAS,EAAY,CAChE,CAAC,EAAS,EAAmB,CAC9B,CACK,EAAc,MACZ,GAAuB,IAAI,EACjC,CAAC,EAAoB,CACtB,CAEK,CACJ,KAAM,EACN,WAAY,EACZ,QAAS,GACP,EACF,CACE,SAAU,CAAC,kBAAkB,CAC7B,UAAW,GACX,YAAa,EACb,QAAS,EAAW,WACrB,CACD,EACD,CAED,MAAgB,CACV,GAAS,MAAQ,GACA,EAAG,iBAAiB,GACpB,EAAQ,KAAK,IAC9B,EAAG,SAAS,EAAQ,KAAK,GAAI,CAC3B,MAAO,EAAQ,KAAK,MACrB,CAAC,EAGL,CAAC,EAAS,EAAG,CAAC,CAEjB,GAAM,CACJ,KAAM,EACN,WAAY,EACZ,QAAS,GACP,EACF,CACE,SAAU,CAAC,oBAAoB,CAC/B,UAAW,GACX,YAAa,EACb,QAAS,EAAW,aACrB,CACD,EACD,CAEK,EAAc,MAAc,EAAW,YAAa,CAAC,EAAW,CAAC,CACjE,EAAiB,MAAc,EAAW,eAAgB,CAAC,EAAW,CAAC,CAEvE,EAAc,EACjB,GACM,EACE,EAAU,OAAO,aAAa,KAClC,GACC,EAAI,MAAM,KAAM,GAAS,EAAS,SAAS,EAAK,CAAC,EACjD,CAAC,EAAI,YAAY,KACd,GACC,EAAI,SAAW,YACf,EAAI,SAAW,UACf,EAAI,OAAS,OAChB,CACJ,CAVsB,GAYzB,CAAC,EAAU,CACZ,CAEK,EAAe,EAClB,GAAgC,CAC/B,GAAI,CAAC,EAAW,MAAO,GAEvB,IAAM,EAAsB,EAAU,OAAO,cAAc,KACxD,GACC,EAAI,MAAM,KAAM,GAAS,EAAS,SAAS,EAAK,CAAC,EACjD,EAAI,SAAW,SAClB,CAEK,EAAsB,EAAU,OAAO,KAC1C,GACC,EAAI,SAAW,UACf,EAAI,MAAM,KAAM,GAAS,EAAS,SAAS,EAAK,CAAC,CACpD,CAED,OAAO,GAAuB,GAEhC,CAAC,EAAU,CACZ,CAED,OACE,EAAC,EAAY,SAAb,CACE,MAAO,CACL,QAAS,GAAW,KACpB,oBACA,eAAgB,SAAY,CAC1B,MAAM,GAAgB,EAExB,UAAW,GAAa,KACxB,sBACA,iBAAkB,SAAY,CAC5B,MAAM,GAAkB,EAE1B,cACA,iBACA,eACA,cACD,CAEA,WACoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { AuthContext, AuthContextType } from "./AuthContext.js";
2
+ import { AuthProvider, AuthProviderProps } from "./AuthProvider.js";
3
+ import { useAuth } from "./useAuth.js";
@@ -0,0 +1 @@
1
+ import"./AuthContext.js";import"./AuthProvider.js";import"./useAuth.js";
@@ -0,0 +1,19 @@
1
+ import { UserPurchases } from "../types/src/purchases.js";
2
+ import { Session } from "../types/src/session.js";
3
+ import { AuthClient } from "../AuthClient.js";
4
+ //#region src/react/useAuth.d.ts
5
+ declare function useAuth(): {
6
+ session: Session | null;
7
+ isSessionFetching: boolean;
8
+ refetchSession: () => Promise<void>;
9
+ purchases: UserPurchases | null;
10
+ isPurchasesFetching: boolean;
11
+ refetchPurchases: () => Promise<void>;
12
+ getLoginUrl: AuthClient["getLoginUrl"];
13
+ getCheckoutUrl: AuthClient["getCheckoutUrl"];
14
+ isPurchased: (priceIds: string[]) => boolean;
15
+ isSubscribed: (priceIds: string[]) => boolean;
16
+ };
17
+ //#endregion
18
+ export { useAuth };
19
+ //# sourceMappingURL=useAuth.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{AuthContext as e}from"./AuthContext.js";import{useContext as t}from"react";function n(){let n=t(e);if(!n)throw Error(`useAuth must be used within an AuthProvider`);return n}export{n as useAuth};
2
+ //# sourceMappingURL=useAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.js","names":[],"sources":["../../src/react/useAuth.ts"],"sourcesContent":["import { useContext } from \"react\";\nimport { AuthContext } from \"./AuthContext\";\n\nexport function useAuth() {\n const ctx = useContext(AuthContext);\n if (!ctx) {\n throw new Error(\"useAuth must be used within an AuthProvider\");\n }\n return ctx;\n}\n"],"mappings":"kFAGA,SAAgB,GAAU,CACxB,IAAM,EAAM,EAAW,EAAY,CACnC,GAAI,CAAC,EACH,MAAU,MAAM,8CAA8C,CAEhE,OAAO"}
@@ -0,0 +1,2 @@
1
+ import { UserPurchases, userPurchasesSchema } from "./purchases.js";
2
+ import { Session } from "./session.js";
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+
3
+ //#region ../types/src/purchases.d.ts
4
+ declare const userPurchasesSchema: z.ZodObject<{
5
+ stripe: z.ZodArray<z.ZodObject<{
6
+ id: z.ZodString;
7
+ customerId: z.ZodString;
8
+ created: z.ZodCoercedDate<unknown>;
9
+ status: z.ZodEnum<{
10
+ active: "active";
11
+ trialing: "trialing";
12
+ canceled: "canceled";
13
+ past_due: "past_due";
14
+ paused: "paused";
15
+ incomplete: "incomplete";
16
+ incomplete_expired: "incomplete_expired";
17
+ unpaid: "unpaid";
18
+ }>;
19
+ items: z.ZodArray<z.ZodString>;
20
+ }, z.core.$strip>>;
21
+ paddle: z.ZodObject<{
22
+ customerId: z.ZodOptional<z.ZodString>;
23
+ subscriptions: z.ZodArray<z.ZodObject<{
24
+ id: z.ZodString;
25
+ createdAt: z.ZodCoercedDate<unknown>;
26
+ status: z.ZodString;
27
+ items: z.ZodArray<z.ZodString>;
28
+ }, z.core.$strip>>;
29
+ transactions: z.ZodArray<z.ZodObject<{
30
+ id: z.ZodString;
31
+ createdAt: z.ZodCoercedDate<unknown>;
32
+ adjustments: z.ZodArray<z.ZodObject<{
33
+ id: z.ZodString;
34
+ createdAt: z.ZodCoercedDate<unknown>;
35
+ action: z.ZodEnum<{
36
+ credit: "credit";
37
+ refund: "refund";
38
+ chargeback: "chargeback";
39
+ chargeback_reverse: "chargeback_reverse";
40
+ chargeback_warning: "chargeback_warning";
41
+ chargeback_warning_reverse: "chargeback_warning_reverse";
42
+ credit_reverse: "credit_reverse";
43
+ }>;
44
+ type: z.ZodEnum<{
45
+ full: "full";
46
+ partial: "partial";
47
+ }>;
48
+ status: z.ZodEnum<{
49
+ pending_approval: "pending_approval";
50
+ approved: "approved";
51
+ rejected: "rejected";
52
+ reversed: "reversed";
53
+ }>;
54
+ }, z.core.$strip>>;
55
+ items: z.ZodArray<z.ZodString>;
56
+ }, z.core.$strip>>;
57
+ }, z.core.$strip>;
58
+ mailingList: z.ZodObject<{
59
+ subscribed: z.ZodBoolean;
60
+ }, z.core.$strip>;
61
+ }, z.core.$strip>;
62
+ type UserPurchases = z.infer<typeof userPurchasesSchema>;
63
+ //#endregion
64
+ export { UserPurchases, userPurchasesSchema };
65
+ //# sourceMappingURL=purchases.d.ts.map
@@ -0,0 +1,10 @@
1
+ import { Session, User } from "better-auth";
2
+
3
+ //#region ../types/src/session.d.ts
4
+ interface Session$1 {
5
+ session: Session;
6
+ user: User;
7
+ }
8
+ //#endregion
9
+ export { Session$1 as Session };
10
+ //# sourceMappingURL=session.d.ts.map
package/package.json CHANGED
@@ -1,37 +1,39 @@
1
1
  {
2
2
  "name": "@uninspired/auth-client",
3
- "version": "0.0.18",
3
+ "version": "1.0.1",
4
4
  "description": "Auth client for Uninspired Studio Products",
5
5
  "author": "Chris Kolb <chris@uninspired.studio>",
6
6
  "license": "MIT",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "type": "module",
7
11
  "files": [
8
12
  "package.json",
9
13
  "dist"
10
14
  ],
11
- "main": "dist/cjs/index.js",
12
- "module": "dist/esm/index.js",
13
- "types": "dist/types/index.d.ts",
14
- "type": "module",
15
15
  "scripts": {
16
- "build": "bun run scripts/build.ts"
16
+ "build": "tsdown --config tsdown.config.ts"
17
17
  },
18
18
  "devDependencies": {
19
+ "@us-auth/types": "workspace:*",
19
20
  "@types/bun": "latest",
20
- "@types/semver": "^7.7.1",
21
- "@us-accounts/api": "workspace:*",
22
- "@us-accounts/utils": "workspace:*",
23
- "rollup": "^4.52.5",
24
- "rollup-plugin-dts": "^6.2.3",
25
- "rollup-plugin-typescript": "^1.0.1",
26
- "rollup-plugin-typescript-paths": "^1.5.0",
27
- "semver": "^7.7.2"
21
+ "@types/react": "^19",
22
+ "@types/react-dom": "^19",
23
+ "@us-auth/api": "workspace:*",
24
+ "tsdown": "^0.21.3"
28
25
  },
29
26
  "peerDependencies": {
30
- "typescript": "^5"
27
+ "typescript": "^5",
28
+ "react": "^19",
29
+ "react-dom": "^19",
30
+ "@posthog/react": "^1.8.2"
31
31
  },
32
32
  "dependencies": {
33
- "better-auth": "^1.3.12",
34
- "hono": "^4.9.8",
35
- "zod": "^4"
33
+ "@better-auth/passkey": "^1.5.5",
34
+ "@tanstack/react-query": "^5.90.21",
35
+ "better-auth": "^1.5.4",
36
+ "hono": "^4.12.7",
37
+ "zod": "^4.3.6"
36
38
  }
37
39
  }
package/dist/cjs/index.js DELETED
@@ -1,212 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __moduleCache = /* @__PURE__ */ new WeakMap;
6
- var __toCommonJS = (from) => {
7
- var entry = __moduleCache.get(from), desc;
8
- if (entry)
9
- return entry;
10
- entry = __defProp({}, "__esModule", { value: true });
11
- if (from && typeof from === "object" || typeof from === "function")
12
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
- get: () => from[key],
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
- }));
16
- __moduleCache.set(from, entry);
17
- return entry;
18
- };
19
- var __export = (target, all) => {
20
- for (var name in all)
21
- __defProp(target, name, {
22
- get: all[name],
23
- enumerable: true,
24
- configurable: true,
25
- set: (newValue) => all[name] = () => newValue
26
- });
27
- };
28
-
29
- // src/index.ts
30
- var exports_src = {};
31
- __export(exports_src, {
32
- makeUsBetterAuthClient: () => makeUsBetterAuthClient,
33
- makeRedirectIntent: () => makeRedirectIntent,
34
- makePublicClient: () => makePublicClient,
35
- makeMailingListClient: () => makeMailingListClient,
36
- makeMailingListAdminClient: () => makeMailingListAdminClient,
37
- makeLoginUrl: () => makeLoginUrl,
38
- makeCheckoutUrl: () => makeCheckoutUrl,
39
- makeCheckoutClient: () => makeCheckoutClient,
40
- makeAppClient: () => makeAppClient,
41
- formatPrice: () => formatPrice
42
- });
43
- module.exports = __toCommonJS(exports_src);
44
-
45
- // src/clients/publicClient.ts
46
- var import_client = require("hono/client");
47
- var makePublicClient = (baseURL, options) => {
48
- return import_client.hc(baseURL, options);
49
- };
50
- // src/clients/appClient.ts
51
- var import_client2 = require("hono/client");
52
- var makeAppClient = (baseURL, options) => {
53
- return import_client2.hc(baseURL, {
54
- ...options,
55
- fetch: (url, init) => (options?.fetch ?? fetch)(url, {
56
- ...init,
57
- credentials: "include",
58
- headers: {
59
- ...init.headers,
60
- "Content-Type": "application/json"
61
- }
62
- })
63
- });
64
- };
65
- // src/clients/authClient.ts
66
- var import_plugins = require("better-auth/client/plugins");
67
- var import_react = require("better-auth/react");
68
- var makeUsBetterAuthClient = (baseURL) => {
69
- return import_react.createAuthClient({
70
- baseURL,
71
- plugins: [
72
- import_plugins.customSessionClient(),
73
- import_plugins.magicLinkClient(),
74
- import_plugins.emailOTPClient(),
75
- import_plugins.passkeyClient()
76
- ]
77
- });
78
- };
79
- // src/clients/checkoutClient.ts
80
- var import_client3 = require("hono/client");
81
- var makeCheckoutClient = (baseURL, options) => {
82
- return import_client3.hc(baseURL, {
83
- ...options,
84
- fetch: (url, init) => (options?.fetch ?? fetch)(url, {
85
- ...init,
86
- credentials: "include",
87
- headers: {
88
- ...init.headers,
89
- "Content-Type": "application/json"
90
- }
91
- })
92
- });
93
- };
94
- // src/clients/mailingListClient.ts
95
- var import_client4 = require("hono/client");
96
- var makeMailingListClient = (baseURL, publicKey, options) => {
97
- return import_client4.hc(baseURL, {
98
- ...options,
99
- headers: {
100
- ...options?.headers,
101
- "X-Public-Key": publicKey
102
- }
103
- });
104
- };
105
- // src/clients/mailingListAdminClient.ts
106
- var import_client5 = require("hono/client");
107
- var makeMailingListAdminClient = (baseURL, apiKey, options) => {
108
- return import_client5.hc(baseURL, {
109
- ...options,
110
- headers: {
111
- ...options?.headers,
112
- "X-API-Key": apiKey
113
- }
114
- });
115
- };
116
- // src/utils/intent.ts
117
- function makeLoginUrl(apiUrl, redirectUrl, appName) {
118
- const url = new URL("/login", apiUrl);
119
- if (redirectUrl) {
120
- url.searchParams.set("intent", makeRedirectIntent(redirectUrl, appName));
121
- }
122
- return url.toString();
123
- }
124
- function noop(...args) {}
125
- function makeCheckoutUrl(apiUrl, priceId, productId, discountCode, loginUrl, pricingUrl, successUrl) {
126
- const obj = {
127
- priceId,
128
- productId,
129
- discountCode,
130
- loginUrl,
131
- pricingUrl,
132
- successUrl
133
- };
134
- noop(obj);
135
- const url = new URL("/auth/checkout", apiUrl);
136
- url.searchParams.set("priceId", priceId);
137
- url.searchParams.set("productId", productId);
138
- if (discountCode) {
139
- url.searchParams.set("discountCode", discountCode);
140
- }
141
- if (loginUrl) {
142
- url.searchParams.set("loginUrl", loginUrl);
143
- }
144
- if (pricingUrl) {
145
- url.searchParams.set("pricingUrl", pricingUrl);
146
- }
147
- if (successUrl) {
148
- url.searchParams.set("successUrl", successUrl);
149
- }
150
- return url.toString();
151
- }
152
- function makeRedirectIntent(redirectUrl, appName) {
153
- const obj = {
154
- type: "redirect",
155
- redirectUrl,
156
- appName
157
- };
158
- return JSON.stringify(obj);
159
- }
160
- // ../utils/src/intent.ts
161
- var import_zod = require("zod");
162
- var checkoutIntentSchema = import_zod.z.object({
163
- type: import_zod.z.literal("checkout"),
164
- priceId: import_zod.z.string(),
165
- productId: import_zod.z.string(),
166
- discountCode: import_zod.z.string().optional(),
167
- loginUrl: import_zod.z.url().optional(),
168
- pricingUrl: import_zod.z.url().optional(),
169
- successUrl: import_zod.z.url().optional()
170
- });
171
- var redirectIntentSchema = import_zod.z.object({
172
- type: import_zod.z.literal("redirect"),
173
- redirectUrl: import_zod.z.url(),
174
- appName: import_zod.z.string().optional()
175
- });
176
- var intentSchema = import_zod.z.discriminatedUnion("type", [
177
- checkoutIntentSchema,
178
- redirectIntentSchema
179
- ]);
180
- var intentSearchSchema = import_zod.z.object({
181
- intent: intentSchema.optional()
182
- });
183
- // ../utils/src/checkout.ts
184
- var import_zod2 = require("zod");
185
- var checkoutSearchSchema = import_zod2.z.object({
186
- priceId: import_zod2.z.string(),
187
- productId: import_zod2.z.string(),
188
- discountCode: import_zod2.z.string().optional(),
189
- loginUrl: import_zod2.z.url().optional(),
190
- pricingUrl: import_zod2.z.url().optional(),
191
- successUrl: import_zod2.z.url().optional()
192
- });
193
- // ../utils/src/price.ts
194
- function formatPrice(amountStr, currencyCode) {
195
- const amount = parseInt(amountStr);
196
- if (!amount || !currencyCode)
197
- return null;
198
- const formatter = new Intl.NumberFormat("en-US", {
199
- style: "currency",
200
- currency: currencyCode
201
- });
202
- const parts = formatter.formatToParts(amount);
203
- const fractionDigits = parts.find((part) => part.type === "fraction")?.value.length || 0;
204
- const divisor = Math.pow(10, fractionDigits);
205
- return new Intl.NumberFormat("en-US", {
206
- style: "currency",
207
- currency: currencyCode
208
- }).format(amount / divisor);
209
- }
210
-
211
- //# debugId=2013C2F3B5BDF6CD64756E2164756E21
212
- //# sourceMappingURL=index.js.map
@@ -1,19 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/clients/publicClient.ts", "../../src/clients/appClient.ts", "../../src/clients/authClient.ts", "../../src/clients/checkoutClient.ts", "../../src/clients/mailingListClient.ts", "../../src/clients/mailingListAdminClient.ts", "../../src/utils/intent.ts", "../../../utils/src/intent.ts", "../../../utils/src/checkout.ts", "../../../utils/src/price.ts"],
4
- "sourcesContent": [
5
- "import type { PublicRouter } from \"@us-accounts/api\";\nimport { hc, type ClientRequestOptions } from \"hono/client\";\n\nexport type PublicClient = ReturnType<typeof hc<PublicRouter>>;\n\nexport const makePublicClient = (\n baseURL: string,\n options?: ClientRequestOptions,\n): PublicClient => {\n return hc<PublicRouter>(baseURL, options);\n};\n",
6
- "import type { AppRouter } from \"@us-accounts/api\";\nimport { hc, type ClientRequestOptions } from \"hono/client\";\n\nexport type AppClient = ReturnType<typeof hc<AppRouter>>;\n\nexport const makeAppClient = (\n baseURL: string,\n options?: ClientRequestOptions,\n): AppClient => {\n return hc<AppRouter>(baseURL, {\n ...options,\n fetch: (url: any, init: any) =>\n (options?.fetch ?? fetch)(url, {\n ...init,\n credentials: \"include\",\n headers: {\n ...init.headers,\n \"Content-Type\": \"application/json\",\n },\n }),\n });\n};\n",
7
- "import {\n customSessionClient,\n magicLinkClient,\n emailOTPClient,\n passkeyClient,\n} from \"better-auth/client/plugins\";\nimport { createAuthClient } from \"better-auth/react\";\nimport type { Auth } from \"@us-accounts/api\";\n\nexport const makeUsBetterAuthClient = (baseURL: string) => {\n return createAuthClient({\n baseURL,\n plugins: [\n customSessionClient<Auth>(),\n magicLinkClient(),\n emailOTPClient(),\n passkeyClient(),\n ],\n });\n};\n\nexport type AuthClient = ReturnType<typeof makeUsBetterAuthClient>;\n",
8
- "import type { CheckoutRouter } from \"@us-accounts/api\";\nimport { hc, type ClientRequestOptions } from \"hono/client\";\n\nexport type CheckoutClient = ReturnType<typeof hc<CheckoutRouter>>;\n\nexport const makeCheckoutClient = (\n baseURL: string,\n options?: ClientRequestOptions,\n): CheckoutClient => {\n return hc<CheckoutRouter>(baseURL, {\n ...options,\n fetch: (url: any, init: any) =>\n (options?.fetch ?? fetch)(url, {\n ...init,\n credentials: \"include\",\n headers: {\n ...init.headers,\n \"Content-Type\": \"application/json\",\n },\n }),\n });\n};\n",
9
- "import type { MailingListRouter } from \"@us-accounts/api\";\nimport { hc, type ClientRequestOptions } from \"hono/client\";\n\nexport type MailingListClient = ReturnType<typeof hc<MailingListRouter>>;\n\nexport const makeMailingListClient = (\n baseURL: string,\n publicKey: string,\n options?: ClientRequestOptions,\n): MailingListClient => {\n return hc<MailingListRouter>(baseURL, {\n ...options,\n headers: {\n ...options?.headers,\n \"X-Public-Key\": publicKey,\n },\n });\n};\n",
10
- "import type { MailingListAdminRouter } from \"@us-accounts/api\";\nimport { hc, type ClientRequestOptions } from \"hono/client\";\n\nexport type MailingListAdminClient = ReturnType<\n typeof hc<MailingListAdminRouter>\n>;\n\nexport const makeMailingListAdminClient = (\n baseURL: string,\n apiKey: string,\n options?: ClientRequestOptions,\n): MailingListAdminClient => {\n return hc<MailingListAdminRouter>(baseURL, {\n ...options,\n headers: {\n ...options?.headers,\n \"X-API-Key\": apiKey,\n },\n });\n};\n",
11
- "import type { CheckoutSearch, RedirectIntent } from \"@us-accounts/utils\";\n\nexport function makeLoginUrl(\n apiUrl: string,\n redirectUrl?: string,\n appName?: string,\n) {\n const url = new URL(\"/login\", apiUrl);\n if (redirectUrl) {\n url.searchParams.set(\"intent\", makeRedirectIntent(redirectUrl, appName));\n }\n return url.toString();\n}\n\nfunction noop(...args: any[]) {\n // Do nothing\n}\n\nexport function makeCheckoutUrl(\n apiUrl: string,\n priceId: string,\n productId: string,\n discountCode?: string,\n loginUrl?: string,\n pricingUrl?: string,\n successUrl?: string,\n) {\n const obj = {\n priceId,\n productId,\n discountCode,\n loginUrl,\n pricingUrl,\n successUrl,\n } satisfies CheckoutSearch;\n noop(obj);\n\n const url = new URL(\"/auth/checkout\", apiUrl);\n url.searchParams.set(\"priceId\", priceId);\n url.searchParams.set(\"productId\", productId);\n if (discountCode) {\n url.searchParams.set(\"discountCode\", discountCode);\n }\n if (loginUrl) {\n url.searchParams.set(\"loginUrl\", loginUrl);\n }\n if (pricingUrl) {\n url.searchParams.set(\"pricingUrl\", pricingUrl);\n }\n if (successUrl) {\n url.searchParams.set(\"successUrl\", successUrl);\n }\n return url.toString();\n}\n\nexport function makeRedirectIntent(\n redirectUrl: string,\n appName?: string,\n): string {\n const obj = {\n type: \"redirect\",\n redirectUrl,\n appName,\n } satisfies RedirectIntent;\n\n return JSON.stringify(obj);\n}\n",
12
- "import { z } from \"zod\";\n\nexport const checkoutIntentSchema = z.object({\n type: z.literal(\"checkout\"),\n priceId: z.string(),\n productId: z.string(),\n discountCode: z.string().optional(),\n loginUrl: z.url().optional(),\n pricingUrl: z.url().optional(),\n successUrl: z.url().optional(),\n});\nexport type CheckoutIntent = z.infer<typeof checkoutIntentSchema>;\n\nexport const redirectIntentSchema = z.object({\n type: z.literal(\"redirect\"),\n redirectUrl: z.url(),\n appName: z.string().optional(),\n});\nexport type RedirectIntent = z.infer<typeof redirectIntentSchema>;\n\nexport const intentSchema = z.discriminatedUnion(\"type\", [\n checkoutIntentSchema,\n redirectIntentSchema,\n]);\nexport type Intent = z.infer<typeof intentSchema>;\n\nexport const intentSearchSchema = z.object({\n intent: intentSchema.optional(),\n});\n",
13
- "import { z } from \"zod\";\n\nexport const checkoutSearchSchema = z.object({\n priceId: z.string(),\n productId: z.string(),\n discountCode: z.string().optional(),\n loginUrl: z.url().optional(),\n pricingUrl: z.url().optional(),\n successUrl: z.url().optional(),\n});\n\nexport type CheckoutSearch = z.infer<typeof checkoutSearchSchema>;\n",
14
- "export function formatPrice(amountStr: string, currencyCode: string) {\n const amount = parseInt(amountStr);\n\n if (!amount || !currencyCode) return null;\n const formatter = new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: currencyCode,\n });\n\n const parts = formatter.formatToParts(amount);\n const fractionDigits =\n parts.find((part) => part.type === \"fraction\")?.value.length || 0;\n\n // Calculate the divisor based on decimal places\n const divisor = Math.pow(10, fractionDigits);\n\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: currencyCode,\n }).format(amount / divisor);\n}\n"
15
- ],
16
- "mappings": "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",
17
- "debugId": "2013C2F3B5BDF6CD64756E2164756E21",
18
- "names": []
19
- }