@authdog/nextjs-app 1.0.1 → 2.0.0

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
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- export { P as PublicKeyPayload, g as getPublicKeyPayload } from './commons-CoLIU2e7.mjs';
2
+ export { PublicKeyPayload, assertTrustedIdentityHost, getPublicKeyPayload, validateAndParsePublicKey } from '@authdog/node-commons';
3
3
 
4
4
  declare const getTokenFromUri: (url: string) => string | null;
5
5
  interface AuthdogUser {
@@ -57,8 +57,18 @@ declare const fetchUserData: (publicKey: string, token: string) => Promise<Authd
57
57
  declare const browserCookiesOptions: {
58
58
  maxAge: number;
59
59
  path: string;
60
- httpOnly: boolean;
60
+ secure: boolean;
61
+ sameSite: "lax";
61
62
  };
63
+ /**
64
+ * Clears the client-side Authdog session: removes the locally stored token and
65
+ * notifies hooks (`useAuth`/`useUser`) via the {@link TOKEN_UPDATED_EVENT}.
66
+ *
67
+ * Note: this only clears the browser-side token. The server-side session cookie
68
+ * (and its hash) must also be cleared via the server logout handler
69
+ * (`logoutHandler`) to fully log the user out.
70
+ */
71
+ declare const clearAuthdogSession: () => void;
62
72
 
63
73
  declare const AuthdogProvider: ({ children, }: {
64
74
  children: React.ReactNode;
@@ -79,4 +89,4 @@ interface UseUserResult {
79
89
  }
80
90
  declare const useUser: () => UseUserResult;
81
91
 
82
- export { AuthdogProvider, type UseAuthResult, type UseUserResult, browserCookiesOptions, fetchUserData, getTokenFromUri, useAuth, useUser, validatePublicKey };
92
+ export { AuthdogProvider, type UseAuthResult, type UseUserResult, browserCookiesOptions, clearAuthdogSession, fetchUserData, getTokenFromUri, useAuth, useUser, validatePublicKey };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- export { P as PublicKeyPayload, g as getPublicKeyPayload } from './commons-CoLIU2e7.js';
2
+ export { PublicKeyPayload, assertTrustedIdentityHost, getPublicKeyPayload, validateAndParsePublicKey } from '@authdog/node-commons';
3
3
 
4
4
  declare const getTokenFromUri: (url: string) => string | null;
5
5
  interface AuthdogUser {
@@ -57,8 +57,18 @@ declare const fetchUserData: (publicKey: string, token: string) => Promise<Authd
57
57
  declare const browserCookiesOptions: {
58
58
  maxAge: number;
59
59
  path: string;
60
- httpOnly: boolean;
60
+ secure: boolean;
61
+ sameSite: "lax";
61
62
  };
63
+ /**
64
+ * Clears the client-side Authdog session: removes the locally stored token and
65
+ * notifies hooks (`useAuth`/`useUser`) via the {@link TOKEN_UPDATED_EVENT}.
66
+ *
67
+ * Note: this only clears the browser-side token. The server-side session cookie
68
+ * (and its hash) must also be cleared via the server logout handler
69
+ * (`logoutHandler`) to fully log the user out.
70
+ */
71
+ declare const clearAuthdogSession: () => void;
62
72
 
63
73
  declare const AuthdogProvider: ({ children, }: {
64
74
  children: React.ReactNode;
@@ -79,4 +89,4 @@ interface UseUserResult {
79
89
  }
80
90
  declare const useUser: () => UseUserResult;
81
91
 
82
- export { AuthdogProvider, type UseAuthResult, type UseUserResult, browserCookiesOptions, fetchUserData, getTokenFromUri, useAuth, useUser, validatePublicKey };
92
+ export { AuthdogProvider, type UseAuthResult, type UseUserResult, browserCookiesOptions, clearAuthdogSession, fetchUserData, getTokenFromUri, useAuth, useUser, validatePublicKey };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";"use client";var M=Object.create;var _=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var X=(e,t)=>{for(var r in t)_(e,r,{get:t[r],enumerable:!0})},O=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of V(t))!G.call(e,a)&&a!==r&&_(e,a,{get:()=>t[a],enumerable:!(s=F(t,a))||s.enumerable});return e};var Y=(e,t,r)=>(r=e!=null?M(B(e)):{},O(t||!e||!e.__esModule?_(r,"default",{value:e,enumerable:!0}):r,e)),z=e=>O(_({},"__esModule",{value:!0}),e);var H={};X(H,{AuthdogProvider:()=>R,browserCookiesOptions:()=>K,fetchUserData:()=>v,getPublicKeyPayload:()=>A,getTokenFromUri:()=>S,useAuth:()=>D,useUser:()=>C,validatePublicKey:()=>U});module.exports=z(H);var A=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key");try{return JSON.parse(Buffer.from(e.replace("pk_",""),"base64").toString("utf-8"))}catch{throw new Error("Failed to parse public key")}};var S=e=>new URL(e).searchParams.get("token"),U=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key")},v=async(e,t)=>{U(e);let r=A(e),s=await fetch(`${r==null?void 0:r.identityHost}/oidc/${r==null?void 0:r.environmentId}/userinfo`,{headers:{authorization:`Bearer ${t}`}});if(!s.ok)throw new Error("Failed to fetch user info");return await s.json()},K={maxAge:60*60*24*7,path:"/",httpOnly:!0};var p=Y(require("react"));var c="token",d="token-updated";var R=({children:e})=>((0,p.useEffect)(()=>{let t=new URLSearchParams(window.location.search).get("token");t&&(localStorage.setItem(c,t),window.dispatchEvent(new Event(d)),window.history.replaceState({},document.title,"/"))},[]),p.default.createElement(p.default.Fragment,null,e));var w=require("react");var D=()=>{let[e,t]=(0,w.useState)(null),[r,s]=(0,w.useState)(!0);return(0,w.useEffect)(()=>{if(typeof window>"u"){t(null),s(!1);return}let a=()=>window.localStorage.getItem(c),l=()=>{let o=a();t(E=>E===o?E:o)};l(),s(!1);let m=()=>{l()},f=o=>{o.key===c&&l()};window.addEventListener(d,m),window.addEventListener("storage",f);let h=0,g=window.setInterval(()=>{h++,l(),h>=10&&window.clearInterval(g)},500);return()=>{window.removeEventListener(d,m),window.removeEventListener("storage",f),window.clearInterval(g)}},[]),{token:e,isAuthenticated:!!e,isLoading:r}};var n=require("react");var b=process.env.NEXT_PUBLIC_PK_AUTHDOG,C=()=>{let[e,t]=(0,n.useState)(null),[r,s]=(0,n.useState)(!1),[a,l]=(0,n.useState)(null),[m,f]=(0,n.useState)(null),[h,g]=(0,n.useState)(!1),o=(0,n.useRef)(!0);(0,n.useEffect)(()=>()=>{o.current=!1},[]),(0,n.useEffect)(()=>{if(typeof window>"u"){t(null),s(!0);return}let i=()=>window.localStorage.getItem(c),u=()=>{let T=i();t(I=>I===T?I:T)};u(),s(!0);let L=()=>{u()},x=T=>{T.key===c&&u()};window.addEventListener(d,L),window.addEventListener("storage",x);let N=0,y=window.setInterval(()=>{N++,u(),N>=10&&window.clearInterval(y)},500);return()=>{window.removeEventListener(d,L),window.removeEventListener("storage",x),window.clearInterval(y)}},[]);let E=(0,n.useCallback)(async()=>{if(!e){o.current&&(l(null),f(null),g(!1));return}if(!b){let i=new Error("NEXT_PUBLIC_PK_AUTHDOG environment variable is not set");throw o.current&&(f(i),l(null)),i}o.current&&g(!0);try{let i=await v(b,e);o.current&&(l((i==null?void 0:i.user)??null),f(null))}catch(i){let u=i instanceof Error?i:new Error("Unexpected error fetching Authdog user");throw process.env.NODE_ENV!=="production"&&console.error("Error fetching Authdog user profile:",u),o.current&&(l(null),f(u)),u}finally{o.current&&g(!1)}},[e]);return(0,n.useEffect)(()=>{r&&E().catch(()=>{})},[E,r]),{user:a,isLoading:!r||h,error:m,refetch:E}};0&&(module.exports={AuthdogProvider,browserCookiesOptions,fetchUserData,getPublicKeyPayload,getTokenFromUri,useAuth,useUser,validatePublicKey});
1
+ "use strict";"use client";var D=Object.create;var T=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var V=(e,t)=>{for(var r in t)T(e,r,{get:t[r],enumerable:!0})},k=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of F(t))!z.call(e,n)&&n!==r&&T(e,n,{get:()=>t[n],enumerable:!(a=C(t,n))||a.enumerable});return e};var Y=(e,t,r)=>(r=e!=null?D(G(e)):{},k(t||!e||!e.__esModule?T(r,"default",{value:e,enumerable:!0}):r,e)),B=e=>k(T({},"__esModule",{value:!0}),e);var Z={};V(Z,{AuthdogProvider:()=>I,assertTrustedIdentityHost:()=>l.assertTrustedIdentityHost,browserCookiesOptions:()=>S,clearAuthdogSession:()=>b,fetchUserData:()=>v,getPublicKeyPayload:()=>l.getPublicKeyPayload,getTokenFromUri:()=>N,useAuth:()=>L,useUser:()=>R,validateAndParsePublicKey:()=>l.validateAndParsePublicKey,validatePublicKey:()=>K});module.exports=B(Z);var U=require("@authdog/node-commons");var l=require("@authdog/node-commons");var u="token",c="token-updated";var N=e=>new URL(e).searchParams.get("token"),K=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key")},v=async(e,t)=>{var s;let{identityHost:r,environmentId:a}=(0,l.validateAndParsePublicKey)(e),n=await(0,U.fetchUserData)(r,a,t);if(!(0,U.isAuthenticatedUserInfo)(n)){let m=((s=n==null?void 0:n.meta)==null?void 0:s.code)??"unknown";throw new Error(`Failed to fetch user info (status ${m})`)}return n},S={maxAge:3600*24*7,path:"/",secure:!0,sameSite:"lax"},b=()=>{typeof window>"u"||(window.localStorage.removeItem(u),window.dispatchEvent(new Event(c)))};var h=Y(require("react"));var H=/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/,I=({children:e})=>((0,h.useEffect)(()=>{let t=new URLSearchParams(window.location.search).get("token");t&&(H.test(t)&&(localStorage.setItem(u,t),window.dispatchEvent(new Event(c))),window.history.replaceState({},document.title,"/"))},[]),h.default.createElement(h.default.Fragment,null,e));var w=require("react");var L=()=>{let[e,t]=(0,w.useState)(null),[r,a]=(0,w.useState)(!0);return(0,w.useEffect)(()=>{if(typeof window>"u"){t(null),a(!1);return}let n=()=>window.localStorage.getItem(u),s=()=>{let p=n();t(E=>E===p?E:p)};s(),a(!1);let m=()=>{s()},d=p=>{p.key===u&&s()};return window.addEventListener(c,m),window.addEventListener("storage",d),()=>{window.removeEventListener(c,m),window.removeEventListener("storage",d)}},[]),{token:e,isAuthenticated:!!e,isLoading:r}};var o=require("react");var O=process.env.NEXT_PUBLIC_PK_AUTHDOG,R=()=>{let[e,t]=(0,o.useState)(null),[r,a]=(0,o.useState)(!1),[n,s]=(0,o.useState)(null),[m,d]=(0,o.useState)(null),[p,E]=(0,o.useState)(!1),f=(0,o.useRef)(!0);(0,o.useEffect)(()=>()=>{f.current=!1},[]),(0,o.useEffect)(()=>{if(typeof window>"u"){t(null),a(!0);return}let i=()=>window.localStorage.getItem(u),g=()=>{let A=i();t(_=>_===A?_:A)};g(),a(!0);let x=()=>{g()},P=A=>{A.key===u&&g()};return window.addEventListener(c,x),window.addEventListener("storage",P),()=>{window.removeEventListener(c,x),window.removeEventListener("storage",P)}},[]);let y=(0,o.useCallback)(async()=>{if(!e){f.current&&(s(null),d(null),E(!1));return}if(!O){let i=new Error("NEXT_PUBLIC_PK_AUTHDOG environment variable is not set");throw f.current&&(d(i),s(null)),i}f.current&&E(!0);try{let i=await v(O,e);f.current&&(s((i==null?void 0:i.user)??null),d(null))}catch(i){let g=i instanceof Error?i:new Error("Unexpected error fetching Authdog user");throw process.env.NODE_ENV!=="production"&&console.error("Error fetching Authdog user profile:",g),f.current&&(s(null),d(g)),g}finally{f.current&&E(!1)}},[e]);return(0,o.useEffect)(()=>{r&&y().catch(()=>{})},[y,r]),{user:n,isLoading:!r||p,error:m,refetch:y}};0&&(module.exports={AuthdogProvider,assertTrustedIdentityHost,browserCookiesOptions,clearAuthdogSession,fetchUserData,getPublicKeyPayload,getTokenFromUri,useAuth,useUser,validateAndParsePublicKey,validatePublicKey});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commons.ts","../src/client/session.ts","../src/client/Provider.tsx","../src/client/constants.ts","../src/hooks/use-auth.ts","../src/hooks/use-user.ts"],"sourcesContent":["\"use client\";\nexport * from \"./client\";\nexport * from \"./commons\";\nexport * from \"./hooks\";\n","export interface PublicKeyPayload {\n environmentId: string;\n identityHost: string;\n}\n\nexport const getPublicKeyPayload = (publicKey: string): PublicKeyPayload => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n\n try {\n return JSON.parse(\n Buffer.from(publicKey.replace(\"pk_\", \"\"), \"base64\").toString(\"utf-8\"),\n );\n } catch (e) {\n throw new Error(\"Failed to parse public key\");\n }\n};\n","import { getPublicKeyPayload } from \"../commons\";\n\nexport const getTokenFromUri = (url: string): string | null => {\n return new URL(url).searchParams.get(\"token\");\n};\n\nexport interface AuthdogUser {\n id: string;\n environmentId: string;\n externalId: string;\n userName: string;\n displayName: string;\n nickName: string;\n profileUrl: string;\n title: string;\n userType: string;\n preferredLanguage: string | null;\n locale: string | null;\n timezone: string | null;\n active: boolean;\n provider: string;\n lastLogin: string;\n createdAt: string;\n updatedAt: string;\n names: {\n id: string;\n userId: string;\n formatted: string | null;\n familyName: string;\n givenName: string;\n middleName: string | null;\n honorificPrefix: string | null;\n honorificSuffix: string | null;\n createdAt: string;\n updatedAt: string;\n };\n addresses: [];\n emails: {\n value: string;\n primary: boolean;\n type: string;\n }[];\n phoneNumbers: [];\n ims: [];\n photos: {\n value: string;\n type: string;\n }[];\n}\n\nexport interface AuthdogUserResponse {\n user: AuthdogUser;\n meta: {\n code: number;\n message: string;\n };\n}\n\nexport const validatePublicKey = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n};\n\nexport const fetchUserData = async (\n publicKey: string,\n token: string,\n): Promise<AuthdogUserResponse | null> => {\n validatePublicKey(publicKey);\n const publicKeyObj = getPublicKeyPayload(publicKey);\n const userData = await fetch(\n `${publicKeyObj?.identityHost}/oidc/${publicKeyObj?.environmentId}/userinfo`,\n {\n headers: {\n authorization: `Bearer ${token}`,\n },\n },\n );\n\n if (!userData.ok) {\n throw new Error(\"Failed to fetch user info\");\n }\n\n return await userData.json();\n};\n\nexport const browserCookiesOptions = {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: \"/\",\n httpOnly: true,\n};\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\n\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"./constants\";\n\nexport const AuthdogProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n useEffect(() => {\n const token = new URLSearchParams(window.location.search).get(\"token\");\n if (token) {\n localStorage.setItem(TOKEN_STORAGE_KEY, token);\n window.dispatchEvent(new Event(TOKEN_UPDATED_EVENT));\n window.history.replaceState({}, document.title, \"/\");\n }\n }, []);\n return <>{children}</>;\n};\n","export const TOKEN_STORAGE_KEY = \"token\";\nexport const TOKEN_UPDATED_EVENT = \"token-updated\";\nexport const TOKEN_POLL_INTERVAL_MS = 500;\nexport const TOKEN_POLL_MAX_ATTEMPTS = 10;\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport {\n TOKEN_POLL_INTERVAL_MS,\n TOKEN_POLL_MAX_ATTEMPTS,\n TOKEN_STORAGE_KEY,\n TOKEN_UPDATED_EVENT,\n} from \"../client/constants\";\n\nexport interface UseAuthResult {\n token: string | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n}\n\nexport const useAuth = (): UseAuthResult => {\n const [token, setToken] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n setToken(null);\n setIsLoading(false);\n return;\n }\n\n const readTokenFromStorage = () =>\n window.localStorage.getItem(TOKEN_STORAGE_KEY);\n\n const syncToken = () => {\n const nextToken = readTokenFromStorage();\n setToken((currentToken) =>\n currentToken === nextToken ? currentToken : nextToken,\n );\n };\n\n syncToken();\n setIsLoading(false);\n\n const handleTokenUpdate = () => {\n syncToken();\n };\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === TOKEN_STORAGE_KEY) {\n syncToken();\n }\n };\n\n window.addEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.addEventListener(\"storage\", handleStorageChange);\n\n let pollCount = 0;\n const pollInterval = window.setInterval(() => {\n pollCount++;\n syncToken();\n\n if (pollCount >= TOKEN_POLL_MAX_ATTEMPTS) {\n window.clearInterval(pollInterval);\n }\n }, TOKEN_POLL_INTERVAL_MS);\n\n return () => {\n window.removeEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.removeEventListener(\"storage\", handleStorageChange);\n window.clearInterval(pollInterval);\n };\n }, []);\n\n return {\n token,\n isAuthenticated: Boolean(token),\n isLoading,\n };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport {\n TOKEN_POLL_INTERVAL_MS,\n TOKEN_POLL_MAX_ATTEMPTS,\n TOKEN_STORAGE_KEY,\n TOKEN_UPDATED_EVENT,\n} from \"../client/constants\";\nimport { fetchUserData, type AuthdogUser } from \"../client/session\";\n\nconst PUBLIC_KEY = process.env.NEXT_PUBLIC_PK_AUTHDOG;\n\nexport interface UseUserResult {\n user: AuthdogUser | null;\n isLoading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport const useUser = (): UseUserResult => {\n const [token, setToken] = useState<string | null>(null);\n const [isTokenInitialized, setIsTokenInitialized] = useState(false);\n const [user, setUser] = useState<AuthdogUser | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isFetching, setIsFetching] = useState(false);\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n setToken(null);\n setIsTokenInitialized(true);\n return;\n }\n\n const readTokenFromStorage = () =>\n window.localStorage.getItem(TOKEN_STORAGE_KEY);\n\n const syncToken = () => {\n const nextToken = readTokenFromStorage();\n setToken((currentToken) =>\n currentToken === nextToken ? currentToken : nextToken,\n );\n };\n\n syncToken();\n setIsTokenInitialized(true);\n\n const handleTokenUpdate = () => {\n syncToken();\n };\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === TOKEN_STORAGE_KEY) {\n syncToken();\n }\n };\n\n window.addEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.addEventListener(\"storage\", handleStorageChange);\n\n let pollCount = 0;\n const pollInterval = window.setInterval(() => {\n pollCount++;\n syncToken();\n\n if (pollCount >= TOKEN_POLL_MAX_ATTEMPTS) {\n window.clearInterval(pollInterval);\n }\n }, TOKEN_POLL_INTERVAL_MS);\n\n return () => {\n window.removeEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.removeEventListener(\"storage\", handleStorageChange);\n window.clearInterval(pollInterval);\n };\n }, []);\n\n const fetchProfile = useCallback(async () => {\n if (!token) {\n if (isMountedRef.current) {\n setUser(null);\n setError(null);\n setIsFetching(false);\n }\n return;\n }\n\n if (!PUBLIC_KEY) {\n const publicKeyError = new Error(\n \"NEXT_PUBLIC_PK_AUTHDOG environment variable is not set\",\n );\n if (isMountedRef.current) {\n setError(publicKeyError);\n setUser(null);\n }\n throw publicKeyError;\n }\n\n if (isMountedRef.current) {\n setIsFetching(true);\n }\n\n try {\n const response = await fetchUserData(PUBLIC_KEY, token);\n if (isMountedRef.current) {\n setUser(response?.user ?? null);\n setError(null);\n }\n } catch (err) {\n const nextError =\n err instanceof Error\n ? err\n : new Error(\"Unexpected error fetching Authdog user\");\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Error fetching Authdog user profile:\", nextError);\n }\n if (isMountedRef.current) {\n setUser(null);\n setError(nextError);\n }\n throw nextError;\n } finally {\n if (isMountedRef.current) {\n setIsFetching(false);\n }\n }\n }, [token]);\n\n useEffect(() => {\n if (!isTokenInitialized) {\n return;\n }\n\n fetchProfile().catch(() => {\n /* error is already stored in state */\n });\n }, [fetchProfile, isTokenInitialized]);\n\n return {\n user,\n isLoading: !isTokenInitialized || isFetching,\n error,\n refetch: fetchProfile,\n };\n};\n"],"mappings":"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","names":["index_exports","__export","AuthdogProvider","browserCookiesOptions","fetchUserData","getPublicKeyPayload","getTokenFromUri","useAuth","useUser","validatePublicKey","__toCommonJS","getPublicKeyPayload","publicKey","getTokenFromUri","url","validatePublicKey","publicKey","fetchUserData","token","publicKeyObj","getPublicKeyPayload","userData","browserCookiesOptions","import_react","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","AuthdogProvider","children","token","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","React","import_react","useAuth","token","setToken","isLoading","setIsLoading","readTokenFromStorage","TOKEN_STORAGE_KEY","syncToken","nextToken","currentToken","handleTokenUpdate","handleStorageChange","event","TOKEN_UPDATED_EVENT","pollCount","pollInterval","import_react","PUBLIC_KEY","useUser","token","setToken","isTokenInitialized","setIsTokenInitialized","user","setUser","error","setError","isFetching","setIsFetching","isMountedRef","readTokenFromStorage","TOKEN_STORAGE_KEY","syncToken","nextToken","currentToken","handleTokenUpdate","handleStorageChange","event","TOKEN_UPDATED_EVENT","pollCount","pollInterval","fetchProfile","publicKeyError","response","fetchUserData","err","nextError"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client/session.ts","../src/commons.ts","../src/client/constants.ts","../src/client/Provider.tsx","../src/hooks/useAuth.ts","../src/hooks/useUser.ts"],"sourcesContent":["\"use client\";\nexport * from \"./client\";\nexport * from \"./commons\";\nexport * from \"./hooks\";\n","import {\n fetchUserData as fetchUserInfo,\n isAuthenticatedUserInfo,\n} from \"@authdog/node-commons\";\nimport { validateAndParsePublicKey } from \"../commons\";\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"./constants\";\n\nexport const getTokenFromUri = (url: string): string | null => {\n return new URL(url).searchParams.get(\"token\");\n};\n\nexport interface AuthdogUser {\n id: string;\n environmentId: string;\n externalId: string;\n userName: string;\n displayName: string;\n nickName: string;\n profileUrl: string;\n title: string;\n userType: string;\n preferredLanguage: string | null;\n locale: string | null;\n timezone: string | null;\n active: boolean;\n provider: string;\n lastLogin: string;\n createdAt: string;\n updatedAt: string;\n names: {\n id: string;\n userId: string;\n formatted: string | null;\n familyName: string;\n givenName: string;\n middleName: string | null;\n honorificPrefix: string | null;\n honorificSuffix: string | null;\n createdAt: string;\n updatedAt: string;\n };\n addresses: [];\n emails: {\n value: string;\n primary: boolean;\n type: string;\n }[];\n phoneNumbers: [];\n ims: [];\n photos: {\n value: string;\n type: string;\n }[];\n}\n\nexport interface AuthdogUserResponse {\n user: AuthdogUser;\n meta: {\n code: number;\n message: string;\n };\n}\n\nexport const validatePublicKey = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n};\n\nexport const fetchUserData = async (\n publicKey: string,\n token: string,\n): Promise<AuthdogUserResponse | null> => {\n const { identityHost, environmentId } = validateAndParsePublicKey(publicKey);\n\n const userData = await fetchUserInfo(identityHost, environmentId, token);\n\n if (!isAuthenticatedUserInfo(userData)) {\n const status = userData?.meta?.code ?? \"unknown\";\n throw new Error(`Failed to fetch user info (status ${status})`);\n }\n\n return userData as unknown as AuthdogUserResponse;\n};\n\nexport const browserCookiesOptions = {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: \"/\",\n secure: true,\n sameSite: \"lax\" as const,\n};\n\n/**\n * Clears the client-side Authdog session: removes the locally stored token and\n * notifies hooks (`useAuth`/`useUser`) via the {@link TOKEN_UPDATED_EVENT}.\n *\n * Note: this only clears the browser-side token. The server-side session cookie\n * (and its hash) must also be cleared via the server logout handler\n * (`logoutHandler`) to fully log the user out.\n */\nexport const clearAuthdogSession = (): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n window.localStorage.removeItem(TOKEN_STORAGE_KEY);\n window.dispatchEvent(new Event(TOKEN_UPDATED_EVENT));\n};\n","export {\n validateAndParsePublicKey,\n // Backwards-compatible alias of `validateAndParsePublicKey`.\n getPublicKeyPayload,\n assertTrustedIdentityHost,\n type PublicKeyPayload,\n} from \"@authdog/node-commons\";\n","export const TOKEN_STORAGE_KEY = \"token\";\nexport const TOKEN_UPDATED_EVENT = \"token-updated\";\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\n\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"./constants\";\n\nconst JWT_PATTERN = /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/;\n\nexport const AuthdogProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n useEffect(() => {\n const token = new URLSearchParams(window.location.search).get(\"token\");\n if (token) {\n if (JWT_PATTERN.test(token)) {\n localStorage.setItem(TOKEN_STORAGE_KEY, token);\n window.dispatchEvent(new Event(TOKEN_UPDATED_EVENT));\n }\n // Always strip the token from the URL, even if it was rejected.\n window.history.replaceState({}, document.title, \"/\");\n }\n }, []);\n return <>{children}</>;\n};\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"../client/constants\";\n\nexport interface UseAuthResult {\n token: string | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n}\n\nexport const useAuth = (): UseAuthResult => {\n const [token, setToken] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n setToken(null);\n setIsLoading(false);\n return;\n }\n\n const readTokenFromStorage = () =>\n window.localStorage.getItem(TOKEN_STORAGE_KEY);\n\n const syncToken = () => {\n const nextToken = readTokenFromStorage();\n setToken((currentToken) =>\n currentToken === nextToken ? currentToken : nextToken,\n );\n };\n\n syncToken();\n setIsLoading(false);\n\n const handleTokenUpdate = () => {\n syncToken();\n };\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === TOKEN_STORAGE_KEY) {\n syncToken();\n }\n };\n\n window.addEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.addEventListener(\"storage\", handleStorageChange);\n\n return () => {\n window.removeEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.removeEventListener(\"storage\", handleStorageChange);\n };\n }, []);\n\n return {\n token,\n isAuthenticated: Boolean(token),\n isLoading,\n };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"../client/constants\";\nimport { fetchUserData, type AuthdogUser } from \"../client/session\";\n\nconst PUBLIC_KEY = process.env.NEXT_PUBLIC_PK_AUTHDOG;\n\nexport interface UseUserResult {\n user: AuthdogUser | null;\n isLoading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport const useUser = (): UseUserResult => {\n const [token, setToken] = useState<string | null>(null);\n const [isTokenInitialized, setIsTokenInitialized] = useState(false);\n const [user, setUser] = useState<AuthdogUser | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isFetching, setIsFetching] = useState(false);\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n setToken(null);\n setIsTokenInitialized(true);\n return;\n }\n\n const readTokenFromStorage = () =>\n window.localStorage.getItem(TOKEN_STORAGE_KEY);\n\n const syncToken = () => {\n const nextToken = readTokenFromStorage();\n setToken((currentToken) =>\n currentToken === nextToken ? currentToken : nextToken,\n );\n };\n\n syncToken();\n setIsTokenInitialized(true);\n\n const handleTokenUpdate = () => {\n syncToken();\n };\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === TOKEN_STORAGE_KEY) {\n syncToken();\n }\n };\n\n window.addEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.addEventListener(\"storage\", handleStorageChange);\n\n return () => {\n window.removeEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.removeEventListener(\"storage\", handleStorageChange);\n };\n }, []);\n\n const fetchProfile = useCallback(async () => {\n if (!token) {\n if (isMountedRef.current) {\n setUser(null);\n setError(null);\n setIsFetching(false);\n }\n return;\n }\n\n if (!PUBLIC_KEY) {\n const publicKeyError = new Error(\n \"NEXT_PUBLIC_PK_AUTHDOG environment variable is not set\",\n );\n if (isMountedRef.current) {\n setError(publicKeyError);\n setUser(null);\n }\n throw publicKeyError;\n }\n\n if (isMountedRef.current) {\n setIsFetching(true);\n }\n\n try {\n const response = await fetchUserData(PUBLIC_KEY, token);\n if (isMountedRef.current) {\n setUser(response?.user ?? null);\n setError(null);\n }\n } catch (err) {\n const nextError =\n err instanceof Error\n ? err\n : new Error(\"Unexpected error fetching Authdog user\");\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Error fetching Authdog user profile:\", nextError);\n }\n if (isMountedRef.current) {\n setUser(null);\n setError(nextError);\n }\n throw nextError;\n } finally {\n if (isMountedRef.current) {\n setIsFetching(false);\n }\n }\n }, [token]);\n\n useEffect(() => {\n if (!isTokenInitialized) {\n return;\n }\n\n fetchProfile().catch(() => {});\n }, [fetchProfile, isTokenInitialized]);\n\n return {\n user,\n isLoading: !isTokenInitialized || isFetching,\n error,\n refetch: fetchProfile,\n };\n};\n"],"mappings":"ukBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,oFAAAC,EAAA,wBAAAC,EAAA,kBAAAC,EAAA,kEAAAC,EAAA,YAAAC,EAAA,YAAAC,EAAA,gFAAAC,IAAA,eAAAC,EAAAV,GCAA,IAAAW,EAGO,iCCHP,IAAAC,EAMO,iCCNA,IAAMC,EAAoB,QACpBC,EAAsB,gBFM5B,IAAMC,EAAmBC,GACvB,IAAI,IAAIA,CAAG,EAAE,aAAa,IAAI,OAAO,EAuDjCC,EAAqBC,GAAsB,CACtD,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,2BAA2B,EAG7C,GAAI,CAACA,EAAU,WAAW,KAAK,EAC7B,MAAM,IAAI,MAAM,oBAAoB,CAExC,EAEaC,EAAgB,MAC3BD,EACAE,IACwC,CA5E1C,IAAAC,EA6EE,GAAM,CAAE,aAAAC,EAAc,cAAAC,CAAc,KAAI,6BAA0BL,CAAS,EAErEM,EAAW,QAAM,EAAAC,eAAcH,EAAcC,EAAeH,CAAK,EAEvE,GAAI,IAAC,2BAAwBI,CAAQ,EAAG,CACtC,IAAME,IAASL,EAAAG,GAAA,YAAAA,EAAU,OAAV,YAAAH,EAAgB,OAAQ,UACvC,MAAM,IAAI,MAAM,qCAAqCK,CAAM,GAAG,CAChE,CAEA,OAAOF,CACT,EAEaG,EAAwB,CACnC,OAAQ,KAAU,GAAK,EACvB,KAAM,IACN,OAAQ,GACR,SAAU,KACZ,EAUaC,EAAsB,IAAY,CACzC,OAAO,OAAW,MAGtB,OAAO,aAAa,WAAWC,CAAiB,EAChD,OAAO,cAAc,IAAI,MAAMC,CAAmB,CAAC,EACrD,EG5GA,IAAAC,EAAiC,oBAIjC,IAAMC,EAAc,mDAEPC,EAAkB,CAAC,CAC9B,SAAAC,CACF,QAGE,aAAU,IAAM,CACd,IAAMC,EAAQ,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,OAAO,EACjEA,IACEH,EAAY,KAAKG,CAAK,IACxB,aAAa,QAAQC,EAAmBD,CAAK,EAC7C,OAAO,cAAc,IAAI,MAAME,CAAmB,CAAC,GAGrD,OAAO,QAAQ,aAAa,CAAC,EAAG,SAAS,MAAO,GAAG,EAEvD,EAAG,CAAC,CAAC,EACE,EAAAC,QAAA,gBAAAA,QAAA,cAAGJ,CAAS,GCtBrB,IAAAK,EAAoC,iBAS7B,IAAMC,EAAU,IAAqB,CAC1C,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAAwB,IAAI,EAChD,CAACC,EAAWC,CAAY,KAAI,YAAS,EAAI,EAE/C,sBAAU,IAAM,CACd,GAAI,OAAO,OAAW,IAAa,CACjCF,EAAS,IAAI,EACbE,EAAa,EAAK,EAClB,MACF,CAEA,IAAMC,EAAuB,IAC3B,OAAO,aAAa,QAAQC,CAAiB,EAEzCC,EAAY,IAAM,CACtB,IAAMC,EAAYH,EAAqB,EACvCH,EAAUO,GACRA,IAAiBD,EAAYC,EAAeD,CAC9C,CACF,EAEAD,EAAU,EACVH,EAAa,EAAK,EAElB,IAAMM,EAAoB,IAAM,CAC9BH,EAAU,CACZ,EAEMI,EAAuBC,GAAwB,CAC/CA,EAAM,MAAQN,GAChBC,EAAU,CAEd,EAEA,cAAO,iBAAiBM,EAAqBH,CAAiB,EAC9D,OAAO,iBAAiB,UAAWC,CAAmB,EAE/C,IAAM,CACX,OAAO,oBAAoBE,EAAqBH,CAAiB,EACjE,OAAO,oBAAoB,UAAWC,CAAmB,CAC3D,CACF,EAAG,CAAC,CAAC,EAEE,CACL,MAAAV,EACA,gBAAiB,EAAQA,EACzB,UAAAE,CACF,CACF,ECzDA,IAAAW,EAAyD,iBAKzD,IAAMC,EAAa,QAAQ,IAAI,uBASlBC,EAAU,IAAqB,CAC1C,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAAwB,IAAI,EAChD,CAACC,EAAoBC,CAAqB,KAAI,YAAS,EAAK,EAC5D,CAACC,EAAMC,CAAO,KAAI,YAA6B,IAAI,EACnD,CAACC,EAAOC,CAAQ,KAAI,YAAuB,IAAI,EAC/C,CAACC,EAAYC,CAAa,KAAI,YAAS,EAAK,EAC5CC,KAAe,UAAO,EAAI,KAEhC,aAAU,IACD,IAAM,CACXA,EAAa,QAAU,EACzB,EACC,CAAC,CAAC,KAEL,aAAU,IAAM,CACd,GAAI,OAAO,OAAW,IAAa,CACjCT,EAAS,IAAI,EACbE,EAAsB,EAAI,EAC1B,MACF,CAEA,IAAMQ,EAAuB,IAC3B,OAAO,aAAa,QAAQC,CAAiB,EAEzCC,EAAY,IAAM,CACtB,IAAMC,EAAYH,EAAqB,EACvCV,EAAUc,GACRA,IAAiBD,EAAYC,EAAeD,CAC9C,CACF,EAEAD,EAAU,EACVV,EAAsB,EAAI,EAE1B,IAAMa,EAAoB,IAAM,CAC9BH,EAAU,CACZ,EAEMI,EAAuBC,GAAwB,CAC/CA,EAAM,MAAQN,GAChBC,EAAU,CAEd,EAEA,cAAO,iBAAiBM,EAAqBH,CAAiB,EAC9D,OAAO,iBAAiB,UAAWC,CAAmB,EAE/C,IAAM,CACX,OAAO,oBAAoBE,EAAqBH,CAAiB,EACjE,OAAO,oBAAoB,UAAWC,CAAmB,CAC3D,CACF,EAAG,CAAC,CAAC,EAEL,IAAMG,KAAe,eAAY,SAAY,CAC3C,GAAI,CAACpB,EAAO,CACNU,EAAa,UACfL,EAAQ,IAAI,EACZE,EAAS,IAAI,EACbE,EAAc,EAAK,GAErB,MACF,CAEA,GAAI,CAACX,EAAY,CACf,IAAMuB,EAAiB,IAAI,MACzB,wDACF,EACA,MAAIX,EAAa,UACfH,EAASc,CAAc,EACvBhB,EAAQ,IAAI,GAERgB,CACR,CAEIX,EAAa,SACfD,EAAc,EAAI,EAGpB,GAAI,CACF,IAAMa,EAAW,MAAMC,EAAczB,EAAYE,CAAK,EAClDU,EAAa,UACfL,GAAQiB,GAAA,YAAAA,EAAU,OAAQ,IAAI,EAC9Bf,EAAS,IAAI,EAEjB,OAASiB,EAAK,CACZ,IAAMC,EACJD,aAAe,MACXA,EACA,IAAI,MAAM,wCAAwC,EACxD,MAAI,QAAQ,IAAI,WAAa,cAC3B,QAAQ,MAAM,uCAAwCC,CAAS,EAE7Df,EAAa,UACfL,EAAQ,IAAI,EACZE,EAASkB,CAAS,GAEdA,CACR,QAAE,CACIf,EAAa,SACfD,EAAc,EAAK,CAEvB,CACF,EAAG,CAACT,CAAK,CAAC,EAEV,sBAAU,IAAM,CACTE,GAILkB,EAAa,EAAE,MAAM,IAAM,CAAC,CAAC,CAC/B,EAAG,CAACA,EAAclB,CAAkB,CAAC,EAE9B,CACL,KAAAE,EACA,UAAW,CAACF,GAAsBM,EAClC,MAAAF,EACA,QAASc,CACX,CACF","names":["index_exports","__export","AuthdogProvider","browserCookiesOptions","clearAuthdogSession","fetchUserData","getTokenFromUri","useAuth","useUser","validatePublicKey","__toCommonJS","import_node_commons","import_node_commons","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","getTokenFromUri","url","validatePublicKey","publicKey","fetchUserData","token","_a","identityHost","environmentId","userData","fetchUserInfo","status","browserCookiesOptions","clearAuthdogSession","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","import_react","JWT_PATTERN","AuthdogProvider","children","token","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","React","import_react","useAuth","token","setToken","isLoading","setIsLoading","readTokenFromStorage","TOKEN_STORAGE_KEY","syncToken","nextToken","currentToken","handleTokenUpdate","handleStorageChange","event","TOKEN_UPDATED_EVENT","import_react","PUBLIC_KEY","useUser","token","setToken","isTokenInitialized","setIsTokenInitialized","user","setUser","error","setError","isFetching","setIsFetching","isMountedRef","readTokenFromStorage","TOKEN_STORAGE_KEY","syncToken","nextToken","currentToken","handleTokenUpdate","handleStorageChange","event","TOKEN_UPDATED_EVENT","fetchProfile","publicKeyError","response","fetchUserData","err","nextError"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- "use client";var x=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key");try{return JSON.parse(Buffer.from(e.replace("pk_",""),"base64").toString("utf-8"))}catch{throw new Error("Failed to parse public key")}};var S=e=>new URL(e).searchParams.get("token"),N=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key")},h=async(e,n)=>{N(e);let t=x(e),i=await fetch(`${t==null?void 0:t.identityHost}/oidc/${t==null?void 0:t.environmentId}/userinfo`,{headers:{authorization:`Bearer ${n}`}});if(!i.ok)throw new Error("Failed to fetch user info");return await i.json()},K={maxAge:60*60*24*7,path:"/",httpOnly:!0};import y,{useEffect as R}from"react";var l="token",u="token-updated";var D=({children:e})=>(R(()=>{let n=new URLSearchParams(window.location.search).get("token");n&&(localStorage.setItem(l,n),window.dispatchEvent(new Event(u)),window.history.replaceState({},document.title,"/"))},[]),y.createElement(y.Fragment,null,e));import{useEffect as b,useState as I}from"react";var C=()=>{let[e,n]=I(null),[t,i]=I(!0);return b(()=>{if(typeof window>"u"){n(null),i(!1);return}let m=()=>window.localStorage.getItem(l),s=()=>{let r=m();n(f=>f===r?f:r)};s(),i(!1);let E=()=>{s()},c=r=>{r.key===l&&s()};window.addEventListener(u,E),window.addEventListener("storage",c);let p=0,d=window.setInterval(()=>{p++,s(),p>=10&&window.clearInterval(d)},500);return()=>{window.removeEventListener(u,E),window.removeEventListener("storage",c),window.clearInterval(d)}},[]),{token:e,isAuthenticated:!!e,isLoading:t}};import{useCallback as M,useEffect as v,useRef as F,useState as g}from"react";var O=process.env.NEXT_PUBLIC_PK_AUTHDOG,V=()=>{let[e,n]=g(null),[t,i]=g(!1),[m,s]=g(null),[E,c]=g(null),[p,d]=g(!1),r=F(!0);v(()=>()=>{r.current=!1},[]),v(()=>{if(typeof window>"u"){n(null),i(!0);return}let o=()=>window.localStorage.getItem(l),a=()=>{let w=o();n(L=>L===w?L:w)};a(),i(!0);let A=()=>{a()},U=w=>{w.key===l&&a()};window.addEventListener(u,A),window.addEventListener("storage",U);let P=0,k=window.setInterval(()=>{P++,a(),P>=10&&window.clearInterval(k)},500);return()=>{window.removeEventListener(u,A),window.removeEventListener("storage",U),window.clearInterval(k)}},[]);let f=M(async()=>{if(!e){r.current&&(s(null),c(null),d(!1));return}if(!O){let o=new Error("NEXT_PUBLIC_PK_AUTHDOG environment variable is not set");throw r.current&&(c(o),s(null)),o}r.current&&d(!0);try{let o=await h(O,e);r.current&&(s((o==null?void 0:o.user)??null),c(null))}catch(o){let a=o instanceof Error?o:new Error("Unexpected error fetching Authdog user");throw process.env.NODE_ENV!=="production"&&console.error("Error fetching Authdog user profile:",a),r.current&&(s(null),c(a)),a}finally{r.current&&d(!1)}},[e]);return v(()=>{t&&f().catch(()=>{})},[f,t]),{user:m,isLoading:!t||p,error:E,refetch:f}};export{D as AuthdogProvider,K as browserCookiesOptions,h as fetchUserData,x as getPublicKeyPayload,S as getTokenFromUri,C as useAuth,V as useUser,N as validatePublicKey};
1
+ "use client";import{fetchUserData as N,isAuthenticatedUserInfo as K}from"@authdog/node-commons";import{validateAndParsePublicKey as w,getPublicKeyPayload as k,assertTrustedIdentityHost as H}from"@authdog/node-commons";var o="token",s="token-updated";var S=e=>new URL(e).searchParams.get("token"),b=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key")},A=async(e,t)=>{var r;let{identityHost:a,environmentId:l}=w(e),i=await N(a,l,t);if(!K(i)){let f=((r=i==null?void 0:i.meta)==null?void 0:r.code)??"unknown";throw new Error(`Failed to fetch user info (status ${f})`)}return i},I={maxAge:3600*24*7,path:"/",secure:!0,sameSite:"lax"},L=()=>{typeof window>"u"||(window.localStorage.removeItem(o),window.dispatchEvent(new Event(s)))};import x,{useEffect as O}from"react";var R=/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/,D=({children:e})=>(O(()=>{let t=new URLSearchParams(window.location.search).get("token");t&&(R.test(t)&&(localStorage.setItem(o,t),window.dispatchEvent(new Event(s))),window.history.replaceState({},document.title,"/"))},[]),x.createElement(x.Fragment,null,e));import{useEffect as C,useState as P}from"react";var F=()=>{let[e,t]=P(null),[a,l]=P(!0);return C(()=>{if(typeof window>"u"){t(null),l(!1);return}let i=()=>window.localStorage.getItem(o),r=()=>{let g=i();t(m=>m===g?m:g)};r(),l(!1);let f=()=>{r()},u=g=>{g.key===o&&r()};return window.addEventListener(s,f),window.addEventListener("storage",u),()=>{window.removeEventListener(s,f),window.removeEventListener("storage",u)}},[]),{token:e,isAuthenticated:!!e,isLoading:a}};import{useCallback as G,useEffect as T,useRef as z,useState as p}from"react";var _=process.env.NEXT_PUBLIC_PK_AUTHDOG,V=()=>{let[e,t]=p(null),[a,l]=p(!1),[i,r]=p(null),[f,u]=p(null),[g,m]=p(!1),c=z(!0);T(()=>()=>{c.current=!1},[]),T(()=>{if(typeof window>"u"){t(null),l(!0);return}let n=()=>window.localStorage.getItem(o),d=()=>{let E=n();t(y=>y===E?y:E)};d(),l(!0);let U=()=>{d()},v=E=>{E.key===o&&d()};return window.addEventListener(s,U),window.addEventListener("storage",v),()=>{window.removeEventListener(s,U),window.removeEventListener("storage",v)}},[]);let h=G(async()=>{if(!e){c.current&&(r(null),u(null),m(!1));return}if(!_){let n=new Error("NEXT_PUBLIC_PK_AUTHDOG environment variable is not set");throw c.current&&(u(n),r(null)),n}c.current&&m(!0);try{let n=await A(_,e);c.current&&(r((n==null?void 0:n.user)??null),u(null))}catch(n){let d=n instanceof Error?n:new Error("Unexpected error fetching Authdog user");throw process.env.NODE_ENV!=="production"&&console.error("Error fetching Authdog user profile:",d),c.current&&(r(null),u(d)),d}finally{c.current&&m(!1)}},[e]);return T(()=>{a&&h().catch(()=>{})},[h,a]),{user:i,isLoading:!a||g,error:f,refetch:h}};export{D as AuthdogProvider,H as assertTrustedIdentityHost,I as browserCookiesOptions,L as clearAuthdogSession,A as fetchUserData,k as getPublicKeyPayload,S as getTokenFromUri,F as useAuth,V as useUser,w as validateAndParsePublicKey,b as validatePublicKey};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commons.ts","../src/client/session.ts","../src/client/Provider.tsx","../src/client/constants.ts","../src/hooks/use-auth.ts","../src/hooks/use-user.ts"],"sourcesContent":["export interface PublicKeyPayload {\n environmentId: string;\n identityHost: string;\n}\n\nexport const getPublicKeyPayload = (publicKey: string): PublicKeyPayload => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n\n try {\n return JSON.parse(\n Buffer.from(publicKey.replace(\"pk_\", \"\"), \"base64\").toString(\"utf-8\"),\n );\n } catch (e) {\n throw new Error(\"Failed to parse public key\");\n }\n};\n","import { getPublicKeyPayload } from \"../commons\";\n\nexport const getTokenFromUri = (url: string): string | null => {\n return new URL(url).searchParams.get(\"token\");\n};\n\nexport interface AuthdogUser {\n id: string;\n environmentId: string;\n externalId: string;\n userName: string;\n displayName: string;\n nickName: string;\n profileUrl: string;\n title: string;\n userType: string;\n preferredLanguage: string | null;\n locale: string | null;\n timezone: string | null;\n active: boolean;\n provider: string;\n lastLogin: string;\n createdAt: string;\n updatedAt: string;\n names: {\n id: string;\n userId: string;\n formatted: string | null;\n familyName: string;\n givenName: string;\n middleName: string | null;\n honorificPrefix: string | null;\n honorificSuffix: string | null;\n createdAt: string;\n updatedAt: string;\n };\n addresses: [];\n emails: {\n value: string;\n primary: boolean;\n type: string;\n }[];\n phoneNumbers: [];\n ims: [];\n photos: {\n value: string;\n type: string;\n }[];\n}\n\nexport interface AuthdogUserResponse {\n user: AuthdogUser;\n meta: {\n code: number;\n message: string;\n };\n}\n\nexport const validatePublicKey = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n};\n\nexport const fetchUserData = async (\n publicKey: string,\n token: string,\n): Promise<AuthdogUserResponse | null> => {\n validatePublicKey(publicKey);\n const publicKeyObj = getPublicKeyPayload(publicKey);\n const userData = await fetch(\n `${publicKeyObj?.identityHost}/oidc/${publicKeyObj?.environmentId}/userinfo`,\n {\n headers: {\n authorization: `Bearer ${token}`,\n },\n },\n );\n\n if (!userData.ok) {\n throw new Error(\"Failed to fetch user info\");\n }\n\n return await userData.json();\n};\n\nexport const browserCookiesOptions = {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: \"/\",\n httpOnly: true,\n};\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\n\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"./constants\";\n\nexport const AuthdogProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n useEffect(() => {\n const token = new URLSearchParams(window.location.search).get(\"token\");\n if (token) {\n localStorage.setItem(TOKEN_STORAGE_KEY, token);\n window.dispatchEvent(new Event(TOKEN_UPDATED_EVENT));\n window.history.replaceState({}, document.title, \"/\");\n }\n }, []);\n return <>{children}</>;\n};\n","export const TOKEN_STORAGE_KEY = \"token\";\nexport const TOKEN_UPDATED_EVENT = \"token-updated\";\nexport const TOKEN_POLL_INTERVAL_MS = 500;\nexport const TOKEN_POLL_MAX_ATTEMPTS = 10;\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport {\n TOKEN_POLL_INTERVAL_MS,\n TOKEN_POLL_MAX_ATTEMPTS,\n TOKEN_STORAGE_KEY,\n TOKEN_UPDATED_EVENT,\n} from \"../client/constants\";\n\nexport interface UseAuthResult {\n token: string | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n}\n\nexport const useAuth = (): UseAuthResult => {\n const [token, setToken] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n setToken(null);\n setIsLoading(false);\n return;\n }\n\n const readTokenFromStorage = () =>\n window.localStorage.getItem(TOKEN_STORAGE_KEY);\n\n const syncToken = () => {\n const nextToken = readTokenFromStorage();\n setToken((currentToken) =>\n currentToken === nextToken ? currentToken : nextToken,\n );\n };\n\n syncToken();\n setIsLoading(false);\n\n const handleTokenUpdate = () => {\n syncToken();\n };\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === TOKEN_STORAGE_KEY) {\n syncToken();\n }\n };\n\n window.addEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.addEventListener(\"storage\", handleStorageChange);\n\n let pollCount = 0;\n const pollInterval = window.setInterval(() => {\n pollCount++;\n syncToken();\n\n if (pollCount >= TOKEN_POLL_MAX_ATTEMPTS) {\n window.clearInterval(pollInterval);\n }\n }, TOKEN_POLL_INTERVAL_MS);\n\n return () => {\n window.removeEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.removeEventListener(\"storage\", handleStorageChange);\n window.clearInterval(pollInterval);\n };\n }, []);\n\n return {\n token,\n isAuthenticated: Boolean(token),\n isLoading,\n };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport {\n TOKEN_POLL_INTERVAL_MS,\n TOKEN_POLL_MAX_ATTEMPTS,\n TOKEN_STORAGE_KEY,\n TOKEN_UPDATED_EVENT,\n} from \"../client/constants\";\nimport { fetchUserData, type AuthdogUser } from \"../client/session\";\n\nconst PUBLIC_KEY = process.env.NEXT_PUBLIC_PK_AUTHDOG;\n\nexport interface UseUserResult {\n user: AuthdogUser | null;\n isLoading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport const useUser = (): UseUserResult => {\n const [token, setToken] = useState<string | null>(null);\n const [isTokenInitialized, setIsTokenInitialized] = useState(false);\n const [user, setUser] = useState<AuthdogUser | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isFetching, setIsFetching] = useState(false);\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n setToken(null);\n setIsTokenInitialized(true);\n return;\n }\n\n const readTokenFromStorage = () =>\n window.localStorage.getItem(TOKEN_STORAGE_KEY);\n\n const syncToken = () => {\n const nextToken = readTokenFromStorage();\n setToken((currentToken) =>\n currentToken === nextToken ? currentToken : nextToken,\n );\n };\n\n syncToken();\n setIsTokenInitialized(true);\n\n const handleTokenUpdate = () => {\n syncToken();\n };\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === TOKEN_STORAGE_KEY) {\n syncToken();\n }\n };\n\n window.addEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.addEventListener(\"storage\", handleStorageChange);\n\n let pollCount = 0;\n const pollInterval = window.setInterval(() => {\n pollCount++;\n syncToken();\n\n if (pollCount >= TOKEN_POLL_MAX_ATTEMPTS) {\n window.clearInterval(pollInterval);\n }\n }, TOKEN_POLL_INTERVAL_MS);\n\n return () => {\n window.removeEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.removeEventListener(\"storage\", handleStorageChange);\n window.clearInterval(pollInterval);\n };\n }, []);\n\n const fetchProfile = useCallback(async () => {\n if (!token) {\n if (isMountedRef.current) {\n setUser(null);\n setError(null);\n setIsFetching(false);\n }\n return;\n }\n\n if (!PUBLIC_KEY) {\n const publicKeyError = new Error(\n \"NEXT_PUBLIC_PK_AUTHDOG environment variable is not set\",\n );\n if (isMountedRef.current) {\n setError(publicKeyError);\n setUser(null);\n }\n throw publicKeyError;\n }\n\n if (isMountedRef.current) {\n setIsFetching(true);\n }\n\n try {\n const response = await fetchUserData(PUBLIC_KEY, token);\n if (isMountedRef.current) {\n setUser(response?.user ?? null);\n setError(null);\n }\n } catch (err) {\n const nextError =\n err instanceof Error\n ? err\n : new Error(\"Unexpected error fetching Authdog user\");\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Error fetching Authdog user profile:\", nextError);\n }\n if (isMountedRef.current) {\n setUser(null);\n setError(nextError);\n }\n throw nextError;\n } finally {\n if (isMountedRef.current) {\n setIsFetching(false);\n }\n }\n }, [token]);\n\n useEffect(() => {\n if (!isTokenInitialized) {\n return;\n }\n\n fetchProfile().catch(() => {\n /* error is already stored in state */\n });\n }, [fetchProfile, isTokenInitialized]);\n\n return {\n user,\n isLoading: !isTokenInitialized || isFetching,\n error,\n refetch: fetchProfile,\n };\n};\n"],"mappings":"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","names":["getPublicKeyPayload","publicKey","getTokenFromUri","url","validatePublicKey","publicKey","fetchUserData","token","publicKeyObj","getPublicKeyPayload","userData","browserCookiesOptions","React","useEffect","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","AuthdogProvider","children","useEffect","token","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","React","useEffect","useState","useAuth","token","setToken","useState","isLoading","setIsLoading","useEffect","readTokenFromStorage","TOKEN_STORAGE_KEY","syncToken","nextToken","currentToken","handleTokenUpdate","handleStorageChange","event","TOKEN_UPDATED_EVENT","pollCount","pollInterval","useCallback","useEffect","useRef","useState","PUBLIC_KEY","useUser","token","setToken","useState","isTokenInitialized","setIsTokenInitialized","user","setUser","error","setError","isFetching","setIsFetching","isMountedRef","useRef","useEffect","readTokenFromStorage","TOKEN_STORAGE_KEY","syncToken","nextToken","currentToken","handleTokenUpdate","handleStorageChange","event","TOKEN_UPDATED_EVENT","pollCount","pollInterval","fetchProfile","useCallback","publicKeyError","response","fetchUserData","err","nextError"]}
1
+ {"version":3,"sources":["../src/client/session.ts","../src/commons.ts","../src/client/constants.ts","../src/client/Provider.tsx","../src/hooks/useAuth.ts","../src/hooks/useUser.ts"],"sourcesContent":["import {\n fetchUserData as fetchUserInfo,\n isAuthenticatedUserInfo,\n} from \"@authdog/node-commons\";\nimport { validateAndParsePublicKey } from \"../commons\";\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"./constants\";\n\nexport const getTokenFromUri = (url: string): string | null => {\n return new URL(url).searchParams.get(\"token\");\n};\n\nexport interface AuthdogUser {\n id: string;\n environmentId: string;\n externalId: string;\n userName: string;\n displayName: string;\n nickName: string;\n profileUrl: string;\n title: string;\n userType: string;\n preferredLanguage: string | null;\n locale: string | null;\n timezone: string | null;\n active: boolean;\n provider: string;\n lastLogin: string;\n createdAt: string;\n updatedAt: string;\n names: {\n id: string;\n userId: string;\n formatted: string | null;\n familyName: string;\n givenName: string;\n middleName: string | null;\n honorificPrefix: string | null;\n honorificSuffix: string | null;\n createdAt: string;\n updatedAt: string;\n };\n addresses: [];\n emails: {\n value: string;\n primary: boolean;\n type: string;\n }[];\n phoneNumbers: [];\n ims: [];\n photos: {\n value: string;\n type: string;\n }[];\n}\n\nexport interface AuthdogUserResponse {\n user: AuthdogUser;\n meta: {\n code: number;\n message: string;\n };\n}\n\nexport const validatePublicKey = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n};\n\nexport const fetchUserData = async (\n publicKey: string,\n token: string,\n): Promise<AuthdogUserResponse | null> => {\n const { identityHost, environmentId } = validateAndParsePublicKey(publicKey);\n\n const userData = await fetchUserInfo(identityHost, environmentId, token);\n\n if (!isAuthenticatedUserInfo(userData)) {\n const status = userData?.meta?.code ?? \"unknown\";\n throw new Error(`Failed to fetch user info (status ${status})`);\n }\n\n return userData as unknown as AuthdogUserResponse;\n};\n\nexport const browserCookiesOptions = {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: \"/\",\n secure: true,\n sameSite: \"lax\" as const,\n};\n\n/**\n * Clears the client-side Authdog session: removes the locally stored token and\n * notifies hooks (`useAuth`/`useUser`) via the {@link TOKEN_UPDATED_EVENT}.\n *\n * Note: this only clears the browser-side token. The server-side session cookie\n * (and its hash) must also be cleared via the server logout handler\n * (`logoutHandler`) to fully log the user out.\n */\nexport const clearAuthdogSession = (): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n window.localStorage.removeItem(TOKEN_STORAGE_KEY);\n window.dispatchEvent(new Event(TOKEN_UPDATED_EVENT));\n};\n","export {\n validateAndParsePublicKey,\n // Backwards-compatible alias of `validateAndParsePublicKey`.\n getPublicKeyPayload,\n assertTrustedIdentityHost,\n type PublicKeyPayload,\n} from \"@authdog/node-commons\";\n","export const TOKEN_STORAGE_KEY = \"token\";\nexport const TOKEN_UPDATED_EVENT = \"token-updated\";\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\n\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"./constants\";\n\nconst JWT_PATTERN = /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/;\n\nexport const AuthdogProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n useEffect(() => {\n const token = new URLSearchParams(window.location.search).get(\"token\");\n if (token) {\n if (JWT_PATTERN.test(token)) {\n localStorage.setItem(TOKEN_STORAGE_KEY, token);\n window.dispatchEvent(new Event(TOKEN_UPDATED_EVENT));\n }\n // Always strip the token from the URL, even if it was rejected.\n window.history.replaceState({}, document.title, \"/\");\n }\n }, []);\n return <>{children}</>;\n};\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"../client/constants\";\n\nexport interface UseAuthResult {\n token: string | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n}\n\nexport const useAuth = (): UseAuthResult => {\n const [token, setToken] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n setToken(null);\n setIsLoading(false);\n return;\n }\n\n const readTokenFromStorage = () =>\n window.localStorage.getItem(TOKEN_STORAGE_KEY);\n\n const syncToken = () => {\n const nextToken = readTokenFromStorage();\n setToken((currentToken) =>\n currentToken === nextToken ? currentToken : nextToken,\n );\n };\n\n syncToken();\n setIsLoading(false);\n\n const handleTokenUpdate = () => {\n syncToken();\n };\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === TOKEN_STORAGE_KEY) {\n syncToken();\n }\n };\n\n window.addEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.addEventListener(\"storage\", handleStorageChange);\n\n return () => {\n window.removeEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.removeEventListener(\"storage\", handleStorageChange);\n };\n }, []);\n\n return {\n token,\n isAuthenticated: Boolean(token),\n isLoading,\n };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { TOKEN_STORAGE_KEY, TOKEN_UPDATED_EVENT } from \"../client/constants\";\nimport { fetchUserData, type AuthdogUser } from \"../client/session\";\n\nconst PUBLIC_KEY = process.env.NEXT_PUBLIC_PK_AUTHDOG;\n\nexport interface UseUserResult {\n user: AuthdogUser | null;\n isLoading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport const useUser = (): UseUserResult => {\n const [token, setToken] = useState<string | null>(null);\n const [isTokenInitialized, setIsTokenInitialized] = useState(false);\n const [user, setUser] = useState<AuthdogUser | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isFetching, setIsFetching] = useState(false);\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n setToken(null);\n setIsTokenInitialized(true);\n return;\n }\n\n const readTokenFromStorage = () =>\n window.localStorage.getItem(TOKEN_STORAGE_KEY);\n\n const syncToken = () => {\n const nextToken = readTokenFromStorage();\n setToken((currentToken) =>\n currentToken === nextToken ? currentToken : nextToken,\n );\n };\n\n syncToken();\n setIsTokenInitialized(true);\n\n const handleTokenUpdate = () => {\n syncToken();\n };\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === TOKEN_STORAGE_KEY) {\n syncToken();\n }\n };\n\n window.addEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.addEventListener(\"storage\", handleStorageChange);\n\n return () => {\n window.removeEventListener(TOKEN_UPDATED_EVENT, handleTokenUpdate);\n window.removeEventListener(\"storage\", handleStorageChange);\n };\n }, []);\n\n const fetchProfile = useCallback(async () => {\n if (!token) {\n if (isMountedRef.current) {\n setUser(null);\n setError(null);\n setIsFetching(false);\n }\n return;\n }\n\n if (!PUBLIC_KEY) {\n const publicKeyError = new Error(\n \"NEXT_PUBLIC_PK_AUTHDOG environment variable is not set\",\n );\n if (isMountedRef.current) {\n setError(publicKeyError);\n setUser(null);\n }\n throw publicKeyError;\n }\n\n if (isMountedRef.current) {\n setIsFetching(true);\n }\n\n try {\n const response = await fetchUserData(PUBLIC_KEY, token);\n if (isMountedRef.current) {\n setUser(response?.user ?? null);\n setError(null);\n }\n } catch (err) {\n const nextError =\n err instanceof Error\n ? err\n : new Error(\"Unexpected error fetching Authdog user\");\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Error fetching Authdog user profile:\", nextError);\n }\n if (isMountedRef.current) {\n setUser(null);\n setError(nextError);\n }\n throw nextError;\n } finally {\n if (isMountedRef.current) {\n setIsFetching(false);\n }\n }\n }, [token]);\n\n useEffect(() => {\n if (!isTokenInitialized) {\n return;\n }\n\n fetchProfile().catch(() => {});\n }, [fetchProfile, isTokenInitialized]);\n\n return {\n user,\n isLoading: !isTokenInitialized || isFetching,\n error,\n refetch: fetchProfile,\n };\n};\n"],"mappings":"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","names":["fetchUserInfo","isAuthenticatedUserInfo","validateAndParsePublicKey","getPublicKeyPayload","assertTrustedIdentityHost","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","getTokenFromUri","url","validatePublicKey","publicKey","fetchUserData","token","_a","identityHost","environmentId","validateAndParsePublicKey","userData","fetchUserInfo","isAuthenticatedUserInfo","status","browserCookiesOptions","clearAuthdogSession","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","React","useEffect","JWT_PATTERN","AuthdogProvider","children","useEffect","token","TOKEN_STORAGE_KEY","TOKEN_UPDATED_EVENT","React","useEffect","useState","useAuth","token","setToken","useState","isLoading","setIsLoading","useEffect","readTokenFromStorage","TOKEN_STORAGE_KEY","syncToken","nextToken","currentToken","handleTokenUpdate","handleStorageChange","event","TOKEN_UPDATED_EVENT","useCallback","useEffect","useRef","useState","PUBLIC_KEY","useUser","token","setToken","useState","isTokenInitialized","setIsTokenInitialized","user","setUser","error","setError","isFetching","setIsFetching","isMountedRef","useRef","useEffect","readTokenFromStorage","TOKEN_STORAGE_KEY","syncToken","nextToken","currentToken","handleTokenUpdate","handleStorageChange","event","TOKEN_UPDATED_EVENT","fetchProfile","useCallback","publicKeyError","response","fetchUserData","err","nextError"]}
@@ -1,6 +1,6 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
2
  import * as next_dist_compiled__edge_runtime_cookies from 'next/dist/compiled/@edge-runtime/cookies';
