@civic/auth 0.2.4-beta.1 → 0.2.5-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/cjs/nextjs/config.d.ts +23 -5
  3. package/dist/cjs/nextjs/config.d.ts.map +1 -1
  4. package/dist/cjs/nextjs/config.js +12 -2
  5. package/dist/cjs/nextjs/config.js.map +1 -1
  6. package/dist/cjs/nextjs/cookies.d.ts +9 -13
  7. package/dist/cjs/nextjs/cookies.d.ts.map +1 -1
  8. package/dist/cjs/nextjs/cookies.js +5 -28
  9. package/dist/cjs/nextjs/cookies.js.map +1 -1
  10. package/dist/cjs/nextjs/index.d.ts +2 -2
  11. package/dist/cjs/nextjs/index.d.ts.map +1 -1
  12. package/dist/cjs/nextjs/index.js +3 -4
  13. package/dist/cjs/nextjs/index.js.map +1 -1
  14. package/dist/cjs/nextjs/middleware.d.ts +3 -3
  15. package/dist/cjs/nextjs/middleware.d.ts.map +1 -1
  16. package/dist/cjs/nextjs/middleware.js.map +1 -1
  17. package/dist/cjs/nextjs/providers/NextAuthProvider.d.ts.map +1 -1
  18. package/dist/cjs/nextjs/providers/NextAuthProvider.js +2 -2
  19. package/dist/cjs/nextjs/providers/NextAuthProvider.js.map +1 -1
  20. package/dist/cjs/nextjs/routeHandler.d.ts.map +1 -1
  21. package/dist/cjs/nextjs/routeHandler.js +16 -10
  22. package/dist/cjs/nextjs/routeHandler.js.map +1 -1
  23. package/dist/cjs/reactjs/components/LoadingSpinner.d.ts +7 -0
  24. package/dist/cjs/reactjs/components/LoadingSpinner.d.ts.map +1 -0
  25. package/dist/cjs/reactjs/components/LoadingSpinner.js +33 -0
  26. package/dist/cjs/reactjs/components/LoadingSpinner.js.map +1 -0
  27. package/dist/cjs/shared/index.d.ts +1 -0
  28. package/dist/cjs/shared/index.d.ts.map +1 -1
  29. package/dist/cjs/shared/index.js +3 -1
  30. package/dist/cjs/shared/index.js.map +1 -1
  31. package/dist/cjs/shared/lib/BrowserCookieStorage.d.ts +7 -0
  32. package/dist/cjs/shared/lib/BrowserCookieStorage.d.ts.map +1 -0
  33. package/dist/cjs/shared/lib/BrowserCookieStorage.js +54 -0
  34. package/dist/cjs/shared/lib/BrowserCookieStorage.js.map +1 -0
  35. package/dist/cjs/shared/version.d.ts +1 -1
  36. package/dist/cjs/shared/version.d.ts.map +1 -1
  37. package/dist/cjs/shared/version.js +1 -1
  38. package/dist/cjs/shared/version.js.map +1 -1
  39. package/dist/esm/nextjs/config.d.ts +23 -5
  40. package/dist/esm/nextjs/config.d.ts.map +1 -1
  41. package/dist/esm/nextjs/config.js +12 -2
  42. package/dist/esm/nextjs/config.js.map +1 -1
  43. package/dist/esm/nextjs/cookies.d.ts +9 -13
  44. package/dist/esm/nextjs/cookies.d.ts.map +1 -1
  45. package/dist/esm/nextjs/cookies.js +8 -29
  46. package/dist/esm/nextjs/cookies.js.map +1 -1
  47. package/dist/esm/nextjs/index.d.ts +2 -2
  48. package/dist/esm/nextjs/index.d.ts.map +1 -1
  49. package/dist/esm/nextjs/index.js +4 -4
  50. package/dist/esm/nextjs/index.js.map +1 -1
  51. package/dist/esm/nextjs/middleware.d.ts +3 -3
  52. package/dist/esm/nextjs/middleware.d.ts.map +1 -1
  53. package/dist/esm/nextjs/middleware.js.map +1 -1
  54. package/dist/esm/nextjs/providers/NextAuthProvider.d.ts.map +1 -1
  55. package/dist/esm/nextjs/providers/NextAuthProvider.js +2 -2
  56. package/dist/esm/nextjs/providers/NextAuthProvider.js.map +1 -1
  57. package/dist/esm/nextjs/routeHandler.d.ts.map +1 -1
  58. package/dist/esm/nextjs/routeHandler.js +17 -11
  59. package/dist/esm/nextjs/routeHandler.js.map +1 -1
  60. package/dist/esm/shared/index.d.ts +1 -0
  61. package/dist/esm/shared/index.d.ts.map +1 -1
  62. package/dist/esm/shared/index.js +1 -0
  63. package/dist/esm/shared/index.js.map +1 -1
  64. package/dist/esm/shared/lib/BrowserCookieStorage.d.ts +7 -0
  65. package/dist/esm/shared/lib/BrowserCookieStorage.d.ts.map +1 -0
  66. package/dist/esm/shared/lib/BrowserCookieStorage.js +50 -0
  67. package/dist/esm/shared/lib/BrowserCookieStorage.js.map +1 -0
  68. package/dist/esm/shared/version.d.ts +1 -1
  69. package/dist/esm/shared/version.d.ts.map +1 -1
  70. package/dist/esm/shared/version.js +1 -1
  71. package/dist/esm/shared/version.js.map +1 -1
  72. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  73. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  74. package/package.json +18 -19
  75. package/dist/generateVersion.d.ts +0 -2
  76. package/dist/generateVersion.d.ts.map +0 -1
  77. package/dist/generateVersion.js +0 -12
  78. package/dist/generateVersion.js.map +0 -1
  79. package/dist/package.json +0 -118
  80. package/dist/src/browser/storage.d.ts +0 -9
  81. package/dist/src/browser/storage.d.ts.map +0 -1
  82. package/dist/src/browser/storage.js +0 -17
  83. package/dist/src/browser/storage.js.map +0 -1
  84. package/dist/src/config.d.ts +0 -3
  85. package/dist/src/config.d.ts.map +0 -1
  86. package/dist/src/config.js +0 -5
  87. package/dist/src/config.js.map +0 -1
  88. package/dist/src/constants.d.ts +0 -8
  89. package/dist/src/constants.d.ts.map +0 -1
  90. package/dist/src/constants.js +0 -16
  91. package/dist/src/constants.js.map +0 -1
  92. package/dist/src/index.d.ts +0 -6
  93. package/dist/src/index.d.ts.map +0 -1
  94. package/dist/src/index.js +0 -4
  95. package/dist/src/index.js.map +0 -1
  96. package/dist/src/lib/cookies.d.ts +0 -7
  97. package/dist/src/lib/cookies.d.ts.map +0 -1
  98. package/dist/src/lib/cookies.js +0 -25
  99. package/dist/src/lib/cookies.js.map +0 -1
  100. package/dist/src/lib/jwt.d.ts +0 -3
  101. package/dist/src/lib/jwt.d.ts.map +0 -1
  102. package/dist/src/lib/jwt.js +0 -9
  103. package/dist/src/lib/jwt.js.map +0 -1
  104. package/dist/src/lib/logger.d.ts +0 -26
  105. package/dist/src/lib/logger.d.ts.map +0 -1
  106. package/dist/src/lib/logger.js +0 -55
  107. package/dist/src/lib/logger.js.map +0 -1
  108. package/dist/src/lib/oauth.d.ts +0 -19
  109. package/dist/src/lib/oauth.d.ts.map +0 -1
  110. package/dist/src/lib/oauth.js +0 -61
  111. package/dist/src/lib/oauth.js.map +0 -1
  112. package/dist/src/lib/obj.d.ts +0 -3
  113. package/dist/src/lib/obj.d.ts.map +0 -1
  114. package/dist/src/lib/obj.js +0 -18
  115. package/dist/src/lib/obj.js.map +0 -1
  116. package/dist/src/lib/postMessage.d.ts +0 -4
  117. package/dist/src/lib/postMessage.d.ts.map +0 -1
  118. package/dist/src/lib/postMessage.js +0 -15
  119. package/dist/src/lib/postMessage.js.map +0 -1
  120. package/dist/src/lib/windowUtil.d.ts +0 -4
  121. package/dist/src/lib/windowUtil.d.ts.map +0 -1
  122. package/dist/src/lib/windowUtil.js +0 -31
  123. package/dist/src/lib/windowUtil.js.map +0 -1
  124. package/dist/src/nextjs/GetUser.d.ts +0 -6
  125. package/dist/src/nextjs/GetUser.d.ts.map +0 -1
  126. package/dist/src/nextjs/GetUser.js +0 -7
  127. package/dist/src/nextjs/GetUser.js.map +0 -1
  128. package/dist/src/nextjs/config.d.ts +0 -181
  129. package/dist/src/nextjs/config.d.ts.map +0 -1
  130. package/dist/src/nextjs/config.js +0 -177
  131. package/dist/src/nextjs/config.js.map +0 -1
  132. package/dist/src/nextjs/cookies.d.ts +0 -30
  133. package/dist/src/nextjs/cookies.d.ts.map +0 -1
  134. package/dist/src/nextjs/cookies.js +0 -112
  135. package/dist/src/nextjs/cookies.js.map +0 -1
  136. package/dist/src/nextjs/hooks/index.d.ts +0 -2
  137. package/dist/src/nextjs/hooks/index.d.ts.map +0 -1
  138. package/dist/src/nextjs/hooks/index.js +0 -2
  139. package/dist/src/nextjs/hooks/index.js.map +0 -1
  140. package/dist/src/nextjs/hooks/usePrevious.d.ts +0 -2
  141. package/dist/src/nextjs/hooks/usePrevious.d.ts.map +0 -1
  142. package/dist/src/nextjs/hooks/usePrevious.js +0 -9
  143. package/dist/src/nextjs/hooks/usePrevious.js.map +0 -1
  144. package/dist/src/nextjs/hooks/useUserCookie.d.ts +0 -8
  145. package/dist/src/nextjs/hooks/useUserCookie.d.ts.map +0 -1
  146. package/dist/src/nextjs/hooks/useUserCookie.js +0 -88
  147. package/dist/src/nextjs/hooks/useUserCookie.js.map +0 -1
  148. package/dist/src/nextjs/index.d.ts +0 -7
  149. package/dist/src/nextjs/index.d.ts.map +0 -1
  150. package/dist/src/nextjs/index.js +0 -8
  151. package/dist/src/nextjs/index.js.map +0 -1
  152. package/dist/src/nextjs/middleware/index.d.ts +0 -2
  153. package/dist/src/nextjs/middleware/index.d.ts.map +0 -1
  154. package/dist/src/nextjs/middleware/index.js +0 -4
  155. package/dist/src/nextjs/middleware/index.js.map +0 -1
  156. package/dist/src/nextjs/middleware.d.ts +0 -59
  157. package/dist/src/nextjs/middleware.d.ts.map +0 -1
  158. package/dist/src/nextjs/middleware.js +0 -107
  159. package/dist/src/nextjs/middleware.js.map +0 -1
  160. package/dist/src/nextjs/providers/NextAuthProvider.d.ts +0 -13
  161. package/dist/src/nextjs/providers/NextAuthProvider.d.ts.map +0 -1
  162. package/dist/src/nextjs/providers/NextAuthProvider.js +0 -94
  163. package/dist/src/nextjs/providers/NextAuthProvider.js.map +0 -1
  164. package/dist/src/nextjs/routeHandler.d.ts +0 -19
  165. package/dist/src/nextjs/routeHandler.d.ts.map +0 -1
  166. package/dist/src/nextjs/routeHandler.js +0 -299
  167. package/dist/src/nextjs/routeHandler.js.map +0 -1
  168. package/dist/src/nextjs/utils.d.ts +0 -3
  169. package/dist/src/nextjs/utils.d.ts.map +0 -1
  170. package/dist/src/nextjs/utils.js +0 -5
  171. package/dist/src/nextjs/utils.js.map +0 -1
  172. package/dist/src/reactjs/components/SignInButton.d.ts +0 -8
  173. package/dist/src/reactjs/components/SignInButton.d.ts.map +0 -1
  174. package/dist/src/reactjs/components/SignInButton.js +0 -14
  175. package/dist/src/reactjs/components/SignInButton.js.map +0 -1
  176. package/dist/src/reactjs/components/SignOutButton.d.ts +0 -6
  177. package/dist/src/reactjs/components/SignOutButton.d.ts.map +0 -1
  178. package/dist/src/reactjs/components/SignOutButton.js +0 -14
  179. package/dist/src/reactjs/components/SignOutButton.js.map +0 -1
  180. package/dist/src/reactjs/components/UserButton.d.ts +0 -6
  181. package/dist/src/reactjs/components/UserButton.d.ts.map +0 -1
  182. package/dist/src/reactjs/components/UserButton.js +0 -118
  183. package/dist/src/reactjs/components/UserButton.js.map +0 -1
  184. package/dist/src/reactjs/components/index.d.ts +0 -6
  185. package/dist/src/reactjs/components/index.d.ts.map +0 -1
  186. package/dist/src/reactjs/components/index.js +0 -6
  187. package/dist/src/reactjs/components/index.js.map +0 -1
  188. package/dist/src/reactjs/hooks/index.d.ts +0 -6
  189. package/dist/src/reactjs/hooks/index.d.ts.map +0 -1
  190. package/dist/src/reactjs/hooks/index.js +0 -6
  191. package/dist/src/reactjs/hooks/index.js.map +0 -1
  192. package/dist/src/reactjs/hooks/useAuth.d.ts +0 -3
  193. package/dist/src/reactjs/hooks/useAuth.d.ts.map +0 -1
  194. package/dist/src/reactjs/hooks/useAuth.js +0 -12
  195. package/dist/src/reactjs/hooks/useAuth.js.map +0 -1
  196. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.d.ts +0 -3
  197. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.d.ts.map +0 -1
  198. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.js +0 -13
  199. package/dist/src/reactjs/hooks/useClientTokenExchangeSession.js.map +0 -1
  200. package/dist/src/reactjs/hooks/useUser.d.ts +0 -4
  201. package/dist/src/reactjs/hooks/useUser.d.ts.map +0 -1
  202. package/dist/src/reactjs/hooks/useUser.js +0 -12
  203. package/dist/src/reactjs/hooks/useUser.js.map +0 -1
  204. package/dist/src/reactjs/index.d.ts +0 -6
  205. package/dist/src/reactjs/index.d.ts.map +0 -1
  206. package/dist/src/reactjs/index.js +0 -10
  207. package/dist/src/reactjs/index.js.map +0 -1
  208. package/dist/src/reactjs/providers/AuthProvider.d.ts +0 -11
  209. package/dist/src/reactjs/providers/AuthProvider.d.ts.map +0 -1
  210. package/dist/src/reactjs/providers/AuthProvider.js +0 -76
  211. package/dist/src/reactjs/providers/AuthProvider.js.map +0 -1
  212. package/dist/src/reactjs/providers/CivicAuthProvider.d.ts +0 -6
  213. package/dist/src/reactjs/providers/CivicAuthProvider.d.ts.map +0 -1
  214. package/dist/src/reactjs/providers/CivicAuthProvider.js +0 -32
  215. package/dist/src/reactjs/providers/CivicAuthProvider.js.map +0 -1
  216. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts +0 -17
  217. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts.map +0 -1
  218. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.js +0 -148
  219. package/dist/src/reactjs/providers/ClientTokenExchangeSessionProvider.js.map +0 -1
  220. package/dist/src/reactjs/providers/index.d.ts +0 -8
  221. package/dist/src/reactjs/providers/index.d.ts.map +0 -1
  222. package/dist/src/reactjs/providers/index.js +0 -7
  223. package/dist/src/reactjs/providers/index.js.map +0 -1
  224. package/dist/src/server/ServerAuthenticationResolver.d.ts +0 -20
  225. package/dist/src/server/ServerAuthenticationResolver.d.ts.map +0 -1
  226. package/dist/src/server/ServerAuthenticationResolver.js +0 -67
  227. package/dist/src/server/ServerAuthenticationResolver.js.map +0 -1
  228. package/dist/src/server/config.d.ts +0 -10
  229. package/dist/src/server/config.d.ts.map +0 -1
  230. package/dist/src/server/config.js +0 -2
  231. package/dist/src/server/config.js.map +0 -1
  232. package/dist/src/server/index.d.ts +0 -7
  233. package/dist/src/server/index.d.ts.map +0 -1
  234. package/dist/src/server/index.js +0 -7
  235. package/dist/src/server/index.js.map +0 -1
  236. package/dist/src/server/login.d.ts +0 -21
  237. package/dist/src/server/login.d.ts.map +0 -1
  238. package/dist/src/server/login.js +0 -56
  239. package/dist/src/server/login.js.map +0 -1
  240. package/dist/src/server/refresh.d.ts +0 -7
  241. package/dist/src/server/refresh.d.ts.map +0 -1
  242. package/dist/src/server/refresh.js +0 -13
  243. package/dist/src/server/refresh.js.map +0 -1
  244. package/dist/src/services/AuthenticationService.d.ts +0 -91
  245. package/dist/src/services/AuthenticationService.d.ts.map +0 -1
  246. package/dist/src/services/AuthenticationService.js +0 -322
  247. package/dist/src/services/AuthenticationService.js.map +0 -1
  248. package/dist/src/services/PKCE.d.ts +0 -20
  249. package/dist/src/services/PKCE.d.ts.map +0 -1
  250. package/dist/src/services/PKCE.js +0 -44
  251. package/dist/src/services/PKCE.js.map +0 -1
  252. package/dist/src/services/types.d.ts +0 -24
  253. package/dist/src/services/types.d.ts.map +0 -1
  254. package/dist/src/services/types.js +0 -7
  255. package/dist/src/services/types.js.map +0 -1
  256. package/dist/src/shared/components/BlockDisplay.d.ts +0 -7
  257. package/dist/src/shared/components/BlockDisplay.d.ts.map +0 -1
  258. package/dist/src/shared/components/BlockDisplay.js +0 -25
  259. package/dist/src/shared/components/BlockDisplay.js.map +0 -1
  260. package/dist/src/shared/components/CivicAuthIframe.d.ts +0 -9
  261. package/dist/src/shared/components/CivicAuthIframe.d.ts.map +0 -1
  262. package/dist/src/shared/components/CivicAuthIframe.js +0 -8
  263. package/dist/src/shared/components/CivicAuthIframe.js.map +0 -1
  264. package/dist/src/shared/components/CivicAuthIframeContainer.d.ts +0 -13
  265. package/dist/src/shared/components/CivicAuthIframeContainer.d.ts.map +0 -1
  266. package/dist/src/shared/components/CivicAuthIframeContainer.js +0 -138
  267. package/dist/src/shared/components/CivicAuthIframeContainer.js.map +0 -1
  268. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.d.ts +0 -7
  269. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.d.ts.map +0 -1
  270. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.js +0 -22
  271. package/dist/src/shared/components/CivicAuthLogoutIframeContainer.js.map +0 -1
  272. package/dist/src/shared/components/CloseIcon.d.ts +0 -4
  273. package/dist/src/shared/components/CloseIcon.d.ts.map +0 -1
  274. package/dist/src/shared/components/CloseIcon.js +0 -6
  275. package/dist/src/shared/components/CloseIcon.js.map +0 -1
  276. package/dist/src/shared/components/IFrameAndLoading.d.ts +0 -8
  277. package/dist/src/shared/components/IFrameAndLoading.d.ts.map +0 -1
  278. package/dist/src/shared/components/IFrameAndLoading.js +0 -27
  279. package/dist/src/shared/components/IFrameAndLoading.js.map +0 -1
  280. package/dist/src/shared/components/LoadingIcon.d.ts +0 -4
  281. package/dist/src/shared/components/LoadingIcon.d.ts.map +0 -1
  282. package/dist/src/shared/components/LoadingIcon.js +0 -30
  283. package/dist/src/shared/components/LoadingIcon.js.map +0 -1
  284. package/dist/src/shared/hooks/index.d.ts +0 -11
  285. package/dist/src/shared/hooks/index.d.ts.map +0 -1
  286. package/dist/src/shared/hooks/index.js +0 -11
  287. package/dist/src/shared/hooks/index.js.map +0 -1
  288. package/dist/src/shared/hooks/useAuth.d.ts +0 -3
  289. package/dist/src/shared/hooks/useAuth.d.ts.map +0 -1
  290. package/dist/src/shared/hooks/useAuth.js +0 -12
  291. package/dist/src/shared/hooks/useAuth.js.map +0 -1
  292. package/dist/src/shared/hooks/useCivicAuthConfig.d.ts +0 -3
  293. package/dist/src/shared/hooks/useCivicAuthConfig.d.ts.map +0 -1
  294. package/dist/src/shared/hooks/useCivicAuthConfig.js +0 -10
  295. package/dist/src/shared/hooks/useCivicAuthConfig.js.map +0 -1
  296. package/dist/src/shared/hooks/useClientTokenExchangeSession.d.ts +0 -3
  297. package/dist/src/shared/hooks/useClientTokenExchangeSession.d.ts.map +0 -1
  298. package/dist/src/shared/hooks/useClientTokenExchangeSession.js +0 -13
  299. package/dist/src/shared/hooks/useClientTokenExchangeSession.js.map +0 -1
  300. package/dist/src/shared/hooks/useCurrentUrl.d.ts +0 -3
  301. package/dist/src/shared/hooks/useCurrentUrl.d.ts.map +0 -1
  302. package/dist/src/shared/hooks/useCurrentUrl.js +0 -24
  303. package/dist/src/shared/hooks/useCurrentUrl.js.map +0 -1
  304. package/dist/src/shared/hooks/useIframe.d.ts +0 -3
  305. package/dist/src/shared/hooks/useIframe.d.ts.map +0 -1
  306. package/dist/src/shared/hooks/useIframe.js +0 -13
  307. package/dist/src/shared/hooks/useIframe.js.map +0 -1
  308. package/dist/src/shared/hooks/useIsInIframe.d.ts +0 -3
  309. package/dist/src/shared/hooks/useIsInIframe.d.ts.map +0 -1
  310. package/dist/src/shared/hooks/useIsInIframe.js +0 -14
  311. package/dist/src/shared/hooks/useIsInIframe.js.map +0 -1
  312. package/dist/src/shared/hooks/useOAuthEndpoints.d.ts +0 -4
  313. package/dist/src/shared/hooks/useOAuthEndpoints.d.ts.map +0 -1
  314. package/dist/src/shared/hooks/useOAuthEndpoints.js +0 -14
  315. package/dist/src/shared/hooks/useOAuthEndpoints.js.map +0 -1
  316. package/dist/src/shared/hooks/useRefresh.d.ts +0 -4
  317. package/dist/src/shared/hooks/useRefresh.d.ts.map +0 -1
  318. package/dist/src/shared/hooks/useRefresh.js +0 -38
  319. package/dist/src/shared/hooks/useRefresh.js.map +0 -1
  320. package/dist/src/shared/hooks/useSession.d.ts +0 -3
  321. package/dist/src/shared/hooks/useSession.d.ts.map +0 -1
  322. package/dist/src/shared/hooks/useSession.js +0 -13
  323. package/dist/src/shared/hooks/useSession.js.map +0 -1
  324. package/dist/src/shared/hooks/useSignIn.d.ts +0 -15
  325. package/dist/src/shared/hooks/useSignIn.d.ts.map +0 -1
  326. package/dist/src/shared/hooks/useSignIn.js +0 -126
  327. package/dist/src/shared/hooks/useSignIn.js.map +0 -1
  328. package/dist/src/shared/hooks/useToken.d.ts +0 -3
  329. package/dist/src/shared/hooks/useToken.d.ts.map +0 -1
  330. package/dist/src/shared/hooks/useToken.js +0 -12
  331. package/dist/src/shared/hooks/useToken.js.map +0 -1
  332. package/dist/src/shared/hooks/useWindowFocused.d.ts +0 -5
  333. package/dist/src/shared/hooks/useWindowFocused.d.ts.map +0 -1
  334. package/dist/src/shared/hooks/useWindowFocused.js +0 -21
  335. package/dist/src/shared/hooks/useWindowFocused.js.map +0 -1
  336. package/dist/src/shared/index.d.ts +0 -5
  337. package/dist/src/shared/index.d.ts.map +0 -1
  338. package/dist/src/shared/index.js +0 -16
  339. package/dist/src/shared/index.js.map +0 -1
  340. package/dist/src/shared/lib/GenericAuthenticationRefresher.d.ts +0 -20
  341. package/dist/src/shared/lib/GenericAuthenticationRefresher.d.ts.map +0 -1
  342. package/dist/src/shared/lib/GenericAuthenticationRefresher.js +0 -73
  343. package/dist/src/shared/lib/GenericAuthenticationRefresher.js.map +0 -1
  344. package/dist/src/shared/lib/UserSession.d.ts +0 -12
  345. package/dist/src/shared/lib/UserSession.d.ts.map +0 -1
  346. package/dist/src/shared/lib/UserSession.js +0 -20
  347. package/dist/src/shared/lib/UserSession.js.map +0 -1
  348. package/dist/src/shared/lib/session.d.ts +0 -3
  349. package/dist/src/shared/lib/session.d.ts.map +0 -1
  350. package/dist/src/shared/lib/session.js +0 -21
  351. package/dist/src/shared/lib/session.js.map +0 -1
  352. package/dist/src/shared/lib/storage.d.ts +0 -25
  353. package/dist/src/shared/lib/storage.d.ts.map +0 -1
  354. package/dist/src/shared/lib/storage.js +0 -17
  355. package/dist/src/shared/lib/storage.js.map +0 -1
  356. package/dist/src/shared/lib/types.d.ts +0 -36
  357. package/dist/src/shared/lib/types.d.ts.map +0 -1
  358. package/dist/src/shared/lib/types.js +0 -18
  359. package/dist/src/shared/lib/types.js.map +0 -1
  360. package/dist/src/shared/lib/util.d.ts +0 -34
  361. package/dist/src/shared/lib/util.d.ts.map +0 -1
  362. package/dist/src/shared/lib/util.js +0 -137
  363. package/dist/src/shared/lib/util.js.map +0 -1
  364. package/dist/src/shared/providers/AuthContext.d.ts +0 -11
  365. package/dist/src/shared/providers/AuthContext.d.ts.map +0 -1
  366. package/dist/src/shared/providers/AuthContext.js +0 -3
  367. package/dist/src/shared/providers/AuthContext.js.map +0 -1
  368. package/dist/src/shared/providers/AuthProvider.d.ts +0 -22
  369. package/dist/src/shared/providers/AuthProvider.d.ts.map +0 -1
  370. package/dist/src/shared/providers/AuthProvider.js +0 -72
  371. package/dist/src/shared/providers/AuthProvider.js.map +0 -1
  372. package/dist/src/shared/providers/CivicAuthConfigContext.d.ts +0 -18
  373. package/dist/src/shared/providers/CivicAuthConfigContext.d.ts.map +0 -1
  374. package/dist/src/shared/providers/CivicAuthConfigContext.js +0 -52
  375. package/dist/src/shared/providers/CivicAuthConfigContext.js.map +0 -1
  376. package/dist/src/shared/providers/CivicAuthProvider.d.ts +0 -6
  377. package/dist/src/shared/providers/CivicAuthProvider.d.ts.map +0 -1
  378. package/dist/src/shared/providers/CivicAuthProvider.js +0 -32
  379. package/dist/src/shared/providers/CivicAuthProvider.js.map +0 -1
  380. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.d.ts +0 -17
  381. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.d.ts.map +0 -1
  382. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.js +0 -131
  383. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.js.map +0 -1
  384. package/dist/src/shared/providers/IframeProvider.d.ts +0 -22
  385. package/dist/src/shared/providers/IframeProvider.d.ts.map +0 -1
  386. package/dist/src/shared/providers/IframeProvider.js +0 -35
  387. package/dist/src/shared/providers/IframeProvider.js.map +0 -1
  388. package/dist/src/shared/providers/SessionProvider.d.ts +0 -19
  389. package/dist/src/shared/providers/SessionProvider.d.ts.map +0 -1
  390. package/dist/src/shared/providers/SessionProvider.js +0 -23
  391. package/dist/src/shared/providers/SessionProvider.js.map +0 -1
  392. package/dist/src/shared/providers/TokenProvider.d.ts +0 -18
  393. package/dist/src/shared/providers/TokenProvider.d.ts.map +0 -1
  394. package/dist/src/shared/providers/TokenProvider.js +0 -42
  395. package/dist/src/shared/providers/TokenProvider.js.map +0 -1
  396. package/dist/src/shared/providers/UserProvider.d.ts +0 -24
  397. package/dist/src/shared/providers/UserProvider.d.ts.map +0 -1
  398. package/dist/src/shared/providers/UserProvider.js +0 -52
  399. package/dist/src/shared/providers/UserProvider.js.map +0 -1
  400. package/dist/src/shared/providers/types.d.ts +0 -15
  401. package/dist/src/shared/providers/types.d.ts.map +0 -1
  402. package/dist/src/shared/providers/types.js +0 -2
  403. package/dist/src/shared/providers/types.js.map +0 -1
  404. package/dist/src/shared/version.d.ts +0 -2
  405. package/dist/src/shared/version.d.ts.map +0 -1
  406. package/dist/src/shared/version.js +0 -3
  407. package/dist/src/shared/version.js.map +0 -1
  408. package/dist/src/types.d.ts +0 -148
  409. package/dist/src/types.d.ts.map +0 -1
  410. package/dist/src/types.js +0 -4
  411. package/dist/src/types.js.map +0 -1
  412. package/dist/src/utils.d.ts +0 -15
  413. package/dist/src/utils.d.ts.map +0 -1
  414. package/dist/src/utils.js +0 -43
  415. package/dist/src/utils.js.map +0 -1
  416. package/dist/src/version.d.ts +0 -2
  417. package/dist/src/version.d.ts.map +0 -1
  418. package/dist/src/version.js +0 -3
  419. package/dist/src/version.js.map +0 -1
  420. package/dist/test/integration/sdk.test.d.ts +0 -2
  421. package/dist/test/integration/sdk.test.d.ts.map +0 -1
  422. package/dist/test/integration/sdk.test.js +0 -237
  423. package/dist/test/integration/sdk.test.js.map +0 -1
  424. package/dist/test/support/fixtures.d.ts +0 -26
  425. package/dist/test/support/fixtures.d.ts.map +0 -1
  426. package/dist/test/support/fixtures.js +0 -55
  427. package/dist/test/support/fixtures.js.map +0 -1
  428. package/dist/test/support/tokens.json +0 -26
  429. package/dist/test/unit/lib/oauth.test.d.ts +0 -2
  430. package/dist/test/unit/lib/oauth.test.d.ts.map +0 -1
  431. package/dist/test/unit/lib/oauth.test.js +0 -56
  432. package/dist/test/unit/lib/oauth.test.js.map +0 -1
  433. package/dist/test/unit/lib/obj.test.d.ts +0 -2
  434. package/dist/test/unit/lib/obj.test.d.ts.map +0 -1
  435. package/dist/test/unit/lib/obj.test.js +0 -37
  436. package/dist/test/unit/lib/obj.test.js.map +0 -1
  437. package/dist/test/unit/logger.test.d.ts +0 -2
  438. package/dist/test/unit/logger.test.d.ts.map +0 -1
  439. package/dist/test/unit/logger.test.js +0 -141
  440. package/dist/test/unit/logger.test.js.map +0 -1
  441. package/dist/test/unit/nextjs/NextAuthProvider.test.d.ts +0 -2
  442. package/dist/test/unit/nextjs/NextAuthProvider.test.d.ts.map +0 -1
  443. package/dist/test/unit/nextjs/NextAuthProvider.test.js +0 -31
  444. package/dist/test/unit/nextjs/NextAuthProvider.test.js.map +0 -1
  445. package/dist/test/unit/nextjs/config.test.d.ts +0 -2
  446. package/dist/test/unit/nextjs/config.test.d.ts.map +0 -1
  447. package/dist/test/unit/nextjs/config.test.js +0 -203
  448. package/dist/test/unit/nextjs/config.test.js.map +0 -1
  449. package/dist/test/unit/nextjs/getUser.test.d.ts +0 -2
  450. package/dist/test/unit/nextjs/getUser.test.d.ts.map +0 -1
  451. package/dist/test/unit/nextjs/getUser.test.js +0 -22
  452. package/dist/test/unit/nextjs/getUser.test.js.map +0 -1
  453. package/dist/test/unit/nextjs/handler.test.d.ts +0 -2
  454. package/dist/test/unit/nextjs/handler.test.d.ts.map +0 -1
  455. package/dist/test/unit/nextjs/handler.test.js +0 -235
  456. package/dist/test/unit/nextjs/handler.test.js.map +0 -1
  457. package/dist/test/unit/nextjs/middleware.test.d.ts +0 -2
  458. package/dist/test/unit/nextjs/middleware.test.d.ts.map +0 -1
  459. package/dist/test/unit/nextjs/middleware.test.js +0 -113
  460. package/dist/test/unit/nextjs/middleware.test.js.map +0 -1
  461. package/dist/test/unit/nextjs/utils.test.d.ts +0 -2
  462. package/dist/test/unit/nextjs/utils.test.d.ts.map +0 -1
  463. package/dist/test/unit/nextjs/utils.test.js +0 -13
  464. package/dist/test/unit/nextjs/utils.test.js.map +0 -1
  465. package/dist/test/unit/publicApi/apiSnapshot.test.d.ts +0 -2
  466. package/dist/test/unit/publicApi/apiSnapshot.test.d.ts.map +0 -1
  467. package/dist/test/unit/publicApi/apiSnapshot.test.js +0 -10
  468. package/dist/test/unit/publicApi/apiSnapshot.test.js.map +0 -1
  469. package/dist/test/unit/react/components/SignInButton.test.d.ts +0 -2
  470. package/dist/test/unit/react/components/SignInButton.test.d.ts.map +0 -1
  471. package/dist/test/unit/react/components/SignInButton.test.js +0 -31
  472. package/dist/test/unit/react/components/SignInButton.test.js.map +0 -1
  473. package/dist/test/unit/react/components/SignOutButton.test.d.ts +0 -2
  474. package/dist/test/unit/react/components/SignOutButton.test.d.ts.map +0 -1
  475. package/dist/test/unit/react/components/SignOutButton.test.js +0 -30
  476. package/dist/test/unit/react/components/SignOutButton.test.js.map +0 -1
  477. package/dist/test/unit/server/login.test.d.ts +0 -2
  478. package/dist/test/unit/server/login.test.d.ts.map +0 -1
  479. package/dist/test/unit/server/login.test.js +0 -184
  480. package/dist/test/unit/server/login.test.js.map +0 -1
  481. package/dist/test/unit/server/refresh.test.d.ts +0 -2
  482. package/dist/test/unit/server/refresh.test.d.ts.map +0 -1
  483. package/dist/test/unit/server/refresh.test.js +0 -55
  484. package/dist/test/unit/server/refresh.test.js.map +0 -1
  485. package/dist/test/unit/server/session.test.d.ts +0 -2
  486. package/dist/test/unit/server/session.test.d.ts.map +0 -1
  487. package/dist/test/unit/server/session.test.js +0 -41
  488. package/dist/test/unit/server/session.test.js.map +0 -1
  489. package/dist/test/unit/services/AuthenticationService.test.d.ts +0 -2
  490. package/dist/test/unit/services/AuthenticationService.test.d.ts.map +0 -1
  491. package/dist/test/unit/services/AuthenticationService.test.js +0 -301
  492. package/dist/test/unit/services/AuthenticationService.test.js.map +0 -1
  493. package/dist/test/unit/services/ServerAuthenticationResolver.test.d.ts +0 -2
  494. package/dist/test/unit/services/ServerAuthenticationResolver.test.d.ts.map +0 -1
  495. package/dist/test/unit/services/ServerAuthenticationResolver.test.js +0 -75
  496. package/dist/test/unit/services/ServerAuthenticationResolver.test.js.map +0 -1
  497. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.d.ts +0 -2
  498. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.d.ts.map +0 -1
  499. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.js +0 -144
  500. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.js.map +0 -1
  501. package/dist/test/unit/shared/UserSession.test.d.ts +0 -2
  502. package/dist/test/unit/shared/UserSession.test.d.ts.map +0 -1
  503. package/dist/test/unit/shared/UserSession.test.js +0 -37
  504. package/dist/test/unit/shared/UserSession.test.js.map +0 -1
  505. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.d.ts +0 -2
  506. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.d.ts.map +0 -1
  507. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.js +0 -122
  508. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.js.map +0 -1
  509. package/dist/test/unit/shared/printVersion.test.d.ts +0 -2
  510. package/dist/test/unit/shared/printVersion.test.d.ts.map +0 -1
  511. package/dist/test/unit/shared/printVersion.test.js +0 -39
  512. package/dist/test/unit/shared/printVersion.test.js.map +0 -1
  513. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.d.ts +0 -2
  514. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.d.ts.map +0 -1
  515. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.js +0 -108
  516. package/dist/test/unit/shared/providers/ClientTokenExchangeSessionProvider.test.js.map +0 -1
  517. package/dist/test/unit/shared/storage.test.d.ts +0 -2
  518. package/dist/test/unit/shared/storage.test.d.ts.map +0 -1
  519. package/dist/test/unit/shared/storage.test.js +0 -53
  520. package/dist/test/unit/shared/storage.test.js.map +0 -1
  521. package/dist/test/unit/utils.test.d.ts +0 -2
  522. package/dist/test/unit/utils.test.d.ts.map +0 -1
  523. package/dist/test/unit/utils.test.js +0 -40
  524. package/dist/test/unit/utils.test.js.map +0 -1
  525. package/dist/tsconfig.tsbuildinfo +0 -1
  526. package/dist/vitest.config.d.ts +0 -3
  527. package/dist/vitest.config.d.ts.map +0 -1
  528. package/dist/vitest.config.js +0 -44
  529. package/dist/vitest.config.js.map +0 -1
