@civic/auth 0.0.1-beta.24 → 0.0.1-beta.25
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.
- package/dist/AuthProvider-BBetpl_s.d.mts +21 -0
- package/dist/AuthProvider-BYZ8w92b.d.mts +15 -0
- package/dist/AuthProvider-BgOwv9h8.d.ts +15 -0
- package/dist/AuthProvider-D_kReUi0.d.ts +21 -0
- package/dist/{index-DTimUlkB.d.ts → UserProvider-BA2uflVB.d.ts} +1 -2
- package/dist/{index-DvjkKpkk.d.mts → UserProvider-Bl3j1PUO.d.mts} +1 -2
- package/dist/chunk-2OZJONNO.js.map +1 -1
- package/dist/chunk-2TDB4XWE.js +277 -0
- package/dist/chunk-2TDB4XWE.js.map +1 -0
- package/dist/chunk-2ZUCE3XM.mjs +705 -0
- package/dist/chunk-2ZUCE3XM.mjs.map +1 -0
- package/dist/{chunk-A43GY6C3.mjs → chunk-4KSQPSLG.mjs} +7 -12
- package/dist/chunk-4KSQPSLG.mjs.map +1 -0
- package/dist/chunk-55ELY65Q.mjs +706 -0
- package/dist/chunk-55ELY65Q.mjs.map +1 -0
- package/dist/chunk-5UQQYXCX.js.map +1 -1
- package/dist/chunk-63YGK3A7.mjs +223 -0
- package/dist/chunk-63YGK3A7.mjs.map +1 -0
- package/dist/chunk-6RFRDWIP.js.map +1 -1
- package/dist/{chunk-74J7HX36.mjs → chunk-6UFAMFB3.mjs} +5 -5
- package/dist/chunk-6UFAMFB3.mjs.map +1 -0
- package/dist/chunk-75242WAX.js +711 -0
- package/dist/chunk-75242WAX.js.map +1 -0
- package/dist/chunk-7K3QN2AT.js.map +1 -1
- package/dist/chunk-ADCTONP6.js +709 -0
- package/dist/chunk-ADCTONP6.js.map +1 -0
- package/dist/{chunk-RF23Q4V6.js → chunk-AM2Y662I.js} +117 -224
- package/dist/chunk-AM2Y662I.js.map +1 -0
- package/dist/chunk-B3L76DWC.mjs +705 -0
- package/dist/chunk-B3L76DWC.mjs.map +1 -0
- package/dist/{chunk-WXSUVTI4.mjs → chunk-BCXJ4LWQ.mjs} +3 -2
- package/dist/chunk-BCXJ4LWQ.mjs.map +1 -0
- package/dist/chunk-BFJSBJHA.js +709 -0
- package/dist/chunk-BFJSBJHA.js.map +1 -0
- package/dist/chunk-BLLLGPVG.mjs +277 -0
- package/dist/chunk-BLLLGPVG.mjs.map +1 -0
- package/dist/{chunk-COWYPS3A.js → chunk-CJCLQQS5.js} +3 -2
- package/dist/chunk-CJCLQQS5.js.map +1 -0
- package/dist/chunk-CMMHRIMG.js +705 -0
- package/dist/chunk-CMMHRIMG.js.map +1 -0
- package/dist/chunk-CRTRMMJ7.js.map +1 -1
- package/dist/chunk-CTVJJBBA.js.map +1 -1
- package/dist/chunk-D53PLWCK.js +703 -0
- package/dist/chunk-D53PLWCK.js.map +1 -0
- package/dist/chunk-EKLYHP2D.mjs +711 -0
- package/dist/chunk-EKLYHP2D.mjs.map +1 -0
- package/dist/{chunk-XNSHSKGI.js → chunk-FHRZSX3C.js} +2 -2
- package/dist/chunk-FHRZSX3C.js.map +1 -0
- package/dist/{chunk-5XL2ST72.mjs → chunk-G7PH56KW.mjs} +77 -29
- package/dist/chunk-G7PH56KW.mjs.map +1 -0
- package/dist/chunk-GB3H3I47.js +711 -0
- package/dist/chunk-GB3H3I47.js.map +1 -0
- package/dist/chunk-GFP6OLRQ.js +709 -0
- package/dist/chunk-GFP6OLRQ.js.map +1 -0
- package/dist/chunk-HMPKCLIJ.mjs +709 -0
- package/dist/chunk-HMPKCLIJ.mjs.map +1 -0
- package/dist/chunk-IENACY5A.js +116 -0
- package/dist/chunk-IENACY5A.js.map +1 -0
- package/dist/chunk-J5KMPZIV.mjs +708 -0
- package/dist/chunk-J5KMPZIV.mjs.map +1 -0
- package/dist/chunk-J7FWSTAL.js +711 -0
- package/dist/chunk-J7FWSTAL.js.map +1 -0
- package/dist/chunk-JDZPCA3P.js.map +1 -1
- package/dist/chunk-JEOPLLWO.js +223 -0
- package/dist/chunk-JEOPLLWO.js.map +1 -0
- package/dist/chunk-JTQHIECR.mjs +709 -0
- package/dist/chunk-JTQHIECR.mjs.map +1 -0
- package/dist/chunk-KBHDXIAM.js +711 -0
- package/dist/chunk-KBHDXIAM.js.map +1 -0
- package/dist/chunk-KSOWEBHG.js +720 -0
- package/dist/chunk-KSOWEBHG.js.map +1 -0
- package/dist/chunk-LPW3B7PM.js +712 -0
- package/dist/chunk-LPW3B7PM.js.map +1 -0
- package/dist/chunk-M7QA57W3.mjs +711 -0
- package/dist/chunk-M7QA57W3.mjs.map +1 -0
- package/dist/{chunk-3YV5NEM4.js → chunk-MXAJ6OFR.js} +7 -12
- package/dist/chunk-MXAJ6OFR.js.map +1 -0
- package/dist/{chunk-AMCR45Y5.mjs → chunk-NLRREFOX.mjs} +2 -2
- package/dist/chunk-NLRREFOX.mjs.map +1 -0
- package/dist/chunk-NRDG7CC4.js +706 -0
- package/dist/chunk-NRDG7CC4.js.map +1 -0
- package/dist/{chunk-JCLIMTK5.js → chunk-NSAO2ERW.js} +5 -9
- package/dist/chunk-NSAO2ERW.js.map +1 -0
- package/dist/chunk-NXGNAFNY.js +708 -0
- package/dist/chunk-NXGNAFNY.js.map +1 -0
- package/dist/chunk-OXXUQ36U.mjs +283 -0
- package/dist/chunk-OXXUQ36U.mjs.map +1 -0
- package/dist/chunk-PKBT2ALA.mjs +703 -0
- package/dist/chunk-PKBT2ALA.mjs.map +1 -0
- package/dist/chunk-PS5WST7W.mjs +711 -0
- package/dist/chunk-PS5WST7W.mjs.map +1 -0
- package/dist/{chunk-G3P5TIO2.mjs → chunk-Q7DSPTUG.mjs} +126 -233
- package/dist/chunk-Q7DSPTUG.mjs.map +1 -0
- package/dist/chunk-RCFPLIWS.js.map +1 -1
- package/dist/chunk-RIHMMI3P.mjs +116 -0
- package/dist/chunk-RIHMMI3P.mjs.map +1 -0
- package/dist/chunk-RMN6R4VP.mjs +708 -0
- package/dist/chunk-RMN6R4VP.mjs.map +1 -0
- package/dist/{chunk-QHE3SPKQ.js → chunk-SJ6NSD2E.js} +3 -6
- package/dist/chunk-SJ6NSD2E.js.map +1 -0
- package/dist/chunk-SN7YDQQH.js.map +1 -1
- package/dist/chunk-SYJZGEFV.mjs +709 -0
- package/dist/chunk-SYJZGEFV.mjs.map +1 -0
- package/dist/chunk-TH6FI2XI.js +283 -0
- package/dist/chunk-TH6FI2XI.js.map +1 -0
- package/dist/{chunk-6RJHOVY6.mjs → chunk-UBO6RIOZ.mjs} +3 -6
- package/dist/chunk-UBO6RIOZ.mjs.map +1 -0
- package/dist/chunk-UGDZ4VB3.js +705 -0
- package/dist/chunk-UGDZ4VB3.js.map +1 -0
- package/dist/{chunk-NTJWPNOZ.mjs → chunk-UVRXIVK3.mjs} +2 -4
- package/dist/chunk-UVRXIVK3.mjs.map +1 -0
- package/dist/chunk-WC2OMEHO.mjs +711 -0
- package/dist/chunk-WC2OMEHO.mjs.map +1 -0
- package/dist/chunk-WQNOMTSD.mjs +720 -0
- package/dist/chunk-WQNOMTSD.mjs.map +1 -0
- package/dist/chunk-WVG3PNQ6.js +708 -0
- package/dist/chunk-WVG3PNQ6.js.map +1 -0
- package/dist/chunk-WYA7Q4IM.mjs +708 -0
- package/dist/chunk-WYA7Q4IM.mjs.map +1 -0
- package/dist/{chunk-SEKF2WZX.js → chunk-X7YY6SHZ.js} +80 -32
- package/dist/chunk-X7YY6SHZ.js.map +1 -0
- package/dist/{chunk-ELO3M4DA.js → chunk-ZXNMEKUE.js} +2 -4
- package/dist/chunk-ZXNMEKUE.js.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js.map +1 -1
- package/dist/nextjs/client.d.mts +3 -5
- package/dist/nextjs/client.d.ts +3 -5
- package/dist/nextjs/client.js +14 -16
- package/dist/nextjs/client.js.map +1 -1
- package/dist/nextjs/client.mjs +10 -12
- package/dist/nextjs/client.mjs.map +1 -1
- package/dist/nextjs.d.mts +3 -5
- package/dist/nextjs.d.ts +3 -5
- package/dist/nextjs.js +63 -55
- package/dist/nextjs.js.map +1 -1
- package/dist/nextjs.mjs +40 -32
- package/dist/nextjs.mjs.map +1 -1
- package/dist/react.d.mts +5 -9
- package/dist/react.d.ts +5 -9
- package/dist/react.js +11 -23
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +2 -14
- package/dist/react.mjs.map +1 -1
- package/dist/server.d.mts +2 -2
- package/dist/server.d.ts +2 -2
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +2 -2
- package/dist/storage-ANmRwpZ3.d.ts +25 -0
- package/dist/storage-BJyqsZwC.d.mts +25 -0
- package/dist/types-BxAubCqO.d.mts +58 -0
- package/dist/types-BxAubCqO.d.ts +58 -0
- package/dist/{types-b4c1koXj.d.mts → types-DOfl9w7j.d.mts} +6 -2
- package/dist/{types-b4c1koXj.d.ts → types-DOfl9w7j.d.ts} +6 -2
- package/package.json +14 -14
- package/dist/chunk-3YV5NEM4.js.map +0 -1
- package/dist/chunk-5XL2ST72.mjs.map +0 -1
- package/dist/chunk-6RJHOVY6.mjs.map +0 -1
- package/dist/chunk-74J7HX36.mjs.map +0 -1
- package/dist/chunk-A43GY6C3.mjs.map +0 -1
- package/dist/chunk-AMCR45Y5.mjs.map +0 -1
- package/dist/chunk-COWYPS3A.js.map +0 -1
- package/dist/chunk-ELO3M4DA.js.map +0 -1
- package/dist/chunk-G3P5TIO2.mjs.map +0 -1
- package/dist/chunk-JCLIMTK5.js.map +0 -1
- package/dist/chunk-NTJWPNOZ.mjs.map +0 -1
- package/dist/chunk-QHE3SPKQ.js.map +0 -1
- package/dist/chunk-RF23Q4V6.js.map +0 -1
- package/dist/chunk-SEKF2WZX.js.map +0 -1
- package/dist/chunk-WXSUVTI4.mjs.map +0 -1
- package/dist/chunk-XNSHSKGI.js.map +0 -1
package/dist/nextjs.mjs
CHANGED
|
@@ -2,19 +2,17 @@ import {
|
|
|
2
2
|
NextjsClientStorage,
|
|
3
3
|
NextjsCookieStorage,
|
|
4
4
|
clearAuthCookies,
|
|
5
|
+
createCivicAuthPlugin,
|
|
5
6
|
createTokenCookies,
|
|
6
7
|
createUserInfoCookie,
|
|
7
|
-
resolveCallbackUrl
|
|
8
|
-
} from "./chunk-MK7557NR.mjs";
|
|
9
|
-
import {
|
|
10
|
-
createCivicAuthPlugin,
|
|
11
8
|
defaultAuthConfig,
|
|
12
9
|
loggers,
|
|
13
|
-
resolveAuthConfig
|
|
14
|
-
|
|
10
|
+
resolveAuthConfig,
|
|
11
|
+
resolveCallbackUrl
|
|
12
|
+
} from "./chunk-OXXUQ36U.mjs";
|
|
15
13
|
import {
|
|
16
14
|
resolveOAuthAccessCode
|
|
17
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-63YGK3A7.mjs";
|
|
18
16
|
import {
|
|
19
17
|
GenericPublicClientPKCEProducer,
|
|
20
18
|
GenericUserSession,
|
|
@@ -23,7 +21,7 @@ import {
|
|
|
23
21
|
getUser,
|
|
24
22
|
retrieveTokens,
|
|
25
23
|
serverTokenExchangeFromState
|
|
26
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-Q7DSPTUG.mjs";
|
|
27
25
|
import {
|
|
28
26
|
__async,
|
|
29
27
|
__spreadProps,
|
|
@@ -118,20 +116,24 @@ var AuthError = class extends Error {
|
|
|
118
116
|
this.name = "AuthError";
|
|
119
117
|
}
|
|
120
118
|
};
|
|
121
|
-
function handleChallenge(config) {
|
|
119
|
+
function handleChallenge(request, config) {
|
|
122
120
|
return __async(this, null, function* () {
|
|
123
121
|
var _a, _b;
|
|
124
122
|
const cookieStorage = new NextjsCookieStorage((_b = (_a = config.cookies) == null ? void 0 : _a.tokens) != null ? _b : {});
|
|
125
123
|
const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);
|
|
126
124
|
const challenge = yield pkceProducer.getCodeChallenge();
|
|
125
|
+
const appUrl = request.nextUrl.searchParams.get("appUrl");
|
|
126
|
+
if (appUrl) {
|
|
127
|
+
cookieStorage.set("app_url" /* APP_URL */, appUrl);
|
|
128
|
+
}
|
|
127
129
|
return NextResponse2.json({ status: "success", challenge });
|
|
128
130
|
});
|
|
129
131
|
}
|
|
130
|
-
function performTokenExchangeAndSetCookies(request, config, code, state) {
|
|
132
|
+
function performTokenExchangeAndSetCookies(request, config, code, state, appUrl) {
|
|
131
133
|
return __async(this, null, function* () {
|
|
132
134
|
const resolvedConfigs = resolveAuthConfig(config);
|
|
133
135
|
const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);
|
|
134
|
-
const callbackUrl = resolveCallbackUrl(resolvedConfigs,
|
|
136
|
+
const callbackUrl = resolveCallbackUrl(resolvedConfigs, appUrl);
|
|
135
137
|
try {
|
|
136
138
|
yield resolveOAuthAccessCode(code, state, cookieStorage, __spreadProps(__spreadValues({}, resolvedConfigs), {
|
|
137
139
|
redirectUrl: callbackUrl
|
|
@@ -151,13 +153,21 @@ function performTokenExchangeAndSetCookies(request, config, code, state) {
|
|
|
151
153
|
}
|
|
152
154
|
function handleCallback(request, config) {
|
|
153
155
|
return __async(this, null, function* () {
|
|
156
|
+
var _a;
|
|
154
157
|
const resolvedConfigs = resolveAuthConfig(config);
|
|
155
158
|
console.log("handleCallback", { request, resolvedConfigs });
|
|
156
159
|
const code = request.nextUrl.searchParams.get("code");
|
|
157
160
|
const state = request.nextUrl.searchParams.get("state") || "";
|
|
158
161
|
if (!code || !state) throw new AuthError("Bad parameters", 400);
|
|
159
|
-
|
|
160
|
-
|
|
162
|
+
const appUrl = ((_a = request.cookies.get("app_url" /* APP_URL */)) == null ? void 0 : _a.value) || request.nextUrl.searchParams.get("appUrl");
|
|
163
|
+
console.log("handleCallback", {
|
|
164
|
+
code,
|
|
165
|
+
state,
|
|
166
|
+
cookies: cookies(),
|
|
167
|
+
appUrl
|
|
168
|
+
});
|
|
169
|
+
const codeVerifier = request.cookies.get("code_verifier" /* COOKIE_NAME */);
|
|
170
|
+
if (!codeVerifier || !appUrl) {
|
|
161
171
|
console.log("handleCallback no code_verifier found", {
|
|
162
172
|
state,
|
|
163
173
|
serverTokenExchange: serverTokenExchangeFromState(`${state}`)
|
|
@@ -181,7 +191,8 @@ function handleCallback(request, config) {
|
|
|
181
191
|
<span style="display:none">
|
|
182
192
|
<script>
|
|
183
193
|
window.onload = function () {
|
|
184
|
-
|
|
194
|
+
const appUrl = globalThis.window?.location?.origin;
|
|
195
|
+
fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {
|
|
185
196
|
response.json().then((jsonResponse) => {
|
|
186
197
|
console.log('fetch jsonResponse', jsonResponse);
|
|
187
198
|
if (jsonResponse.redirectUrl) {
|
|
@@ -208,27 +219,28 @@ function handleCallback(request, config) {
|
|
|
208
219
|
request,
|
|
209
220
|
resolvedConfigs,
|
|
210
221
|
code,
|
|
211
|
-
state
|
|
222
|
+
state,
|
|
223
|
+
appUrl
|
|
212
224
|
);
|
|
213
225
|
if (request.url.includes("sameDomainServerTokenExchange=true")) {
|
|
214
226
|
console.log(
|
|
215
227
|
"handleCallback sameDomainServerTokenExchange = true, returnining redirectUrl",
|
|
216
|
-
|
|
228
|
+
appUrl
|
|
217
229
|
);
|
|
218
230
|
return NextResponse2.json({
|
|
219
231
|
status: "success",
|
|
220
|
-
redirectUrl:
|
|
232
|
+
redirectUrl: appUrl
|
|
221
233
|
});
|
|
222
234
|
}
|
|
223
235
|
if (serverTokenExchangeFromState(state)) {
|
|
224
236
|
console.log(
|
|
225
|
-
"handleCallback serverTokenExchangeFromState, redirect to
|
|
226
|
-
|
|
237
|
+
"handleCallback serverTokenExchangeFromState, redirect to appUrl",
|
|
238
|
+
appUrl
|
|
227
239
|
);
|
|
228
|
-
if (!
|
|
229
|
-
throw new Error("appUrl
|
|
240
|
+
if (!appUrl) {
|
|
241
|
+
throw new Error("appUrl undefined. Cannot redirect.");
|
|
230
242
|
}
|
|
231
|
-
return NextResponse2.redirect(`${
|
|
243
|
+
return NextResponse2.redirect(`${appUrl}`);
|
|
232
244
|
}
|
|
233
245
|
const response = new NextResponse2(
|
|
234
246
|
`<html><span style="display:none">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`
|
|
@@ -237,22 +249,18 @@ function handleCallback(request, config) {
|
|
|
237
249
|
return response;
|
|
238
250
|
});
|
|
239
251
|
}
|
|
240
|
-
var getAbsoluteRedirectPath = (redirectPath, currentBasePath) =>
|
|
241
|
-
if (/^(https?:\/\/|www\.).+/i.test(redirectPath)) {
|
|
242
|
-
return redirectPath;
|
|
243
|
-
}
|
|
244
|
-
return new URL(redirectPath, currentBasePath).href;
|
|
245
|
-
};
|
|
252
|
+
var getAbsoluteRedirectPath = (redirectPath, currentBasePath) => new URL(redirectPath, currentBasePath).href;
|
|
246
253
|
function handleLogout(request, config) {
|
|
247
254
|
return __async(this, null, function* () {
|
|
248
|
-
var _a
|
|
255
|
+
var _a;
|
|
249
256
|
const resolvedConfigs = resolveAuthConfig(config);
|
|
250
257
|
const defaultRedirectPath = (_a = resolvedConfigs.loginUrl) != null ? _a : "/";
|
|
251
258
|
const redirectTarget = new URL(request.url).searchParams.get("redirect") || defaultRedirectPath;
|
|
252
259
|
const isAbsoluteRedirect = /^(https?:\/\/|www\.).+/i.test(redirectTarget);
|
|
253
|
-
const
|
|
260
|
+
const appUrl = request.nextUrl.searchParams.get("appUrl");
|
|
261
|
+
const finalRedirectUrl = isAbsoluteRedirect ? redirectTarget : getAbsoluteRedirectPath(
|
|
254
262
|
redirectTarget,
|
|
255
|
-
new URL(
|
|
263
|
+
new URL(appUrl != null ? appUrl : request.url).origin
|
|
256
264
|
);
|
|
257
265
|
const response = NextResponse2.redirect(finalRedirectUrl);
|
|
258
266
|
clearAuthCookies(config);
|
|
@@ -272,7 +280,7 @@ var handler = (authConfig = {}) => (request) => __async(void 0, null, function*
|
|
|
272
280
|
const lastSegment = pathSegments[pathSegments.length - 1];
|
|
273
281
|
switch (lastSegment) {
|
|
274
282
|
case "challenge":
|
|
275
|
-
return yield handleChallenge(config);
|
|
283
|
+
return yield handleChallenge(request, config);
|
|
276
284
|
case "callback":
|
|
277
285
|
return yield handleCallback(request, config);
|
|
278
286
|
case "logout":
|
package/dist/nextjs.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/nextjs/GetUser.ts","../src/nextjs/middleware.ts","../src/nextjs/routeHandler.ts"],"sourcesContent":["/**\n * Used on the server-side to get the user object from the cookie\n */\nimport { User } from \"@/types\";\nimport { GenericUserSession } from \"@/shared/UserSession\";\nimport { NextjsClientStorage } from \"@/nextjs/cookies\";\nimport { retrieveTokens } from \"@/shared/util\";\n\nexport const getUser = (): User | null => {\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n const tokens = retrieveTokens(clientStorage);\n const user = userSession.get();\n if (!user || !tokens) return null;\n\n return {\n ...user!,\n idToken: tokens.id_token,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? \"\",\n } as User;\n};\n","/**\n * Authenticates the user on all requests by checking the token cookie\n *\n * Usage:\n * Option 1: use if no other middleware (e.g. no next-intl etc)\n * export default authMiddleware();\n *\n * Option 2: use if other middleware is needed - default auth config\n * export default withAuth((request) => {\n * console.log('in custom middleware', request.nextUrl.pathname);\n * return NextResponse.next();\n * })\n *\n * Option 3: use if other middleware is needed - specifying auth config\n * const withCivicAuth = auth({ loginUrl: '/login', include: ['/[.*]/user'] })\n * export default withCivicAuth((request) => {\n * console.log('in custom middleware', request.url);\n * return NextResponse.next();\n * })\n *\n */\nimport { NextRequest, NextResponse } from \"next/server.js\";\nimport picomatch from \"picomatch\";\nimport {\n AuthConfig,\n defaultAuthConfig,\n resolveAuthConfig,\n} from \"@/nextjs/config.js\";\n\ntype Middleware = (\n request: NextRequest,\n) => Promise<NextResponse> | NextResponse;\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchGlob = (pathname: string, globPattern: string) => {\n const matches = picomatch(globPattern);\n return matches(pathname);\n};\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchesGlobs = (pathname: string, patterns: string[]) =>\n patterns.some((pattern) => {\n if (!pattern) return false;\n console.log(\"matching\", {\n pattern,\n pathname,\n match: matchGlob(pathname, pattern),\n });\n return matchGlob(pathname, pattern);\n });\n\n// internal - used by all exported functions\nconst applyAuth = async (\n authConfig: AuthConfig,\n request: NextRequest,\n): Promise<NextResponse | undefined> => {\n const authConfigWithDefaults = resolveAuthConfig(authConfig);\n // Check for any valid auth token\n const isAuthenticated = !!request.cookies.get(\"id_token\");\n\n // skip auth check for redirect to login url\n if (\n request.nextUrl.pathname === authConfigWithDefaults.loginUrl &&\n request.method === \"GET\"\n ) {\n console.log(\"→ Skipping auth check - this is the login URL\");\n return undefined;\n }\n\n if (!matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.include)) {\n console.log(\"→ Skipping auth check - path not in include patterns\");\n return undefined;\n }\n\n if (matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.exclude)) {\n console.log(\"→ Skipping auth check - path in exclude patterns\");\n return undefined;\n }\n\n // Check for either token type\n if (!isAuthenticated) {\n const loginUrl = new URL(authConfigWithDefaults.loginUrl, request.url);\n console.log(\"→ No valid token found - redirecting to login\", loginUrl);\n return NextResponse.redirect(loginUrl);\n }\n\n console.log(\"→ Auth check passed\");\n return undefined;\n};\n\n/**\n *\n * Use this when auth is the only middleware you need.\n * Usage:\n *\n * export default authMiddleware({ loginUrl = '/login' }); // or just authMiddleware();\n *\n */\nexport const authMiddleware =\n (authConfig = defaultAuthConfig) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n // NextJS doesn't do middleware chaining yet, so this does not mean\n // \"call the next middleware\" - it means \"continue to the route handler\"\n return NextResponse.next();\n };\n\n/**\n * Usage:\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n */\n// use this when you have your own middleware to chain\nexport function withAuth(\n middleware: Middleware,\n): (request: NextRequest) => Promise<NextResponse> {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth({}, request);\n if (response) return response;\n\n return middleware(request);\n };\n}\n\n/**\n * Use this when you want to configure the middleware here (an alternative is to do it in the next.config file)\n *\n * Usage:\n *\n * const withAuth = auth({ loginUrl = '/login' }); // or just auth();\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n *\n */\nexport function auth(authConfig: AuthConfig = {}) {\n return (\n middleware: Middleware,\n ): ((request: NextRequest) => Promise<NextResponse>) => {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n return middleware(request);\n };\n };\n}\n","import { NextRequest, NextResponse } from \"next/server.js\";\nimport { revalidatePath } from \"next/cache.js\";\nimport { AuthConfig, resolveAuthConfig } from \"@/nextjs/config.js\";\nimport { loggers } from \"@/lib/logger.js\";\nimport {\n clearAuthCookies,\n NextjsClientStorage,\n NextjsCookieStorage,\n} from \"@/nextjs/cookies.js\";\nimport { GenericPublicClientPKCEProducer } from \"@/services/PKCE.js\";\nimport { resolveOAuthAccessCode } from \"@/server/login.js\";\nimport { getUser } from \"@/shared/session.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { GenericUserSession } from \"@/shared/UserSession.js\";\nimport {\n TOKEN_EXCHANGE_SUCCESS_TEXT,\n TOKEN_EXCHANGE_TRIGGER_TEXT,\n} from \"@/constants.js\";\nimport { serverTokenExchangeFromState } from \"@/lib/oauth.js\";\nimport { cookies } from \"next/headers.js\";\nimport { CodeVerifier } from \"@/shared/types\";\n\nconst logger = loggers.nextjs.handlers.auth;\n\nclass AuthError extends Error {\n constructor(\n message: string,\n public readonly status: number = 401,\n ) {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\n/**\n * create a code verifier and challenge for PKCE\n * saving the verifier in a cookie for later use\n * @returns {Promise<NextResponse>}\n */\nasync function handleChallenge(config: AuthConfig): Promise<NextResponse> {\n const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});\n const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);\n\n const challenge = await pkceProducer.getCodeChallenge();\n\n return NextResponse.json({ status: \"success\", challenge });\n}\n\nasync function performTokenExchangeAndSetCookies(\n request: NextRequest,\n config: AuthConfig,\n code: string,\n state: string,\n) {\n const resolvedConfigs = resolveAuthConfig(config);\n const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);\n\n const callbackUrl = resolveCallbackUrl(resolvedConfigs, request.url);\n try {\n await resolveOAuthAccessCode(code, state, cookieStorage, {\n ...resolvedConfigs,\n redirectUrl: callbackUrl,\n });\n } catch (error) {\n logger.error(\"Token exchange failed:\", error);\n throw new AuthError(\"Failed to authenticate user\", 401);\n }\n\n const user = await getUser(cookieStorage);\n if (!user) {\n throw new AuthError(\"Failed to get user info\", 401);\n }\n\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n userSession.set(user);\n}\nasync function handleCallback(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n console.log(\"handleCallback\", { request, resolvedConfigs });\n const code = request.nextUrl.searchParams.get(\"code\");\n const state = request.nextUrl.searchParams.get(\"state\") || \"\";\n if (!code || !state) throw new AuthError(\"Bad parameters\", 400);\n\n // If we have a code_verifier cookie, we can do a token exchange.\n // Otherwise, just render an empty page.\n // The initial redirect back from the auth server does not send cookies, because the redirect is from a 3rd-party domain.\n // The client will make an additional call to this route with cookies included, at which point we do the token exchange.\n console.log(\"handleCallback\", { code, state, cookies: cookies() });\n if (!request.cookies.get(CodeVerifier.COOKIE_NAME)) {\n console.log(\"handleCallback no code_verifier found\", {\n state,\n serverTokenExchange: serverTokenExchangeFromState(`${state}`),\n });\n let response = new NextResponse(\n `<html><body><span style=\"display:none\">${TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`,\n );\n // in server-side token exchange mode we need to launch a page that will trigger the token exchange\n // from the same domain, allowing it access to the code_verifier cookie\n // we only need to do this in redirect mode, as the iframe already triggers a client-side token exchange\n // if no code-verifier cookie is found\n if (state && serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, launching redirect page...\",\n {\n requestUrl: request.url,\n configCallbackUrl: resolvedConfigs.callbackUrl,\n },\n );\n // we need to replace the URL with resolved config in case the server is hosted\n // behind a reverse proxy or load balancer\n const requestUrl = new URL(request.url);\n const fetchUrl = `${resolvedConfigs.callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainServerTokenExchange=true`;\n response = new NextResponse(\n `<html>\n <body>\n <span style=\"display:none\">\n <script>\n window.onload = function () {\n fetch('${fetchUrl}').then((response) => {\n response.json().then((jsonResponse) => {\n console.log('fetch jsonResponse', jsonResponse);\n if (jsonResponse.redirectUrl) {\n console.log('handleCallback serverTokenExchangeFromState, redirecting');\n window.location.href = jsonResponse.redirectUrl;\n }\n });\n });\n };\n </script>\n </span>\n </body>\n </html>\n `,\n );\n }\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n console.log(\n `handleCallback no code_verifier found, returning ${TOKEN_EXCHANGE_TRIGGER_TEXT}`,\n );\n return response;\n }\n\n await performTokenExchangeAndSetCookies(\n request,\n resolvedConfigs,\n code,\n state,\n );\n\n if (request.url.includes(\"sameDomainServerTokenExchange=true\")) {\n console.log(\n \"handleCallback sameDomainServerTokenExchange = true, returnining redirectUrl\",\n resolvedConfigs.appUrl,\n );\n return NextResponse.json({\n status: \"success\",\n redirectUrl: resolvedConfigs.appUrl,\n });\n }\n\n // this is the case where a 'normal' redirect is happening\n if (serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, redirect to config.appUrl\",\n resolvedConfigs.appUrl,\n );\n if (!resolvedConfigs.appUrl) {\n throw new Error(\"appUrl not defined in config. Cannot redirect.\");\n }\n return NextResponse.redirect(`${resolvedConfigs.appUrl}`);\n }\n // return an empty HTML response so the iframe doesn't show any response\n // in the short moment between the redirect and the parent window\n // acknowledging the redirect and closing the iframe\n const response = new NextResponse(\n `<html><span style=\"display:none\">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`,\n );\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n return response;\n}\n\n/**\n * If redirectPath is an absolute path, return it as-is.\n * Otherwise for relative paths, append it to the current domain.\n * @param redirectPath\n * @returns\n */\nconst getAbsoluteRedirectPath = (\n redirectPath: string,\n currentBasePath: string,\n) => {\n // Check if the redirectPath is an absolute URL\n if (/^(https?:\\/\\/|www\\.).+/i.test(redirectPath)) {\n return redirectPath; // Return as-is if it's an absolute URL\n }\n return new URL(redirectPath, currentBasePath).href;\n};\n\nexport async function handleLogout(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n const defaultRedirectPath = resolvedConfigs.loginUrl ?? \"/\";\n const redirectTarget =\n new URL(request.url).searchParams.get(\"redirect\") || defaultRedirectPath;\n const isAbsoluteRedirect = /^(https?:\\/\\/|www\\.).+/i.test(redirectTarget);\n const finalRedirectUrl = getAbsoluteRedirectPath(\n redirectTarget,\n new URL(resolvedConfigs.appUrl ?? request.url).origin,\n );\n\n const response = NextResponse.redirect(finalRedirectUrl);\n\n clearAuthCookies(config);\n\n try {\n revalidatePath(isAbsoluteRedirect ? finalRedirectUrl : redirectTarget);\n } catch (error) {\n logger.warn(\"Failed to revalidate path after logout:\", error);\n }\n\n return response;\n}\n\n/**\n * Creates an authentication handler for Next.js API routes\n *\n * Usage:\n * ```ts\n * // app/api/auth/[...civicauth]/route.ts\n * import { handler } from '@civic/auth/nextjs'\n * export const GET = handler({\n * // optional config overrides\n * })\n * ```\n */\nexport const handler =\n (authConfig = {}) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const config = resolveAuthConfig(authConfig);\n\n try {\n const pathname = request.nextUrl.pathname;\n const pathSegments = pathname.split(\"/\");\n const lastSegment = pathSegments[pathSegments.length - 1];\n\n switch (lastSegment) {\n case \"challenge\":\n return await handleChallenge(config);\n case \"callback\":\n return await handleCallback(request, config);\n case \"logout\":\n return await handleLogout(request, config);\n default:\n throw new AuthError(`Invalid auth route: ${pathname}`, 404);\n }\n } catch (error) {\n logger.error(\"Auth handler error:\", error);\n\n const status = error instanceof AuthError ? error.status : 500;\n const message =\n error instanceof Error ? error.message : \"Authentication failed\";\n\n const response = NextResponse.json({ error: message }, { status });\n\n clearAuthCookies(config);\n return response;\n }\n };\n"],"mappings":"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","names":["getUser","NextResponse","NextResponse","response"]}
|
|
1
|
+
{"version":3,"sources":["../src/nextjs/GetUser.ts","../src/nextjs/middleware.ts","../src/nextjs/routeHandler.ts"],"sourcesContent":["/**\n * Used on the server-side to get the user object from the cookie\n */\nimport { User } from \"@/types\";\nimport { GenericUserSession } from \"@/shared/UserSession\";\nimport { NextjsClientStorage } from \"@/nextjs/cookies\";\nimport { retrieveTokens } from \"@/shared/util\";\n\nexport const getUser = (): User | null => {\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n const tokens = retrieveTokens(clientStorage);\n const user = userSession.get();\n if (!user || !tokens) return null;\n\n return {\n ...user!,\n idToken: tokens.id_token,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? \"\",\n } as User;\n};\n","/**\n * Authenticates the user on all requests by checking the token cookie\n *\n * Usage:\n * Option 1: use if no other middleware (e.g. no next-intl etc)\n * export default authMiddleware();\n *\n * Option 2: use if other middleware is needed - default auth config\n * export default withAuth((request) => {\n * console.log('in custom middleware', request.nextUrl.pathname);\n * return NextResponse.next();\n * })\n *\n * Option 3: use if other middleware is needed - specifying auth config\n * const withCivicAuth = auth({ loginUrl: '/login', include: ['/[.*]/user'] })\n * export default withCivicAuth((request) => {\n * console.log('in custom middleware', request.url);\n * return NextResponse.next();\n * })\n *\n */\nimport { NextRequest, NextResponse } from \"next/server.js\";\nimport picomatch from \"picomatch\";\nimport {\n AuthConfig,\n defaultAuthConfig,\n resolveAuthConfig,\n} from \"@/nextjs/config.js\";\n\ntype Middleware = (\n request: NextRequest,\n) => Promise<NextResponse> | NextResponse;\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchGlob = (pathname: string, globPattern: string) => {\n const matches = picomatch(globPattern);\n return matches(pathname);\n};\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchesGlobs = (pathname: string, patterns: string[]) =>\n patterns.some((pattern) => {\n if (!pattern) return false;\n console.log(\"matching\", {\n pattern,\n pathname,\n match: matchGlob(pathname, pattern),\n });\n return matchGlob(pathname, pattern);\n });\n\n// internal - used by all exported functions\nconst applyAuth = async (\n authConfig: AuthConfig,\n request: NextRequest,\n): Promise<NextResponse | undefined> => {\n const authConfigWithDefaults = resolveAuthConfig(authConfig);\n // Check for any valid auth token\n const isAuthenticated = !!request.cookies.get(\"id_token\");\n\n // skip auth check for redirect to login url\n if (\n request.nextUrl.pathname === authConfigWithDefaults.loginUrl &&\n request.method === \"GET\"\n ) {\n console.log(\"→ Skipping auth check - this is the login URL\");\n return undefined;\n }\n\n if (!matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.include)) {\n console.log(\"→ Skipping auth check - path not in include patterns\");\n return undefined;\n }\n\n if (matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.exclude)) {\n console.log(\"→ Skipping auth check - path in exclude patterns\");\n return undefined;\n }\n\n // Check for either token type\n if (!isAuthenticated) {\n const loginUrl = new URL(authConfigWithDefaults.loginUrl, request.url);\n console.log(\"→ No valid token found - redirecting to login\", loginUrl);\n return NextResponse.redirect(loginUrl);\n }\n\n console.log(\"→ Auth check passed\");\n return undefined;\n};\n\n/**\n *\n * Use this when auth is the only middleware you need.\n * Usage:\n *\n * export default authMiddleware({ loginUrl = '/login' }); // or just authMiddleware();\n *\n */\nexport const authMiddleware =\n (authConfig = defaultAuthConfig) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n // NextJS doesn't do middleware chaining yet, so this does not mean\n // \"call the next middleware\" - it means \"continue to the route handler\"\n return NextResponse.next();\n };\n\n/**\n * Usage:\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n */\n// use this when you have your own middleware to chain\nexport function withAuth(\n middleware: Middleware,\n): (request: NextRequest) => Promise<NextResponse> {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth({}, request);\n if (response) return response;\n\n return middleware(request);\n };\n}\n\n/**\n * Use this when you want to configure the middleware here (an alternative is to do it in the next.config file)\n *\n * Usage:\n *\n * const withAuth = auth({ loginUrl = '/login' }); // or just auth();\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n *\n */\nexport function auth(authConfig: AuthConfig = {}) {\n return (\n middleware: Middleware,\n ): ((request: NextRequest) => Promise<NextResponse>) => {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n return middleware(request);\n };\n };\n}\n","import { NextRequest, NextResponse } from \"next/server.js\";\nimport { revalidatePath } from \"next/cache.js\";\nimport { AuthConfig, resolveAuthConfig } from \"@/nextjs/config.js\";\nimport { loggers } from \"@/lib/logger.js\";\nimport {\n clearAuthCookies,\n NextjsClientStorage,\n NextjsCookieStorage,\n} from \"@/nextjs/cookies.js\";\nimport { GenericPublicClientPKCEProducer } from \"@/services/PKCE.js\";\nimport { resolveOAuthAccessCode } from \"@/server/login.js\";\nimport { getUser } from \"@/shared/session.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { GenericUserSession } from \"@/shared/UserSession.js\";\nimport {\n TOKEN_EXCHANGE_SUCCESS_TEXT,\n TOKEN_EXCHANGE_TRIGGER_TEXT,\n} from \"@/constants.js\";\nimport { serverTokenExchangeFromState } from \"@/lib/oauth.js\";\nimport { cookies } from \"next/headers.js\";\nimport { CodeVerifier } from \"@/shared/types\";\n\nconst logger = loggers.nextjs.handlers.auth;\n\nclass AuthError extends Error {\n constructor(\n message: string,\n public readonly status: number = 401,\n ) {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\n/**\n * create a code verifier and challenge for PKCE\n * saving the verifier in a cookie for later use\n * @returns {Promise<NextResponse>}\n */\nasync function handleChallenge(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});\n const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);\n\n const challenge = await pkceProducer.getCodeChallenge();\n const appUrl = request.nextUrl.searchParams.get(\"appUrl\");\n if (appUrl) {\n cookieStorage.set(CodeVerifier.APP_URL, appUrl);\n }\n return NextResponse.json({ status: \"success\", challenge });\n}\n\nasync function performTokenExchangeAndSetCookies(\n request: NextRequest,\n config: AuthConfig,\n code: string,\n state: string,\n appUrl: string,\n) {\n const resolvedConfigs = resolveAuthConfig(config);\n const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);\n\n const callbackUrl = resolveCallbackUrl(resolvedConfigs, appUrl);\n try {\n await resolveOAuthAccessCode(code, state, cookieStorage, {\n ...resolvedConfigs,\n redirectUrl: callbackUrl,\n });\n } catch (error) {\n logger.error(\"Token exchange failed:\", error);\n throw new AuthError(\"Failed to authenticate user\", 401);\n }\n\n const user = await getUser(cookieStorage);\n if (!user) {\n throw new AuthError(\"Failed to get user info\", 401);\n }\n\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n userSession.set(user);\n}\nasync function handleCallback(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n console.log(\"handleCallback\", { request, resolvedConfigs });\n const code = request.nextUrl.searchParams.get(\"code\");\n const state = request.nextUrl.searchParams.get(\"state\") || \"\";\n if (!code || !state) throw new AuthError(\"Bad parameters\", 400);\n\n // appUrl is passed from the client to the server in the query string\n // this is necessary because the server does not have access to the client's window.location.origin\n // and can not accurately determine the appUrl (specially if the app is behind a reverse proxy)\n const appUrl =\n request.cookies.get(CodeVerifier.APP_URL)?.value ||\n request.nextUrl.searchParams.get(\"appUrl\");\n\n // If we have a code_verifier cookie and the appUrl, we can do a token exchange.\n // Otherwise, just render an empty page.\n // The initial redirect back from the auth server does not send cookies, because the redirect is from a 3rd-party domain.\n // The client will make an additional call to this route with cookies included, at which point we do the token exchange.\n console.log(\"handleCallback\", {\n code,\n state,\n cookies: cookies(),\n appUrl,\n });\n\n const codeVerifier = request.cookies.get(CodeVerifier.COOKIE_NAME);\n\n if (!codeVerifier || !appUrl) {\n console.log(\"handleCallback no code_verifier found\", {\n state,\n serverTokenExchange: serverTokenExchangeFromState(`${state}`),\n });\n let response = new NextResponse(\n `<html><body><span style=\"display:none\">${TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`,\n );\n\n // in server-side token exchange mode we need to launch a page that will trigger the token exchange\n // from the same domain, allowing it access to the code_verifier cookie\n // we only need to do this in redirect mode, as the iframe already triggers a client-side token exchange\n // if no code-verifier cookie is found\n if (state && serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, launching redirect page...\",\n {\n requestUrl: request.url,\n configCallbackUrl: resolvedConfigs.callbackUrl,\n },\n );\n // we need to replace the URL with resolved config in case the server is hosted\n // behind a reverse proxy or load balancer\n const requestUrl = new URL(request.url);\n const fetchUrl = `${resolvedConfigs.callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainServerTokenExchange=true`;\n response = new NextResponse(\n `<html>\n <body>\n <span style=\"display:none\">\n <script>\n window.onload = function () {\n const appUrl = globalThis.window?.location?.origin;\n fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {\n response.json().then((jsonResponse) => {\n console.log('fetch jsonResponse', jsonResponse);\n if (jsonResponse.redirectUrl) {\n console.log('handleCallback serverTokenExchangeFromState, redirecting');\n window.location.href = jsonResponse.redirectUrl;\n }\n });\n });\n };\n </script>\n </span>\n </body>\n </html>\n `,\n );\n }\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n console.log(\n `handleCallback no code_verifier found, returning ${TOKEN_EXCHANGE_TRIGGER_TEXT}`,\n );\n return response;\n }\n\n await performTokenExchangeAndSetCookies(\n request,\n resolvedConfigs,\n code,\n state,\n appUrl,\n );\n\n if (request.url.includes(\"sameDomainServerTokenExchange=true\")) {\n console.log(\n \"handleCallback sameDomainServerTokenExchange = true, returnining redirectUrl\",\n appUrl,\n );\n return NextResponse.json({\n status: \"success\",\n redirectUrl: appUrl,\n });\n }\n\n // this is the case where a 'normal' redirect is happening\n if (serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, redirect to appUrl\",\n appUrl,\n );\n if (!appUrl) {\n throw new Error(\"appUrl undefined. Cannot redirect.\");\n }\n return NextResponse.redirect(`${appUrl}`);\n }\n // return an empty HTML response so the iframe doesn't show any response\n // in the short moment between the redirect and the parent window\n // acknowledging the redirect and closing the iframe\n const response = new NextResponse(\n `<html><span style=\"display:none\">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`,\n );\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n return response;\n}\n\n/**\n * If redirectPath is an absolute path, return it as-is.\n * Otherwise for relative paths, append it to the current domain.\n * @param redirectPath\n * @returns\n */\nconst getAbsoluteRedirectPath = (\n redirectPath: string,\n currentBasePath: string,\n) => new URL(redirectPath, currentBasePath).href;\n\nexport async function handleLogout(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n const defaultRedirectPath = resolvedConfigs.loginUrl ?? \"/\";\n const redirectTarget =\n new URL(request.url).searchParams.get(\"redirect\") || defaultRedirectPath;\n\n const isAbsoluteRedirect = /^(https?:\\/\\/|www\\.).+/i.test(redirectTarget);\n\n const appUrl = request.nextUrl.searchParams.get(\"appUrl\");\n\n const finalRedirectUrl = isAbsoluteRedirect\n ? redirectTarget\n : getAbsoluteRedirectPath(\n redirectTarget,\n new URL(appUrl ?? request.url).origin,\n );\n\n const response = NextResponse.redirect(finalRedirectUrl);\n\n clearAuthCookies(config);\n\n try {\n revalidatePath(isAbsoluteRedirect ? finalRedirectUrl : redirectTarget);\n } catch (error) {\n logger.warn(\"Failed to revalidate path after logout:\", error);\n }\n\n return response;\n}\n\n/**\n * Creates an authentication handler for Next.js API routes\n *\n * Usage:\n * ```ts\n * // app/api/auth/[...civicauth]/route.ts\n * import { handler } from '@civic/auth/nextjs'\n * export const GET = handler({\n * // optional config overrides\n * })\n * ```\n */\nexport const handler =\n (authConfig = {}) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const config = resolveAuthConfig(authConfig);\n\n try {\n const pathname = request.nextUrl.pathname;\n const pathSegments = pathname.split(\"/\");\n const lastSegment = pathSegments[pathSegments.length - 1];\n\n switch (lastSegment) {\n case \"challenge\":\n return await handleChallenge(request, config);\n case \"callback\":\n return await handleCallback(request, config);\n case \"logout\":\n return await handleLogout(request, config);\n default:\n throw new AuthError(`Invalid auth route: ${pathname}`, 404);\n }\n } catch (error) {\n logger.error(\"Auth handler error:\", error);\n\n const status = error instanceof AuthError ? error.status : 500;\n const message =\n error instanceof Error ? error.message : \"Authentication failed\";\n\n const response = NextResponse.json({ error: message }, { status });\n\n clearAuthCookies(config);\n return response;\n }\n };\n"],"mappings":"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","names":["getUser","NextResponse","NextResponse","response"]}
|
package/dist/react.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { U as UserContextType, A as AuthContextType } from './UserProvider-
|
|
2
|
-
import { F as ForwardedTokens, C as Config, S as SessionData, D as DisplayMode } from './types-
|
|
3
|
-
import { RefObject, Dispatch, SetStateAction
|
|
1
|
+
import { U as UserContextType, A as AuthContextType } from './UserProvider-Bl3j1PUO.mjs';
|
|
2
|
+
import { F as ForwardedTokens, C as Config, S as SessionData, D as DisplayMode } from './types-BxAubCqO.mjs';
|
|
3
|
+
import { RefObject, Dispatch, SetStateAction } from 'react';
|
|
4
4
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
5
|
-
import { A as AuthProviderProps } from './AuthProvider-
|
|
5
|
+
import { A as AuthProviderProps } from './AuthProvider-BYZ8w92b.mjs';
|
|
6
6
|
import 'oslo/jwt';
|
|
7
7
|
import 'oslo/oauth2';
|
|
8
8
|
|
|
@@ -62,8 +62,4 @@ declare const SignOutButton: ({ className }: {
|
|
|
62
62
|
className?: string;
|
|
63
63
|
}) => react_jsx_runtime.JSX.Element;
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
children: ReactNode;
|
|
67
|
-
}) => react_jsx_runtime.JSX.Element;
|
|
68
|
-
|
|
69
|
-
export { AuthContextType, CivicAuthIframeContainer, CivicAuthProvider, type CivicAuthProviderProps, NextLogOut, SignInButton, SignOutButton, type TokenContextType, UserButton, UserContextType, useAuth, useConfig, useIframe, useSession, useToken, useUser };
|
|
65
|
+
export { AuthContextType, CivicAuthIframeContainer, CivicAuthProvider, type CivicAuthProviderProps, SignInButton, SignOutButton, type TokenContextType, UserButton, UserContextType, useAuth, useConfig, useIframe, useSession, useToken, useUser };
|
package/dist/react.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { U as UserContextType, A as AuthContextType } from './UserProvider-
|
|
2
|
-
import { F as ForwardedTokens, C as Config, S as SessionData, D as DisplayMode } from './types-
|
|
3
|
-
import { RefObject, Dispatch, SetStateAction
|
|
1
|
+
import { U as UserContextType, A as AuthContextType } from './UserProvider-BA2uflVB.js';
|
|
2
|
+
import { F as ForwardedTokens, C as Config, S as SessionData, D as DisplayMode } from './types-BxAubCqO.js';
|
|
3
|
+
import { RefObject, Dispatch, SetStateAction } from 'react';
|
|
4
4
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
5
|
-
import { A as AuthProviderProps } from './AuthProvider-
|
|
5
|
+
import { A as AuthProviderProps } from './AuthProvider-BgOwv9h8.js';
|
|
6
6
|
import 'oslo/jwt';
|
|
7
7
|
import 'oslo/oauth2';
|
|
8
8
|
|
|
@@ -62,8 +62,4 @@ declare const SignOutButton: ({ className }: {
|
|
|
62
62
|
className?: string;
|
|
63
63
|
}) => react_jsx_runtime.JSX.Element;
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
children: ReactNode;
|
|
67
|
-
}) => react_jsx_runtime.JSX.Element;
|
|
68
|
-
|
|
69
|
-
export { AuthContextType, CivicAuthIframeContainer, CivicAuthProvider, type CivicAuthProviderProps, NextLogOut, SignInButton, SignOutButton, type TokenContextType, UserButton, UserContextType, useAuth, useConfig, useIframe, useSession, useToken, useUser };
|
|
65
|
+
export { AuthContextType, CivicAuthIframeContainer, CivicAuthProvider, type CivicAuthProviderProps, SignInButton, SignOutButton, type TokenContextType, UserButton, UserContextType, useAuth, useConfig, useIframe, useSession, useToken, useUser };
|
package/dist/react.js
CHANGED
|
@@ -8,15 +8,12 @@
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunkGB3H3I47js = require('./chunk-GB3H3I47.js');
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
var _chunk2OZJONNOjs = require('./chunk-2OZJONNO.js');
|
|
15
14
|
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
var _chunk7K3QN2ATjs = require('./chunk-7K3QN2AT.js');
|
|
16
|
+
var _chunkAM2Y662Ijs = require('./chunk-AM2Y662I.js');
|
|
20
17
|
|
|
21
18
|
|
|
22
19
|
|
|
@@ -35,17 +32,17 @@ var queryClient = new (0, _reactquery.QueryClient)();
|
|
|
35
32
|
var CivicAuthProvider = (_a) => {
|
|
36
33
|
var _b = _a, { children } = _b, props = _chunkCRTRMMJ7js.__objRest.call(void 0, _b, ["children"]);
|
|
37
34
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactquery.QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
38
|
-
|
|
35
|
+
_chunkGB3H3I47js.AuthProvider,
|
|
39
36
|
_chunkCRTRMMJ7js.__spreadProps.call(void 0, _chunkCRTRMMJ7js.__spreadValues.call(void 0, {}, props), {
|
|
40
|
-
pkceConsumer: new (0,
|
|
41
|
-
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
37
|
+
pkceConsumer: new (0, _chunkAM2Y662Ijs.BrowserPublicClientPKCEProducer)(),
|
|
38
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGB3H3I47js.UserProvider, { storage: new (0, _chunkAM2Y662Ijs.LocalStorageAdapter)(), children })
|
|
42
39
|
})
|
|
43
40
|
) });
|
|
44
41
|
};
|
|
45
42
|
|
|
46
43
|
// src/react/hooks/useUser.tsx
|
|
47
44
|
var useUser = () => {
|
|
48
|
-
const context = _react.useContext.call(void 0,
|
|
45
|
+
const context = _react.useContext.call(void 0, _chunkGB3H3I47js.UserContext);
|
|
49
46
|
if (!context) {
|
|
50
47
|
throw new Error("useUser must be used within a UserProvider");
|
|
51
48
|
}
|
|
@@ -127,7 +124,7 @@ var UserButton = ({
|
|
|
127
124
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
128
125
|
"button",
|
|
129
126
|
{
|
|
130
|
-
className:
|
|
127
|
+
className: _chunkAM2Y662Ijs.cn.call(void 0,
|
|
131
128
|
"cac-flex cac-w-full cac-items-center cac-justify-between cac-gap-2 cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-text-neutral-500 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50",
|
|
132
129
|
className
|
|
133
130
|
),
|
|
@@ -166,7 +163,7 @@ var UserButton = ({
|
|
|
166
163
|
"button",
|
|
167
164
|
{
|
|
168
165
|
"data-testid": "sign-in-button",
|
|
169
|
-
className:
|
|
166
|
+
className: _chunkAM2Y662Ijs.cn.call(void 0,
|
|
170
167
|
"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50",
|
|
171
168
|
className
|
|
172
169
|
),
|
|
@@ -187,7 +184,7 @@ var SignInButton = ({
|
|
|
187
184
|
"button",
|
|
188
185
|
{
|
|
189
186
|
"data-testid": "sign-in-button",
|
|
190
|
-
className:
|
|
187
|
+
className: _chunkAM2Y662Ijs.cn.call(void 0,
|
|
191
188
|
"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50",
|
|
192
189
|
className
|
|
193
190
|
),
|
|
@@ -204,7 +201,7 @@ var SignOutButton = ({ className }) => {
|
|
|
204
201
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
205
202
|
"button",
|
|
206
203
|
{
|
|
207
|
-
className:
|
|
204
|
+
className: _chunkAM2Y662Ijs.cn.call(void 0,
|
|
208
205
|
"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50",
|
|
209
206
|
className
|
|
210
207
|
),
|
|
@@ -214,15 +211,6 @@ var SignOutButton = ({ className }) => {
|
|
|
214
211
|
);
|
|
215
212
|
};
|
|
216
213
|
|
|
217
|
-
// src/react/components/NextLogOut.tsx
|
|
218
|
-
|
|
219
|
-
var NextLogOut = ({ children }) => {
|
|
220
|
-
const config = _chunk2OZJONNOjs.resolveAuthConfig.call(void 0, );
|
|
221
|
-
const logoutUrl = `${config.logoutUrl}`;
|
|
222
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "a", { href: logoutUrl, children });
|
|
223
|
-
};
|
|
224
|
-
|
|
225
|
-
|
|
226
214
|
|
|
227
215
|
|
|
228
216
|
|
|
@@ -234,5 +222,5 @@ var NextLogOut = ({ children }) => {
|
|
|
234
222
|
|
|
235
223
|
|
|
236
224
|
|
|
237
|
-
exports.CivicAuthIframeContainer =
|
|
225
|
+
exports.CivicAuthIframeContainer = _chunkGB3H3I47js.CivicAuthIframeContainer; exports.CivicAuthProvider = CivicAuthProvider; exports.SignInButton = SignInButton; exports.SignOutButton = SignOutButton; exports.UserButton = UserButton; exports.useAuth = _chunkGB3H3I47js.useAuth; exports.useConfig = _chunkGB3H3I47js.useConfig; exports.useIframe = _chunkGB3H3I47js.useIframe; exports.useSession = _chunkGB3H3I47js.useSession; exports.useToken = _chunkGB3H3I47js.useToken; exports.useUser = useUser;
|
|
238
226
|
//# sourceMappingURL=react.js.map
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/pedroapfilho/dev/civic-auth/packages/civic-auth-client/dist/react.js","../src/react/hooks/useUser.tsx","../src/shared/CivicAuthProvider.tsx","../src/react/components/UserButton.tsx","../src/react/components/SignInButton.tsx","../src/react/components/SignOutButton.tsx","../src/react/components/NextLogOut.tsx"],"names":["jsx","isOpen"],"mappings":"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","file":"/Users/pedroapfilho/dev/civic-auth/packages/civic-auth-client/dist/react.js","sourcesContent":[null,"\"use client\";\nimport { useContext } from \"react\";\nimport { UserContext, UserContextType } from \"@/react/providers\";\n\nconst useUser = <\n T extends Record<string, unknown> = Record<string, never>,\n>(): UserContextType<T> => {\n const context = useContext(UserContext);\n\n if (!context) {\n throw new Error(\"useUser must be used within a UserProvider\");\n }\n\n return context as UserContextType<T>;\n};\n\nexport { useUser };\n","\"use client\";\nimport { AuthProvider, AuthProviderProps } from \"./AuthProvider\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\n// adding the styles import here to be added to the bundle\nimport \"@civic/auth/styles.css\";\nimport { BrowserPublicClientPKCEProducer } from \"@/services/PKCE\";\nimport { UserProvider } from \"./UserProvider\";\nimport { LocalStorageAdapter } from \"@/browser/storage\";\n\nconst queryClient = new QueryClient();\n\ntype CivicAuthProviderProps = Omit<AuthProviderProps, \"pkceConsumer\">;\n\nconst CivicAuthProvider = ({ children, ...props }: CivicAuthProviderProps) => {\n return (\n <QueryClientProvider client={queryClient}>\n <AuthProvider\n {...props}\n pkceConsumer={new BrowserPublicClientPKCEProducer()}\n >\n <UserProvider storage={new LocalStorageAdapter()}>\n {children}\n </UserProvider>\n </AuthProvider>\n </QueryClientProvider>\n );\n};\n\nexport { CivicAuthProvider, type CivicAuthProviderProps };\n","\"use client\";\nimport { useUser } from \"@/react/hooks\";\nimport { DisplayMode } from \"@/types\";\nimport { cn } from \"@/utils\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nconst ChevronDown = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-down\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-up\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n);\n\nconst UserButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const { user, signIn, signOut } = useUser();\n\n const handleClickOutside = useCallback((event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (!target.closest(\"#civic-dropdown-container\")) {\n setIsOpen(false);\n }\n }, []);\n\n const handleSignOut = useCallback(async () => {\n signOut();\n\n setIsOpen(false);\n }, [signOut]);\n\n const handleSignIn = useCallback(async () => {\n await signIn(displayMode);\n\n setIsOpen(false);\n }, [signIn, displayMode]);\n\n const handleEscape = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n if (isOpen) {\n window.addEventListener(\"click\", handleClickOutside);\n\n window.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n window.removeEventListener(\"click\", handleClickOutside);\n\n window.removeEventListener(\"keydown\", handleEscape);\n };\n }, [handleClickOutside, handleEscape, isOpen]);\n\n if (user) {\n return (\n <div className=\"cac-relative\" id=\"civic-dropdown-container\">\n <button\n className={cn(\n \"cac-flex cac-w-full cac-items-center cac-justify-between cac-gap-2 cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-text-neutral-500 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => setIsOpen((isOpen) => !isOpen)}\n >\n {user?.picture ? (\n <span className=\"cac-relative cac-flex cac-h-10 cac-w-10 cac-shrink-0 cac-gap-2 cac-overflow-hidden cac-rounded-full\">\n <img\n className=\"cac-h-full cac-w-full cac-object-cover\"\n src={user.picture}\n alt={user?.name || user?.email}\n />\n </span>\n ) : (\n <div />\n )}\n\n <span>{user?.name || user?.email}</span>\n\n {isOpen ? <ChevronUp /> : <ChevronDown />}\n </button>\n <div\n className={\n isOpen\n ? \"cac-absolute cac-right-0 cac-mt-2 cac-w-full cac-rounded-lg cac-bg-white cac-py-2 cac-text-neutral-500 cac-shadow-xl\"\n : \"cac-hidden\"\n }\n >\n <ul>\n <li>\n <button\n className=\"cac-block cac-w-full cac-px-4 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\"\n onClick={handleSignOut}\n >\n Logout\n </button>\n </li>\n </ul>\n </div>\n </div>\n );\n }\n\n return (\n <button\n data-testid=\"sign-in-button\"\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={handleSignIn}\n >\n Sign in\n </button>\n );\n};\n\nexport { UserButton };\n","\"use client\";\nimport { cn } from \"@/utils\";\nimport { DisplayMode } from \"@/types\";\nimport { useUser } from \"@/react/hooks\";\n\nconst SignInButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const { signIn } = useUser();\n\n return (\n <button\n data-testid=\"sign-in-button\"\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => signIn(displayMode)}\n >\n Sign In\n </button>\n );\n};\n\nexport { SignInButton };\n","\"use client\";\nimport { cn } from \"@/utils\";\nimport { useUser } from \"@/react/hooks\";\n\nconst SignOutButton = ({ className }: { className?: string }) => {\n const { signOut } = useUser();\n\n return (\n <button\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => signOut()}\n >\n Sign Out\n </button>\n );\n};\n\nexport { SignOutButton };\n","/**\n * Trigger a backend API that logs the user out and then redirects to the homepage (TODO parameterize the redirect)\n */\nimport { resolveAuthConfig } from \"@/nextjs/config.js\";\nimport React, { ReactNode } from \"react\";\n\nconst NextLogOut = ({ children }: { children: ReactNode }) => {\n const config = resolveAuthConfig();\n const logoutUrl = `${config.logoutUrl}`;\n\n return <a href={logoutUrl}>{children}</a>;\n};\n\nexport { NextLogOut };\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/lucas/dev/civic/civic-auth/packages/civic-auth-client/dist/react.js","../src/react/hooks/useUser.tsx","../src/shared/CivicAuthProvider.tsx","../src/react/components/UserButton.tsx","../src/react/components/SignInButton.tsx","../src/react/components/SignOutButton.tsx"],"names":["jsx","isOpen"],"mappings":"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","file":"/Users/lucas/dev/civic/civic-auth/packages/civic-auth-client/dist/react.js","sourcesContent":[null,"\"use client\";\nimport { useContext } from \"react\";\nimport { UserContext, UserContextType } from \"@/react/providers\";\n\nconst useUser = <\n T extends Record<string, unknown> = Record<string, never>,\n>(): UserContextType<T> => {\n const context = useContext(UserContext);\n\n if (!context) {\n throw new Error(\"useUser must be used within a UserProvider\");\n }\n\n return context as UserContextType<T>;\n};\n\nexport { useUser };\n","\"use client\";\nimport { AuthProvider, AuthProviderProps } from \"./AuthProvider\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\n// adding the styles import here to be added to the bundle\nimport \"@civic/auth/styles.css\";\nimport { BrowserPublicClientPKCEProducer } from \"@/services/PKCE\";\nimport { UserProvider } from \"./UserProvider\";\nimport { LocalStorageAdapter } from \"@/browser/storage\";\n\nconst queryClient = new QueryClient();\n\ntype CivicAuthProviderProps = Omit<AuthProviderProps, \"pkceConsumer\">;\n\nconst CivicAuthProvider = ({ children, ...props }: CivicAuthProviderProps) => {\n return (\n <QueryClientProvider client={queryClient}>\n <AuthProvider\n {...props}\n pkceConsumer={new BrowserPublicClientPKCEProducer()}\n >\n <UserProvider storage={new LocalStorageAdapter()}>\n {children}\n </UserProvider>\n </AuthProvider>\n </QueryClientProvider>\n );\n};\n\nexport { CivicAuthProvider, type CivicAuthProviderProps };\n","\"use client\";\nimport { useUser } from \"@/react/hooks\";\nimport { DisplayMode } from \"@/types\";\nimport { cn } from \"@/utils\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nconst ChevronDown = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-down\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-up\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n);\n\nconst UserButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const { user, signIn, signOut } = useUser();\n\n const handleClickOutside = useCallback((event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (!target.closest(\"#civic-dropdown-container\")) {\n setIsOpen(false);\n }\n }, []);\n\n const handleSignOut = useCallback(async () => {\n signOut();\n\n setIsOpen(false);\n }, [signOut]);\n\n const handleSignIn = useCallback(async () => {\n await signIn(displayMode);\n\n setIsOpen(false);\n }, [signIn, displayMode]);\n\n const handleEscape = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n if (isOpen) {\n window.addEventListener(\"click\", handleClickOutside);\n\n window.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n window.removeEventListener(\"click\", handleClickOutside);\n\n window.removeEventListener(\"keydown\", handleEscape);\n };\n }, [handleClickOutside, handleEscape, isOpen]);\n\n if (user) {\n return (\n <div className=\"cac-relative\" id=\"civic-dropdown-container\">\n <button\n className={cn(\n \"cac-flex cac-w-full cac-items-center cac-justify-between cac-gap-2 cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-text-neutral-500 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => setIsOpen((isOpen) => !isOpen)}\n >\n {user?.picture ? (\n <span className=\"cac-relative cac-flex cac-h-10 cac-w-10 cac-shrink-0 cac-gap-2 cac-overflow-hidden cac-rounded-full\">\n <img\n className=\"cac-h-full cac-w-full cac-object-cover\"\n src={user.picture}\n alt={user?.name || user?.email}\n />\n </span>\n ) : (\n <div />\n )}\n\n <span>{user?.name || user?.email}</span>\n\n {isOpen ? <ChevronUp /> : <ChevronDown />}\n </button>\n <div\n className={\n isOpen\n ? \"cac-absolute cac-right-0 cac-mt-2 cac-w-full cac-rounded-lg cac-bg-white cac-py-2 cac-text-neutral-500 cac-shadow-xl\"\n : \"cac-hidden\"\n }\n >\n <ul>\n <li>\n <button\n className=\"cac-block cac-w-full cac-px-4 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\"\n onClick={handleSignOut}\n >\n Logout\n </button>\n </li>\n </ul>\n </div>\n </div>\n );\n }\n\n return (\n <button\n data-testid=\"sign-in-button\"\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={handleSignIn}\n >\n Sign in\n </button>\n );\n};\n\nexport { UserButton };\n","\"use client\";\nimport { cn } from \"@/utils\";\nimport { DisplayMode } from \"@/types\";\nimport { useUser } from \"@/react/hooks\";\n\nconst SignInButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const { signIn } = useUser();\n\n return (\n <button\n data-testid=\"sign-in-button\"\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => signIn(displayMode)}\n >\n Sign In\n </button>\n );\n};\n\nexport { SignInButton };\n","\"use client\";\nimport { cn } from \"@/utils\";\nimport { useUser } from \"@/react/hooks\";\n\nconst SignOutButton = ({ className }: { className?: string }) => {\n const { signOut } = useUser();\n\n return (\n <button\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => signOut()}\n >\n Sign Out\n </button>\n );\n};\n\nexport { SignOutButton };\n"]}
|
package/dist/react.mjs
CHANGED
|
@@ -8,15 +8,12 @@ import {
|
|
|
8
8
|
useIframe,
|
|
9
9
|
useSession,
|
|
10
10
|
useToken
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import {
|
|
13
|
-
resolveAuthConfig
|
|
14
|
-
} from "./chunk-ON4OH5OM.mjs";
|
|
11
|
+
} from "./chunk-EKLYHP2D.mjs";
|
|
15
12
|
import {
|
|
16
13
|
BrowserPublicClientPKCEProducer,
|
|
17
14
|
LocalStorageAdapter,
|
|
18
15
|
cn
|
|
19
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-Q7DSPTUG.mjs";
|
|
20
17
|
import {
|
|
21
18
|
__async,
|
|
22
19
|
__objRest,
|
|
@@ -213,18 +210,9 @@ var SignOutButton = ({ className }) => {
|
|
|
213
210
|
}
|
|
214
211
|
);
|
|
215
212
|
};
|
|
216
|
-
|
|
217
|
-
// src/react/components/NextLogOut.tsx
|
|
218
|
-
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
219
|
-
var NextLogOut = ({ children }) => {
|
|
220
|
-
const config = resolveAuthConfig();
|
|
221
|
-
const logoutUrl = `${config.logoutUrl}`;
|
|
222
|
-
return /* @__PURE__ */ jsx5("a", { href: logoutUrl, children });
|
|
223
|
-
};
|
|
224
213
|
export {
|
|
225
214
|
CivicAuthIframeContainer,
|
|
226
215
|
CivicAuthProvider,
|
|
227
|
-
NextLogOut,
|
|
228
216
|
SignInButton,
|
|
229
217
|
SignOutButton,
|
|
230
218
|
UserButton,
|
package/dist/react.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/hooks/useUser.tsx","../src/shared/CivicAuthProvider.tsx","../src/react/components/UserButton.tsx","../src/react/components/SignInButton.tsx","../src/react/components/SignOutButton.tsx","../src/react/components/NextLogOut.tsx"],"sourcesContent":["\"use client\";\nimport { useContext } from \"react\";\nimport { UserContext, UserContextType } from \"@/react/providers\";\n\nconst useUser = <\n T extends Record<string, unknown> = Record<string, never>,\n>(): UserContextType<T> => {\n const context = useContext(UserContext);\n\n if (!context) {\n throw new Error(\"useUser must be used within a UserProvider\");\n }\n\n return context as UserContextType<T>;\n};\n\nexport { useUser };\n","\"use client\";\nimport { AuthProvider, AuthProviderProps } from \"./AuthProvider\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\n// adding the styles import here to be added to the bundle\nimport \"@civic/auth/styles.css\";\nimport { BrowserPublicClientPKCEProducer } from \"@/services/PKCE\";\nimport { UserProvider } from \"./UserProvider\";\nimport { LocalStorageAdapter } from \"@/browser/storage\";\n\nconst queryClient = new QueryClient();\n\ntype CivicAuthProviderProps = Omit<AuthProviderProps, \"pkceConsumer\">;\n\nconst CivicAuthProvider = ({ children, ...props }: CivicAuthProviderProps) => {\n return (\n <QueryClientProvider client={queryClient}>\n <AuthProvider\n {...props}\n pkceConsumer={new BrowserPublicClientPKCEProducer()}\n >\n <UserProvider storage={new LocalStorageAdapter()}>\n {children}\n </UserProvider>\n </AuthProvider>\n </QueryClientProvider>\n );\n};\n\nexport { CivicAuthProvider, type CivicAuthProviderProps };\n","\"use client\";\nimport { useUser } from \"@/react/hooks\";\nimport { DisplayMode } from \"@/types\";\nimport { cn } from \"@/utils\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nconst ChevronDown = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-down\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-up\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n);\n\nconst UserButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const { user, signIn, signOut } = useUser();\n\n const handleClickOutside = useCallback((event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (!target.closest(\"#civic-dropdown-container\")) {\n setIsOpen(false);\n }\n }, []);\n\n const handleSignOut = useCallback(async () => {\n signOut();\n\n setIsOpen(false);\n }, [signOut]);\n\n const handleSignIn = useCallback(async () => {\n await signIn(displayMode);\n\n setIsOpen(false);\n }, [signIn, displayMode]);\n\n const handleEscape = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n if (isOpen) {\n window.addEventListener(\"click\", handleClickOutside);\n\n window.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n window.removeEventListener(\"click\", handleClickOutside);\n\n window.removeEventListener(\"keydown\", handleEscape);\n };\n }, [handleClickOutside, handleEscape, isOpen]);\n\n if (user) {\n return (\n <div className=\"cac-relative\" id=\"civic-dropdown-container\">\n <button\n className={cn(\n \"cac-flex cac-w-full cac-items-center cac-justify-between cac-gap-2 cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-text-neutral-500 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => setIsOpen((isOpen) => !isOpen)}\n >\n {user?.picture ? (\n <span className=\"cac-relative cac-flex cac-h-10 cac-w-10 cac-shrink-0 cac-gap-2 cac-overflow-hidden cac-rounded-full\">\n <img\n className=\"cac-h-full cac-w-full cac-object-cover\"\n src={user.picture}\n alt={user?.name || user?.email}\n />\n </span>\n ) : (\n <div />\n )}\n\n <span>{user?.name || user?.email}</span>\n\n {isOpen ? <ChevronUp /> : <ChevronDown />}\n </button>\n <div\n className={\n isOpen\n ? \"cac-absolute cac-right-0 cac-mt-2 cac-w-full cac-rounded-lg cac-bg-white cac-py-2 cac-text-neutral-500 cac-shadow-xl\"\n : \"cac-hidden\"\n }\n >\n <ul>\n <li>\n <button\n className=\"cac-block cac-w-full cac-px-4 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\"\n onClick={handleSignOut}\n >\n Logout\n </button>\n </li>\n </ul>\n </div>\n </div>\n );\n }\n\n return (\n <button\n data-testid=\"sign-in-button\"\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={handleSignIn}\n >\n Sign in\n </button>\n );\n};\n\nexport { UserButton };\n","\"use client\";\nimport { cn } from \"@/utils\";\nimport { DisplayMode } from \"@/types\";\nimport { useUser } from \"@/react/hooks\";\n\nconst SignInButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const { signIn } = useUser();\n\n return (\n <button\n data-testid=\"sign-in-button\"\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => signIn(displayMode)}\n >\n Sign In\n </button>\n );\n};\n\nexport { SignInButton };\n","\"use client\";\nimport { cn } from \"@/utils\";\nimport { useUser } from \"@/react/hooks\";\n\nconst SignOutButton = ({ className }: { className?: string }) => {\n const { signOut } = useUser();\n\n return (\n <button\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => signOut()}\n >\n Sign Out\n </button>\n );\n};\n\nexport { SignOutButton };\n","/**\n * Trigger a backend API that logs the user out and then redirects to the homepage (TODO parameterize the redirect)\n */\nimport { resolveAuthConfig } from \"@/nextjs/config.js\";\nimport React, { ReactNode } from \"react\";\n\nconst NextLogOut = ({ children }: { children: ReactNode }) => {\n const config = resolveAuthConfig();\n const logoutUrl = `${config.logoutUrl}`;\n\n return <a href={logoutUrl}>{children}</a>;\n};\n\nexport { NextLogOut };\n"],"mappings":"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","names":["jsx","isOpen","jsx","jsx","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/hooks/useUser.tsx","../src/shared/CivicAuthProvider.tsx","../src/react/components/UserButton.tsx","../src/react/components/SignInButton.tsx","../src/react/components/SignOutButton.tsx"],"sourcesContent":["\"use client\";\nimport { useContext } from \"react\";\nimport { UserContext, UserContextType } from \"@/react/providers\";\n\nconst useUser = <\n T extends Record<string, unknown> = Record<string, never>,\n>(): UserContextType<T> => {\n const context = useContext(UserContext);\n\n if (!context) {\n throw new Error(\"useUser must be used within a UserProvider\");\n }\n\n return context as UserContextType<T>;\n};\n\nexport { useUser };\n","\"use client\";\nimport { AuthProvider, AuthProviderProps } from \"./AuthProvider\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\n// adding the styles import here to be added to the bundle\nimport \"@civic/auth/styles.css\";\nimport { BrowserPublicClientPKCEProducer } from \"@/services/PKCE\";\nimport { UserProvider } from \"./UserProvider\";\nimport { LocalStorageAdapter } from \"@/browser/storage\";\n\nconst queryClient = new QueryClient();\n\ntype CivicAuthProviderProps = Omit<AuthProviderProps, \"pkceConsumer\">;\n\nconst CivicAuthProvider = ({ children, ...props }: CivicAuthProviderProps) => {\n return (\n <QueryClientProvider client={queryClient}>\n <AuthProvider\n {...props}\n pkceConsumer={new BrowserPublicClientPKCEProducer()}\n >\n <UserProvider storage={new LocalStorageAdapter()}>\n {children}\n </UserProvider>\n </AuthProvider>\n </QueryClientProvider>\n );\n};\n\nexport { CivicAuthProvider, type CivicAuthProviderProps };\n","\"use client\";\nimport { useUser } from \"@/react/hooks\";\nimport { DisplayMode } from \"@/types\";\nimport { cn } from \"@/utils\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nconst ChevronDown = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-down\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\nconst ChevronUp = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-chevron-up\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n);\n\nconst UserButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const { user, signIn, signOut } = useUser();\n\n const handleClickOutside = useCallback((event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (!target.closest(\"#civic-dropdown-container\")) {\n setIsOpen(false);\n }\n }, []);\n\n const handleSignOut = useCallback(async () => {\n signOut();\n\n setIsOpen(false);\n }, [signOut]);\n\n const handleSignIn = useCallback(async () => {\n await signIn(displayMode);\n\n setIsOpen(false);\n }, [signIn, displayMode]);\n\n const handleEscape = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n if (isOpen) {\n window.addEventListener(\"click\", handleClickOutside);\n\n window.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n window.removeEventListener(\"click\", handleClickOutside);\n\n window.removeEventListener(\"keydown\", handleEscape);\n };\n }, [handleClickOutside, handleEscape, isOpen]);\n\n if (user) {\n return (\n <div className=\"cac-relative\" id=\"civic-dropdown-container\">\n <button\n className={cn(\n \"cac-flex cac-w-full cac-items-center cac-justify-between cac-gap-2 cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-text-neutral-500 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => setIsOpen((isOpen) => !isOpen)}\n >\n {user?.picture ? (\n <span className=\"cac-relative cac-flex cac-h-10 cac-w-10 cac-shrink-0 cac-gap-2 cac-overflow-hidden cac-rounded-full\">\n <img\n className=\"cac-h-full cac-w-full cac-object-cover\"\n src={user.picture}\n alt={user?.name || user?.email}\n />\n </span>\n ) : (\n <div />\n )}\n\n <span>{user?.name || user?.email}</span>\n\n {isOpen ? <ChevronUp /> : <ChevronDown />}\n </button>\n <div\n className={\n isOpen\n ? \"cac-absolute cac-right-0 cac-mt-2 cac-w-full cac-rounded-lg cac-bg-white cac-py-2 cac-text-neutral-500 cac-shadow-xl\"\n : \"cac-hidden\"\n }\n >\n <ul>\n <li>\n <button\n className=\"cac-block cac-w-full cac-px-4 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\"\n onClick={handleSignOut}\n >\n Logout\n </button>\n </li>\n </ul>\n </div>\n </div>\n );\n }\n\n return (\n <button\n data-testid=\"sign-in-button\"\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={handleSignIn}\n >\n Sign in\n </button>\n );\n};\n\nexport { UserButton };\n","\"use client\";\nimport { cn } from \"@/utils\";\nimport { DisplayMode } from \"@/types\";\nimport { useUser } from \"@/react/hooks\";\n\nconst SignInButton = ({\n displayMode,\n className,\n}: {\n displayMode?: DisplayMode;\n className?: string;\n}) => {\n const { signIn } = useUser();\n\n return (\n <button\n data-testid=\"sign-in-button\"\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => signIn(displayMode)}\n >\n Sign In\n </button>\n );\n};\n\nexport { SignInButton };\n","\"use client\";\nimport { cn } from \"@/utils\";\nimport { useUser } from \"@/react/hooks\";\n\nconst SignOutButton = ({ className }: { className?: string }) => {\n const { signOut } = useUser();\n\n return (\n <button\n className={cn(\n \"cac-rounded-full cac-border cac-border-neutral-500 cac-px-3 cac-py-2 cac-transition-colors hover:cac-bg-neutral-200 hover:cac-bg-opacity-50\",\n className,\n )}\n onClick={() => signOut()}\n >\n Sign Out\n </button>\n );\n};\n\nexport { SignOutButton };\n"],"mappings":"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","names":["jsx","isOpen","jsx","jsx"]}
|
package/dist/server.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { C as CookieStorage, a as CookieStorageSettings, S as SessionStorage } from './storage-
|
|
2
|
-
import { E as Endpoints, A as AuthStorage, O as OIDCTokenResponseBody, U as User } from './types-
|
|
1
|
+
export { C as CookieStorage, a as CookieStorageSettings, S as SessionStorage } from './storage-BJyqsZwC.mjs';
|
|
2
|
+
import { E as Endpoints, A as AuthStorage, O as OIDCTokenResponseBody, U as User } from './types-BxAubCqO.mjs';
|
|
3
3
|
import 'oslo/oauth2';
|
|
4
4
|
|
|
5
5
|
type AuthConfig = {
|
package/dist/server.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { C as CookieStorage, a as CookieStorageSettings, S as SessionStorage } from './storage-
|
|
2
|
-
import { E as Endpoints, A as AuthStorage, O as OIDCTokenResponseBody, U as User } from './types-
|
|
1
|
+
export { C as CookieStorage, a as CookieStorageSettings, S as SessionStorage } from './storage-ANmRwpZ3.js';
|
|
2
|
+
import { E as Endpoints, A as AuthStorage, O as OIDCTokenResponseBody, U as User } from './types-BxAubCqO.js';
|
|
3
3
|
import 'oslo/oauth2';
|
|
4
4
|
|
|
5
5
|
type AuthConfig = {
|