@civic/auth 0.3.2-beta.3 → 0.3.2-beta.4

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 (484) hide show
  1. package/dist/cjs/nextjs/config.d.ts +1 -0
  2. package/dist/cjs/nextjs/config.d.ts.map +1 -1
  3. package/dist/cjs/nextjs/config.js +8 -0
  4. package/dist/cjs/nextjs/config.js.map +1 -1
  5. package/dist/cjs/shared/version.d.ts +1 -1
  6. package/dist/cjs/shared/version.js +1 -1
  7. package/dist/cjs/shared/version.js.map +1 -1
  8. package/dist/esm/nextjs/config.d.ts +1 -0
  9. package/dist/esm/nextjs/config.d.ts.map +1 -1
  10. package/dist/esm/nextjs/config.js +8 -0
  11. package/dist/esm/nextjs/config.js.map +1 -1
  12. package/dist/esm/shared/version.d.ts +1 -1
  13. package/dist/esm/shared/version.js +1 -1
  14. package/dist/esm/shared/version.js.map +1 -1
  15. package/dist/generateVersion.d.ts +2 -0
  16. package/dist/generateVersion.d.ts.map +1 -0
  17. package/dist/generateVersion.js +12 -0
  18. package/dist/generateVersion.js.map +1 -0
  19. package/dist/package.json +118 -0
  20. package/dist/src/browser/storage.d.ts +9 -0
  21. package/dist/src/browser/storage.d.ts.map +1 -0
  22. package/dist/src/browser/storage.js +17 -0
  23. package/dist/src/browser/storage.js.map +1 -0
  24. package/dist/src/config.d.ts +3 -0
  25. package/dist/src/config.d.ts.map +1 -0
  26. package/dist/src/config.js +5 -0
  27. package/dist/src/config.js.map +1 -0
  28. package/dist/src/constants.d.ts +8 -0
  29. package/dist/src/constants.d.ts.map +1 -0
  30. package/dist/src/constants.js +16 -0
  31. package/dist/src/constants.js.map +1 -0
  32. package/dist/src/index.d.ts +6 -0
  33. package/dist/src/index.d.ts.map +1 -0
  34. package/dist/src/index.js +4 -0
  35. package/dist/src/index.js.map +1 -0
  36. package/dist/src/lib/cookies.d.ts +7 -0
  37. package/dist/src/lib/cookies.d.ts.map +1 -0
  38. package/dist/src/lib/cookies.js +25 -0
  39. package/dist/src/lib/cookies.js.map +1 -0
  40. package/dist/src/lib/jwt.d.ts +3 -0
  41. package/dist/src/lib/jwt.d.ts.map +1 -0
  42. package/dist/src/lib/jwt.js +9 -0
  43. package/dist/src/lib/jwt.js.map +1 -0
  44. package/dist/src/lib/logger.d.ts +26 -0
  45. package/dist/src/lib/logger.d.ts.map +1 -0
  46. package/dist/src/lib/logger.js +55 -0
  47. package/dist/src/lib/logger.js.map +1 -0
  48. package/dist/src/lib/oauth.d.ts +19 -0
  49. package/dist/src/lib/oauth.d.ts.map +1 -0
  50. package/dist/src/lib/oauth.js +61 -0
  51. package/dist/src/lib/oauth.js.map +1 -0
  52. package/dist/src/lib/obj.d.ts +3 -0
  53. package/dist/src/lib/obj.d.ts.map +1 -0
  54. package/dist/src/lib/obj.js +18 -0
  55. package/dist/src/lib/obj.js.map +1 -0
  56. package/dist/src/lib/postMessage.d.ts +4 -0
  57. package/dist/src/lib/postMessage.d.ts.map +1 -0
  58. package/dist/src/lib/postMessage.js +15 -0
  59. package/dist/src/lib/postMessage.js.map +1 -0
  60. package/dist/src/lib/windowUtil.d.ts +4 -0
  61. package/dist/src/lib/windowUtil.d.ts.map +1 -0
  62. package/dist/src/lib/windowUtil.js +31 -0
  63. package/dist/src/lib/windowUtil.js.map +1 -0
  64. package/dist/src/nextjs/GetUser.d.ts +6 -0
  65. package/dist/src/nextjs/GetUser.d.ts.map +1 -0
  66. package/dist/src/nextjs/GetUser.js +7 -0
  67. package/dist/src/nextjs/GetUser.js.map +1 -0
  68. package/dist/src/nextjs/config.d.ts +181 -0
  69. package/dist/src/nextjs/config.d.ts.map +1 -0
  70. package/dist/src/nextjs/config.js +177 -0
  71. package/dist/src/nextjs/config.js.map +1 -0
  72. package/dist/src/nextjs/cookies.d.ts +30 -0
  73. package/dist/src/nextjs/cookies.d.ts.map +1 -0
  74. package/dist/src/nextjs/cookies.js +112 -0
  75. package/dist/src/nextjs/cookies.js.map +1 -0
  76. package/dist/src/nextjs/hooks/index.d.ts +2 -0
  77. package/dist/src/nextjs/hooks/index.d.ts.map +1 -0
  78. package/dist/src/nextjs/hooks/index.js +2 -0
  79. package/dist/src/nextjs/hooks/index.js.map +1 -0
  80. package/dist/src/nextjs/hooks/usePrevious.d.ts +2 -0
  81. package/dist/src/nextjs/hooks/usePrevious.d.ts.map +1 -0
  82. package/dist/src/nextjs/hooks/usePrevious.js +9 -0
  83. package/dist/src/nextjs/hooks/usePrevious.js.map +1 -0
  84. package/dist/src/nextjs/hooks/useUserCookie.d.ts +8 -0
  85. package/dist/src/nextjs/hooks/useUserCookie.d.ts.map +1 -0
  86. package/dist/src/nextjs/hooks/useUserCookie.js +88 -0
  87. package/dist/src/nextjs/hooks/useUserCookie.js.map +1 -0
  88. package/dist/src/nextjs/index.d.ts +7 -0
  89. package/dist/src/nextjs/index.d.ts.map +1 -0
  90. package/dist/src/nextjs/index.js +8 -0
  91. package/dist/src/nextjs/index.js.map +1 -0
  92. package/dist/src/nextjs/middleware/index.d.ts +2 -0
  93. package/dist/src/nextjs/middleware/index.d.ts.map +1 -0
  94. package/dist/src/nextjs/middleware/index.js +4 -0
  95. package/dist/src/nextjs/middleware/index.js.map +1 -0
  96. package/dist/src/nextjs/middleware.d.ts +59 -0
  97. package/dist/src/nextjs/middleware.d.ts.map +1 -0
  98. package/dist/src/nextjs/middleware.js +107 -0
  99. package/dist/src/nextjs/middleware.js.map +1 -0
  100. package/dist/src/nextjs/providers/NextAuthProvider.d.ts +13 -0
  101. package/dist/src/nextjs/providers/NextAuthProvider.d.ts.map +1 -0
  102. package/dist/src/nextjs/providers/NextAuthProvider.js +94 -0
  103. package/dist/src/nextjs/providers/NextAuthProvider.js.map +1 -0
  104. package/dist/src/nextjs/routeHandler.d.ts +19 -0
  105. package/dist/src/nextjs/routeHandler.d.ts.map +1 -0
  106. package/dist/src/nextjs/routeHandler.js +309 -0
  107. package/dist/src/nextjs/routeHandler.js.map +1 -0
  108. package/dist/src/nextjs/utils.d.ts +3 -0
  109. package/dist/src/nextjs/utils.d.ts.map +1 -0
  110. package/dist/src/nextjs/utils.js +5 -0
  111. package/dist/src/nextjs/utils.js.map +1 -0
  112. package/dist/src/reactjs/components/SignInButton.d.ts +8 -0
  113. package/dist/src/reactjs/components/SignInButton.d.ts.map +1 -0
  114. package/dist/src/reactjs/components/SignInButton.js +14 -0
  115. package/dist/src/reactjs/components/SignInButton.js.map +1 -0
  116. package/dist/src/reactjs/components/SignOutButton.d.ts +6 -0
  117. package/dist/src/reactjs/components/SignOutButton.d.ts.map +1 -0
  118. package/dist/src/reactjs/components/SignOutButton.js +14 -0
  119. package/dist/src/reactjs/components/SignOutButton.js.map +1 -0
  120. package/dist/src/reactjs/components/UserButton.d.ts +6 -0
  121. package/dist/src/reactjs/components/UserButton.d.ts.map +1 -0
  122. package/dist/src/reactjs/components/UserButton.js +118 -0
  123. package/dist/src/reactjs/components/UserButton.js.map +1 -0
  124. package/dist/src/reactjs/components/index.d.ts +6 -0
  125. package/dist/src/reactjs/components/index.d.ts.map +1 -0
  126. package/dist/src/reactjs/components/index.js +6 -0
  127. package/dist/src/reactjs/components/index.js.map +1 -0
  128. package/dist/src/reactjs/hooks/index.d.ts +6 -0
  129. package/dist/src/reactjs/hooks/index.d.ts.map +1 -0
  130. package/dist/src/reactjs/hooks/index.js +6 -0
  131. package/dist/src/reactjs/hooks/index.js.map +1 -0
  132. package/dist/src/reactjs/hooks/useAuth.d.ts +3 -0
  133. package/dist/src/reactjs/hooks/useAuth.d.ts.map +1 -0
  134. package/dist/src/reactjs/hooks/useAuth.js +12 -0
  135. package/dist/src/reactjs/hooks/useAuth.js.map +1 -0
  136. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.d.ts +3 -0
  137. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.d.ts.map +1 -0
  138. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.js +13 -0
  139. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.js.map +1 -0
  140. package/dist/src/reactjs/hooks/useUser.d.ts +4 -0
  141. package/dist/src/reactjs/hooks/useUser.d.ts.map +1 -0
  142. package/dist/src/reactjs/hooks/useUser.js +12 -0
  143. package/dist/src/reactjs/hooks/useUser.js.map +1 -0
  144. package/dist/src/reactjs/index.d.ts +6 -0
  145. package/dist/src/reactjs/index.d.ts.map +1 -0
  146. package/dist/src/reactjs/index.js +10 -0
  147. package/dist/src/reactjs/index.js.map +1 -0
  148. package/dist/src/reactjs/providers/AuthProvider.d.ts +11 -0
  149. package/dist/src/reactjs/providers/AuthProvider.d.ts.map +1 -0
  150. package/dist/src/reactjs/providers/AuthProvider.js +76 -0
  151. package/dist/src/reactjs/providers/AuthProvider.js.map +1 -0
  152. package/dist/src/reactjs/providers/CivicAuthProvider.d.ts +6 -0
  153. package/dist/src/reactjs/providers/CivicAuthProvider.d.ts.map +1 -0
  154. package/dist/src/reactjs/providers/CivicAuthProvider.js +32 -0
  155. package/dist/src/reactjs/providers/CivicAuthProvider.js.map +1 -0
  156. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts +17 -0
  157. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts.map +1 -0
  158. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.js +148 -0
  159. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.js.map +1 -0
  160. package/dist/src/reactjs/providers/index.d.ts +8 -0
  161. package/dist/src/reactjs/providers/index.d.ts.map +1 -0
  162. package/dist/src/reactjs/providers/index.js +7 -0
  163. package/dist/src/reactjs/providers/index.js.map +1 -0
  164. package/dist/src/server/ServerAuthenticationResolver.d.ts +20 -0
  165. package/dist/src/server/ServerAuthenticationResolver.d.ts.map +1 -0
  166. package/dist/src/server/ServerAuthenticationResolver.js +67 -0
  167. package/dist/src/server/ServerAuthenticationResolver.js.map +1 -0
  168. package/dist/src/server/config.d.ts +10 -0
  169. package/dist/src/server/config.d.ts.map +1 -0
  170. package/dist/src/server/config.js +2 -0
  171. package/dist/src/server/config.js.map +1 -0
  172. package/dist/src/server/index.d.ts +7 -0
  173. package/dist/src/server/index.d.ts.map +1 -0
  174. package/dist/src/server/index.js +7 -0
  175. package/dist/src/server/index.js.map +1 -0
  176. package/dist/src/server/login.d.ts +21 -0
  177. package/dist/src/server/login.d.ts.map +1 -0
  178. package/dist/src/server/login.js +56 -0
  179. package/dist/src/server/login.js.map +1 -0
  180. package/dist/src/server/refresh.d.ts +7 -0
  181. package/dist/src/server/refresh.d.ts.map +1 -0
  182. package/dist/src/server/refresh.js +13 -0
  183. package/dist/src/server/refresh.js.map +1 -0
  184. package/dist/src/services/AuthenticationService.d.ts +91 -0
  185. package/dist/src/services/AuthenticationService.d.ts.map +1 -0
  186. package/dist/src/services/AuthenticationService.js +322 -0
  187. package/dist/src/services/AuthenticationService.js.map +1 -0
  188. package/dist/src/services/PKCE.d.ts +20 -0
  189. package/dist/src/services/PKCE.d.ts.map +1 -0
  190. package/dist/src/services/PKCE.js +44 -0
  191. package/dist/src/services/PKCE.js.map +1 -0
  192. package/dist/src/services/types.d.ts +24 -0
  193. package/dist/src/services/types.d.ts.map +1 -0
  194. package/dist/src/services/types.js +7 -0
  195. package/dist/src/services/types.js.map +1 -0
  196. package/dist/src/shared/components/BlockDisplay.d.ts +7 -0
  197. package/dist/src/shared/components/BlockDisplay.d.ts.map +1 -0
  198. package/dist/src/shared/components/BlockDisplay.js +25 -0
  199. package/dist/src/shared/components/BlockDisplay.js.map +1 -0
  200. package/dist/src/shared/components/CivicAuthIframe.d.ts +9 -0
  201. package/dist/src/shared/components/CivicAuthIframe.d.ts.map +1 -0
  202. package/dist/src/shared/components/CivicAuthIframe.js +8 -0
  203. package/dist/src/shared/components/CivicAuthIframe.js.map +1 -0
  204. package/dist/src/shared/components/CivicAuthIframeContainer.d.ts +13 -0
  205. package/dist/src/shared/components/CivicAuthIframeContainer.d.ts.map +1 -0
  206. package/dist/src/shared/components/CivicAuthIframeContainer.js +138 -0
  207. package/dist/src/shared/components/CivicAuthIframeContainer.js.map +1 -0
  208. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.d.ts +7 -0
  209. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.d.ts.map +1 -0
  210. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.js +22 -0
  211. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.js.map +1 -0
  212. package/dist/src/shared/components/CloseIcon.d.ts +4 -0
  213. package/dist/src/shared/components/CloseIcon.d.ts.map +1 -0
  214. package/dist/src/shared/components/CloseIcon.js +6 -0
  215. package/dist/src/shared/components/CloseIcon.js.map +1 -0
  216. package/dist/src/shared/components/IFrameAndLoading.d.ts +8 -0
  217. package/dist/src/shared/components/IFrameAndLoading.d.ts.map +1 -0
  218. package/dist/src/shared/components/IFrameAndLoading.js +27 -0
  219. package/dist/src/shared/components/IFrameAndLoading.js.map +1 -0
  220. package/dist/src/shared/components/LoadingIcon.d.ts +4 -0
  221. package/dist/src/shared/components/LoadingIcon.d.ts.map +1 -0
  222. package/dist/src/shared/components/LoadingIcon.js +30 -0
  223. package/dist/src/shared/components/LoadingIcon.js.map +1 -0
  224. package/dist/src/shared/hooks/index.d.ts +11 -0
  225. package/dist/src/shared/hooks/index.d.ts.map +1 -0
  226. package/dist/src/shared/hooks/index.js +11 -0
  227. package/dist/src/shared/hooks/index.js.map +1 -0
  228. package/dist/src/shared/hooks/useAuth.d.ts +3 -0
  229. package/dist/src/shared/hooks/useAuth.d.ts.map +1 -0
  230. package/dist/src/shared/hooks/useAuth.js +12 -0
  231. package/dist/src/shared/hooks/useAuth.js.map +1 -0
  232. package/dist/src/shared/hooks/useCivicAuthConfig.d.ts +3 -0
  233. package/dist/src/shared/hooks/useCivicAuthConfig.d.ts.map +1 -0
  234. package/dist/src/shared/hooks/useCivicAuthConfig.js +10 -0
  235. package/dist/src/shared/hooks/useCivicAuthConfig.js.map +1 -0
  236. package/dist/src/shared/hooks/useClientTokenExchangeSession.d.ts +3 -0
  237. package/dist/src/shared/hooks/useClientTokenExchangeSession.d.ts.map +1 -0
  238. package/dist/src/shared/hooks/useClientTokenExchangeSession.js +13 -0
  239. package/dist/src/shared/hooks/useClientTokenExchangeSession.js.map +1 -0
  240. package/dist/src/shared/hooks/useCurrentUrl.d.ts +3 -0
  241. package/dist/src/shared/hooks/useCurrentUrl.d.ts.map +1 -0
  242. package/dist/src/shared/hooks/useCurrentUrl.js +24 -0
  243. package/dist/src/shared/hooks/useCurrentUrl.js.map +1 -0
  244. package/dist/src/shared/hooks/useIframe.d.ts +3 -0
  245. package/dist/src/shared/hooks/useIframe.d.ts.map +1 -0
  246. package/dist/src/shared/hooks/useIframe.js +13 -0
  247. package/dist/src/shared/hooks/useIframe.js.map +1 -0
  248. package/dist/src/shared/hooks/useIsInIframe.d.ts +3 -0
  249. package/dist/src/shared/hooks/useIsInIframe.d.ts.map +1 -0
  250. package/dist/src/shared/hooks/useIsInIframe.js +14 -0
  251. package/dist/src/shared/hooks/useIsInIframe.js.map +1 -0
  252. package/dist/src/shared/hooks/useOAuthEndpoints.d.ts +4 -0
  253. package/dist/src/shared/hooks/useOAuthEndpoints.d.ts.map +1 -0
  254. package/dist/src/shared/hooks/useOAuthEndpoints.js +14 -0
  255. package/dist/src/shared/hooks/useOAuthEndpoints.js.map +1 -0
  256. package/dist/src/shared/hooks/useRefresh.d.ts +4 -0
  257. package/dist/src/shared/hooks/useRefresh.d.ts.map +1 -0
  258. package/dist/src/shared/hooks/useRefresh.js +38 -0
  259. package/dist/src/shared/hooks/useRefresh.js.map +1 -0
  260. package/dist/src/shared/hooks/useSession.d.ts +3 -0
  261. package/dist/src/shared/hooks/useSession.d.ts.map +1 -0
  262. package/dist/src/shared/hooks/useSession.js +13 -0
  263. package/dist/src/shared/hooks/useSession.js.map +1 -0
  264. package/dist/src/shared/hooks/useSignIn.d.ts +15 -0
  265. package/dist/src/shared/hooks/useSignIn.d.ts.map +1 -0
  266. package/dist/src/shared/hooks/useSignIn.js +126 -0
  267. package/dist/src/shared/hooks/useSignIn.js.map +1 -0
  268. package/dist/src/shared/hooks/useToken.d.ts +3 -0
  269. package/dist/src/shared/hooks/useToken.d.ts.map +1 -0
  270. package/dist/src/shared/hooks/useToken.js +12 -0
  271. package/dist/src/shared/hooks/useToken.js.map +1 -0
  272. package/dist/src/shared/hooks/useWindowFocused.d.ts +5 -0
  273. package/dist/src/shared/hooks/useWindowFocused.d.ts.map +1 -0
  274. package/dist/src/shared/hooks/useWindowFocused.js +21 -0
  275. package/dist/src/shared/hooks/useWindowFocused.js.map +1 -0
  276. package/dist/src/shared/index.d.ts +5 -0
  277. package/dist/src/shared/index.d.ts.map +1 -0
  278. package/dist/src/shared/index.js +16 -0
  279. package/dist/src/shared/index.js.map +1 -0
  280. package/dist/src/shared/lib/GenericAuthenticationRefresher.d.ts +20 -0
  281. package/dist/src/shared/lib/GenericAuthenticationRefresher.d.ts.map +1 -0
  282. package/dist/src/shared/lib/GenericAuthenticationRefresher.js +73 -0
  283. package/dist/src/shared/lib/GenericAuthenticationRefresher.js.map +1 -0
  284. package/dist/src/shared/lib/UserSession.d.ts +12 -0
  285. package/dist/src/shared/lib/UserSession.d.ts.map +1 -0
  286. package/dist/src/shared/lib/UserSession.js +20 -0
  287. package/dist/src/shared/lib/UserSession.js.map +1 -0
  288. package/dist/src/shared/lib/session.d.ts +3 -0
  289. package/dist/src/shared/lib/session.d.ts.map +1 -0
  290. package/dist/src/shared/lib/session.js +21 -0
  291. package/dist/src/shared/lib/session.js.map +1 -0
  292. package/dist/src/shared/lib/storage.d.ts +25 -0
  293. package/dist/src/shared/lib/storage.d.ts.map +1 -0
  294. package/dist/src/shared/lib/storage.js +17 -0
  295. package/dist/src/shared/lib/storage.js.map +1 -0
  296. package/dist/src/shared/lib/types.d.ts +36 -0
  297. package/dist/src/shared/lib/types.d.ts.map +1 -0
  298. package/dist/src/shared/lib/types.js +18 -0
  299. package/dist/src/shared/lib/types.js.map +1 -0
  300. package/dist/src/shared/lib/util.d.ts +34 -0
  301. package/dist/src/shared/lib/util.d.ts.map +1 -0
  302. package/dist/src/shared/lib/util.js +137 -0
  303. package/dist/src/shared/lib/util.js.map +1 -0
  304. package/dist/src/shared/providers/AuthContext.d.ts +11 -0
  305. package/dist/src/shared/providers/AuthContext.d.ts.map +1 -0
  306. package/dist/src/shared/providers/AuthContext.js +3 -0
  307. package/dist/src/shared/providers/AuthContext.js.map +1 -0
  308. package/dist/src/shared/providers/AuthProvider.d.ts +22 -0
  309. package/dist/src/shared/providers/AuthProvider.d.ts.map +1 -0
  310. package/dist/src/shared/providers/AuthProvider.js +72 -0
  311. package/dist/src/shared/providers/AuthProvider.js.map +1 -0
  312. package/dist/src/shared/providers/CivicAuthConfigContext.d.ts +18 -0
  313. package/dist/src/shared/providers/CivicAuthConfigContext.d.ts.map +1 -0
  314. package/dist/src/shared/providers/CivicAuthConfigContext.js +52 -0
  315. package/dist/src/shared/providers/CivicAuthConfigContext.js.map +1 -0
  316. package/dist/src/shared/providers/CivicAuthProvider.d.ts +6 -0
  317. package/dist/src/shared/providers/CivicAuthProvider.d.ts.map +1 -0
  318. package/dist/src/shared/providers/CivicAuthProvider.js +32 -0
  319. package/dist/src/shared/providers/CivicAuthProvider.js.map +1 -0
  320. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.d.ts +17 -0
  321. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.d.ts.map +1 -0
  322. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.js +131 -0
  323. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.js.map +1 -0
  324. package/dist/src/shared/providers/IframeProvider.d.ts +22 -0
  325. package/dist/src/shared/providers/IframeProvider.d.ts.map +1 -0
  326. package/dist/src/shared/providers/IframeProvider.js +35 -0
  327. package/dist/src/shared/providers/IframeProvider.js.map +1 -0
  328. package/dist/src/shared/providers/SessionProvider.d.ts +19 -0
  329. package/dist/src/shared/providers/SessionProvider.d.ts.map +1 -0
  330. package/dist/src/shared/providers/SessionProvider.js +23 -0
  331. package/dist/src/shared/providers/SessionProvider.js.map +1 -0
  332. package/dist/src/shared/providers/TokenProvider.d.ts +18 -0
  333. package/dist/src/shared/providers/TokenProvider.d.ts.map +1 -0
  334. package/dist/src/shared/providers/TokenProvider.js +42 -0
  335. package/dist/src/shared/providers/TokenProvider.js.map +1 -0
  336. package/dist/src/shared/providers/UserProvider.d.ts +24 -0
  337. package/dist/src/shared/providers/UserProvider.d.ts.map +1 -0
  338. package/dist/src/shared/providers/UserProvider.js +52 -0
  339. package/dist/src/shared/providers/UserProvider.js.map +1 -0
  340. package/dist/src/shared/providers/types.d.ts +15 -0
  341. package/dist/src/shared/providers/types.d.ts.map +1 -0
  342. package/dist/src/shared/providers/types.js +2 -0
  343. package/dist/src/shared/providers/types.js.map +1 -0
  344. package/dist/src/shared/version.d.ts +2 -0
  345. package/dist/src/shared/version.d.ts.map +1 -0
  346. package/dist/src/shared/version.js +3 -0
  347. package/dist/src/shared/version.js.map +1 -0
  348. package/dist/src/types.d.ts +148 -0
  349. package/dist/src/types.d.ts.map +1 -0
  350. package/dist/src/types.js +4 -0
  351. package/dist/src/types.js.map +1 -0
  352. package/dist/src/utils.d.ts +15 -0
  353. package/dist/src/utils.d.ts.map +1 -0
  354. package/dist/src/utils.js +43 -0
  355. package/dist/src/utils.js.map +1 -0
  356. package/dist/src/version.d.ts +2 -0
  357. package/dist/src/version.d.ts.map +1 -0
  358. package/dist/src/version.js +3 -0
  359. package/dist/src/version.js.map +1 -0
  360. package/dist/test/integration/sdk.test.d.ts +2 -0
  361. package/dist/test/integration/sdk.test.d.ts.map +1 -0
  362. package/dist/test/integration/sdk.test.js +237 -0
  363. package/dist/test/integration/sdk.test.js.map +1 -0
  364. package/dist/test/support/fixtures.d.ts +26 -0
  365. package/dist/test/support/fixtures.d.ts.map +1 -0
  366. package/dist/test/support/fixtures.js +55 -0
  367. package/dist/test/support/fixtures.js.map +1 -0
  368. package/dist/test/support/tokens.json +26 -0
  369. package/dist/test/unit/lib/oauth.test.d.ts +2 -0
  370. package/dist/test/unit/lib/oauth.test.d.ts.map +1 -0
  371. package/dist/test/unit/lib/oauth.test.js +56 -0
  372. package/dist/test/unit/lib/oauth.test.js.map +1 -0
  373. package/dist/test/unit/lib/obj.test.d.ts +2 -0
  374. package/dist/test/unit/lib/obj.test.d.ts.map +1 -0
  375. package/dist/test/unit/lib/obj.test.js +37 -0
  376. package/dist/test/unit/lib/obj.test.js.map +1 -0
  377. package/dist/test/unit/logger.test.d.ts +2 -0
  378. package/dist/test/unit/logger.test.d.ts.map +1 -0
  379. package/dist/test/unit/logger.test.js +141 -0
  380. package/dist/test/unit/logger.test.js.map +1 -0
  381. package/dist/test/unit/nextjs/NextAuthProvider.test.d.ts +2 -0
  382. package/dist/test/unit/nextjs/NextAuthProvider.test.d.ts.map +1 -0
  383. package/dist/test/unit/nextjs/NextAuthProvider.test.js +31 -0
  384. package/dist/test/unit/nextjs/NextAuthProvider.test.js.map +1 -0
  385. package/dist/test/unit/nextjs/config.test.d.ts +2 -0
  386. package/dist/test/unit/nextjs/config.test.d.ts.map +1 -0
  387. package/dist/test/unit/nextjs/config.test.js +203 -0
  388. package/dist/test/unit/nextjs/config.test.js.map +1 -0
  389. package/dist/test/unit/nextjs/getUser.test.d.ts +2 -0
  390. package/dist/test/unit/nextjs/getUser.test.d.ts.map +1 -0
  391. package/dist/test/unit/nextjs/getUser.test.js +22 -0
  392. package/dist/test/unit/nextjs/getUser.test.js.map +1 -0
  393. package/dist/test/unit/nextjs/handler.test.d.ts +2 -0
  394. package/dist/test/unit/nextjs/handler.test.d.ts.map +1 -0
  395. package/dist/test/unit/nextjs/handler.test.js +207 -0
  396. package/dist/test/unit/nextjs/handler.test.js.map +1 -0
  397. package/dist/test/unit/nextjs/middleware.test.d.ts +2 -0
  398. package/dist/test/unit/nextjs/middleware.test.d.ts.map +1 -0
  399. package/dist/test/unit/nextjs/middleware.test.js +113 -0
  400. package/dist/test/unit/nextjs/middleware.test.js.map +1 -0
  401. package/dist/test/unit/nextjs/utils.test.d.ts +2 -0
  402. package/dist/test/unit/nextjs/utils.test.d.ts.map +1 -0
  403. package/dist/test/unit/nextjs/utils.test.js +13 -0
  404. package/dist/test/unit/nextjs/utils.test.js.map +1 -0
  405. package/dist/test/unit/publicApi/apiSnapshot.test.d.ts +2 -0
  406. package/dist/test/unit/publicApi/apiSnapshot.test.d.ts.map +1 -0
  407. package/dist/test/unit/publicApi/apiSnapshot.test.js +10 -0
  408. package/dist/test/unit/publicApi/apiSnapshot.test.js.map +1 -0
  409. package/dist/test/unit/react/components/SignInButton.test.d.ts +2 -0
  410. package/dist/test/unit/react/components/SignInButton.test.d.ts.map +1 -0
  411. package/dist/test/unit/react/components/SignInButton.test.js +31 -0
  412. package/dist/test/unit/react/components/SignInButton.test.js.map +1 -0
  413. package/dist/test/unit/react/components/SignOutButton.test.d.ts +2 -0
  414. package/dist/test/unit/react/components/SignOutButton.test.d.ts.map +1 -0
  415. package/dist/test/unit/react/components/SignOutButton.test.js +30 -0
  416. package/dist/test/unit/react/components/SignOutButton.test.js.map +1 -0
  417. package/dist/test/unit/server/login.test.d.ts +2 -0
  418. package/dist/test/unit/server/login.test.d.ts.map +1 -0
  419. package/dist/test/unit/server/login.test.js +184 -0
  420. package/dist/test/unit/server/login.test.js.map +1 -0
  421. package/dist/test/unit/server/refresh.test.d.ts +2 -0
  422. package/dist/test/unit/server/refresh.test.d.ts.map +1 -0
  423. package/dist/test/unit/server/refresh.test.js +55 -0
  424. package/dist/test/unit/server/refresh.test.js.map +1 -0
  425. package/dist/test/unit/server/session.test.d.ts +2 -0
  426. package/dist/test/unit/server/session.test.d.ts.map +1 -0
  427. package/dist/test/unit/server/session.test.js +41 -0
  428. package/dist/test/unit/server/session.test.js.map +1 -0
  429. package/dist/test/unit/services/AuthenticationService.test.d.ts +2 -0
  430. package/dist/test/unit/services/AuthenticationService.test.d.ts.map +1 -0
  431. package/dist/test/unit/services/AuthenticationService.test.js +301 -0
  432. package/dist/test/unit/services/AuthenticationService.test.js.map +1 -0
  433. package/dist/test/unit/services/ServerAuthenticationResolver.test.d.ts +2 -0
  434. package/dist/test/unit/services/ServerAuthenticationResolver.test.d.ts.map +1 -0
  435. package/dist/test/unit/services/ServerAuthenticationResolver.test.js +75 -0
  436. package/dist/test/unit/services/ServerAuthenticationResolver.test.js.map +1 -0
  437. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.d.ts +2 -0
  438. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.d.ts.map +1 -0
  439. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.js +144 -0
  440. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.js.map +1 -0
  441. package/dist/test/unit/shared/UserSession.test.d.ts +2 -0
  442. package/dist/test/unit/shared/UserSession.test.d.ts.map +1 -0
  443. package/dist/test/unit/shared/UserSession.test.js +37 -0
  444. package/dist/test/unit/shared/UserSession.test.js.map +1 -0
  445. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.d.ts +2 -0
  446. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.d.ts.map +1 -0
  447. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.js +122 -0
  448. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.js.map +1 -0
  449. package/dist/test/unit/shared/printVersion.test.d.ts +2 -0
  450. package/dist/test/unit/shared/printVersion.test.d.ts.map +1 -0
  451. package/dist/test/unit/shared/printVersion.test.js +39 -0
  452. package/dist/test/unit/shared/printVersion.test.js.map +1 -0
  453. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.d.ts +2 -0
  454. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.d.ts.map +1 -0
  455. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.js +108 -0
  456. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.js.map +1 -0
  457. package/dist/test/unit/shared/storage.test.d.ts +2 -0
  458. package/dist/test/unit/shared/storage.test.d.ts.map +1 -0
  459. package/dist/test/unit/shared/storage.test.js +53 -0
  460. package/dist/test/unit/shared/storage.test.js.map +1 -0
  461. package/dist/test/unit/utils.test.d.ts +2 -0
  462. package/dist/test/unit/utils.test.d.ts.map +1 -0
  463. package/dist/test/unit/utils.test.js +40 -0
  464. package/dist/test/unit/utils.test.js.map +1 -0
  465. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  466. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  467. package/dist/tsconfig.tsbuildinfo +1 -0
  468. package/dist/vitest.config.d.ts +3 -0
  469. package/dist/vitest.config.d.ts.map +1 -0
  470. package/dist/vitest.config.js +44 -0
  471. package/dist/vitest.config.js.map +1 -0
  472. package/package.json +19 -18
  473. package/dist/cjs/reactjs/hooks/useSignIn.d.ts +0 -6
  474. package/dist/cjs/reactjs/hooks/useSignIn.d.ts.map +0 -1
  475. package/dist/cjs/reactjs/hooks/useSignIn.js +0 -38
  476. package/dist/cjs/reactjs/hooks/useSignIn.js.map +0 -1
  477. package/dist/cjs/services/UserinfoService.d.ts +0 -5
  478. package/dist/cjs/services/UserinfoService.d.ts.map +0 -1
  479. package/dist/cjs/services/UserinfoService.js +0 -15
  480. package/dist/cjs/services/UserinfoService.js.map +0 -1
  481. package/dist/esm/reactjs/hooks/useSignIn.d.ts +0 -6
  482. package/dist/esm/reactjs/hooks/useSignIn.d.ts.map +0 -1
  483. package/dist/esm/reactjs/hooks/useSignIn.js +0 -34
  484. package/dist/esm/reactjs/hooks/useSignIn.js.map +0 -1
