@civic/auth 0.1.4-beta.2 → 0.1.4-beta.3

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 (269) hide show
  1. package/CHANGELOG.md +0 -1
  2. package/README.md +8 -10
  3. package/dist/cjs/index.d.ts.map +1 -1
  4. package/dist/cjs/index.js +5 -0
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/nextjs/index.d.ts.map +1 -1
  7. package/dist/cjs/nextjs/index.js +2 -0
  8. package/dist/cjs/nextjs/index.js.map +1 -1
  9. package/dist/cjs/nextjs/providers/NextAuthProvider.js +2 -2
  10. package/dist/cjs/nextjs/providers/NextAuthProvider.js.map +1 -1
  11. package/dist/cjs/reactjs/index.d.ts.map +1 -1
  12. package/dist/cjs/reactjs/index.js +2 -0
  13. package/dist/cjs/reactjs/index.js.map +1 -1
  14. package/dist/cjs/server/index.d.ts.map +1 -1
  15. package/dist/cjs/server/index.js +2 -0
  16. package/dist/cjs/server/index.js.map +1 -1
  17. package/dist/cjs/shared/components/IFrameAndLoading.d.ts.map +1 -1
  18. package/dist/cjs/shared/components/IFrameAndLoading.js +3 -3
  19. package/dist/cjs/shared/components/IFrameAndLoading.js.map +1 -1
  20. package/dist/cjs/version.d.ts +2 -0
  21. package/dist/cjs/version.d.ts.map +1 -0
  22. package/dist/cjs/version.js +6 -0
  23. package/dist/cjs/version.js.map +1 -0
  24. package/dist/esm/index.d.ts.map +1 -1
  25. package/dist/esm/index.js +5 -1
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/nextjs/index.d.ts.map +1 -1
  28. package/dist/esm/nextjs/index.js +2 -0
  29. package/dist/esm/nextjs/index.js.map +1 -1
  30. package/dist/esm/nextjs/providers/NextAuthProvider.js +1 -1
  31. package/dist/esm/nextjs/providers/NextAuthProvider.js.map +1 -1
  32. package/dist/esm/reactjs/index.d.ts.map +1 -1
  33. package/dist/esm/reactjs/index.js +2 -0
  34. package/dist/esm/reactjs/index.js.map +1 -1
  35. package/dist/esm/server/index.d.ts.map +1 -1
  36. package/dist/esm/server/index.js +2 -0
  37. package/dist/esm/server/index.js.map +1 -1
  38. package/dist/esm/shared/components/IFrameAndLoading.d.ts.map +1 -1
  39. package/dist/esm/shared/components/IFrameAndLoading.js +3 -3
  40. package/dist/esm/shared/components/IFrameAndLoading.js.map +1 -1
  41. package/dist/esm/version.d.ts +2 -0
  42. package/dist/esm/version.d.ts.map +1 -0
  43. package/dist/esm/version.js +3 -0
  44. package/dist/esm/version.js.map +1 -0
  45. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  46. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  47. package/package.json +9 -6
  48. package/dist/src/browser/storage.d.ts +0 -9
  49. package/dist/src/browser/storage.d.ts.map +0 -1
  50. package/dist/src/browser/storage.js +0 -17
  51. package/dist/src/browser/storage.js.map +0 -1
  52. package/dist/src/config.d.ts.map +0 -1
  53. package/dist/src/index.d.ts.map +0 -1
  54. package/dist/src/lib/cookies.d.ts +0 -7
  55. package/dist/src/lib/cookies.d.ts.map +0 -1
  56. package/dist/src/lib/cookies.js +0 -25
  57. package/dist/src/lib/cookies.js.map +0 -1
  58. package/dist/src/lib/jwt.d.ts.map +0 -1
  59. package/dist/src/lib/oauth.d.ts.map +0 -1
  60. package/dist/src/lib/postMessage.d.ts.map +0 -1
  61. package/dist/src/lib/postMessage.js +0 -15
  62. package/dist/src/lib/postMessage.js.map +0 -1
  63. package/dist/src/lib/windowUtil.d.ts.map +0 -1
  64. package/dist/src/lib/windowUtil.js +0 -31
  65. package/dist/src/lib/windowUtil.js.map +0 -1
  66. package/dist/src/nextjs/GetUser.d.ts.map +0 -1
  67. package/dist/src/nextjs/GetUser.js +0 -7
  68. package/dist/src/nextjs/GetUser.js.map +0 -1
  69. package/dist/src/nextjs/config.d.ts.map +0 -1
  70. package/dist/src/nextjs/config.js +0 -173
  71. package/dist/src/nextjs/config.js.map +0 -1
  72. package/dist/src/nextjs/cookies.d.ts.map +0 -1
  73. package/dist/src/nextjs/hooks/index.d.ts +0 -2
  74. package/dist/src/nextjs/hooks/index.d.ts.map +0 -1
  75. package/dist/src/nextjs/hooks/index.js +0 -2
  76. package/dist/src/nextjs/hooks/index.js.map +0 -1
  77. package/dist/src/nextjs/hooks/useRefresh.d.ts +0 -4
  78. package/dist/src/nextjs/hooks/useRefresh.d.ts.map +0 -1
  79. package/dist/src/nextjs/hooks/useRefresh.js +0 -38
  80. package/dist/src/nextjs/hooks/useRefresh.js.map +0 -1
  81. package/dist/src/nextjs/hooks/useTokenCookie.d.ts +0 -3
  82. package/dist/src/nextjs/hooks/useTokenCookie.d.ts.map +0 -1
  83. package/dist/src/nextjs/hooks/useTokenCookie.js +0 -37
  84. package/dist/src/nextjs/hooks/useTokenCookie.js.map +0 -1
  85. package/dist/src/nextjs/hooks/useUserCookie.d.ts +0 -6
  86. package/dist/src/nextjs/hooks/useUserCookie.d.ts.map +0 -1
  87. package/dist/src/nextjs/hooks/useUserCookie.js +0 -64
  88. package/dist/src/nextjs/hooks/useUserCookie.js.map +0 -1
  89. package/dist/src/nextjs/index.d.ts.map +0 -1
  90. package/dist/src/nextjs/middleware/index.d.ts.map +0 -1
  91. package/dist/src/nextjs/middleware.d.ts.map +0 -1
  92. package/dist/src/nextjs/providers/NextAuthProvider.d.ts +0 -13
  93. package/dist/src/nextjs/providers/NextAuthProvider.d.ts.map +0 -1
  94. package/dist/src/nextjs/providers/NextAuthProvider.js +0 -79
  95. package/dist/src/nextjs/providers/NextAuthProvider.js.map +0 -1
  96. package/dist/src/nextjs/routeHandler.d.ts.map +0 -1
  97. package/dist/src/nextjs/routeHandler.js +0 -212
  98. package/dist/src/nextjs/routeHandler.js.map +0 -1
  99. package/dist/src/nextjs/utils.d.ts.map +0 -1
  100. package/dist/src/reactjs/components/SignInButton.d.ts.map +0 -1
  101. package/dist/src/reactjs/components/SignOutButton.d.ts.map +0 -1
  102. package/dist/src/reactjs/components/UserButton.d.ts.map +0 -1
  103. package/dist/src/reactjs/components/UserButton.js +0 -118
  104. package/dist/src/reactjs/components/UserButton.js.map +0 -1
  105. package/dist/src/reactjs/components/index.d.ts.map +0 -1
  106. package/dist/src/reactjs/hooks/index.d.ts +0 -6
  107. package/dist/src/reactjs/hooks/index.d.ts.map +0 -1
  108. package/dist/src/reactjs/hooks/index.js +0 -6
  109. package/dist/src/reactjs/hooks/index.js.map +0 -1
  110. package/dist/src/reactjs/hooks/useAuth.d.ts.map +0 -1
  111. package/dist/src/reactjs/hooks/useRefresh.d.ts +0 -4
  112. package/dist/src/reactjs/hooks/useRefresh.d.ts.map +0 -1
  113. package/dist/src/reactjs/hooks/useRefresh.js +0 -28
  114. package/dist/src/reactjs/hooks/useRefresh.js.map +0 -1
  115. package/dist/src/reactjs/hooks/useUser.d.ts.map +0 -1
  116. package/dist/src/reactjs/index.d.ts.map +0 -1
  117. package/dist/src/reactjs/providers/index.d.ts.map +0 -1
  118. package/dist/src/server/ServerAuthenticationResolver.d.ts.map +0 -1
  119. package/dist/src/server/config.d.ts.map +0 -1
  120. package/dist/src/server/index.d.ts.map +0 -1
  121. package/dist/src/server/login.d.ts.map +0 -1
  122. package/dist/src/server/refresh.d.ts.map +0 -1
  123. package/dist/src/services/AuthenticationService.d.ts +0 -90
  124. package/dist/src/services/AuthenticationService.d.ts.map +0 -1
  125. package/dist/src/services/AuthenticationService.js +0 -243
  126. package/dist/src/services/AuthenticationService.js.map +0 -1
  127. package/dist/src/services/PKCE.d.ts.map +0 -1
  128. package/dist/src/services/types.d.ts.map +0 -1
  129. package/dist/src/shared/components/BlockDisplay.d.ts +0 -7
  130. package/dist/src/shared/components/BlockDisplay.d.ts.map +0 -1
  131. package/dist/src/shared/components/BlockDisplay.js +0 -25
  132. package/dist/src/shared/components/BlockDisplay.js.map +0 -1
  133. package/dist/src/shared/components/CivicAuthIframe.d.ts.map +0 -1
  134. package/dist/src/shared/components/CivicAuthIframe.js +0 -9
  135. package/dist/src/shared/components/CivicAuthIframe.js.map +0 -1
  136. package/dist/src/shared/components/CivicAuthIframeContainer.d.ts.map +0 -1
  137. package/dist/src/shared/components/CivicAuthIframeContainer.js +0 -138
  138. package/dist/src/shared/components/CivicAuthIframeContainer.js.map +0 -1
  139. package/dist/src/shared/components/IFrameAndLoading.d.ts +0 -7
  140. package/dist/src/shared/components/IFrameAndLoading.d.ts.map +0 -1
  141. package/dist/src/shared/components/IFrameAndLoading.js +0 -22
  142. package/dist/src/shared/components/IFrameAndLoading.js.map +0 -1
  143. package/dist/src/shared/hooks/index.d.ts +0 -9
  144. package/dist/src/shared/hooks/index.d.ts.map +0 -1
  145. package/dist/src/shared/hooks/index.js +0 -9
  146. package/dist/src/shared/hooks/index.js.map +0 -1
  147. package/dist/src/shared/hooks/useAuth.d.ts.map +0 -1
  148. package/dist/src/shared/hooks/useCivicAuthConfig.d.ts +0 -3
  149. package/dist/src/shared/hooks/useCivicAuthConfig.d.ts.map +0 -1
  150. package/dist/src/shared/hooks/useCivicAuthConfig.js +0 -10
  151. package/dist/src/shared/hooks/useCivicAuthConfig.js.map +0 -1
  152. package/dist/src/shared/hooks/useClientTokenExchangeSession.d.ts +0 -3
  153. package/dist/src/shared/hooks/useClientTokenExchangeSession.d.ts.map +0 -1
  154. package/dist/src/shared/hooks/useClientTokenExchangeSession.js +0 -13
  155. package/dist/src/shared/hooks/useClientTokenExchangeSession.js.map +0 -1
  156. package/dist/src/shared/hooks/useConfig.d.ts +0 -3
  157. package/dist/src/shared/hooks/useConfig.d.ts.map +0 -1
  158. package/dist/src/shared/hooks/useConfig.js +0 -13
  159. package/dist/src/shared/hooks/useConfig.js.map +0 -1
  160. package/dist/src/shared/hooks/useCurrentUrl.d.ts +0 -3
  161. package/dist/src/shared/hooks/useCurrentUrl.d.ts.map +0 -1
  162. package/dist/src/shared/hooks/useCurrentUrl.js +0 -24
  163. package/dist/src/shared/hooks/useCurrentUrl.js.map +0 -1
  164. package/dist/src/shared/hooks/useIframe.d.ts.map +0 -1
  165. package/dist/src/shared/hooks/useIsInIframe.d.ts +0 -3
  166. package/dist/src/shared/hooks/useIsInIframe.d.ts.map +0 -1
  167. package/dist/src/shared/hooks/useIsInIframe.js +0 -14
  168. package/dist/src/shared/hooks/useIsInIframe.js.map +0 -1
  169. package/dist/src/shared/hooks/useOAuthEndpoints.d.ts +0 -4
  170. package/dist/src/shared/hooks/useOAuthEndpoints.d.ts.map +0 -1
  171. package/dist/src/shared/hooks/useOAuthEndpoints.js +0 -14
  172. package/dist/src/shared/hooks/useOAuthEndpoints.js.map +0 -1
  173. package/dist/src/shared/hooks/useRefresh.d.ts +0 -4
  174. package/dist/src/shared/hooks/useRefresh.d.ts.map +0 -1
  175. package/dist/src/shared/hooks/useRefresh.js +0 -38
  176. package/dist/src/shared/hooks/useRefresh.js.map +0 -1
  177. package/dist/src/shared/hooks/useSession.d.ts +0 -3
  178. package/dist/src/shared/hooks/useSession.d.ts.map +0 -1
  179. package/dist/src/shared/hooks/useSignIn.d.ts +0 -14
  180. package/dist/src/shared/hooks/useSignIn.d.ts.map +0 -1
  181. package/dist/src/shared/hooks/useSignIn.js +0 -71
  182. package/dist/src/shared/hooks/useSignIn.js.map +0 -1
  183. package/dist/src/shared/hooks/useToken.d.ts.map +0 -1
  184. package/dist/src/shared/lib/GenericAuthenticationRefresher.d.ts +0 -20
  185. package/dist/src/shared/lib/GenericAuthenticationRefresher.d.ts.map +0 -1
  186. package/dist/src/shared/lib/GenericAuthenticationRefresher.js +0 -73
  187. package/dist/src/shared/lib/GenericAuthenticationRefresher.js.map +0 -1
  188. package/dist/src/shared/lib/UserSession.d.ts.map +0 -1
  189. package/dist/src/shared/lib/session.d.ts +0 -3
  190. package/dist/src/shared/lib/session.d.ts.map +0 -1
  191. package/dist/src/shared/lib/session.js +0 -21
  192. package/dist/src/shared/lib/session.js.map +0 -1
  193. package/dist/src/shared/lib/storage.d.ts.map +0 -1
  194. package/dist/src/shared/lib/types.d.ts +0 -35
  195. package/dist/src/shared/lib/types.d.ts.map +0 -1
  196. package/dist/src/shared/lib/types.js +0 -18
  197. package/dist/src/shared/lib/types.js.map +0 -1
  198. package/dist/src/shared/lib/util.d.ts.map +0 -1
  199. package/dist/src/shared/lib/util.js +0 -133
  200. package/dist/src/shared/lib/util.js.map +0 -1
  201. package/dist/src/shared/providers/AuthContext.d.ts.map +0 -1
  202. package/dist/src/shared/providers/AuthProvider.d.ts +0 -21
  203. package/dist/src/shared/providers/AuthProvider.d.ts.map +0 -1
  204. package/dist/src/shared/providers/AuthProvider.js +0 -63
  205. package/dist/src/shared/providers/AuthProvider.js.map +0 -1
  206. package/dist/src/shared/providers/CivicAuthConfigContext.d.ts +0 -16
  207. package/dist/src/shared/providers/CivicAuthConfigContext.d.ts.map +0 -1
  208. package/dist/src/shared/providers/CivicAuthConfigContext.js +0 -43
  209. package/dist/src/shared/providers/CivicAuthConfigContext.js.map +0 -1
  210. package/dist/src/shared/providers/CivicAuthProvider.d.ts.map +0 -1
  211. package/dist/src/shared/providers/CivicAuthProvider.js +0 -32
  212. package/dist/src/shared/providers/CivicAuthProvider.js.map +0 -1
  213. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.d.ts +0 -17
  214. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.d.ts.map +0 -1
  215. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.js +0 -146
  216. package/dist/src/shared/providers/ClientTokenExchangeSessionProvider.js.map +0 -1
  217. package/dist/src/shared/providers/ConfigProvider.d.ts +0 -21
  218. package/dist/src/shared/providers/ConfigProvider.d.ts.map +0 -1
  219. package/dist/src/shared/providers/ConfigProvider.js +0 -19
  220. package/dist/src/shared/providers/ConfigProvider.js.map +0 -1
  221. package/dist/src/shared/providers/IframeProvider.d.ts +0 -19
  222. package/dist/src/shared/providers/IframeProvider.d.ts.map +0 -1
  223. package/dist/src/shared/providers/IframeProvider.js +0 -29
  224. package/dist/src/shared/providers/IframeProvider.js.map +0 -1
  225. package/dist/src/shared/providers/SessionProvider.d.ts +0 -19
  226. package/dist/src/shared/providers/SessionProvider.d.ts.map +0 -1
  227. package/dist/src/shared/providers/SessionProvider.js +0 -23
  228. package/dist/src/shared/providers/SessionProvider.js.map +0 -1
  229. package/dist/src/shared/providers/TokenProvider.d.ts.map +0 -1
  230. package/dist/src/shared/providers/TokenProvider.js +0 -42
  231. package/dist/src/shared/providers/TokenProvider.js.map +0 -1
  232. package/dist/src/shared/providers/UserProvider.d.ts +0 -20
  233. package/dist/src/shared/providers/UserProvider.d.ts.map +0 -1
  234. package/dist/src/shared/providers/UserProvider.js +0 -51
  235. package/dist/src/shared/providers/UserProvider.js.map +0 -1
  236. package/dist/src/types.d.ts +0 -146
  237. package/dist/src/types.d.ts.map +0 -1
  238. package/dist/src/types.js +0 -4
  239. package/dist/src/types.js.map +0 -1
  240. package/dist/test/integration/sdk.test.d.ts.map +0 -1
  241. package/dist/test/integration/sdk.test.js +0 -189
  242. package/dist/test/integration/sdk.test.js.map +0 -1
  243. package/dist/test/unit/lib/oauth.test.d.ts.map +0 -1
  244. package/dist/test/unit/nextjs/NextAuthProvider.test.d.ts.map +0 -1
  245. package/dist/test/unit/nextjs/NextAuthProvider.test.js +0 -31
  246. package/dist/test/unit/nextjs/NextAuthProvider.test.js.map +0 -1
  247. package/dist/test/unit/nextjs/config.test.d.ts.map +0 -1
  248. package/dist/test/unit/nextjs/getUser.test.d.ts.map +0 -1
  249. package/dist/test/unit/nextjs/getUser.test.js +0 -22
  250. package/dist/test/unit/nextjs/getUser.test.js.map +0 -1
  251. package/dist/test/unit/nextjs/middleware.test.d.ts.map +0 -1
  252. package/dist/test/unit/nextjs/utils.test.d.ts.map +0 -1
  253. package/dist/test/unit/publicApi/apiSnapshot.test.d.ts.map +0 -1
  254. package/dist/test/unit/react/components/SignInButton.test.d.ts.map +0 -1
  255. package/dist/test/unit/react/components/SignOutButton.test.d.ts.map +0 -1
  256. package/dist/test/unit/server/login.test.d.ts.map +0 -1
  257. package/dist/test/unit/server/refresh.test.d.ts.map +0 -1
  258. package/dist/test/unit/server/session.test.d.ts.map +0 -1
  259. package/dist/test/unit/services/AuthenticationService.test.d.ts.map +0 -1
  260. package/dist/test/unit/services/AuthenticationService.test.js +0 -121
  261. package/dist/test/unit/services/AuthenticationService.test.js.map +0 -1
  262. package/dist/test/unit/services/ServerAuthenticationResolver.test.d.ts.map +0 -1
  263. package/dist/test/unit/shared/GenericAuthenticationRefresher.test.d.ts.map +0 -1
  264. package/dist/test/unit/shared/UserSession.test.d.ts.map +0 -1
  265. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.d.ts.map +0 -1
  266. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.js +0 -122
  267. package/dist/test/unit/shared/components/CivicAuthIframeContainer.test.js.map +0 -1
  268. package/dist/test/unit/shared/storage.test.d.ts.map +0 -1
  269. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -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 { useUser } from "@/reactjs/hooks/useUser.js";
