@civic/auth 0.1.4-beta.7 → 0.1.5-beta.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 (275) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +11 -8
  3. package/dist/cjs/constants.d.ts +1 -2
  4. package/dist/cjs/constants.d.ts.map +1 -1
  5. package/dist/cjs/constants.js +1 -3
  6. package/dist/cjs/constants.js.map +1 -1
  7. package/dist/cjs/lib/oauth.d.ts.map +1 -1
  8. package/dist/cjs/lib/oauth.js +1 -0
  9. package/dist/cjs/lib/oauth.js.map +1 -1
  10. package/dist/cjs/nextjs/config.d.ts +3 -0
  11. package/dist/cjs/nextjs/config.d.ts.map +1 -1
  12. package/dist/cjs/nextjs/config.js +4 -0
  13. package/dist/cjs/nextjs/config.js.map +1 -1
  14. package/dist/cjs/nextjs/hooks/useUserCookie.d.ts.map +1 -1
  15. package/dist/cjs/nextjs/hooks/useUserCookie.js +2 -0
  16. package/dist/cjs/nextjs/hooks/useUserCookie.js.map +1 -1
  17. package/dist/cjs/nextjs/providers/NextAuthProvider.d.ts +2 -2
  18. package/dist/cjs/nextjs/providers/NextAuthProvider.d.ts.map +1 -1
  19. package/dist/cjs/nextjs/providers/NextAuthProvider.js +26 -26
  20. package/dist/cjs/nextjs/providers/NextAuthProvider.js.map +1 -1
  21. package/dist/cjs/nextjs/routeHandler.d.ts +2 -1
  22. package/dist/cjs/nextjs/routeHandler.d.ts.map +1 -1
  23. package/dist/cjs/nextjs/routeHandler.js +122 -38
  24. package/dist/cjs/nextjs/routeHandler.js.map +1 -1
  25. package/dist/cjs/reactjs/components/UserButton.d.ts +1 -3
  26. package/dist/cjs/reactjs/components/UserButton.d.ts.map +1 -1
  27. package/dist/cjs/reactjs/components/UserButton.js +3 -3
  28. package/dist/cjs/reactjs/components/UserButton.js.map +1 -1
  29. package/dist/cjs/reactjs/hooks/useClientTokenExchangeSession.d.ts +3 -0
  30. package/dist/cjs/reactjs/hooks/useClientTokenExchangeSession.d.ts.map +1 -0
  31. package/dist/cjs/reactjs/hooks/useClientTokenExchangeSession.js +16 -0
  32. package/dist/cjs/reactjs/hooks/useClientTokenExchangeSession.js.map +1 -0
  33. package/dist/cjs/reactjs/providers/AuthProvider.d.ts +11 -0
  34. package/dist/cjs/reactjs/providers/AuthProvider.d.ts.map +1 -0
  35. package/dist/cjs/reactjs/providers/AuthProvider.js +108 -0
  36. package/dist/cjs/reactjs/providers/AuthProvider.js.map +1 -0
  37. package/dist/cjs/reactjs/providers/CivicAuthProvider.d.ts +6 -0
  38. package/dist/cjs/reactjs/providers/CivicAuthProvider.d.ts.map +1 -0
  39. package/dist/cjs/reactjs/providers/CivicAuthProvider.js +38 -0
  40. package/dist/cjs/reactjs/providers/CivicAuthProvider.js.map +1 -0
  41. package/dist/cjs/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts +17 -0
  42. package/dist/cjs/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts.map +1 -0
  43. package/dist/cjs/reactjs/providers/ClientTokenExchangeSessionProvider.js +185 -0
  44. package/dist/cjs/reactjs/providers/ClientTokenExchangeSessionProvider.js.map +1 -0
  45. package/dist/cjs/reactjs/providers/index.d.ts +2 -2
  46. package/dist/cjs/reactjs/providers/index.d.ts.map +1 -1
  47. package/dist/cjs/reactjs/providers/index.js +2 -2
  48. package/dist/cjs/reactjs/providers/index.js.map +1 -1
  49. package/dist/cjs/server/ServerAuthenticationResolver.d.ts +1 -0
  50. package/dist/cjs/server/ServerAuthenticationResolver.d.ts.map +1 -1
  51. package/dist/cjs/server/ServerAuthenticationResolver.js +6 -0
  52. package/dist/cjs/server/ServerAuthenticationResolver.js.map +1 -1
  53. package/dist/cjs/services/AuthenticationService.d.ts +8 -2
  54. package/dist/cjs/services/AuthenticationService.d.ts.map +1 -1
  55. package/dist/cjs/services/AuthenticationService.js +90 -11
  56. package/dist/cjs/services/AuthenticationService.js.map +1 -1
  57. package/dist/cjs/services/types.d.ts +2 -1
  58. package/dist/cjs/services/types.d.ts.map +1 -1
  59. package/dist/cjs/services/types.js.map +1 -1
  60. package/dist/cjs/shared/components/CivicAuthIframe.d.ts +1 -0
  61. package/dist/cjs/shared/components/CivicAuthIframe.d.ts.map +1 -1
  62. package/dist/cjs/shared/components/CivicAuthIframe.js +2 -3
  63. package/dist/cjs/shared/components/CivicAuthIframe.js.map +1 -1
  64. package/dist/cjs/shared/components/CivicAuthIframeContainer.d.ts +4 -0
  65. package/dist/cjs/shared/components/CivicAuthIframeContainer.d.ts.map +1 -1
  66. package/dist/cjs/shared/components/CivicAuthIframeContainer.js +7 -6
  67. package/dist/cjs/shared/components/CivicAuthIframeContainer.js.map +1 -1
  68. package/dist/cjs/shared/components/CivicAuthLogoutIframeContainer.d.ts +7 -0
  69. package/dist/cjs/shared/components/CivicAuthLogoutIframeContainer.d.ts.map +1 -0
  70. package/dist/cjs/shared/components/CivicAuthLogoutIframeContainer.js +28 -0
  71. package/dist/cjs/shared/components/CivicAuthLogoutIframeContainer.js.map +1 -0
  72. package/dist/cjs/shared/components/IFrameAndLoading.d.ts +2 -1
  73. package/dist/cjs/shared/components/IFrameAndLoading.d.ts.map +1 -1
  74. package/dist/cjs/shared/components/IFrameAndLoading.js +7 -2
  75. package/dist/cjs/shared/components/IFrameAndLoading.js.map +1 -1
  76. package/dist/cjs/shared/hooks/index.d.ts +3 -1
  77. package/dist/cjs/shared/hooks/index.d.ts.map +1 -1
  78. package/dist/cjs/shared/hooks/index.js +6 -2
  79. package/dist/cjs/shared/hooks/index.js.map +1 -1
  80. package/dist/cjs/shared/hooks/useSignIn.d.ts +3 -2
  81. package/dist/cjs/shared/hooks/useSignIn.d.ts.map +1 -1
  82. package/dist/cjs/shared/hooks/useSignIn.js +69 -14
  83. package/dist/cjs/shared/hooks/useSignIn.js.map +1 -1
  84. package/dist/cjs/shared/hooks/useWindowFocused.d.ts +5 -0
  85. package/dist/cjs/shared/hooks/useWindowFocused.d.ts.map +1 -0
  86. package/dist/cjs/shared/hooks/useWindowFocused.js +24 -0
  87. package/dist/cjs/shared/hooks/useWindowFocused.js.map +1 -0
  88. package/dist/cjs/shared/index.d.ts +1 -0
  89. package/dist/cjs/shared/index.d.ts.map +1 -1
  90. package/dist/cjs/shared/index.js +5 -3
  91. package/dist/cjs/shared/index.js.map +1 -1
  92. package/dist/cjs/shared/lib/types.d.ts +1 -0
  93. package/dist/cjs/shared/lib/types.d.ts.map +1 -1
  94. package/dist/cjs/shared/lib/types.js.map +1 -1
  95. package/dist/cjs/shared/lib/util.d.ts +3 -2
  96. package/dist/cjs/shared/lib/util.d.ts.map +1 -1
  97. package/dist/cjs/shared/lib/util.js +7 -3
  98. package/dist/cjs/shared/lib/util.js.map +1 -1
  99. package/dist/cjs/shared/providers/AuthContext.d.ts +1 -0
  100. package/dist/cjs/shared/providers/AuthContext.d.ts.map +1 -1
  101. package/dist/cjs/shared/providers/AuthContext.js.map +1 -1
  102. package/dist/cjs/shared/providers/AuthProvider.d.ts +15 -4
  103. package/dist/cjs/shared/providers/AuthProvider.d.ts.map +1 -1
  104. package/dist/cjs/shared/providers/AuthProvider.js +12 -3
  105. package/dist/cjs/shared/providers/AuthProvider.js.map +1 -1
  106. package/dist/cjs/shared/providers/CivicAuthConfigContext.d.ts +3 -1
  107. package/dist/cjs/shared/providers/CivicAuthConfigContext.d.ts.map +1 -1
  108. package/dist/cjs/shared/providers/CivicAuthConfigContext.js +10 -1
  109. package/dist/cjs/shared/providers/CivicAuthConfigContext.js.map +1 -1
  110. package/dist/cjs/shared/providers/CivicAuthProvider.d.ts +1 -1
  111. package/dist/cjs/shared/providers/CivicAuthProvider.d.ts.map +1 -1
  112. package/dist/cjs/shared/providers/CivicAuthProvider.js +2 -2
  113. package/dist/cjs/shared/providers/CivicAuthProvider.js.map +1 -1
  114. package/dist/cjs/shared/providers/ClientTokenExchangeSessionProvider.d.ts.map +1 -1
  115. package/dist/cjs/shared/providers/ClientTokenExchangeSessionProvider.js +10 -25
  116. package/dist/cjs/shared/providers/ClientTokenExchangeSessionProvider.js.map +1 -1
  117. package/dist/cjs/shared/providers/IframeProvider.d.ts +3 -0
  118. package/dist/cjs/shared/providers/IframeProvider.d.ts.map +1 -1
  119. package/dist/cjs/shared/providers/IframeProvider.js +9 -3
  120. package/dist/cjs/shared/providers/IframeProvider.js.map +1 -1
  121. package/dist/cjs/shared/providers/UserProvider.d.ts +2 -1
  122. package/dist/cjs/shared/providers/UserProvider.d.ts.map +1 -1
  123. package/dist/cjs/shared/providers/UserProvider.js +2 -1
  124. package/dist/cjs/shared/providers/UserProvider.js.map +1 -1
  125. package/dist/cjs/shared/providers/types.d.ts +3 -1
  126. package/dist/cjs/shared/providers/types.d.ts.map +1 -1
  127. package/dist/cjs/shared/providers/types.js.map +1 -1
  128. package/dist/cjs/shared/version.d.ts +1 -1
  129. package/dist/cjs/shared/version.js +1 -1
  130. package/dist/cjs/shared/version.js.map +1 -1
  131. package/dist/cjs/types.d.ts +1 -0
  132. package/dist/cjs/types.d.ts.map +1 -1
  133. package/dist/cjs/types.js.map +1 -1
  134. package/dist/cjs/version.d.ts +2 -0
  135. package/dist/cjs/version.d.ts.map +1 -0
  136. package/dist/cjs/version.js +6 -0
  137. package/dist/cjs/version.js.map +1 -0
  138. package/dist/esm/constants.d.ts +1 -2
  139. package/dist/esm/constants.d.ts.map +1 -1
  140. package/dist/esm/constants.js +1 -2
  141. package/dist/esm/constants.js.map +1 -1
  142. package/dist/esm/lib/oauth.d.ts.map +1 -1
  143. package/dist/esm/lib/oauth.js +1 -0
  144. package/dist/esm/lib/oauth.js.map +1 -1
  145. package/dist/esm/nextjs/config.d.ts +3 -0
  146. package/dist/esm/nextjs/config.d.ts.map +1 -1
  147. package/dist/esm/nextjs/config.js +4 -0
  148. package/dist/esm/nextjs/config.js.map +1 -1
  149. package/dist/esm/nextjs/hooks/useUserCookie.d.ts.map +1 -1
  150. package/dist/esm/nextjs/hooks/useUserCookie.js +2 -0
  151. package/dist/esm/nextjs/hooks/useUserCookie.js.map +1 -1
  152. package/dist/esm/nextjs/providers/NextAuthProvider.d.ts +2 -2
  153. package/dist/esm/nextjs/providers/NextAuthProvider.d.ts.map +1 -1
  154. package/dist/esm/nextjs/providers/NextAuthProvider.js +26 -26
  155. package/dist/esm/nextjs/providers/NextAuthProvider.js.map +1 -1
  156. package/dist/esm/nextjs/routeHandler.d.ts +2 -1
  157. package/dist/esm/nextjs/routeHandler.d.ts.map +1 -1
  158. package/dist/esm/nextjs/routeHandler.js +123 -40
  159. package/dist/esm/nextjs/routeHandler.js.map +1 -1
  160. package/dist/esm/reactjs/components/UserButton.d.ts +1 -3
  161. package/dist/esm/reactjs/components/UserButton.d.ts.map +1 -1
  162. package/dist/esm/reactjs/components/UserButton.js +3 -3
  163. package/dist/esm/reactjs/components/UserButton.js.map +1 -1
  164. package/dist/esm/reactjs/hooks/useClientTokenExchangeSession.d.ts +3 -0
  165. package/dist/esm/reactjs/hooks/useClientTokenExchangeSession.d.ts.map +1 -0
  166. package/dist/esm/reactjs/hooks/useClientTokenExchangeSession.js +13 -0
  167. package/dist/esm/reactjs/hooks/useClientTokenExchangeSession.js.map +1 -0
  168. package/dist/esm/reactjs/providers/AuthProvider.d.ts +11 -0
  169. package/dist/esm/reactjs/providers/AuthProvider.d.ts.map +1 -0
  170. package/dist/esm/reactjs/providers/AuthProvider.js +72 -0
  171. package/dist/esm/reactjs/providers/AuthProvider.js.map +1 -0
  172. package/dist/esm/reactjs/providers/CivicAuthProvider.d.ts +6 -0
  173. package/dist/esm/reactjs/providers/CivicAuthProvider.d.ts.map +1 -0
  174. package/dist/esm/reactjs/providers/CivicAuthProvider.js +32 -0
  175. package/dist/esm/reactjs/providers/CivicAuthProvider.js.map +1 -0
  176. package/dist/esm/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts +17 -0
  177. package/dist/esm/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts.map +1 -0
  178. package/dist/esm/reactjs/providers/ClientTokenExchangeSessionProvider.js +148 -0
  179. package/dist/esm/reactjs/providers/ClientTokenExchangeSessionProvider.js.map +1 -0
  180. package/dist/esm/reactjs/providers/index.d.ts +2 -2
  181. package/dist/esm/reactjs/providers/index.d.ts.map +1 -1
  182. package/dist/esm/reactjs/providers/index.js +2 -2
  183. package/dist/esm/reactjs/providers/index.js.map +1 -1
  184. package/dist/esm/server/ServerAuthenticationResolver.d.ts +1 -0
  185. package/dist/esm/server/ServerAuthenticationResolver.d.ts.map +1 -1
  186. package/dist/esm/server/ServerAuthenticationResolver.js +6 -0
  187. package/dist/esm/server/ServerAuthenticationResolver.js.map +1 -1
  188. package/dist/esm/services/AuthenticationService.d.ts +8 -2
  189. package/dist/esm/services/AuthenticationService.d.ts.map +1 -1
  190. package/dist/esm/services/AuthenticationService.js +90 -11
  191. package/dist/esm/services/AuthenticationService.js.map +1 -1
  192. package/dist/esm/services/types.d.ts +2 -1
  193. package/dist/esm/services/types.d.ts.map +1 -1
  194. package/dist/esm/services/types.js.map +1 -1
  195. package/dist/esm/shared/components/CivicAuthIframe.d.ts +1 -0
  196. package/dist/esm/shared/components/CivicAuthIframe.d.ts.map +1 -1
  197. package/dist/esm/shared/components/CivicAuthIframe.js +2 -3
  198. package/dist/esm/shared/components/CivicAuthIframe.js.map +1 -1
  199. package/dist/esm/shared/components/CivicAuthIframeContainer.d.ts +4 -0
  200. package/dist/esm/shared/components/CivicAuthIframeContainer.d.ts.map +1 -1
  201. package/dist/esm/shared/components/CivicAuthIframeContainer.js +7 -7
  202. package/dist/esm/shared/components/CivicAuthIframeContainer.js.map +1 -1
  203. package/dist/esm/shared/components/CivicAuthLogoutIframeContainer.d.ts +7 -0
  204. package/dist/esm/shared/components/CivicAuthLogoutIframeContainer.d.ts.map +1 -0
  205. package/dist/esm/shared/components/CivicAuthLogoutIframeContainer.js +22 -0
  206. package/dist/esm/shared/components/CivicAuthLogoutIframeContainer.js.map +1 -0
  207. package/dist/esm/shared/components/IFrameAndLoading.d.ts +2 -1
  208. package/dist/esm/shared/components/IFrameAndLoading.d.ts.map +1 -1
  209. package/dist/esm/shared/components/IFrameAndLoading.js +7 -2
  210. package/dist/esm/shared/components/IFrameAndLoading.js.map +1 -1
  211. package/dist/esm/shared/hooks/index.d.ts +3 -1
  212. package/dist/esm/shared/hooks/index.d.ts.map +1 -1
  213. package/dist/esm/shared/hooks/index.js +3 -1
  214. package/dist/esm/shared/hooks/index.js.map +1 -1
  215. package/dist/esm/shared/hooks/useSignIn.d.ts +3 -2
  216. package/dist/esm/shared/hooks/useSignIn.d.ts.map +1 -1
  217. package/dist/esm/shared/hooks/useSignIn.js +70 -15
  218. package/dist/esm/shared/hooks/useSignIn.js.map +1 -1
  219. package/dist/esm/shared/hooks/useWindowFocused.d.ts +5 -0
  220. package/dist/esm/shared/hooks/useWindowFocused.d.ts.map +1 -0
  221. package/dist/esm/shared/hooks/useWindowFocused.js +21 -0
  222. package/dist/esm/shared/hooks/useWindowFocused.js.map +1 -0
  223. package/dist/esm/shared/index.d.ts +1 -0
  224. package/dist/esm/shared/index.d.ts.map +1 -1
  225. package/dist/esm/shared/index.js +3 -2
  226. package/dist/esm/shared/index.js.map +1 -1
  227. package/dist/esm/shared/lib/types.d.ts +1 -0
  228. package/dist/esm/shared/lib/types.d.ts.map +1 -1
  229. package/dist/esm/shared/lib/types.js.map +1 -1
  230. package/dist/esm/shared/lib/util.d.ts +3 -2
  231. package/dist/esm/shared/lib/util.d.ts.map +1 -1
  232. package/dist/esm/shared/lib/util.js +7 -3
  233. package/dist/esm/shared/lib/util.js.map +1 -1
  234. package/dist/esm/shared/providers/AuthContext.d.ts +1 -0
  235. package/dist/esm/shared/providers/AuthContext.d.ts.map +1 -1
  236. package/dist/esm/shared/providers/AuthContext.js.map +1 -1
  237. package/dist/esm/shared/providers/AuthProvider.d.ts +15 -4
  238. package/dist/esm/shared/providers/AuthProvider.d.ts.map +1 -1
  239. package/dist/esm/shared/providers/AuthProvider.js +12 -3
  240. package/dist/esm/shared/providers/AuthProvider.js.map +1 -1
  241. package/dist/esm/shared/providers/CivicAuthConfigContext.d.ts +3 -1
  242. package/dist/esm/shared/providers/CivicAuthConfigContext.d.ts.map +1 -1
  243. package/dist/esm/shared/providers/CivicAuthConfigContext.js +10 -1
  244. package/dist/esm/shared/providers/CivicAuthConfigContext.js.map +1 -1
  245. package/dist/esm/shared/providers/CivicAuthProvider.d.ts +1 -1
  246. package/dist/esm/shared/providers/CivicAuthProvider.d.ts.map +1 -1
  247. package/dist/esm/shared/providers/CivicAuthProvider.js +3 -3
  248. package/dist/esm/shared/providers/CivicAuthProvider.js.map +1 -1
  249. package/dist/esm/shared/providers/ClientTokenExchangeSessionProvider.d.ts.map +1 -1
  250. package/dist/esm/shared/providers/ClientTokenExchangeSessionProvider.js +8 -23
  251. package/dist/esm/shared/providers/ClientTokenExchangeSessionProvider.js.map +1 -1
  252. package/dist/esm/shared/providers/IframeProvider.d.ts +3 -0
  253. package/dist/esm/shared/providers/IframeProvider.d.ts.map +1 -1
  254. package/dist/esm/shared/providers/IframeProvider.js +9 -3
  255. package/dist/esm/shared/providers/IframeProvider.js.map +1 -1
  256. package/dist/esm/shared/providers/UserProvider.d.ts +2 -1
  257. package/dist/esm/shared/providers/UserProvider.d.ts.map +1 -1
  258. package/dist/esm/shared/providers/UserProvider.js +2 -1
  259. package/dist/esm/shared/providers/UserProvider.js.map +1 -1
  260. package/dist/esm/shared/providers/types.d.ts +3 -1
  261. package/dist/esm/shared/providers/types.d.ts.map +1 -1
  262. package/dist/esm/shared/providers/types.js.map +1 -1
  263. package/dist/esm/shared/version.d.ts +1 -1
  264. package/dist/esm/shared/version.js +1 -1
  265. package/dist/esm/shared/version.js.map +1 -1
  266. package/dist/esm/types.d.ts +1 -0
  267. package/dist/esm/types.d.ts.map +1 -1
  268. package/dist/esm/types.js.map +1 -1
  269. package/dist/esm/version.d.ts +2 -0
  270. package/dist/esm/version.d.ts.map +1 -0
  271. package/dist/esm/version.js +3 -0
  272. package/dist/esm/version.js.map +1 -0
  273. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  274. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  275. package/package.json +6 -6
