@smg-automotive/auth 8.2.0 → 8.2.1-instrumentation-with-debug.1
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/README.md +66 -0
- package/dist/cjs/server/helpers/getAccessToken.js +12 -0
- package/dist/cjs/server/helpers/getAccessToken.js.map +1 -1
- package/dist/cjs/server/helpers/getUser.js +39 -7
- package/dist/cjs/server/helpers/getUser.js.map +1 -1
- package/dist/cjs/server/middleware/index.js +42 -0
- package/dist/cjs/server/middleware/index.js.map +1 -1
- package/dist/cjs/server/middleware/logout.d.ts +4 -2
- package/dist/cjs/server/middleware/logout.js +34 -13
- package/dist/cjs/server/middleware/logout.js.map +1 -1
- package/dist/cjs/server/middleware/proactivelyRefreshAccessToken.d.ts +2 -1
- package/dist/cjs/server/middleware/proactivelyRefreshAccessToken.js +26 -4
- package/dist/cjs/server/middleware/proactivelyRefreshAccessToken.js.map +1 -1
- package/dist/cjs/server/middleware/profile.d.ts +2 -1
- package/dist/cjs/server/middleware/profile.js +27 -3
- package/dist/cjs/server/middleware/profile.js.map +1 -1
- package/dist/cjs/server/middleware/protectRoute.d.ts +2 -1
- package/dist/cjs/server/middleware/protectRoute.js +26 -2
- package/dist/cjs/server/middleware/protectRoute.js.map +1 -1
- package/dist/cjs/server/middleware/token.d.ts +2 -1
- package/dist/cjs/server/middleware/token.js +20 -1
- package/dist/cjs/server/middleware/token.js.map +1 -1
- package/dist/esm/server/helpers/getAccessToken.js +8 -0
- package/dist/esm/server/helpers/getAccessToken.js.map +1 -1
- package/dist/esm/server/helpers/getUser.js +35 -7
- package/dist/esm/server/helpers/getUser.js.map +1 -1
- package/dist/esm/server/middleware/index.js +38 -0
- package/dist/esm/server/middleware/index.js.map +1 -1
- package/dist/esm/server/middleware/logout.d.ts +4 -2
- package/dist/esm/server/middleware/logout.js +30 -13
- package/dist/esm/server/middleware/logout.js.map +1 -1
- package/dist/esm/server/middleware/proactivelyRefreshAccessToken.d.ts +2 -1
- package/dist/esm/server/middleware/proactivelyRefreshAccessToken.js +22 -4
- package/dist/esm/server/middleware/proactivelyRefreshAccessToken.js.map +1 -1
- package/dist/esm/server/middleware/profile.d.ts +2 -1
- package/dist/esm/server/middleware/profile.js +23 -3
- package/dist/esm/server/middleware/profile.js.map +1 -1
- package/dist/esm/server/middleware/protectRoute.d.ts +2 -1
- package/dist/esm/server/middleware/protectRoute.js +22 -2
- package/dist/esm/server/middleware/protectRoute.js.map +1 -1
- package/dist/esm/server/middleware/token.d.ts +2 -1
- package/dist/esm/server/middleware/token.js +16 -1
- package/dist/esm/server/middleware/token.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -237,6 +237,72 @@ export default function middleware(
|
|
|
237
237
|
|
|
238
238
|
Auth0 integration routes are handled by the middleware. You need to make sure that the middleware is invoked for all the route patters except the static assets, image optimisation and metadata files.
|
|
239
239
|
|
|
240
|
+
### Debugging
|
|
241
|
+
|
|
242
|
+
This package includes comprehensive debug instrumentation using the [`debug`](https://www.npmjs.com/package/debug) package to help track and troubleshoot authentication issues. To enable debug logging, set the `DEBUG` environment variable.
|
|
243
|
+
|
|
244
|
+
#### Available Debug Namespaces
|
|
245
|
+
|
|
246
|
+
The package uses the namespace pattern `@smg-automotive/auth:*` with the following sub-namespaces:
|
|
247
|
+
|
|
248
|
+
- `@smg-automotive/auth:middleware` - Main auth middleware flow
|
|
249
|
+
- Request processing, route checks, Auth0 middleware calls, cross-domain logout detection
|
|
250
|
+
- `@smg-automotive/auth:user` - User retrieval and enrichment
|
|
251
|
+
- Session retrieval, user fetching, user enrichment with entitlements
|
|
252
|
+
- `@smg-automotive/auth:token` - Token operations
|
|
253
|
+
- Token refresh decisions (including expiration times), access token retrieval, token endpoint handling
|
|
254
|
+
- `@smg-automotive/auth:protectRoute` - Route protection
|
|
255
|
+
- Protected route checks, session validation, token refresh for protected routes
|
|
256
|
+
- `@smg-automotive/auth:logout` - Logout operations
|
|
257
|
+
- Cross-domain logout flow, cookie deletion, returnTo URL validation
|
|
258
|
+
- `@smg-automotive/auth:profile` - User profile handling
|
|
259
|
+
- Profile requests, user enrichment, entitlement loading errors
|
|
260
|
+
|
|
261
|
+
#### Usage
|
|
262
|
+
|
|
263
|
+
Enable all auth debugging:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
DEBUG=@smg-automotive/auth:*
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Enable specific namespaces:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
# Enable middleware and token debugging
|
|
273
|
+
DEBUG=@smg-automotive/auth:middleware,@smg-automotive/auth:token
|
|
274
|
+
|
|
275
|
+
# Enable user and profile debugging
|
|
276
|
+
DEBUG=@smg-automotive/auth:user,@smg-automotive/auth:profile
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Enable debugging in your Next.js application by setting the environment variable:
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
# .env.local
|
|
283
|
+
DEBUG=@smg-automotive/auth:*
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Or pass it when running your application:
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
DEBUG=@smg-automotive/auth:* npm run dev
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
#### What Gets Logged
|
|
293
|
+
|
|
294
|
+
The debug instrumentation logs:
|
|
295
|
+
|
|
296
|
+
- **Request flow**: Path, host, protocol, and method for each request
|
|
297
|
+
- **Session state**: Whether sessions exist, user presence, session data retrieval
|
|
298
|
+
- **Token operations**: Token expiration times, refresh decisions, token retrieval success/failure
|
|
299
|
+
- **User data**: User IDs, seller IDs, email addresses (when available), entitlement presence
|
|
300
|
+
- **Route protection**: Protected route checks, redirect decisions
|
|
301
|
+
- **Logout flow**: Cross-domain logout initiation, cookie deletion operations
|
|
302
|
+
- **Errors**: Authentication errors with error codes and messages (without exposing sensitive tokens)
|
|
303
|
+
|
|
304
|
+
All debug logs are structured and include relevant context while avoiding sensitive data like tokens or passwords.
|
|
305
|
+
|
|
240
306
|
### Fixtures
|
|
241
307
|
|
|
242
308
|
This package also provides fixture factories for the:
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var debug = require('debug');
|
|
3
4
|
var getAuth0Instance = require('../getAuth0Instance.js');
|
|
4
5
|
|
|
6
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
9
|
+
|
|
10
|
+
const log = debug__default.default('@smg-automotive/auth:token');
|
|
5
11
|
const getAccessToken = async ({ protocol, host, context, }) => {
|
|
12
|
+
log('Getting access token', {
|
|
13
|
+
host,
|
|
14
|
+
protocol,
|
|
15
|
+
hasRequest: !!context?.request,
|
|
16
|
+
});
|
|
6
17
|
const auth0Instance = getAuth0Instance.getAuth0Instance({ protocol, host });
|
|
7
18
|
const { token } = context?.request
|
|
8
19
|
? await auth0Instance.getAccessToken(context.request, context.response)
|
|
9
20
|
: await auth0Instance.getAccessToken();
|
|
21
|
+
log('Access token retrieved', { tokenLength: token?.length || 0 });
|
|
10
22
|
return token;
|
|
11
23
|
};
|
|
12
24
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAccessToken.js","sources":["../../../../../src/server/helpers/getAccessToken.ts"],"sourcesContent":[null],"names":["getAuth0Instance"],"mappings":"
|
|
1
|
+
{"version":3,"file":"getAccessToken.js","sources":["../../../../../src/server/helpers/getAccessToken.ts"],"sourcesContent":[null],"names":["debug","getAuth0Instance"],"mappings":";;;;;;;;;AAMA,MAAM,GAAG,GAAGA,sBAAK,CAAC,4BAA4B,CAAC;AAExC,MAAM,cAAc,GAAG,OAAO,EACnC,QAAQ,EACR,IAAI,EACJ,OAAO,GACwC,KAAI;IACnD,GAAG,CAAC,sBAAsB,EAAE;QAC1B,IAAI;QACJ,QAAQ;AACR,QAAA,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO;AAC/B,KAAA,CAAC;IACF,MAAM,aAAa,GAAGC,iCAAgB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC1D,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE;AACzB,UAAE,MAAM,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ;AACtE,UAAE,MAAM,aAAa,CAAC,cAAc,EAAE;AACxC,IAAA,GAAG,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;AAClE,IAAA,OAAO,KAAK;AACd;;;;"}
|
|
@@ -1,35 +1,67 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var debug = require('debug');
|
|
3
4
|
var getAccessToken = require('./getAccessToken.js');
|
|
4
5
|
var getAuth0Instance = require('../getAuth0Instance.js');
|
|
5
6
|
var session = require('../../lib/enrichUser/session.js');
|
|
6
7
|
|
|
8
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
11
|
+
|
|
12
|
+
const log = debug__default.default('@smg-automotive/auth:user');
|
|
7
13
|
const getSessionData = async ({ protocol, host, context, }) => {
|
|
14
|
+
log('Retrieving session data', {
|
|
15
|
+
host,
|
|
16
|
+
protocol,
|
|
17
|
+
hasRequest: !!context?.request,
|
|
18
|
+
});
|
|
8
19
|
const auth0Instance = getAuth0Instance.getAuth0Instance({ host, protocol });
|
|
9
|
-
|
|
10
|
-
? auth0Instance.getSession(context.request)
|
|
11
|
-
: auth0Instance.getSession();
|
|
20
|
+
const session = context?.request
|
|
21
|
+
? await auth0Instance.getSession(context.request)
|
|
22
|
+
: await auth0Instance.getSession();
|
|
23
|
+
log('Session retrieved', { hasSession: !!session, hasUser: !!session?.user });
|
|
24
|
+
return session;
|
|
12
25
|
};
|
|
13
26
|
const getUser = async ({ context, host, protocol, }) => {
|
|
27
|
+
log('Getting user', { host, protocol });
|
|
14
28
|
const sessionData = await getSessionData({ host, protocol, context });
|
|
15
|
-
if (!sessionData || !sessionData.user)
|
|
29
|
+
if (!sessionData || !sessionData.user) {
|
|
30
|
+
log('No session or user found');
|
|
16
31
|
return null;
|
|
17
|
-
|
|
32
|
+
}
|
|
33
|
+
const user = sessionData.user;
|
|
34
|
+
log('User retrieved', {
|
|
35
|
+
userId: user.userId,
|
|
36
|
+
sellerId: user.sellerId,
|
|
37
|
+
});
|
|
38
|
+
return user;
|
|
18
39
|
};
|
|
19
40
|
const getEnrichedUser = async ({ brand, context, host, protocol, }) => {
|
|
41
|
+
log('Getting enriched user', { brand, host, protocol });
|
|
20
42
|
const user = await getUser({ host, protocol, context });
|
|
21
|
-
if (!user)
|
|
43
|
+
if (!user) {
|
|
44
|
+
log('No user found, cannot enrich');
|
|
22
45
|
return null;
|
|
46
|
+
}
|
|
47
|
+
log('Retrieving access token for enrichment');
|
|
23
48
|
const accessToken = await getAccessToken.getAccessToken({
|
|
24
49
|
host,
|
|
25
50
|
protocol,
|
|
26
51
|
context,
|
|
27
52
|
});
|
|
28
|
-
|
|
53
|
+
log('Access token retrieved, enriching user');
|
|
54
|
+
const enrichedUser = await session.enrichUser({
|
|
29
55
|
user,
|
|
30
56
|
accessToken,
|
|
31
57
|
brand,
|
|
32
58
|
});
|
|
59
|
+
log('User enriched successfully', {
|
|
60
|
+
userId: enrichedUser.userId,
|
|
61
|
+
sellerId: enrichedUser.sellerId,
|
|
62
|
+
hasEntitlements: !!enrichedUser.entitlements,
|
|
63
|
+
});
|
|
64
|
+
return enrichedUser;
|
|
33
65
|
};
|
|
34
66
|
|
|
35
67
|
exports.getEnrichedUser = getEnrichedUser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUser.js","sources":["../../../../../src/server/helpers/getUser.ts"],"sourcesContent":[null],"names":["getAuth0Instance","getAccessToken","enrichUser"],"mappings":"
|
|
1
|
+
{"version":3,"file":"getUser.js","sources":["../../../../../src/server/helpers/getUser.ts"],"sourcesContent":[null],"names":["debug","getAuth0Instance","getAccessToken","enrichUser"],"mappings":";;;;;;;;;;;AAYA,MAAM,GAAG,GAAGA,sBAAK,CAAC,2BAA2B,CAAC;AAE9C,MAAM,cAAc,GAAG,OAAO,EAC5B,QAAQ,EACR,IAAI,EACJ,OAAO,GACwC,KAAI;IACnD,GAAG,CAAC,yBAAyB,EAAE;QAC7B,IAAI;QACJ,QAAQ;AACR,QAAA,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO;AAC/B,KAAA,CAAC;IACF,MAAM,aAAa,GAAGC,iCAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAE1D,IAAA,MAAM,OAAO,GAAG,OAAO,EAAE;UACrB,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO;AAChD,UAAE,MAAM,aAAa,CAAC,UAAU,EAAE;AAEpC,IAAA,GAAG,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7E,IAAA,OAAO,OAAO;AAChB,CAAC;AAEM,MAAM,OAAO,GAAG,OAAO,EAC5B,OAAO,EACP,IAAI,EACJ,QAAQ,GAEY,KAAiC;IACrD,GAAG,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACvC,IAAA,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACrE,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QACrC,GAAG,CAAC,0BAA0B,CAAC;AAC/B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,IAAI,GAAG,WAAW,CAAC,IAAmB;IAC5C,GAAG,CAAC,gBAAgB,EAAE;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,KAAA,CAAC;AACF,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,eAAe,GAAG,OAAO,EACpC,KAAK,EACL,OAAO,EACP,IAAI,EACJ,QAAQ,GAIP,KAAyC;IAC1C,GAAG,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACvD,IAAA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE;QACT,GAAG,CAAC,8BAA8B,CAAC;AACnC,QAAA,OAAO,IAAI;IACb;IAEA,GAAG,CAAC,wCAAwC,CAAC;AAC7C,IAAA,MAAM,WAAW,GAAG,MAAMC,6BAAc,CAAC;QACvC,IAAI;QACJ,QAAQ;QACR,OAAO;AACR,KAAA,CAAC;IACF,GAAG,CAAC,wCAAwC,CAAC;AAC7C,IAAA,MAAM,YAAY,GAAG,MAAMC,kBAAU,CAAC;QACpC,IAAI;QACJ,WAAW;QACX,KAAK;AACN,KAAA,CAAC;IACF,GAAG,CAAC,4BAA4B,EAAE;QAChC,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;AAC/B,QAAA,eAAe,EAAE,CAAC,CAAC,YAAY,CAAC,YAAY;AAC7C,KAAA,CAAC;AACF,IAAA,OAAO,YAAY;AACrB;;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var server = require('next/server');
|
|
4
|
+
var debug = require('debug');
|
|
4
5
|
var auth0 = require('../../config/auth0.js');
|
|
5
6
|
var getAuth0Instance = require('../getAuth0Instance.js');
|
|
6
7
|
var token = require('./token.js');
|
|
@@ -10,6 +11,21 @@ var logout = require('./logout.js');
|
|
|
10
11
|
var login = require('./login.js');
|
|
11
12
|
var combineHeaders = require('./combineHeaders.js');
|
|
12
13
|
|
|
14
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
15
|
+
|
|
16
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
17
|
+
|
|
18
|
+
const log = debug__default.default('@smg-automotive/auth:middleware');
|
|
19
|
+
const generateRequestId = () => {
|
|
20
|
+
// UUID v4 format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|
|
21
|
+
// where x is any hex digit and y is one of 8, 9, A, B
|
|
22
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
23
|
+
// eslint-disable-next-line sonarjs/pseudo-random
|
|
24
|
+
const r = (Math.random() * 16) | 0;
|
|
25
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
26
|
+
return v.toString(16);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
13
29
|
const isAuthRoute = (pathname, auth0Config) => {
|
|
14
30
|
const { loginEndpoint, logoutEndpoint, callbackEndpoint, userProfileEndpoint, tokenEndpoint, } = auth0Config;
|
|
15
31
|
return [
|
|
@@ -21,34 +37,49 @@ const isAuthRoute = (pathname, auth0Config) => {
|
|
|
21
37
|
].includes(pathname);
|
|
22
38
|
};
|
|
23
39
|
const authMiddleware = async ({ request, isProtectedRoute, language, host, protocol, onError, brand, }) => {
|
|
40
|
+
const requestId = generateRequestId();
|
|
24
41
|
const { pathname } = request.nextUrl;
|
|
42
|
+
log('Processing request', {
|
|
43
|
+
requestId,
|
|
44
|
+
pathname,
|
|
45
|
+
host,
|
|
46
|
+
protocol,
|
|
47
|
+
method: request.method,
|
|
48
|
+
});
|
|
25
49
|
const auth0Instance = getAuth0Instance.getAuth0Instance({
|
|
26
50
|
host,
|
|
27
51
|
protocol,
|
|
28
52
|
});
|
|
29
53
|
const auth0Config = auth0.getAuth0Config();
|
|
30
54
|
const isAuthErrorRoute = pathname.endsWith(auth0Config.globalAuthErrorPath);
|
|
55
|
+
log('Auth route check', { requestId, pathname, isAuthErrorRoute });
|
|
31
56
|
const crossDomainLogoutResult = logout.handleCrossDomainLogout({
|
|
57
|
+
requestId,
|
|
32
58
|
host,
|
|
33
59
|
protocol,
|
|
34
60
|
request,
|
|
35
61
|
auth0Config,
|
|
36
62
|
});
|
|
37
63
|
if (crossDomainLogoutResult) {
|
|
64
|
+
log('Cross-domain logout detected, redirecting', { requestId });
|
|
38
65
|
return crossDomainLogoutResult;
|
|
39
66
|
}
|
|
40
67
|
login.addLoginParams({
|
|
41
68
|
request,
|
|
42
69
|
auth0Config,
|
|
43
70
|
});
|
|
71
|
+
log('Calling Auth0 middleware', { requestId });
|
|
44
72
|
const authResponse = await auth0Instance.middleware(request);
|
|
73
|
+
log('Auth0 middleware completed', { requestId, status: authResponse.status });
|
|
45
74
|
logout.deleteRelatedSessionCookies({
|
|
75
|
+
requestId,
|
|
46
76
|
host,
|
|
47
77
|
request,
|
|
48
78
|
response: authResponse,
|
|
49
79
|
auth0Config,
|
|
50
80
|
});
|
|
51
81
|
const accessTokenRequestResult = await token.handleAccessTokenRequest({
|
|
82
|
+
requestId,
|
|
52
83
|
request,
|
|
53
84
|
response: authResponse,
|
|
54
85
|
auth0Instance,
|
|
@@ -56,9 +87,11 @@ const authMiddleware = async ({ request, isProtectedRoute, language, host, proto
|
|
|
56
87
|
onError,
|
|
57
88
|
});
|
|
58
89
|
if (accessTokenRequestResult) {
|
|
90
|
+
log('Access token request handled', { requestId });
|
|
59
91
|
return accessTokenRequestResult;
|
|
60
92
|
}
|
|
61
93
|
const handleUserProfileResult = await profile.handleUserProfile({
|
|
94
|
+
requestId,
|
|
62
95
|
request,
|
|
63
96
|
response: authResponse,
|
|
64
97
|
auth0Instance,
|
|
@@ -66,13 +99,17 @@ const authMiddleware = async ({ request, isProtectedRoute, language, host, proto
|
|
|
66
99
|
brand,
|
|
67
100
|
});
|
|
68
101
|
if (handleUserProfileResult) {
|
|
102
|
+
log('User profile request handled', { requestId });
|
|
69
103
|
return handleUserProfileResult;
|
|
70
104
|
}
|
|
71
105
|
if (isAuthRoute(pathname, auth0Config) || isAuthErrorRoute) {
|
|
106
|
+
log('Auth route, returning response', { requestId });
|
|
72
107
|
return authResponse;
|
|
73
108
|
}
|
|
74
109
|
const isProtected = !isAuthErrorRoute && isProtectedRoute(pathname);
|
|
110
|
+
log('Route protection check', { requestId, pathname, isProtected });
|
|
75
111
|
const protectRouteResult = await protectRoute.protectRoute({
|
|
112
|
+
requestId,
|
|
76
113
|
isProtected,
|
|
77
114
|
auth0Instance,
|
|
78
115
|
auth0Config,
|
|
@@ -82,8 +119,13 @@ const authMiddleware = async ({ request, isProtectedRoute, language, host, proto
|
|
|
82
119
|
onError,
|
|
83
120
|
});
|
|
84
121
|
if (protectRouteResult) {
|
|
122
|
+
log('Route protection handled', {
|
|
123
|
+
requestId,
|
|
124
|
+
redirected: protectRouteResult.status === 307,
|
|
125
|
+
});
|
|
85
126
|
return protectRouteResult;
|
|
86
127
|
}
|
|
128
|
+
log('Request completed, combining headers', { requestId });
|
|
87
129
|
return combineHeaders.combineHeaders({
|
|
88
130
|
middlewareResponse: server.NextResponse.next({
|
|
89
131
|
request: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/server/middleware/index.ts"],"sourcesContent":[null],"names":["getAuth0Instance","getAuth0Config","handleCrossDomainLogout","addLoginParams","deleteRelatedSessionCookies","handleAccessTokenRequest","handleUserProfile","protectRoute","combineHeaders","NextResponse"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/server/middleware/index.ts"],"sourcesContent":[null],"names":["debug","getAuth0Instance","getAuth0Config","handleCrossDomainLogout","addLoginParams","deleteRelatedSessionCookies","handleAccessTokenRequest","handleUserProfile","protectRoute","combineHeaders","NextResponse"],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { Auth0Config } from 'src/types';
|
|
3
|
-
export declare const handleCrossDomainLogout: ({ host, protocol, request, auth0Config: { languageConfig, logoutEndpoint }, }: {
|
|
3
|
+
export declare const handleCrossDomainLogout: ({ requestId, host, protocol, request, auth0Config: { languageConfig, logoutEndpoint }, }: {
|
|
4
|
+
requestId: string;
|
|
4
5
|
host: string;
|
|
5
6
|
protocol: string;
|
|
6
7
|
request: NextRequest;
|
|
7
8
|
auth0Config: Auth0Config;
|
|
8
9
|
}) => NextResponse | void;
|
|
9
|
-
export declare const deleteRelatedSessionCookies: ({ host, request, response, auth0Config: { logoutEndpoint, authCookieNames, legacyAccessTokenName, legacyRefreshTokenName, }, }: {
|
|
10
|
+
export declare const deleteRelatedSessionCookies: ({ requestId, host, request, response, auth0Config: { logoutEndpoint, authCookieNames, legacyAccessTokenName, legacyRefreshTokenName, }, }: {
|
|
11
|
+
requestId: string;
|
|
10
12
|
host: string;
|
|
11
13
|
request: NextRequest;
|
|
12
14
|
response: NextResponse;
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var server = require('next/server');
|
|
4
|
+
var debug = require('debug');
|
|
4
5
|
|
|
6
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
9
|
+
|
|
10
|
+
const log = debug__default.default('@smg-automotive/auth:logout');
|
|
5
11
|
const validateReturnTo = ({ pathOrUrl, host, protocol, otherDomainHost, crossDomainLogout, }) => {
|
|
6
12
|
if (typeof pathOrUrl !== 'string')
|
|
7
13
|
return false;
|
|
@@ -43,12 +49,14 @@ const getOtherDomainHost = (currentHost) => {
|
|
|
43
49
|
}
|
|
44
50
|
return currentHost;
|
|
45
51
|
};
|
|
46
|
-
const handleCrossDomainLogout = ({ host, protocol, request, auth0Config: { languageConfig, logoutEndpoint }, }) => {
|
|
52
|
+
const handleCrossDomainLogout = ({ requestId, host, protocol, request, auth0Config: { languageConfig, logoutEndpoint }, }) => {
|
|
47
53
|
if (request.nextUrl.pathname !== logoutEndpoint)
|
|
48
54
|
return;
|
|
55
|
+
log('Handling logout request', { requestId, host, protocol });
|
|
49
56
|
const searchParams = new URLSearchParams(request.nextUrl.search);
|
|
50
57
|
const specifiedReturnTo = searchParams.get('returnTo') || '';
|
|
51
58
|
const crossDomainLogout = searchParams.get('crossDomain') === 'true';
|
|
59
|
+
log('Logout parameters', { requestId, specifiedReturnTo, crossDomainLogout });
|
|
52
60
|
const otherDomainHost = getOtherDomainHost(host);
|
|
53
61
|
const currentDomainUrl = `${protocol}://${host}`;
|
|
54
62
|
const locale = searchParams.get('locale');
|
|
@@ -60,16 +68,23 @@ const handleCrossDomainLogout = ({ host, protocol, request, auth0Config: { langu
|
|
|
60
68
|
pathOrUrl: specifiedReturnTo,
|
|
61
69
|
crossDomainLogout,
|
|
62
70
|
});
|
|
71
|
+
log('ReturnTo validation', { requestId, isSafePath, specifiedReturnTo });
|
|
63
72
|
if (isSafePath && specifiedReturnTo) {
|
|
64
73
|
returnTo = specifiedReturnTo;
|
|
65
74
|
}
|
|
66
75
|
if (!crossDomainLogout && otherDomainHost && otherDomainHost !== host) {
|
|
76
|
+
log('Initiating cross-domain logout', { requestId, otherDomainHost });
|
|
67
77
|
const backToCurrentDomainUrl = new URL(logoutEndpoint, currentDomainUrl);
|
|
68
78
|
backToCurrentDomainUrl.searchParams.set('returnTo', returnTo);
|
|
69
79
|
backToCurrentDomainUrl.searchParams.set('crossDomain', 'true');
|
|
70
80
|
const otherDomainLogoutUrl = new URL(logoutEndpoint, `${protocol}://${otherDomainHost}`);
|
|
71
81
|
otherDomainLogoutUrl.searchParams.set('crossDomain', 'true');
|
|
72
82
|
otherDomainLogoutUrl.searchParams.set('returnTo', backToCurrentDomainUrl.toString());
|
|
83
|
+
log('Redirecting to other domain for logout', {
|
|
84
|
+
requestId,
|
|
85
|
+
otherDomainHost,
|
|
86
|
+
returnUrl: backToCurrentDomainUrl.toString(),
|
|
87
|
+
});
|
|
73
88
|
return server.NextResponse.redirect(otherDomainLogoutUrl, {
|
|
74
89
|
status: 302,
|
|
75
90
|
});
|
|
@@ -93,27 +108,32 @@ const getLegacyCookieDomain = (hostname) => {
|
|
|
93
108
|
const base = parts.slice(-2).join('.');
|
|
94
109
|
return `.${base}`;
|
|
95
110
|
};
|
|
96
|
-
const deleteRelatedSessionCookies = ({ host, request, response, auth0Config: { logoutEndpoint, authCookieNames, legacyAccessTokenName, legacyRefreshTokenName, }, }) => {
|
|
111
|
+
const deleteRelatedSessionCookies = ({ requestId, host, request, response, auth0Config: { logoutEndpoint, authCookieNames, legacyAccessTokenName, legacyRefreshTokenName, }, }) => {
|
|
97
112
|
if (request.nextUrl.pathname !== logoutEndpoint || !response)
|
|
98
113
|
return;
|
|
99
|
-
authCookieNames.
|
|
114
|
+
const cookiesToDelete = authCookieNames.flatMap((cookieName) => [
|
|
115
|
+
cookieName,
|
|
116
|
+
`${cookieName}__0`,
|
|
117
|
+
`${cookieName}__1`,
|
|
118
|
+
]);
|
|
119
|
+
log('Deleting session cookies', {
|
|
120
|
+
requestId,
|
|
121
|
+
host,
|
|
122
|
+
cookies: cookiesToDelete,
|
|
123
|
+
});
|
|
124
|
+
cookiesToDelete.forEach((cookieName) => {
|
|
100
125
|
response.cookies.delete({
|
|
101
126
|
name: cookieName,
|
|
102
127
|
maxAge: 0,
|
|
103
128
|
path: '/',
|
|
104
129
|
});
|
|
105
|
-
response.cookies.delete({
|
|
106
|
-
name: `${cookieName}__0`,
|
|
107
|
-
maxAge: 0,
|
|
108
|
-
path: '/',
|
|
109
|
-
});
|
|
110
|
-
response.cookies.delete({
|
|
111
|
-
name: `${cookieName}__1`,
|
|
112
|
-
maxAge: 0,
|
|
113
|
-
path: '/',
|
|
114
|
-
});
|
|
115
130
|
});
|
|
116
131
|
const legacyCookieDomain = getLegacyCookieDomain(host);
|
|
132
|
+
log('Deleting legacy cookies', {
|
|
133
|
+
requestId,
|
|
134
|
+
cookies: [legacyAccessTokenName, legacyRefreshTokenName],
|
|
135
|
+
legacyCookieDomain,
|
|
136
|
+
});
|
|
117
137
|
response.cookies.delete({
|
|
118
138
|
name: legacyAccessTokenName,
|
|
119
139
|
maxAge: 0,
|
|
@@ -126,6 +146,7 @@ const deleteRelatedSessionCookies = ({ host, request, response, auth0Config: { l
|
|
|
126
146
|
path: '/',
|
|
127
147
|
domain: legacyCookieDomain,
|
|
128
148
|
});
|
|
149
|
+
log('All session cookies deleted', { requestId });
|
|
129
150
|
};
|
|
130
151
|
|
|
131
152
|
exports.deleteRelatedSessionCookies = deleteRelatedSessionCookies;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sources":["../../../../../src/server/middleware/logout.ts"],"sourcesContent":[null],"names":["NextResponse"],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout.js","sources":["../../../../../src/server/middleware/logout.ts"],"sourcesContent":[null],"names":["debug","NextResponse"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { Auth0Client } from '@auth0/nextjs-auth0/server';
|
|
3
3
|
import { Auth0Config } from 'src/types/auth0/config';
|
|
4
|
-
export declare const proactivelyRefreshAccessToken: ({ request, response, auth0Instance, auth0Config, }: {
|
|
4
|
+
export declare const proactivelyRefreshAccessToken: ({ requestId, request, response, auth0Instance, auth0Config, }: {
|
|
5
|
+
requestId: string;
|
|
5
6
|
request: NextRequest;
|
|
6
7
|
response: NextResponse;
|
|
7
8
|
auth0Instance: Auth0Client;
|
|
@@ -1,12 +1,34 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var debug = require('debug');
|
|
4
|
+
|
|
5
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
8
|
+
|
|
9
|
+
const log = debug__default.default('@smg-automotive/auth:token');
|
|
10
|
+
const proactivelyRefreshAccessToken = async ({ requestId, request, response, auth0Instance, auth0Config, }) => {
|
|
11
|
+
log('Checking if token refresh is needed', { requestId });
|
|
4
12
|
const session = await auth0Instance.getSession(request);
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
13
|
+
const expiresAt = session?.tokenSet.expiresAt || 0;
|
|
14
|
+
const expiresInSeconds = expiresAt - Date.now() / 1000;
|
|
15
|
+
const shouldRefresh = auth0Config.debugForceTokenRefresh || expiresAt < Date.now() / 1000 + 30;
|
|
16
|
+
log('Token refresh decision', {
|
|
17
|
+
requestId,
|
|
18
|
+
shouldRefresh,
|
|
19
|
+
expiresInSeconds: Math.round(expiresInSeconds),
|
|
20
|
+
debugForceRefresh: auth0Config.debugForceTokenRefresh,
|
|
21
|
+
hasSession: !!session,
|
|
22
|
+
});
|
|
23
|
+
const result = await auth0Instance.getAccessToken(request, response, {
|
|
8
24
|
refresh: shouldRefresh,
|
|
9
25
|
});
|
|
26
|
+
log('Access token retrieved', {
|
|
27
|
+
requestId,
|
|
28
|
+
expiresAt: result.expiresAt,
|
|
29
|
+
tokenLength: result.token.length,
|
|
30
|
+
});
|
|
31
|
+
return result;
|
|
10
32
|
};
|
|
11
33
|
|
|
12
34
|
exports.proactivelyRefreshAccessToken = proactivelyRefreshAccessToken;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proactivelyRefreshAccessToken.js","sources":["../../../../../src/server/middleware/proactivelyRefreshAccessToken.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proactivelyRefreshAccessToken.js","sources":["../../../../../src/server/middleware/proactivelyRefreshAccessToken.ts"],"sourcesContent":[null],"names":["debug"],"mappings":";;;;;;;;AAMA,MAAM,GAAG,GAAGA,sBAAK,CAAC,4BAA4B,CAAC;AAExC,MAAM,6BAA6B,GAAG,OAAO,EAClD,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,GAOZ,KAAmD;AAClD,IAAA,GAAG,CAAC,qCAAqC,EAAE,EAAE,SAAS,EAAE,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;IAEvD,MAAM,SAAS,GAAG,OAAO,EAAE,QAAQ,CAAC,SAAS,IAAI,CAAC;IAClD,MAAM,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;AACtD,IAAA,MAAM,aAAa,GACjB,WAAW,CAAC,sBAAsB,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE;IAE1E,GAAG,CAAC,wBAAwB,EAAE;QAC5B,SAAS;QACT,aAAa;AACb,QAAA,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAC9C,iBAAiB,EAAE,WAAW,CAAC,sBAAsB;QACrD,UAAU,EAAE,CAAC,CAAC,OAAO;AACtB,KAAA,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE;AACnE,QAAA,OAAO,EAAE,aAAa;AACvB,KAAA,CAAC;IAEF,GAAG,CAAC,wBAAwB,EAAE;QAC5B,SAAS;QACT,SAAS,EAAE,MAAM,CAAC,SAAS;AAC3B,QAAA,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;AACjC,KAAA,CAAC;AAEF,IAAA,OAAO,MAAM;AACf;;;;"}
|
|
@@ -2,7 +2,8 @@ import { NextRequest, NextResponse } from 'next/server';
|
|
|
2
2
|
import { Auth0Client } from '@auth0/nextjs-auth0/server';
|
|
3
3
|
import { Brand } from 'src/types/brand';
|
|
4
4
|
import { Auth0Config } from 'src/types';
|
|
5
|
-
export declare const handleUserProfile: ({ request, response, auth0Instance, auth0Config, brand, }: {
|
|
5
|
+
export declare const handleUserProfile: ({ requestId, request, response, auth0Instance, auth0Config, brand, }: {
|
|
6
|
+
requestId: string;
|
|
6
7
|
request: NextRequest;
|
|
7
8
|
response: NextResponse;
|
|
8
9
|
auth0Instance: Auth0Client;
|
|
@@ -1,23 +1,31 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var server = require('next/server');
|
|
4
|
+
var debug = require('debug');
|
|
4
5
|
var session = require('../../lib/enrichUser/session.js');
|
|
5
6
|
var proactivelyRefreshAccessToken = require('./proactivelyRefreshAccessToken.js');
|
|
6
7
|
var combineHeaders = require('./combineHeaders.js');
|
|
7
8
|
var combineCookies = require('./combineCookies.js');
|
|
8
9
|
var addCachingHeaders = require('./addCachingHeaders.js');
|
|
9
10
|
|
|
11
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
14
|
+
|
|
15
|
+
const log = debug__default.default('@smg-automotive/auth:profile');
|
|
10
16
|
const responseHeaders = {
|
|
11
17
|
Vary: 'Cookie, Authorization',
|
|
12
18
|
'Cache-Control': 'private, no-cache, no-store, must-revalidate, max-age=0',
|
|
13
19
|
Pragma: 'no-cache',
|
|
14
20
|
Expires: '0',
|
|
15
21
|
};
|
|
16
|
-
const handleUserProfile = async ({ request, response, auth0Instance, auth0Config, brand, }) => {
|
|
22
|
+
const handleUserProfile = async ({ requestId, request, response, auth0Instance, auth0Config, brand, }) => {
|
|
17
23
|
if (request.nextUrl.pathname !== auth0Config.userProfileEndpoint)
|
|
18
24
|
return;
|
|
25
|
+
log('Handling user profile request', { requestId, brand });
|
|
19
26
|
const session$1 = await auth0Instance.getSession(request);
|
|
20
27
|
if (!session$1) {
|
|
28
|
+
log('No session found for profile request', { requestId });
|
|
21
29
|
return new server.NextResponse(null, {
|
|
22
30
|
status: 204,
|
|
23
31
|
headers: responseHeaders,
|
|
@@ -25,17 +33,30 @@ const handleUserProfile = async ({ request, response, auth0Instance, auth0Config
|
|
|
25
33
|
}
|
|
26
34
|
try {
|
|
27
35
|
const user = session$1.user;
|
|
36
|
+
log('User found, refreshing token and enriching', {
|
|
37
|
+
requestId,
|
|
38
|
+
userId: user.userId,
|
|
39
|
+
sellerId: user.sellerId,
|
|
40
|
+
});
|
|
28
41
|
const { token } = await proactivelyRefreshAccessToken.proactivelyRefreshAccessToken({
|
|
42
|
+
requestId,
|
|
29
43
|
request,
|
|
30
44
|
response,
|
|
31
45
|
auth0Instance,
|
|
32
46
|
auth0Config,
|
|
33
47
|
});
|
|
48
|
+
log('Token refreshed, enriching user', { requestId });
|
|
34
49
|
const enrichedUser = await session.enrichUser({
|
|
35
50
|
user,
|
|
36
51
|
accessToken: token,
|
|
37
52
|
brand,
|
|
38
53
|
});
|
|
54
|
+
log('User enriched successfully', {
|
|
55
|
+
requestId,
|
|
56
|
+
userId: enrichedUser.userId,
|
|
57
|
+
sellerId: enrichedUser.sellerId,
|
|
58
|
+
hasEntitlements: !!enrichedUser.entitlements,
|
|
59
|
+
});
|
|
39
60
|
const userResponse = server.NextResponse.json(enrichedUser);
|
|
40
61
|
const responseWithCombinedHeaders = combineHeaders.combineHeaders({
|
|
41
62
|
middlewareResponse: userResponse,
|
|
@@ -51,8 +72,11 @@ const handleUserProfile = async ({ request, response, auth0Instance, auth0Config
|
|
|
51
72
|
return responseWithCombinedHeaders;
|
|
52
73
|
}
|
|
53
74
|
catch (error) {
|
|
54
|
-
|
|
55
|
-
|
|
75
|
+
log('User Profile error loading entitlements', {
|
|
76
|
+
requestId,
|
|
77
|
+
error: error instanceof Error ? error.message : String(error),
|
|
78
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
79
|
+
});
|
|
56
80
|
let responseCode = 'UNKNOWN_AUTH_ERROR';
|
|
57
81
|
if (error &&
|
|
58
82
|
typeof error === 'object' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sources":["../../../../../src/server/middleware/profile.ts"],"sourcesContent":[null],"names":["session","NextResponse","proactivelyRefreshAccessToken","enrichUser","combineHeaders","addCachingHeaders","combineCookies"],"mappings":"
|
|
1
|
+
{"version":3,"file":"profile.js","sources":["../../../../../src/server/middleware/profile.ts"],"sourcesContent":[null],"names":["debug","session","NextResponse","proactivelyRefreshAccessToken","enrichUser","combineHeaders","addCachingHeaders","combineCookies"],"mappings":";;;;;;;;;;;;;;AAaA,MAAM,GAAG,GAAGA,sBAAK,CAAC,8BAA8B,CAAC;AAEjD,MAAM,eAAe,GAAG;AACtB,IAAA,IAAI,EAAE,uBAAuB;AAC7B,IAAA,eAAe,EAAE,yDAAyD;AAC1E,IAAA,MAAM,EAAE,UAAU;AAClB,IAAA,OAAO,EAAE,GAAG;CACb;MAEY,iBAAiB,GAAG,OAAO,EACtC,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,EACX,KAAK,GAQN,KAAkC;IACjC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,WAAW,CAAC,mBAAmB;QAAE;IAElE,GAAG,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1D,MAAMC,SAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;IAEvD,IAAI,CAACA,SAAO,EAAE;AACZ,QAAA,GAAG,CAAC,sCAAsC,EAAE,EAAE,SAAS,EAAE,CAAC;AAC1D,QAAA,OAAO,IAAIC,mBAAY,CAAC,IAAI,EAAE;AAC5B,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,eAAe;AACzB,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI;AACF,QAAA,MAAM,IAAI,GAAGD,SAAO,CAAC,IAAmB;QACxC,GAAG,CAAC,4CAA4C,EAAE;YAChD,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC;AACF,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,MAAME,2DAA6B,CAAC;YACpD,SAAS;YACT,OAAO;YACP,QAAQ;YACR,aAAa;YACb,WAAW;AACZ,SAAA,CAAC;AACF,QAAA,GAAG,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,CAAC;AACrD,QAAA,MAAM,YAAY,GAAG,MAAMC,kBAAU,CAAC;YACpC,IAAI;AACJ,YAAA,WAAW,EAAE,KAAK;YAClB,KAAK;AACN,SAAA,CAAC;QAEF,GAAG,CAAC,4BAA4B,EAAE;YAChC,SAAS;YACT,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;AAC/B,YAAA,eAAe,EAAE,CAAC,CAAC,YAAY,CAAC,YAAY;AAC7C,SAAA,CAAC;QACF,MAAM,YAAY,GAAGF,mBAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QACpD,MAAM,2BAA2B,GAAGG,6BAAc,CAAC;AACjD,YAAA,kBAAkB,EAAE,YAAY;AAChC,YAAA,YAAY,EAAE,QAAQ;AACtB,YAAA,eAAe,EAAE,IAAI;AACtB,SAAA,CAAC;QACFC,mCAAiB,CAAC,2BAA2B,CAAC;;AAE9C,QAAAC,6BAAc,CAAC;AACb,YAAA,cAAc,EAAE,QAAQ;AACxB,YAAA,cAAc,EAAE,2BAA2B;AAC5C,SAAA,CAAC;AACF,QAAA,OAAO,2BAA2B;IACpC;IAAE,OAAO,KAAc,EAAE;QACvB,GAAG,CAAC,yCAAyC,EAAE;YAC7C,SAAS;AACT,YAAA,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC7D,YAAA,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,SAAS;AACxD,SAAA,CAAC;QAEF,IAAI,YAAY,GAAG,oBAAoB;AACvC,QAAA,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;AACzB,YAAA,MAAM,IAAI,KAAK;AACf,YAAA,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAC9B;AACA,YAAA,YAAY,GAAG,KAAK,CAAC,IAAI;QAC3B;AAEA,QAAA,OAAOL,mBAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EACjC;AACE,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,eAAe;AACzB,SAAA,CACF;IACH;AACF;;;;"}
|