3
- import { P as PublicKeyPayload } from './commons-CoLIU2e7.mjs';
3
+ import * as _authdog_node_commons from '@authdog/node-commons';
4
4
 
5
5
  declare const useAuthMiddleware: (publicKey: string) => (request: NextRequest) => Promise<NextResponse<unknown>>;
6
6
 
@@ -8,6 +8,6 @@ declare const getSessionCookie: (publicKey: string) => Promise<next_dist_compile
8
8
 
9
9
  declare const logoutHandler: (req: NextRequest) => Promise<Response>;
10
10
 
11
- declare const getServerSidePayloadPublicKey: (publicKey: string) => PublicKeyPayload;
11
+ declare const getServerSidePayloadPublicKey: (publicKey: string) => _authdog_node_commons.PublicKeyPayload;
12
12
 
13
13
  export { getServerSidePayloadPublicKey, getSessionCookie, logoutHandler, useAuthMiddleware };
@@ -1,6 +1,6 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
2
  import * as next_dist_compiled__edge_runtime_cookies from 'next/dist/compiled/@edge-runtime/cookies';
3
- import { P as PublicKeyPayload } from './commons-CoLIU2e7.js';
3
+ import * as _authdog_node_commons from '@authdog/node-commons';
4
4
 
5
5
  declare const useAuthMiddleware: (publicKey: string) => (request: NextRequest) => Promise<NextResponse<unknown>>;
