@civic/auth 0.0.1-beta.3 → 0.0.1-beta.31

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.
Files changed (701) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.json +10 -0
  3. package/.prettierignore +3 -0
  4. package/.prettierrc +1 -0
  5. package/.turbo/turbo-build.log +13 -0
  6. package/.turbo/turbo-lint$colon$fix.log +16 -0
  7. package/.turbo/turbo-test.log +1153 -0
  8. package/README.md +26 -4
  9. package/dist/cjs/src/browser/storage.d.ts +6 -0
  10. package/dist/cjs/src/browser/storage.d.ts.map +1 -0
  11. package/dist/cjs/src/browser/storage.js +13 -0
  12. package/dist/cjs/src/browser/storage.js.map +1 -0
  13. package/dist/cjs/src/config.d.ts +3 -0
  14. package/dist/cjs/src/config.d.ts.map +1 -0
  15. package/dist/cjs/src/config.js +8 -0
  16. package/dist/cjs/src/config.js.map +1 -0
  17. package/dist/cjs/src/constants.d.ts +9 -0
  18. package/dist/cjs/src/constants.d.ts.map +1 -0
  19. package/dist/cjs/src/constants.js +26 -0
  20. package/dist/cjs/src/constants.js.map +1 -0
  21. package/dist/cjs/src/index.d.ts +4 -0
  22. package/dist/cjs/src/index.d.ts.map +1 -0
  23. package/dist/cjs/src/index.js +3 -0
  24. package/dist/cjs/src/index.js.map +1 -0
  25. package/dist/cjs/src/lib/cookies.d.ts +7 -0
  26. package/dist/cjs/src/lib/cookies.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/cookies.js +26 -0
  28. package/dist/cjs/src/lib/cookies.js.map +1 -0
  29. package/dist/cjs/src/lib/jwt.d.ts +3 -0
  30. package/dist/cjs/src/lib/jwt.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/jwt.js +13 -0
  32. package/dist/cjs/src/lib/jwt.js.map +1 -0
  33. package/dist/cjs/src/lib/logger.d.ts +26 -0
  34. package/dist/cjs/src/lib/logger.d.ts.map +1 -0
  35. package/dist/cjs/src/lib/logger.js +62 -0
  36. package/dist/cjs/src/lib/logger.js.map +1 -0
  37. package/dist/cjs/src/lib/oauth.d.ts +19 -0
  38. package/dist/cjs/src/lib/oauth.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/oauth.js +67 -0
  40. package/dist/cjs/src/lib/oauth.js.map +1 -0
  41. package/dist/cjs/src/lib/postMessage.d.ts +4 -0
  42. package/dist/cjs/src/lib/postMessage.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/postMessage.js +18 -0
  44. package/dist/cjs/src/lib/postMessage.js.map +1 -0
  45. package/dist/cjs/src/lib/windowUtil.d.ts +4 -0
  46. package/dist/cjs/src/lib/windowUtil.d.ts.map +1 -0
  47. package/dist/cjs/src/lib/windowUtil.js +34 -0
  48. package/dist/cjs/src/lib/windowUtil.js.map +1 -0
  49. package/dist/cjs/src/nextjs/GetUser.d.ts +6 -0
  50. package/dist/cjs/src/nextjs/GetUser.d.ts.map +1 -0
  51. package/dist/cjs/src/nextjs/GetUser.js +22 -0
  52. package/dist/cjs/src/nextjs/GetUser.js.map +1 -0
  53. package/dist/cjs/src/nextjs/config.d.ts +178 -0
  54. package/dist/cjs/src/nextjs/config.d.ts.map +1 -0
  55. package/dist/cjs/src/nextjs/config.js +167 -0
  56. package/dist/cjs/src/nextjs/config.js.map +1 -0
  57. package/dist/cjs/src/nextjs/cookies.d.ts +30 -0
  58. package/dist/cjs/src/nextjs/cookies.d.ts.map +1 -0
  59. package/dist/cjs/src/nextjs/cookies.js +119 -0
  60. package/dist/cjs/src/nextjs/cookies.js.map +1 -0
  61. package/dist/cjs/src/nextjs/hooks/index.d.ts +2 -0
  62. package/dist/cjs/src/nextjs/hooks/index.d.ts.map +1 -0
  63. package/dist/cjs/src/nextjs/hooks/index.js +6 -0
  64. package/dist/cjs/src/nextjs/hooks/index.js.map +1 -0
  65. package/dist/cjs/src/nextjs/hooks/useTokenCookie.d.ts +3 -0
  66. package/dist/cjs/src/nextjs/hooks/useTokenCookie.d.ts.map +1 -0
  67. package/dist/cjs/src/nextjs/hooks/useTokenCookie.js +41 -0
  68. package/dist/cjs/src/nextjs/hooks/useTokenCookie.js.map +1 -0
  69. package/dist/cjs/src/nextjs/hooks/useUserCookie.d.ts +3 -0
  70. package/dist/cjs/src/nextjs/hooks/useUserCookie.d.ts.map +1 -0
  71. package/dist/cjs/src/nextjs/hooks/useUserCookie.js +40 -0
  72. package/dist/cjs/src/nextjs/hooks/useUserCookie.js.map +1 -0
  73. package/dist/cjs/src/nextjs/index.d.ts +7 -0
  74. package/dist/cjs/src/nextjs/index.d.ts.map +1 -0
  75. package/dist/cjs/src/nextjs/index.js +18 -0
  76. package/dist/cjs/src/nextjs/index.js.map +1 -0
  77. package/dist/cjs/src/nextjs/middleware/index.d.ts +2 -0
  78. package/dist/cjs/src/nextjs/middleware/index.d.ts.map +1 -0
  79. package/dist/cjs/src/nextjs/middleware/index.js +8 -0
  80. package/dist/cjs/src/nextjs/middleware/index.js.map +1 -0
  81. package/dist/cjs/src/nextjs/middleware.d.ts +59 -0
  82. package/dist/cjs/src/nextjs/middleware.d.ts.map +1 -0
  83. package/dist/cjs/src/nextjs/middleware.js +116 -0
  84. package/dist/cjs/src/nextjs/middleware.js.map +1 -0
  85. package/dist/cjs/src/nextjs/providers/NextAuthProvider.d.ts +9 -0
  86. package/dist/cjs/src/nextjs/providers/NextAuthProvider.d.ts.map +1 -0
  87. package/dist/cjs/src/nextjs/providers/NextAuthProvider.js +76 -0
  88. package/dist/cjs/src/nextjs/providers/NextAuthProvider.js.map +1 -0
  89. package/dist/cjs/src/nextjs/routeHandler.d.ts +18 -0
  90. package/dist/cjs/src/nextjs/routeHandler.d.ts.map +1 -0
  91. package/dist/cjs/src/nextjs/routeHandler.js +217 -0
  92. package/dist/cjs/src/nextjs/routeHandler.js.map +1 -0
  93. package/dist/cjs/src/nextjs/utils.d.ts +3 -0
  94. package/dist/cjs/src/nextjs/utils.d.ts.map +1 -0
  95. package/dist/cjs/src/nextjs/utils.js +9 -0
  96. package/dist/cjs/src/nextjs/utils.js.map +1 -0
  97. package/dist/cjs/src/reactjs/components/SignInButton.d.ts +8 -0
  98. package/dist/cjs/src/reactjs/components/SignInButton.d.ts.map +1 -0
  99. package/dist/cjs/src/reactjs/components/SignInButton.js +20 -0
  100. package/dist/cjs/src/reactjs/components/SignInButton.js.map +1 -0
  101. package/dist/cjs/src/reactjs/components/SignOutButton.d.ts +6 -0
  102. package/dist/cjs/src/reactjs/components/SignOutButton.d.ts.map +1 -0
  103. package/dist/cjs/src/reactjs/components/SignOutButton.js +20 -0
  104. package/dist/cjs/src/reactjs/components/SignOutButton.js.map +1 -0
  105. package/dist/cjs/src/reactjs/components/UserButton.d.ts +8 -0
  106. package/dist/cjs/src/reactjs/components/UserButton.d.ts.map +1 -0
  107. package/dist/cjs/src/reactjs/components/UserButton.js +136 -0
  108. package/dist/cjs/src/reactjs/components/UserButton.js.map +1 -0
  109. package/dist/cjs/src/reactjs/components/index.d.ts +6 -0
  110. package/dist/cjs/src/reactjs/components/index.d.ts.map +1 -0
  111. package/dist/cjs/src/reactjs/components/index.js +14 -0
  112. package/dist/cjs/src/reactjs/components/index.js.map +1 -0
  113. package/dist/cjs/src/reactjs/hooks/index.d.ts +7 -0
  114. package/dist/cjs/src/reactjs/hooks/index.d.ts.map +1 -0
  115. package/dist/cjs/src/reactjs/hooks/index.js +16 -0
  116. package/dist/cjs/src/reactjs/hooks/index.js.map +1 -0
  117. package/dist/cjs/src/reactjs/hooks/useAuth.d.ts +3 -0
  118. package/dist/cjs/src/reactjs/hooks/useAuth.d.ts.map +1 -0
  119. package/dist/cjs/src/reactjs/hooks/useAuth.js +15 -0
  120. package/dist/cjs/src/reactjs/hooks/useAuth.js.map +1 -0
  121. package/dist/cjs/src/reactjs/hooks/useUser.d.ts +4 -0
  122. package/dist/cjs/src/reactjs/hooks/useUser.d.ts.map +1 -0
  123. package/dist/cjs/src/reactjs/hooks/useUser.js +15 -0
  124. package/dist/cjs/src/reactjs/hooks/useUser.js.map +1 -0
  125. package/dist/cjs/src/reactjs/index.d.ts +6 -0
  126. package/dist/cjs/src/reactjs/index.d.ts.map +1 -0
  127. package/dist/cjs/src/reactjs/index.js +30 -0
  128. package/dist/cjs/src/reactjs/index.js.map +1 -0
  129. package/dist/cjs/src/reactjs/providers/index.d.ts +8 -0
  130. package/dist/cjs/src/reactjs/providers/index.d.ts.map +1 -0
  131. package/dist/cjs/src/reactjs/providers/index.js +19 -0
  132. package/dist/cjs/src/reactjs/providers/index.js.map +1 -0
  133. package/dist/cjs/src/server/ServerAuthenticationResolver.d.ts +18 -0
  134. package/dist/cjs/src/server/ServerAuthenticationResolver.d.ts.map +1 -0
  135. package/dist/cjs/src/server/ServerAuthenticationResolver.js +61 -0
  136. package/dist/cjs/src/server/ServerAuthenticationResolver.js.map +1 -0
  137. package/dist/cjs/src/server/config.d.ts +16 -0
  138. package/dist/cjs/src/server/config.d.ts.map +1 -0
  139. package/dist/cjs/src/server/config.js +3 -0
  140. package/dist/cjs/src/server/config.js.map +1 -0
  141. package/dist/cjs/src/server/index.d.ts +6 -0
  142. package/dist/cjs/src/server/index.d.ts.map +1 -0
  143. package/dist/cjs/src/server/index.js +14 -0
  144. package/dist/cjs/src/server/index.js.map +1 -0
  145. package/dist/cjs/src/server/login.d.ts +17 -0
  146. package/dist/cjs/src/server/login.d.ts.map +1 -0
  147. package/dist/cjs/src/server/login.js +42 -0
  148. package/dist/cjs/src/server/login.js.map +1 -0
  149. package/dist/cjs/src/server/refresh.d.ts +7 -0
  150. package/dist/cjs/src/server/refresh.d.ts.map +1 -0
  151. package/dist/cjs/src/server/refresh.js +16 -0
  152. package/dist/cjs/src/server/refresh.js.map +1 -0
  153. package/dist/cjs/src/services/AuthenticationService.d.ts +87 -0
  154. package/dist/cjs/src/services/AuthenticationService.d.ts.map +1 -0
  155. package/dist/cjs/src/services/AuthenticationService.js +218 -0
  156. package/dist/cjs/src/services/AuthenticationService.js.map +1 -0
  157. package/dist/cjs/src/services/PKCE.d.ts +20 -0
  158. package/dist/cjs/src/services/PKCE.d.ts.map +1 -0
  159. package/dist/cjs/src/services/PKCE.js +50 -0
  160. package/dist/cjs/src/services/PKCE.js.map +1 -0
  161. package/dist/cjs/src/services/types.d.ts +23 -0
  162. package/dist/cjs/src/services/types.d.ts.map +1 -0
  163. package/dist/cjs/src/services/types.js +11 -0
  164. package/dist/cjs/src/services/types.js.map +1 -0
  165. package/dist/cjs/src/shared/AuthProvider.d.ts +18 -0
  166. package/dist/cjs/src/shared/AuthProvider.d.ts.map +1 -0
  167. package/dist/cjs/src/shared/AuthProvider.js +246 -0
  168. package/dist/cjs/src/shared/AuthProvider.js.map +1 -0
  169. package/dist/cjs/src/shared/CivicAuthProvider.d.ts +6 -0
  170. package/dist/cjs/src/shared/CivicAuthProvider.d.ts.map +1 -0
  171. package/dist/cjs/src/shared/CivicAuthProvider.js +19 -0
  172. package/dist/cjs/src/shared/CivicAuthProvider.js.map +1 -0
  173. package/dist/cjs/src/shared/GenericAuthenticationRefresher.d.ts +15 -0
  174. package/dist/cjs/src/shared/GenericAuthenticationRefresher.d.ts.map +1 -0
  175. package/dist/cjs/src/shared/GenericAuthenticationRefresher.js +47 -0
  176. package/dist/cjs/src/shared/GenericAuthenticationRefresher.js.map +1 -0
  177. package/dist/cjs/src/shared/UserProvider.d.ts +17 -0
  178. package/dist/cjs/src/shared/UserProvider.d.ts.map +1 -0
  179. package/dist/cjs/src/shared/UserProvider.js +42 -0
  180. package/dist/cjs/src/shared/UserProvider.js.map +1 -0
  181. package/dist/cjs/src/shared/UserSession.d.ts +12 -0
  182. package/dist/cjs/src/shared/UserSession.d.ts.map +1 -0
  183. package/dist/cjs/src/shared/UserSession.js +24 -0
  184. package/dist/cjs/src/shared/UserSession.js.map +1 -0
  185. package/dist/cjs/src/shared/components/CivicAuthIframe.d.ts +8 -0
  186. package/dist/cjs/src/shared/components/CivicAuthIframe.d.ts.map +1 -0
  187. package/dist/cjs/src/shared/components/CivicAuthIframe.js +35 -0
  188. package/dist/cjs/src/shared/components/CivicAuthIframe.js.map +1 -0
  189. package/dist/cjs/src/shared/components/CivicAuthIframeContainer.d.ts +9 -0
  190. package/dist/cjs/src/shared/components/CivicAuthIframeContainer.d.ts.map +1 -0
  191. package/dist/cjs/src/shared/components/CivicAuthIframeContainer.js +154 -0
  192. package/dist/cjs/src/shared/components/CivicAuthIframeContainer.js.map +1 -0
  193. package/dist/cjs/src/shared/components/CloseIcon.d.ts +4 -0
  194. package/dist/cjs/src/shared/components/CloseIcon.d.ts.map +1 -0
  195. package/dist/cjs/src/shared/components/CloseIcon.js +12 -0
  196. package/dist/cjs/src/shared/components/CloseIcon.js.map +1 -0
  197. package/dist/cjs/src/shared/components/LoadingIcon.d.ts +4 -0
  198. package/dist/cjs/src/shared/components/LoadingIcon.d.ts.map +1 -0
  199. package/dist/cjs/src/shared/components/LoadingIcon.js +36 -0
  200. package/dist/cjs/src/shared/components/LoadingIcon.js.map +1 -0
  201. package/dist/cjs/src/shared/hooks/index.d.ts +5 -0
  202. package/dist/cjs/src/shared/hooks/index.d.ts.map +1 -0
  203. package/dist/cjs/src/shared/hooks/index.js +12 -0
  204. package/dist/cjs/src/shared/hooks/index.js.map +1 -0
  205. package/dist/cjs/src/shared/hooks/useAuth.d.ts +3 -0
  206. package/dist/cjs/src/shared/hooks/useAuth.d.ts.map +1 -0
  207. package/dist/cjs/src/shared/hooks/useAuth.js +15 -0
  208. package/dist/cjs/src/shared/hooks/useAuth.js.map +1 -0
  209. package/dist/cjs/src/shared/hooks/useConfig.d.ts +3 -0
  210. package/dist/cjs/src/shared/hooks/useConfig.d.ts.map +1 -0
  211. package/dist/cjs/src/shared/hooks/useConfig.js +16 -0
  212. package/dist/cjs/src/shared/hooks/useConfig.js.map +1 -0
  213. package/dist/cjs/src/shared/hooks/useIframe.d.ts +3 -0
  214. package/dist/cjs/src/shared/hooks/useIframe.d.ts.map +1 -0
  215. package/dist/cjs/src/shared/hooks/useIframe.js +16 -0
  216. package/dist/cjs/src/shared/hooks/useIframe.js.map +1 -0
  217. package/dist/cjs/src/shared/hooks/useSession.d.ts +3 -0
  218. package/dist/cjs/src/shared/hooks/useSession.d.ts.map +1 -0
  219. package/dist/cjs/src/shared/hooks/useSession.js +16 -0
  220. package/dist/cjs/src/shared/hooks/useSession.js.map +1 -0
  221. package/dist/cjs/src/shared/hooks/useToken.d.ts +3 -0
  222. package/dist/cjs/src/shared/hooks/useToken.d.ts.map +1 -0
  223. package/dist/cjs/src/shared/hooks/useToken.js +15 -0
  224. package/dist/cjs/src/shared/hooks/useToken.js.map +1 -0
  225. package/dist/cjs/src/shared/lib/GenericAuthenticationRefresher.d.ts +15 -0
  226. package/dist/cjs/src/shared/lib/GenericAuthenticationRefresher.d.ts.map +1 -0
  227. package/dist/cjs/src/shared/lib/GenericAuthenticationRefresher.js +43 -0
  228. package/dist/cjs/src/shared/lib/GenericAuthenticationRefresher.js.map +1 -0
  229. package/dist/cjs/src/shared/lib/UserSession.d.ts +12 -0
  230. package/dist/cjs/src/shared/lib/UserSession.d.ts.map +1 -0
  231. package/dist/cjs/src/shared/lib/UserSession.js +24 -0
  232. package/dist/cjs/src/shared/lib/UserSession.js.map +1 -0
  233. package/dist/cjs/src/shared/lib/session.d.ts +3 -0
  234. package/dist/cjs/src/shared/lib/session.d.ts.map +1 -0
  235. package/dist/cjs/src/shared/lib/session.js +13 -0
  236. package/dist/cjs/src/shared/lib/session.js.map +1 -0
  237. package/dist/cjs/src/shared/lib/storage.d.ts +25 -0
  238. package/dist/cjs/src/shared/lib/storage.d.ts.map +1 -0
  239. package/dist/cjs/src/shared/lib/storage.js +21 -0
  240. package/dist/cjs/src/shared/lib/storage.js.map +1 -0
  241. package/dist/cjs/src/shared/lib/types.d.ts +22 -0
  242. package/dist/cjs/src/shared/lib/types.d.ts.map +1 -0
  243. package/dist/cjs/src/shared/lib/types.js +19 -0
  244. package/dist/cjs/src/shared/lib/types.js.map +1 -0
  245. package/dist/cjs/src/shared/lib/util.d.ts +33 -0
  246. package/dist/cjs/src/shared/lib/util.d.ts.map +1 -0
  247. package/dist/cjs/src/shared/lib/util.js +163 -0
  248. package/dist/cjs/src/shared/lib/util.js.map +1 -0
  249. package/dist/cjs/src/shared/providers/AuthContext.d.ts +10 -0
  250. package/dist/cjs/src/shared/providers/AuthContext.d.ts.map +1 -0
  251. package/dist/cjs/src/shared/providers/AuthContext.js +6 -0
  252. package/dist/cjs/src/shared/providers/AuthContext.js.map +1 -0
  253. package/dist/cjs/src/shared/providers/AuthProvider.d.ts +20 -0
  254. package/dist/cjs/src/shared/providers/AuthProvider.d.ts.map +1 -0
  255. package/dist/cjs/src/shared/providers/AuthProvider.js +289 -0
  256. package/dist/cjs/src/shared/providers/AuthProvider.js.map +1 -0
  257. package/dist/cjs/src/shared/providers/CivicAuthProvider.d.ts +6 -0
  258. package/dist/cjs/src/shared/providers/CivicAuthProvider.d.ts.map +1 -0
  259. package/dist/cjs/src/shared/providers/CivicAuthProvider.js +21 -0
  260. package/dist/cjs/src/shared/providers/CivicAuthProvider.js.map +1 -0
  261. package/dist/cjs/src/shared/providers/ConfigProvider.d.ts +21 -0
  262. package/dist/cjs/src/shared/providers/ConfigProvider.d.ts.map +1 -0
  263. package/dist/cjs/src/shared/providers/ConfigProvider.js +46 -0
  264. package/dist/cjs/src/shared/providers/ConfigProvider.js.map +1 -0
  265. package/dist/cjs/src/shared/providers/IframeProvider.d.ts +16 -0
  266. package/dist/cjs/src/shared/providers/IframeProvider.d.ts.map +1 -0
  267. package/dist/cjs/src/shared/providers/IframeProvider.js +38 -0
  268. package/dist/cjs/src/shared/providers/IframeProvider.js.map +1 -0
  269. package/dist/cjs/src/shared/providers/SessionProvider.d.ts +13 -0
  270. package/dist/cjs/src/shared/providers/SessionProvider.d.ts.map +1 -0
  271. package/dist/cjs/src/shared/providers/SessionProvider.js +40 -0
  272. package/dist/cjs/src/shared/providers/SessionProvider.js.map +1 -0
  273. package/dist/cjs/src/shared/providers/TokenProvider.d.ts +18 -0
  274. package/dist/cjs/src/shared/providers/TokenProvider.d.ts.map +1 -0
  275. package/dist/cjs/src/shared/providers/TokenProvider.js +80 -0
  276. package/dist/cjs/src/shared/providers/TokenProvider.js.map +1 -0
  277. package/dist/cjs/src/shared/providers/UserProvider.d.ts +18 -0
  278. package/dist/cjs/src/shared/providers/UserProvider.d.ts.map +1 -0
  279. package/dist/cjs/src/shared/providers/UserProvider.js +65 -0
  280. package/dist/cjs/src/shared/providers/UserProvider.js.map +1 -0
  281. package/dist/cjs/src/shared/session.d.ts +3 -0
  282. package/dist/cjs/src/shared/session.d.ts.map +1 -0
  283. package/dist/cjs/src/shared/session.js +13 -0
  284. package/dist/cjs/src/shared/session.js.map +1 -0
  285. package/dist/cjs/src/shared/util.d.ts +39 -0
  286. package/dist/cjs/src/shared/util.d.ts.map +1 -0
  287. package/dist/cjs/src/shared/util.js +162 -0
  288. package/dist/cjs/src/shared/util.js.map +1 -0
  289. package/dist/cjs/src/types.d.ts +146 -0
  290. package/dist/cjs/src/types.d.ts.map +1 -0
  291. package/dist/cjs/src/types.js +3 -0
  292. package/dist/cjs/src/types.js.map +1 -0
  293. package/dist/cjs/src/utils.d.ts +15 -0
  294. package/dist/cjs/src/utils.d.ts.map +1 -0
  295. package/dist/cjs/src/utils.js +47 -0
  296. package/dist/cjs/src/utils.js.map +1 -0
  297. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  298. package/dist/esm/src/browser/storage.d.ts +6 -0
  299. package/dist/esm/src/browser/storage.d.ts.map +1 -0
  300. package/dist/esm/src/browser/storage.js +9 -0
  301. package/dist/esm/src/browser/storage.js.map +1 -0
  302. package/dist/esm/src/config.d.ts +3 -0
  303. package/dist/esm/src/config.d.ts.map +1 -0
  304. package/dist/esm/src/config.js +5 -0
  305. package/dist/esm/src/config.js.map +1 -0
  306. package/dist/esm/src/constants.d.ts +9 -0
  307. package/dist/esm/src/constants.d.ts.map +1 -0
  308. package/dist/esm/src/constants.js +17 -0
  309. package/dist/esm/src/constants.js.map +1 -0
  310. package/dist/esm/src/index.d.ts +4 -0
  311. package/dist/esm/src/index.d.ts.map +1 -0
  312. package/dist/esm/src/index.js +2 -0
  313. package/dist/esm/src/index.js.map +1 -0
  314. package/dist/esm/src/lib/cookies.d.ts +7 -0
  315. package/dist/esm/src/lib/cookies.d.ts.map +1 -0
  316. package/dist/esm/src/lib/cookies.js +23 -0
  317. package/dist/esm/src/lib/cookies.js.map +1 -0
  318. package/dist/esm/src/lib/jwt.d.ts +3 -0
  319. package/dist/esm/src/lib/jwt.d.ts.map +1 -0
  320. package/dist/esm/src/lib/jwt.js +9 -0
  321. package/dist/esm/src/lib/jwt.js.map +1 -0
  322. package/dist/esm/src/lib/logger.d.ts +26 -0
  323. package/dist/esm/src/lib/logger.d.ts.map +1 -0
  324. package/dist/esm/src/lib/logger.js +55 -0
  325. package/dist/esm/src/lib/logger.js.map +1 -0
  326. package/dist/esm/src/lib/oauth.d.ts +19 -0
  327. package/dist/esm/src/lib/oauth.d.ts.map +1 -0
  328. package/dist/esm/src/lib/oauth.js +60 -0
  329. package/dist/esm/src/lib/oauth.js.map +1 -0
  330. package/dist/esm/src/lib/postMessage.d.ts +4 -0
  331. package/dist/esm/src/lib/postMessage.d.ts.map +1 -0
  332. package/dist/esm/src/lib/postMessage.js +15 -0
  333. package/dist/esm/src/lib/postMessage.js.map +1 -0
  334. package/dist/esm/src/lib/windowUtil.d.ts +4 -0
  335. package/dist/esm/src/lib/windowUtil.d.ts.map +1 -0
  336. package/dist/esm/src/lib/windowUtil.js +30 -0
  337. package/dist/esm/src/lib/windowUtil.js.map +1 -0
  338. package/dist/esm/src/nextjs/GetUser.d.ts +6 -0
  339. package/dist/esm/src/nextjs/GetUser.d.ts.map +1 -0
  340. package/dist/esm/src/nextjs/GetUser.js +18 -0
  341. package/dist/esm/src/nextjs/GetUser.js.map +1 -0
  342. package/dist/esm/src/nextjs/config.d.ts +178 -0
  343. package/dist/esm/src/nextjs/config.d.ts.map +1 -0
  344. package/dist/esm/src/nextjs/config.js +162 -0
  345. package/dist/esm/src/nextjs/config.js.map +1 -0
  346. package/dist/esm/src/nextjs/cookies.d.ts +30 -0
  347. package/dist/esm/src/nextjs/cookies.d.ts.map +1 -0
  348. package/dist/esm/src/nextjs/cookies.js +112 -0
  349. package/dist/esm/src/nextjs/cookies.js.map +1 -0
  350. package/dist/esm/src/nextjs/hooks/index.d.ts +2 -0
  351. package/dist/esm/src/nextjs/hooks/index.d.ts.map +1 -0
  352. package/dist/esm/src/nextjs/hooks/index.js +2 -0
  353. package/dist/esm/src/nextjs/hooks/index.js.map +1 -0
  354. package/dist/esm/src/nextjs/hooks/useTokenCookie.d.ts +3 -0
  355. package/dist/esm/src/nextjs/hooks/useTokenCookie.d.ts.map +1 -0
  356. package/dist/esm/src/nextjs/hooks/useTokenCookie.js +37 -0
  357. package/dist/esm/src/nextjs/hooks/useTokenCookie.js.map +1 -0
  358. package/dist/esm/src/nextjs/hooks/useUserCookie.d.ts +3 -0
  359. package/dist/esm/src/nextjs/hooks/useUserCookie.d.ts.map +1 -0
  360. package/dist/esm/src/nextjs/hooks/useUserCookie.js +36 -0
  361. package/dist/esm/src/nextjs/hooks/useUserCookie.js.map +1 -0
  362. package/dist/esm/src/nextjs/index.d.ts +7 -0
  363. package/dist/esm/src/nextjs/index.d.ts.map +1 -0
  364. package/dist/esm/src/nextjs/index.js +6 -0
  365. package/dist/esm/src/nextjs/index.js.map +1 -0
  366. package/dist/esm/src/nextjs/middleware/index.d.ts +2 -0
  367. package/dist/esm/src/nextjs/middleware/index.d.ts.map +1 -0
  368. package/dist/esm/src/nextjs/middleware/index.js +2 -0
  369. package/dist/esm/src/nextjs/middleware/index.js.map +1 -0
  370. package/dist/esm/src/nextjs/middleware.d.ts +59 -0
  371. package/dist/esm/src/nextjs/middleware.d.ts.map +1 -0
  372. package/dist/esm/src/nextjs/middleware.js +107 -0
  373. package/dist/esm/src/nextjs/middleware.js.map +1 -0
  374. package/dist/esm/src/nextjs/providers/NextAuthProvider.d.ts +9 -0
  375. package/dist/esm/src/nextjs/providers/NextAuthProvider.d.ts.map +1 -0
  376. package/dist/esm/src/nextjs/providers/NextAuthProvider.js +50 -0
  377. package/dist/esm/src/nextjs/providers/NextAuthProvider.js.map +1 -0
  378. package/dist/esm/src/nextjs/routeHandler.d.ts +18 -0
  379. package/dist/esm/src/nextjs/routeHandler.d.ts.map +1 -0
  380. package/dist/esm/src/nextjs/routeHandler.js +212 -0
  381. package/dist/esm/src/nextjs/routeHandler.js.map +1 -0
  382. package/dist/esm/src/nextjs/utils.d.ts +3 -0
  383. package/dist/esm/src/nextjs/utils.d.ts.map +1 -0
  384. package/dist/esm/src/nextjs/utils.js +5 -0
  385. package/dist/esm/src/nextjs/utils.js.map +1 -0
  386. package/dist/esm/src/reactjs/components/SignInButton.d.ts +8 -0
  387. package/dist/esm/src/reactjs/components/SignInButton.d.ts.map +1 -0
  388. package/dist/esm/src/reactjs/components/SignInButton.js +14 -0
  389. package/dist/esm/src/reactjs/components/SignInButton.js.map +1 -0
  390. package/dist/esm/src/reactjs/components/SignOutButton.d.ts +6 -0
  391. package/dist/esm/src/reactjs/components/SignOutButton.d.ts.map +1 -0
  392. package/dist/esm/src/reactjs/components/SignOutButton.js +14 -0
  393. package/dist/esm/src/reactjs/components/SignOutButton.js.map +1 -0
  394. package/dist/esm/src/reactjs/components/UserButton.d.ts +8 -0
  395. package/dist/esm/src/reactjs/components/UserButton.d.ts.map +1 -0
  396. package/dist/esm/src/reactjs/components/UserButton.js +110 -0
  397. package/dist/esm/src/reactjs/components/UserButton.js.map +1 -0
  398. package/dist/esm/src/reactjs/components/index.d.ts +6 -0
  399. package/dist/esm/src/reactjs/components/index.d.ts.map +1 -0
  400. package/dist/esm/src/reactjs/components/index.js +6 -0
  401. package/dist/esm/src/reactjs/components/index.js.map +1 -0
  402. package/dist/esm/src/reactjs/hooks/index.d.ts +7 -0
  403. package/dist/esm/src/reactjs/hooks/index.d.ts.map +1 -0
  404. package/dist/esm/src/reactjs/hooks/index.js +7 -0
  405. package/dist/esm/src/reactjs/hooks/index.js.map +1 -0
  406. package/dist/esm/src/reactjs/hooks/useAuth.d.ts +3 -0
  407. package/dist/esm/src/reactjs/hooks/useAuth.d.ts.map +1 -0
  408. package/dist/esm/src/reactjs/hooks/useAuth.js +12 -0
  409. package/dist/esm/src/reactjs/hooks/useAuth.js.map +1 -0
  410. package/dist/esm/src/reactjs/hooks/useUser.d.ts +4 -0
  411. package/dist/esm/src/reactjs/hooks/useUser.d.ts.map +1 -0
  412. package/dist/esm/src/reactjs/hooks/useUser.js +12 -0
  413. package/dist/esm/src/reactjs/hooks/useUser.js.map +1 -0
  414. package/dist/esm/src/reactjs/index.d.ts +6 -0
  415. package/dist/esm/src/reactjs/index.d.ts.map +1 -0
  416. package/dist/esm/src/reactjs/index.js +8 -0
  417. package/dist/esm/src/reactjs/index.js.map +1 -0
  418. package/dist/esm/src/reactjs/providers/index.d.ts +8 -0
  419. package/dist/esm/src/reactjs/providers/index.d.ts.map +1 -0
  420. package/dist/esm/src/reactjs/providers/index.js +7 -0
  421. package/dist/esm/src/reactjs/providers/index.js.map +1 -0
  422. package/dist/esm/src/server/ServerAuthenticationResolver.d.ts +18 -0
  423. package/dist/esm/src/server/ServerAuthenticationResolver.d.ts.map +1 -0
  424. package/dist/esm/src/server/ServerAuthenticationResolver.js +57 -0
  425. package/dist/esm/src/server/ServerAuthenticationResolver.js.map +1 -0
  426. package/dist/esm/src/server/config.d.ts +16 -0
  427. package/dist/esm/src/server/config.d.ts.map +1 -0
  428. package/dist/esm/src/server/config.js +2 -0
  429. package/dist/esm/src/server/config.js.map +1 -0
  430. package/dist/esm/src/server/index.d.ts +6 -0
  431. package/dist/esm/src/server/index.d.ts.map +1 -0
  432. package/dist/esm/src/server/index.js +5 -0
  433. package/dist/esm/src/server/index.js.map +1 -0
  434. package/dist/esm/src/server/login.d.ts +17 -0
  435. package/dist/esm/src/server/login.d.ts.map +1 -0
  436. package/dist/esm/src/server/login.js +37 -0
  437. package/dist/esm/src/server/login.js.map +1 -0
  438. package/dist/esm/src/server/refresh.d.ts +7 -0
  439. package/dist/esm/src/server/refresh.d.ts.map +1 -0
  440. package/dist/esm/src/server/refresh.js +13 -0
  441. package/dist/esm/src/server/refresh.js.map +1 -0
  442. package/dist/esm/src/services/AuthenticationService.d.ts +87 -0
  443. package/dist/esm/src/services/AuthenticationService.d.ts.map +1 -0
  444. package/dist/esm/src/services/AuthenticationService.js +212 -0
  445. package/dist/esm/src/services/AuthenticationService.js.map +1 -0
  446. package/dist/esm/src/services/PKCE.d.ts +20 -0
  447. package/dist/esm/src/services/PKCE.d.ts.map +1 -0
  448. package/dist/esm/src/services/PKCE.js +44 -0
  449. package/dist/esm/src/services/PKCE.js.map +1 -0
  450. package/dist/esm/src/services/types.d.ts +23 -0
  451. package/dist/esm/src/services/types.d.ts.map +1 -0
  452. package/dist/esm/src/services/types.js +7 -0
  453. package/dist/esm/src/services/types.js.map +1 -0
  454. package/dist/esm/src/shared/components/CivicAuthIframe.d.ts +8 -0
  455. package/dist/esm/src/shared/components/CivicAuthIframe.d.ts.map +1 -0
  456. package/dist/esm/src/shared/components/CivicAuthIframe.js +9 -0
  457. package/dist/esm/src/shared/components/CivicAuthIframe.js.map +1 -0
  458. package/dist/esm/src/shared/components/CivicAuthIframeContainer.d.ts +9 -0
  459. package/dist/esm/src/shared/components/CivicAuthIframeContainer.d.ts.map +1 -0
  460. package/dist/esm/src/shared/components/CivicAuthIframeContainer.js +128 -0
  461. package/dist/esm/src/shared/components/CivicAuthIframeContainer.js.map +1 -0
  462. package/dist/esm/src/shared/components/CloseIcon.d.ts +4 -0
  463. package/dist/esm/src/shared/components/CloseIcon.d.ts.map +1 -0
  464. package/dist/esm/src/shared/components/CloseIcon.js +6 -0
  465. package/dist/esm/src/shared/components/CloseIcon.js.map +1 -0
  466. package/dist/esm/src/shared/components/LoadingIcon.d.ts +4 -0
  467. package/dist/esm/src/shared/components/LoadingIcon.d.ts.map +1 -0
  468. package/dist/esm/src/shared/components/LoadingIcon.js +30 -0
  469. package/dist/esm/src/shared/components/LoadingIcon.js.map +1 -0
  470. package/dist/esm/src/shared/hooks/index.d.ts +5 -0
  471. package/dist/esm/src/shared/hooks/index.d.ts.map +1 -0
  472. package/dist/esm/src/shared/hooks/index.js +5 -0
  473. package/dist/esm/src/shared/hooks/index.js.map +1 -0
  474. package/dist/esm/src/shared/hooks/useAuth.d.ts +3 -0
  475. package/dist/esm/src/shared/hooks/useAuth.d.ts.map +1 -0
  476. package/dist/esm/src/shared/hooks/useAuth.js +12 -0
  477. package/dist/esm/src/shared/hooks/useAuth.js.map +1 -0
  478. package/dist/esm/src/shared/hooks/useConfig.d.ts +3 -0
  479. package/dist/esm/src/shared/hooks/useConfig.d.ts.map +1 -0
  480. package/dist/esm/src/shared/hooks/useConfig.js +13 -0
  481. package/dist/esm/src/shared/hooks/useConfig.js.map +1 -0
  482. package/dist/esm/src/shared/hooks/useIframe.d.ts +3 -0
  483. package/dist/esm/src/shared/hooks/useIframe.d.ts.map +1 -0
  484. package/dist/esm/src/shared/hooks/useIframe.js +13 -0
  485. package/dist/esm/src/shared/hooks/useIframe.js.map +1 -0
  486. package/dist/esm/src/shared/hooks/useSession.d.ts +3 -0
  487. package/dist/esm/src/shared/hooks/useSession.d.ts.map +1 -0
  488. package/dist/esm/src/shared/hooks/useSession.js +13 -0
  489. package/dist/esm/src/shared/hooks/useSession.js.map +1 -0
  490. package/dist/esm/src/shared/hooks/useToken.d.ts +3 -0
  491. package/dist/esm/src/shared/hooks/useToken.d.ts.map +1 -0
  492. package/dist/esm/src/shared/hooks/useToken.js +12 -0
  493. package/dist/esm/src/shared/hooks/useToken.js.map +1 -0
  494. package/dist/esm/src/shared/lib/GenericAuthenticationRefresher.d.ts +15 -0
  495. package/dist/esm/src/shared/lib/GenericAuthenticationRefresher.d.ts.map +1 -0
  496. package/dist/esm/src/shared/lib/GenericAuthenticationRefresher.js +39 -0
  497. package/dist/esm/src/shared/lib/GenericAuthenticationRefresher.js.map +1 -0
  498. package/dist/esm/src/shared/lib/UserSession.d.ts +12 -0
  499. package/dist/esm/src/shared/lib/UserSession.d.ts.map +1 -0
  500. package/dist/esm/src/shared/lib/UserSession.js +20 -0
  501. package/dist/esm/src/shared/lib/UserSession.js.map +1 -0
  502. package/dist/esm/src/shared/lib/session.d.ts +3 -0
  503. package/dist/esm/src/shared/lib/session.d.ts.map +1 -0
  504. package/dist/esm/src/shared/lib/session.js +10 -0
  505. package/dist/esm/src/shared/lib/session.js.map +1 -0
  506. package/dist/esm/src/shared/lib/storage.d.ts +25 -0
  507. package/dist/esm/src/shared/lib/storage.d.ts.map +1 -0
  508. package/dist/esm/src/shared/lib/storage.js +17 -0
  509. package/dist/esm/src/shared/lib/storage.js.map +1 -0
  510. package/dist/esm/src/shared/lib/types.d.ts +22 -0
  511. package/dist/esm/src/shared/lib/types.d.ts.map +1 -0
  512. package/dist/esm/src/shared/lib/types.js +16 -0
  513. package/dist/esm/src/shared/lib/types.js.map +1 -0
  514. package/dist/esm/src/shared/lib/util.d.ts +33 -0
  515. package/dist/esm/src/shared/lib/util.d.ts.map +1 -0
  516. package/dist/esm/src/shared/lib/util.js +127 -0
  517. package/dist/esm/src/shared/lib/util.js.map +1 -0
  518. package/dist/esm/src/shared/providers/AuthContext.d.ts +10 -0
  519. package/dist/esm/src/shared/providers/AuthContext.d.ts.map +1 -0
  520. package/dist/esm/src/shared/providers/AuthContext.js +3 -0
  521. package/dist/esm/src/shared/providers/AuthContext.js.map +1 -0
  522. package/dist/esm/src/shared/providers/AuthProvider.d.ts +20 -0
  523. package/dist/esm/src/shared/providers/AuthProvider.d.ts.map +1 -0
  524. package/dist/esm/src/shared/providers/AuthProvider.js +263 -0
  525. package/dist/esm/src/shared/providers/AuthProvider.js.map +1 -0
  526. package/dist/esm/src/shared/providers/CivicAuthProvider.d.ts +6 -0
  527. package/dist/esm/src/shared/providers/CivicAuthProvider.d.ts.map +1 -0
  528. package/dist/esm/src/shared/providers/CivicAuthProvider.js +15 -0
  529. package/dist/esm/src/shared/providers/CivicAuthProvider.js.map +1 -0
  530. package/dist/esm/src/shared/providers/ConfigProvider.d.ts +21 -0
  531. package/dist/esm/src/shared/providers/ConfigProvider.d.ts.map +1 -0
  532. package/dist/esm/src/shared/providers/ConfigProvider.js +19 -0
  533. package/dist/esm/src/shared/providers/ConfigProvider.js.map +1 -0
  534. package/dist/esm/src/shared/providers/IframeProvider.d.ts +16 -0
  535. package/dist/esm/src/shared/providers/IframeProvider.d.ts.map +1 -0
  536. package/dist/esm/src/shared/providers/IframeProvider.js +11 -0
  537. package/dist/esm/src/shared/providers/IframeProvider.js.map +1 -0
  538. package/dist/esm/src/shared/providers/SessionProvider.d.ts +13 -0
  539. package/dist/esm/src/shared/providers/SessionProvider.d.ts.map +1 -0
  540. package/dist/esm/src/shared/providers/SessionProvider.js +13 -0
  541. package/dist/esm/src/shared/providers/SessionProvider.js.map +1 -0
  542. package/dist/esm/src/shared/providers/TokenProvider.d.ts +18 -0
  543. package/dist/esm/src/shared/providers/TokenProvider.d.ts.map +1 -0
  544. package/dist/esm/src/shared/providers/TokenProvider.js +53 -0
  545. package/dist/esm/src/shared/providers/TokenProvider.js.map +1 -0
  546. package/dist/esm/src/shared/providers/UserProvider.d.ts +18 -0
  547. package/dist/esm/src/shared/providers/UserProvider.d.ts.map +1 -0
  548. package/dist/esm/src/shared/providers/UserProvider.js +38 -0
  549. package/dist/esm/src/shared/providers/UserProvider.js.map +1 -0
  550. package/dist/esm/src/types.d.ts +146 -0
  551. package/dist/esm/src/types.d.ts.map +1 -0
  552. package/dist/esm/src/types.js +2 -0
  553. package/dist/esm/src/types.js.map +1 -0
  554. package/dist/esm/src/utils.d.ts +15 -0
  555. package/dist/esm/src/utils.d.ts.map +1 -0
  556. package/dist/esm/src/utils.js +43 -0
  557. package/dist/esm/src/utils.js.map +1 -0
  558. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  559. package/dist/src/nextjs/cookies.d.ts.map +1 -0
  560. package/dist/src/nextjs/cookies.js +113 -0
  561. package/dist/src/nextjs/cookies.js.map +1 -0
  562. package/dist/tsconfig.tsbuildinfo +1 -0
  563. package/package.json +53 -43
  564. package/src/browser/storage.ts +11 -0
  565. package/src/config.ts +6 -0
  566. package/src/constants.ts +29 -0
  567. package/src/index.ts +16 -0
  568. package/src/lib/cookies.ts +28 -0
  569. package/src/lib/jwt.ts +15 -0
  570. package/src/lib/logger.ts +72 -0
  571. package/src/lib/oauth.ts +83 -0
  572. package/src/lib/postMessage.ts +22 -0
  573. package/src/lib/windowUtil.ts +29 -0
  574. package/src/nextjs/GetUser.ts +22 -0
  575. package/src/nextjs/config.ts +205 -0
  576. package/src/nextjs/cookies.ts +162 -0
  577. package/src/nextjs/hooks/index.ts +1 -0
  578. package/src/nextjs/hooks/useTokenCookie.ts +41 -0
  579. package/src/nextjs/hooks/useUserCookie.ts +41 -0
  580. package/src/nextjs/index.ts +20 -0
  581. package/src/nextjs/middleware/index.ts +1 -0
  582. package/src/nextjs/middleware.ts +155 -0
  583. package/src/nextjs/providers/NextAuthProvider.tsx +87 -0
  584. package/src/nextjs/routeHandler.ts +297 -0
  585. package/src/nextjs/utils.ts +9 -0
  586. package/src/reactjs/components/SignInButton.tsx +32 -0
  587. package/src/reactjs/components/SignOutButton.tsx +24 -0
  588. package/src/reactjs/components/UserButton.tsx +215 -0
  589. package/src/reactjs/components/index.ts +5 -0
  590. package/src/reactjs/hooks/index.ts +6 -0
  591. package/src/reactjs/hooks/useAuth.ts +15 -0
  592. package/src/reactjs/hooks/useUser.ts +20 -0
  593. package/src/reactjs/index.ts +19 -0
  594. package/src/reactjs/providers/index.ts +27 -0
  595. package/src/server/ServerAuthenticationResolver.ts +102 -0
  596. package/src/server/config.ts +17 -0
  597. package/src/server/index.ts +12 -0
  598. package/src/server/login.ts +59 -0
  599. package/src/server/refresh.ts +23 -0
  600. package/src/services/AuthenticationService.ts +324 -0
  601. package/src/services/PKCE.ts +45 -0
  602. package/src/services/types.ts +54 -0
  603. package/src/shared/components/CivicAuthIframe.tsx +26 -0
  604. package/src/shared/components/CivicAuthIframeContainer.tsx +190 -0
  605. package/src/shared/components/CloseIcon.tsx +21 -0
  606. package/src/shared/components/LoadingIcon.tsx +53 -0
  607. package/src/shared/hooks/index.ts +4 -0
  608. package/src/shared/hooks/useAuth.ts +15 -0
  609. package/src/shared/hooks/useConfig.ts +14 -0
  610. package/src/shared/hooks/useIframe.ts +14 -0
  611. package/src/shared/hooks/useSession.ts +14 -0
  612. package/src/shared/hooks/useToken.ts +15 -0
  613. package/src/shared/lib/GenericAuthenticationRefresher.ts +70 -0
  614. package/src/shared/lib/UserSession.ts +25 -0
  615. package/src/shared/lib/session.ts +11 -0
  616. package/src/shared/lib/storage.ts +40 -0
  617. package/src/shared/lib/types.ts +26 -0
  618. package/src/shared/lib/util.ts +217 -0
  619. package/src/shared/providers/AuthContext.tsx +11 -0
  620. package/src/shared/providers/AuthProvider.tsx +390 -0
  621. package/src/shared/providers/CivicAuthProvider.tsx +31 -0
  622. package/src/shared/providers/ConfigProvider.tsx +50 -0
  623. package/src/shared/providers/IframeProvider.tsx +34 -0
  624. package/src/shared/providers/SessionProvider.tsx +29 -0
  625. package/src/shared/providers/TokenProvider.tsx +78 -0
  626. package/src/shared/providers/UserProvider.tsx +80 -0
  627. package/src/types.ts +227 -0
  628. package/src/utils.ts +58 -0
  629. package/test/integration/sdk.test.tsx +266 -0
  630. package/test/support/fixtures.ts +56 -0
  631. package/test/support/tokens.json +26 -0
  632. package/test/unit/lib/oauth.test.ts +72 -0
  633. package/test/unit/logger.test.ts +175 -0
  634. package/test/unit/nextjs/NextAuthProvider.test.tsx +38 -0
  635. package/test/unit/nextjs/config.test.ts +218 -0
  636. package/test/unit/nextjs/getUser.test.ts +41 -0
  637. package/test/unit/nextjs/middleware.test.ts +138 -0
  638. package/test/unit/nextjs/routeHandler.test.ts.skipped +369 -0
  639. package/test/unit/nextjs/utils.test.ts +17 -0
  640. package/test/unit/publicApi/__snapshots__/apiSnapshot.test.ts.snap +17 -0
  641. package/test/unit/publicApi/apiSnapshot.test.ts +11 -0
  642. package/test/unit/react/components/SignInButton.test.tsx +50 -0
  643. package/test/unit/react/components/SignOutButton.test.tsx +49 -0
  644. package/test/unit/server/login.test.ts +181 -0
  645. package/test/unit/server/session.test.ts +51 -0
  646. package/test/unit/services/AuthenticationService.test.ts +152 -0
  647. package/test/unit/services/ServerAuthenticationResolver.test.ts +115 -0
  648. package/test/unit/shared/GenericAuthenticationRefresher.test.ts +89 -0
  649. package/test/unit/shared/UserSession.test.ts +42 -0
  650. package/test/unit/shared/components/CivicAuthIframeContainer.test.tsx +154 -0
  651. package/test/unit/shared/storage.test.ts +67 -0
  652. package/test/unit/utils.test.ts +48 -0
  653. package/tsconfig.build.json +5 -0
  654. package/tsconfig.cjs.json +8 -0
  655. package/tsconfig.esm.json +7 -0
  656. package/tsconfig.json +42 -0
  657. package/vitest.config.ts +41 -0
  658. package/dist/chunk-4GIHS7LB.js +0 -201
  659. package/dist/chunk-4GIHS7LB.js.map +0 -1
  660. package/dist/chunk-CRTRMMJ7.js +0 -59
  661. package/dist/chunk-CRTRMMJ7.js.map +0 -1
  662. package/dist/chunk-GNGLWGZJ.mjs +0 -238
  663. package/dist/chunk-GNGLWGZJ.mjs.map +0 -1
  664. package/dist/chunk-NQPMNXBL.mjs +0 -154
  665. package/dist/chunk-NQPMNXBL.mjs.map +0 -1
  666. package/dist/chunk-RGHW4PYM.mjs +0 -59
  667. package/dist/chunk-RGHW4PYM.mjs.map +0 -1
  668. package/dist/chunk-UV56GNIT.mjs +0 -201
  669. package/dist/chunk-UV56GNIT.mjs.map +0 -1
  670. package/dist/chunk-VXIWRZWU.js +0 -238
  671. package/dist/chunk-VXIWRZWU.js.map +0 -1
  672. package/dist/chunk-WPISYQG3.js +0 -154
  673. package/dist/chunk-WPISYQG3.js.map +0 -1
  674. package/dist/index-DoDoIY_K.d.mts +0 -79
  675. package/dist/index-DoDoIY_K.d.ts +0 -79
  676. package/dist/index.css +0 -342
  677. package/dist/index.css.map +0 -1
  678. package/dist/index.d.mts +0 -3
  679. package/dist/index.d.ts +0 -3
  680. package/dist/index.js +0 -2
  681. package/dist/index.js.map +0 -1
  682. package/dist/index.mjs +0 -2
  683. package/dist/index.mjs.map +0 -1
  684. package/dist/nextjs.d.mts +0 -225
  685. package/dist/nextjs.d.ts +0 -225
  686. package/dist/nextjs.js +0 -253
  687. package/dist/nextjs.js.map +0 -1
  688. package/dist/nextjs.mjs +0 -253
  689. package/dist/nextjs.mjs.map +0 -1
  690. package/dist/react.d.mts +0 -119
  691. package/dist/react.d.ts +0 -119
  692. package/dist/react.js +0 -1178
  693. package/dist/react.js.map +0 -1
  694. package/dist/react.mjs +0 -1178
  695. package/dist/react.mjs.map +0 -1
  696. package/dist/server.d.mts +0 -55
  697. package/dist/server.d.ts +0 -55
  698. package/dist/server.js +0 -17
  699. package/dist/server.js.map +0 -1
  700. package/dist/server.mjs +0 -17
  701. package/dist/server.mjs.map +0 -1