2
- export { useToken } from "@/shared/hooks/useToken.js";
3
- export { useAuth } from "@/shared/hooks/useAuth.js";
4
- export { useSession } from "@/shared/hooks/useSession.js";
5
- export { useIframe } from "@/shared/hooks/useIframe.js";
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC"}
@@ -1,6 +0,0 @@
1
- export { useUser } from "@/reactjs/hooks/useUser.js";
2
- export { useToken } from "@/shared/hooks/useToken.js";
3
- export { useAuth } from "@/shared/hooks/useAuth.js";
4
- export { useSession } from "@/shared/hooks/useSession.js";
5
- export { useIframe } from "@/shared/hooks/useIframe.js";
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/reactjs/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC","sourcesContent":["export { useUser } from \"@/reactjs/hooks/useUser.js\";\nexport { useToken } from \"@/shared/hooks/useToken.js\";\nexport { useAuth } from \"@/shared/hooks/useAuth.js\";\nexport { useSession } from \"@/shared/hooks/useSession.js\";\nexport { useIframe } from \"@/shared/hooks/useIframe.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/hooks/useAuth.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,OAAO,mEAQZ,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { SessionData } from "@/types.js";
2
- declare const useRefresh: (session: SessionData | null) => void;
3
- export { useRefresh };
4
- //# sourceMappingURL=useRefresh.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useRefresh.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/hooks/useRefresh.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,QAAA,MAAM,UAAU,YAAa,WAAW,GAAG,IAAI,SA2B9C,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -1,28 +0,0 @@
1
- import { LocalStorageAdapter } from "@/browser/storage.js";
2
- import { useEffect, useMemo, useState } from "react";
3
- import { useCivicAuthConfig } from "./useCivicAuthConfig.js";
4
- const useRefresh = (session) => {
5
- const authConfig = useCivicAuthConfig();
6
- const storage = useMemo(() => new LocalStorageAdapter(), []);
7
- // setup token autorefresh
8
- const [refresher, setRefresher] = useState(undefined);
9
- useEffect(() => {
10
- if (!authConfig)
11
- return;
12
- return () => {
13
- abortController.abort();
14
- };
15
- // eslint-disable-next-line react-hooks/exhaustive-deps
16
- }, [authConfig, storage]); // Only depend on what actually changes
17
- useEffect(() => {
18
- if (session?.authenticated) {
19
- refresher?.setupAutorefresh();
20
- }
21
- else {
22
- refresher?.clearAutorefresh();
23
- }
24
- return () => refresher?.clearAutorefresh();
25
- }, [refresher, session?.authenticated]);
26
- };
27
- export { useRefresh };
28
- //# sourceMappingURL=useRefresh.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useRefresh.js","sourceRoot":"","sources":["../../../../src/reactjs/hooks/useRefresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,UAAU,GAAG,CAAC,OAA2B,EAAE,EAAE;IACjD,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;IAE7D,0BAA0B;IAC1B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAExC,SAAS,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,OAAO,GAAG,EAAE;YACV,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,uCAAuC;IAElE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,GAAG,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC7C,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import { LocalStorageAdapter } from \"@/browser/storage.js\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { GenericAuthenticationRefresher } from \"../lib/GenericAuthenticationRefresher.js\";\nimport { useCivicAuthConfig } from \"./useCivicAuthConfig.js\";\nimport type { SessionData } from \"@/types.js\";\n\nconst useRefresh = (session: SessionData | null) => {\n const authConfig = useCivicAuthConfig();\n const storage = useMemo(() => new LocalStorageAdapter(), []);\n\n // setup token autorefresh\n const [refresher, setRefresher] = useState<\n GenericAuthenticationRefresher | undefined\n >(undefined);\n\n useEffect(() => {\n if (!authConfig) return;\n\n return () => {\n abortController.abort();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [authConfig, storage]); // Only depend on what actually changes\n\n useEffect(() => {\n if (session?.authenticated) {\n refresher?.setupAutorefresh();\n } else {\n refresher?.clearAutorefresh();\n }\n\n return () => refresher?.clearAutorefresh();\n }, [refresher, session?.authenticated]);\n};\n\nexport { useRefresh };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useUser.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/hooks/useUser.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oCAAoC,CAAC;AAE5C,QAAA,MAAM,OAAO,GACX,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,+BAC9B,eAAe,CAAC,CAAC,CAQrB,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactjs/index.ts"],"names":[],"mappings":"AAGA,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,+BAA+B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/reactjs/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,KAAK,eAAe,GACrB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,KAAK,gBAAgB,GACtB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EACL,eAAe,EACf,cAAc,EACd,KAAK,kBAAkB,GACxB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServerAuthenticationResolver.d.ts","sourceRoot":"","sources":["../../../src/server/ServerAuthenticationResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOrD,OAAO,KAAK,EAAE,sBAAsB,EAAgB,MAAM,qBAAqB,CAAC;AAGhF,qBAAa,4BAA6B,YAAW,sBAAsB;IAMvE,QAAQ,CAAC,UAAU,EAAE,UAAU;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW;IAC7B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;IAPjD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO;IAOP,uBAAuB,IAAI,OAAO,CAAC,WAAW,CAAC;IAI/C,IAAI,WAAW,IAAI,MAAM,CAExB;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrB,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC;IAoB3B,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;WAatC,KAAK,CAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,WAAW,EACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GACrC,OAAO,CAAC,sBAAsB,CAAC;CAUnC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;CACpD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EACV,cAAc,EACd,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,UAAU,EACV,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/server/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAKrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,qBAAqB,CAAC,CAWhC;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvE;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,GAAG;IACzC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EACH,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,GAAG,CAAC,CAed"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/server/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,qBAAqB,CAAC,CAWhC"}
@@ -1,90 +0,0 @@
1
- import type { DisplayMode, Endpoints, OIDCTokenResponseBody, SessionData } from "@/types.js";
2
- import { BrowserPublicClientPKCEProducer } from "@/services/PKCE.js";
3
- import type { AuthenticationInitiator, AuthenticationResolver, PKCEConsumer } from "@/services/types.js";
4
- /**
5
- * An authentication initiator that works on a browser. Since this is just triggering
6
- * login and logout, session data is not stored here.
7
- * An associated AuthenticationResolver would be needed to get the session data.
8
- * Storage is needed for the code verifier, this is the domain of the PKCEConsumer
9
- * The storage used by the PKCEConsumer should be available to the AuthenticationResolver.
10
- *
11
- * Example usage:
12
- *
13
- * 1) Client-only SPA -eg a react app with no server:
14
- * new BrowserAuthenticationInitiator({
15
- * pkceConsumer: new BrowserPublicClientPKCEProducer(), // generate and retrieve the challenge client-side
16
- * ... other config
17
- * })
18
- *
19
- * 2) Client-side of a client/server app - eg a react app with a backend:
20
- * new BrowserAuthenticationInitiator({
21
- * pkceConsumer: new ConfidentialClientPKCEConsumer("https://myserver.com/pkce"), // get the challenge from the server
22
- * ... other config
23
- * })
24
- */
25
- export declare class BrowserAuthenticationInitiator implements AuthenticationInitiator {
26
- private postMessageHandler;
27
- protected config: {
28
- clientId: string;
29
- redirectUrl: string;
30
- scopes: string[];
31
- displayMode: DisplayMode;
32
- oauthServer: string;
33
- endpointOverrides?: Partial<Endpoints>;
34
- pkceConsumer: PKCEConsumer;
35
- nonce?: string;
36
- };
37
- setDisplayMode(displayMode: DisplayMode): void;
38
- get displayMode(): DisplayMode;
39
- get isServerTokenExchange(): boolean;
40
- get state(): string;
41
- constructor(config: typeof this.config);
42
- handleLoginAppPopupFailed(redirectUrl: string): Promise<void>;
43
- signIn(iframeRef: HTMLIFrameElement | null): Promise<URL>;
44
- signOut(): Promise<URL>;
45
- cleanup(): void;
46
- }
47
- /** A general-purpose authentication initiator, that just generates urls, but lets
48
- * the caller decide how to use them. This is useful for server-side applications
49
- * that may serve this URL to their front-ends or just call them directly
50
- */
51
- export declare class GenericAuthenticationInitiator implements AuthenticationInitiator {
52
- protected config: {
53
- clientId: string;
54
- redirectUrl: string;
55
- state: string;
56
- scopes: string[];
57
- oauthServer: string;
58
- nonce?: string;
59
- endpointOverrides?: Partial<Endpoints>;
60
- pkceConsumer: PKCEConsumer;
61
- };
62
- constructor(config: typeof this.config);
63
- signIn(): Promise<URL>;
64
- signOut(): Promise<URL>;
65
- }
66
- type BrowserAuthenticationConfig = {
67
- clientId: string;
68
- redirectUrl: string;
69
- scopes: string[];
70
- oauthServer: string;
71
- endpointOverrides?: Partial<Endpoints>;
72
- displayMode: DisplayMode;
73
- };
74
- /**
75
- * An authentication resolver that can run on the browser (i.e. a public client)
76
- * It uses PKCE for security. PKCE and Session data are stored in local storage
77
- */
78
- export declare class BrowserAuthenticationService extends BrowserAuthenticationInitiator {
79
- protected pkceProducer: BrowserPublicClientPKCEProducer;
80
- private oauth2client;
81
- private endpoints;
82
- constructor(config: BrowserAuthenticationConfig, pkceProducer?: BrowserPublicClientPKCEProducer);
83
- init(): Promise<this>;
84
- tokenExchange(code: string, state: string): Promise<OIDCTokenResponseBody>;
85
- getSessionData(): Promise<SessionData | null>;
86
- validateExistingSession(): Promise<SessionData>;
87
- static build(config: BrowserAuthenticationConfig): Promise<AuthenticationResolver>;
88
- }
89
- export {};
90
- //# sourceMappingURL=AuthenticationService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AuthenticationService.d.ts","sourceRoot":"","sources":["../../../src/services/AuthenticationService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EAET,qBAAqB,EACrB,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,+BAA+B,EAEhC,MAAM,oBAAoB,CAAC;AAe5B,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAQ7B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,8BAA+B,YAAW,uBAAuB;IAC5E,OAAO,CAAC,kBAAkB,CAAgD;IAE1E,SAAS,CAAC,MAAM,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;QAEjB,WAAW,EAAE,WAAW,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QAEpB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAEvC,YAAY,EAAE,YAAY,CAAC;QAE3B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEK,cAAc,CAAC,WAAW,EAAE,WAAW;IAI9C,IAAI,WAAW,gBAEd;IAED,IAAI,qBAAqB,YAExB;IACD,IAAI,KAAK,WAER;gBACW,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM;IAIhC,yBAAyB,CAAC,WAAW,EAAE,MAAM;IAU7C,MAAM,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;IAiDzD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;IAe7B,OAAO;CAKR;AAED;;;GAGG;AACH,qBAAa,8BAA+B,YAAW,uBAAuB;IAC5E,SAAS,CAAC,MAAM,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAEvC,YAAY,EAAE,YAAY,CAAC;KAC5B,CAAC;gBAEU,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM;IAMhC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC;IAItB,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;CAG9B;AAED,KAAK,2BAA2B,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,qBAAa,4BAA6B,SAAQ,8BAA8B;IAQ5E,SAAS,CAAC,YAAY;IAPxB,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,SAAS,CAAwB;gBAIvC,MAAM,EAAE,2BAA2B,EAEzB,YAAY,kCAAwC;IAY1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC;IA0C3B,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAa7C,uBAAuB,IAAI,OAAO,CAAC,WAAW,CAAC;WAgCxC,KAAK,CAChB,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,sBAAsB,CAAC;CAMnC"}
@@ -1,243 +0,0 @@
1
- // Proposals for revised versions of the SessionService AKA AuthSessionService
2
- import { BrowserPublicClientPKCEProducer, ConfidentialClientPKCEConsumer, } from "@/services/PKCE.js";
3
- import { clearTokens, clearUser, exchangeTokens, generateOauthLoginUrl, generateOauthLogoutUrl, getEndpointsWithOverrides, retrieveTokens, storeTokens, validateOauth2Tokens, } from "@/shared/lib/util.js";
4
- import { displayModeFromState, generateState } from "@/lib/oauth.js";
5
- import { OAuth2Client } from "oslo/oauth2";
6
- import { LocalStorageAdapter } from "@/browser/storage.js";
7
- import { PopupError } from "@/services/types.js";
8
- import { removeParamsWithoutReload } from "@/lib/windowUtil.js";
9
- import { DEFAULT_OAUTH_GET_PARAMS } from "@/constants.js";
10
- import { validateLoginAppPostMessage } from "@/lib/postMessage.js";
11
- import { getUser } from "@/shared/lib/session.js";
12
- import { GenericUserSession } from "@/shared/lib/UserSession.js";
13
- /**
14
- * An authentication initiator that works on a browser. Since this is just triggering
15
- * login and logout, session data is not stored here.
16
- * An associated AuthenticationResolver would be needed to get the session data.
17
- * Storage is needed for the code verifier, this is the domain of the PKCEConsumer
18
- * The storage used by the PKCEConsumer should be available to the AuthenticationResolver.
19
- *
20
- * Example usage:
21
- *
22
- * 1) Client-only SPA -eg a react app with no server:
23
- * new BrowserAuthenticationInitiator({
24
- * pkceConsumer: new BrowserPublicClientPKCEProducer(), // generate and retrieve the challenge client-side
25
- * ... other config
26
- * })
27
- *
28
- * 2) Client-side of a client/server app - eg a react app with a backend:
29
- * new BrowserAuthenticationInitiator({
30
- * pkceConsumer: new ConfidentialClientPKCEConsumer("https://myserver.com/pkce"), // get the challenge from the server
31
- * ... other config
32
- * })
33
- */
34
- export class BrowserAuthenticationInitiator {
35
- postMessageHandler = null;
36
- config;
37
- setDisplayMode(displayMode) {
38
- this.config.displayMode = displayMode;
39
- }
40
- get displayMode() {
41
- return this.config.displayMode;
42
- }
43
- get isServerTokenExchange() {
44
- return this.config.pkceConsumer instanceof ConfidentialClientPKCEConsumer;
45
- }
46
- get state() {
47
- return generateState(this.config.displayMode, this.isServerTokenExchange);
48
- }
49
- constructor(config) {
50
- this.config = config;
51
- }
52
- async handleLoginAppPopupFailed(redirectUrl) {
53
- console.warn("Login app popup failed open a popup, using redirect mode instead...", redirectUrl);
54
- window.location.href = redirectUrl;
55
- }
56
- // Use the config (Client ID, scopes OAuth Server, Endpoints, PKCEConsumer) to generate a new login url
57
- // and then use the display mode to decide how to send the user there
58
- async signIn(iframeRef) {
59
- const url = await generateOauthLoginUrl({
60
- ...this.config,
61
- state: this.state,
62
- });
63
- this.postMessageHandler = (event) => {
64
- const thisURL = new URL(window.location.href);
65
- if (event.origin.endsWith("civic.com") ||
66
- thisURL.hostname === "localhost") {
67
- if (!validateLoginAppPostMessage(event.data, this.config.clientId)) {
68
- return;
69
- }
70
- const loginMessage = event.data;
71
- this.handleLoginAppPopupFailed(loginMessage.data.url);
72
- }
73
- };
74
- window.addEventListener("message", this.postMessageHandler);
75
- if (this.config.displayMode === "iframe") {
76
- if (!iframeRef)
77
- throw new Error("iframeRef is required for displayMode 'iframe'");
78
- iframeRef.setAttribute("src", url.toString());
79
- }
80
- if (this.config.displayMode === "redirect") {
81
- window.location.href = url.toString();
82
- }
83
- if (this.config.displayMode === "new_tab") {
84
- try {
85
- const popupWindow = window.open(url.toString(), "_blank");
86
- if (!popupWindow) {
87
- throw new PopupError("Failed to open popup window");
88
- }
89
- }
90
- catch (error) {
91
- console.error("popupWindow", error);
92
- throw new PopupError("window.open has thrown: Failed to open popup window");
93
- }
94
- }
95
- return url;
96
- }
97
- async signOut() {
98
- // we only use local storage for the client-side token exchange
99
- if (!this.isServerTokenExchange) {
100
- const localStorage = new LocalStorageAdapter();
101
- await clearTokens(localStorage);
102
- await clearUser(localStorage);
103
- LocalStorageAdapter.emitter.emit("signOut");
104
- }
105
- // TODO open the iframe or new tab etc: the logout URL is not currently
106
- // supported by on the oauth, so just clear state until then
107
- const url = await generateOauthLogoutUrl(this.config);
108
- return url;
109
- }
110
- cleanup() {
111
- if (this.postMessageHandler) {
112
- window.removeEventListener("message", this.postMessageHandler);
113
- }
114
- }
115
- }
116
- /** A general-purpose authentication initiator, that just generates urls, but lets
117
- * the caller decide how to use them. This is useful for server-side applications
118
- * that may serve this URL to their front-ends or just call them directly
119
- */
120
- export class GenericAuthenticationInitiator {
121
- config;
122
- constructor(config) {
123
- this.config = config;
124
- }
125
- // Use the config (Client ID, scopes OAuth Server, Endpoints, PKCEConsumer) to generate a new login url
126
- // and simply return the url
127
- async signIn() {
128
- return generateOauthLoginUrl(this.config);
129
- }
130
- async signOut() {
131
- return generateOauthLogoutUrl(this.config);
132
- }
133
- }
134
- /**
135
- * An authentication resolver that can run on the browser (i.e. a public client)
136
- * It uses PKCE for security. PKCE and Session data are stored in local storage
137
- */
138
- export class BrowserAuthenticationService extends BrowserAuthenticationInitiator {
139
- pkceProducer;
140
- oauth2client;
141
- endpoints;
142
- // TODO WIP - perhaps we want to keep resolver and initiator separate here
143
- constructor(config,
144
- // Since we are running fully on the client, we produce as well as consume the PKCE challenge
145
- pkceProducer = new BrowserPublicClientPKCEProducer()) {
146
- super({
147
- ...config,
148
- // Store and retrieve the PKCE challenge in local storage
149
- pkceConsumer: pkceProducer,
150
- });
151
- this.pkceProducer = pkceProducer;
152
- }
153
- // TODO too much code duplication here between the browser and the server variant.
154
- // Suggestion for refactor: Standardise the config for AuthenticationResolvers and create a one-shot
155
- // function for generating an oauth2client from it
156
- async init() {
157
- // resolve oauth config
158
- this.endpoints = await getEndpointsWithOverrides(this.config.oauthServer, this.config.endpointOverrides);
159
- this.oauth2client = new OAuth2Client(this.config.clientId, this.endpoints.auth, this.endpoints.token, {
160
- redirectURI: this.config.redirectUrl,
161
- });
162
- return this;
163
- }
164
- // Two responsibilities:
165
- // 1. resolve the auth code to get the tokens (should use library code)
166
- // 2. store the tokens in local storage
167
- async tokenExchange(code, state) {
168
- if (!this.oauth2client)
169
- await this.init();
170
- const codeVerifier = await this.pkceProducer.getCodeVerifier();
171
- if (!codeVerifier)
172
- throw new Error("Code verifier not found in storage");
173
- // exchange auth code for tokens
174
- const tokens = await exchangeTokens(code, state, this.pkceProducer, this.oauth2client, // clean up types here to avoid the ! operator
175
- this.config.oauthServer, this.endpoints);
176
- const clientStorage = new LocalStorageAdapter();
177
- await storeTokens(clientStorage, tokens);
178
- const user = await getUser(clientStorage);
179
- if (!user) {
180
- throw new Error("Failed to get user info");
181
- }
182
- const userSession = new GenericUserSession(clientStorage);
183
- await userSession.set(user);
184
- LocalStorageAdapter.emitter.emit("signIn");
185
- // cleanup the browser window if needed
186
- const parsedDisplayMode = displayModeFromState(state, this.config.displayMode);
187
- if (parsedDisplayMode === "new_tab") {
188
- // Close the popup window
189
- window.addEventListener("beforeunload", () => {
190
- window?.opener?.focus();
191
- });
192
- window.close();
193
- }
194
- // these are the default oAuth params that get added to the URL in redirect which we want to remove if present
195
- removeParamsWithoutReload(DEFAULT_OAUTH_GET_PARAMS);
196
- return tokens;
197
- }
198
- // Get the session data from local storage
199
- async getSessionData() {
200
- const storageData = await retrieveTokens(new LocalStorageAdapter());
201
- if (!storageData)
202
- return null;
203
- return {
204
- authenticated: !!storageData.id_token,
205
- idToken: storageData.id_token,
206
- accessToken: storageData.access_token,
207
- refreshToken: storageData.refresh_token,
208
- };
209
- }
210
- async validateExistingSession() {
211
- try {
212
- const sessionData = await this.getSessionData();
213
- if (!sessionData?.idToken || !sessionData.accessToken) {
214
- const unAuthenticatedSession = { ...sessionData, authenticated: false };
215
- // await clearTokens(new LocalStorageAdapter());
216
- return unAuthenticatedSession;
217
- }
218
- if (!this.endpoints || !this.oauth2client)
219
- await this.init();
220
- // this function will throw if any of the tokens are invalid
221
- await validateOauth2Tokens({
222
- access_token: sessionData.accessToken,
223
- id_token: sessionData.idToken,
224
- refresh_token: sessionData.refreshToken,
225
- }, this.endpoints, this.oauth2client, this.config.oauthServer);
226
- return sessionData;
227
- }
228
- catch (error) {
229
- console.warn("Failed to validate existing tokens", error);
230
- const unAuthenticatedSession = {
231
- authenticated: false,
232
- };
233
- await clearTokens(new LocalStorageAdapter());
234
- return unAuthenticatedSession;
235
- }
236
- }
237
- static async build(config) {
238
- const resolver = new BrowserAuthenticationService(config);
239
- await resolver.init();
240
- return resolver;
241
- }
242
- }
243
- //# sourceMappingURL=AuthenticationService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AuthenticationService.js","sourceRoot":"","sources":["../../../src/services/AuthenticationService.ts"],"names":[],"mappings":"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","sourcesContent":["// Proposals for revised versions of the SessionService AKA AuthSessionService\n\nimport type {\n DisplayMode,\n Endpoints,\n LoginPostMessage,\n OIDCTokenResponseBody,\n SessionData,\n} from \"@/types.js\";\nimport {\n BrowserPublicClientPKCEProducer,\n ConfidentialClientPKCEConsumer,\n} from \"@/services/PKCE.js\";\nimport {\n clearTokens,\n clearUser,\n exchangeTokens,\n generateOauthLoginUrl,\n generateOauthLogoutUrl,\n getEndpointsWithOverrides,\n retrieveTokens,\n storeTokens,\n validateOauth2Tokens,\n} from \"@/shared/lib/util.js\";\nimport { displayModeFromState, generateState } from \"@/lib/oauth.js\";\nimport { OAuth2Client } from \"oslo/oauth2\";\nimport { LocalStorageAdapter } from \"@/browser/storage.js\";\nimport type {\n AuthenticationInitiator,\n AuthenticationResolver,\n PKCEConsumer,\n} from \"@/services/types.js\";\nimport { PopupError } from \"@/services/types.js\";\nimport { removeParamsWithoutReload } from \"@/lib/windowUtil.js\";\nimport { DEFAULT_OAUTH_GET_PARAMS } from \"@/constants.js\";\nimport { validateLoginAppPostMessage } from \"@/lib/postMessage.js\";\nimport { getUser } from \"@/shared/lib/session.js\";\nimport { GenericUserSession } from \"@/shared/lib/UserSession.js\";\n\n/**\n * An authentication initiator that works on a browser. Since this is just triggering\n * login and logout, session data is not stored here.\n * An associated AuthenticationResolver would be needed to get the session data.\n * Storage is needed for the code verifier, this is the domain of the PKCEConsumer\n * The storage used by the PKCEConsumer should be available to the AuthenticationResolver.\n *\n * Example usage:\n *\n * 1) Client-only SPA -eg a react app with no server:\n * new BrowserAuthenticationInitiator({\n * pkceConsumer: new BrowserPublicClientPKCEProducer(), // generate and retrieve the challenge client-side\n * ... other config\n * })\n *\n * 2) Client-side of a client/server app - eg a react app with a backend:\n * new BrowserAuthenticationInitiator({\n * pkceConsumer: new ConfidentialClientPKCEConsumer(\"https://myserver.com/pkce\"), // get the challenge from the server\n * ... other config\n * })\n */\nexport class BrowserAuthenticationInitiator implements AuthenticationInitiator {\n private postMessageHandler: null | ((event: MessageEvent) => void) = null;\n\n protected config: {\n clientId: string;\n redirectUrl: string;\n scopes: string[];\n // determines whether to trigger the login/logout in an iframe, a new browser window, or redirect the current one.\n displayMode: DisplayMode;\n oauthServer: string;\n // the endpoints to use for the login (if not obtained from the auth server\n endpointOverrides?: Partial<Endpoints>;\n // used to get the PKCE challenge\n pkceConsumer: PKCEConsumer;\n // the nonce to use for the login\n nonce?: string;\n };\n\n public setDisplayMode(displayMode: DisplayMode) {\n this.config.displayMode = displayMode;\n }\n\n get displayMode() {\n return this.config.displayMode;\n }\n\n get isServerTokenExchange() {\n return this.config.pkceConsumer instanceof ConfidentialClientPKCEConsumer;\n }\n get state() {\n return generateState(this.config.displayMode, this.isServerTokenExchange);\n }\n constructor(config: typeof this.config) {\n this.config = config;\n }\n\n async handleLoginAppPopupFailed(redirectUrl: string) {\n console.warn(\n \"Login app popup failed open a popup, using redirect mode instead...\",\n redirectUrl,\n );\n window.location.href = redirectUrl;\n }\n\n // Use the config (Client ID, scopes OAuth Server, Endpoints, PKCEConsumer) to generate a new login url\n // and then use the display mode to decide how to send the user there\n async signIn(iframeRef: HTMLIFrameElement | null): Promise<URL> {\n const url = await generateOauthLoginUrl({\n ...this.config,\n state: this.state,\n });\n\n this.postMessageHandler = (event: MessageEvent) => {\n const thisURL = new URL(window.location.href);\n if (\n event.origin.endsWith(\"civic.com\") ||\n thisURL.hostname === \"localhost\"\n ) {\n if (!validateLoginAppPostMessage(event.data, this.config.clientId)) {\n return;\n }\n const loginMessage = event.data as LoginPostMessage;\n this.handleLoginAppPopupFailed(loginMessage.data.url);\n }\n };\n\n window.addEventListener(\"message\", this.postMessageHandler);\n\n if (this.config.displayMode === \"iframe\") {\n if (!iframeRef)\n throw new Error(\"iframeRef is required for displayMode 'iframe'\");\n iframeRef.setAttribute(\"src\", url.toString());\n }\n\n if (this.config.displayMode === \"redirect\") {\n window.location.href = url.toString();\n }\n\n if (this.config.displayMode === \"new_tab\") {\n try {\n const popupWindow = window.open(url.toString(), \"_blank\");\n if (!popupWindow) {\n throw new PopupError(\"Failed to open popup window\");\n }\n } catch (error) {\n console.error(\"popupWindow\", error);\n throw new PopupError(\n \"window.open has thrown: Failed to open popup window\",\n );\n }\n }\n\n return url;\n }\n\n async signOut(): Promise<URL> {\n // we only use local storage for the client-side token exchange\n if (!this.isServerTokenExchange) {\n const localStorage = new LocalStorageAdapter();\n await clearTokens(localStorage);\n await clearUser(localStorage);\n LocalStorageAdapter.emitter.emit(\"signOut\");\n }\n // TODO open the iframe or new tab etc: the logout URL is not currently\n // supported by on the oauth, so just clear state until then\n const url = await generateOauthLogoutUrl(this.config);\n\n return url;\n }\n\n cleanup() {\n if (this.postMessageHandler) {\n window.removeEventListener(\"message\", this.postMessageHandler);\n }\n }\n}\n\n/** A general-purpose authentication initiator, that just generates urls, but lets\n * the caller decide how to use them. This is useful for server-side applications\n * that may serve this URL to their front-ends or just call them directly\n */\nexport class GenericAuthenticationInitiator implements AuthenticationInitiator {\n protected config: {\n clientId: string;\n redirectUrl: string;\n state: string;\n scopes: string[];\n oauthServer: string;\n nonce?: string;\n // the endpoints to use for the login (if not obtained from the auth server)\n endpointOverrides?: Partial<Endpoints>;\n // used to get the PKCE challenge\n pkceConsumer: PKCEConsumer;\n };\n\n constructor(config: typeof this.config) {\n this.config = config;\n }\n\n // Use the config (Client ID, scopes OAuth Server, Endpoints, PKCEConsumer) to generate a new login url\n // and simply return the url\n async signIn(): Promise<URL> {\n return generateOauthLoginUrl(this.config);\n }\n\n async signOut(): Promise<URL> {\n return generateOauthLogoutUrl(this.config);\n }\n}\n\ntype BrowserAuthenticationConfig = {\n clientId: string;\n redirectUrl: string;\n scopes: string[];\n oauthServer: string;\n endpointOverrides?: Partial<Endpoints>;\n displayMode: DisplayMode;\n};\n\n/**\n * An authentication resolver that can run on the browser (i.e. a public client)\n * It uses PKCE for security. PKCE and Session data are stored in local storage\n */\nexport class BrowserAuthenticationService extends BrowserAuthenticationInitiator {\n private oauth2client: OAuth2Client | undefined;\n private endpoints: Endpoints | undefined;\n\n // TODO WIP - perhaps we want to keep resolver and initiator separate here\n constructor(\n config: BrowserAuthenticationConfig,\n // Since we are running fully on the client, we produce as well as consume the PKCE challenge\n protected pkceProducer = new BrowserPublicClientPKCEProducer(),\n ) {\n super({\n ...config,\n // Store and retrieve the PKCE challenge in local storage\n pkceConsumer: pkceProducer,\n });\n }\n\n // TODO too much code duplication here between the browser and the server variant.\n // Suggestion for refactor: Standardise the config for AuthenticationResolvers and create a one-shot\n // function for generating an oauth2client from it\n async init(): Promise<this> {\n // resolve oauth config\n this.endpoints = await getEndpointsWithOverrides(\n this.config.oauthServer,\n this.config.endpointOverrides,\n );\n this.oauth2client = new OAuth2Client(\n this.config.clientId,\n this.endpoints.auth,\n this.endpoints.token,\n {\n redirectURI: this.config.redirectUrl,\n },\n );\n\n return this;\n }\n\n // Two responsibilities:\n // 1. resolve the auth code to get the tokens (should use library code)\n // 2. store the tokens in local storage\n async tokenExchange(\n code: string,\n state: string,\n ): Promise<OIDCTokenResponseBody> {\n if (!this.oauth2client) await this.init();\n const codeVerifier = await this.pkceProducer.getCodeVerifier();\n if (!codeVerifier) throw new Error(\"Code verifier not found in storage\");\n\n // exchange auth code for tokens\n const tokens = await exchangeTokens(\n code,\n state,\n this.pkceProducer,\n this.oauth2client!, // clean up types here to avoid the ! operator\n this.config.oauthServer,\n this.endpoints!, // clean up types here to avoid the ! operator\n );\n const clientStorage = new LocalStorageAdapter();\n await storeTokens(clientStorage, tokens);\n const user = await getUser(clientStorage);\n if (!user) {\n throw new Error(\"Failed to get user info\");\n }\n const userSession = new GenericUserSession(clientStorage);\n await userSession.set(user);\n LocalStorageAdapter.emitter.emit(\"signIn\");\n // cleanup the browser window if needed\n const parsedDisplayMode = displayModeFromState(\n state,\n this.config.displayMode,\n );\n\n if (parsedDisplayMode === \"new_tab\") {\n // Close the popup window\n window.addEventListener(\"beforeunload\", () => {\n window?.opener?.focus();\n });\n window.close();\n }\n // these are the default oAuth params that get added to the URL in redirect which we want to remove if present\n removeParamsWithoutReload(DEFAULT_OAUTH_GET_PARAMS);\n return tokens;\n }\n\n // Get the session data from local storage\n async getSessionData(): Promise<SessionData | null> {\n const storageData = await retrieveTokens(new LocalStorageAdapter());\n\n if (!storageData) return null;\n\n return {\n authenticated: !!storageData.id_token,\n idToken: storageData.id_token,\n accessToken: storageData.access_token,\n refreshToken: storageData.refresh_token,\n };\n }\n\n async validateExistingSession(): Promise<SessionData> {\n try {\n const sessionData = await this.getSessionData();\n if (!sessionData?.idToken || !sessionData.accessToken) {\n const unAuthenticatedSession = { ...sessionData, authenticated: false };\n // await clearTokens(new LocalStorageAdapter());\n return unAuthenticatedSession;\n }\n if (!this.endpoints || !this.oauth2client) await this.init();\n\n // this function will throw if any of the tokens are invalid\n await validateOauth2Tokens(\n {\n access_token: sessionData.accessToken,\n id_token: sessionData.idToken,\n refresh_token: sessionData.refreshToken,\n },\n this.endpoints!,\n this.oauth2client!,\n this.config.oauthServer,\n );\n return sessionData;\n } catch (error) {\n console.warn(\"Failed to validate existing tokens\", error);\n const unAuthenticatedSession = {\n authenticated: false,\n };\n await clearTokens(new LocalStorageAdapter());\n return unAuthenticatedSession;\n }\n }\n\n static async build(\n config: BrowserAuthenticationConfig,\n ): Promise<AuthenticationResolver> {\n const resolver = new BrowserAuthenticationService(config);\n await resolver.init();\n\n return resolver;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PKCE.d.ts","sourceRoot":"","sources":["../../../src/services/PKCE.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,0EAA0E;AAC1E,qBAAa,8BAA+B,YAAW,YAAY;IACrD,OAAO,CAAC,qBAAqB;gBAArB,qBAAqB,EAAE,MAAM;IAC3C,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAO1C;AAED,8GAA8G;AAC9G,qBAAa,+BAAgC,YAAW,YAAY;IACtD,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,WAAW;IAIlC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IASnC,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGhD;AAED,wFAAwF;AACxF,qBAAa,+BAAgC,SAAQ,+BAA+B;;CAInF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AASrE,MAAM,WAAW,YAAY;IAE3B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC;AAGD,MAAM,WAAW,YAAa,SAAQ,YAAY;IAEhD,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3C;AAGD,MAAM,WAAW,uBAAuB;IAEtC,MAAM,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAG1D,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;CACzB;AAGD,MAAM,WAAW,sBAAsB;IAKrC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAG3E,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAG9C,uBAAuB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACrD;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B"}
@@ -1,7 +0,0 @@
1
- import type { ReactNode } from "react";
2
- import React from "react";
3
- declare const BlockDisplay: ({ children }: {
4
- children: ReactNode;
5
- }) => React.JSX.Element;
6
- export { BlockDisplay };
7
- //# sourceMappingURL=BlockDisplay.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BlockDisplay.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/BlockDisplay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,QAAA,MAAM,YAAY,iBAAkB;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,sBAgC1D,CAAC;AACF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,25 +0,0 @@
1
- import React from "react";
2
- const BlockDisplay = ({ children }) => {
3
- return (React.createElement("div", { id: "iframe-block-display-wrapper", style: {
4
- position: "relative",
5
- left: 0,
6
- top: 0,
7
- zIndex: 50,
8
- display: "flex",
9
- height: "100vh",
10
- width: "100vw",
11
- alignItems: "center",
12
- justifyContent: "center",
13
- backgroundColor: "white",
14
- } },
15
- React.createElement("div", { id: "iframe-block-display", style: {
16
- position: "absolute",
17
- inset: 0,
18
- display: "flex",
19
- alignItems: "center",
20
- justifyContent: "center",
21
- backgroundColor: "white",
22
- } }, children)));
23
- };
24
- export { BlockDisplay };
25
- //# sourceMappingURL=BlockDisplay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BlockDisplay.js","sourceRoot":"","sources":["../../../../src/shared/components/BlockDisplay.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,YAAY,GAAG,CAAC,EAAE,QAAQ,EAA2B,EAAE,EAAE;IAC7D,OAAO,CACL,6BACE,EAAE,EAAC,8BAA8B,EACjC,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,eAAe,EAAE,OAAO;SACzB;QAED,6BACE,EAAE,EAAC,sBAAsB,EACzB,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,eAAe,EAAE,OAAO;aACzB,IAEA,QAAQ,CACL,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AACF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { ReactNode } from \"react\";\nimport React from \"react\";\n\nconst BlockDisplay = ({ children }: { children: ReactNode }) => {\n return (\n <div\n id=\"iframe-block-display-wrapper\"\n style={{\n position: \"relative\",\n left: 0,\n top: 0,\n zIndex: 50,\n display: \"flex\",\n height: \"100vh\",\n width: \"100vw\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"white\",\n }}\n >\n <div\n id=\"iframe-block-display\"\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"white\",\n }}\n >\n {children}\n </div>\n </div>\n );\n};\nexport { BlockDisplay };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CivicAuthIframe.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/CivicAuthIframe.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,KAAK,oBAAoB,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,QAAA,MAAM,eAAe,gGAWpB,CAAC;AAIF,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -1,9 +0,0 @@
1
- "use client";
2
- import { IFRAME_ID } from "@/constants.js";
3
- import React, { forwardRef } from "react";
4
- const CivicAuthIframe = forwardRef(({ onLoad }, ref) => {
5
- return (React.createElement("iframe", { id: IFRAME_ID, ref: ref, style: { height: "28rem", width: "100%", border: "none" }, onLoad: onLoad }));
6
- });
7
- CivicAuthIframe.displayName = "CivicAuthIframe";
8
- export { CivicAuthIframe };
9
- //# sourceMappingURL=CivicAuthIframe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CivicAuthIframe.js","sourceRoot":"","sources":["../../../../src/shared/components/CivicAuthIframe.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAM1C,MAAM,eAAe,GAAG,UAAU,CAChC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE;IAClB,OAAO,CACL,gCACE,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EACzD,MAAM,EAAE,MAAM,GACd,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,CAAC,WAAW,GAAG,iBAAiB,CAAC;AAIhD,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["\"use client\";\nimport { IFRAME_ID } from \"@/constants.js\";\nimport React, { forwardRef } from \"react\";\n\ntype CivicAuthIframeProps = {\n onLoad?: () => void;\n};\n\nconst CivicAuthIframe = forwardRef<HTMLIFrameElement, CivicAuthIframeProps>(\n ({ onLoad }, ref) => {\n return (\n <iframe\n id={IFRAME_ID}\n ref={ref}\n style={{ height: \"28rem\", width: \"100%\", border: \"none\" }}\n onLoad={onLoad}\n />\n );\n },\n);\n\nCivicAuthIframe.displayName = \"CivicAuthIframe\";\n\nexport type { CivicAuthIframeProps };\n\nexport { CivicAuthIframe };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CivicAuthIframeContainer.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/CivicAuthIframeContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAUxE,KAAK,6BAA6B,GAAG;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAuEF,QAAA,MAAM,wBAAwB,kCAG3B,6BAA6B,sBA8G/B,CAAC;AAEF,YAAY,EAAE,6BAA6B,EAAE,CAAC;AAE9C,OAAO,EAAE,wBAAwB,EAAE,CAAC"}