6
6
 
@@ -8,6 +8,6 @@ declare const getSessionCookie: (publicKey: string) => Promise<next_dist_compile
8
8
 
9
9
  declare const logoutHandler: (req: NextRequest) => Promise<Response>;
10
10
 
11
- declare const getServerSidePayloadPublicKey: (publicKey: string) => PublicKeyPayload;
11
+ declare const getServerSidePayloadPublicKey: (publicKey: string) => _authdog_node_commons.PublicKeyPayload;
12
12
 
13
13
  export { getServerSidePayloadPublicKey, getSessionCookie, logoutHandler, useAuthMiddleware };
@@ -1,2 +1,2 @@
1
- "use strict";"use server";var R=Object.create;var l=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var v=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),I=(e,t)=>{for(var r in t)l(e,r,{get:t[r],enumerable:!0})},d=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of N(t))!b.call(e,o)&&o!==r&&l(e,o,{get:()=>t[o],enumerable:!(i=_(t,o))||i.enumerable});return e};var A=(e,t,r)=>(r=e!=null?R(q(e)):{},d(t||!e||!e.__esModule?l(r,"default",{value:e,enumerable:!0}):r,e)),E=e=>d(l({},"__esModule",{value:!0}),e);var y=v((n,g)=>{"use strict";var s={NextRequest:require("next/dist/server/web/spec-extension/request").NextRequest,NextResponse:require("next/dist/server/web/spec-extension/response").NextResponse,ImageResponse:require("next/dist/server/web/spec-extension/image-response").ImageResponse,userAgentFromString:require("next/dist/server/web/spec-extension/user-agent").userAgentFromString,userAgent:require("next/dist/server/web/spec-extension/user-agent").userAgent,URLPattern:require("next/dist/server/web/spec-extension/url-pattern").URLPattern,after:require("next/dist/server/after").after,connection:require("next/dist/server/request/connection").connection,unstable_rootParams:require("next/dist/server/request/root-params").unstable_rootParams};g.exports=s;n.NextRequest=s.NextRequest;n.NextResponse=s.NextResponse;n.ImageResponse=s.ImageResponse;n.userAgentFromString=s.userAgentFromString;n.userAgent=s.userAgent;n.URLPattern=s.URLPattern;n.after=s.after;n.connection=s.connection;n.unstable_rootParams=s.unstable_rootParams});var H={};I(H,{getServerSidePayloadPublicKey:()=>m,getSessionCookie:()=>h,logoutHandler:()=>S,useAuthMiddleware:()=>k});module.exports=E(H);var P=A(y()),k=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key");let t=JSON.parse(Buffer.from(e.replace("pk_",""),"base64").toString("utf-8"));return async r=>{var p;let i=P.NextResponse.next(),o={maxAge:60*60*24*7,path:"/",httpOnly:!0},a=new URL(r.nextUrl).searchParams.get("token");if(a){let u=await fetch(`${t.identityHost}/oidc/${t.environmentId}/userinfo`,{headers:{authorization:`Bearer ${a}`}});if(!u.ok)throw new Error("Failed to fetch user info");let c=await u.json();((p=c==null?void 0:c.meta)==null?void 0:p.code)===200&&(i.cookies.set({name:`user_session_${t.environmentId}`,value:JSON.stringify(c.user),...o}),i.cookies.set({name:`user_session_hash_${t.environmentId}`,value:a,...o}))}return i}};var x=require("next/headers");var f=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key");try{return JSON.parse(Buffer.from(e.replace("pk_",""),"base64").toString("utf-8"))}catch{throw new Error("Failed to parse public key")}};var h=async e=>{if(!e)throw new Error("Public key is not defined");let t=f(e);return(await(0,x.cookies)()).get(`user_session_${t==null?void 0:t.environmentId}`)};var w=require("next/headers");var m=e=>{if(!e)throw new Error("Public key is not defined");return f(e)};var S=async e=>{let t=await(0,w.cookies)(),r=process.env.PK_AUTHDOG;if(!r)throw new Error("Public key is not defined");let o=(await m(r)).environmentId,a=`user_session_${o}`;t.get(a)&&t.delete(a);let u=`user_session_hash_${o}`;return t.get(u)&&t.delete(u),new Response(JSON.stringify({message:"Logout successfully",success:!0}),{status:200,headers:{"Content-Type":"application/json"}})};0&&(module.exports={getServerSidePayloadPublicKey,getSessionCookie,logoutHandler,useAuthMiddleware});
1
+ "use strict";var h=Object.create;var p=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var w=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),I=(t,e)=>{for(var o in e)p(t,o,{get:e[o],enumerable:!0})},l=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of q(e))!_.call(t,r)&&r!==o&&p(t,r,{get:()=>e[r],enumerable:!(i=A(e,r))||i.enumerable});return t};var b=(t,e,o)=>(o=t!=null?h(k(t)):{},l(e||!t||!t.__esModule?p(o,"default",{value:t,enumerable:!0}):o,t)),U=t=>l(p({},"__esModule",{value:!0}),t);var f=w((n,g)=>{"use strict";var s={NextRequest:require("next/dist/server/web/spec-extension/request").NextRequest,NextResponse:require("next/dist/server/web/spec-extension/response").NextResponse,ImageResponse:require("next/dist/server/web/spec-extension/image-response").ImageResponse,userAgentFromString:require("next/dist/server/web/spec-extension/user-agent").userAgentFromString,userAgent:require("next/dist/server/web/spec-extension/user-agent").userAgent,URLPattern:require("next/dist/server/web/spec-extension/url-pattern").URLPattern,after:require("next/dist/server/after").after,connection:require("next/dist/server/request/connection").connection};g.exports=s;n.NextRequest=s.NextRequest;n.NextResponse=s.NextResponse;n.ImageResponse=s.ImageResponse;n.userAgentFromString=s.userAgentFromString;n.userAgent=s.userAgent;n.URLPattern=s.URLPattern;n.after=s.after;n.connection=s.connection});var K={};I(K,{getServerSidePayloadPublicKey:()=>d,getSessionCookie:()=>R,logoutHandler:()=>v,useAuthMiddleware:()=>y});module.exports=U(K);var z=require("server-only");var x=b(f()),c=require("@authdog/node-commons"),y=t=>{let e=(0,c.validateAndParsePublicKey)(t);return async o=>{let i=x.NextResponse.next(),r={maxAge:3600*24*7,path:"/",httpOnly:!0,secure:process.env.NODE_ENV==="production",sameSite:"lax"},u=new URL(o.nextUrl).searchParams.get("token");if(u){let m=await(0,c.fetchUserData)(e.identityHost,e.environmentId,u);(0,c.isAuthenticatedUserInfo)(m)&&(i.cookies.set({name:`user_session_${e.environmentId}`,value:JSON.stringify(m.user),...r}),i.cookies.set({name:`user_session_hash_${e.environmentId}`,value:u,...r}))}return i}};var P=require("next/headers");var a=require("@authdog/node-commons");var R=async t=>{if(!t)throw new Error("Public key is not defined");let e=(0,a.validateAndParsePublicKey)(t);return(await(0,P.cookies)()).get(`user_session_${e==null?void 0:e.environmentId}`)};var N=require("next/headers");var d=t=>{if(!t)throw new Error("Public key is not defined");return(0,a.validateAndParsePublicKey)(t)};var v=async t=>{let e=await(0,N.cookies)(),o=process.env.PK_AUTHDOG;if(!o)throw new Error("Public key is not defined");let r=(await d(o)).environmentId,u={value:"",path:"/",maxAge:0,httpOnly:!0,secure:process.env.NODE_ENV==="production",sameSite:"lax"},m=`user_session_${r}`;e.set({name:m,...u});let S=`user_session_hash_${r}`;return e.set({name:S,...u}),new Response(JSON.stringify({message:"Logout successfully",success:!0}),{status:200,headers:{"Content-Type":"application/json"}})};0&&(module.exports={getServerSidePayloadPublicKey,getSessionCookie,logoutHandler,useAuthMiddleware});
2
2
  //# sourceMappingURL=index.server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/next@15.4.7_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/server.js","../src/index.server.ts","../src/server/middleware.ts","../src/server/cookies.ts","../src/commons.ts","../src/server/logout.ts","../src/server/publicKey.ts"],"sourcesContent":["const serverExports = {\n NextRequest: require('next/dist/server/web/spec-extension/request')\n .NextRequest,\n NextResponse: require('next/dist/server/web/spec-extension/response')\n .NextResponse,\n ImageResponse: require('next/dist/server/web/spec-extension/image-response')\n .ImageResponse,\n userAgentFromString: require('next/dist/server/web/spec-extension/user-agent')\n .userAgentFromString,\n userAgent: require('next/dist/server/web/spec-extension/user-agent')\n .userAgent,\n URLPattern: require('next/dist/server/web/spec-extension/url-pattern')\n .URLPattern,\n after: require('next/dist/server/after').after,\n connection: require('next/dist/server/request/connection').connection,\n unstable_rootParams: require('next/dist/server/request/root-params')\n .unstable_rootParams,\n}\n\n// https://nodejs.org/api/esm.html#commonjs-namespaces\n// When importing CommonJS modules, the module.exports object is provided as the default export\nmodule.exports = serverExports\n\n// make import { xxx } from 'next/server' work\nexports.NextRequest = serverExports.NextRequest\nexports.NextResponse = serverExports.NextResponse\nexports.ImageResponse = serverExports.ImageResponse\nexports.userAgentFromString = serverExports.userAgentFromString\nexports.userAgent = serverExports.userAgent\nexports.URLPattern = serverExports.URLPattern\nexports.after = serverExports.after\nexports.connection = serverExports.connection\nexports.unstable_rootParams = serverExports.unstable_rootParams\n","\"use server\";\nexport * from \"./server\";\n","import { NextResponse, type NextRequest } from \"next/server\";\n\nexport const useAuthMiddleware = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n\n const publicKeyObj = JSON.parse(\n Buffer.from(publicKey.replace(\"pk_\", \"\"), \"base64\").toString(\"utf-8\"),\n );\n\n return async (request: NextRequest) => {\n const response = NextResponse.next();\n const options = {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: \"/\",\n httpOnly: true,\n };\n\n const tokenFromUri = new URL(request.nextUrl).searchParams.get(\"token\");\n\n if (tokenFromUri) {\n const userData = await fetch(\n `${publicKeyObj.identityHost}/oidc/${publicKeyObj.environmentId}/userinfo`,\n {\n headers: {\n authorization: `Bearer ${tokenFromUri}`,\n },\n },\n );\n\n if (!userData.ok) {\n throw new Error(\"Failed to fetch user info\");\n }\n\n const authenticatedUser = await userData.json();\n\n if (authenticatedUser?.meta?.code === 200) {\n // TODO: define object in node-commons\n response.cookies.set({\n name: `user_session_${publicKeyObj.environmentId}`,\n value: JSON.stringify(authenticatedUser.user),\n ...options,\n });\n\n response.cookies.set({\n name: `user_session_hash_${publicKeyObj.environmentId}`,\n value: tokenFromUri,\n ...options,\n });\n }\n }\n // TODO: token from cookies\n\n return response;\n };\n};\n","import { cookies } from \"next/headers\";\nimport { getPublicKeyPayload } from \"../commons\";\n\nexport const getSessionCookie = async (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n const publicKeyObj = getPublicKeyPayload(publicKey);\n const cookieStore = await cookies();\n return cookieStore.get(`user_session_${publicKeyObj?.environmentId}`);\n};\n","export interface PublicKeyPayload {\n environmentId: string;\n identityHost: string;\n}\n\nexport const getPublicKeyPayload = (publicKey: string): PublicKeyPayload => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n\n try {\n return JSON.parse(\n Buffer.from(publicKey.replace(\"pk_\", \"\"), \"base64\").toString(\"utf-8\"),\n );\n } catch (e) {\n throw new Error(\"Failed to parse public key\");\n }\n};\n","import { cookies } from \"next/headers\";\nimport { NextRequest } from \"next/server\";\nimport { getServerSidePayloadPublicKey } from \"./publicKey\";\n\nexport const logoutHandler = async (req: NextRequest) => {\n const cookiesStore = await cookies();\n\n const publicKey = process.env.PK_AUTHDOG as string;\n\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n const payload = await getServerSidePayloadPublicKey(publicKey);\n\n const environmentId = payload.environmentId;\n const cookieNameSession = `user_session_${environmentId}`;\n\n const cookieValueSession = cookiesStore.get(cookieNameSession);\n\n if (cookieValueSession) {\n cookiesStore.delete(cookieNameSession);\n }\n\n const cookieNameHash = `user_session_hash_${environmentId}`;\n const cookieValueHash = cookiesStore.get(cookieNameHash);\n\n if (cookieValueHash) {\n cookiesStore.delete(cookieNameHash);\n }\n\n return new Response(\n JSON.stringify({\n message: \"Logout successfully\",\n success: true,\n }),\n {\n status: 200,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n};\n","import { getPublicKeyPayload } from \"../commons\";\nexport const getServerSidePayloadPublicKey = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n return getPublicKeyPayload(publicKey);\n};\n"],"mappings":"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","names":["require_server","__commonJSMin","exports","module","serverExports","index_server_exports","__export","getServerSidePayloadPublicKey","getSessionCookie","logoutHandler","useAuthMiddleware","__toCommonJS","import_server","useAuthMiddleware","publicKey","publicKeyObj","request","_a","response","options","tokenFromUri","userData","authenticatedUser","import_headers","getPublicKeyPayload","publicKey","getSessionCookie","publicKey","publicKeyObj","getPublicKeyPayload","import_headers","getServerSidePayloadPublicKey","publicKey","getPublicKeyPayload","logoutHandler","req","cookiesStore","publicKey","environmentId","getServerSidePayloadPublicKey","cookieNameSession","cookieNameHash"]}