@@ -1,299 +0,0 @@
1
- import { NextResponse } from "next/server.js";
2
- import { revalidatePath } from "next/cache.js";
3
- import { resolveAuthConfig } from "@/nextjs/config.js";
4
- import { loggers } from "@/lib/logger.js";
5
- import { clearAuthCookies, NextjsClientStorage, NextjsCookieStorage, } from "@/nextjs/cookies.js";
6
- import { GenericPublicClientPKCEProducer } from "@/services/PKCE.js";
7
- import { resolveOAuthAccessCode } from "@/server/login.js";
8
- import { getUser } from "@/nextjs/GetUser.js";
9
- import { resolveCallbackUrl } from "@/nextjs/utils.js";
10
- import { GenericUserSession } from "@/shared/lib/UserSession.js";
11
- import { TOKEN_EXCHANGE_SUCCESS_TEXT, TOKEN_EXCHANGE_TRIGGER_TEXT, } from "@/constants.js";
12
- import { displayModeFromState, serverTokenExchangeFromState, } from "@/lib/oauth.js";
13
- import { CodeVerifier, OAuthTokens } from "@/shared/lib/types.js";
14
- import { generateOauthLogoutUrl } from "@/shared/lib/util.js";
15
- const logger = loggers.nextjs.handlers.auth;
16
- class AuthError extends Error {
17
- status;
18
- constructor(message, status = 401) {
19
- super(message);
20
- this.status = status;
21
- this.name = "AuthError";
22
- }
23
- }
24
- const getAppUrl = (request) => request.cookies.get(CodeVerifier.APP_URL)?.value ||
25
- request.nextUrl.searchParams.get("appUrl");
26
- const getIdToken = async (config) => {
27
- const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});
28
- return cookieStorage.get(OAuthTokens.ID_TOKEN);
29
- };
30
- /**
31
- * create a code verifier and challenge for PKCE
32
- * saving the verifier in a cookie for later use
33
- * @returns {Promise<NextResponse>}
34
- */
35
- async function handleChallenge(request, config) {
36
- const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});
37
- const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);
38
- const challenge = await pkceProducer.getCodeChallenge();
39
- const appUrl = request.nextUrl.searchParams.get("appUrl");
40
- if (appUrl) {
41
- cookieStorage.set(CodeVerifier.APP_URL, appUrl);
42
- }
43
- return NextResponse.json({ status: "success", challenge });
44
- }
45
- async function performTokenExchangeAndSetCookies(request, config, code, state, appUrl) {
46
- const resolvedConfigs = resolveAuthConfig(config);
47
- const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);
48
- const callbackUrl = resolveCallbackUrl(resolvedConfigs, appUrl);
49
- try {
50
- await resolveOAuthAccessCode(code, state, cookieStorage, {
51
- ...resolvedConfigs,
52
- redirectUrl: callbackUrl,
53
- });
54
- }
55
- catch (error) {
56
- logger.error("Token exchange failed:", error);
57
- throw new AuthError("Failed to authenticate user", 401);
58
- }
59
- const user = await getUser();
60
- if (!user) {
61
- throw new AuthError("Failed to get user info", 401);
62
- }
63
- const clientStorage = new NextjsClientStorage();
64
- const userSession = new GenericUserSession(clientStorage);
65
- userSession.set(user);
66
- }
67
- const generateHtmlResponseWithCallback = (request, callbackUrl) => {
68
- // we need to replace the URL with resolved config in case the server is hosted
69
- // behind a reverse proxy or load balancer
70
- const requestUrl = new URL(request.url);
71
- const fetchUrl = `${callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainCallback=true`;
72
- return new NextResponse(`<html>
73
- <body>
74
- <span style="display:none">
75
- <script>
76
- window.onload = function () {
77
- const appUrl = globalThis.window?.location?.origin;
78
- fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {
79
- response.json().then((jsonResponse) => {
80
- if (jsonResponse.redirectUrl) {
81
- window.location.href = jsonResponse.redirectUrl;
82
- }
83
- });
84
- });
85
- };
86
- </script>
87
- </span>
88
- </body>
89
- </html>
90
- `);
91
- };
92
- async function handleCallback(request, config) {
93
- const resolvedConfigs = resolveAuthConfig(config);
94
- console.log("handleCallback", { request, resolvedConfigs });
95
- const code = request.nextUrl.searchParams.get("code");
96
- const state = request.nextUrl.searchParams.get("state");
97
- if (!code || !state)
98
- throw new AuthError("Bad parameters", 400);
99
- // appUrl is passed from the client to the server in the query string
100
- // this is necessary because the server does not have access to the client's window.location.origin
101
- // and can not accurately determine the appUrl (specially if the app is behind a reverse proxy)
102
- const appUrl = getAppUrl(request);
103
- // If we have a code_verifier cookie and the appUrl, we can do a token exchange.
104
- // Otherwise, just render an empty page.
105
- // The initial redirect back from the auth server does not send cookies, because the redirect is from a 3rd-party domain.
106
- // The client will make an additional call to this route with cookies included, at which point we do the token exchange.
107
- console.log("handleCallback", {
108
- code,
109
- state,
110
- appUrl,
111
- });
112
- const codeVerifier = request.cookies.get(CodeVerifier.COOKIE_NAME);
113
- if (!codeVerifier || !appUrl) {
114
- console.log("handleCallback no code_verifier found", {
115
- state,
116
- serverTokenExchange: serverTokenExchangeFromState(`${state}`),
117
- });
118
- let response = new NextResponse(`<html><body><span style="display:none">${TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`);
119
- // in server-side token exchange mode we need to launch a page that will trigger the token exchange
120
- // from the same domain, allowing it access to the code_verifier cookie
121
- // we only need to do this in redirect mode, as the iframe already triggers a client-side token exchange
122
- // if no code-verifier cookie is found
123
- if (state && serverTokenExchangeFromState(state)) {
124
- console.log("handleCallback serverTokenExchangeFromState, launching redirect page...", {
125
- requestUrl: request.url,
126
- configCallbackUrl: resolvedConfigs.callbackUrl,
127
- });
128
- // generate a page that will callback to the same domain, allowing access
129
- // to the code_verifier cookie and passing the appUrl.
130
- response = generateHtmlResponseWithCallback(request, resolvedConfigs.callbackUrl);
131
- }
132
- response.headers.set("Content-Type", "text/html; charset=utf-8");
133
- console.log(`handleCallback no code_verifier found, returning ${TOKEN_EXCHANGE_TRIGGER_TEXT}`);
134
- return response;
135
- }
136
- await performTokenExchangeAndSetCookies(request, resolvedConfigs, code, state, appUrl);
137
- if (request.url.includes("sameDomainCallback=true")) {
138
- console.log("handleCallback sameDomainCallback = true, returnining redirectUrl", appUrl);
139
- return NextResponse.json({
140
- status: "success",
141
- redirectUrl: appUrl,
142
- });
143
- }
144
- // this is the case where a 'normal' redirect is happening
145
- if (serverTokenExchangeFromState(state)) {
146
- console.log("handleCallback serverTokenExchangeFromState, redirect to appUrl", appUrl);
147
- if (!appUrl) {
148
- throw new Error("appUrl undefined. Cannot redirect.");
149
- }
150
- return NextResponse.redirect(`${appUrl}`);
151
- }
152
- // return an empty HTML response so the iframe doesn't show any response
153
- // in the short moment between the redirect and the parent window
154
- // acknowledging the redirect and closing the iframe
155
- const response = new NextResponse(`<html><span style="display:none">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`);
156
- response.headers.set("Content-Type", "text/html; charset=utf-8");
157
- return response;
158
- }
159
- /**
160
- * If redirectPath is an absolute path, return it as-is.
161
- * Otherwise for relative paths, append it to the current domain.
162
- * @param redirectPath
163
- * @returns
164
- */
165
- const getAbsoluteRedirectPath = (redirectPath, currentBasePath) => new URL(redirectPath, currentBasePath).href;
166
- const getPostLogoutRedirectUrl = (request, config) => {
167
- const { loginUrl } = resolveAuthConfig(config);
168
- const redirectTarget = loginUrl ?? "/";
169
- // if the optional loginUrl is provided and it is an absolute URL,
170
- // use it as the redirect target
171
- const isAbsoluteRedirect = /^(https?:\/\/|www\.).+/i.test(redirectTarget);
172
- if (isAbsoluteRedirect) {
173
- return redirectTarget;
174
- }
175
- // if loginUrl is not defined, the appUrl is passed from the client to the server
176
- // in the query string or cookies. This is necessary because the server does not
177
- // have access to the client's window.location and can not accurately determine
178
- // the appUrl (specially if the app is behind a reverse proxy).
179
- const appUrl = getAppUrl(request);
180
- if (appUrl)
181
- return getAbsoluteRedirectPath(redirectTarget, appUrl);
182
- return null;
183
- };
184
- const revalidateUrlPath = async (url) => {
185
- try {
186
- const path = new URL(url).pathname;
187
- revalidatePath(path);
188
- }
189
- catch (error) {
190
- logger.warn("Failed to revalidate path after logout:", error);
191
- }
192
- };
193
- export async function handleLogout(request, config) {
194
- console.log("handleLogout", { params: request.nextUrl.searchParams });
195
- const resolvedConfigs = resolveAuthConfig(config);
196
- // read the id_token from the cookies
197
- const idToken = await getIdToken(resolvedConfigs);
198
- // read the state from the query parameters
199
- const state = request.nextUrl.searchParams.get("state");
200
- if (!state || !idToken)
201
- throw new AuthError("Bad parameters", 400);
202
- const postLogoutUrl = new URL(resolvedConfigs.logoutCallbackUrl, getAppUrl(request) || request.url);
203
- const logoutUrl = await generateOauthLogoutUrl({
204
- clientId: resolvedConfigs.clientId,
205
- idToken,
206
- state,
207
- redirectUrl: postLogoutUrl.href,
208
- oauthServer: resolvedConfigs.oauthServer,
209
- });
210
- return NextResponse.redirect(`${logoutUrl.href}`);
211
- }
212
- export async function handleLogoutCallback(request, config) {
213
- const resolvedConfigs = resolveAuthConfig(config);
214
- const state = request.nextUrl.searchParams.get("state") || "";
215
- if (!state)
216
- throw new AuthError("Bad parameters", 400);
217
- const displayMode = displayModeFromState(state, "redirect");
218
- console.log("handleLogout: clear auth cookies", { state, displayMode });
219
- await clearAuthCookies(resolvedConfigs);
220
- let response;
221
- // handle logout for iframe display mode
222
- if (displayMode === "iframe") {
223
- // try to read the token from cookies. If cookies cant be read/written
224
- // because the request cames from a cross-origin redirect,
225
- // we need to show a page that will trigger the logout from the same domain
226
- const canReadCookies = !!(await getIdToken(resolvedConfigs));
227
- if (canReadCookies || request.url.includes("sameDomainCallback=true")) {
228
- // just return success
229
- return NextResponse.json({ status: "success" });
230
- }
231
- // return a page that will trigger the logout from the same domain
232
- response = generateHtmlResponseWithCallback(request, resolvedConfigs.logoutCallbackUrl);
233
- response.headers.set("Content-Type", "text/html; charset=utf-8");
234
- return response;
235
- }
236
- // handle logout for non-iframe display mode
237
- const redirectUrl = getPostLogoutRedirectUrl(request, resolvedConfigs);
238
- if (redirectUrl) {
239
- console.log("handleLogout with redirect mode", { state, redirectUrl });
240
- // this is comming from the fetch from the HTML page returned by this handler
241
- if (request.url.includes("sameDomainCallback=true")) {
242
- console.log("handleCallback sameDomainCallback = true, returnining redirectUrl", redirectUrl);
243
- return NextResponse.json({
244
- status: "success",
245
- redirectUrl: redirectUrl,
246
- });
247
- }
248
- // just redirect to the app url
249
- response = NextResponse.redirect(`${redirectUrl}`);
250
- revalidateUrlPath(redirectUrl);
251
- }
252
- else {
253
- console.log("handleLogout no redirectUrl found", { state });
254
- response = generateHtmlResponseWithCallback(request, resolvedConfigs.logoutCallbackUrl);
255
- response.headers.set("Content-Type", "text/html; charset=utf-8");
256
- }
257
- return response;
258
- }
259
- /**
260
- * Creates an authentication handler for Next.js API routes
261
- *
262
- * Usage:
263
- * ```ts
264
- * // app/api/auth/[...civicauth]/route.ts
265
- * import { handler } from '@civic/auth/nextjs'
266
- * export const GET = handler({
267
- * // optional config overrides
268
- * })
269
- * ```
270
- */
271
- export const handler = (authConfig = {}) => async (request) => {
272
- const config = resolveAuthConfig(authConfig);
273
- try {
274
- const pathname = request.nextUrl.pathname;
275
- const pathSegments = pathname.split("/");
276
- const lastSegment = pathSegments[pathSegments.length - 1];
277
- switch (lastSegment) {
278
- case "challenge":
279
- return await handleChallenge(request, config);
280
- case "callback":
281
- return await handleCallback(request, config);
282
- case "logout":
283
- return await handleLogout(request, config);
284
- case "logoutcallback":
285
- return await handleLogoutCallback(request, config);
286
- default:
287
- throw new AuthError(`Invalid auth route: ${pathname}`, 404);
288
- }
289
- }
290
- catch (error) {
291
- logger.error("Auth handler error:", error);
292
- const status = error instanceof AuthError ? error.status : 500;
293
- const message = error instanceof Error ? error.message : "Authentication failed";
294
- const response = NextResponse.json({ error: message }, { status });
295
- clearAuthCookies(config);
296
- return response;
297
- }
298
- };
299
- //# sourceMappingURL=routeHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routeHandler.js","sourceRoot":"","sources":["../../../src/nextjs/routeHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NextRequest } from \"next/server.js\";\nimport { NextResponse } from \"next/server.js\";\nimport { revalidatePath } from \"next/cache.js\";\nimport type { AuthConfig } from \"@/nextjs/config.js\";\nimport { resolveAuthConfig } from \"@/nextjs/config.js\";\nimport { loggers } from \"@/lib/logger.js\";\nimport {\n clearAuthCookies,\n NextjsClientStorage,\n NextjsCookieStorage,\n} from \"@/nextjs/cookies.js\";\nimport { GenericPublicClientPKCEProducer } from \"@/services/PKCE.js\";\nimport { resolveOAuthAccessCode } from \"@/server/login.js\";\nimport { getUser } from \"@/nextjs/GetUser.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { GenericUserSession } from \"@/shared/lib/UserSession.js\";\nimport {\n TOKEN_EXCHANGE_SUCCESS_TEXT,\n TOKEN_EXCHANGE_TRIGGER_TEXT,\n} from \"@/constants.js\";\nimport {\n displayModeFromState,\n serverTokenExchangeFromState,\n} from \"@/lib/oauth.js\";\nimport { CodeVerifier, OAuthTokens } from \"@/shared/lib/types.js\";\nimport { generateOauthLogoutUrl } from \"@/shared/lib/util.js\";\n\nconst logger = loggers.nextjs.handlers.auth;\n\nclass AuthError extends Error {\n constructor(\n message: string,\n public readonly status: number = 401,\n ) {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\nconst getAppUrl = (request: NextRequest): string | null =>\n request.cookies.get(CodeVerifier.APP_URL)?.value ||\n request.nextUrl.searchParams.get(\"appUrl\");\n\nconst getIdToken = async (config: AuthConfig): Promise<string | null> => {\n const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});\n return cookieStorage.get(OAuthTokens.ID_TOKEN);\n};\n\n/**\n * create a code verifier and challenge for PKCE\n * saving the verifier in a cookie for later use\n * @returns {Promise<NextResponse>}\n */\nasync function handleChallenge(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});\n const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);\n\n const challenge = await pkceProducer.getCodeChallenge();\n const appUrl = request.nextUrl.searchParams.get(\"appUrl\");\n if (appUrl) {\n cookieStorage.set(CodeVerifier.APP_URL, appUrl);\n }\n return NextResponse.json({ status: \"success\", challenge });\n}\n\nasync function performTokenExchangeAndSetCookies(\n request: NextRequest,\n config: AuthConfig,\n code: string,\n state: string,\n appUrl: string,\n) {\n const resolvedConfigs = resolveAuthConfig(config);\n const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);\n\n const callbackUrl = resolveCallbackUrl(resolvedConfigs, appUrl);\n try {\n await resolveOAuthAccessCode(code, state, cookieStorage, {\n ...resolvedConfigs,\n redirectUrl: callbackUrl,\n });\n } catch (error) {\n logger.error(\"Token exchange failed:\", error);\n throw new AuthError(\"Failed to authenticate user\", 401);\n }\n\n const user = await getUser();\n if (!user) {\n throw new AuthError(\"Failed to get user info\", 401);\n }\n\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n userSession.set(user);\n}\n\nconst generateHtmlResponseWithCallback = (\n request: NextRequest,\n callbackUrl: string,\n) => {\n // we need to replace the URL with resolved config in case the server is hosted\n // behind a reverse proxy or load balancer\n const requestUrl = new URL(request.url);\n const fetchUrl = `${callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainCallback=true`;\n return new NextResponse(\n `<html>\n <body>\n <span style=\"display:none\">\n <script>\n window.onload = function () {\n const appUrl = globalThis.window?.location?.origin;\n fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {\n response.json().then((jsonResponse) => {\n if (jsonResponse.redirectUrl) {\n window.location.href = jsonResponse.redirectUrl;\n }\n });\n });\n };\n </script>\n </span>\n </body>\n </html>\n `,\n );\n};\n\nasync function handleCallback(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n console.log(\"handleCallback\", { request, resolvedConfigs });\n const code = request.nextUrl.searchParams.get(\"code\");\n const state = request.nextUrl.searchParams.get(\"state\");\n if (!code || !state) throw new AuthError(\"Bad parameters\", 400);\n\n // appUrl is passed from the client to the server in the query string\n // this is necessary because the server does not have access to the client's window.location.origin\n // and can not accurately determine the appUrl (specially if the app is behind a reverse proxy)\n const appUrl = getAppUrl(request);\n\n // If we have a code_verifier cookie and the appUrl, we can do a token exchange.\n // Otherwise, just render an empty page.\n // The initial redirect back from the auth server does not send cookies, because the redirect is from a 3rd-party domain.\n // The client will make an additional call to this route with cookies included, at which point we do the token exchange.\n console.log(\"handleCallback\", {\n code,\n state,\n appUrl,\n });\n\n const codeVerifier = request.cookies.get(CodeVerifier.COOKIE_NAME);\n\n if (!codeVerifier || !appUrl) {\n console.log(\"handleCallback no code_verifier found\", {\n state,\n serverTokenExchange: serverTokenExchangeFromState(`${state}`),\n });\n let response = new NextResponse(\n `<html><body><span style=\"display:none\">${TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`,\n );\n\n // in server-side token exchange mode we need to launch a page that will trigger the token exchange\n // from the same domain, allowing it access to the code_verifier cookie\n // we only need to do this in redirect mode, as the iframe already triggers a client-side token exchange\n // if no code-verifier cookie is found\n if (state && serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, launching redirect page...\",\n {\n requestUrl: request.url,\n configCallbackUrl: resolvedConfigs.callbackUrl,\n },\n );\n // generate a page that will callback to the same domain, allowing access\n // to the code_verifier cookie and passing the appUrl.\n response = generateHtmlResponseWithCallback(\n request,\n resolvedConfigs.callbackUrl,\n );\n }\n\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n console.log(\n `handleCallback no code_verifier found, returning ${TOKEN_EXCHANGE_TRIGGER_TEXT}`,\n );\n return response;\n }\n\n await performTokenExchangeAndSetCookies(\n request,\n resolvedConfigs,\n code,\n state,\n appUrl,\n );\n\n if (request.url.includes(\"sameDomainCallback=true\")) {\n console.log(\n \"handleCallback sameDomainCallback = true, returnining redirectUrl\",\n appUrl,\n );\n return NextResponse.json({\n status: \"success\",\n redirectUrl: appUrl,\n });\n }\n\n // this is the case where a 'normal' redirect is happening\n if (serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, redirect to appUrl\",\n appUrl,\n );\n if (!appUrl) {\n throw new Error(\"appUrl undefined. Cannot redirect.\");\n }\n return NextResponse.redirect(`${appUrl}`);\n }\n // return an empty HTML response so the iframe doesn't show any response\n // in the short moment between the redirect and the parent window\n // acknowledging the redirect and closing the iframe\n const response = new NextResponse(\n `<html><span style=\"display:none\">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`,\n );\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n return response;\n}\n\n/**\n * If redirectPath is an absolute path, return it as-is.\n * Otherwise for relative paths, append it to the current domain.\n * @param redirectPath\n * @returns\n */\nconst getAbsoluteRedirectPath = (\n redirectPath: string,\n currentBasePath: string,\n) => new URL(redirectPath, currentBasePath).href;\n\nconst getPostLogoutRedirectUrl = (\n request: NextRequest,\n config: AuthConfig,\n): string | null => {\n const { loginUrl } = resolveAuthConfig(config);\n const redirectTarget = loginUrl ?? \"/\";\n\n // if the optional loginUrl is provided and it is an absolute URL,\n // use it as the redirect target\n const isAbsoluteRedirect = /^(https?:\\/\\/|www\\.).+/i.test(redirectTarget);\n if (isAbsoluteRedirect) {\n return redirectTarget;\n }\n\n // if loginUrl is not defined, the appUrl is passed from the client to the server\n // in the query string or cookies. This is necessary because the server does not\n // have access to the client's window.location and can not accurately determine\n // the appUrl (specially if the app is behind a reverse proxy).\n const appUrl = getAppUrl(request);\n if (appUrl) return getAbsoluteRedirectPath(redirectTarget, appUrl);\n\n return null;\n};\n\nconst revalidateUrlPath = async (url: string) => {\n try {\n const path = new URL(url).pathname;\n revalidatePath(path);\n } catch (error) {\n logger.warn(\"Failed to revalidate path after logout:\", error);\n }\n};\n\nexport async function handleLogout(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n console.log(\"handleLogout\", { params: request.nextUrl.searchParams });\n const resolvedConfigs = resolveAuthConfig(config);\n\n // read the id_token from the cookies\n const idToken = await getIdToken(resolvedConfigs);\n\n // read the state from the query parameters\n const state = request.nextUrl.searchParams.get(\"state\");\n\n if (!state || !idToken) throw new AuthError(\"Bad parameters\", 400);\n\n const postLogoutUrl = new URL(\n resolvedConfigs.logoutCallbackUrl,\n getAppUrl(request) || request.url,\n );\n const logoutUrl = await generateOauthLogoutUrl({\n clientId: resolvedConfigs.clientId,\n idToken,\n state,\n redirectUrl: postLogoutUrl.href,\n oauthServer: resolvedConfigs.oauthServer,\n });\n\n return NextResponse.redirect(`${logoutUrl.href}`);\n}\n\nexport async function handleLogoutCallback(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n const state = request.nextUrl.searchParams.get(\"state\") || \"\";\n if (!state) throw new AuthError(\"Bad parameters\", 400);\n\n const displayMode = displayModeFromState(state, \"redirect\");\n\n console.log(\"handleLogout: clear auth cookies\", { state, displayMode });\n await clearAuthCookies(resolvedConfigs);\n\n let response;\n\n // handle logout for iframe display mode\n if (displayMode === \"iframe\") {\n // try to read the token from cookies. If cookies cant be read/written\n // because the request cames from a cross-origin redirect,\n // we need to show a page that will trigger the logout from the same domain\n const canReadCookies = !!(await getIdToken(resolvedConfigs));\n if (canReadCookies || request.url.includes(\"sameDomainCallback=true\")) {\n // just return success\n return NextResponse.json({ status: \"success\" });\n }\n\n // return a page that will trigger the logout from the same domain\n response = generateHtmlResponseWithCallback(\n request,\n resolvedConfigs.logoutCallbackUrl,\n );\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n return response;\n }\n\n // handle logout for non-iframe display mode\n const redirectUrl = getPostLogoutRedirectUrl(request, resolvedConfigs);\n\n if (redirectUrl) {\n console.log(\"handleLogout with redirect mode\", { state, redirectUrl });\n\n // this is comming from the fetch from the HTML page returned by this handler\n if (request.url.includes(\"sameDomainCallback=true\")) {\n console.log(\n \"handleCallback sameDomainCallback = true, returnining redirectUrl\",\n redirectUrl,\n );\n return NextResponse.json({\n status: \"success\",\n redirectUrl: redirectUrl,\n });\n }\n\n // just redirect to the app url\n response = NextResponse.redirect(`${redirectUrl}`);\n revalidateUrlPath(redirectUrl);\n } else {\n console.log(\"handleLogout no redirectUrl found\", { state });\n response = generateHtmlResponseWithCallback(\n request,\n resolvedConfigs.logoutCallbackUrl,\n );\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n }\n\n return response;\n}\n\n/**\n * Creates an authentication handler for Next.js API routes\n *\n * Usage:\n * ```ts\n * // app/api/auth/[...civicauth]/route.ts\n * import { handler } from '@civic/auth/nextjs'\n * export const GET = handler({\n * // optional config overrides\n * })\n * ```\n */\nexport const handler =\n (authConfig = {}) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const config = resolveAuthConfig(authConfig);\n\n try {\n const pathname = request.nextUrl.pathname;\n const pathSegments = pathname.split(\"/\");\n const lastSegment = pathSegments[pathSegments.length - 1];\n\n switch (lastSegment) {\n case \"challenge\":\n return await handleChallenge(request, config);\n case \"callback\":\n return await handleCallback(request, config);\n case \"logout\":\n return await handleLogout(request, config);\n case \"logoutcallback\":\n return await handleLogoutCallback(request, config);\n default:\n throw new AuthError(`Invalid auth route: ${pathname}`, 404);\n }\n } catch (error) {\n logger.error(\"Auth handler error:\", error);\n\n const status = error instanceof AuthError ? error.status : 500;\n const message =\n error instanceof Error ? error.message : \"Authentication failed\";\n\n const response = NextResponse.json({ error: message }, { status });\n\n clearAuthCookies(config);\n return response;\n }\n };\n"]}
@@ -1,3 +0,0 @@
1
- import type { AuthConfigWithDefaults } from "@/nextjs/config.js";
2
- export declare const resolveCallbackUrl: (config: AuthConfigWithDefaults, baseUrl?: string) => string;
3
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/nextjs/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,eAAO,MAAM,kBAAkB,WACrB,sBAAsB,YACpB,MAAM,KACf,MAGF,CAAC"}
@@ -1,5 +0,0 @@
1
- export const resolveCallbackUrl = (config, baseUrl) => {
2
- const callbackUrl = new URL(config?.callbackUrl, baseUrl).toString();
3
- return callbackUrl.toString();
4
- };
5
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nextjs/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAA8B,EAC9B,OAAgB,EACR,EAAE;IACV,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrE,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;AAChC,CAAC,CAAC","sourcesContent":["import type { AuthConfigWithDefaults } from \"@/nextjs/config.js\";\n\nexport const resolveCallbackUrl = (\n config: AuthConfigWithDefaults,\n baseUrl?: string,\n): string => {\n const callbackUrl = new URL(config?.callbackUrl, baseUrl).toString();\n return callbackUrl.toString();\n};\n"]}
@@ -1,8 +0,0 @@
1
- import React from "react";
2
- import type { DisplayMode } from "@/types.js";
3
- declare const SignInButton: ({ displayMode, className, }: {
4
- displayMode?: DisplayMode;
5
- className?: string;
6
- }) => React.JSX.Element;
7
- export { SignInButton };
8
- //# sourceMappingURL=SignInButton.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SignInButton.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/components/SignInButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,QAAA,MAAM,YAAY,gCAGf;IACD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sBAkBA,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,14 +0,0 @@
1
- "use client";
2
- import React from "react";
3
- import { useUser } from "@/reactjs/hooks/useUser.js";
4
- const SignInButton = ({ displayMode, className, }) => {
5
- const { signIn } = useUser();
6
- return (React.createElement("button", { "data-testid": "sign-in-button", style: {
7
- borderRadius: "9999px",
8
- border: "1px solid #6b7280",
9
- padding: "0.75rem 1rem",
10
- transition: "background-color 0.2s",
11
- }, className: className, onClick: () => signIn(displayMode) }, "Sign In"));
12
- };
13
- export { SignInButton };
14
- //# sourceMappingURL=SignInButton.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SignInButton.js","sourceRoot":"","sources":["../../../../src/reactjs/components/SignInButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,MAAM,YAAY,GAAG,CAAC,EACpB,WAAW,EACX,SAAS,GAIV,EAAE,EAAE;IACH,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;IAE7B,OAAO,CACL,+CACc,gBAAgB,EAC5B,KAAK,EAAE;YACL,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,uBAAuB;SACpC,EACD,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,cAG3B,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["\"use client\";\nimport React from \"react\";\nimport type { DisplayMode } from \"@/types.js\";\nimport { useUser } from \"@/reactjs/hooks/useUser.js\";\n\nconst SignInButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const { signIn } = useUser();\n\n return (\n <button\n data-testid=\"sign-in-button\"\n style={{\n borderRadius: \"9999px\",\n border: \"1px solid #6b7280\",\n padding: \"0.75rem 1rem\",\n transition: \"background-color 0.2s\",\n }}\n className={className}\n onClick={() => signIn(displayMode)}\n >\n Sign In\n </button>\n );\n};\n\nexport { SignInButton };\n"]}
@@ -1,6 +0,0 @@
1
- import React from "react";
2
- declare const SignOutButton: ({ className }: {
3
- className?: string;
4
- }) => React.JSX.Element;
5
- export { SignOutButton };
6
- //# sourceMappingURL=SignOutButton.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SignOutButton.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/components/SignOutButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,aAAa,kBAAmB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,sBAiB3D,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -1,14 +0,0 @@
1
- "use client";
2
- import React from "react";
3
- import { useUser } from "@/reactjs/hooks/useUser.js";
4
- const SignOutButton = ({ className }) => {
5
- const { signOut } = useUser();
6
- return (React.createElement("button", { style: {
7
- borderRadius: "9999px",
8
- border: "1px solid #6b7280",
9
- padding: "0.75rem 1rem",
10
- transition: "background-color 0.2s",
11
- }, className: className, onClick: () => signOut() }, "Sign Out"));
12
- };
13
- export { SignOutButton };
14
- //# sourceMappingURL=SignOutButton.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SignOutButton.js","sourceRoot":"","sources":["../../../../src/reactjs/components/SignOutButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,MAAM,aAAa,GAAG,CAAC,EAAE,SAAS,EAA0B,EAAE,EAAE;IAC9D,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAE9B,OAAO,CACL,gCACE,KAAK,EAAE;YACL,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,uBAAuB;SACpC,EACD,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,eAGjB,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC","sourcesContent":["\"use client\";\nimport React from \"react\";\nimport { useUser } from \"@/reactjs/hooks/useUser.js\";\n\nconst SignOutButton = ({ className }: { className?: string }) => {\n const { signOut } = useUser();\n\n return (\n <button\n style={{\n borderRadius: \"9999px\",\n border: \"1px solid #6b7280\",\n padding: \"0.75rem 1rem\",\n transition: \"background-color 0.2s\",\n }}\n className={className}\n onClick={() => signOut()}\n >\n Sign Out\n </button>\n );\n};\n\nexport { SignOutButton };\n"]}
@@ -1,6 +0,0 @@
1
- import React from "react";
2
- declare const UserButton: ({ className }: {
3
- className?: string;
4
- }) => React.JSX.Element;
5
- export { UserButton };
6
- //# sourceMappingURL=UserButton.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UserButton.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/components/UserButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAoCxE,QAAA,MAAM,UAAU,kBAAmB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,sBA+LxD,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -1,118 +0,0 @@
1
- "use client";
2
- import { useUser } from "@/reactjs/hooks/index.js";
3
- import React, { useCallback, useEffect, useRef, useState } from "react";
4
- const ChevronDown = () => (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "lucide lucide-chevron-down" },
5
- React.createElement("path", { d: "m6 9 6 6 6-6" })));
6
- const ChevronUp = () => (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "lucide lucide-chevron-up" },
7
- React.createElement("path", { d: "m18 15-6-6-6 6" })));
8
- const UserButton = ({ className }) => {
9
- const [isOpen, setIsOpen] = useState(false);
10
- const [buttonWidth, setButtonWidth] = useState(null);
11
- const { user, signIn, signOut } = useUser();
12
- const buttonRef = useRef(null);
13
- const dropdownRef = useRef(null);
14
- useEffect(() => {
15
- if (buttonRef.current) {
16
- setButtonWidth(buttonRef.current.offsetWidth);
17
- }
18
- }, [isOpen]);
19
- const handleClickOutside = useCallback((event) => {
20
- const target = event.target;
21
- if (buttonRef.current &&
22
- dropdownRef.current &&
23
- !buttonRef.current.contains(target) &&
24
- !dropdownRef.current.contains(target)) {
25
- setIsOpen(false);
26
- }
27
- }, []);
28
- const handleSignOut = useCallback(async () => {
29
- await signOut();
30
- setIsOpen(false);
31
- }, [signOut]);
32
- const handleSignIn = useCallback(async () => {
33
- await signIn();
34
- setIsOpen(false);
35
- }, [signIn]);
36
- const handleEscape = useCallback((event) => {
37
- if (event.key === "Escape") {
38
- setIsOpen(false);
39
- }
40
- }, []);
41
- useEffect(() => {
42
- if (isOpen) {
43
- window.addEventListener("click", handleClickOutside);
44
- window.addEventListener("keydown", handleEscape);
45
- }
46
- return () => {
47
- window.removeEventListener("click", handleClickOutside);
48
- window.removeEventListener("keydown", handleEscape);
49
- };
50
- }, [handleClickOutside, handleEscape, isOpen]);
51
- if (user) {
52
- return (React.createElement("div", { style: { position: "relative", width: "auto" }, id: "civic-dropdown-container" },
53
- React.createElement("button", { ref: buttonRef, style: {
54
- cursor: "pointer",
55
- display: "flex",
56
- minWidth: "10rem",
57
- alignItems: "center",
58
- justifyContent: "space-between",
59
- gap: "0.5rem",
60
- borderRadius: "9999px",
61
- border: "1px solid #6b7280",
62
- padding: "0.75rem 1rem",
63
- color: "#6b7280",
64
- background: "none",
65
- transition: "background-color 0.2s",
66
- }, className: className, onMouseEnter: (e) => (e.currentTarget.style.backgroundColor = "#f3f4f6"), onMouseLeave: (e) => (e.currentTarget.style.backgroundColor = "transparent"), onClick: () => {
67
- setIsOpen((isOpen) => !isOpen);
68
- } },
69
- user?.picture ? (React.createElement("span", { style: {
70
- position: "relative",
71
- display: "flex",
72
- height: "1.5rem",
73
- width: "1.5rem",
74
- flexShrink: 0,
75
- gap: "0.5rem",
76
- overflow: "hidden",
77
- borderRadius: "9999px",
78
- } },
79
- React.createElement("img", { style: { height: "100%", width: "100%", objectFit: "cover" }, src: user.picture, alt: user?.name || user?.email }))) : (React.createElement("span", { style: { display: "block" } })),
80
- React.createElement("span", null, user?.name || user?.email),
81
- React.createElement("span", { style: { display: "block", pointerEvents: "none" } }, isOpen ? React.createElement(ChevronUp, null) : React.createElement(ChevronDown, null))),
82
- React.createElement("div", { ref: dropdownRef, style: isOpen
83
- ? {
84
- position: "absolute",
85
- left: 0,
86
- width: buttonWidth || "auto",
87
- marginTop: "0.5rem",
88
- borderRadius: "0.5rem",
89
- backgroundColor: "white",
90
- padding: "0.5rem 0",
91
- color: "#6b7280",
92
- boxShadow: "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",
93
- }
94
- : { display: "none" } },
95
- React.createElement("ul", { style: { listStyleType: "none", margin: 0, padding: 0 } },
96
- React.createElement("li", null,
97
- React.createElement("button", { style: {
98
- display: "block",
99
- width: "100%",
100
- padding: "0.5rem 1rem",
101
- transition: "background-color 0.2s",
102
- background: "none",
103
- border: "none",
104
- textAlign: "center",
105
- cursor: "pointer",
106
- }, onClick: handleSignOut, onMouseEnter: (e) => (e.currentTarget.style.backgroundColor = "#f3f4f6"), onMouseLeave: (e) => (e.currentTarget.style.backgroundColor = "transparent") }, "Logout"))))));
107
- }
108
- return (React.createElement("button", { ref: buttonRef, "data-testid": "sign-in-button", style: {
109
- cursor: "pointer",
110
- borderRadius: "9999px",
111
- border: "1px solid #6b7280",
112
- padding: "0.75rem 1rem",
113
- background: "none",
114
- transition: "background-color 0.2s",
115
- }, className: className, onMouseEnter: (e) => (e.currentTarget.style.backgroundColor = "#f3f4f6"), onMouseLeave: (e) => (e.currentTarget.style.backgroundColor = "transparent"), onClick: handleSignIn }, "Sign in"));
116
- };
117
- export { UserButton };
118
- //# sourceMappingURL=UserButton.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UserButton.js","sourceRoot":"","sources":["../../../../src/reactjs/components/UserButton.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { useUser } from \"@/reactjs/hooks/index.js\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nconst ChevronDown = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-down\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-up\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n);\n\nconst UserButton = ({ className }: { className?: string }) => {\n const [isOpen, setIsOpen] = useState(false);\n const [buttonWidth, setButtonWidth] = useState<number | null>(null);\n const { user, signIn, signOut } = useUser();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (buttonRef.current) {\n setButtonWidth(buttonRef.current.offsetWidth);\n }\n }, [isOpen]);\n\n const handleClickOutside = useCallback((event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (\n buttonRef.current &&\n dropdownRef.current &&\n !buttonRef.current.contains(target) &&\n !dropdownRef.current.contains(target)\n ) {\n setIsOpen(false);\n }\n }, []);\n\n const handleSignOut = useCallback(async () => {\n await signOut();\n\n setIsOpen(false);\n }, [signOut]);\n\n const handleSignIn = useCallback(async () => {\n await signIn();\n\n setIsOpen(false);\n }, [signIn]);\n\n const handleEscape = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n if (isOpen) {\n window.addEventListener(\"click\", handleClickOutside);\n\n window.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n window.removeEventListener(\"click\", handleClickOutside);\n\n window.removeEventListener(\"keydown\", handleEscape);\n };\n }, [handleClickOutside, handleEscape, isOpen]);\n\n if (user) {\n return (\n <div\n style={{ position: \"relative\", width: \"auto\" }}\n id=\"civic-dropdown-container\"\n >\n <button\n ref={buttonRef}\n style={{\n cursor: \"pointer\",\n display: \"flex\",\n minWidth: \"10rem\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"0.5rem\",\n borderRadius: \"9999px\",\n border: \"1px solid #6b7280\",\n padding: \"0.75rem 1rem\",\n color: \"#6b7280\",\n background: \"none\",\n transition: \"background-color 0.2s\",\n }}\n className={className}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor = \"#f3f4f6\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor = \"transparent\")\n }\n onClick={() => {\n setIsOpen((isOpen) => !isOpen);\n }}\n >\n {user?.picture ? (\n <span\n style={{\n position: \"relative\",\n display: \"flex\",\n height: \"1.5rem\",\n width: \"1.5rem\",\n flexShrink: 0,\n gap: \"0.5rem\",\n overflow: \"hidden\",\n borderRadius: \"9999px\",\n }}\n >\n <img\n style={{ height: \"100%\", width: \"100%\", objectFit: \"cover\" }}\n src={user.picture}\n alt={user?.name || user?.email}\n />\n </span>\n ) : (\n <span style={{ display: \"block\" }} />\n )}\n\n <span>{user?.name || user?.email}</span>\n\n <span style={{ display: \"block\", pointerEvents: \"none\" }}>\n {isOpen ? <ChevronUp /> : <ChevronDown />}\n </span>\n </button>\n <div\n ref={dropdownRef}\n style={\n isOpen\n ? {\n position: \"absolute\",\n left: 0,\n width: buttonWidth || \"auto\",\n marginTop: \"0.5rem\",\n borderRadius: \"0.5rem\",\n backgroundColor: \"white\",\n padding: \"0.5rem 0\",\n color: \"#6b7280\",\n boxShadow:\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n }\n : { display: \"none\" }\n }\n >\n <ul style={{ listStyleType: \"none\", margin: 0, padding: 0 }}>\n <li>\n <button\n style={{\n display: \"block\",\n width: \"100%\",\n padding: \"0.5rem 1rem\",\n transition: \"background-color 0.2s\",\n background: \"none\",\n border: \"none\",\n textAlign: \"center\",\n cursor: \"pointer\",\n }}\n onClick={handleSignOut}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor = \"#f3f4f6\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor = \"transparent\")\n }\n >\n Logout\n </button>\n </li>\n </ul>\n </div>\n </div>\n );\n }\n\n return (\n <button\n ref={buttonRef}\n data-testid=\"sign-in-button\"\n style={{\n cursor: \"pointer\",\n borderRadius: \"9999px\",\n border: \"1px solid #6b7280\",\n padding: \"0.75rem 1rem\",\n background: \"none\",\n transition: \"background-color 0.2s\",\n }}\n className={className}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = \"#f3f4f6\")}\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor = \"transparent\")\n }\n onClick={handleSignIn}\n >\n Sign in\n </button>\n );\n};\n\nexport { UserButton };\n"]}
@@ -1,6 +0,0 @@
1
- export { CivicAuthIframe } from "@/shared/components/CivicAuthIframe.js";
2
- export { CivicAuthIframeContainer } from "@/shared/components/CivicAuthIframeContainer.js";
3
- export { UserButton } from "@/reactjs/components/UserButton.js";
4
- export { SignInButton } from "@/reactjs/components/SignInButton.js";
5
- export { SignOutButton } from "@/reactjs/components/SignOutButton.js";
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC"}
@@ -1,6 +0,0 @@
1
- export { CivicAuthIframe } from "@/shared/components/CivicAuthIframe.js";
2
- export { CivicAuthIframeContainer } from "@/shared/components/CivicAuthIframeContainer.js";
3
- export { UserButton } from "@/reactjs/components/UserButton.js";
4
- export { SignInButton } from "@/reactjs/components/SignInButton.js";
5
- export { SignOutButton } from "@/reactjs/components/SignOutButton.js";
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/reactjs/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC","sourcesContent":["export { CivicAuthIframe } from \"@/shared/components/CivicAuthIframe.js\";\nexport { CivicAuthIframeContainer } from \"@/shared/components/CivicAuthIframeContainer.js\";\nexport { UserButton } from \"@/reactjs/components/UserButton.js\";\nexport { SignInButton } from \"@/reactjs/components/SignInButton.js\";\nexport { SignOutButton } from \"@/reactjs/components/SignOutButton.js\";\n"]}