@thunderid/nextjs 1.2.3 → 1.3.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/dist/ThunderIDNextClient.d.ts +33 -1
- package/dist/ThunderIDNextClient.d.ts.map +1 -1
- package/dist/ThunderIDNextClient.js +28 -1
- package/dist/ThunderIDNextClient.js.map +1 -1
- package/dist/cjs/ThunderIDNextClient.cjs +28 -1
- package/dist/cjs/ThunderIDNextClient.cjs.map +1 -1
- package/dist/cjs/client/components/presentation/AuthFlowSelect/AuthFlowSelect.cjs +25 -0
- package/dist/cjs/client/components/presentation/AuthFlowSelect/AuthFlowSelect.cjs.map +1 -0
- package/dist/cjs/client/components/presentation/SignIn/SignIn.cjs.map +1 -1
- package/dist/cjs/client/components/presentation/SignUp/SignUp.cjs +3 -2
- package/dist/cjs/client/components/presentation/SignUp/SignUp.cjs.map +1 -1
- package/dist/cjs/client/components/presentation/UserSelect/UserSelect.cjs +25 -0
- package/dist/cjs/client/components/presentation/UserSelect/UserSelect.cjs.map +1 -0
- package/dist/cjs/client/components/presentation/UserTypeSelect/UserTypeSelect.cjs +25 -0
- package/dist/cjs/client/components/presentation/UserTypeSelect/UserTypeSelect.cjs.map +1 -0
- package/dist/cjs/client/contexts/ThunderID/ThunderIDProvider.cjs +3 -2
- package/dist/cjs/client/contexts/ThunderID/ThunderIDProvider.cjs.map +1 -1
- package/dist/cjs/client/fetchAuthFlowsFromServer.cjs +18 -0
- package/dist/cjs/client/fetchAuthFlowsFromServer.cjs.map +1 -0
- package/dist/cjs/client/fetchFlowMetaFromServer.cjs +22 -0
- package/dist/cjs/client/fetchFlowMetaFromServer.cjs.map +1 -0
- package/dist/cjs/client/fetchUserTypesFromServer.cjs +18 -0
- package/dist/cjs/client/fetchUserTypesFromServer.cjs.map +1 -0
- package/dist/cjs/client/fetchUsersFromServer.cjs +18 -0
- package/dist/cjs/client/fetchUsersFromServer.cjs.map +1 -0
- package/dist/cjs/client/index.cjs +3 -0
- package/dist/cjs/client/loadPageFromAction.cjs +19 -0
- package/dist/cjs/client/loadPageFromAction.cjs.map +1 -0
- package/dist/cjs/index.cjs +6 -0
- package/dist/cjs/server/ThunderIDProvider.cjs +0 -2
- package/dist/cjs/server/ThunderIDProvider.cjs.map +1 -1
- package/dist/cjs/server/actions/getAuthFlowsAction.cjs +28 -0
- package/dist/cjs/server/actions/getAuthFlowsAction.cjs.map +1 -0
- package/dist/cjs/server/actions/getFlowMetaAction.cjs +30 -12
- package/dist/cjs/server/actions/getFlowMetaAction.cjs.map +1 -1
- package/dist/cjs/server/actions/getUserTypesAction.cjs +27 -0
- package/dist/cjs/server/actions/getUserTypesAction.cjs.map +1 -0
- package/dist/cjs/server/actions/getUsersAction.cjs +28 -0
- package/dist/cjs/server/actions/getUsersAction.cjs.map +1 -0
- package/dist/cjs/server/actions/handleOAuthCallbackAction.cjs +1 -0
- package/dist/cjs/server/actions/handleOAuthCallbackAction.cjs.map +1 -1
- package/dist/cjs/server/actions/runSelectPageAction.cjs +47 -0
- package/dist/cjs/server/actions/runSelectPageAction.cjs.map +1 -0
- package/dist/cjs/server/proxy/createRouteMatcher.cjs +21 -4
- package/dist/cjs/server/proxy/createRouteMatcher.cjs.map +1 -1
- package/dist/cjs/utils/SessionManager.cjs +11 -7
- package/dist/cjs/utils/SessionManager.cjs.map +1 -1
- package/dist/client/components/presentation/AuthFlowSelect/AuthFlowSelect.d.ts +11 -0
- package/dist/client/components/presentation/AuthFlowSelect/AuthFlowSelect.d.ts.map +1 -0
- package/dist/client/components/presentation/AuthFlowSelect/AuthFlowSelect.js +22 -0
- package/dist/client/components/presentation/AuthFlowSelect/AuthFlowSelect.js.map +1 -0
- package/dist/client/components/presentation/SignIn/SignIn.d.ts +1 -1
- package/dist/client/components/presentation/SignIn/SignIn.d.ts.map +1 -1
- package/dist/client/components/presentation/SignIn/SignIn.js.map +1 -1
- package/dist/client/components/presentation/SignUp/SignUp.d.ts.map +1 -1
- package/dist/client/components/presentation/SignUp/SignUp.js +3 -2
- package/dist/client/components/presentation/SignUp/SignUp.js.map +1 -1
- package/dist/client/components/presentation/UserSelect/UserSelect.d.ts +11 -0
- package/dist/client/components/presentation/UserSelect/UserSelect.d.ts.map +1 -0
- package/dist/client/components/presentation/UserSelect/UserSelect.js +22 -0
- package/dist/client/components/presentation/UserSelect/UserSelect.js.map +1 -0
- package/dist/client/components/presentation/UserTypeSelect/UserTypeSelect.d.ts +11 -0
- package/dist/client/components/presentation/UserTypeSelect/UserTypeSelect.d.ts.map +1 -0
- package/dist/client/components/presentation/UserTypeSelect/UserTypeSelect.js +22 -0
- package/dist/client/components/presentation/UserTypeSelect/UserTypeSelect.js.map +1 -0
- package/dist/client/contexts/ThunderID/ThunderIDProvider.d.ts +0 -11
- package/dist/client/contexts/ThunderID/ThunderIDProvider.d.ts.map +1 -1
- package/dist/client/contexts/ThunderID/ThunderIDProvider.js +3 -2
- package/dist/client/contexts/ThunderID/ThunderIDProvider.js.map +1 -1
- package/dist/client/fetchAuthFlowsFromServer.d.ts +9 -0
- package/dist/client/fetchAuthFlowsFromServer.d.ts.map +1 -0
- package/dist/client/fetchAuthFlowsFromServer.js +18 -0
- package/dist/client/fetchAuthFlowsFromServer.js.map +1 -0
- package/dist/client/fetchFlowMetaFromServer.d.ts +12 -0
- package/dist/client/fetchFlowMetaFromServer.d.ts.map +1 -0
- package/dist/client/fetchFlowMetaFromServer.js +20 -0
- package/dist/client/fetchFlowMetaFromServer.js.map +1 -0
- package/dist/client/fetchUserTypesFromServer.d.ts +9 -0
- package/dist/client/fetchUserTypesFromServer.d.ts.map +1 -0
- package/dist/client/fetchUserTypesFromServer.js +18 -0
- package/dist/client/fetchUserTypesFromServer.js.map +1 -0
- package/dist/client/fetchUsersFromServer.d.ts +8 -0
- package/dist/client/fetchUsersFromServer.d.ts.map +1 -0
- package/dist/client/fetchUsersFromServer.js +18 -0
- package/dist/client/fetchUsersFromServer.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -0
- package/dist/client/loadPageFromAction.d.ts +9 -0
- package/dist/client/loadPageFromAction.d.ts.map +1 -0
- package/dist/client/loadPageFromAction.js +17 -0
- package/dist/client/loadPageFromAction.js.map +1 -0
- package/dist/index.js +4 -1
- package/dist/server/ThunderIDProvider.d.ts.map +1 -1
- package/dist/server/ThunderIDProvider.js +0 -2
- package/dist/server/ThunderIDProvider.js.map +1 -1
- package/dist/server/actions/getAuthFlowsAction.d.ts +19 -0
- package/dist/server/actions/getAuthFlowsAction.d.ts.map +1 -0
- package/dist/server/actions/getAuthFlowsAction.js +26 -0
- package/dist/server/actions/getAuthFlowsAction.js.map +1 -0
- package/dist/server/actions/getFlowMetaAction.d.ts +16 -1
- package/dist/server/actions/getFlowMetaAction.d.ts.map +1 -1
- package/dist/server/actions/getFlowMetaAction.js +31 -13
- package/dist/server/actions/getFlowMetaAction.js.map +1 -1
- package/dist/server/actions/getUserTypesAction.d.ts +18 -0
- package/dist/server/actions/getUserTypesAction.d.ts.map +1 -0
- package/dist/server/actions/getUserTypesAction.js +25 -0
- package/dist/server/actions/getUserTypesAction.js.map +1 -0
- package/dist/server/actions/getUsersAction.d.ts +18 -0
- package/dist/server/actions/getUsersAction.d.ts.map +1 -0
- package/dist/server/actions/getUsersAction.js +26 -0
- package/dist/server/actions/getUsersAction.js.map +1 -0
- package/dist/server/actions/handleOAuthCallbackAction.d.ts.map +1 -1
- package/dist/server/actions/handleOAuthCallbackAction.js +1 -0
- package/dist/server/actions/handleOAuthCallbackAction.js.map +1 -1
- package/dist/server/actions/runSelectPageAction.d.ts +28 -0
- package/dist/server/actions/runSelectPageAction.d.ts.map +1 -0
- package/dist/server/actions/runSelectPageAction.js +45 -0
- package/dist/server/actions/runSelectPageAction.js.map +1 -0
- package/dist/server/proxy/createRouteMatcher.d.ts +0 -19
- package/dist/server/proxy/createRouteMatcher.d.ts.map +1 -1
- package/dist/server/proxy/createRouteMatcher.js +21 -4
- package/dist/server/proxy/createRouteMatcher.js.map +1 -1
- package/dist/utils/SessionManager.d.ts +1 -1
- package/dist/utils/SessionManager.d.ts.map +1 -1
- package/dist/utils/SessionManager.js +3 -1
- package/dist/utils/SessionManager.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_getSessionId = require('./getSessionId.cjs');
|
|
3
|
+
const require_getClient = require('../getClient.cjs');
|
|
4
|
+
let __thunderid_node = require("@thunderid/node");
|
|
5
|
+
__thunderid_node = require_rolldown_runtime.__toESM(__thunderid_node);
|
|
6
|
+
|
|
7
|
+
//#region src/server/actions/runSelectPageAction.ts
|
|
8
|
+
/**
|
|
9
|
+
* Runs one select page load with the signed-in user's server-held session. The session comes from the
|
|
10
|
+
* request cookie, never from the caller. A server action is a public endpoint, so the paging values the caller
|
|
11
|
+
* sends are checked here and not trusted from their TypeScript types. A missing session, a malformed request or any
|
|
12
|
+
* failure becomes a plain result.
|
|
13
|
+
*/
|
|
14
|
+
const runSelectPageAction = async (resource, rawQuery, load, { allowFilter = false } = {}) => {
|
|
15
|
+
const sessionId = await require_getSessionId.default();
|
|
16
|
+
if (!sessionId) return {
|
|
17
|
+
message: `Failed to load ${resource} (HTTP 401).`,
|
|
18
|
+
statusCode: 401,
|
|
19
|
+
success: false
|
|
20
|
+
};
|
|
21
|
+
const checked = (0, __thunderid_node.parseSelectPageQuery)(rawQuery ?? {}, { allowFilter });
|
|
22
|
+
if (checked.invalid !== void 0) return {
|
|
23
|
+
message: `Failed to load ${resource} (HTTP 400).`,
|
|
24
|
+
statusCode: 400,
|
|
25
|
+
success: false
|
|
26
|
+
};
|
|
27
|
+
const { query } = checked;
|
|
28
|
+
try {
|
|
29
|
+
return {
|
|
30
|
+
page: await (0, __thunderid_node.loadPageWithRetryAndLog)(resource, {
|
|
31
|
+
limit: query.limit,
|
|
32
|
+
offset: query.offset
|
|
33
|
+
}, () => load(require_getClient.default(), sessionId, query)),
|
|
34
|
+
success: true
|
|
35
|
+
};
|
|
36
|
+
} catch (error) {
|
|
37
|
+
return {
|
|
38
|
+
...(0, __thunderid_node.mapSelectPageError)(error, resource),
|
|
39
|
+
success: false
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
var runSelectPageAction_default = runSelectPageAction;
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
exports.default = runSelectPageAction_default;
|
|
47
|
+
//# sourceMappingURL=runSelectPageAction.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runSelectPageAction.cjs","names":["sessionId: string | undefined","getSessionId","checked: SelectPageQueryResult","getClient"],"sources":["../../../../src/server/actions/runSelectPageAction.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {loadPageWithRetryAndLog, mapSelectPageError, parseSelectPageQuery} from '@thunderid/node';\nimport type {SelectPageErrorResult, SelectPage, SelectPageQuery, SelectPageQueryResult} from '@thunderid/node';\nimport getSessionId from './getSessionId';\nimport type ThunderIDNextClient from '../../ThunderIDNextClient';\nimport getClient from '../getClient';\n\n/**\n * What a select page server action returns: the normalized page, or a plain failure. It never\n * throws, because a thrown class instance loses its prototype chain crossing the server action boundary. A failure\n * carries a message built on the server and the status, never the text of the upstream reply.\n */\nexport type SelectPageActionResult = {page: SelectPage; success: true} | ({success: false} & SelectPageErrorResult);\n\n/**\n * Runs one select page load with the signed-in user's server-held session. The session comes from the\n * request cookie, never from the caller. A server action is a public endpoint, so the paging values the caller\n * sends are checked here and not trusted from their TypeScript types. A missing session, a malformed request or any\n * failure becomes a plain result.\n */\nconst runSelectPageAction = async (\n resource: string,\n rawQuery: {filter?: unknown; limit?: unknown; offset?: unknown},\n load: (client: ThunderIDNextClient, sessionId: string, query: SelectPageQuery) => Promise<SelectPage>,\n {allowFilter = false}: {allowFilter?: boolean} = {},\n): Promise<SelectPageActionResult> => {\n const sessionId: string | undefined = await getSessionId();\n\n if (!sessionId) {\n return {message: `Failed to load ${resource} (HTTP 401).`, statusCode: 401, success: false};\n }\n\n const checked: SelectPageQueryResult = parseSelectPageQuery(rawQuery ?? {}, {allowFilter});\n\n if (checked.invalid !== undefined) {\n return {message: `Failed to load ${resource} (HTTP 400).`, statusCode: 400, success: false};\n }\n\n const {query} = checked;\n\n try {\n // The retry and the failure log live here, where the real error and its status still exist. The plain result\n // sent to the browser carries only a message built here and the status.\n const page: SelectPage = await loadPageWithRetryAndLog(resource, {limit: query.limit, offset: query.offset}, () =>\n load(getClient(), sessionId, query),\n );\n\n return {page, success: true};\n } catch (error) {\n return {...mapSelectPageError(error, resource), success: false};\n }\n};\n\nexport default runSelectPageAction;\n"],"mappings":";;;;;;;;;;;;;AAsBA,MAAM,sBAAsB,OAC1B,UACA,UACA,MACA,EAAC,cAAc,UAAkC,EAAE,KACf;CACpC,MAAMA,YAAgC,MAAMC,8BAAc;AAE1D,KAAI,CAAC,UACH,QAAO;EAAC,SAAS,kBAAkB,SAAS;EAAe,YAAY;EAAK,SAAS;EAAM;CAG7F,MAAMC,qDAAsD,YAAY,EAAE,EAAE,EAAC,aAAY,CAAC;AAE1F,KAAI,QAAQ,YAAY,OACtB,QAAO;EAAC,SAAS,kBAAkB,SAAS;EAAe,YAAY;EAAK,SAAS;EAAM;CAG7F,MAAM,EAAC,UAAS;AAEhB,KAAI;AAOF,SAAO;GAAC,MAJiB,oDAA8B,UAAU;IAAC,OAAO,MAAM;IAAO,QAAQ,MAAM;IAAO,QACzG,KAAKC,2BAAW,EAAE,WAAW,MAAM,CACpC;GAEa,SAAS;GAAK;UACrB,OAAO;AACd,SAAO;GAAC,4CAAsB,OAAO,SAAS;GAAE,SAAS;GAAM;;;AAInE,kCAAe"}
|
|
@@ -19,11 +19,28 @@
|
|
|
19
19
|
* }
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
|
+
/**
|
|
23
|
+
* Converts one route pattern to a regular expression source. A parenthesized group such as `(.*)` is kept as
|
|
24
|
+
* regex, so `/dashboard(.*)` matches `/dashboard` and everything under it. Outside a group a `.` is a literal dot
|
|
25
|
+
* and a `*` matches any run of characters.
|
|
26
|
+
*/
|
|
27
|
+
const toRegexSource = (pattern) => {
|
|
28
|
+
let source = "";
|
|
29
|
+
let depth = 0;
|
|
30
|
+
for (const char of pattern) if (char === "(") {
|
|
31
|
+
depth += 1;
|
|
32
|
+
source += char;
|
|
33
|
+
} else if (char === ")") {
|
|
34
|
+
depth = Math.max(depth - 1, 0);
|
|
35
|
+
source += char;
|
|
36
|
+
} else if (depth > 0) source += char;
|
|
37
|
+
else if (char === ".") source += "\\.";
|
|
38
|
+
else if (char === "*") source += ".*";
|
|
39
|
+
else source += char;
|
|
40
|
+
return source;
|
|
41
|
+
};
|
|
22
42
|
const createRouteMatcher = (patterns) => {
|
|
23
|
-
const regexPatterns = patterns.map((pattern) => {
|
|
24
|
-
const regexPattern = pattern.replace(/\./g, "\\.").replace(/\*/g, ".*").replace(/\(\.\*\)/g, "(.*)");
|
|
25
|
-
return /* @__PURE__ */ new RegExp(`^${regexPattern}$`);
|
|
26
|
-
});
|
|
43
|
+
const regexPatterns = patterns.map((pattern) => /* @__PURE__ */ new RegExp(`^${toRegexSource(pattern)}$`));
|
|
27
44
|
return (req) => {
|
|
28
45
|
const { pathname } = req.nextUrl;
|
|
29
46
|
return regexPatterns.some((regex) => regex.test(pathname));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createRouteMatcher.cjs","names":["regexPatterns: RegExp[]"
|
|
1
|
+
{"version":3,"file":"createRouteMatcher.cjs","names":["regexPatterns: RegExp[]"],"sources":["../../../../src/server/proxy/createRouteMatcher.ts"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {NextRequest} from 'next/server';\n\n/**\n * Creates a route matcher function that tests if a request matches any of the given patterns.\n *\n * @param patterns - Array of route patterns to match. Supports glob-like patterns.\n * @returns Function that tests if a request matches any of the patterns\n *\n * @example\n * ```typescript\n * const isProtectedRoute = createRouteMatcher([\n * '/dashboard(.*)',\n * '/admin(.*)',\n * '/profile'\n * ]);\n *\n * if (isProtectedRoute(req)) {\n * // Route is protected\n * }\n * ```\n */\n/**\n * Converts one route pattern to a regular expression source. A parenthesized group such as `(.*)` is kept as\n * regex, so `/dashboard(.*)` matches `/dashboard` and everything under it. Outside a group a `.` is a literal dot\n * and a `*` matches any run of characters.\n */\nconst toRegexSource = (pattern: string): string => {\n let source = '';\n let depth = 0;\n\n for (const char of pattern) {\n if (char === '(') {\n depth += 1;\n source += char;\n } else if (char === ')') {\n depth = Math.max(depth - 1, 0);\n source += char;\n } else if (depth > 0) {\n source += char;\n } else if (char === '.') {\n source += '\\\\.';\n } else if (char === '*') {\n source += '.*';\n } else {\n source += char;\n }\n }\n\n return source;\n};\n\nconst createRouteMatcher = (patterns: string[]): ((req: NextRequest) => boolean) => {\n const regexPatterns: RegExp[] = patterns.map((pattern: string): RegExp => new RegExp(`^${toRegexSource(pattern)}$`));\n\n return (req: NextRequest): boolean => {\n const {pathname} = req.nextUrl;\n return regexPatterns.some((regex: RegExp): boolean => regex.test(pathname));\n };\n};\n\nexport default createRouteMatcher;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAM,iBAAiB,YAA4B;CACjD,IAAI,SAAS;CACb,IAAI,QAAQ;AAEZ,MAAK,MAAM,QAAQ,QACjB,KAAI,SAAS,KAAK;AAChB,WAAS;AACT,YAAU;YACD,SAAS,KAAK;AACvB,UAAQ,KAAK,IAAI,QAAQ,GAAG,EAAE;AAC9B,YAAU;YACD,QAAQ,EACjB,WAAU;UACD,SAAS,IAClB,WAAU;UACD,SAAS,IAClB,WAAU;KAEV,WAAU;AAId,QAAO;;AAGT,MAAM,sBAAsB,aAAwD;CAClF,MAAMA,gBAA0B,SAAS,KAAK,4BAA4B,IAAI,OAAO,IAAI,cAAc,QAAQ,CAAC,GAAG,CAAC;AAEpH,SAAQ,QAA8B;EACpC,MAAM,EAAC,aAAY,IAAI;AACvB,SAAO,cAAc,MAAM,UAA2B,MAAM,KAAK,SAAS,CAAC;;;AAI/E,iCAAe"}
|
|
@@ -3,8 +3,12 @@ const require_loggedOutSessions = require('./loggedOutSessions.cjs');
|
|
|
3
3
|
const require_sessionConstants = require('../constants/sessionConstants.cjs');
|
|
4
4
|
let __thunderid_node = require("@thunderid/node");
|
|
5
5
|
__thunderid_node = require_rolldown_runtime.__toESM(__thunderid_node);
|
|
6
|
-
let
|
|
7
|
-
|
|
6
|
+
let jose_jws_compact_verify = require("jose/jws/compact/verify");
|
|
7
|
+
jose_jws_compact_verify = require_rolldown_runtime.__toESM(jose_jws_compact_verify);
|
|
8
|
+
let jose_jwt_sign = require("jose/jwt/sign");
|
|
9
|
+
jose_jwt_sign = require_rolldown_runtime.__toESM(jose_jwt_sign);
|
|
10
|
+
let jose_jwt_verify = require("jose/jwt/verify");
|
|
11
|
+
jose_jwt_verify = require_rolldown_runtime.__toESM(jose_jwt_verify);
|
|
8
12
|
|
|
9
13
|
//#region src/utils/SessionManager.ts
|
|
10
14
|
/**
|
|
@@ -29,7 +33,7 @@ var SessionManager = class {
|
|
|
29
33
|
*/
|
|
30
34
|
static async createTempSession(sessionId) {
|
|
31
35
|
const secret = this.getSecret();
|
|
32
|
-
return await new
|
|
36
|
+
return await new jose_jwt_sign.SignJWT({
|
|
33
37
|
sessionId,
|
|
34
38
|
type: "temp"
|
|
35
39
|
}).setProtectedHeader({ alg: "HS256" }).setIssuedAt().setExpirationTime("15m").sign(secret);
|
|
@@ -53,7 +57,7 @@ var SessionManager = class {
|
|
|
53
57
|
}
|
|
54
58
|
static async createSessionToken(accessToken, userId, sessionId, scopes, accessTokenTtlSeconds, refreshToken, organizationId, serverSession) {
|
|
55
59
|
const secret = this.getSecret();
|
|
56
|
-
return await new
|
|
60
|
+
return await new jose_jwt_sign.SignJWT({
|
|
57
61
|
accessToken,
|
|
58
62
|
organizationId,
|
|
59
63
|
refreshToken,
|
|
@@ -69,7 +73,7 @@ var SessionManager = class {
|
|
|
69
73
|
*/
|
|
70
74
|
static async verifySessionToken(token) {
|
|
71
75
|
try {
|
|
72
|
-
const { payload } = await (0,
|
|
76
|
+
const { payload } = await (0, jose_jwt_verify.jwtVerify)(token, this.getSecret());
|
|
73
77
|
if (payload["type"] !== "session") throw new Error("Invalid token type");
|
|
74
78
|
await this.refuseLoggedOutSession(payload);
|
|
75
79
|
return payload;
|
|
@@ -90,7 +94,7 @@ var SessionManager = class {
|
|
|
90
94
|
*/
|
|
91
95
|
static async verifySessionTokenForRefresh(token) {
|
|
92
96
|
try {
|
|
93
|
-
const { payload: rawPayload } = await (0,
|
|
97
|
+
const { payload: rawPayload } = await (0, jose_jws_compact_verify.compactVerify)(token, this.getSecret());
|
|
94
98
|
const payload = JSON.parse(new TextDecoder().decode(rawPayload));
|
|
95
99
|
if (payload.type !== "session") throw new Error("Invalid token type");
|
|
96
100
|
await this.refuseLoggedOutSession(payload);
|
|
@@ -104,7 +108,7 @@ var SessionManager = class {
|
|
|
104
108
|
*/
|
|
105
109
|
static async verifyTempSession(token) {
|
|
106
110
|
try {
|
|
107
|
-
const { payload } = await (0,
|
|
111
|
+
const { payload } = await (0, jose_jwt_verify.jwtVerify)(token, this.getSecret());
|
|
108
112
|
if (payload["type"] !== "temp") throw new Error("Invalid token type");
|
|
109
113
|
return { sessionId: payload["sessionId"] };
|
|
110
114
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.cjs","names":["secret: string | undefined","ThunderIDRuntimeError","secret: Uint8Array","SignJWT","envValue: string | undefined","parsed: number","DEFAULT_SESSION_COOKIE_EXPIRY_TIME","payload: SessionTokenPayload","getLoggedOutSessions","CookieConfig"],"sources":["../../../src/utils/SessionManager.ts"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ThunderIDRuntimeError, CookieConfig} from '@thunderid/node';\nimport {SignJWT, jwtVerify, compactVerify, JWTPayload} from 'jose';\nimport {getLoggedOutSessions} from './loggedOutSessions';\nimport {DEFAULT_SESSION_COOKIE_EXPIRY_TIME} from '../constants/sessionConstants';\n\n/**\n * Session token payload interface\n */\nexport interface SessionTokenPayload extends JWTPayload {\n /** Expiration timestamp — doubles as the access token expiry (JWT exp == access token exp) */\n exp: number;\n /** Issued at timestamp */\n iat: number;\n /** Organization ID if applicable */\n organizationId?: string;\n /** The refresh token; empty string if not provided by the auth server */\n refreshToken: string;\n /** OAuth scopes */\n scopes: string[];\n /** Session ID */\n sessionId: string;\n /** The server session this session joined, from the `sid` of the ID token. */\n sid?: string;\n /** When the user signed in, in seconds. Kept across token refresh, unlike `iat`. */\n signedInAt?: number;\n /** User ID */\n sub: string;\n /** Token type discriminant — must be 'session' for access-session JWTs */\n type: 'session';\n}\n\n/**\n * Session management utility class for JWT-based session cookies\n */\nclass SessionManager {\n /**\n * Get the signing secret from environment variable\n * Throws error in production if not set\n */\n private static getSecret(): Uint8Array {\n const secret: string | undefined = process.env['THUNDERID_SECRET'];\n\n if (!secret) {\n if (process.env['NODE_ENV'] === 'production') {\n throw new ThunderIDRuntimeError(\n 'THUNDERID_SECRET environment variable is required in production',\n 'session-secret-required',\n 'nextjs',\n 'Set the THUNDERID_SECRET environment variable with a secure random string',\n );\n }\n // Use a default secret for development (not secure)\n // eslint-disable-next-line no-console\n console.warn('Using default secret for development. Set THUNDERID_SECRET for production!');\n return new TextEncoder().encode('development-secret-not-for-production');\n }\n\n return new TextEncoder().encode(secret);\n }\n\n /**\n * Create a temporary session cookie for login initiation\n */\n static async createTempSession(sessionId: string): Promise<string> {\n const secret: Uint8Array = this.getSecret();\n\n const jwt: string = await new SignJWT({\n sessionId,\n type: 'temp',\n })\n .setProtectedHeader({alg: 'HS256'})\n .setIssuedAt()\n .setExpirationTime('15m')\n .sign(secret);\n\n return jwt;\n }\n\n /**\n * Resolve the session cookie expiry time in seconds.\n *\n * Resolution order (first defined value wins):\n * 1. `configuredExpiry` — value from `ThunderIDNodeConfig.sessionCookie?.expiryTime`\n * 2. `THUNDERID_SESSION_COOKIE_EXPIRY_TIME` environment variable\n * 3. `DEFAULT_SESSION_COOKIE_EXPIRY_TIME` (24 hours)\n */\n static resolveSessionCookieExpiry(configuredExpiry?: number): number {\n if (configuredExpiry != null && configuredExpiry > 0) {\n return configuredExpiry;\n }\n\n const envValue: string | undefined = process.env['THUNDERID_SESSION_COOKIE_EXPIRY_TIME'];\n\n if (envValue) {\n const parsed: number = parseInt(envValue, 10);\n\n if (!Number.isNaN(parsed) && parsed > 0) {\n return parsed;\n }\n }\n\n return DEFAULT_SESSION_COOKIE_EXPIRY_TIME;\n }\n\n static async createSessionToken(\n accessToken: string,\n userId: string,\n sessionId: string,\n scopes: string,\n accessTokenTtlSeconds: number,\n refreshToken: string,\n organizationId?: string,\n serverSession?: {sid?: string; signedInAt?: number},\n ): Promise<string> {\n const secret: Uint8Array = this.getSecret();\n\n const jwt: string = await new SignJWT({\n accessToken,\n organizationId,\n refreshToken,\n scopes,\n sessionId,\n // What a back-channel logout matches this session by.\n sid: serverSession?.sid,\n signedInAt: serverSession?.signedInAt ?? Math.floor(Date.now() / 1000),\n type: 'session',\n } as Omit<SessionTokenPayload, 'sub' | 'iat' | 'exp'>)\n .setProtectedHeader({alg: 'HS256'})\n .setSubject(userId)\n .setIssuedAt()\n .setExpirationTime(Math.floor(Date.now() / 1000) + accessTokenTtlSeconds)\n .sign(secret);\n\n return jwt;\n }\n\n /**\n * Verify and decode a session token\n */\n static async verifySessionToken(token: string): Promise<SessionTokenPayload> {\n try {\n const secret: Uint8Array = this.getSecret();\n const {payload} = await jwtVerify(token, secret);\n\n if (payload['type'] !== 'session') {\n throw new Error('Invalid token type');\n }\n\n await this.refuseLoggedOutSession(payload as SessionTokenPayload);\n\n return payload as SessionTokenPayload;\n } catch (error) {\n throw new ThunderIDRuntimeError(\n `Invalid session token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'invalid-session-token',\n 'nextjs',\n 'Session token verification failed',\n );\n }\n }\n\n /**\n * Verify a session token for refresh. Validates the HMAC signature and the\n * `type === 'session'` discriminant but intentionally skips the `exp` check\n * so an expired access token can still be exchanged for a new one.\n *\n * Session lifetime is still bounded — the cookie's `maxAge` is set from\n * `sessionCookieExpiryTime`, so the browser drops an over-age session regardless\n * of the access-token exp embedded in the JWT.\n *\n * Never use the returned payload for authorization.\n */\n static async verifySessionTokenForRefresh(token: string): Promise<SessionTokenPayload> {\n try {\n const secret: Uint8Array = this.getSecret();\n const {payload: rawPayload} = await compactVerify(token, secret);\n const payload: SessionTokenPayload = JSON.parse(new TextDecoder().decode(rawPayload)) as SessionTokenPayload;\n\n if (payload.type !== 'session') {\n throw new Error('Invalid token type');\n }\n\n await this.refuseLoggedOutSession(payload);\n\n return payload;\n } catch (error) {\n throw new ThunderIDRuntimeError(\n `Invalid session token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'invalid-session-token-for-refresh',\n 'nextjs',\n 'Session token signature or type check failed during refresh',\n );\n }\n }\n\n /**\n * Verify and decode a temporary session token\n */\n static async verifyTempSession(token: string): Promise<{sessionId: string}> {\n try {\n const secret: Uint8Array = this.getSecret();\n const {payload} = await jwtVerify(token, secret);\n\n if (payload['type'] !== 'temp') {\n throw new Error('Invalid token type');\n }\n\n return {sessionId: payload['sessionId'] as string};\n } catch (error) {\n throw new ThunderIDRuntimeError(\n `Invalid temporary session token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'invalid-temp-session-token',\n 'nextjs',\n 'Temporary session token verification failed',\n );\n }\n }\n\n /**\n * Get session cookie options\n */\n /**\n * Throws when a back-channel logout has ended the session this cookie carries. The cookie is\n * still correctly signed, so this is the only thing that stops it from being used.\n */\n private static async refuseLoggedOutSession(payload: SessionTokenPayload): Promise<void> {\n const loggedOut: boolean = await getLoggedOutSessions().isLoggedOut({\n sid: payload.sid,\n startedAt: payload.signedInAt ?? payload.iat,\n sub: payload.sub,\n });\n\n if (loggedOut) {\n throw new Error('The session was ended by a back-channel logout');\n }\n }\n\n static getSessionCookieOptions(maxAge: number): {\n httpOnly: boolean;\n maxAge: number;\n path: string;\n sameSite: 'lax';\n secure: boolean;\n } {\n return {\n httpOnly: true,\n maxAge,\n path: '/',\n sameSite: 'lax' as const,\n secure: process.env['NODE_ENV'] === 'production',\n };\n }\n\n /**\n * Get temporary session cookie options\n */\n static getTempSessionCookieOptions(): {\n httpOnly: boolean;\n maxAge: number;\n path: string;\n sameSite: 'lax';\n secure: boolean;\n } {\n return {\n httpOnly: true,\n maxAge: 15 * 60,\n path: '/',\n sameSite: 'lax' as const,\n secure: process.env['NODE_ENV'] === 'production',\n };\n }\n\n /**\n * Get session cookie name\n */\n static getSessionCookieName(): string {\n return CookieConfig.getSessionCookieName();\n }\n\n /**\n * Get temporary session cookie name\n */\n static getTempSessionCookieName(): string {\n return CookieConfig.getTempSessionCookieName();\n }\n}\n\nexport default SessionManager;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionManager.cjs","names":["secret: string | undefined","ThunderIDRuntimeError","secret: Uint8Array","SignJWT","envValue: string | undefined","parsed: number","DEFAULT_SESSION_COOKIE_EXPIRY_TIME","payload: SessionTokenPayload","getLoggedOutSessions","CookieConfig"],"sources":["../../../src/utils/SessionManager.ts"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {ThunderIDRuntimeError, CookieConfig} from '@thunderid/node';\nimport type {JWTPayload} from 'jose';\n// Subpath imports keep the proxy's bundle free of jose's JWE code, whose CompressionStream use the Edge runtime rejects.\nimport {compactVerify} from 'jose/jws/compact/verify';\nimport {SignJWT} from 'jose/jwt/sign';\nimport {jwtVerify} from 'jose/jwt/verify';\nimport {getLoggedOutSessions} from './loggedOutSessions';\nimport {DEFAULT_SESSION_COOKIE_EXPIRY_TIME} from '../constants/sessionConstants';\n\n/**\n * Session token payload interface\n */\nexport interface SessionTokenPayload extends JWTPayload {\n /** Expiration timestamp — doubles as the access token expiry (JWT exp == access token exp) */\n exp: number;\n /** Issued at timestamp */\n iat: number;\n /** Organization ID if applicable */\n organizationId?: string;\n /** The refresh token; empty string if not provided by the auth server */\n refreshToken: string;\n /** OAuth scopes */\n scopes: string[];\n /** Session ID */\n sessionId: string;\n /** The server session this session joined, from the `sid` of the ID token. */\n sid?: string;\n /** When the user signed in, in seconds. Kept across token refresh, unlike `iat`. */\n signedInAt?: number;\n /** User ID */\n sub: string;\n /** Token type discriminant — must be 'session' for access-session JWTs */\n type: 'session';\n}\n\n/**\n * Session management utility class for JWT-based session cookies\n */\nclass SessionManager {\n /**\n * Get the signing secret from environment variable\n * Throws error in production if not set\n */\n private static getSecret(): Uint8Array {\n const secret: string | undefined = process.env['THUNDERID_SECRET'];\n\n if (!secret) {\n if (process.env['NODE_ENV'] === 'production') {\n throw new ThunderIDRuntimeError(\n 'THUNDERID_SECRET environment variable is required in production',\n 'session-secret-required',\n 'nextjs',\n 'Set the THUNDERID_SECRET environment variable with a secure random string',\n );\n }\n // Use a default secret for development (not secure)\n // eslint-disable-next-line no-console\n console.warn('Using default secret for development. Set THUNDERID_SECRET for production!');\n return new TextEncoder().encode('development-secret-not-for-production');\n }\n\n return new TextEncoder().encode(secret);\n }\n\n /**\n * Create a temporary session cookie for login initiation\n */\n static async createTempSession(sessionId: string): Promise<string> {\n const secret: Uint8Array = this.getSecret();\n\n const jwt: string = await new SignJWT({\n sessionId,\n type: 'temp',\n })\n .setProtectedHeader({alg: 'HS256'})\n .setIssuedAt()\n .setExpirationTime('15m')\n .sign(secret);\n\n return jwt;\n }\n\n /**\n * Resolve the session cookie expiry time in seconds.\n *\n * Resolution order (first defined value wins):\n * 1. `configuredExpiry` — value from `ThunderIDNodeConfig.sessionCookie?.expiryTime`\n * 2. `THUNDERID_SESSION_COOKIE_EXPIRY_TIME` environment variable\n * 3. `DEFAULT_SESSION_COOKIE_EXPIRY_TIME` (24 hours)\n */\n static resolveSessionCookieExpiry(configuredExpiry?: number): number {\n if (configuredExpiry != null && configuredExpiry > 0) {\n return configuredExpiry;\n }\n\n const envValue: string | undefined = process.env['THUNDERID_SESSION_COOKIE_EXPIRY_TIME'];\n\n if (envValue) {\n const parsed: number = parseInt(envValue, 10);\n\n if (!Number.isNaN(parsed) && parsed > 0) {\n return parsed;\n }\n }\n\n return DEFAULT_SESSION_COOKIE_EXPIRY_TIME;\n }\n\n static async createSessionToken(\n accessToken: string,\n userId: string,\n sessionId: string,\n scopes: string,\n accessTokenTtlSeconds: number,\n refreshToken: string,\n organizationId?: string,\n serverSession?: {sid?: string; signedInAt?: number},\n ): Promise<string> {\n const secret: Uint8Array = this.getSecret();\n\n const jwt: string = await new SignJWT({\n accessToken,\n organizationId,\n refreshToken,\n scopes,\n sessionId,\n // What a back-channel logout matches this session by.\n sid: serverSession?.sid,\n signedInAt: serverSession?.signedInAt ?? Math.floor(Date.now() / 1000),\n type: 'session',\n } as Omit<SessionTokenPayload, 'sub' | 'iat' | 'exp'>)\n .setProtectedHeader({alg: 'HS256'})\n .setSubject(userId)\n .setIssuedAt()\n .setExpirationTime(Math.floor(Date.now() / 1000) + accessTokenTtlSeconds)\n .sign(secret);\n\n return jwt;\n }\n\n /**\n * Verify and decode a session token\n */\n static async verifySessionToken(token: string): Promise<SessionTokenPayload> {\n try {\n const secret: Uint8Array = this.getSecret();\n const {payload} = await jwtVerify(token, secret);\n\n if (payload['type'] !== 'session') {\n throw new Error('Invalid token type');\n }\n\n await this.refuseLoggedOutSession(payload as SessionTokenPayload);\n\n return payload as SessionTokenPayload;\n } catch (error) {\n throw new ThunderIDRuntimeError(\n `Invalid session token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'invalid-session-token',\n 'nextjs',\n 'Session token verification failed',\n );\n }\n }\n\n /**\n * Verify a session token for refresh. Validates the HMAC signature and the\n * `type === 'session'` discriminant but intentionally skips the `exp` check\n * so an expired access token can still be exchanged for a new one.\n *\n * Session lifetime is still bounded — the cookie's `maxAge` is set from\n * `sessionCookieExpiryTime`, so the browser drops an over-age session regardless\n * of the access-token exp embedded in the JWT.\n *\n * Never use the returned payload for authorization.\n */\n static async verifySessionTokenForRefresh(token: string): Promise<SessionTokenPayload> {\n try {\n const secret: Uint8Array = this.getSecret();\n const {payload: rawPayload} = await compactVerify(token, secret);\n const payload: SessionTokenPayload = JSON.parse(new TextDecoder().decode(rawPayload)) as SessionTokenPayload;\n\n if (payload.type !== 'session') {\n throw new Error('Invalid token type');\n }\n\n await this.refuseLoggedOutSession(payload);\n\n return payload;\n } catch (error) {\n throw new ThunderIDRuntimeError(\n `Invalid session token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'invalid-session-token-for-refresh',\n 'nextjs',\n 'Session token signature or type check failed during refresh',\n );\n }\n }\n\n /**\n * Verify and decode a temporary session token\n */\n static async verifyTempSession(token: string): Promise<{sessionId: string}> {\n try {\n const secret: Uint8Array = this.getSecret();\n const {payload} = await jwtVerify(token, secret);\n\n if (payload['type'] !== 'temp') {\n throw new Error('Invalid token type');\n }\n\n return {sessionId: payload['sessionId'] as string};\n } catch (error) {\n throw new ThunderIDRuntimeError(\n `Invalid temporary session token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'invalid-temp-session-token',\n 'nextjs',\n 'Temporary session token verification failed',\n );\n }\n }\n\n /**\n * Get session cookie options\n */\n /**\n * Throws when a back-channel logout has ended the session this cookie carries. The cookie is\n * still correctly signed, so this is the only thing that stops it from being used.\n */\n private static async refuseLoggedOutSession(payload: SessionTokenPayload): Promise<void> {\n const loggedOut: boolean = await getLoggedOutSessions().isLoggedOut({\n sid: payload.sid,\n startedAt: payload.signedInAt ?? payload.iat,\n sub: payload.sub,\n });\n\n if (loggedOut) {\n throw new Error('The session was ended by a back-channel logout');\n }\n }\n\n static getSessionCookieOptions(maxAge: number): {\n httpOnly: boolean;\n maxAge: number;\n path: string;\n sameSite: 'lax';\n secure: boolean;\n } {\n return {\n httpOnly: true,\n maxAge,\n path: '/',\n sameSite: 'lax' as const,\n secure: process.env['NODE_ENV'] === 'production',\n };\n }\n\n /**\n * Get temporary session cookie options\n */\n static getTempSessionCookieOptions(): {\n httpOnly: boolean;\n maxAge: number;\n path: string;\n sameSite: 'lax';\n secure: boolean;\n } {\n return {\n httpOnly: true,\n maxAge: 15 * 60,\n path: '/',\n sameSite: 'lax' as const,\n secure: process.env['NODE_ENV'] === 'production',\n };\n }\n\n /**\n * Get session cookie name\n */\n static getSessionCookieName(): string {\n return CookieConfig.getSessionCookieName();\n }\n\n /**\n * Get temporary session cookie name\n */\n static getTempSessionCookieName(): string {\n return CookieConfig.getTempSessionCookieName();\n }\n}\n\nexport default SessionManager;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseAuthFlowSelectProps } from '@thunderid/react';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
export type AuthFlowSelectProps = Omit<BaseAuthFlowSelectProps, 'fetchAuthFlows'>;
|
|
4
|
+
/**
|
|
5
|
+
* Authentication-flow picker for signed-in screens. Flows load through a server action that uses the
|
|
6
|
+
* signed-in user's server-held session, so the access token never reaches the browser. It takes no
|
|
7
|
+
* data source; for a custom one use `Select` with `useInfiniteOptions`.
|
|
8
|
+
*/
|
|
9
|
+
declare const AuthFlowSelect: FC<AuthFlowSelectProps>;
|
|
10
|
+
export default AuthFlowSelect;
|
|
11
|
+
//# sourceMappingURL=AuthFlowSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthFlowSelect.d.ts","sourceRoot":"","sources":["../../../../../src/client/components/presentation/AuthFlowSelect/AuthFlowSelect.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAqB,uBAAuB,EAAC,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAGzB,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;AAElF;;;;GAIG;AACH,QAAA,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAE3C,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import fetchAuthFlowsFromServer_default from "../../../fetchAuthFlowsFromServer.js";
|
|
5
|
+
import { BaseAuthFlowSelect } from "@thunderid/react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
|
|
8
|
+
//#region src/client/components/presentation/AuthFlowSelect/AuthFlowSelect.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Authentication-flow picker for signed-in screens. Flows load through a server action that uses the
|
|
11
|
+
* signed-in user's server-held session, so the access token never reaches the browser. It takes no
|
|
12
|
+
* data source; for a custom one use `Select` with `useInfiniteOptions`.
|
|
13
|
+
*/
|
|
14
|
+
const AuthFlowSelect = (props) => /* @__PURE__ */ jsx(BaseAuthFlowSelect, {
|
|
15
|
+
...props,
|
|
16
|
+
fetchAuthFlows: fetchAuthFlowsFromServer_default
|
|
17
|
+
});
|
|
18
|
+
var AuthFlowSelect_default = AuthFlowSelect;
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
export { AuthFlowSelect_default as default };
|
|
22
|
+
//# sourceMappingURL=AuthFlowSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthFlowSelect.js","names":["AuthFlowSelect: FC<AuthFlowSelectProps>","fetchAuthFlowsFromServer"],"sources":["../../../../../src/client/components/presentation/AuthFlowSelect/AuthFlowSelect.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n'use client';\n\nimport {BaseAuthFlowSelect, BaseAuthFlowSelectProps} from '@thunderid/react';\nimport {FC} from 'react';\nimport fetchAuthFlowsFromServer from '../../../fetchAuthFlowsFromServer';\n\nexport type AuthFlowSelectProps = Omit<BaseAuthFlowSelectProps, 'fetchAuthFlows'>;\n\n/**\n * Authentication-flow picker for signed-in screens. Flows load through a server action that uses the\n * signed-in user's server-held session, so the access token never reaches the browser. It takes no\n * data source; for a custom one use `Select` with `useInfiniteOptions`.\n */\nconst AuthFlowSelect: FC<AuthFlowSelectProps> = (props: AuthFlowSelectProps) => (\n <BaseAuthFlowSelect {...props} fetchAuthFlows={fetchAuthFlowsFromServer} />\n);\n\nexport default AuthFlowSelect;\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAMA,kBAA2C,UAC/C,oBAAC;CAAmB,GAAI;CAAO,gBAAgBC;EAA4B;AAG7E,6BAAe"}
|
|
@@ -4,7 +4,7 @@ import { FC } from 'react';
|
|
|
4
4
|
* Props for the SignIn component.
|
|
5
5
|
* Extends BaseSignInProps for full compatibility with the React BaseSignIn component
|
|
6
6
|
*/
|
|
7
|
-
export type SignInProps = Pick<BaseSignInProps, 'className' | 'id' | 'onSuccess' | 'onError' | 'variant' | 'size'>;
|
|
7
|
+
export type SignInProps = Pick<BaseSignInProps, 'children' | 'className' | 'id' | 'onSuccess' | 'onError' | 'variant' | 'size'>;
|
|
8
8
|
/**
|
|
9
9
|
* A SignIn component for Next.js that provides native authentication flow.
|
|
10
10
|
* This component delegates to the BaseSignIn from @thunderid/react. Unlike BaseSignUp,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignIn.d.ts","sourceRoot":"","sources":["../../../../../src/client/components/presentation/SignIn/SignIn.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAa,eAAe,EAAwC,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAC,EAAE,EAA8B,MAAM,OAAO,CAAC;AAGtD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"SignIn.d.ts","sourceRoot":"","sources":["../../../../../src/client/components/presentation/SignIn/SignIn.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAa,eAAe,EAAwC,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAC,EAAE,EAA8B,MAAM,OAAO,CAAC;AAGtD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,eAAe,EACf,UAAU,GAAG,WAAW,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAC/E,CAAC;AAEF;;;;;GAKG;AACH,QAAA,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAmG3B,CAAC;AAIF,eAAe,MAAM,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignIn.js","names":["SignIn: FC<SignInProps>","useThunderID","normalizedError: Error","response: any"],"sources":["../../../../../src/client/components/presentation/SignIn/SignIn.tsx"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n'use client';\n\nimport {EmbeddedFlowComponent, EmbeddedFlowType, ThunderIDRuntimeError} from '@thunderid/node';\nimport {BaseSignIn, BaseSignInProps, normalizeFlowResponse, useTranslation} from '@thunderid/react';\nimport {FC, useEffect, useRef, useState} from 'react';\nimport useThunderID from '../../../contexts/ThunderID/useThunderID';\n\n/**\n * Props for the SignIn component.\n * Extends BaseSignInProps for full compatibility with the React BaseSignIn component\n */\nexport type SignInProps = Pick
|
|
1
|
+
{"version":3,"file":"SignIn.js","names":["SignIn: FC<SignInProps>","useThunderID","normalizedError: Error","response: any"],"sources":["../../../../../src/client/components/presentation/SignIn/SignIn.tsx"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n'use client';\n\nimport {EmbeddedFlowComponent, EmbeddedFlowType, ThunderIDRuntimeError} from '@thunderid/node';\nimport {BaseSignIn, BaseSignInProps, normalizeFlowResponse, useTranslation} from '@thunderid/react';\nimport {FC, useEffect, useRef, useState} from 'react';\nimport useThunderID from '../../../contexts/ThunderID/useThunderID';\n\n/**\n * Props for the SignIn component.\n * Extends BaseSignInProps for full compatibility with the React BaseSignIn component\n */\nexport type SignInProps = Pick<\n BaseSignInProps,\n 'children' | 'className' | 'id' | 'onSuccess' | 'onError' | 'variant' | 'size'\n>;\n\n/**\n * A SignIn component for Next.js that provides native authentication flow.\n * This component delegates to the BaseSignIn from @thunderid/react. Unlike BaseSignUp,\n * BaseSignIn does not manage its own flow state, so this component initiates the flow\n * (using the server-action-backed `signIn`) and tracks `components`/`executionId` itself.\n */\nconst SignIn: FC<SignInProps> = ({size = 'medium', variant = 'outlined', onError, ...rest}: SignInProps) => {\n const {signIn, applicationId, scopes} = useThunderID();\n const {t} = useTranslation();\n\n const [components, setComponents] = useState<EmbeddedFlowComponent[]>([]);\n const [additionalData, setAdditionalData] = useState<Record<string, any>>({});\n const [executionId, setExecutionId] = useState<string | undefined>(undefined);\n const [isFlowInitialized, setIsFlowInitialized] = useState(false);\n const [flowError, setFlowError] = useState<Error | null>(null);\n const initializationAttemptedRef = useRef(false);\n // A fresh challenge token is required on every step to prevent replay attacks; the server\n // rotates it on each response, so it's tracked in a ref (not state) to avoid a stale value\n // from a closure captured before the previous response's state update committed.\n const challengeTokenRef = useRef<string | undefined>(undefined);\n\n const applyFlowResponse = (response: any): void => {\n const normalized = normalizeFlowResponse(response, t, {resolveTranslations: false});\n\n challengeTokenRef.current = response?.challengeToken ?? undefined;\n setExecutionId(normalized.executionId ?? undefined);\n setComponents(normalized.components);\n setAdditionalData(normalized.additionalData);\n };\n\n const handleFlowError = (error: unknown): void => {\n const normalizedError: Error = error instanceof Error ? error : new Error(String(error));\n\n setFlowError(normalizedError);\n onError?.(normalizedError);\n };\n\n useEffect(() => {\n if (initializationAttemptedRef.current || !signIn) {\n return;\n }\n\n initializationAttemptedRef.current = true;\n\n (async (): Promise<void> => {\n try {\n const response: any = await signIn(\n {\n applicationId,\n flowType: EmbeddedFlowType.Authentication,\n ...(scopes && {scopes}),\n },\n {},\n );\n\n // `response` is undefined when the provider already redirected\n // (OAuth-redirect or completed flows are handled there directly).\n if (response) {\n applyFlowResponse(response);\n }\n } catch (error) {\n handleFlowError(error);\n } finally {\n setIsFlowInitialized(true);\n }\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [signIn]);\n\n const handleOnSubmit = async (payload: any): Promise<void> => {\n if (!signIn) {\n throw new ThunderIDRuntimeError(\n '`signIn` function is not available.',\n 'SignIn-handleOnSubmit-RuntimeError-001',\n 'nextjs',\n );\n }\n\n const response: any = await signIn(\n {\n ...payload,\n executionId,\n ...(challengeTokenRef.current ? {challengeToken: challengeTokenRef.current} : {}),\n },\n {},\n );\n\n if (response) {\n applyFlowResponse(response);\n }\n };\n\n return (\n <BaseSignIn\n additionalData={additionalData}\n components={components}\n error={flowError}\n isLoading={!isFlowInitialized}\n onError={onError}\n onSubmit={handleOnSubmit}\n size={size}\n variant={variant}\n {...rest}\n />\n );\n};\n\nSignIn.displayName = 'SignIn';\n\nexport default SignIn;\n"],"mappings":";;;;;;;;;;;;;;;;AAyBA,MAAMA,UAA2B,EAAC,OAAO,UAAU,UAAU,YAAY,QAAS,GAAG,WAAuB;CAC1G,MAAM,EAAC,QAAQ,eAAe,WAAUC,sBAAc;CACtD,MAAM,EAAC,MAAK,gBAAgB;CAE5B,MAAM,CAAC,YAAY,iBAAiB,SAAkC,EAAE,CAAC;CACzE,MAAM,CAAC,gBAAgB,qBAAqB,SAA8B,EAAE,CAAC;CAC7E,MAAM,CAAC,aAAa,kBAAkB,SAA6B,OAAU;CAC7E,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,MAAM;CACjE,MAAM,CAAC,WAAW,gBAAgB,SAAuB,KAAK;CAC9D,MAAM,6BAA6B,OAAO,MAAM;CAIhD,MAAM,oBAAoB,OAA2B,OAAU;CAE/D,MAAM,qBAAqB,aAAwB;EACjD,MAAM,aAAa,sBAAsB,UAAU,GAAG,EAAC,qBAAqB,OAAM,CAAC;AAEnF,oBAAkB,UAAU,UAAU,kBAAkB;AACxD,iBAAe,WAAW,eAAe,OAAU;AACnD,gBAAc,WAAW,WAAW;AACpC,oBAAkB,WAAW,eAAe;;CAG9C,MAAM,mBAAmB,UAAyB;EAChD,MAAMC,kBAAyB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AAExF,eAAa,gBAAgB;AAC7B,YAAU,gBAAgB;;AAG5B,iBAAgB;AACd,MAAI,2BAA2B,WAAW,CAAC,OACzC;AAGF,6BAA2B,UAAU;AAErC,GAAC,YAA2B;AAC1B,OAAI;IACF,MAAMC,WAAgB,MAAM,OAC1B;KACE;KACA,UAAU,iBAAiB;KAC3B,GAAI,UAAU,EAAC,QAAO;KACvB,EACD,EAAE,CACH;AAID,QAAI,SACF,mBAAkB,SAAS;YAEtB,OAAO;AACd,oBAAgB,MAAM;aACd;AACR,yBAAqB,KAAK;;MAE1B;IAEH,CAAC,OAAO,CAAC;CAEZ,MAAM,iBAAiB,OAAO,YAAgC;AAC5D,MAAI,CAAC,OACH,OAAM,IAAI,sBACR,uCACA,0CACA,SACD;EAGH,MAAMA,WAAgB,MAAM,OAC1B;GACE,GAAG;GACH;GACA,GAAI,kBAAkB,UAAU,EAAC,gBAAgB,kBAAkB,SAAQ,GAAG,EAAE;GACjF,EACD,EAAE,CACH;AAED,MAAI,SACF,mBAAkB,SAAS;;AAI/B,QACE,oBAAC;EACiB;EACJ;EACZ,OAAO;EACP,WAAW,CAAC;EACH;EACT,UAAU;EACJ;EACG;EACT,GAAI;GACJ;;AAIN,OAAO,cAAc;AAErB,qBAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignUp.d.ts","sourceRoot":"","sources":["../../../../../src/client/components/presentation/SignUp/SignUp.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAa,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAGzB;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"SignUp.d.ts","sourceRoot":"","sources":["../../../../../src/client/components/presentation/SignUp/SignUp.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAa,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAGzB;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CA2D3B,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -37,7 +37,7 @@ import { jsx } from "react/jsx-runtime";
|
|
|
37
37
|
* };
|
|
38
38
|
* ```
|
|
39
39
|
*/
|
|
40
|
-
const SignUp = ({ className, size = "medium", variant = "outlined", afterSignUpUrl, onError }) => {
|
|
40
|
+
const SignUp = ({ className, size = "medium", variant = "outlined", afterSignUpUrl, onError, children }) => {
|
|
41
41
|
const { signUp, applicationId: contextApplicationId, scopes } = useThunderID_default();
|
|
42
42
|
/**
|
|
43
43
|
* Initialize the sign-up flow.
|
|
@@ -66,7 +66,8 @@ const SignUp = ({ className, size = "medium", variant = "outlined", afterSignUpU
|
|
|
66
66
|
className,
|
|
67
67
|
size,
|
|
68
68
|
variant,
|
|
69
|
-
isInitialized: true
|
|
69
|
+
isInitialized: true,
|
|
70
|
+
children
|
|
70
71
|
});
|
|
71
72
|
};
|
|
72
73
|
var SignUp_default = SignUp;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignUp.js","names":["SignUp: FC<SignUpProps>","useThunderID"],"sources":["../../../../../src/client/components/presentation/SignUp/SignUp.tsx"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n'use client';\n\nimport {ThunderIDRuntimeError, EmbeddedFlowType} from '@thunderid/node';\nimport {BaseSignUp, BaseSignUpProps} from '@thunderid/react';\nimport {FC} from 'react';\nimport useThunderID from '../../../contexts/ThunderID/useThunderID';\n\n/**\n * Props for the SignUp component.\n */\nexport type SignUpProps = BaseSignUpProps;\n\n/**\n * A styled SignUp component that provides embedded sign-up flow with pre-built styling.\n * This component handles the API calls for sign-up and delegates UI logic to BaseSignUp.\n *\n * @example\n * ```tsx\n * import { SignUp } from '@thunderid/react';\n *\n * const App = () => {\n * return (\n * <SignUp\n * onSuccess={(response) => {\n * console.log('Sign-up successful:', response);\n * // Handle successful sign-up (e.g., redirect, show confirmation)\n * }}\n * onError={(error) => {\n * console.error('Sign-up failed:', error);\n * }}\n * onComplete={(redirectUrl) => {\n * // Platform-specific redirect handling (e.g., Next.js router.push)\n * router.push(redirectUrl); // or window.location.href = redirectUrl\n * }}\n * size=\"medium\"\n * variant=\"outlined\"\n * afterSignUpUrl=\"/welcome\"\n * />\n * );\n * };\n * ```\n */\nconst SignUp: FC<SignUpProps> = ({\n className,\n size = 'medium',\n variant = 'outlined',\n afterSignUpUrl,\n onError,\n}: SignUpProps) => {\n const {signUp, applicationId: contextApplicationId, scopes} = useThunderID();\n\n /**\n * Initialize the sign-up flow.\n */\n const handleInitialize = async (payload?: any): Promise<any> => {\n if (!signUp) {\n throw new ThunderIDRuntimeError(\n '`signUp` function is not available.',\n 'SignUp-handleInitialize-RuntimeError-001',\n 'nextjs',\n );\n }\n\n return (await signUp({\n flowType: EmbeddedFlowType.Registration,\n ...(contextApplicationId && {applicationId: contextApplicationId}),\n ...(scopes && {scopes}),\n ...payload,\n })) as unknown as Promise<any>;\n };\n\n /**\n * Handle sign-up steps.\n */\n const handleOnSubmit = async (payload: any): Promise<any> => {\n if (!signUp) {\n throw new ThunderIDRuntimeError(\n '`signUp` function is not available.',\n 'SignUp-handleOnSubmit-RuntimeError-001',\n 'nextjs',\n );\n }\n\n return (await signUp(payload)) as unknown as Promise<any>;\n };\n\n return (\n <BaseSignUp\n afterSignUpUrl={afterSignUpUrl}\n onInitialize={handleInitialize}\n onSubmit={handleOnSubmit}\n onError={onError}\n className={className}\n size={size}\n variant={variant}\n isInitialized={true}\n
|
|
1
|
+
{"version":3,"file":"SignUp.js","names":["SignUp: FC<SignUpProps>","useThunderID"],"sources":["../../../../../src/client/components/presentation/SignUp/SignUp.tsx"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n'use client';\n\nimport {ThunderIDRuntimeError, EmbeddedFlowType} from '@thunderid/node';\nimport {BaseSignUp, BaseSignUpProps} from '@thunderid/react';\nimport {FC} from 'react';\nimport useThunderID from '../../../contexts/ThunderID/useThunderID';\n\n/**\n * Props for the SignUp component.\n */\nexport type SignUpProps = BaseSignUpProps;\n\n/**\n * A styled SignUp component that provides embedded sign-up flow with pre-built styling.\n * This component handles the API calls for sign-up and delegates UI logic to BaseSignUp.\n *\n * @example\n * ```tsx\n * import { SignUp } from '@thunderid/react';\n *\n * const App = () => {\n * return (\n * <SignUp\n * onSuccess={(response) => {\n * console.log('Sign-up successful:', response);\n * // Handle successful sign-up (e.g., redirect, show confirmation)\n * }}\n * onError={(error) => {\n * console.error('Sign-up failed:', error);\n * }}\n * onComplete={(redirectUrl) => {\n * // Platform-specific redirect handling (e.g., Next.js router.push)\n * router.push(redirectUrl); // or window.location.href = redirectUrl\n * }}\n * size=\"medium\"\n * variant=\"outlined\"\n * afterSignUpUrl=\"/welcome\"\n * />\n * );\n * };\n * ```\n */\nconst SignUp: FC<SignUpProps> = ({\n className,\n size = 'medium',\n variant = 'outlined',\n afterSignUpUrl,\n onError,\n children,\n}: SignUpProps) => {\n const {signUp, applicationId: contextApplicationId, scopes} = useThunderID();\n\n /**\n * Initialize the sign-up flow.\n */\n const handleInitialize = async (payload?: any): Promise<any> => {\n if (!signUp) {\n throw new ThunderIDRuntimeError(\n '`signUp` function is not available.',\n 'SignUp-handleInitialize-RuntimeError-001',\n 'nextjs',\n );\n }\n\n return (await signUp({\n flowType: EmbeddedFlowType.Registration,\n ...(contextApplicationId && {applicationId: contextApplicationId}),\n ...(scopes && {scopes}),\n ...payload,\n })) as unknown as Promise<any>;\n };\n\n /**\n * Handle sign-up steps.\n */\n const handleOnSubmit = async (payload: any): Promise<any> => {\n if (!signUp) {\n throw new ThunderIDRuntimeError(\n '`signUp` function is not available.',\n 'SignUp-handleOnSubmit-RuntimeError-001',\n 'nextjs',\n );\n }\n\n return (await signUp(payload)) as unknown as Promise<any>;\n };\n\n return (\n <BaseSignUp\n afterSignUpUrl={afterSignUpUrl}\n onInitialize={handleInitialize}\n onSubmit={handleOnSubmit}\n onError={onError}\n className={className}\n size={size}\n variant={variant}\n isInitialized={true}\n >\n {children}\n </BaseSignUp>\n );\n};\n\nexport default SignUp;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,MAAMA,UAA2B,EAC/B,WACA,OAAO,UACP,UAAU,YACV,gBACA,SACA,eACiB;CACjB,MAAM,EAAC,QAAQ,eAAe,sBAAsB,WAAUC,sBAAc;;;;CAK5E,MAAM,mBAAmB,OAAO,YAAgC;AAC9D,MAAI,CAAC,OACH,OAAM,IAAI,sBACR,uCACA,4CACA,SACD;AAGH,SAAQ,MAAM,OAAO;GACnB,UAAU,iBAAiB;GAC3B,GAAI,wBAAwB,EAAC,eAAe,sBAAqB;GACjE,GAAI,UAAU,EAAC,QAAO;GACtB,GAAG;GACJ,CAAC;;;;;CAMJ,MAAM,iBAAiB,OAAO,YAA+B;AAC3D,MAAI,CAAC,OACH,OAAM,IAAI,sBACR,uCACA,0CACA,SACD;AAGH,SAAQ,MAAM,OAAO,QAAQ;;AAG/B,QACE,oBAAC;EACiB;EAChB,cAAc;EACd,UAAU;EACD;EACE;EACL;EACG;EACT,eAAe;EAEd;GACU;;AAIjB,qBAAe"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseUserSelectProps } from '@thunderid/react';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
export type UserSelectProps = Omit<BaseUserSelectProps, 'fetchUsers'>;
|
|
4
|
+
/**
|
|
5
|
+
* Single-user picker for signed-in screens. Users load through a server action that uses the
|
|
6
|
+
* signed-in user's server-held session, so the access token never reaches the browser. It takes no
|
|
7
|
+
* data source; for a custom one use `Select` with `useInfiniteOptions`.
|
|
8
|
+
*/
|
|
9
|
+
declare const UserSelect: FC<UserSelectProps>;
|
|
10
|
+
export default UserSelect;
|
|
11
|
+
//# sourceMappingURL=UserSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserSelect.d.ts","sourceRoot":"","sources":["../../../../../src/client/components/presentation/UserSelect/UserSelect.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAiB,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAGzB,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;AAEtE;;;;GAIG;AACH,QAAA,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAEnC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import fetchUsersFromServer_default from "../../../fetchUsersFromServer.js";
|
|
5
|
+
import { BaseUserSelect } from "@thunderid/react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
|
|
8
|
+
//#region src/client/components/presentation/UserSelect/UserSelect.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Single-user picker for signed-in screens. Users load through a server action that uses the
|
|
11
|
+
* signed-in user's server-held session, so the access token never reaches the browser. It takes no
|
|
12
|
+
* data source; for a custom one use `Select` with `useInfiniteOptions`.
|
|
13
|
+
*/
|
|
14
|
+
const UserSelect = (props) => /* @__PURE__ */ jsx(BaseUserSelect, {
|
|
15
|
+
...props,
|
|
16
|
+
fetchUsers: fetchUsersFromServer_default
|
|
17
|
+
});
|
|
18
|
+
var UserSelect_default = UserSelect;
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
export { UserSelect_default as default };
|
|
22
|
+
//# sourceMappingURL=UserSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserSelect.js","names":["UserSelect: FC<UserSelectProps>","fetchUsersFromServer"],"sources":["../../../../../src/client/components/presentation/UserSelect/UserSelect.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n'use client';\n\nimport {BaseUserSelect, BaseUserSelectProps} from '@thunderid/react';\nimport {FC} from 'react';\nimport fetchUsersFromServer from '../../../fetchUsersFromServer';\n\nexport type UserSelectProps = Omit<BaseUserSelectProps, 'fetchUsers'>;\n\n/**\n * Single-user picker for signed-in screens. Users load through a server action that uses the\n * signed-in user's server-held session, so the access token never reaches the browser. It takes no\n * data source; for a custom one use `Select` with `useInfiniteOptions`.\n */\nconst UserSelect: FC<UserSelectProps> = (props: UserSelectProps) => (\n <BaseUserSelect {...props} fetchUsers={fetchUsersFromServer} />\n);\n\nexport default UserSelect;\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAMA,cAAmC,UACvC,oBAAC;CAAe,GAAI;CAAO,YAAYC;EAAwB;AAGjE,yBAAe"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseUserTypeSelectProps } from '@thunderid/react';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
export type UserTypeSelectProps = Omit<BaseUserTypeSelectProps, 'fetchUserTypes'>;
|
|
4
|
+
/**
|
|
5
|
+
* User-type picker for signed-in screens. User types load through a server action that uses the
|
|
6
|
+
* signed-in user's server-held session, so the access token never reaches the browser. It takes no
|
|
7
|
+
* data source; for a custom one use `Select` with `useInfiniteOptions`.
|
|
8
|
+
*/
|
|
9
|
+
declare const UserTypeSelect: FC<UserTypeSelectProps>;
|
|
10
|
+
export default UserTypeSelect;
|
|
11
|
+
//# sourceMappingURL=UserTypeSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserTypeSelect.d.ts","sourceRoot":"","sources":["../../../../../src/client/components/presentation/UserTypeSelect/UserTypeSelect.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAqB,uBAAuB,EAAC,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAGzB,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;AAElF;;;;GAIG;AACH,QAAA,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAE3C,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import fetchUserTypesFromServer_default from "../../../fetchUserTypesFromServer.js";
|
|
5
|
+
import { BaseUserTypeSelect } from "@thunderid/react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
|
|
8
|
+
//#region src/client/components/presentation/UserTypeSelect/UserTypeSelect.tsx
|
|
9
|
+
/**
|
|
10
|
+
* User-type picker for signed-in screens. User types load through a server action that uses the
|
|
11
|
+
* signed-in user's server-held session, so the access token never reaches the browser. It takes no
|
|
12
|
+
* data source; for a custom one use `Select` with `useInfiniteOptions`.
|
|
13
|
+
*/
|
|
14
|
+
const UserTypeSelect = (props) => /* @__PURE__ */ jsx(BaseUserTypeSelect, {
|
|
15
|
+
...props,
|
|
16
|
+
fetchUserTypes: fetchUserTypesFromServer_default
|
|
17
|
+
});
|
|
18
|
+
var UserTypeSelect_default = UserTypeSelect;
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
export { UserTypeSelect_default as default };
|
|
22
|
+
//# sourceMappingURL=UserTypeSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserTypeSelect.js","names":["UserTypeSelect: FC<UserTypeSelectProps>","fetchUserTypesFromServer"],"sources":["../../../../../src/client/components/presentation/UserTypeSelect/UserTypeSelect.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\n'use client';\n\nimport {BaseUserTypeSelect, BaseUserTypeSelectProps} from '@thunderid/react';\nimport {FC} from 'react';\nimport fetchUserTypesFromServer from '../../../fetchUserTypesFromServer';\n\nexport type UserTypeSelectProps = Omit<BaseUserTypeSelectProps, 'fetchUserTypes'>;\n\n/**\n * User-type picker for signed-in screens. User types load through a server action that uses the\n * signed-in user's server-held session, so the access token never reaches the browser. It takes no\n * data source; for a custom one use `Select` with `useInfiniteOptions`.\n */\nconst UserTypeSelect: FC<UserTypeSelectProps> = (props: UserTypeSelectProps) => (\n <BaseUserTypeSelect {...props} fetchUserTypes={fetchUserTypesFromServer} />\n);\n\nexport default UserTypeSelect;\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAMA,kBAA2C,UAC/C,oBAAC;CAAmB,GAAI;CAAO,gBAAgBC;EAA4B;AAG7E,6BAAe"}
|
|
@@ -9,17 +9,6 @@ import { RefreshResult } from '../../../server/actions/refreshToken';
|
|
|
9
9
|
export type ThunderIDClientProviderProps = Partial<Omit<ThunderIDProviderProps, 'baseUrl' | 'clientId'>> & Pick<ThunderIDProviderProps, 'baseUrl' | 'clientId'> & {
|
|
10
10
|
applicationId: ThunderIDContextProps['applicationId'];
|
|
11
11
|
clearSession: () => Promise<void>;
|
|
12
|
-
/**
|
|
13
|
-
* Server Action that fetches `GET /flow/meta` server-side, passed down to `FlowMetaProvider` so
|
|
14
|
-
* it never calls `baseUrl` directly from the browser — avoiding the CORS requirement that a
|
|
15
|
-
* direct client-side fetch to the ThunderID server would otherwise impose. Used for both the
|
|
16
|
-
* initial fetch (when `initialMeta` isn't seeded, e.g. it failed server-side) and subsequent
|
|
17
|
-
* `switchLanguage()` calls.
|
|
18
|
-
*/
|
|
19
|
-
fetchMeta?: (params: {
|
|
20
|
-
applicationId?: string;
|
|
21
|
-
language?: string;
|
|
22
|
-
}) => Promise<FlowMetadataResponse>;
|
|
23
12
|
handleOAuthCallback: (code: string, state: string) => Promise<{
|
|
24
13
|
error?: string;
|
|
25
14
|
redirectUrl?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThunderIDProvider.d.ts","sourceRoot":"","sources":["../../../../src/client/contexts/ThunderID/ThunderIDProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,EACL,eAAe,EAEf,oBAAoB,EAEpB,qBAAqB,EACrB,IAAI,EACJ,WAAW,EAGZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAQL,sBAAsB,EACvB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAkD,MAAM,OAAO,CAAC;AAC7F,OAAyB,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAC,aAAa,EAAC,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"ThunderIDProvider.d.ts","sourceRoot":"","sources":["../../../../src/client/contexts/ThunderID/ThunderIDProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,EACL,eAAe,EAEf,oBAAoB,EAEpB,qBAAqB,EACrB,IAAI,EACJ,WAAW,EAGZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAQL,sBAAsB,EACvB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAkD,MAAM,OAAO,CAAC;AAC7F,OAAyB,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAC,aAAa,EAAC,MAAM,sCAAsC,CAAC;AAInE;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,GACtG,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG;IACrD,aAAa,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACtD,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,mBAAmB,EAAE,CACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAC,CAAC,CAAC;IACvE;;;OAGG;IACH,WAAW,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;IAChE,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACxC,aAAa,EAAE,CACb,aAAa,EAAE,qBAAqB,EACpC,SAAS,CAAC,EAAE,MAAM,KACf,OAAO,CAAC;QAAC,IAAI,EAAE;YAAC,IAAI,EAAE,IAAI,CAAA;SAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAC,CAAC,CAAC;IACpE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC;CACrD,CAAC;AAEJ,QAAA,MAAM,uBAAuB,EAAE,EAAE,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,CA0VhF,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import logger_default from "../../../utils/logger.js";
|
|
5
5
|
import ThunderIDContext_default from "./ThunderIDContext.js";
|
|
6
|
+
import fetchFlowMetaFromServer_default from "../../fetchFlowMetaFromServer.js";
|
|
6
7
|
import { ThunderIDRuntimeError, generateFlattenedUserProfile, getVendorPrefix } from "@thunderid/node";
|
|
7
8
|
import { FlowMetaProvider, FlowProvider, I18nProvider, ThemeProvider, ThunderIDContext, UserProvider } from "@thunderid/react";
|
|
8
9
|
import { useRouter, useSearchParams } from "next/navigation";
|
|
@@ -10,7 +11,7 @@ import { useEffect, useMemo, useRef, useState } from "react";
|
|
|
10
11
|
import { jsx } from "react/jsx-runtime";
|
|
11
12
|
|
|
12
13
|
//#region src/client/contexts/ThunderID/ThunderIDProvider.tsx
|
|
13
|
-
const ThunderIDClientProvider = ({ baseUrl, children, signIn, clearSession, refreshToken, signOut, signUp, handleOAuthCallback, preferences, isSignedIn, signInUrl, signUpUrl, user: _user, userProfile: _userProfile, userSchema: _userSchema = null, updateProfile, applicationId, organizationHandle, scopes, vendor, initialMeta = null
|
|
14
|
+
const ThunderIDClientProvider = ({ baseUrl, children, signIn, clearSession, refreshToken, signOut, signUp, handleOAuthCallback, preferences, isSignedIn, signInUrl, signUpUrl, user: _user, userProfile: _userProfile, userSchema: _userSchema = null, updateProfile, applicationId, organizationHandle, scopes, vendor, initialMeta = null }) => {
|
|
14
15
|
const reRenderCheckRef = useRef(false);
|
|
15
16
|
const router = useRouter();
|
|
16
17
|
const searchParams = useSearchParams();
|
|
@@ -200,7 +201,7 @@ const ThunderIDClientProvider = ({ baseUrl, children, signIn, clearSession, refr
|
|
|
200
201
|
children: /* @__PURE__ */ jsx(FlowMetaProvider, {
|
|
201
202
|
enabled: preferences?.resolveFromMeta !== false,
|
|
202
203
|
initialMeta,
|
|
203
|
-
fetchMeta,
|
|
204
|
+
fetchMeta: fetchFlowMetaFromServer_default,
|
|
204
205
|
children: /* @__PURE__ */ jsx(ThemeProvider, {
|
|
205
206
|
theme: preferences?.theme?.overrides,
|
|
206
207
|
mode: preferences?.theme?.mode,
|