1
+ {"version":3,"sources":["../node_modules/next/server.js","../src/index.server.ts","../src/server/middleware.ts","../src/server/cookies.ts","../src/commons.ts","../src/server/logout.ts","../src/server/publicKey.ts"],"sourcesContent":["const serverExports = {\n NextRequest: require('next/dist/server/web/spec-extension/request')\n .NextRequest,\n NextResponse: require('next/dist/server/web/spec-extension/response')\n .NextResponse,\n ImageResponse: require('next/dist/server/web/spec-extension/image-response')\n .ImageResponse,\n userAgentFromString: require('next/dist/server/web/spec-extension/user-agent')\n .userAgentFromString,\n userAgent: require('next/dist/server/web/spec-extension/user-agent')\n .userAgent,\n URLPattern: require('next/dist/server/web/spec-extension/url-pattern')\n .URLPattern,\n after: require('next/dist/server/after').after,\n connection: require('next/dist/server/request/connection').connection,\n}\n\n// https://nodejs.org/api/esm.html#commonjs-namespaces\n// When importing CommonJS modules, the module.exports object is provided as the default export\nmodule.exports = serverExports\n\n// make import { xxx } from 'next/server' work\nexports.NextRequest = serverExports.NextRequest\nexports.NextResponse = serverExports.NextResponse\nexports.ImageResponse = serverExports.ImageResponse\nexports.userAgentFromString = serverExports.userAgentFromString\nexports.userAgent = serverExports.userAgent\nexports.URLPattern = serverExports.URLPattern\nexports.after = serverExports.after\nexports.connection = serverExports.connection\n","import \"server-only\";\nexport * from \"./server\";\n","import { NextResponse, type NextRequest } from \"next/server\";\nimport {\n validateAndParsePublicKey,\n fetchUserData,\n isAuthenticatedUserInfo,\n} from \"@authdog/node-commons\";\n\nexport const useAuthMiddleware = (publicKey: string) => {\n const publicKeyObj = validateAndParsePublicKey(publicKey);\n\n return async (request: NextRequest) => {\n const response = NextResponse.next();\n const options = {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: \"/\",\n httpOnly: true,\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"lax\" as const,\n };\n\n const tokenFromUri = new URL(request.nextUrl).searchParams.get(\"token\");\n\n if (tokenFromUri) {\n const userData = await fetchUserData(\n publicKeyObj.identityHost,\n publicKeyObj.environmentId,\n tokenFromUri,\n );\n\n if (isAuthenticatedUserInfo(userData)) {\n response.cookies.set({\n name: `user_session_${publicKeyObj.environmentId}`,\n value: JSON.stringify(userData.user),\n ...options,\n });\n\n response.cookies.set({\n name: `user_session_hash_${publicKeyObj.environmentId}`,\n value: tokenFromUri,\n ...options,\n });\n }\n }\n // TODO: token from cookies\n\n return response;\n };\n};\n","import { cookies } from \"next/headers\";\nimport { validateAndParsePublicKey } from \"../commons\";\n\nexport const getSessionCookie = async (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n const publicKeyObj = validateAndParsePublicKey(publicKey);\n const cookieStore = await cookies();\n return cookieStore.get(`user_session_${publicKeyObj?.environmentId}`);\n};\n","export {\n validateAndParsePublicKey,\n // Backwards-compatible alias of `validateAndParsePublicKey`.\n getPublicKeyPayload,\n assertTrustedIdentityHost,\n type PublicKeyPayload,\n} from \"@authdog/node-commons\";\n","import { cookies } from \"next/headers\";\nimport { NextRequest } from \"next/server\";\nimport { getServerSidePayloadPublicKey } from \"./publicKey\";\n\nexport const logoutHandler = async (req: NextRequest) => {\n const cookiesStore = await cookies();\n\n const publicKey = process.env.PK_AUTHDOG as string;\n\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n const payload = await getServerSidePayloadPublicKey(publicKey);\n\n const environmentId = payload.environmentId;\n\n const deleteOptions = {\n value: \"\",\n path: \"/\",\n maxAge: 0,\n httpOnly: true,\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"lax\" as const,\n };\n\n const cookieNameSession = `user_session_${environmentId}`;\n cookiesStore.set({ name: cookieNameSession, ...deleteOptions });\n\n const cookieNameHash = `user_session_hash_${environmentId}`;\n cookiesStore.set({ name: cookieNameHash, ...deleteOptions });\n\n return new Response(\n JSON.stringify({\n message: \"Logout successfully\",\n success: true,\n }),\n {\n status: 200,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n};\n","import { validateAndParsePublicKey } from \"../commons\";\nexport const getServerSidePayloadPublicKey = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n return validateAndParsePublicKey(publicKey);\n};\n"],"mappings":"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","names":["require_server","__commonJSMin","exports","module","serverExports","index_server_exports","__export","getServerSidePayloadPublicKey","getSessionCookie","logoutHandler","useAuthMiddleware","__toCommonJS","import_server_only","import_server","import_node_commons","useAuthMiddleware","publicKey","publicKeyObj","request","response","options","tokenFromUri","userData","import_headers","import_node_commons","getSessionCookie","publicKey","publicKeyObj","import_headers","getServerSidePayloadPublicKey","publicKey","logoutHandler","req","cookiesStore","publicKey","environmentId","getServerSidePayloadPublicKey","deleteOptions","cookieNameSession","cookieNameHash"]}
@@ -1,2 +1,2 @@
1
- "use server";var k=Object.create;var d=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var w=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var i=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var R=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var _=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of h(t))!S.call(e,o)&&o!==r&&d(e,o,{get:()=>t[o],enumerable:!(a=x(t,o))||a.enumerable});return e};var N=(e,t,r)=>(r=e!=null?k(w(e)):{},_(t||!e||!e.__esModule?d(r,"default",{value:e,enumerable:!0}):r,e));var y=R((n,g)=>{"use strict";var s={NextRequest:i("next/dist/server/web/spec-extension/request").NextRequest,NextResponse:i("next/dist/server/web/spec-extension/response").NextResponse,ImageResponse:i("next/dist/server/web/spec-extension/image-response").ImageResponse,userAgentFromString:i("next/dist/server/web/spec-extension/user-agent").userAgentFromString,userAgent:i("next/dist/server/web/spec-extension/user-agent").userAgent,URLPattern:i("next/dist/server/web/spec-extension/url-pattern").URLPattern,after:i("next/dist/server/after").after,connection:i("next/dist/server/request/connection").connection,unstable_rootParams:i("next/dist/server/request/root-params").unstable_rootParams};g.exports=s;n.NextRequest=s.NextRequest;n.NextResponse=s.NextResponse;n.ImageResponse=s.ImageResponse;n.userAgentFromString=s.userAgentFromString;n.userAgent=s.userAgent;n.URLPattern=s.URLPattern;n.after=s.after;n.connection=s.connection;n.unstable_rootParams=s.unstable_rootParams});var P=N(y()),q=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key");let t=JSON.parse(Buffer.from(e.replace("pk_",""),"base64").toString("utf-8"));return async r=>{var m;let a=P.NextResponse.next(),o={maxAge:60*60*24*7,path:"/",httpOnly:!0},u=new URL(r.nextUrl).searchParams.get("token");if(u){let c=await fetch(`${t.identityHost}/oidc/${t.environmentId}/userinfo`,{headers:{authorization:`Bearer ${u}`}});if(!c.ok)throw new Error("Failed to fetch user info");let l=await c.json();((m=l==null?void 0:l.meta)==null?void 0:m.code)===200&&(a.cookies.set({name:`user_session_${t.environmentId}`,value:JSON.stringify(l.user),...o}),a.cookies.set({name:`user_session_hash_${t.environmentId}`,value:u,...o}))}return a}};import{cookies as b}from"next/headers";var f=e=>{if(!e)throw new Error("Public key is not defined");if(!e.startsWith("pk_"))throw new Error("Invalid public key");try{return JSON.parse(Buffer.from(e.replace("pk_",""),"base64").toString("utf-8"))}catch{throw new Error("Failed to parse public key")}};var v=async e=>{if(!e)throw new Error("Public key is not defined");let t=f(e);return(await b()).get(`user_session_${t==null?void 0:t.environmentId}`)};import{cookies as I}from"next/headers";var p=e=>{if(!e)throw new Error("Public key is not defined");return f(e)};var A=async e=>{let t=await I(),r=process.env.PK_AUTHDOG;if(!r)throw new Error("Public key is not defined");let o=(await p(r)).environmentId,u=`user_session_${o}`;t.get(u)&&t.delete(u);let c=`user_session_hash_${o}`;return t.get(c)&&t.delete(c),new Response(JSON.stringify({message:"Logout successfully",success:!0}),{status:200,headers:{"Content-Type":"application/json"}})};export{p as getServerSidePayloadPublicKey,v as getSessionCookie,A as logoutHandler,q as useAuthMiddleware};
1
+ var y=Object.create;var d=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var i=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,o)=>(typeof require<"u"?require:e)[o]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var S=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var h=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of R(e))!v.call(t,r)&&r!==o&&d(t,r,{get:()=>e[r],enumerable:!(a=P(e,r))||a.enumerable});return t};var A=(t,e,o)=>(o=t!=null?y(N(t)):{},h(e||!t||!t.__esModule?d(o,"default",{value:t,enumerable:!0}):o,t));var g=S((n,l)=>{"use strict";var s={NextRequest:i("next/dist/server/web/spec-extension/request").NextRequest,NextResponse:i("next/dist/server/web/spec-extension/response").NextResponse,ImageResponse:i("next/dist/server/web/spec-extension/image-response").ImageResponse,userAgentFromString:i("next/dist/server/web/spec-extension/user-agent").userAgentFromString,userAgent:i("next/dist/server/web/spec-extension/user-agent").userAgent,URLPattern:i("next/dist/server/web/spec-extension/url-pattern").URLPattern,after:i("next/dist/server/after").after,connection:i("next/dist/server/request/connection").connection};l.exports=s;n.NextRequest=s.NextRequest;n.NextResponse=s.NextResponse;n.ImageResponse=s.ImageResponse;n.userAgentFromString=s.userAgentFromString;n.userAgent=s.userAgent;n.URLPattern=s.URLPattern;n.after=s.after;n.connection=s.connection});import"server-only";var f=A(g());import{validateAndParsePublicKey as q,fetchUserData as k,isAuthenticatedUserInfo as _}from"@authdog/node-commons";var w=t=>{let e=q(t);return async o=>{let a=f.NextResponse.next(),r={maxAge:3600*24*7,path:"/",httpOnly:!0,secure:process.env.NODE_ENV==="production",sameSite:"lax"},u=new URL(o.nextUrl).searchParams.get("token");if(u){let c=await k(e.identityHost,e.environmentId,u);_(c)&&(a.cookies.set({name:`user_session_${e.environmentId}`,value:JSON.stringify(c.user),...r}),a.cookies.set({name:`user_session_hash_${e.environmentId}`,value:u,...r}))}return a}};import{cookies as I}from"next/headers";import{validateAndParsePublicKey as m,getPublicKeyPayload as F,assertTrustedIdentityHost as $}from"@authdog/node-commons";var b=async t=>{if(!t)throw new Error("Public key is not defined");let e=m(t);return(await I()).get(`user_session_${e==null?void 0:e.environmentId}`)};import{cookies as U}from"next/headers";var p=t=>{if(!t)throw new Error("Public key is not defined");return m(t)};var K=async t=>{let e=await U(),o=process.env.PK_AUTHDOG;if(!o)throw new Error("Public key is not defined");let r=(await p(o)).environmentId,u={value:"",path:"/",maxAge:0,httpOnly:!0,secure:process.env.NODE_ENV==="production",sameSite:"lax"},c=`user_session_${r}`;e.set({name:c,...u});let x=`user_session_hash_${r}`;return e.set({name:x,...u}),new Response(JSON.stringify({message:"Logout successfully",success:!0}),{status:200,headers:{"Content-Type":"application/json"}})};export{p as getServerSidePayloadPublicKey,b as getSessionCookie,K as logoutHandler,w as useAuthMiddleware};
2
2
  //# sourceMappingURL=index.server.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/next@15.4.7_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/server.js","../src/server/middleware.ts","../src/server/cookies.ts","../src/commons.ts","../src/server/logout.ts","../src/server/publicKey.ts"],"sourcesContent":["const serverExports = {\n NextRequest: require('next/dist/server/web/spec-extension/request')\n .NextRequest,\n NextResponse: require('next/dist/server/web/spec-extension/response')\n .NextResponse,\n ImageResponse: require('next/dist/server/web/spec-extension/image-response')\n .ImageResponse,\n userAgentFromString: require('next/dist/server/web/spec-extension/user-agent')\n .userAgentFromString,\n userAgent: require('next/dist/server/web/spec-extension/user-agent')\n .userAgent,\n URLPattern: require('next/dist/server/web/spec-extension/url-pattern')\n .URLPattern,\n after: require('next/dist/server/after').after,\n connection: require('next/dist/server/request/connection').connection,\n unstable_rootParams: require('next/dist/server/request/root-params')\n .unstable_rootParams,\n}\n\n// https://nodejs.org/api/esm.html#commonjs-namespaces\n// When importing CommonJS modules, the module.exports object is provided as the default export\nmodule.exports = serverExports\n\n// make import { xxx } from 'next/server' work\nexports.NextRequest = serverExports.NextRequest\nexports.NextResponse = serverExports.NextResponse\nexports.ImageResponse = serverExports.ImageResponse\nexports.userAgentFromString = serverExports.userAgentFromString\nexports.userAgent = serverExports.userAgent\nexports.URLPattern = serverExports.URLPattern\nexports.after = serverExports.after\nexports.connection = serverExports.connection\nexports.unstable_rootParams = serverExports.unstable_rootParams\n","import { NextResponse, type NextRequest } from \"next/server\";\n\nexport const useAuthMiddleware = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n\n const publicKeyObj = JSON.parse(\n Buffer.from(publicKey.replace(\"pk_\", \"\"), \"base64\").toString(\"utf-8\"),\n );\n\n return async (request: NextRequest) => {\n const response = NextResponse.next();\n const options = {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: \"/\",\n httpOnly: true,\n };\n\n const tokenFromUri = new URL(request.nextUrl).searchParams.get(\"token\");\n\n if (tokenFromUri) {\n const userData = await fetch(\n `${publicKeyObj.identityHost}/oidc/${publicKeyObj.environmentId}/userinfo`,\n {\n headers: {\n authorization: `Bearer ${tokenFromUri}`,\n },\n },\n );\n\n if (!userData.ok) {\n throw new Error(\"Failed to fetch user info\");\n }\n\n const authenticatedUser = await userData.json();\n\n if (authenticatedUser?.meta?.code === 200) {\n // TODO: define object in node-commons\n response.cookies.set({\n name: `user_session_${publicKeyObj.environmentId}`,\n value: JSON.stringify(authenticatedUser.user),\n ...options,\n });\n\n response.cookies.set({\n name: `user_session_hash_${publicKeyObj.environmentId}`,\n value: tokenFromUri,\n ...options,\n });\n }\n }\n // TODO: token from cookies\n\n return response;\n };\n};\n","import { cookies } from \"next/headers\";\nimport { getPublicKeyPayload } from \"../commons\";\n\nexport const getSessionCookie = async (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n const publicKeyObj = getPublicKeyPayload(publicKey);\n const cookieStore = await cookies();\n return cookieStore.get(`user_session_${publicKeyObj?.environmentId}`);\n};\n","export interface PublicKeyPayload {\n environmentId: string;\n identityHost: string;\n}\n\nexport const getPublicKeyPayload = (publicKey: string): PublicKeyPayload => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n if (!publicKey.startsWith(\"pk_\")) {\n throw new Error(\"Invalid public key\");\n }\n\n try {\n return JSON.parse(\n Buffer.from(publicKey.replace(\"pk_\", \"\"), \"base64\").toString(\"utf-8\"),\n );\n } catch (e) {\n throw new Error(\"Failed to parse public key\");\n }\n};\n","import { cookies } from \"next/headers\";\nimport { NextRequest } from \"next/server\";\nimport { getServerSidePayloadPublicKey } from \"./publicKey\";\n\nexport const logoutHandler = async (req: NextRequest) => {\n const cookiesStore = await cookies();\n\n const publicKey = process.env.PK_AUTHDOG as string;\n\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n const payload = await getServerSidePayloadPublicKey(publicKey);\n\n const environmentId = payload.environmentId;\n const cookieNameSession = `user_session_${environmentId}`;\n\n const cookieValueSession = cookiesStore.get(cookieNameSession);\n\n if (cookieValueSession) {\n cookiesStore.delete(cookieNameSession);\n }\n\n const cookieNameHash = `user_session_hash_${environmentId}`;\n const cookieValueHash = cookiesStore.get(cookieNameHash);\n\n if (cookieValueHash) {\n cookiesStore.delete(cookieNameHash);\n }\n\n return new Response(\n JSON.stringify({\n message: \"Logout successfully\",\n success: true,\n }),\n {\n status: 200,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n};\n","import { getPublicKeyPayload } from \"../commons\";\nexport const getServerSidePayloadPublicKey = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n return getPublicKeyPayload(publicKey);\n};\n"],"mappings":"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","names":["require_server","__commonJSMin","exports","module","serverExports","import_server","useAuthMiddleware","publicKey","publicKeyObj","request","_a","response","options","tokenFromUri","userData","authenticatedUser","cookies","getPublicKeyPayload","publicKey","getSessionCookie","publicKey","publicKeyObj","getPublicKeyPayload","cookies","cookies","getServerSidePayloadPublicKey","publicKey","getPublicKeyPayload","logoutHandler","req","cookiesStore","cookies","publicKey","environmentId","getServerSidePayloadPublicKey","cookieNameSession","cookieNameHash"]}