@@ -12,6 +12,7 @@ export const defaultAuthConfig = {
12
12
  callbackUrl: "/api/auth/callback",
13
13
  challengeUrl: "/api/auth/challenge",
14
14
  logoutUrl: "/api/auth/logout",
15
+ logoutCallbackUrl: "/api/auth/logoutcallback",
15
16
  loginUrl: "/",
16
17
  include: ["/*"],
17
18
  exclude: [],
@@ -95,6 +96,7 @@ export const resolveAuthConfig = (config = {}) => {
95
96
  challengeUrl: process.env._civic_auth_challenge_url,
96
97
  loginUrl: process.env._civic_auth_login_url,
97
98
  logoutUrl: process.env._civic_auth_logout_url,
99
+ logoutCallbackUrl: process.env._civic_auth_logout_callback_url,
98
100
  include: process.env._civic_auth_includes?.split(","),
99
101
  exclude: process.env._civic_auth_excludes?.split(","),
100
102
  cookies: process.env._civic_auth_cookie_config
@@ -140,6 +142,7 @@ export const resolveAuthConfig = (config = {}) => {
140
142
  * callbackUrl: '/custom/callback',
141
143
  * loginUrl: '/custom/login',
142
144
  * logoutUrl: '/custom/logout',
145
+ * logoutCallbackUrl: '/custom/logoutcallback',
143
146
  * include: ['/protected/*'],
144
147
  * exclude: ['/public/*']
145
148
  * })
@@ -163,6 +166,7 @@ export const createCivicAuthPlugin = (authConfig) => {
163
166
  _civic_auth_challenge_url: resolvedConfig.challengeUrl,
164
167
  _civic_auth_login_url: resolvedConfig.loginUrl,
165
168
  _civic_auth_logout_url: resolvedConfig.logoutUrl,
169
+ _civic_auth_logout_callback_url: resolvedConfig.logoutCallbackUrl,
166
170
  _civic_auth_includes: resolvedConfig.include.join(","),
167
171
  _civic_auth_excludes: resolvedConfig.exclude.join(","),
168
172
  _civic_auth_cookie_config: JSON.stringify(resolvedConfig.cookies),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/nextjs/config.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable turbo/no-undeclared-env-vars */\nimport type { NextConfig } from \"next\";\nimport { loggers } from \"@/lib/logger.js\";\nimport { withoutUndefined } from \"@/utils.js\";\nimport {\n CodeVerifier,\n type CookieConfig,\n OAuthTokens,\n type TokensCookieConfig,\n} from \"@/shared/lib/types.js\";\nimport { DEFAULT_AUTH_SERVER } from \"@/constants.js\";\n\nconst logger = loggers.nextjs.handlers.auth;\n\nexport type CookiesConfigObject = {\n tokens: TokensCookieConfig;\n user: CookieConfig;\n};\n\nexport type AuthConfigWithDefaults = {\n clientId: string;\n oauthServer: string;\n callbackUrl: string;\n loginUrl: string;\n logoutUrl: string;\n challengeUrl: string;\n include: string[];\n exclude: string[];\n cookies: CookiesConfigObject;\n};\n\nexport type AuthConfig = Partial<AuthConfigWithDefaults>;\n\nexport type DefinedAuthConfig = AuthConfigWithDefaults;\n\nconst defaultServerSecure = !(process.env.NODE_ENV === \"development\");\n/**\n * Default configuration values that will be used if not overridden\n */\nexport const defaultAuthConfig: Omit<AuthConfigWithDefaults, \"clientId\"> = {\n oauthServer: DEFAULT_AUTH_SERVER,\n callbackUrl: \"/api/auth/callback\",\n challengeUrl: \"/api/auth/challenge\",\n logoutUrl: \"/api/auth/logout\",\n loginUrl: \"/\",\n include: [\"/*\"],\n exclude: [],\n cookies: {\n tokens: {\n [OAuthTokens.ID_TOKEN]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [OAuthTokens.ACCESS_TOKEN]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [OAuthTokens.REFRESH_TOKEN]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [OAuthTokens.EXPIRES_IN]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [OAuthTokens.TIMESTAMP]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [CodeVerifier.COOKIE_NAME]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [CodeVerifier.APP_URL]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n },\n user: {\n secure: defaultServerSecure,\n httpOnly: false,\n sameSite: \"strict\",\n path: \"/\",\n maxAge: 60 * 60, // 1 hour\n },\n },\n};\n\n/**\n * Resolves the authentication configuration by combining:\n * 1. Default values\n * 2. Environment variables (set internally by the plugin)\n * 3. Explicitly passed configuration\n *\n * Note: Developers should not set _civic_auth_* environment variables directly.\n * Instead, pass configuration to the createCivicAuthPlugin in next.config.js:\n *\n * @example\n * ```js\n * // next.config.js\n * export default createCivicAuthPlugin({\n * callbackUrl: '/custom/callback',\n * })\n * ```\n */\nexport const resolveAuthConfig = (\n config: AuthConfig = {},\n): AuthConfigWithDefaults => {\n // Read configuration that was set by the plugin via environment variables\n const configFromEnv = withoutUndefined({\n clientId: process.env._civic_auth_client_id,\n oauthServer: process.env._civic_oauth_server,\n callbackUrl: process.env._civic_auth_callback_url,\n challengeUrl: process.env._civic_auth_challenge_url,\n loginUrl: process.env._civic_auth_login_url,\n logoutUrl: process.env._civic_auth_logout_url,\n include: process.env._civic_auth_includes?.split(\",\"),\n exclude: process.env._civic_auth_excludes?.split(\",\"),\n cookies: process.env._civic_auth_cookie_config\n ? JSON.parse(process.env._civic_auth_cookie_config)\n : undefined,\n }) as AuthConfig;\n const mergedConfig = {\n ...defaultAuthConfig,\n ...configFromEnv, // Apply plugin-set config\n ...config, // Override with directly passed config\n cookies: {\n tokens: {\n ...defaultAuthConfig.cookies.tokens,\n ...(configFromEnv?.cookies?.tokens || {}),\n ...(config.cookies?.tokens || {}),\n },\n user: {\n ...defaultAuthConfig.cookies.user,\n ...(configFromEnv?.cookies?.user || {}),\n ...(config.cookies?.user || {}),\n },\n },\n };\n\n logger.debug(\n \"Config from environment:\",\n JSON.stringify(configFromEnv, null, 2),\n );\n logger.debug(\"Resolved config:\", JSON.stringify(mergedConfig, null, 2));\n if (mergedConfig.clientId === undefined) {\n throw new Error(\"Civic Auth client ID is required\");\n }\n return mergedConfig as AuthConfigWithDefaults & { clientId: string };\n};\n\n/**\n * Creates a Next.js plugin that handles auth configuration.\n *\n * This is the main configuration point for the auth system.\n * Do not set _civic_auth_* environment variables directly - instead,\n * pass your configuration here:\n *\n * @example\n * ```js\n * // next.config.js\n * export default createCivicAuthPlugin({\n * clientId: 'my-client-id',\n * callbackUrl: '/custom/callback',\n * loginUrl: '/custom/login',\n * logoutUrl: '/custom/logout',\n * include: ['/protected/*'],\n * exclude: ['/public/*']\n * })\n * ```\n *\n * The plugin sets internal environment variables that are used by\n * the auth system. These variables should not be set manually.\n */\nexport const createCivicAuthPlugin = (\n authConfig: AuthConfig & Pick<Required<AuthConfig>, \"clientId\">,\n) => {\n return (nextConfig?: NextConfig) => {\n logger.debug(\n \"createCivicAuthPlugin nextConfig\",\n JSON.stringify(nextConfig, null, 2),\n );\n const resolvedConfig = resolveAuthConfig({ ...authConfig });\n return {\n ...nextConfig,\n env: {\n ...nextConfig?.env,\n // Internal environment variables - do not set these manually\n _civic_auth_client_id: resolvedConfig.clientId,\n _civic_oauth_server: resolvedConfig.oauthServer,\n _civic_auth_callback_url: resolvedConfig.callbackUrl,\n _civic_auth_challenge_url: resolvedConfig.challengeUrl,\n _civic_auth_login_url: resolvedConfig.loginUrl,\n _civic_auth_logout_url: resolvedConfig.logoutUrl,\n _civic_auth_includes: resolvedConfig.include.join(\",\"),\n _civic_auth_excludes: resolvedConfig.exclude.join(\",\"),\n _civic_auth_cookie_config: JSON.stringify(resolvedConfig.cookies),\n },\n };\n };\n};\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/nextjs/config.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable turbo/no-undeclared-env-vars */\nimport type { NextConfig } from \"next\";\nimport { loggers } from \"@/lib/logger.js\";\nimport { withoutUndefined } from \"@/utils.js\";\nimport {\n CodeVerifier,\n type CookieConfig,\n OAuthTokens,\n type TokensCookieConfig,\n} from \"@/shared/lib/types.js\";\nimport { DEFAULT_AUTH_SERVER } from \"@/constants.js\";\n\nconst logger = loggers.nextjs.handlers.auth;\n\nexport type CookiesConfigObject = {\n tokens: TokensCookieConfig;\n user: CookieConfig;\n};\n\nexport type AuthConfigWithDefaults = {\n clientId: string;\n oauthServer: string;\n callbackUrl: string;\n loginUrl: string;\n logoutUrl: string;\n logoutCallbackUrl: string;\n challengeUrl: string;\n include: string[];\n exclude: string[];\n cookies: CookiesConfigObject;\n};\n\nexport type AuthConfig = Partial<AuthConfigWithDefaults>;\n\nexport type DefinedAuthConfig = AuthConfigWithDefaults;\n\nconst defaultServerSecure = !(process.env.NODE_ENV === \"development\");\n/**\n * Default configuration values that will be used if not overridden\n */\nexport const defaultAuthConfig: Omit<AuthConfigWithDefaults, \"clientId\"> = {\n oauthServer: DEFAULT_AUTH_SERVER,\n callbackUrl: \"/api/auth/callback\",\n challengeUrl: \"/api/auth/challenge\",\n logoutUrl: \"/api/auth/logout\",\n logoutCallbackUrl: \"/api/auth/logoutcallback\",\n loginUrl: \"/\",\n include: [\"/*\"],\n exclude: [],\n cookies: {\n tokens: {\n [OAuthTokens.ID_TOKEN]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [OAuthTokens.ACCESS_TOKEN]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [OAuthTokens.REFRESH_TOKEN]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [OAuthTokens.EXPIRES_IN]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [OAuthTokens.TIMESTAMP]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [CodeVerifier.COOKIE_NAME]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n [CodeVerifier.APP_URL]: {\n secure: defaultServerSecure,\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n },\n },\n user: {\n secure: defaultServerSecure,\n httpOnly: false,\n sameSite: \"strict\",\n path: \"/\",\n maxAge: 60 * 60, // 1 hour\n },\n },\n};\n\n/**\n * Resolves the authentication configuration by combining:\n * 1. Default values\n * 2. Environment variables (set internally by the plugin)\n * 3. Explicitly passed configuration\n *\n * Note: Developers should not set _civic_auth_* environment variables directly.\n * Instead, pass configuration to the createCivicAuthPlugin in next.config.js:\n *\n * @example\n * ```js\n * // next.config.js\n * export default createCivicAuthPlugin({\n * callbackUrl: '/custom/callback',\n * })\n * ```\n */\nexport const resolveAuthConfig = (\n config: AuthConfig = {},\n): AuthConfigWithDefaults => {\n // Read configuration that was set by the plugin via environment variables\n const configFromEnv = withoutUndefined({\n clientId: process.env._civic_auth_client_id,\n oauthServer: process.env._civic_oauth_server,\n callbackUrl: process.env._civic_auth_callback_url,\n challengeUrl: process.env._civic_auth_challenge_url,\n loginUrl: process.env._civic_auth_login_url,\n logoutUrl: process.env._civic_auth_logout_url,\n logoutCallbackUrl: process.env._civic_auth_logout_callback_url,\n include: process.env._civic_auth_includes?.split(\",\"),\n exclude: process.env._civic_auth_excludes?.split(\",\"),\n cookies: process.env._civic_auth_cookie_config\n ? JSON.parse(process.env._civic_auth_cookie_config)\n : undefined,\n }) as AuthConfig;\n const mergedConfig = {\n ...defaultAuthConfig,\n ...configFromEnv, // Apply plugin-set config\n ...config, // Override with directly passed config\n cookies: {\n tokens: {\n ...defaultAuthConfig.cookies.tokens,\n ...(configFromEnv?.cookies?.tokens || {}),\n ...(config.cookies?.tokens || {}),\n },\n user: {\n ...defaultAuthConfig.cookies.user,\n ...(configFromEnv?.cookies?.user || {}),\n ...(config.cookies?.user || {}),\n },\n },\n };\n\n logger.debug(\n \"Config from environment:\",\n JSON.stringify(configFromEnv, null, 2),\n );\n logger.debug(\"Resolved config:\", JSON.stringify(mergedConfig, null, 2));\n if (mergedConfig.clientId === undefined) {\n throw new Error(\"Civic Auth client ID is required\");\n }\n return mergedConfig as AuthConfigWithDefaults & { clientId: string };\n};\n\n/**\n * Creates a Next.js plugin that handles auth configuration.\n *\n * This is the main configuration point for the auth system.\n * Do not set _civic_auth_* environment variables directly - instead,\n * pass your configuration here:\n *\n * @example\n * ```js\n * // next.config.js\n * export default createCivicAuthPlugin({\n * clientId: 'my-client-id',\n * callbackUrl: '/custom/callback',\n * loginUrl: '/custom/login',\n * logoutUrl: '/custom/logout',\n * logoutCallbackUrl: '/custom/logoutcallback',\n * include: ['/protected/*'],\n * exclude: ['/public/*']\n * })\n * ```\n *\n * The plugin sets internal environment variables that are used by\n * the auth system. These variables should not be set manually.\n */\nexport const createCivicAuthPlugin = (\n authConfig: AuthConfig & Pick<Required<AuthConfig>, \"clientId\">,\n) => {\n return (nextConfig?: NextConfig) => {\n logger.debug(\n \"createCivicAuthPlugin nextConfig\",\n JSON.stringify(nextConfig, null, 2),\n );\n const resolvedConfig = resolveAuthConfig({ ...authConfig });\n return {\n ...nextConfig,\n env: {\n ...nextConfig?.env,\n // Internal environment variables - do not set these manually\n _civic_auth_client_id: resolvedConfig.clientId,\n _civic_oauth_server: resolvedConfig.oauthServer,\n _civic_auth_callback_url: resolvedConfig.callbackUrl,\n _civic_auth_challenge_url: resolvedConfig.challengeUrl,\n _civic_auth_login_url: resolvedConfig.loginUrl,\n _civic_auth_logout_url: resolvedConfig.logoutUrl,\n _civic_auth_logout_callback_url: resolvedConfig.logoutCallbackUrl,\n _civic_auth_includes: resolvedConfig.include.join(\",\"),\n _civic_auth_excludes: resolvedConfig.exclude.join(\",\"),\n _civic_auth_cookie_config: JSON.stringify(resolvedConfig.cookies),\n },\n };\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useUserCookie.d.ts","sourceRoot":"","sources":["../../../../src/nextjs/hooks/useUserCookie.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAqBpD,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,WAAW;;;CAkDlD,CAAC"}
1
+ {"version":3,"file":"useUserCookie.d.ts","sourceRoot":"","sources":["../../../../src/nextjs/hooks/useUserCookie.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAqBpD,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,WAAW;;;CAqDlD,CAAC"}
@@ -42,6 +42,8 @@ export const useUserCookie = () => {
42
42
  fetchUser(abortController);
43
43
  };
44
44
  window.addEventListener("focus", handleFocus);
45
+ // call fetchUser on load to get initial user if present
46
+ fetchUser(abortController);
45
47
  return () => {
46
48
  abortController.abort();
47
49
  clearInterval(intervalId);
@@ -1 +1 @@
1
- {"version":3,"file":"useUserCookie.js","sourceRoot":"","sources":["../../../../src/nextjs/hooks/useUserCookie.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useRouter } from \"next/navigation.js\";\nimport { getWindowCookieValue } from \"@/lib/cookies.js\";\nimport type { EmptyObject, User } from \"@/types.js\";\nimport { OAuthTokens, UserStorage } from \"@/shared/lib/types.js\";\n\ntype UserAndTokenFromCookie = {\n [UserStorage.USER]: User | undefined;\n [OAuthTokens.ID_TOKEN]: string | undefined;\n};\nconst getUserAndTokenFromCookie = (): UserAndTokenFromCookie =>\n getWindowCookieValue([\n {\n key: UserStorage.USER,\n window: globalThis.window,\n parseJson: true,\n },\n {\n key: OAuthTokens.ID_TOKEN,\n window: globalThis.window,\n parseJson: false,\n },\n ]) as UserAndTokenFromCookie;\n\nexport const useUserCookie = <T extends EmptyObject>() => {\n const [user, setUser] = useState<User<T> | null>(null);\n const [idToken, setIdToken] = useState<string | undefined>();\n const hasRunRef = useRef(false);\n const router = useRouter();\n\n const fetchUser = useCallback(async (abortController: AbortController) => {\n if (abortController.signal.aborted) return;\n if (!hasRunRef.current) {\n const response = getUserAndTokenFromCookie() || {};\n const userData = response[UserStorage.USER] as User<T>;\n const tokenData = response[OAuthTokens.ID_TOKEN];\n if (abortController.signal.aborted) return;\n\n setIdToken(tokenData);\n setUser(userData || null);\n }\n }, []);\n\n useEffect(() => {\n const abortController = new AbortController();\n const intervalId = setInterval(() => {\n fetchUser(abortController);\n }, 2000);\n\n const handleFocus = () => {\n fetchUser(abortController);\n };\n\n window.addEventListener(\"focus\", handleFocus);\n\n return () => {\n abortController.abort();\n clearInterval(intervalId);\n window.removeEventListener(\"focus\", handleFocus);\n };\n }, [fetchUser]);\n\n useEffect(() => {\n if (user) {\n if (!hasRunRef.current) {\n hasRunRef.current = true;\n router.refresh();\n }\n } else {\n hasRunRef.current = false;\n }\n }, [user, router]);\n\n return { user, idToken };\n};\n"]}
1
+ {"version":3,"file":"useUserCookie.js","sourceRoot":"","sources":["../../../../src/nextjs/hooks/useUserCookie.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useRouter } from \"next/navigation.js\";\nimport { getWindowCookieValue } from \"@/lib/cookies.js\";\nimport type { EmptyObject, User } from \"@/types.js\";\nimport { OAuthTokens, UserStorage } from \"@/shared/lib/types.js\";\n\ntype UserAndTokenFromCookie = {\n [UserStorage.USER]: User | undefined;\n [OAuthTokens.ID_TOKEN]: string | undefined;\n};\nconst getUserAndTokenFromCookie = (): UserAndTokenFromCookie =>\n getWindowCookieValue([\n {\n key: UserStorage.USER,\n window: globalThis.window,\n parseJson: true,\n },\n {\n key: OAuthTokens.ID_TOKEN,\n window: globalThis.window,\n parseJson: false,\n },\n ]) as UserAndTokenFromCookie;\n\nexport const useUserCookie = <T extends EmptyObject>() => {\n const [user, setUser] = useState<User<T> | null>(null);\n const [idToken, setIdToken] = useState<string | undefined>();\n const hasRunRef = useRef(false);\n const router = useRouter();\n\n const fetchUser = useCallback(async (abortController: AbortController) => {\n if (abortController.signal.aborted) return;\n if (!hasRunRef.current) {\n const response = getUserAndTokenFromCookie() || {};\n const userData = response[UserStorage.USER] as User<T>;\n const tokenData = response[OAuthTokens.ID_TOKEN];\n if (abortController.signal.aborted) return;\n\n setIdToken(tokenData);\n setUser(userData || null);\n }\n }, []);\n\n useEffect(() => {\n const abortController = new AbortController();\n const intervalId = setInterval(() => {\n fetchUser(abortController);\n }, 2000);\n\n const handleFocus = () => {\n fetchUser(abortController);\n };\n\n window.addEventListener(\"focus\", handleFocus);\n\n // call fetchUser on load to get initial user if present\n fetchUser(abortController);\n\n return () => {\n abortController.abort();\n clearInterval(intervalId);\n window.removeEventListener(\"focus\", handleFocus);\n };\n }, [fetchUser]);\n\n useEffect(() => {\n if (user) {\n if (!hasRunRef.current) {\n hasRunRef.current = true;\n router.refresh();\n }\n } else {\n hasRunRef.current = false;\n }\n }, [user, router]);\n\n return { user, idToken };\n};\n"]}
@@ -4,10 +4,10 @@
4
4
  import React from "react";
5
5
  import { type AuthConfigWithDefaults } from "../../nextjs/config.js";
6
6
  import type { AuthProviderProps } from "../../shared/providers/types.js";
7
- type InternalNextCivicAuthProviderProps = Omit<AuthProviderProps, "clientId"> & {
7
+ type NextCivicAuthProviderInternalProps = Omit<AuthProviderProps, "clientId"> & {
8
8
  resolvedConfig: AuthConfigWithDefaults;
9
9
  };
10
- type NextCivicAuthProviderProps = Omit<InternalNextCivicAuthProviderProps, "clientId" | "resolvedConfig" | "redirectUrl">;
10
+ type NextCivicAuthProviderProps = Omit<NextCivicAuthProviderInternalProps, "clientId" | "resolvedConfig" | "redirectUrl">;
11
11
  declare const CivicNextAuthProvider: ({ children, ...props }: NextCivicAuthProviderProps) => React.JSX.Element;
12
12
  export { CivicNextAuthProvider, type NextCivicAuthProviderProps };
13
13
  //# sourceMappingURL=NextAuthProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NextAuthProvider.d.ts","sourceRoot":"","sources":["../../../../src/nextjs/providers/NextAuthProvider.tsx"],"names":[],"mappings":"AACA;;GAEG;AACH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAChE,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAgB5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,KAAK,kCAAkC,GAAG,IAAI,CAC5C,iBAAiB,EACjB,UAAU,CACX,GAAG;IACF,cAAc,EAAE,sBAAsB,CAAC;CACxC,CAAC;AACF,KAAK,0BAA0B,GAAG,IAAI,CACpC,kCAAkC,EAClC,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAC9C,CAAC;AAoEF,QAAA,MAAM,qBAAqB,2BAGxB,0BAA0B,sBA+B5B,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,CAAC"}
1
+ {"version":3,"file":"NextAuthProvider.d.ts","sourceRoot":"","sources":["../../../../src/nextjs/providers/NextAuthProvider.tsx"],"names":[],"mappings":"AACA;;GAEG;AACH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAChE,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAiB5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAMrE,KAAK,kCAAkC,GAAG,IAAI,CAC5C,iBAAiB,EACjB,UAAU,CACX,GAAG;IACF,cAAc,EAAE,sBAAsB,CAAC;CACxC,CAAC;AACF,KAAK,0BAA0B,GAAG,IAAI,CACpC,kCAAkC,EAClC,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAC9C,CAAC;AAoFF,QAAA,MAAM,qBAAqB,2BAGxB,0BAA0B,sBAwC5B,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,CAAC"}
@@ -19,51 +19,51 @@ import { IFrameAndLoading } from "../../shared/components/IFrameAndLoading.js";
19
19
  import { BlockDisplay } from "../../shared/components/BlockDisplay.js";
20
20
  import { LoadingIcon } from "../../shared/components/LoadingIcon.js";
21
21
  import { useIframe } from "../../shared/hooks/useIframe.js";
22
- const CivicNextAuthProviderInternal = ({ children, resolvedConfig, ...props }) => {
23
- const { iframeMode } = props;
22
+ import { useSession } from "../../reactjs/index.js";
23
+ const CivicNextAuthTokenProviderInternal = ({ children, isLoading, displayMode = "iframe", ...props }) => {
24
+ const { iframeMode, resolvedConfig } = props;
24
25
  const { iframeRef } = useIframe();
25
- const [isLoading, setIsLoading] = useState(false);
26
26
  const civicAuthConfig = useCivicAuthConfig();
27
- const { challengeUrl, logoutUrl } = resolvedConfig;
27
+ const { challengeUrl } = resolvedConfig;
28
28
  const pkceConsumer = new ConfidentialClientPKCEConsumer(challengeUrl);
29
- const postSignOut = async () => {
30
- const appUrl = globalThis.window.location.origin;
31
- window.location.href = `${logoutUrl}?appUrl=${appUrl}`;
32
- return;
33
- };
34
- const preSignOut = useCallback(async () => {
35
- setIsLoading(true);
29
+ const { data: session } = useSession();
30
+ const { user } = useUserCookie();
31
+ const postSignOut = useCallback(async () => {
36
32
  await props?.onSignOut?.();
37
33
  }, [props]);
38
34
  const { signIn, signOut } = useSignIn({
39
- preSignOut,
40
35
  postSignOut,
41
36
  pkceConsumer,
37
+ displayMode,
42
38
  });
43
- const { user, idToken } = useUserCookie();
44
- const session = {
45
- authenticated: !!user,
46
- idToken,
47
- };
48
39
  useEffect(() => {
49
40
  if (iframeMode === "embedded" &&
50
41
  civicAuthConfig &&
51
42
  !session?.authenticated &&
52
43
  iframeRef?.current) {
53
- signIn("iframe");
44
+ signIn();
54
45
  }
55
46
  }, [iframeMode, civicAuthConfig, session?.authenticated, iframeRef, signIn]);
47
+ return (React.createElement(TokenProvider, null,
48
+ React.createElement(UserProvider, { storage: new NextjsClientStorage(), user: user, signOut: signOut, signIn: signIn, displayMode: displayMode },
49
+ React.createElement(IFrameAndLoading, { error: null, isLoading: isLoading, showIframeOnLogout: true }),
50
+ isLoading && (React.createElement(BlockDisplay, null,
51
+ React.createElement(LoadingIcon, null))),
52
+ children)));
53
+ };
54
+ const CivicNextAuthProviderInternal = ({ children, ...props }) => {
55
+ const isLoading = false;
56
+ const { user, idToken } = useUserCookie();
57
+ const session = {
58
+ authenticated: !!user,
59
+ idToken,
60
+ };
56
61
  return (React.createElement(SessionProvider, { data: session, isLoading: isLoading },
57
- React.createElement(TokenProvider, null,
58
- React.createElement(UserProvider, { storage: new NextjsClientStorage(), user: user, signOut: signOut, signIn: signIn },
59
- React.createElement(IFrameAndLoading, { isLoading: isLoading, error: null }),
60
- isLoading && (React.createElement(BlockDisplay, null,
61
- React.createElement(LoadingIcon, null))),
62
- children))));
62
+ React.createElement(CivicNextAuthTokenProviderInternal, { ...props, isLoading: isLoading }, children)));
63
63
  };
64
64
  const CivicNextAuthProvider = ({ children, ...props }) => {
65
65
  const resolvedConfig = resolveAuthConfig();
66
- const { clientId, oauthServer, callbackUrl, challengeUrl, logoutUrl } = resolvedConfig;
66
+ const { clientId, oauthServer, callbackUrl, challengeUrl, logoutUrl, logoutCallbackUrl, } = resolvedConfig;
67
67
  const [redirectUrl, setRedirectUrl] = useState("");
68
68
  useEffect(() => {
69
69
  if (typeof globalThis.window !== "undefined") {
@@ -71,7 +71,7 @@ const CivicNextAuthProvider = ({ children, ...props }) => {
71
71
  setRedirectUrl(resolveCallbackUrl(resolvedConfig, appUrl));
72
72
  }
73
73
  }, [callbackUrl, resolvedConfig]);
74
- return (React.createElement(CivicAuthConfigProvider, { oauthServer: oauthServer, clientId: clientId, redirectUrl: redirectUrl, nonce: props?.nonce, challengeUrl: challengeUrl, logoutUrl: logoutUrl },
74
+ return (React.createElement(CivicAuthConfigProvider, { oauthServer: oauthServer, clientId: clientId, redirectUrl: redirectUrl, logoutRedirectUrl: logoutCallbackUrl, nonce: props?.nonce, challengeUrl: challengeUrl, logoutUrl: logoutUrl, logoutCallbackUrl: logoutCallbackUrl },
75
75
  React.createElement(IframeProvider, { iframeMode: props.iframeMode },
76
76
  React.createElement(CivicNextAuthProviderInternal, { ...props, resolvedConfig: resolvedConfig }, children))));
77
77
  };
@@ -1 +1 @@
1
- {"version":3,"file":"NextAuthProvider.js","sourceRoot":"","sources":["../../../../src/nextjs/providers/NextAuthProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n/**\n * A very small context provider for the user object - it takes the user object from the cookie and provides it to the app.\n */\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport {\n resolveAuthConfig,\n type AuthConfigWithDefaults,\n} from \"@/nextjs/config.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { ConfidentialClientPKCEConsumer } from \"@/services/PKCE.js\";\nimport { NextjsClientStorage } from \"@/nextjs/cookies.js\";\nimport { UserProvider } from \"@/shared/providers/UserProvider.js\";\nimport { useUserCookie } from \"@/nextjs/hooks/useUserCookie.js\";\nimport { CivicAuthConfigProvider } from \"@/shared/providers/CivicAuthConfigContext.js\";\nimport { SessionProvider } from \"@/shared/providers/SessionProvider.js\";\nimport { IframeProvider } from \"@/shared/providers/IframeProvider.js\";\nimport { TokenProvider } from \"@/shared/providers/TokenProvider.js\";\nimport { useSignIn } from \"@/shared/hooks/useSignIn.js\";\nimport { useCivicAuthConfig } from \"@/shared/hooks/useCivicAuthConfig.js\";\nimport { IFrameAndLoading } from \"@/shared/components/IFrameAndLoading.js\";\nimport { BlockDisplay } from \"@/shared/components/BlockDisplay.js\";\nimport { LoadingIcon } from \"@/shared/components/LoadingIcon.js\";\nimport { useIframe } from \"@/shared/hooks/useIframe.js\";\nimport type { AuthProviderProps } from \"@/shared/providers/types.js\";\n\ntype InternalNextCivicAuthProviderProps = Omit<\n AuthProviderProps,\n \"clientId\"\n> & {\n resolvedConfig: AuthConfigWithDefaults;\n};\ntype NextCivicAuthProviderProps = Omit<\n InternalNextCivicAuthProviderProps,\n \"clientId\" | \"resolvedConfig\" | \"redirectUrl\"\n>;\n\nconst CivicNextAuthProviderInternal = ({\n children,\n resolvedConfig,\n ...props\n}: InternalNextCivicAuthProviderProps) => {\n const { iframeMode } = props;\n const { iframeRef } = useIframe();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const civicAuthConfig = useCivicAuthConfig();\n const { challengeUrl, logoutUrl } = resolvedConfig;\n const pkceConsumer = new ConfidentialClientPKCEConsumer(challengeUrl);\n const postSignOut = async (): Promise<void> => {\n const appUrl = globalThis.window.location.origin;\n window.location.href = `${logoutUrl}?appUrl=${appUrl}`;\n return;\n };\n\n const preSignOut = useCallback(async () => {\n setIsLoading(true);\n await props?.onSignOut?.();\n }, [props]);\n\n const { signIn, signOut } = useSignIn({\n preSignOut,\n postSignOut,\n pkceConsumer,\n });\n\n const { user, idToken } = useUserCookie();\n const session = {\n authenticated: !!user,\n idToken,\n };\n\n useEffect(() => {\n if (\n iframeMode === \"embedded\" &&\n civicAuthConfig &&\n !session?.authenticated &&\n iframeRef?.current\n ) {\n signIn(\"iframe\");\n }\n }, [iframeMode, civicAuthConfig, session?.authenticated, iframeRef, signIn]);\n return (\n <SessionProvider data={session} isLoading={isLoading}>\n <TokenProvider>\n <UserProvider\n storage={new NextjsClientStorage()}\n user={user}\n signOut={signOut}\n signIn={signIn}\n >\n <IFrameAndLoading isLoading={isLoading} error={null} />\n {isLoading && (\n <BlockDisplay>\n <LoadingIcon />\n </BlockDisplay>\n )}\n {children}\n </UserProvider>\n </TokenProvider>\n </SessionProvider>\n );\n};\n\nconst CivicNextAuthProvider = ({\n children,\n ...props\n}: NextCivicAuthProviderProps) => {\n const resolvedConfig = resolveAuthConfig();\n const { clientId, oauthServer, callbackUrl, challengeUrl, logoutUrl } =\n resolvedConfig;\n const [redirectUrl, setRedirectUrl] = useState<string>(\"\");\n useEffect(() => {\n if (typeof globalThis.window !== \"undefined\") {\n const appUrl = globalThis.window.location.origin;\n setRedirectUrl(resolveCallbackUrl(resolvedConfig, appUrl));\n }\n }, [callbackUrl, resolvedConfig]);\n\n return (\n <CivicAuthConfigProvider\n oauthServer={oauthServer}\n clientId={clientId}\n redirectUrl={redirectUrl}\n nonce={props?.nonce}\n challengeUrl={challengeUrl}\n logoutUrl={logoutUrl}\n >\n <IframeProvider iframeMode={props.iframeMode}>\n <CivicNextAuthProviderInternal\n {...props}\n resolvedConfig={resolvedConfig}\n >\n {children}\n </CivicNextAuthProviderInternal>\n </IframeProvider>\n </CivicAuthConfigProvider>\n );\n};\n\nexport { CivicNextAuthProvider, type NextCivicAuthProviderProps };\n"]}
1
+ {"version":3,"file":"NextAuthProvider.js","sourceRoot":"","sources":["../../../../src/nextjs/providers/NextAuthProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb;;GAEG;AACH,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EACL,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAkBhD,MAAM,kCAAkC,GAAG,CAAC,EAC1C,QAAQ,EACR,SAAS,EACT,WAAW,GAAG,QAAQ,EACtB,GAAG,KAAK,EACgC,EAAE,EAAE;IAC5C,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,8BAA8B,CAAC,YAAY,CAAC,CAAC;IACtE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IAEvC,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE,CAAC;IAEjC,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,MAAM,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;QACpC,WAAW;QACX,YAAY;QACZ,WAAW;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IACE,UAAU,KAAK,UAAU;YACzB,eAAe;YACf,CAAC,OAAO,EAAE,aAAa;YACvB,SAAS,EAAE,OAAO,EAClB,CAAC;YACD,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAE7E,OAAO,CACL,oBAAC,aAAa;QACZ,oBAAC,YAAY,IACX,OAAO,EAAE,IAAI,mBAAmB,EAAE,EAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW;YAExB,oBAAC,gBAAgB,IACf,KAAK,EAAE,IAAI,EACX,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,IAAI,GACxB;YACD,SAAS,IAAI,CACZ,oBAAC,YAAY;gBACX,oBAAC,WAAW,OAAG,CACF,CAChB;YACA,QAAQ,CACI,CACD,CACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,EACrC,QAAQ,EACR,GAAG,KAAK,EAC2B,EAAE,EAAE;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC;IACxB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAE1C,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,CAAC,CAAC,IAAI;QACrB,OAAO;KACR,CAAC;IAEF,OAAO,CACL,oBAAC,eAAe,IAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;QAClD,oBAAC,kCAAkC,OAAK,KAAK,EAAE,SAAS,EAAE,SAAS,IAChE,QAAQ,CAC0B,CACrB,CACnB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,EAC7B,QAAQ,EACR,GAAG,KAAK,EACmB,EAAE,EAAE;IAC/B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,iBAAiB,GAClB,GAAG,cAAc,CAAC;IACnB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,cAAc,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IAElC,OAAO,CACL,oBAAC,uBAAuB,IACtB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,KAAK,EAAE,KAAK,EAAE,KAAK,EACnB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,iBAAiB;QAEpC,oBAAC,cAAc,IAAC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC1C,oBAAC,6BAA6B,OACxB,KAAK,EACT,cAAc,EAAE,cAAc,IAE7B,QAAQ,CACqB,CACjB,CACO,CAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAmC,CAAC","sourcesContent":["\"use client\";\n/**\n * A very small context provider for the user object - it takes the user object from the cookie and provides it to the app.\n */\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport {\n resolveAuthConfig,\n type AuthConfigWithDefaults,\n} from \"@/nextjs/config.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { ConfidentialClientPKCEConsumer } from \"@/services/PKCE.js\";\nimport { NextjsClientStorage } from \"@/nextjs/cookies.js\";\nimport { UserProvider } from \"@/shared/providers/UserProvider.js\";\nimport { useUserCookie } from \"@/nextjs/hooks/useUserCookie.js\";\nimport { CivicAuthConfigProvider } from \"@/shared/providers/CivicAuthConfigContext.js\";\nimport { SessionProvider } from \"@/shared/providers/SessionProvider.js\";\nimport { IframeProvider } from \"@/shared/providers/IframeProvider.js\";\nimport { TokenProvider } from \"@/shared/providers/TokenProvider.js\";\nimport { useSignIn } from \"@/shared/hooks/useSignIn.js\";\nimport { useCivicAuthConfig } from \"@/shared/hooks/useCivicAuthConfig.js\";\nimport { IFrameAndLoading } from \"@/shared/components/IFrameAndLoading.js\";\nimport { BlockDisplay } from \"@/shared/components/BlockDisplay.js\";\nimport { LoadingIcon } from \"@/shared/components/LoadingIcon.js\";\nimport { useIframe } from \"@/shared/hooks/useIframe.js\";\nimport { useSession } from \"@/reactjs/index.js\";\nimport type { AuthProviderProps } from \"@/shared/providers/types.js\";\n\ntype CivicNextAuthTokenProviderInternalProps =\n NextCivicAuthProviderInternalProps & {\n isLoading: boolean;\n };\ntype NextCivicAuthProviderInternalProps = Omit<\n AuthProviderProps,\n \"clientId\"\n> & {\n resolvedConfig: AuthConfigWithDefaults;\n};\ntype NextCivicAuthProviderProps = Omit<\n NextCivicAuthProviderInternalProps,\n \"clientId\" | \"resolvedConfig\" | \"redirectUrl\"\n>;\n\nconst CivicNextAuthTokenProviderInternal = ({\n children,\n isLoading,\n displayMode = \"iframe\",\n ...props\n}: CivicNextAuthTokenProviderInternalProps) => {\n const { iframeMode, resolvedConfig } = props;\n const { iframeRef } = useIframe();\n const civicAuthConfig = useCivicAuthConfig();\n const { challengeUrl } = resolvedConfig;\n const pkceConsumer = new ConfidentialClientPKCEConsumer(challengeUrl);\n const { data: session } = useSession();\n\n const { user } = useUserCookie();\n\n const postSignOut = useCallback(async () => {\n await props?.onSignOut?.();\n }, [props]);\n\n const { signIn, signOut } = useSignIn({\n postSignOut,\n pkceConsumer,\n displayMode,\n });\n\n useEffect(() => {\n if (\n iframeMode === \"embedded\" &&\n civicAuthConfig &&\n !session?.authenticated &&\n iframeRef?.current\n ) {\n signIn();\n }\n }, [iframeMode, civicAuthConfig, session?.authenticated, iframeRef, signIn]);\n\n return (\n <TokenProvider>\n <UserProvider\n storage={new NextjsClientStorage()}\n user={user}\n signOut={signOut}\n signIn={signIn}\n displayMode={displayMode}\n >\n <IFrameAndLoading\n error={null}\n isLoading={isLoading}\n showIframeOnLogout={true}\n />\n {isLoading && (\n <BlockDisplay>\n <LoadingIcon />\n </BlockDisplay>\n )}\n {children}\n </UserProvider>\n </TokenProvider>\n );\n};\n\nconst CivicNextAuthProviderInternal = ({\n children,\n ...props\n}: NextCivicAuthProviderInternalProps) => {\n const isLoading = false;\n const { user, idToken } = useUserCookie();\n\n const session = {\n authenticated: !!user,\n idToken,\n };\n\n return (\n <SessionProvider data={session} isLoading={isLoading}>\n <CivicNextAuthTokenProviderInternal {...props} isLoading={isLoading}>\n {children}\n </CivicNextAuthTokenProviderInternal>\n </SessionProvider>\n );\n};\n\nconst CivicNextAuthProvider = ({\n children,\n ...props\n}: NextCivicAuthProviderProps) => {\n const resolvedConfig = resolveAuthConfig();\n const {\n clientId,\n oauthServer,\n callbackUrl,\n challengeUrl,\n logoutUrl,\n logoutCallbackUrl,\n } = resolvedConfig;\n const [redirectUrl, setRedirectUrl] = useState<string>(\"\");\n\n useEffect(() => {\n if (typeof globalThis.window !== \"undefined\") {\n const appUrl = globalThis.window.location.origin;\n setRedirectUrl(resolveCallbackUrl(resolvedConfig, appUrl));\n }\n }, [callbackUrl, resolvedConfig]);\n\n return (\n <CivicAuthConfigProvider\n oauthServer={oauthServer}\n clientId={clientId}\n redirectUrl={redirectUrl}\n logoutRedirectUrl={logoutCallbackUrl}\n nonce={props?.nonce}\n challengeUrl={challengeUrl}\n logoutUrl={logoutUrl}\n logoutCallbackUrl={logoutCallbackUrl}\n >\n <IframeProvider iframeMode={props.iframeMode}>\n <CivicNextAuthProviderInternal\n {...props}\n resolvedConfig={resolvedConfig}\n >\n {children}\n </CivicNextAuthProviderInternal>\n </IframeProvider>\n </CivicAuthConfigProvider>\n );\n};\n\nexport { CivicNextAuthProvider, type NextCivicAuthProviderProps };\n"]}
@@ -1,7 +1,8 @@
1
1
  import type { NextRequest } from "next/server.js";
2
2
  import { NextResponse } from "next/server.js";
3
3
  import type { AuthConfig } from "../nextjs/config.js";
4
- export declare function handleLogout(request: NextRequest, config: AuthConfig): Promise<NextResponse>;
4
+ export declare function handleLogout(request: NextRequest, config: AuthConfig): Promise<string>;
5
+ export declare function handleLogoutCallback(request: NextRequest, config: AuthConfig): Promise<NextResponse>;
5
6
  /**
6
7
  * Creates an authentication handler for Next.js API routes
7
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"routeHandler.d.ts","sourceRoot":"","sources":["../../../src/nextjs/routeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAwNrD,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CA4BvB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,iCAEF,WAAW,KAAG,OAAO,CAAC,YAAY,CA8BjD,CAAC"}
1
+ {"version":3,"file":"routeHandler.d.ts","sourceRoot":"","sources":["../../../src/nextjs/routeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AA8QrD,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CA+CvB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,iCAEF,WAAW,KAAG,OAAO,CAAC,YAAY,CA0CjD,CAAC"}
@@ -9,8 +9,10 @@ import { getUser } from "../nextjs/GetUser.js";
9
9
  import { resolveCallbackUrl } from "../nextjs/utils.js";
10
10
  import { GenericUserSession } from "../shared/lib/UserSession.js";
11
11
  import { TOKEN_EXCHANGE_SUCCESS_TEXT, TOKEN_EXCHANGE_TRIGGER_TEXT, } from "../constants.js";
12
- import { serverTokenExchangeFromState } from "../lib/oauth.js";
13
- import { CodeVerifier } from "../shared/lib/types.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
+ import { redirect } from "next/navigation.js";
14
16
  const logger = loggers.nextjs.handlers.auth;
15
17
  class AuthError extends Error {
16
18
  status;
@@ -20,6 +22,8 @@ class AuthError extends Error {
20
22
  this.name = "AuthError";
21
23
  }
22
24
  }
25
+ const getAppUrl = (request) => request.cookies.get(CodeVerifier.APP_URL)?.value ||
26
+ request.nextUrl.searchParams.get("appUrl");
23
27
  /**
24
28
  * create a code verifier and challenge for PKCE
25
29
  * saving the verifier in a cookie for later use
@@ -57,18 +61,42 @@ async function performTokenExchangeAndSetCookies(request, config, code, state, a
57
61
  const userSession = new GenericUserSession(clientStorage);
58
62
  userSession.set(user);
59
63
  }
64
+ const generateHtmlResponseWithCallback = (request, callbackUrl) => {
65
+ // we need to replace the URL with resolved config in case the server is hosted
66
+ // behind a reverse proxy or load balancer
67
+ const requestUrl = new URL(request.url);
68
+ const fetchUrl = `${callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainServerTokenExchange=true`;
69
+ return new NextResponse(`<html>
70
+ <body>
71
+ <span style="display:none">
72
+ <script>
73
+ window.onload = function () {
74
+ const appUrl = globalThis.window?.location?.origin;
75
+ fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {
76
+ response.json().then((jsonResponse) => {
77
+ if (jsonResponse.redirectUrl) {
78
+ window.location.href = jsonResponse.redirectUrl;
79
+ }
80
+ });
81
+ });
82
+ };
83
+ </script>
84
+ </span>
85
+ </body>
86
+ </html>
87
+ `);
88
+ };
60
89
  async function handleCallback(request, config) {
61
90
  const resolvedConfigs = resolveAuthConfig(config);
62
91
  console.log("handleCallback", { request, resolvedConfigs });
63
92
  const code = request.nextUrl.searchParams.get("code");
64
- const state = request.nextUrl.searchParams.get("state") || "";
93
+ const state = request.nextUrl.searchParams.get("state");
65
94
  if (!code || !state)
66
95
  throw new AuthError("Bad parameters", 400);
67
96
  // appUrl is passed from the client to the server in the query string
68
97
  // this is necessary because the server does not have access to the client's window.location.origin
69
98
  // and can not accurately determine the appUrl (specially if the app is behind a reverse proxy)
70
- const appUrl = request.cookies.get(CodeVerifier.APP_URL)?.value ||
71
- request.nextUrl.searchParams.get("appUrl");
99
+ const appUrl = getAppUrl(request);
72
100
  // If we have a code_verifier cookie and the appUrl, we can do a token exchange.
73
101
  // Otherwise, just render an empty page.
74
102
  // The initial redirect back from the auth server does not send cookies, because the redirect is from a 3rd-party domain.
@@ -94,29 +122,9 @@ async function handleCallback(request, config) {
94
122
  requestUrl: request.url,
95
123
  configCallbackUrl: resolvedConfigs.callbackUrl,
96
124
  });
97
- // we need to replace the URL with resolved config in case the server is hosted
98
- // behind a reverse proxy or load balancer
99
- const requestUrl = new URL(request.url);
100
- const fetchUrl = `${resolvedConfigs.callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainServerTokenExchange=true`;
101
- response = new NextResponse(`<html>
102
- <body>
103
- <span style="display:none">
104
- <script>
105
- window.onload = function () {
106
- const appUrl = globalThis.window?.location?.origin;
107
- fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {
108
- response.json().then((jsonResponse) => {
109
- if (jsonResponse.redirectUrl) {
110
- window.location.href = jsonResponse.redirectUrl;
111
- }
112
- });
113
- });
114
- };
115
- </script>
116
- </span>
117
- </body>
118
- </html>
119
- `);
125
+ // generate a page that will callback to the same domain, allowing access
126
+ // to the code_verifier cookie and passing the appUrl.
127
+ response = generateHtmlResponseWithCallback(request, resolvedConfigs.callbackUrl);
120
128
  }
121
129
  response.headers.set("Content-Type", "text/html; charset=utf-8");
122
130
  console.log(`handleCallback no code_verifier found, returning ${TOKEN_EXCHANGE_TRIGGER_TEXT}`);
@@ -152,23 +160,88 @@ async function handleCallback(request, config) {
152
160
  * @returns
153
161
  */
154
162
  const getAbsoluteRedirectPath = (redirectPath, currentBasePath) => new URL(redirectPath, currentBasePath).href;
155
- export async function handleLogout(request, config) {
156
- const resolvedConfigs = resolveAuthConfig(config);
157
- const defaultRedirectPath = resolvedConfigs.loginUrl ?? "/";
158
- const redirectTarget = new URL(request.url).searchParams.get("redirect") || defaultRedirectPath;
163
+ const getPostLogoutRedirectUrl = (request, config) => {
164
+ const { loginUrl } = resolveAuthConfig(config);
165
+ const redirectTarget = loginUrl ?? "/";
166
+ // if the optional loginUrl is provided and it is an absolute URL,
167
+ // use it as the redirect target
159
168
  const isAbsoluteRedirect = /^(https?:\/\/|www\.).+/i.test(redirectTarget);
160
- const appUrl = request.nextUrl.searchParams.get("appUrl");
161
- const finalRedirectUrl = isAbsoluteRedirect
162
- ? redirectTarget
163
- : getAbsoluteRedirectPath(redirectTarget, new URL(appUrl ?? request.url).origin);
164
- const response = NextResponse.redirect(finalRedirectUrl);
165
- await clearAuthCookies(config);
169
+ if (isAbsoluteRedirect) {
170
+ return redirectTarget;
171
+ }
172
+ // if loginUrl is not defined, the appUrl is passed from the client to the server
173
+ // in the query string or cookies. This is necessary because the server does not
174
+ // have access to the client's window.location and can not accurately determine
175
+ // the appUrl (specially if the app is behind a reverse proxy).
176
+ const appUrl = getAppUrl(request);
177
+ if (appUrl)
178
+ return getAbsoluteRedirectPath(redirectTarget, appUrl);
179
+ return null;
180
+ };
181
+ const revalidateUrlPath = async (url) => {
166
182
  try {
167
- revalidatePath(isAbsoluteRedirect ? finalRedirectUrl : redirectTarget);
183
+ const path = new URL(url).pathname;
184
+ revalidatePath(path);
168
185
  }
169
186
  catch (error) {
170
187
  logger.warn("Failed to revalidate path after logout:", error);
171
188
  }
189
+ };
190
+ export async function handleLogout(request, config) {
191
+ console.log("handleLogout", { params: request.nextUrl.searchParams });
192
+ const resolvedConfigs = resolveAuthConfig(config);
193
+ // read the id_token from the cookies
194
+ const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies?.tokens ?? {});
195
+ const idToken = await cookieStorage.get(OAuthTokens.ID_TOKEN);
196
+ // read the state from the query parameters
197
+ const state = request.nextUrl.searchParams.get("state");
198
+ if (!state || !idToken)
199
+ throw new AuthError("Bad parameters", 400);
200
+ const postLogoutUrl = new URL(resolvedConfigs.logoutCallbackUrl, getAppUrl(request) || request.url);
201
+ const logoutUrl = await generateOauthLogoutUrl({
202
+ clientId: resolvedConfigs.clientId,
203
+ idToken,
204
+ state,
205
+ redirectUrl: postLogoutUrl.href,
206
+ oauthServer: resolvedConfigs.oauthServer,
207
+ });
208
+ console.log("handleLogout: redirecting to ", logoutUrl);
209
+ return logoutUrl.href;
210
+ }
211
+ export async function handleLogoutCallback(request, config) {
212
+ const resolvedConfigs = resolveAuthConfig(config);
213
+ const state = request.nextUrl.searchParams.get("state") || "";
214
+ if (!state)
215
+ throw new AuthError("Bad parameters", 400);
216
+ const displayMode = displayModeFromState(state, "redirect");
217
+ console.log("handleLogout: clear auth cookies", { state, displayMode });
218
+ await clearAuthCookies(resolvedConfigs);
219
+ // handle logout for iframe display mode
220
+ if (displayMode === "iframe") {
221
+ return NextResponse.json({ status: "success" });
222
+ }
223
+ // handle logout for non-iframe display mode
224
+ let response;
225
+ const redirectUrl = getPostLogoutRedirectUrl(request, resolvedConfigs);
226
+ if (redirectUrl) {
227
+ console.log("handleLogout with redirect mode", { state, redirectUrl });
228
+ // this is comming from the fetch from the HTML page returned by this handler
229
+ if (request.url.includes("sameDomainServerTokenExchange=true")) {
230
+ console.log("handleCallback sameDomainServerTokenExchange = true, returnining redirectUrl", redirectUrl);
231
+ return NextResponse.json({
232
+ status: "success",
233
+ redirectUrl: redirectUrl,
234
+ });
235
+ }
236
+ // just redirect to the app url
237
+ response = NextResponse.redirect(`${redirectUrl}`);
238
+ revalidateUrlPath(redirectUrl);
239
+ }
240
+ else {
241
+ console.log("handleLogout no redirectUrl found", { state });
242
+ response = generateHtmlResponseWithCallback(request, resolvedConfigs.logoutCallbackUrl);
243
+ response.headers.set("Content-Type", "text/html; charset=utf-8");
244
+ }
172
245
  return response;
173
246
  }
174
247
  /**
@@ -185,6 +258,7 @@ export async function handleLogout(request, config) {
185
258
  */
186
259
  export const handler = (authConfig = {}) => async (request) => {
187
260
  const config = resolveAuthConfig(authConfig);
261
+ let redirectUrl = null;
188
262
  try {
189
263
  const pathname = request.nextUrl.pathname;
190
264
  const pathSegments = pathname.split("/");
@@ -195,7 +269,10 @@ export const handler = (authConfig = {}) => async (request) => {
195
269
  case "callback":
196
270
  return await handleCallback(request, config);
197
271
  case "logout":
198
- return await handleLogout(request, config);
272
+ redirectUrl = await handleLogout(request, config);
273
+ break;
274
+ case "logoutcallback":
275
+ return await handleLogoutCallback(request, config);
199
276
  default:
200
277
  throw new AuthError(`Invalid auth route: ${pathname}`, 404);
201
278
  }
@@ -208,5 +285,11 @@ export const handler = (authConfig = {}) => async (request) => {
208
285
  clearAuthCookies(config);
209
286
  return response;
210
287
  }
288
+ // redirect on Nextjs must be called outside a try-catch block
289
+ // see https://nextjs.org/docs/app/api-reference/functions/redirect
290
+ if (redirectUrl)
291
+ redirect(redirectUrl);
292
+ // do nothing if no redirectUrl
293
+ return NextResponse.json({ status: "ok" });
211
294
  };
212
295
  //# sourceMappingURL=routeHandler.js.map