UNPKG

@kinde-oss/kinde-auth-react

Version:

Kinde React SDK for authentication

1 lines 12.7 kB
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useKindeAuth-BqgGb6if.cjs"),t=require("./js-utils-LjN61ZXr.cjs");let n=require("react");n=e.r(n,1);let r=require("react/jsx-runtime");var i=function(e){return e.performingLogout=`performing_logout`,e}(i||{}),a=new t.ct,o=new t.K;t.m(a),t._(o);var s=e=>e||window.location.origin,c={name:`@kinde-oss/kinde-auth-react`,version:`5.13.0`,description:`Kinde React SDK for authentication`,module:`./dist/index.mjs`,main:`./dist/index.cjs`,types:`./dist/index.d.ts`,type:`module`,exports:{".":{types:`./dist/src/index.d.ts`,import:`./dist/index.mjs`,require:`./dist/index.cjs`},"./components":{types:`./dist/src/components/index.d.ts`,import:`./dist/components.mjs`,require:`./dist/components.cjs`},"./utils":{types:`./dist/src/utils/index.d.ts`,import:`./dist/utils.mjs`,require:`./dist/utils.cjs`},"./react-router":{types:`./dist/src/components/react-router-dom/index.d.ts`,import:`./dist/react-router.mjs`,require:`./dist/react-router.cjs`}},scripts:{build:`tsc && vite build`,test:`vitest`,"test:coverage":`vitest --coverage`,release:`release-it`,lint:`prettier --check .`,"lint:fix":`prettier --write .`,"dev:prepare":`rm -rf playground && git clone https://github.com/kinde-starter-kits/react-starter-kit playground && cd playground && printf "overrides:\\n '@kinde-oss/kinde-auth-react': link:..\\n" > pnpm-workspace.yaml && pnpm install && mv .env_sample .env && rm -rf .git`,dev:`cd playground && npm start`},author:{name:`Kinde`,email:`engineering@kinde.com`,url:`https://kinde.com`},repository:{type:`git`,url:`https://github.com/kinde-oss/kinde-auth-react`},bugs:`https://github.com/kinde-oss/kinde-auth-react`,homepage:`https://kinde.com`,license:`MIT`,devDependencies:{"@eslint/eslintrc":`^3.3.1`,"@eslint/js":`^10.0.0`,"@testing-library/jest-dom":`^6.6.3`,"@testing-library/react":`^16.2.0`,"@types/node":`^24.0.0`,"@types/react":`19.2.17`,"@typescript-eslint/eslint-plugin":`8.65.0`,"@typescript-eslint/parser":`8.65.0`,"@typescript/typescript6":`6.0.2`,"@vitejs/plugin-react":`^6.0.0`,"@vitest/coverage-v8":`^4.0.0`,eslint:`10.7.0`,"eslint-config-prettier":`^10.0.2`,"eslint-plugin-react":`^7.37.4`,globals:`^17.0.0`,jsdom:`^29.0.0`,prettier:`^3.5.2`,react:`^19.2.4`,"react-dom":`^19.2.4`,"release-it":`^20.0.0`,typescript:`7.0.2`,vite:`^8.0.0`,"vite-plugin-dts":`^5.0.0`,vitest:`^4.0.0`},keywords:[`Kinde`,`login`,`Authorization Code Grant Flow`,`PKCE`,`Single Page Application authentication`,`React authentication`],peerDependencies:{react:`^17 || ^18 || >=19.2.1`,"react-dom":`^17 || ^18 || >=19.2.1`},files:[`dist`,`src`,`LICENSE.md`],private:!1,dependencies:{"@kinde/js-utils":`0.32.0`},packageManager:`pnpm@11.15.1`},l=function(e){return e.preWarning=`preWarning`,e.timeout=`timeout`,e}({});t.tt.keyPrefix=``;var u={onSuccess:()=>{window.history.replaceState({},document.title,window.location.pathname)}},d=()=>{try{let e=window.opener;return!e||e.closed?!1:e.location.origin===window.location.origin}catch{return!1}},f=(e,{skipInitial:t=!1}={})=>{let r=(0,n.useRef)(!0);(0,n.useEffect)(()=>{let n=()=>{if(t&&r.current){r.current=!1;return}e(window.location)},i=()=>n();window.addEventListener(`popstate`,i),window.addEventListener(`hashchange`,i);let a=history.pushState,o=history.replaceState;return history.pushState===a&&(history.pushState=function(...e){a.apply(this,e),n()}),history.replaceState===o&&(history.replaceState=function(...e){o.apply(this,e),n()}),()=>{window.removeEventListener(`popstate`,i),window.removeEventListener(`hashchange`,i),history.pushState=a,history.replaceState=o}},[e,t])},p=({audience:p,scope:m,clientId:h,children:g,domain:_,useInsecureForRefreshToken:v=!1,redirectUri:y,callbacks:b={},logoutUri:x,forceChildrenRender:S=!1,popupOptions:C={},store:w=a,activityTimeout:T,refreshOnFocus:E=!1})=>{let[D]=(0,n.useState)(()=>{if(typeof window>`u`)return{invitationCode:null,redirectPending:!1};let e=new URLSearchParams(window.location.search);return{invitationCode:e.get(`invitation_code`),redirectPending:e.has(`invitation_code`)}}),O=(0,n.useRef)(D.invitationCode),[k,A]=(0,n.useState)(()=>D.redirectPending),j=(0,n.useMemo)(()=>({...u,...b}),[b]),[M,N]=(0,n.useState)(!1),[P,F]=(0,n.useState)({user:void 0,isAuthenticated:!1,isLoading:!0}),[I,L]=(0,n.useState)(S),R=(0,n.useRef)(null),z=(0,n.useCallback)(e=>{S&&F(t=>({...t,isLoading:e}))},[S]);f((0,n.useCallback)(e=>{M&&T&&P.isAuthenticated&&t.rt()},[M,T,P.isAuthenticated]),T?{}:{skipInitial:!0}),(0,n.useEffect)(()=>{t.m(w);let e=()=>{if(!(!T||M)){t.tt.activityTimeoutMinutes=T.timeoutMinutes,t.tt.activityTimeoutPreWarningMinutes=T.preWarningMinutes,t.tt.onActivityTimeout=async(e,t)=>{try{if(e===l.timeout){let e=t?.accessToken,n=t?.refreshToken,r=async(e,t)=>{if(!e)return;let n=await fetch(`${_}/oauth2/revoke`,{method:`POST`,body:`token=${encodeURIComponent(e)}&client_id=${encodeURIComponent(h)}&token_type_hint=${t}`,headers:{"Content-Type":`application/x-www-form-urlencoded`}});n.ok||console.warn(`Failed to revoke ${t}:`,n.status)};await Promise.allSettled([r(e,`access_token`),r(n,`refresh_token`)])}}catch(e){console.error(`Failed to logout:`,e)}finally{T.onTimeout?.(e)}};try{t.rt()}catch(e){console.error(`Failed to update activity timestamp:`,e);return}N(!0)}},n=()=>{M&&(t.tt.activityTimeoutMinutes=void 0,t.tt.activityTimeoutPreWarningMinutes=void 0,t.tt.onActivityTimeout=void 0,N(!1))},r=w.subscribe(async()=>{try{let[r,i]=await Promise.all([t.A(),t.p()]);r&&i?(e(),F(e=>({...e,user:i,isAuthenticated:!0}))):(n(),F(e=>({...e,user:void 0,isAuthenticated:!1})))}catch(e){console.error(`Store subscription update failed:`,e),n(),F(e=>({...e,user:void 0,isAuthenticated:!1}))}});return()=>{r(),n()}},[w,T,M]),t.yt.framework=`react`,t.yt.frameworkVersion=n.default.version,t.yt.sdkVersion=c.version,t.tt.useInsecureForRefreshToken=v;let B=(0,n.useRef)(!1),V=(0,n.useRef)(!1),H=(0,n.useCallback)(async(e={})=>{z(!0);let n=e.state||{};e.state=void 0;let r={audience:p,clientId:h,...e,supportsReauth:!0,scope:m?.split(` `),state:t.st(JSON.stringify({kinde:{event:`login`},...n})),redirectURL:s(e.redirectURL||y)},i=await t.Z(_,t.Q.login,r);try{t._t({url:i.url.toString(),popupOptions:C,handleResult:q})}catch(e){if(z(!1),!R.current){console.error(`Login error (context unavailable):`,e);return}j.onError?.({error:`ERR_POPUP`,errorDescription:e.message},{},R.current)}},[p,h,y,C,j,_,m,z]);(0,n.useEffect)(()=>{k&&O.current&&!V.current&&(V.current=!0,H({prompt:t.gt.create,invitationCode:O.current}).catch(e=>{console.error(`Error processing invitation code:`,e),R.current?j.onError?.({error:`ERR_INVITATION_REDIRECT`,errorDescription:e instanceof Error?e.message:String(e)},{},R.current):console.error(`Invitation redirect error (context unavailable):`,e),V.current=!1,A(!1)}))},[H,k,j]);let U=(0,n.useCallback)(async(e={})=>{z(!0);let n=e.state||{};e.state=void 0;let r={...e,state:t.st(JSON.stringify({kinde:{event:`register`},...n})),supportsReauth:!0,audience:p,clientId:h,redirectURL:s(e?.redirectURL||y),prompt:t.gt.create};try{let e=await t.Z(_,t.Q.register,r);try{t._t({url:e.url.toString(),popupOptions:C,handleResult:q})}catch(e){if(z(!1),!R.current){console.error(`Register error (context unavailable):`,e);return}j.onError?.({error:`ERR_POPUP`,errorDescription:e.message},{},R.current)}}catch(e){if(z(!1),console.error(`Register error:`,e),!R.current)return;j.onError?.({error:`ERR_REGISTER`,errorDescription:String(e)},{},R.current)}},[y,C,j,p,h,_,z]),W=(0,n.useCallback)(async e=>{z(!0);try{let n=new URLSearchParams;e?e&&typeof e==`string`?n.append(`redirect`,e):typeof e==`object`&&((e.redirectUrl||x)&&n.append(`redirect`,e.redirectUrl||x||``),e.allSessions&&n.append(`all_sessions`,String(e.allSessions))):n.append(`redirect`,x||``),await Promise.all([w.removeSessionItem(t.D.idToken),w.removeSessionItem(t.D.accessToken),w.removeSessionItem(t.D.refreshToken),o.removeSessionItem(t.D.refreshToken)]),F(e=>({...e,user:void 0,isAuthenticated:!1})),await o.setSessionItem(i.performingLogout,`true`);try{await t._t({url:`${_}/logout?${n.toString()}`,popupOptions:C,handleResult:async()=>{z(!1)}})}catch(e){if(z(!1),!R.current){console.error(`Logout error (context unavailable):`,e);return}j.onError?.({error:`ERR_POPUP`,errorDescription:e.message},{},R.current)}}catch(e){if(z(!1),console.error(`Logout error:`,e),!R.current)return;j.onError?.({error:`ERR_LOGOUT`,errorDescription:String(e)},{},R.current)}},[w,C,j,x,_,z]),G=(0,n.useMemo)(()=>({login:H,logout:W,register:U,getIdToken:async()=>await t.C()?.getSessionItem(t.D.idToken),getAccessToken:async()=>await t.C()?.getSessionItem(t.D.accessToken),getToken:async()=>await t.C()?.getSessionItem(t.D.accessToken),getClaim:async(e,n)=>t.g(e,n),getClaims:async(...e)=>t.v(...e),getOrganization:async()=>await t.d(),getCurrentOrganization:async()=>await t.d(),getFlag:async e=>await t.et(e),getUserProfile:t.p,getPermission:async e=>await t.w(e),getPermissions:async()=>t.i(),getUserOrganizations:async()=>await t.a(),getRoles:async()=>await t.k(),generatePortalUrl:async e=>await t.n({domain:_,returnUrl:e.returnUrl||window.location.href,subNav:e.subNav}),switchOrg:async e=>{let n=await t.$({domain:_,clientId:h,orgCode:e,redirectURL:y});window.location.href=n.url.toString()},refreshToken:async(...e)=>await t.F(...e),...P}),[P,H,W,U,_,h,y]);R.current=G;let K=(0,n.useCallback)(e=>{j.onEvent&&j.onEvent(`tokenRefreshed`,e,G),!e.success&&j.onError&&j.onError({error:`ERR_REFRESH_TOKEN`,errorDescription:e.error??`Token refresh failed`},{},G)},[j,G]),q=(0,n.useCallback)(async e=>{try{let n=e.get(`state`)||``,r;try{r=t.mt(n)}catch(e){j.onError?.({error:`ERR_STATE_DECODE`,errorDescription:`Invalid state parameter: ${String(e)}`},{},G),F(e=>({...e,isLoading:!1}));return}let i,a;try{i=JSON.parse(r),a=Object.assign(i.kinde||{event:t.gt.login})}catch(e){console.error(`Error parsing state:`,e),j.onError?.({error:`ERR_STATE_PARSE`,errorDescription:String(e)},{},G),i={},a={event:`login`}}try{let n=await t.ot({urlParams:e,domain:_,clientId:h,redirectURL:s(y),autoRefresh:!0,onRefresh:K});if(n.success){let e=await t.p();e&&(F(t=>({...t,user:e,isAuthenticated:!0})),j.onSuccess?.(e,{...i,kinde:void 0},G),j.onEvent&&j.onEvent(a.event,{...i,kinde:void 0},G))}else j.onError?.({error:`ERR_CODE_EXCHANGE`,errorDescription:n.error},i,G)}catch(e){j.onError?.({error:`ERR_POPUP_AUTH`,errorDescription:String(e)},i,G)}finally{S?z(!1):F(e=>({...e,isLoading:!1}))}}finally{A(!1)}},[_,h,y,K,j,G,z,S,A]),J=(0,n.useCallback)(()=>{document.visibilityState===`visible`&&P.isAuthenticated&&E&&t.F({domain:_,clientId:h,onRefresh:K}).then(e=>{e.success||console.error(`Error refreshing token:`,e.error)}).catch(e=>{console.error(`Error refreshing token:`,e),j.onError?.({error:`ERR_REFRESH_TOKEN`,errorDescription:e instanceof Error?e.message:String(e)},{},G)})},[P.isAuthenticated,_,h,K,E,j,G]);(0,n.useEffect)(()=>{if(document.removeEventListener(`visibilitychange`,J),E)return document.addEventListener(`visibilitychange`,J),()=>{document.removeEventListener(`visibilitychange`,J)}},[J,E]);let Y=(0,n.useCallback)(async()=>{if(!B.current&&(S&&L(!0),!(!_||!h||!y)))try{if(k)return;let e=new URLSearchParams(window.location.search);try{B.current=!0;let e=await t.H({domain:_,clientId:h});e&&!e.success&&j.onError?.({error:`ERR_CHECK_AUTH`,errorDescription:e.error??`Authentication check failed`},{},G)}catch(e){console.warn(`checkAuth failed:`,e),j.onError?.({error:`ERR_CHECK_AUTH`,errorDescription:e instanceof Error?e.message:String(e)},{},G)}if(e.has(`error`)){if(e.get(`error`)?.toLowerCase()===`login_link_expired`){let t=e.get(`reauth_state`);t&&H({reauthState:t});return}F(e=>({...e,isLoading:!1}));return}await o.getSessionItem(i.performingLogout)===`true`&&(await o.removeSessionItem(i.performingLogout),d()&&window.close());let n=new URL(window.location.href),r=new URL(y);if(n.origin===r.origin&&n.pathname===r.pathname&&e.has(`code`)){if(d()){let e=new URLSearchParams(window.location.search);window.opener.postMessage({type:`KINDE_AUTH_RESULT`,result:Object.fromEntries(e.entries())},window.location.origin),window.close();return}await q(new URLSearchParams(window.location.search));return}try{let e=await t.p();e&&F(t=>({...t,user:e,isAuthenticated:!0}))}catch(e){console.warn(`Error getting user profile`,e)}finally{F(e=>({...e,isLoading:!1}))}}finally{d()&&window.close()}},[h,_,y,j,G,K,H,q,k,S]);return(0,n.useEffect)(()=>{let e={current:!0};return e.current&&Y(),()=>{e.current=!1}},[Y]),k&&!S?(0,r.jsx)(r.Fragment,{}):(S?I:B.current)?(0,r.jsx)(e.n.Provider,{value:G,children:g}):(0,r.jsx)(r.Fragment,{})};exports.KindeContext=e.n,exports.KindeProvider=p,exports.TimeoutActivityType=l,exports.useKindeAuth=e.t;