1
+ {"version":3,"sources":["../node_modules/next/server.js","../src/index.server.ts","../src/server/middleware.ts","../src/server/cookies.ts","../src/commons.ts","../src/server/logout.ts","../src/server/publicKey.ts"],"sourcesContent":["const serverExports = {\n NextRequest: require('next/dist/server/web/spec-extension/request')\n .NextRequest,\n NextResponse: require('next/dist/server/web/spec-extension/response')\n .NextResponse,\n ImageResponse: require('next/dist/server/web/spec-extension/image-response')\n .ImageResponse,\n userAgentFromString: require('next/dist/server/web/spec-extension/user-agent')\n .userAgentFromString,\n userAgent: require('next/dist/server/web/spec-extension/user-agent')\n .userAgent,\n URLPattern: require('next/dist/server/web/spec-extension/url-pattern')\n .URLPattern,\n after: require('next/dist/server/after').after,\n connection: require('next/dist/server/request/connection').connection,\n}\n\n// https://nodejs.org/api/esm.html#commonjs-namespaces\n// When importing CommonJS modules, the module.exports object is provided as the default export\nmodule.exports = serverExports\n\n// make import { xxx } from 'next/server' work\nexports.NextRequest = serverExports.NextRequest\nexports.NextResponse = serverExports.NextResponse\nexports.ImageResponse = serverExports.ImageResponse\nexports.userAgentFromString = serverExports.userAgentFromString\nexports.userAgent = serverExports.userAgent\nexports.URLPattern = serverExports.URLPattern\nexports.after = serverExports.after\nexports.connection = serverExports.connection\n","import \"server-only\";\nexport * from \"./server\";\n","import { NextResponse, type NextRequest } from \"next/server\";\nimport {\n validateAndParsePublicKey,\n fetchUserData,\n isAuthenticatedUserInfo,\n} from \"@authdog/node-commons\";\n\nexport const useAuthMiddleware = (publicKey: string) => {\n const publicKeyObj = validateAndParsePublicKey(publicKey);\n\n return async (request: NextRequest) => {\n const response = NextResponse.next();\n const options = {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: \"/\",\n httpOnly: true,\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"lax\" as const,\n };\n\n const tokenFromUri = new URL(request.nextUrl).searchParams.get(\"token\");\n\n if (tokenFromUri) {\n const userData = await fetchUserData(\n publicKeyObj.identityHost,\n publicKeyObj.environmentId,\n tokenFromUri,\n );\n\n if (isAuthenticatedUserInfo(userData)) {\n response.cookies.set({\n name: `user_session_${publicKeyObj.environmentId}`,\n value: JSON.stringify(userData.user),\n ...options,\n });\n\n response.cookies.set({\n name: `user_session_hash_${publicKeyObj.environmentId}`,\n value: tokenFromUri,\n ...options,\n });\n }\n }\n // TODO: token from cookies\n\n return response;\n };\n};\n","import { cookies } from \"next/headers\";\nimport { validateAndParsePublicKey } from \"../commons\";\n\nexport const getSessionCookie = async (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n const publicKeyObj = validateAndParsePublicKey(publicKey);\n const cookieStore = await cookies();\n return cookieStore.get(`user_session_${publicKeyObj?.environmentId}`);\n};\n","export {\n validateAndParsePublicKey,\n // Backwards-compatible alias of `validateAndParsePublicKey`.\n getPublicKeyPayload,\n assertTrustedIdentityHost,\n type PublicKeyPayload,\n} from \"@authdog/node-commons\";\n","import { cookies } from \"next/headers\";\nimport { NextRequest } from \"next/server\";\nimport { getServerSidePayloadPublicKey } from \"./publicKey\";\n\nexport const logoutHandler = async (req: NextRequest) => {\n const cookiesStore = await cookies();\n\n const publicKey = process.env.PK_AUTHDOG as string;\n\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n\n const payload = await getServerSidePayloadPublicKey(publicKey);\n\n const environmentId = payload.environmentId;\n\n const deleteOptions = {\n value: \"\",\n path: \"/\",\n maxAge: 0,\n httpOnly: true,\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"lax\" as const,\n };\n\n const cookieNameSession = `user_session_${environmentId}`;\n cookiesStore.set({ name: cookieNameSession, ...deleteOptions });\n\n const cookieNameHash = `user_session_hash_${environmentId}`;\n cookiesStore.set({ name: cookieNameHash, ...deleteOptions });\n\n return new Response(\n JSON.stringify({\n message: \"Logout successfully\",\n success: true,\n }),\n {\n status: 200,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n};\n","import { validateAndParsePublicKey } from \"../commons\";\nexport const getServerSidePayloadPublicKey = (publicKey: string) => {\n if (!publicKey) {\n throw new Error(\"Public key is not defined\");\n }\n return validateAndParsePublicKey(publicKey);\n};\n"],"mappings":"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","names":["require_server","__commonJSMin","exports","module","serverExports","import_server","validateAndParsePublicKey","fetchUserData","isAuthenticatedUserInfo","useAuthMiddleware","publicKey","publicKeyObj","request","response","options","tokenFromUri","userData","cookies","validateAndParsePublicKey","getPublicKeyPayload","assertTrustedIdentityHost","getSessionCookie","publicKey","publicKeyObj","validateAndParsePublicKey","cookies","cookies","getServerSidePayloadPublicKey","publicKey","validateAndParsePublicKey","logoutHandler","req","cookiesStore","cookies","publicKey","environmentId","getServerSidePayloadPublicKey","deleteOptions","cookieNameSession","cookieNameHash"]}
package/package.json CHANGED
@@ -1,48 +1,73 @@
1
1
  {
2
- "name": "@authdog/nextjs-app",
3
- "version": "1.0.1",
4
- "description": "Authdog Next.js SDK",
5
- "source": "src/index.ts",
6
- "main": "dist/index.js",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "exports": {
10
- "./client": {
11
- "types": "dist/index.d.ts",
12
- "import": "./dist/index.js"
2
+ "name": "@authdog/nextjs-app",
3
+ "version": "2.0.0",
4
+ "description": "Authdog Next.js SDK",
5
+ "source": "src/index.ts",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ },
15
+ "./client": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.mjs",
18
+ "require": "./dist/index.js"
19
+ },
20
+ "./server": {
21
+ "types": "./dist/index.server.d.ts",
22
+ "import": "./dist/index.server.mjs",
23
+ "require": "./dist/index.server.js"
24
+ }
13
25
  },