@@ -0,0 +1,390 @@
1
+ "use client";
2
+
3
+ import React, {
4
+ type ReactNode,
5
+ useCallback,
6
+ useEffect,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ } from "react";
11
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
12
+ import type { Config, DisplayMode, SessionData } from "@/types.js";
13
+ import { CivicAuthIframeContainer } from "@/shared/components/CivicAuthIframeContainer.js";
14
+ import { TokenProvider } from "@/shared/providers/TokenProvider.js";
15
+ import { SessionProvider } from "@/shared/providers/SessionProvider.js";
16
+ import { DEFAULT_SCOPES } from "@/constants.js";
17
+ import { authConfig } from "@/config.js";
18
+ import { LoadingIcon } from "@/shared/components/LoadingIcon.js";
19
+ import { isWindowInIframe } from "@/lib/windowUtil.js";
20
+ import { AuthContext } from "@/shared/providers/AuthContext.js";
21
+ import {
22
+ BrowserAuthenticationInitiator,
23
+ BrowserAuthenticationService,
24
+ } from "@/services/AuthenticationService.js";
25
+ import type { AuthenticationResolver, PKCEConsumer } from "@/services/types.js";
26
+ import { PopupError } from "@/services/types.js";
27
+ import { ConfidentialClientPKCEConsumer } from "@/services/PKCE.js";
28
+ import { generateState } from "@/lib/oauth.js";
29
+ import { LocalStorageAdapter } from "@/browser/storage.js";
30
+ import { ConfigProvider } from "@/shared/providers/ConfigProvider.js";
31
+ import { getUser } from "../lib/session.js";
32
+ import { GenericUserSession } from "../lib/UserSession.js";
33
+ import { IframeProvider } from "@/shared/providers/IframeProvider.js";
34
+
35
+ // Global this object setup
36
+ let globalThisObject;
37
+ if (typeof window !== "undefined") {
38
+ globalThisObject = window;
39
+ } else if (typeof global !== "undefined") {
40
+ globalThisObject = global;
41
+ } else {
42
+ globalThisObject = Function("return this")();
43
+ }
44
+ globalThisObject.globalThis = globalThisObject;
45
+
46
+ export type AuthProviderProps = {
47
+ children: ReactNode;
48
+ clientId: string;
49
+ nonce?: string;
50
+ onSignIn?: (error?: Error) => void;
51
+ onSignOut?: () => Promise<void>;
52
+ modalIframe?: boolean; // set to false if the iframe is being embedded in the client app
53
+ config?: Config;
54
+ redirectUrl?: string;
55
+ };
56
+
57
+ export type InternalAuthProviderProps = AuthProviderProps & {
58
+ sessionData?: SessionData;
59
+ pkceConsumer?: PKCEConsumer;
60
+ };
61
+
62
+ function BlockDisplay({ children }: { children: ReactNode }) {
63
+ return (
64
+ <div
65
+ style={{
66
+ position: "relative",
67
+ left: 0,
68
+ top: 0,
69
+ zIndex: 50,
70
+ display: "flex",
71
+ height: "100vh",
72
+ width: "100vw",
73
+ alignItems: "center",
74
+ justifyContent: "center",
75
+ backgroundColor: "white",
76
+ }}
77
+ >
78
+ <div
79
+ style={{
80
+ position: "absolute",
81
+ inset: 0,
82
+ display: "flex",
83
+ alignItems: "center",
84
+ justifyContent: "center",
85
+ backgroundColor: "white",
86
+ }}
87
+ >
88
+ {children}
89
+ </div>
90
+ </div>
91
+ );
92
+ }
93
+
94
+ const AuthProvider = ({
95
+ children,
96
+ clientId,
97
+ redirectUrl: inputRedirectUrl,
98
+ config = authConfig,
99
+ onSignIn,
100
+ onSignOut,
101
+ pkceConsumer,
102
+ nonce,
103
+ modalIframe = true,
104
+ sessionData: inputSessionData,
105
+ }: InternalAuthProviderProps) => {
106
+ const [iframeUrl, setIframeUrl] = useState<string | null>(null);
107
+ const [currentUrl, setCurrentUrl] = useState<string | null>(null);
108
+ const [isInIframe, setIsInIframe] = useState(false);
109
+ const [authResponseUrl, setAuthResponseUrl] = useState<string | null>(null);
110
+ const [tokenExchangeError, setTokenExchangeError] = useState<Error>();
111
+ const [displayMode, setDisplayMode] = useState<DisplayMode>("iframe");
112
+ const [browserAuthenticationInitiator, setBrowserAuthenticationInitiator] =
113
+ useState<BrowserAuthenticationInitiator | null>();
114
+ const [showIFrame, setShowIFrame] = useState(false);
115
+ const [isRedirecting, setIsRedirecting] = useState(false);
116
+ const queryClient = useQueryClient();
117
+ const iframeRef = useRef<HTMLIFrameElement>(null);
118
+
119
+ // TODO maybe we want to support or derive serverTokenExchange another way?
120
+ const serverTokenExchange =
121
+ pkceConsumer instanceof ConfidentialClientPKCEConsumer;
122
+ // check if the current window is in an iframe with the iframe id, and set an isInIframe state
123
+ useEffect(() => {
124
+ if (typeof globalThis.window !== "undefined") {
125
+ setCurrentUrl(globalThis.window.location.href);
126
+ const isInIframeVal = isWindowInIframe(globalThis.window);
127
+ setIsInIframe(isInIframeVal);
128
+ }
129
+ }, []);
130
+
131
+ const redirectUrl = useMemo(
132
+ () => (inputRedirectUrl || currentUrl || "").split("?")[0],
133
+ [currentUrl, inputRedirectUrl],
134
+ );
135
+
136
+ const [authService, setAuthService] = useState<AuthenticationResolver>();
137
+
138
+ useEffect(() => {
139
+ if (!currentUrl || !redirectUrl) return;
140
+ BrowserAuthenticationService.build({
141
+ clientId,
142
+ redirectUrl,
143
+ oauthServer: config.oauthServer,
144
+ scopes: DEFAULT_SCOPES,
145
+ displayMode,
146
+ }).then(setAuthService);
147
+ }, [currentUrl, clientId, redirectUrl, config, displayMode]);
148
+
149
+ const {
150
+ data: session,
151
+ isLoading,
152
+ error,
153
+ } = useQuery({
154
+ queryKey: [
155
+ "session",
156
+ authResponseUrl,
157
+ iframeUrl,
158
+ currentUrl,
159
+ isInIframe,
160
+ authService,
161
+ ],
162
+ queryFn: async () => {
163
+ if (!authService) {
164
+ return { authenticated: false };
165
+ }
166
+ if (inputSessionData) {
167
+ return inputSessionData;
168
+ }
169
+ const url = new URL(
170
+ authResponseUrl
171
+ ? authResponseUrl
172
+ : globalThis.window.location.href || "",
173
+ );
174
+ // if we have existing tokens, then validate them and return the session data
175
+ // otherwise check if we have a code in the url and exchange it for tokens
176
+ // if we have neither, return undefined
177
+ const existingSessionData = await authService.validateExistingSession();
178
+ if (existingSessionData.authenticated) {
179
+ return existingSessionData;
180
+ }
181
+ const code = url.searchParams.get("code");
182
+ const state = url.searchParams.get("state");
183
+ if (!serverTokenExchange && code && state && !isInIframe) {
184
+ try {
185
+ await authService.tokenExchange(code, state);
186
+ const clientStorage = new LocalStorageAdapter();
187
+ const user = await getUser(clientStorage);
188
+ if (!user) {
189
+ throw new Error("Failed to get user info");
190
+ }
191
+
192
+ const userSession = new GenericUserSession(clientStorage);
193
+ userSession.set(user);
194
+
195
+ onSignIn?.(); // Call onSignIn without an error if successful
196
+ return authService.getSessionData();
197
+ } catch (error) {
198
+ setTokenExchangeError(error as Error);
199
+ onSignIn?.(
200
+ error instanceof Error ? error : new Error("Failed to sign in"),
201
+ ); // Pass the error to onSignIn
202
+ return { authenticated: false };
203
+ }
204
+ }
205
+
206
+ return existingSessionData;
207
+ },
208
+ });
209
+
210
+ const signOutMutation = useMutation({
211
+ mutationFn: async () => {
212
+ await onSignOut?.();
213
+ // Implement signOut logic here
214
+ const authInitiator = getAuthInitiator();
215
+ await authInitiator?.signOut();
216
+ setIframeUrl(null);
217
+ setShowIFrame(false);
218
+ setAuthResponseUrl(null);
219
+ },
220
+ onSuccess: () => {
221
+ queryClient.setQueryData(
222
+ [
223
+ "session",
224
+ authResponseUrl,
225
+ iframeUrl,
226
+ currentUrl,
227
+ isInIframe,
228
+ authService,
229
+ ],
230
+ null,
231
+ );
232
+ },
233
+ });
234
+
235
+ const getAuthInitiator = useCallback(
236
+ (overrideDisplayMode?: DisplayMode) => {
237
+ const useDisplayMode = overrideDisplayMode || displayMode;
238
+ if (!pkceConsumer || !redirectUrl) {
239
+ return null;
240
+ }
241
+ return (
242
+ browserAuthenticationInitiator ||
243
+ new BrowserAuthenticationInitiator({
244
+ pkceConsumer, // generate and retrieve the challenge client-side
245
+ clientId,
246
+ redirectUrl,
247
+ state: generateState(useDisplayMode, serverTokenExchange),
248
+ scopes: DEFAULT_SCOPES,
249
+ displayMode: useDisplayMode,
250
+ oauthServer: config.oauthServer,
251
+ // the endpoints to use for the login (if not obtained from the auth server
252
+ endpointOverrides: config.endpoints,
253
+ nonce,
254
+ })
255
+ );
256
+ },
257
+ [
258
+ serverTokenExchange,
259
+ displayMode,
260
+ browserAuthenticationInitiator,
261
+ clientId,
262
+ redirectUrl,
263
+ config.oauthServer,
264
+ config.endpoints,
265
+ pkceConsumer,
266
+ nonce,
267
+ ],
268
+ );
269
+
270
+ const signIn = useCallback(
271
+ async (overrideDisplayMode: DisplayMode = "iframe") => {
272
+ setDisplayMode(overrideDisplayMode);
273
+ const authInitiator = getAuthInitiator(overrideDisplayMode);
274
+ setBrowserAuthenticationInitiator(authInitiator);
275
+ if (overrideDisplayMode === "iframe") {
276
+ setShowIFrame(true);
277
+ } else if (overrideDisplayMode === "redirect") {
278
+ setIsRedirecting(true);
279
+ }
280
+ authInitiator?.signIn(iframeRef.current).catch((error) => {
281
+ console.log("signIn error", {
282
+ error,
283
+ isPopupError: error instanceof PopupError,
284
+ });
285
+ // if we've tried to open a popup and it has failed, then fallback to redirect mode
286
+ if (error instanceof PopupError) {
287
+ signIn("redirect");
288
+ }
289
+ });
290
+ },
291
+ [getAuthInitiator],
292
+ );
293
+
294
+ // remove event listeners when the component unmounts
295
+ useEffect(() => {
296
+ return () => {
297
+ if (browserAuthenticationInitiator) {
298
+ browserAuthenticationInitiator.cleanup();
299
+ }
300
+ };
301
+ }, [browserAuthenticationInitiator]);
302
+
303
+ const isAuthenticated = useMemo(
304
+ () => (session ? session.authenticated : false),
305
+ [session],
306
+ );
307
+
308
+ useQuery({
309
+ queryKey: ["autoSignIn", modalIframe, redirectUrl, isAuthenticated],
310
+ queryFn: async () => {
311
+ if (
312
+ !modalIframe &&
313
+ redirectUrl &&
314
+ !isAuthenticated &&
315
+ iframeRef.current
316
+ ) {
317
+ signIn("iframe");
318
+ }
319
+ return true;
320
+ },
321
+ refetchOnWindowFocus: false,
322
+ });
323
+
324
+ const value = useMemo(
325
+ () => ({
326
+ isLoading,
327
+ error: error as Error | null,
328
+ signOut: async () => {
329
+ await signOutMutation.mutateAsync();
330
+ },
331
+ isAuthenticated,
332
+ signIn,
333
+ }),
334
+ [isLoading, error, signOutMutation, isAuthenticated, signIn],
335
+ );
336
+
337
+ if (!redirectUrl) return null;
338
+
339
+ return (
340
+ <AuthContext.Provider value={value}>
341
+ <ConfigProvider
342
+ config={config}
343
+ redirectUrl={redirectUrl}
344
+ modalIframe={modalIframe}
345
+ serverTokenExchange={serverTokenExchange}
346
+ >
347
+ <IframeProvider
348
+ setAuthResponseUrl={setAuthResponseUrl}
349
+ iframeRef={iframeRef}
350
+ >
351
+ <SessionProvider session={session}>
352
+ <TokenProvider>
353
+ {modalIframe && !isInIframe && !session?.authenticated && (
354
+ <div
355
+ style={
356
+ showIFrame ? { display: "block" } : { display: "none" }
357
+ }
358
+ >
359
+ <CivicAuthIframeContainer
360
+ onClose={() => setShowIFrame(false)}
361
+ />
362
+ </div>
363
+ )}
364
+
365
+ {modalIframe &&
366
+ (isInIframe ||
367
+ isRedirecting ||
368
+ (isLoading && !serverTokenExchange)) && (
369
+ <BlockDisplay>
370
+ <LoadingIcon />
371
+ </BlockDisplay>
372
+ )}
373
+
374
+ {(tokenExchangeError || error) && (
375
+ <BlockDisplay>
376
+ <div>
377
+ Error: {(tokenExchangeError || (error as Error)).message}
378
+ </div>
379
+ </BlockDisplay>
380
+ )}
381
+ {children}
382
+ </TokenProvider>
383
+ </SessionProvider>
384
+ </IframeProvider>
385
+ </ConfigProvider>
386
+ </AuthContext.Provider>
387
+ );
388
+ };
389
+
390
+ export { AuthProvider };
@@ -0,0 +1,31 @@
1
+ "use client";
2
+ import React from "react";
3
+ import {
4
+ AuthProvider,
5
+ type AuthProviderProps,
6
+ } from "@/shared/providers/AuthProvider.js";
7
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
8
+ import { BrowserPublicClientPKCEProducer } from "@/services/PKCE.js";
9
+ import { UserProvider } from "./UserProvider.js";
10
+ import { LocalStorageAdapter } from "@/browser/storage.js";
11
+
12
+ const queryClient = new QueryClient();
13
+
14
+ type CivicAuthProviderProps = Omit<AuthProviderProps, "pkceConsumer">;
15
+
16
+ const CivicAuthProvider = ({ children, ...props }: CivicAuthProviderProps) => {
17
+ return (
18
+ <QueryClientProvider client={queryClient}>
19
+ <AuthProvider
20
+ {...props}
21
+ pkceConsumer={new BrowserPublicClientPKCEProducer()}
22
+ >
23
+ <UserProvider storage={new LocalStorageAdapter()}>
24
+ {children}
25
+ </UserProvider>
26
+ </AuthProvider>
27
+ </QueryClientProvider>
28
+ );
29
+ };
30
+
31
+ export { CivicAuthProvider, type CivicAuthProviderProps };
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ import { authConfig } from "@/config.js";
3
+ import type { Config } from "@/types.js";
4
+ import type { ReactNode } from "react";
5
+ import React, { createContext } from "react";
6
+
7
+ export type ConfigProviderOutput = {
8
+ config: Config;
9
+ redirectUrl: string;
10
+ modalIframe: boolean;
11
+ serverTokenExchange: boolean;
12
+ };
13
+ const defaultConfig: ConfigProviderOutput = {
14
+ config: authConfig,
15
+ redirectUrl: "",
16
+ modalIframe: true,
17
+ serverTokenExchange: false,
18
+ };
19
+ // Context for exposing Config specifically to the TokenProvider
20
+ const ConfigContext = createContext<ConfigProviderOutput>(defaultConfig);
21
+
22
+ type ConfigContextType = {
23
+ children: ReactNode;
24
+ config: Config;
25
+ redirectUrl: string;
26
+ modalIframe?: boolean;
27
+ serverTokenExchange: boolean;
28
+ };
29
+
30
+ const ConfigProvider = ({
31
+ children,
32
+ config,
33
+ redirectUrl,
34
+ modalIframe,
35
+ serverTokenExchange,
36
+ }: ConfigContextType) => (
37
+ <ConfigContext.Provider
38
+ value={{
39
+ config,
40
+ redirectUrl,
41
+ modalIframe: !!modalIframe,
42
+ serverTokenExchange,
43
+ }}
44
+ >
45
+ {children}
46
+ </ConfigContext.Provider>
47
+ );
48
+
49
+ export type { ConfigContextType };
50
+ export { ConfigProvider, ConfigContext };
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import type { Dispatch, ReactNode, RefObject, SetStateAction } from "react";
3
+ import React, { createContext } from "react";
4
+
5
+ export type IframeProviderOutput = {
6
+ iframeRef: RefObject<HTMLIFrameElement> | null;
7
+ setAuthResponseUrl: Dispatch<SetStateAction<string | null>>;
8
+ };
9
+ const defaultIframe: IframeProviderOutput = {
10
+ iframeRef: null,
11
+ setAuthResponseUrl: () => {},
12
+ };
13
+
14
+ // Context for exposing Iframe specifically to the TokenProvider
15
+ const IframeContext = createContext<IframeProviderOutput>(defaultIframe);
16
+
17
+ type IframeContextType = {
18
+ children: ReactNode;
19
+ iframeRef: RefObject<HTMLIFrameElement> | null;
20
+ setAuthResponseUrl: Dispatch<SetStateAction<string | null>>;
21
+ };
22
+
23
+ const IframeProvider = ({
24
+ children,
25
+ iframeRef,
26
+ setAuthResponseUrl,
27
+ }: IframeContextType) => (
28
+ <IframeContext.Provider value={{ iframeRef, setAuthResponseUrl }}>
29
+ {children}
30
+ </IframeContext.Provider>
31
+ );
32
+
33
+ export type { IframeContextType };
34
+ export { IframeProvider, IframeContext };
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import type { SessionData } from "@/types.js";
3
+ import type { ReactNode } from "react";
4
+ import React, { createContext } from "react";
5
+
6
+ export type SessionProviderOutput = SessionData;
7
+ const defaultSession: SessionProviderOutput = {
8
+ authenticated: false,
9
+ idToken: undefined,
10
+ accessToken: undefined,
11
+ displayMode: "iframe",
12
+ };
13
+
14
+ // Context for exposing session specifically to the TokenProvider
15
+ const SessionContext = createContext<SessionProviderOutput>(defaultSession);
16
+
17
+ type SessionContextType = {
18
+ children: ReactNode;
19
+ session?: SessionData | null;
20
+ };
21
+
22
+ const SessionProvider = ({ children, session }: SessionContextType) => (
23
+ <SessionContext.Provider value={{ ...defaultSession, ...(session || {}) }}>
24
+ {children}
25
+ </SessionContext.Provider>
26
+ );
27
+
28
+ export type { SessionContextType };
29
+ export { SessionProvider, SessionContext };
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ import type { ReactNode } from "react";
3
+ import React, { createContext, useMemo } from "react";
4
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
5
+ import { useAuth } from "@/shared/hooks/useAuth.js";
6
+ import { useSession } from "@/shared/hooks/useSession.js";
7
+ import type { ForwardedTokens, IdToken } from "@/types.js";
8
+ import { parseJWT } from "oslo/jwt";
9
+ import { convertForwardedTokenFormat } from "@/lib/jwt.js";
10
+
11
+ type TokenContextType = {
12
+ accessToken: string | null;
13
+ idToken: string | null;
14
+ forwardedTokens: ForwardedTokens;
15
+ refreshToken: () => Promise<void>;
16
+ isLoading: boolean;
17
+ error: Error | null;
18
+ };
19
+
20
+ const TokenContext = createContext<TokenContextType | undefined>(undefined);
21
+
22
+ const TokenProvider = ({ children }: { children: ReactNode }) => {
23
+ const { isLoading, error: authError } = useAuth();
24
+ const session = useSession();
25
+ const queryClient = useQueryClient();
26
+
27
+ const refreshTokenMutation = useMutation({
28
+ mutationFn: async () => {
29
+ // Implement token refresh logic here
30
+ throw new Error("Method not implemented.");
31
+ },
32
+ onSuccess: () => {
33
+ // Invalidate and refetch queries that depend on the auth session
34
+ queryClient.invalidateQueries({ queryKey: ["session"] });
35
+ },
36
+ });
37
+
38
+ const decodeTokens = useMemo(() => {
39
+ if (!session?.idToken) return null;
40
+
41
+ const parsedJWT = parseJWT(session.idToken) as IdToken | null;
42
+
43
+ if (!parsedJWT) return null;
44
+
45
+ const { forwardedTokens } = parsedJWT.payload;
46
+
47
+ return forwardedTokens
48
+ ? convertForwardedTokenFormat(forwardedTokens)
49
+ : null;
50
+ }, [session?.idToken]);
51
+
52
+ const value = useMemo(
53
+ () => ({
54
+ accessToken: session.accessToken || null,
55
+ idToken: session.idToken || null,
56
+ forwardedTokens: decodeTokens || {},
57
+ refreshToken: refreshTokenMutation.mutateAsync,
58
+ isLoading,
59
+ error: (authError || refreshTokenMutation.error) as Error | null,
60
+ }),
61
+ [
62
+ session.accessToken,
63
+ session.idToken,
64
+ decodeTokens,
65
+ refreshTokenMutation.mutateAsync,
66
+ refreshTokenMutation.error,
67
+ isLoading,
68
+ authError,
69
+ ],
70
+ );
71
+
72
+ return (
73
+ <TokenContext.Provider value={value}>{children}</TokenContext.Provider>
74
+ );
75
+ };
76
+
77
+ export type { TokenContextType };
78
+ export { TokenProvider, TokenContext };
@@ -0,0 +1,80 @@
1
+ "use client";
2
+
3
+ import React, { createContext } from "react";
4
+ import type { ReactNode } from "react";
5
+ import type { UseQueryResult } from "@tanstack/react-query";
6
+ import { useQuery } from "@tanstack/react-query";
7
+ import type { JWT } from "oslo/jwt";
8
+ import type { AuthStorage, EmptyObject, User } from "@/types.js";
9
+ import { useAuth } from "@/shared/hooks/useAuth.js";
10
+ import { useToken } from "@/shared/hooks/useToken.js";
11
+ import { useSession } from "@/shared/hooks/useSession.js";
12
+ import type { AuthContextType } from "@/shared/providers/AuthContext.js";
13
+ import { GenericUserSession } from "@/shared/lib/UserSession.js";
14
+
15
+ type UserContextType<
16
+ T extends Record<string, unknown> & JWT["payload"] = Record<string, unknown> &
17
+ JWT["payload"],
18
+ > = {
19
+ user: User<T> | null;
20
+ } & Omit<AuthContextType, "isAuthenticated">;
21
+
22
+ const UserContext = createContext<UserContextType | null>(null);
23
+
24
+ const UserProvider = <T extends EmptyObject>({
25
+ children,
26
+ storage,
27
+ user: inputUser,
28
+ signOut: inputSignOut,
29
+ }: {
30
+ children: ReactNode;
31
+ storage: AuthStorage;
32
+ user?: User<T> | null;
33
+ signOut?: () => Promise<void>;
34
+ }) => {
35
+ const { isLoading: authLoading, error: authError } = useAuth();
36
+ const session = useSession();
37
+ const { accessToken, idToken } = useToken();
38
+ const { signIn, signOut } = useAuth();
39
+
40
+ const fetchUser = async (): Promise<User | null> => {
41
+ if (!accessToken) {
42
+ return null;
43
+ }
44
+ const userSession = new GenericUserSession(storage);
45
+ return userSession.get();
46
+ };
47
+
48
+ const {
49
+ data: user,
50
+ isLoading: userLoading,
51
+ error: userError,
52
+ }: UseQueryResult<User<T> | null, Error> = useQuery({
53
+ queryKey: ["user", session?.idToken],
54
+ queryFn: fetchUser,
55
+ enabled: !!session?.idToken, // Only run the query if we have an access token
56
+ });
57
+
58
+ const isLoading = authLoading || userLoading;
59
+ const error = authError || userError;
60
+
61
+ const userWithIdToken = user ? { ...user, idToken } : null;
62
+
63
+ return (
64
+ <UserContext.Provider
65
+ value={{
66
+ user: (inputUser || userWithIdToken) ?? null,
67
+ isLoading,
68
+ error,
69
+ signIn,
70
+ signOut: inputSignOut || signOut,
71
+ }}
72
+ >
73
+ {children}
74
+ </UserContext.Provider>
75
+ );
76
+ };
77
+
78
+ export type { UserContextType };
79
+
80
+ export { UserProvider, UserContext };