@@ -0,0 +1,148 @@
1
+ import type { TokenResponseBody } from "oslo/oauth2";
2
+ import type { JWT } from "oslo/jwt";
3
+ type UnknownObject = Record<string, unknown>;
4
+ type EmptyObject = Record<string, never>;
5
+ type DisplayMode = "iframe" | "redirect" | "new_tab" | "custom_tab";
6
+ interface AuthSessionService {
7
+ loadAuthorizationUrl(authorizationURL: string, displayMode: DisplayMode): void;
8
+ getAuthorizationUrl(scopes: string[], overrideDisplayMode: DisplayMode, nonce?: string): Promise<string>;
9
+ signIn(displayMode: DisplayMode, scopes: string[], nonce?: string): Promise<void>;
10
+ tokenExchange(responseUrl: string): Promise<SessionData>;
11
+ getSessionData(): SessionData;
12
+ updateSessionData(data: SessionData): void;
13
+ getUserInfoService(): Promise<UserInfoService>;
14
+ }
15
+ interface TokenService {
16
+ exchangeCodeForTokens(authCode: string): Promise<Tokens>;
17
+ validateIdToken(idToken: string, nonce: string): boolean;
18
+ refreshAccessToken(refreshToken: string): Promise<Tokens>;
19
+ }
20
+ interface UserInfoService {
21
+ getUserInfo<T extends UnknownObject>(accessToken: string, idToken: string | null): Promise<User<T> | null>;
22
+ }
23
+ interface ResourceService {
24
+ getProtectedResource(accessToken: string): Promise<unknown>;
25
+ }
26
+ type AuthRequest = {
27
+ clientId: string;
28
+ redirectUri: string;
29
+ state: string;
30
+ nonce: string;
31
+ scope: string;
32
+ };
33
+ type Endpoints = {
34
+ jwks: string;
35
+ auth: string;
36
+ token: string;
37
+ userinfo: string;
38
+ challenge?: string;
39
+ endsession: string;
40
+ };
41
+ type Config = {
42
+ oauthServer: string;
43
+ endpoints?: Endpoints;
44
+ };
45
+ type SessionData = {
46
+ authenticated: boolean;
47
+ state?: string;
48
+ accessToken?: string;
49
+ refreshToken?: string;
50
+ idToken?: string;
51
+ timestamp?: number;
52
+ expiresIn?: number;
53
+ codeVerifier?: string;
54
+ displayMode?: DisplayMode;
55
+ openerUrl?: string;
56
+ };
57
+ type OIDCTokenResponseBody = TokenResponseBody & {
58
+ id_token: string;
59
+ timestamp?: number;
60
+ };
61
+ type ParsedTokens = {
62
+ id_token: JWTPayload;
63
+ access_token: JWTPayload;
64
+ refresh_token?: string;
65
+ };
66
+ type ForwardedTokens = Record<string, {
67
+ idToken?: string;
68
+ accessToken?: string;
69
+ refreshToken?: string;
70
+ }>;
71
+ type ForwardedTokensJWT = Record<string, {
72
+ id_token?: string;
73
+ access_token?: string;
74
+ refresh_token?: string;
75
+ scope?: string;
76
+ }>;
77
+ type JWTPayload = JWT["payload"] & {
78
+ iss: string;
79
+ aud: string;
80
+ sub: string;
81
+ iat: number;
82
+ exp: number;
83
+ };
84
+ type IdTokenPayload = JWTPayload & {
85
+ forwardedTokens?: ForwardedTokensJWT;
86
+ email?: string;
87
+ name?: string;
88
+ picture?: string;
89
+ nonce: string;
90
+ at_hash: string;
91
+ };
92
+ type IdToken = Omit<JWT, "payload"> & {
93
+ payload: IdTokenPayload;
94
+ };
95
+ declare const tokenKeys: string[];
96
+ type Tokens = {
97
+ [K in (typeof tokenKeys)[number]]: K extends "forwardedTokens" ? ForwardedTokens : string;
98
+ };
99
+ type BaseUser = {
100
+ id: string;
101
+ email?: string;
102
+ name?: string;
103
+ given_name?: string;
104
+ family_name?: string;
105
+ picture?: string;
106
+ updated_at?: Date;
107
+ };
108
+ type User<T extends UnknownObject = EmptyObject> = BaseUser & T;
109
+ type OpenIdConfiguration = {
110
+ authorization_endpoint: string;
111
+ claims_parameter_supported: boolean;
112
+ claims_supported: string[];
113
+ code_challenge_methods_supported: string[];
114
+ end_session_endpoint: string;
115
+ grant_types_supported: string[];
116
+ issuer: string;
117
+ jwks_uri: string;
118
+ authorization_response_iss_parameter_supported: boolean;
119
+ response_modes_supported: string[];
120
+ response_types_supported: string[];
121
+ scopes_supported: string[];
122
+ subject_types_supported: string[];
123
+ token_endpoint_auth_methods_supported: string[];
124
+ token_endpoint_auth_signing_alg_values_supported: string[];
125
+ token_endpoint: string;
126
+ id_token_signing_alg_values_supported: string[];
127
+ pushed_authorization_request_endpoint: string;
128
+ request_parameter_supported: boolean;
129
+ request_uri_parameter_supported: boolean;
130
+ userinfo_endpoint: string;
131
+ claim_types_supported: string[];
132
+ };
133
+ type LoginPostMessage = {
134
+ source: string;
135
+ type: string;
136
+ clientId: string;
137
+ data: {
138
+ url: string;
139
+ };
140
+ };
141
+ export type { LoginPostMessage, AuthSessionService, TokenService, UserInfoService, ResourceService, AuthRequest, Tokens, Endpoints, Config, SessionData, OIDCTokenResponseBody, ParsedTokens, BaseUser, User, DisplayMode, UnknownObject, EmptyObject, ForwardedTokens, ForwardedTokensJWT, JWTPayload, IdTokenPayload, IdToken, OpenIdConfiguration, };
142
+ export { tokenKeys };
143
+ export interface AuthStorage {
144
+ get(key: string): Promise<string | null>;
145
+ set(key: string, value: string): Promise<void>;
146
+ }
147
+ export type IframeMode = "embedded" | "modal";
148
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7C,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAGzC,KAAK,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAGpE,UAAU,kBAAkB;IAE1B,oBAAoB,CAClB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,WAAW,GACvB,IAAI,CAAC;IAER,mBAAmB,CACjB,MAAM,EAAE,MAAM,EAAE,EAChB,mBAAmB,EAAE,WAAW,EAChC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,MAAM,CACJ,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzD,cAAc,IAAI,WAAW,CAAC;IAE9B,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CAChD;AAGD,UAAU,YAAY;IACpB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACzD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAGD,UAAU,eAAe;IACvB,WAAW,CAAC,CAAC,SAAS,aAAa,EACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAC5B;AAGD,UAAU,eAAe;IACvB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAGD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,qBAAqB,GAAG,iBAAiB,GAAG;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,UAAU,CAAC;IACrB,YAAY,EAAE,UAAU,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAGF,KAAK,eAAe,GAAG,MAAM,CAC3B,MAAM,EACN;IACE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CACF,CAAC;AAGF,KAAK,kBAAkB,GAAG,MAAM,CAC9B,MAAM,EACN;IACE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CACF,CAAC;AAEF,KAAK,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,KAAK,cAAc,GAAG,UAAU,GAAG;IACjC,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG;IACpC,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAGF,QAAA,MAAM,SAAS,UAAgE,CAAC;AAGhF,KAAK,MAAM,GAAG;KACX,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,iBAAiB,GAC1D,eAAe,GACf,MAAM;CACX,CAAC;AAGF,KAAK,QAAQ,GAAG;IACd,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB,CAAC;AAEF,KAAK,IAAI,CAAC,CAAC,SAAS,aAAa,GAAG,WAAW,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEhE,KAAK,mBAAmB,GAAG;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,0BAA0B,EAAE,OAAO,CAAC;IACpC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gCAAgC,EAAE,MAAM,EAAE,CAAC;IAC3C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C,EAAE,OAAO,CAAC;IACxD,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,qCAAqC,EAAE,MAAM,EAAE,CAAC;IAChD,gDAAgD,EAAE,MAAM,EAAE,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC,EAAE,MAAM,EAAE,CAAC;IAChD,qCAAqC,EAAE,MAAM,CAAC;IAC9C,2BAA2B,EAAE,OAAO,CAAC;IACrC,+BAA+B,EAAE,OAAO,CAAC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH,CAAC;AACF,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,OAAO,EACP,mBAAmB,GACpB,CAAC;AACF,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC"}
@@ -0,0 +1,4 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ const tokenKeys = ["idToken", "accessToken", "refreshToken", "forwardedTokens"];
3
+ export { tokenKeys };
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAkJA,6DAA6D;AAC7D,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAgFhF,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { TokenResponseBody } from \"oslo/oauth2\";\nimport type { JWT } from \"oslo/jwt\";\n\ntype UnknownObject = Record<string, unknown>;\ntype EmptyObject = Record<string, never>;\n\n// Display modes for the auth flow\ntype DisplayMode = \"iframe\" | \"redirect\" | \"new_tab\" | \"custom_tab\";\n\n// Combined Auth and Session Service\ninterface AuthSessionService {\n // TODO DK NOTES: Should be in BrowserAuthSessionService, not relevant on backend\n loadAuthorizationUrl(\n authorizationURL: string,\n displayMode: DisplayMode,\n ): void;\n // TODO DK NOTES: overrideDisplayMode parameter not appropriate here - also - do we need both this and the above in the interface?\n getAuthorizationUrl(\n scopes: string[],\n overrideDisplayMode: DisplayMode,\n nonce?: string,\n ): Promise<string>;\n // TODO DK NOTES: display mode should be in browser version only. Also, do we need this and the above two in the top-level interface?\n signIn(\n displayMode: DisplayMode,\n scopes: string[],\n nonce?: string,\n ): Promise<void>;\n // TODO DK NOTES: Input should be an auth code - do not assume it comes via an url\n tokenExchange(responseUrl: string): Promise<SessionData>;\n // TODO DK NOTES: Should be async for flexibility\n getSessionData(): SessionData;\n // TODO DK NOTES: Should be async for flexibility\n updateSessionData(data: SessionData): void;\n getUserInfoService(): Promise<UserInfoService>;\n}\n\n// Token Service\ninterface TokenService {\n exchangeCodeForTokens(authCode: string): Promise<Tokens>;\n validateIdToken(idToken: string, nonce: string): boolean;\n refreshAccessToken(refreshToken: string): Promise<Tokens>;\n}\n\n// User Info Service\ninterface UserInfoService {\n getUserInfo<T extends UnknownObject>(\n accessToken: string,\n idToken: string | null,\n ): Promise<User<T> | null>;\n}\n\n// Resource Service\ninterface ResourceService {\n getProtectedResource(accessToken: string): Promise<unknown>;\n}\n\n// Auth Request (for internal use in AuthSessionService)\ntype AuthRequest = {\n clientId: string;\n redirectUri: string;\n state: string;\n nonce: string;\n scope: string;\n};\n\ntype Endpoints = {\n jwks: string;\n auth: string;\n token: string;\n userinfo: string;\n challenge?: string;\n endsession: string;\n};\n\ntype Config = {\n oauthServer: string;\n endpoints?: Endpoints;\n};\n\ntype SessionData = {\n authenticated: boolean; // TODO can this be inferred from the presence of the tokens?\n state?: string;\n accessToken?: string;\n refreshToken?: string;\n idToken?: string;\n timestamp?: number;\n expiresIn?: number;\n codeVerifier?: string;\n displayMode?: DisplayMode;\n openerUrl?: string;\n};\n\ntype OIDCTokenResponseBody = TokenResponseBody & {\n id_token: string;\n timestamp?: number;\n};\n\ntype ParsedTokens = {\n id_token: JWTPayload;\n access_token: JWTPayload;\n refresh_token?: string;\n};\n\n// The format we expose to the frontend via hooks\ntype ForwardedTokens = Record<\n string,\n {\n idToken?: string;\n accessToken?: string;\n refreshToken?: string;\n }\n>;\n\n// The format in the JWT payload\ntype ForwardedTokensJWT = Record<\n string,\n {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n scope?: string;\n }\n>;\n\ntype JWTPayload = JWT[\"payload\"] & {\n iss: string;\n aud: string;\n sub: string;\n iat: number;\n exp: number;\n};\n\ntype IdTokenPayload = JWTPayload & {\n forwardedTokens?: ForwardedTokensJWT;\n email?: string;\n name?: string;\n picture?: string;\n nonce: string;\n at_hash: string;\n};\n\ntype IdToken = Omit<JWT, \"payload\"> & {\n payload: IdTokenPayload;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst tokenKeys = [\"idToken\", \"accessToken\", \"refreshToken\", \"forwardedTokens\"];\n\n// Derive the Tokens type from the array\ntype Tokens = {\n [K in (typeof tokenKeys)[number]]: K extends \"forwardedTokens\"\n ? ForwardedTokens\n : string;\n};\n\n// Base user interface\ntype BaseUser = {\n id: string;\n email?: string;\n name?: string;\n given_name?: string;\n family_name?: string;\n picture?: string;\n updated_at?: Date;\n};\n\ntype User<T extends UnknownObject = EmptyObject> = BaseUser & T;\n\ntype OpenIdConfiguration = {\n authorization_endpoint: string;\n claims_parameter_supported: boolean;\n claims_supported: string[];\n code_challenge_methods_supported: string[];\n end_session_endpoint: string;\n grant_types_supported: string[];\n issuer: string;\n jwks_uri: string;\n authorization_response_iss_parameter_supported: boolean;\n response_modes_supported: string[];\n response_types_supported: string[];\n scopes_supported: string[];\n subject_types_supported: string[];\n token_endpoint_auth_methods_supported: string[];\n token_endpoint_auth_signing_alg_values_supported: string[];\n token_endpoint: string;\n id_token_signing_alg_values_supported: string[];\n pushed_authorization_request_endpoint: string;\n request_parameter_supported: boolean;\n request_uri_parameter_supported: boolean;\n userinfo_endpoint: string;\n claim_types_supported: string[];\n};\n\ntype LoginPostMessage = {\n source: string;\n type: string;\n clientId: string;\n data: {\n url: string;\n };\n};\nexport type {\n LoginPostMessage,\n AuthSessionService,\n TokenService,\n UserInfoService,\n ResourceService,\n AuthRequest,\n Tokens,\n Endpoints,\n Config,\n SessionData,\n OIDCTokenResponseBody,\n ParsedTokens,\n BaseUser,\n User,\n DisplayMode,\n UnknownObject,\n EmptyObject,\n ForwardedTokens,\n ForwardedTokensJWT,\n JWTPayload,\n IdTokenPayload,\n IdToken,\n OpenIdConfiguration,\n};\nexport { tokenKeys };\nexport interface AuthStorage {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n}\n\nexport type IframeMode = \"embedded\" | \"modal\";\n"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Checks if a popup window is blocked by the browser.
3
+ *
4
+ * This function attempts to open a small popup window and then checks if it was successfully created.
5
+ * If the popup is blocked by the browser, the function returns `true`. Otherwise, it returns `false`.
6
+ *
7
+ * @returns {boolean} - `true` if the popup is blocked, `false` otherwise.
8
+ */
9
+ declare const isPopupBlocked: () => boolean;
10
+ type WithoutUndefined<T> = {
11
+ [K in keyof T as undefined extends T[K] ? never : K]: T[K];
12
+ };
13
+ export declare const withoutUndefined: <T extends { [K in keyof T]: unknown; }>(obj: T) => WithoutUndefined<T>;
14
+ export { isPopupBlocked };
15
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,QAAA,MAAM,cAAc,QAAO,OAsB1B,CAAC;AAOF,KAAK,gBAAgB,CAAC,CAAC,IAAI;KACxB,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC3D,CAAC;AACF,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,GAAE,OAC/D,CAAC,KACL,gBAAgB,CAAC,CAAC,CAapB,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Checks if a popup window is blocked by the browser.
3
+ *
4
+ * This function attempts to open a small popup window and then checks if it was successfully created.
5
+ * If the popup is blocked by the browser, the function returns `true`. Otherwise, it returns `false`.
6
+ *
7
+ * @returns {boolean} - `true` if the popup is blocked, `false` otherwise.
8
+ */
9
+ const isPopupBlocked = () => {
10
+ // First we try to open a small popup window. It either returns a window object or null.
11
+ const popup = window.open("", "", "width=1,height=1");
12
+ // If window.open() returns null, popup is definitely blocked
13
+ if (!popup) {
14
+ return true;
15
+ }
16
+ try {
17
+ // Try to access a property of the popup to check if it's usable
18
+ if (typeof popup.closed === "undefined") {
19
+ throw new Error("Popup is blocked");
20
+ }
21
+ }
22
+ catch {
23
+ // Accessing the popup's properties throws an error if the popup is blocked
24
+ return true;
25
+ }
26
+ // Close the popup immediately if it was opened
27
+ popup.close();
28
+ return false;
29
+ };
30
+ export const withoutUndefined = (obj) => {
31
+ const result = {};
32
+ for (const key in obj) {
33
+ if (obj[key] !== undefined) {
34
+ // TypeScript needs assurance that key is a valid key in WithoutUndefined<T>
35
+ // We use type assertion here
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ result[key] = obj[key];
38
+ }
39
+ }
40
+ return result;
41
+ };
42
+ export { isPopupBlocked };
43
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,cAAc,GAAG,GAAY,EAAE;IACnC,wFAAwF;IACxF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAEtD,6DAA6D;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,gEAAgE;QAChE,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAUF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAM,EACe,EAAE;IACvB,MAAM,MAAM,GAAG,EAAyB,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,4EAA4E;YAC5E,6BAA6B;YAC7B,8DAA8D;YAC7D,MAAc,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["/**\n * Checks if a popup window is blocked by the browser.\n *\n * This function attempts to open a small popup window and then checks if it was successfully created.\n * If the popup is blocked by the browser, the function returns `true`. Otherwise, it returns `false`.\n *\n * @returns {boolean} - `true` if the popup is blocked, `false` otherwise.\n */\nconst isPopupBlocked = (): boolean => {\n // First we try to open a small popup window. It either returns a window object or null.\n const popup = window.open(\"\", \"\", \"width=1,height=1\");\n\n // If window.open() returns null, popup is definitely blocked\n if (!popup) {\n return true;\n }\n\n try {\n // Try to access a property of the popup to check if it's usable\n if (typeof popup.closed === \"undefined\") {\n throw new Error(\"Popup is blocked\");\n }\n } catch {\n // Accessing the popup's properties throws an error if the popup is blocked\n return true;\n }\n\n // Close the popup immediately if it was opened\n popup.close();\n return false;\n};\n\n// This type narrows T as far as it can by:\n// - removing all keys where the value is `undefined`\n// - making keys that are not undefined required\n// So, for example: given { a: string | undefined, b: string | undefined },\n// if you pass in { a: \"foo\" }, it returns an object of type: { a: string }\ntype WithoutUndefined<T> = {\n [K in keyof T as undefined extends T[K] ? never : K]: T[K];\n};\nexport const withoutUndefined = <T extends { [K in keyof T]: unknown }>(\n obj: T,\n): WithoutUndefined<T> => {\n const result = {} as WithoutUndefined<T>;\n\n for (const key in obj) {\n if (obj[key] !== undefined) {\n // TypeScript needs assurance that key is a valid key in WithoutUndefined<T>\n // We use type assertion here\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (result as any)[key] = obj[key];\n }\n }\n\n return result;\n};\n\nexport { isPopupBlocked };\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION = "@civic/auth:0.1.4-beta.5";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,6BAA6B,CAAC"}
@@ -0,0 +1,3 @@
1
+ // This is an auto-generated file. Do not edit.
2
+ export const VERSION = "@civic/auth:0.1.4-beta.5";
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAE/C,MAAM,CAAC,MAAM,OAAO,GAAG,0BAA0B,CAAC","sourcesContent":["// This is an auto-generated file. Do not edit.\n\nexport const VERSION = \"@civic/auth:0.1.4-beta.5\";\n"]}
@@ -0,0 +1,2 @@
1
+ import "@testing-library/jest-dom";
2
+ //# sourceMappingURL=sdk.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.test.d.ts","sourceRoot":"","sources":["../../../test/integration/sdk.test.tsx"],"names":[],"mappings":"AAoBA,OAAO,2BAA2B,CAAC"}
@@ -0,0 +1,237 @@
1
+ import React from "react";
2
+ import { OAuth2Client } from "oslo/oauth2";
3
+ import { useAuth, useUser } from "@/reactjs/hooks/index.js";
4
+ import { CivicAuthProvider } from "@/reactjs/providers/index.js";
5
+ import { render, screen, act, fireEvent, waitFor, } from "@testing-library/react";
6
+ import { describe, it, expect, beforeEach, vi, afterEach, } from "vitest";
7
+ import "@testing-library/jest-dom";
8
+ import * as jose from "jose";
9
+ import tokensFixture from "../support/tokens.json" assert { type: "json" };
10
+ import * as oauthLib from "@/lib/oauth.js";
11
+ import { CodeVerifier } from "@/shared/lib/types.js";
12
+ const validTokens = { ...tokensFixture.local.validTokens };
13
+ // Mock Component to test OAuth flow with useAuth
14
+ const MockOAuthComponent = () => {
15
+ const { signIn, isAuthenticated, signOut } = useAuth();
16
+ const { user } = useUser();
17
+ const handleLogin = async () => {
18
+ try {
19
+ await signIn();
20
+ alert("Login Redirect Initiated");
21
+ }
22
+ catch {
23
+ alert("Login Failed");
24
+ }
25
+ };
26
+ const handleLogout = async () => {
27
+ await signOut();
28
+ alert("Logout Initiated");
29
+ };
30
+ return (React.createElement("div", null,
31
+ React.createElement("button", { onClick: handleLogin }, "Login"),
32
+ React.createElement("button", { onClick: handleLogout }, "Logout"),
33
+ user && (React.createElement("p", { "data-testid": "user-email" },
34
+ "User:",
35
+ user.email)),
36
+ isAuthenticated && (React.createElement("p", { "data-testid": "session" }, "Session authenticated:true"))));
37
+ };
38
+ describe("OAuth login", () => {
39
+ const clientId = "test-client-id";
40
+ let mockOAuth2Client;
41
+ let originalWindowLocation;
42
+ afterEach(vi.clearAllMocks);
43
+ const getOauthEndpointsMock = vi.spyOn(oauthLib, "getOauthEndpoints").mockResolvedValue({
44
+ auth: "http://localhost:3001/oauth/auth",
45
+ token: "http://localhost:3001/oauth/token",
46
+ jwks: "http://localhost:3001/oauth/jwks",
47
+ userinfo: "http://localhost:3001/oauth/userinfo",
48
+ endsession: "http://localhost:3001/oauth/endsession",
49
+ });
50
+ vi.mock("oslo/oauth2", () => ({
51
+ OAuth2Client: vi.fn(),
52
+ generateCodeVerifier: vi.fn(() => "mock-code-verifier"),
53
+ generateState: vi.fn(() => "mock-state"),
54
+ }));
55
+ vi.mock("jose", () => ({
56
+ jwtVerify: vi.fn(),
57
+ createRemoteJWKSet: vi.fn(),
58
+ }));
59
+ beforeEach(() => {
60
+ vi.clearAllMocks();
61
+ vi.resetModules();
62
+ // Setup mock implementations
63
+ mockOAuth2Client = {
64
+ createAuthorizationURL: vi.fn(),
65
+ validateAuthorizationCode: vi.fn(),
66
+ refreshAccessToken: vi.fn(),
67
+ clientId: "test-client-id",
68
+ };
69
+ vi.mocked(OAuth2Client).mockImplementation(() => mockOAuth2Client);
70
+ // Setup jose mocks
71
+ const mockJWKS = {
72
+ getKey: vi.fn().mockResolvedValue({ alg: "RS256" }),
73
+ };
74
+ vi.mocked(jose.createRemoteJWKSet).mockReturnValue(mockJWKS);
75
+ vi.mocked(jose.jwtVerify).mockResolvedValue({
76
+ payload: { sub: "user123", name: "Test User", email: "test@example.com" },
77
+ protectedHeader: { alg: "RS256" },
78
+ });
79
+ originalWindowLocation = window.location;
80
+ window.location = { href: "" };
81
+ global.alert = vi.fn();
82
+ // Mock window.open to prevent errors.
83
+ vi.spyOn(window, "open").mockReturnValue(null);
84
+ });
85
+ afterEach(() => {
86
+ window.location = originalWindowLocation;
87
+ });
88
+ it("should set the correct auth url for login with redirect", async () => {
89
+ const windowAssign = vi.fn();
90
+ const redirectUri = "http://localhost:3001/callback";
91
+ vi.mocked(mockOAuth2Client.createAuthorizationURL).mockResolvedValue(new URL("http://localhost:3001/oauth/auth?response_type=code&client_id=" +
92
+ clientId +
93
+ "&redirect_uri=" +
94
+ encodeURIComponent(redirectUri) +
95
+ "&scope=openid%20profile%20email&state=mock-state&code_challenge=mock-code-challenge&code_challenge_method=S256"));
96
+ window.location = {
97
+ ...originalWindowLocation,
98
+ assign: windowAssign,
99
+ replace: vi.fn(),
100
+ reload: vi.fn(),
101
+ };
102
+ act(() => {
103
+ render(React.createElement(CivicAuthProvider, { displayMode: "redirect", clientId: clientId, redirectUrl: redirectUri, config: {
104
+ oauthServer: "http://localhost:3001",
105
+ } },
106
+ React.createElement(MockOAuthComponent, null)));
107
+ });
108
+ await waitFor(() => {
109
+ expect(getOauthEndpointsMock).toHaveBeenCalledWith("http://localhost:3001");
110
+ });
111
+ // Trigger the login button click, which initiates the OAuth flow
112
+ await act(async () => {
113
+ fireEvent.click(screen.getByText("Login"));
114
+ });
115
+ await waitFor(() => {
116
+ // Confirm that the sdk set the window.location.href to the auth url
117
+ const url = new URL(window.location.href);
118
+ expect(url.origin + url.pathname).toEqual("http://localhost:3001/oauth/auth");
119
+ expect(url.searchParams.get("response_type")).toEqual("code");
120
+ expect(url.searchParams.get("client_id")).toEqual(clientId);
121
+ expect(url.searchParams.get("redirect_uri")).toEqual(redirectUri);
122
+ expect(url.searchParams.get("scope")).toEqual("openid profile email");
123
+ expect(url.searchParams.get("state")).toBeTruthy(); // Ensure state is present
124
+ expect(url.searchParams.get("code_challenge")).toBeTruthy(); // Ensure code_challenge is present
125
+ expect(url.searchParams.get("code_challenge_method")).toEqual("S256");
126
+ expect(screen.queryByTestId("session")).not.toBeInTheDocument();
127
+ });
128
+ });
129
+ it("should initiate code exchange, validate tokens, and derive user from ID token", async () => {
130
+ const redirectUri = "http://localhost:3001/callback";
131
+ // Mock ID token with user information
132
+ const mockIdToken = validTokens.idToken;
133
+ const mockAccessToken = validTokens.accessToken;
134
+ // Mock oslo token exchange
135
+ const mockTokens = {
136
+ access_token: mockAccessToken,
137
+ id_token: mockIdToken,
138
+ refresh_token: "mock-refresh-token",
139
+ expires_in: 3600,
140
+ };
141
+ vi.mocked(mockOAuth2Client.validateAuthorizationCode).mockResolvedValue(mockTokens);
142
+ // Prime storage and simulate redirect
143
+ await act(async () => {
144
+ localStorage.setItem(CodeVerifier.COOKIE_NAME, "mock-code-verifier");
145
+ window.location.pathname = "test-pathName";
146
+ // Configure window.location to simulate redirect
147
+ Object.defineProperty(window, "location", {
148
+ value: {
149
+ ...window.location,
150
+ origin: "http://mock-origin",
151
+ },
152
+ writable: true,
153
+ });
154
+ window.location.href = `${redirectUri}?code=test-code&state=mock-state`;
155
+ // Render the AuthProvider with the mock OAuth component
156
+ render(React.createElement(CivicAuthProvider, { clientId: clientId, redirectUrl: redirectUri, config: {
157
+ oauthServer: "http://localhost:3001",
158
+ } },
159
+ React.createElement(MockOAuthComponent, null)));
160
+ });
161
+ await waitFor(() => {
162
+ expect(getOauthEndpointsMock).toHaveBeenCalledWith("http://localhost:3001");
163
+ });
164
+ await waitFor(() => {
165
+ expect(mockOAuth2Client.validateAuthorizationCode).toHaveBeenCalledWith("test-code", {
166
+ codeVerifier: "mock-code-verifier",
167
+ });
168
+ });
169
+ // Check that jose.jwtVerify was called for id_token validation
170
+ await waitFor(() => {
171
+ expect(jose.jwtVerify).toHaveBeenCalledWith(mockIdToken, expect.any(Object), {
172
+ issuer: ["http://localhost:3001", "http://localhost:3001/"],
173
+ audience: clientId,
174
+ });
175
+ });
176
+ // Check that jose.jwtVerify was called for access_token validation
177
+ await waitFor(() => {
178
+ expect(jose.jwtVerify).toHaveBeenCalledWith(mockAccessToken, expect.any(Object), {
179
+ issuer: ["http://localhost:3001", "http://localhost:3001/"],
180
+ });
181
+ });
182
+ // Check that the authenticated flag is set in the session
183
+ await waitFor(() => {
184
+ expect(screen.queryByTestId("session")).toHaveTextContent("Session authenticated:true");
185
+ });
186
+ // Check that the user info derived from the ID token is displayed
187
+ await waitFor(() => {
188
+ expect(screen.queryByTestId("user-email")).toHaveTextContent("User:ghost@civic.com");
189
+ });
190
+ });
191
+ it("should handle signout flow correctly", async () => {
192
+ const windowAssign = vi.fn();
193
+ const redirectUri = "http://localhost:3000/";
194
+ // Mock successful authentication first
195
+ vi.mocked(mockOAuth2Client.validateAuthorizationCode).mockResolvedValue({
196
+ access_token: validTokens.accessToken,
197
+ refresh_token: "mock-refresh-token",
198
+ expires_in: 3600,
199
+ });
200
+ window.location = {
201
+ ...originalWindowLocation,
202
+ assign: windowAssign,
203
+ replace: vi.fn(),
204
+ reload: vi.fn(),
205
+ };
206
+ render(React.createElement(CivicAuthProvider, { displayMode: "redirect", clientId: clientId, redirectUrl: redirectUri, config: {
207
+ oauthServer: "http://localhost:3001",
208
+ } },
209
+ React.createElement(MockOAuthComponent, null)));
210
+ // Simulate successful login
211
+ await act(async () => {
212
+ localStorage.setItem(CodeVerifier.COOKIE_NAME, "mock-code-verifier");
213
+ window.location.href = `${redirectUri}?code=test-code&state=mock-state`;
214
+ });
215
+ // Wait for authentication to complete
216
+ await waitFor(() => {
217
+ expect(screen.queryByTestId("session")).toHaveTextContent("Session authenticated:true");
218
+ });
219
+ // Now test the signout
220
+ const signOutUrl = new URL("http://localhost:3001/oauth/endsession");
221
+ signOutUrl.searchParams.append("client_id", clientId);
222
+ signOutUrl.searchParams.append("id_token_hint", validTokens.idToken);
223
+ signOutUrl.searchParams.append("post_logout_redirect_uri", redirectUri);
224
+ await act(async () => {
225
+ fireEvent.click(screen.getByText("Logout"));
226
+ await new Promise(resolve => setTimeout(resolve, 0));
227
+ });
228
+ await waitFor(() => {
229
+ const url = new URL(window.location.href);
230
+ expect(url.origin + url.pathname).toEqual("http://localhost:3001/oauth/endsession");
231
+ expect(url.searchParams.get("client_id")).toEqual(clientId);
232
+ expect(url.searchParams.get("id_token_hint")).toEqual(validTokens.idToken);
233
+ expect(url.searchParams.get("post_logout_redirect_uri")).toEqual(redirectUri);
234
+ });
235
+ });
236
+ });
237
+ //# sourceMappingURL=sdk.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.test.js","sourceRoot":"","sources":["../../../test/integration/sdk.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { OAuth2Client } from \"oslo/oauth2\";\nimport { useAuth, useUser } from \"@/reactjs/hooks/index.js\";\nimport { CivicAuthProvider } from \"@/reactjs/providers/index.js\";\nimport {\n render,\n screen,\n act,\n fireEvent,\n waitFor,\n} from \"@testing-library/react\";\nimport {\n describe,\n it,\n expect,\n beforeEach,\n vi,\n afterEach,\n type MockInstance,\n} from \"vitest\";\nimport \"@testing-library/jest-dom\";\nimport * as jose from \"jose\";\nimport tokensFixture from \"../support/tokens.json\" assert { type: \"json\" };\nimport * as oauthLib from \"@/lib/oauth.js\";\nimport type { JWTVerifyResult, ResolvedKey } from \"jose\";\nimport type { Endpoints } from \"@/types.js\";\nimport { CodeVerifier } from \"@/shared/lib/types.js\";\n\nconst validTokens = { ...tokensFixture.local.validTokens };\n// Mock Component to test OAuth flow with useAuth\nconst MockOAuthComponent = () => {\n const { signIn, isAuthenticated, signOut } = useAuth();\n const { user } = useUser();\n\n const handleLogin = async () => {\n try {\n await signIn();\n alert(\"Login Redirect Initiated\");\n } catch {\n alert(\"Login Failed\");\n }\n };\n\n const handleLogout = async () => {\n await signOut();\n alert(\"Logout Initiated\");\n };\n\n return (\n <div>\n <button onClick={handleLogin}>Login</button>\n <button onClick={handleLogout}>Logout</button>\n {user && (\n <p data-testid=\"user-email\">\n User:\n {user.email}\n </p>\n )}\n {isAuthenticated && (\n <p data-testid=\"session\">Session authenticated:true</p>\n )}\n </div>\n );\n};\n\ndescribe(\"OAuth login\", () => {\n const clientId = \"test-client-id\";\n let mockOAuth2Client: OAuth2Client;\n let originalWindowLocation: Location;\n\n afterEach(vi.clearAllMocks);\n\n const getOauthEndpointsMock: MockInstance<\n (oauthServer: string) => Promise<Endpoints>\n > = vi.spyOn(oauthLib, \"getOauthEndpoints\").mockResolvedValue({\n auth: \"http://localhost:3001/oauth/auth\",\n token: \"http://localhost:3001/oauth/token\",\n jwks: \"http://localhost:3001/oauth/jwks\",\n userinfo: \"http://localhost:3001/oauth/userinfo\",\n endsession: \"http://localhost:3001/oauth/endsession\",\n });\n\n vi.mock(\"oslo/oauth2\", () => ({\n OAuth2Client: vi.fn(),\n generateCodeVerifier: vi.fn(() => \"mock-code-verifier\"),\n generateState: vi.fn(() => \"mock-state\"),\n }));\n\n vi.mock(\"jose\", () => ({\n jwtVerify: vi.fn(),\n createRemoteJWKSet: vi.fn(),\n }));\n\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetModules();\n\n // Setup mock implementations\n mockOAuth2Client = {\n createAuthorizationURL: vi.fn(),\n validateAuthorizationCode: vi.fn(),\n refreshAccessToken: vi.fn(),\n clientId: \"test-client-id\",\n } as unknown as OAuth2Client;\n vi.mocked(OAuth2Client).mockImplementation(() => mockOAuth2Client);\n\n // Setup jose mocks\n const mockJWKS = {\n getKey: vi.fn().mockResolvedValue({ alg: \"RS256\" }),\n };\n vi.mocked(jose.createRemoteJWKSet).mockReturnValue(mockJWKS as any);\n vi.mocked(jose.jwtVerify).mockResolvedValue({\n payload: { sub: \"user123\", name: \"Test User\", email: \"test@example.com\" },\n protectedHeader: { alg: \"RS256\" },\n } as unknown as JWTVerifyResult<unknown> & ResolvedKey);\n\n originalWindowLocation = window.location;\n window.location = { href: \"\" } as Location;\n global.alert = vi.fn();\n // Mock window.open to prevent errors.\n vi.spyOn(window, \"open\").mockReturnValue(null);\n });\n\n afterEach(() => {\n window.location = originalWindowLocation;\n });\n\n it(\"should set the correct auth url for login with redirect\", async () => {\n const windowAssign = vi.fn();\n const redirectUri = \"http://localhost:3001/callback\";\n vi.mocked(mockOAuth2Client.createAuthorizationURL).mockResolvedValue(\n new URL(\n \"http://localhost:3001/oauth/auth?response_type=code&client_id=\" +\n clientId +\n \"&redirect_uri=\" +\n encodeURIComponent(redirectUri) +\n \"&scope=openid%20profile%20email&state=mock-state&code_challenge=mock-code-challenge&code_challenge_method=S256\",\n ),\n );\n\n window.location = {\n ...originalWindowLocation,\n assign: windowAssign,\n replace: vi.fn(),\n reload: vi.fn(),\n };\n\n act(() => {\n render(\n <CivicAuthProvider\n displayMode=\"redirect\"\n clientId={clientId}\n redirectUrl={redirectUri}\n config={{\n oauthServer: \"http://localhost:3001\",\n }}\n >\n <MockOAuthComponent />\n </CivicAuthProvider>,\n );\n });\n\n await waitFor(() => {\n expect(getOauthEndpointsMock).toHaveBeenCalledWith(\n \"http://localhost:3001\",\n );\n });\n\n // Trigger the login button click, which initiates the OAuth flow\n await act(async () => {\n fireEvent.click(screen.getByText(\"Login\"));\n });\n\n await waitFor(() => {\n // Confirm that the sdk set the window.location.href to the auth url\n const url = new URL(window.location.href);\n expect(url.origin + url.pathname).toEqual(\n \"http://localhost:3001/oauth/auth\",\n );\n expect(url.searchParams.get(\"response_type\")).toEqual(\"code\");\n expect(url.searchParams.get(\"client_id\")).toEqual(clientId);\n expect(url.searchParams.get(\"redirect_uri\")).toEqual(redirectUri);\n expect(url.searchParams.get(\"scope\")).toEqual(\"openid profile email\");\n expect(url.searchParams.get(\"state\")).toBeTruthy(); // Ensure state is present\n expect(url.searchParams.get(\"code_challenge\")).toBeTruthy(); // Ensure code_challenge is present\n expect(url.searchParams.get(\"code_challenge_method\")).toEqual(\"S256\");\n expect(screen.queryByTestId(\"session\")).not.toBeInTheDocument();\n });\n });\n\n it(\"should initiate code exchange, validate tokens, and derive user from ID token\", async () => {\n const redirectUri = \"http://localhost:3001/callback\";\n\n // Mock ID token with user information\n const mockIdToken = validTokens.idToken;\n const mockAccessToken = validTokens.accessToken;\n\n // Mock oslo token exchange\n const mockTokens = {\n access_token: mockAccessToken,\n id_token: mockIdToken,\n refresh_token: \"mock-refresh-token\",\n expires_in: 3600,\n };\n vi.mocked(mockOAuth2Client.validateAuthorizationCode).mockResolvedValue(\n mockTokens,\n );\n\n // Prime storage and simulate redirect\n await act(async () => {\n localStorage.setItem(CodeVerifier.COOKIE_NAME, \"mock-code-verifier\");\n window.location.pathname = \"test-pathName\";\n\n // Configure window.location to simulate redirect\n Object.defineProperty(window, \"location\", {\n value: {\n ...window.location,\n origin: \"http://mock-origin\",\n },\n writable: true,\n });\n window.location.href = `${redirectUri}?code=test-code&state=mock-state`;\n\n // Render the AuthProvider with the mock OAuth component\n render(\n <CivicAuthProvider\n clientId={clientId}\n redirectUrl={redirectUri}\n config={{\n oauthServer: \"http://localhost:3001\",\n }}\n >\n <MockOAuthComponent />\n </CivicAuthProvider>,\n );\n });\n\n await waitFor(() => {\n expect(getOauthEndpointsMock).toHaveBeenCalledWith(\n \"http://localhost:3001\",\n );\n });\n\n await waitFor(() => {\n expect(mockOAuth2Client.validateAuthorizationCode).toHaveBeenCalledWith(\n \"test-code\",\n {\n codeVerifier: \"mock-code-verifier\",\n },\n );\n });\n\n // Check that jose.jwtVerify was called for id_token validation\n await waitFor(() => {\n expect(jose.jwtVerify).toHaveBeenCalledWith(\n mockIdToken,\n expect.any(Object),\n {\n issuer: [\"http://localhost:3001\", \"http://localhost:3001/\"],\n audience: clientId,\n },\n );\n });\n\n // Check that jose.jwtVerify was called for access_token validation\n await waitFor(() => {\n expect(jose.jwtVerify).toHaveBeenCalledWith(\n mockAccessToken,\n expect.any(Object),\n {\n issuer: [\"http://localhost:3001\", \"http://localhost:3001/\"],\n },\n );\n });\n\n // Check that the authenticated flag is set in the session\n await waitFor(() => {\n expect(screen.queryByTestId(\"session\")).toHaveTextContent(\n \"Session authenticated:true\",\n );\n });\n\n // Check that the user info derived from the ID token is displayed\n await waitFor(() => {\n expect(screen.queryByTestId(\"user-email\")).toHaveTextContent(\n \"User:ghost@civic.com\",\n );\n });\n });\n\n it(\"should handle signout flow correctly\", async () => {\n const windowAssign = vi.fn();\n const redirectUri = \"http://localhost:3000/\";\n \n // Mock successful authentication first\n vi.mocked(mockOAuth2Client.validateAuthorizationCode).mockResolvedValue({\n access_token: validTokens.accessToken,\n refresh_token: \"mock-refresh-token\",\n expires_in: 3600,\n });\n\n window.location = {\n ...originalWindowLocation,\n assign: windowAssign,\n replace: vi.fn(),\n reload: vi.fn(),\n };\n\n render(\n <CivicAuthProvider\n displayMode=\"redirect\"\n clientId={clientId}\n redirectUrl={redirectUri}\n config={{\n oauthServer: \"http://localhost:3001\",\n }}\n >\n <MockOAuthComponent />\n </CivicAuthProvider>\n );\n\n // Simulate successful login\n await act(async () => {\n localStorage.setItem(CodeVerifier.COOKIE_NAME, \"mock-code-verifier\");\n window.location.href = `${redirectUri}?code=test-code&state=mock-state`;\n });\n\n // Wait for authentication to complete\n await waitFor(() => {\n expect(screen.queryByTestId(\"session\")).toHaveTextContent(\n \"Session authenticated:true\"\n );\n });\n\n // Now test the signout\n const signOutUrl = new URL(\"http://localhost:3001/oauth/endsession\");\n signOutUrl.searchParams.append(\"client_id\", clientId);\n signOutUrl.searchParams.append(\"id_token_hint\", validTokens.idToken);\n signOutUrl.searchParams.append(\"post_logout_redirect_uri\", redirectUri);\n\n await act(async () => {\n fireEvent.click(screen.getByText(\"Logout\"));\n await new Promise(resolve => setTimeout(resolve, 0));\n });\n\n await waitFor(() => {\n const url = new URL(window.location.href);\n expect(url.origin + url.pathname).toEqual(\"http://localhost:3001/oauth/endsession\");\n expect(url.searchParams.get(\"client_id\")).toEqual(clientId);\n expect(url.searchParams.get(\"id_token_hint\")).toEqual(validTokens.idToken);\n expect(url.searchParams.get(\"post_logout_redirect_uri\")).toEqual(redirectUri);\n });\n });\n});\n"]}
@@ -0,0 +1,26 @@
1
+ declare const oauthWellKnownResponse: {
2
+ authorization_endpoint: string;
3
+ claims_parameter_supported: boolean;
4
+ claims_supported: string[];
5
+ code_challenge_methods_supported: string[];
6
+ end_session_endpoint: string;
7
+ grant_types_supported: string[];
8
+ issuer: string;
9
+ jwks_uri: string;
10
+ authorization_response_iss_parameter_supported: boolean;
11
+ response_modes_supported: string[];
12
+ response_types_supported: string[];
13
+ scopes_supported: string[];
14
+ subject_types_supported: string[];
15
+ token_endpoint_auth_methods_supported: string[];
16
+ token_endpoint_auth_signing_alg_values_supported: string[];
17
+ token_endpoint: string;
18
+ id_token_signing_alg_values_supported: string[];
19
+ pushed_authorization_request_endpoint: string;
20
+ request_parameter_supported: boolean;
21
+ request_uri_parameter_supported: boolean;
22
+ userinfo_endpoint: string;
23
+ claim_types_supported: string[];
24
+ };
25
+ export { oauthWellKnownResponse };
26
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../test/support/fixtures.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;CAqD3B,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,CAAC"}