14
- "./server": {
15
- "types": "dist/index.server.d.ts",
16
- "import": "dist/index.server.js",
17
- "require": "dist/index.server.js"
26
+ "files": [
27
+ "dist/"
28
+ ],
29
+ "sideEffects": false,
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/authdog-labs/web-sdk.git",
33
+ "directory": "packages/nextjs-app"
34
+ },
35
+ "homepage": "https://github.com/authdog-labs/web-sdk/tree/main/packages/nextjs-app#readme",
36
+ "bugs": {
37
+ "url": "https://github.com/authdog-labs/web-sdk/issues"
38
+ },
39
+ "scripts": {
40
+ "format": "prettier --config .prettierrc.json --write \"**/*.{ts,md}\"",
41
+ "type-check": "tsc",
42
+ "clean": "rm -rf dist",
43
+ "build": "bun run clean && tsup",
44
+ "test": "vitest run",
45
+ "ship": "bun run build && bun publish --access public"
46
+ },
47
+ "dependencies": {
48
+ "@authdog/node-commons": "workspace:*",
49
+ "server-only": "^0.0.1"
50
+ },
51
+ "peerDependencies": {
52
+ "next": ">=15 <17",
53
+ "react": "^18.2.0 || ^19.0.0",
54
+ "react-dom": "^18.2.0 || ^19.0.0"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^22.10.5",
58
+ "@types/react": "^19.1.0",
59
+ "@types/react-dom": "^19.1.0",
60
+ "dotenv": "^16.4.7",
61
+ "next": "^16.1.5",
62
+ "prettier": "^3.4.2",
63
+ "react": "^19.1.0",
64
+ "react-dom": "^19.1.0",
65
+ "tsup": "^8.3.5",
66
+ "typescript": "^5.7.2",
67
+ "vitest": "^2.1.8"
68
+ },
69
+ "publishConfig": {
70
+ "registry": "https://registry.npmjs.org/",
71
+ "access": "public"
18
72
  }
19
- },
20
- "files": [
21
- "dist/"
22
- ],
23
- "dependencies": {
24
- "next": "^15.1.0",
25
- "react": "^19.1.0"
26
- },
27
- "devDependencies": {
28
- "@types/next": "^9.0.0",
29
- "@types/node": "^22.10.5",
30
- "@types/react": "^19.1.0",
31
- "dotenv": "^16.4.7",
32
- "prettier": "^3.4.2",
33
- "tsup": "^8.3.5",
34
- "typescript": "^5.7.2",
35
- "vitest": "^2.1.8"
36
- },
37
- "publishConfig": {
38
- "registry": "https://registry.npmjs.org/",
39
- "access": "public"
40
- },
41
- "scripts": {
42
- "format": "prettier --config .prettierrc.json --write \"**/*.{ts,md}\"",
43
- "type-check": "tsc",
44
- "clean": "rm -rf dist",
45
- "build": "pnpm clean && tsup",
46
- "ship": "pnpm build && pnpm publish --access public --no-git-checks"
47
- }
48
73
  }
@@ -1,7 +0,0 @@
1
- interface PublicKeyPayload {
2
- environmentId: string;
3
- identityHost: string;
4
- }
5
- declare const getPublicKeyPayload: (publicKey: string) => PublicKeyPayload;
6
-
7
- export { type PublicKeyPayload as P, getPublicKeyPayload as g };
@@ -1,7 +0,0 @@
1
- interface PublicKeyPayload {
2
- environmentId: string;
3
- identityHost: string;
4
- }
5
- declare const getPublicKeyPayload: (publicKey: string) => PublicKeyPayload;
6
-
7
- export { type PublicKeyPayload as P, getPublicKeyPayload as g };