@feelflow/ffid-sdk 5.17.0 → 5.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -117,10 +117,13 @@ function hasOwnKey(value, key) {
117
117
  function normalizeUserinfo(raw) {
118
118
  const hasOrganizationId = hasOwnKey(raw, "organization_id");
119
119
  const hasOrganizationName = hasOwnKey(raw, "organization_name");
120
- const organizationFields = hasOrganizationId ? {
121
- organizationId: raw.organization_id ?? null,
122
- organizationName: hasOrganizationName ? raw.organization_name ?? null : null
123
- } : hasOrganizationName ? { organizationName: raw.organization_name ?? null } : {};
120
+ const hasOrganizationMemberRole = hasOwnKey(raw, "organization_member_role");
121
+ const organizationMemberRole = hasOrganizationMemberRole ? raw.organization_member_role ?? null : raw.subscription ? raw.subscription.member_role ?? null : void 0;
122
+ const organizationFields = {
123
+ ...hasOrganizationId ? { organizationId: raw.organization_id ?? null } : {},
124
+ ...hasOrganizationId || hasOrganizationName ? { organizationName: raw.organization_name ?? null } : {},
125
+ ...organizationMemberRole !== void 0 ? { organizationMemberRole } : {}
126
+ };
124
127
  return {
125
128
  sub: raw.sub,
126
129
  email: raw.email,
@@ -227,10 +230,29 @@ function createJwtVerifier(deps) {
227
230
  return { data: userInfo };
228
231
  } catch (error) {
229
232
  const message = error instanceof Error ? error.message : "JWT\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F";
230
- logger.error("JWT verification failed:", message);
233
+ if (error instanceof jose.errors.JWTExpired) {
234
+ logger.debug("JWT verification failed (token expired):", message);
235
+ return {
236
+ error: createError(
237
+ errorCodes.TOKEN_EXPIRED,
238
+ "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u3066\u3044\u307E\u3059"
239
+ )
240
+ };
241
+ }
242
+ const isTokenLevelError = error instanceof jose.errors.JWTClaimValidationFailed || error instanceof jose.errors.JWTInvalid || error instanceof jose.errors.JWSInvalid || error instanceof jose.errors.JWSSignatureVerificationFailed || error instanceof jose.errors.JOSEAlgNotAllowed || error instanceof jose.errors.JOSENotSupported || error instanceof jose.errors.JWKSNoMatchingKey || error instanceof jose.errors.JWKSMultipleMatchingKeys;
243
+ if (isTokenLevelError) {
244
+ logger.warn("JWT verification failed:", message);
245
+ return {
246
+ error: createError(
247
+ errorCodes.TOKEN_VERIFICATION_ERROR,
248
+ `JWT\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${message}`
249
+ )
250
+ };
251
+ }
252
+ logger.error("JWT verification failed (JWKS fetch):", message);
231
253
  return {
232
254
  error: createError(
233
- errorCodes.TOKEN_VERIFICATION_ERROR,
255
+ errorCodes.NETWORK_ERROR,
234
256
  `JWT\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${message}`
235
257
  )
236
258
  };
@@ -255,7 +277,9 @@ function createVerifyAccessToken(deps) {
255
277
  serviceCode,
256
278
  logger,
257
279
  createError,
258
- errorCodes: { TOKEN_VERIFICATION_ERROR: errorCodes.TOKEN_VERIFICATION_ERROR }
280
+ // structural superset of JwtVerifierDeps.errorCodes — passing it
281
+ // wholesale removes the hand-transcription drift point
282
+ errorCodes
259
283
  });
260
284
  }
261
285
  return jwtVerify2;
@@ -1095,7 +1119,7 @@ function createNonContractMethods(deps) {
1095
1119
  }
1096
1120
 
1097
1121
  // src/client/version-check.ts
1098
- var SDK_VERSION = "5.17.0";
1122
+ var SDK_VERSION = "5.18.0";
1099
1123
  var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1100
1124
  var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1101
1125
  function sdkHeaders() {
@@ -2692,6 +2716,19 @@ function isBlockedFromUserinfo(sub) {
2692
2716
  return BLOCKING_EFFECTIVE_STATUSES.includes(effectiveStatus);
2693
2717
  }
2694
2718
 
2719
+ // src/client/error-codes.ts
2720
+ var FFID_ERROR_CODES = {
2721
+ NETWORK_ERROR: "NETWORK_ERROR",
2722
+ PARSE_ERROR: "PARSE_ERROR",
2723
+ UNKNOWN_ERROR: "UNKNOWN_ERROR",
2724
+ TOKEN_EXCHANGE_ERROR: "TOKEN_EXCHANGE_ERROR",
2725
+ TOKEN_REFRESH_ERROR: "TOKEN_REFRESH_ERROR",
2726
+ NO_TOKENS: "NO_TOKENS",
2727
+ TOKEN_VERIFICATION_ERROR: "TOKEN_VERIFICATION_ERROR",
2728
+ TOKEN_EXPIRED: "TOKEN_EXPIRED",
2729
+ STATE_MISMATCH_ERROR: "STATE_MISMATCH_ERROR"
2730
+ };
2731
+
2695
2732
  // src/client/ffid-client.ts
2696
2733
  var UNAUTHORIZED_STATUS2 = 401;
2697
2734
  var SDK_LOG_PREFIX = "[FFID SDK]";
@@ -2700,8 +2737,10 @@ var noopLogger = {
2700
2737
  },
2701
2738
  info: () => {
2702
2739
  },
2703
- warn: (...args) => console.warn(SDK_LOG_PREFIX, ...args),
2704
- error: (...args) => console.error(SDK_LOG_PREFIX, ...args)
2740
+ warn: () => {
2741
+ },
2742
+ error: () => {
2743
+ }
2705
2744
  };
2706
2745
  var consoleLogger = {
2707
2746
  debug: (...args) => console.debug(SDK_LOG_PREFIX, ...args),
@@ -2709,16 +2748,6 @@ var consoleLogger = {
2709
2748
  warn: (...args) => console.warn(SDK_LOG_PREFIX, ...args),
2710
2749
  error: (...args) => console.error(SDK_LOG_PREFIX, ...args)
2711
2750
  };
2712
- var FFID_ERROR_CODES = {
2713
- NETWORK_ERROR: "NETWORK_ERROR",
2714
- PARSE_ERROR: "PARSE_ERROR",
2715
- UNKNOWN_ERROR: "UNKNOWN_ERROR",
2716
- TOKEN_EXCHANGE_ERROR: "TOKEN_EXCHANGE_ERROR",
2717
- TOKEN_REFRESH_ERROR: "TOKEN_REFRESH_ERROR",
2718
- NO_TOKENS: "NO_TOKENS",
2719
- TOKEN_VERIFICATION_ERROR: "TOKEN_VERIFICATION_ERROR",
2720
- STATE_MISMATCH_ERROR: "STATE_MISMATCH_ERROR"
2721
- };
2722
2751
  var EXT_CHECK_ENDPOINT = "/api/v1/subscriptions/ext/check";
2723
2752
  var DEFAULT_ALLOW_GRACE = true;
2724
2753
  var DEFAULT_SERVICE_ACCESS_FAIL_POLICY = "failClosed";
@@ -5348,6 +5377,7 @@ exports.FFIDSDKError = FFIDSDKError;
5348
5377
  exports.FFIDSubscriptionBadge = FFIDSubscriptionBadge;
5349
5378
  exports.FFIDUserMenu = FFIDUserMenu;
5350
5379
  exports.FFID_ANNOUNCEMENTS_ERROR_CODES = FFID_ANNOUNCEMENTS_ERROR_CODES;
5380
+ exports.FFID_ERROR_CODES = FFID_ERROR_CODES;
5351
5381
  exports.FFID_INQUIRY_CATEGORIES = FFID_INQUIRY_CATEGORIES;
5352
5382
  exports.FFID_INQUIRY_CATEGORIES_SITE_2026 = FFID_INQUIRY_CATEGORIES_SITE_2026;
5353
5383
  exports.cleanupStateStorage = cleanupStateStorage;
@@ -1,5 +1,5 @@
1
1
  import { createContext, useState, useRef, useEffect, useMemo, useCallback, useContext } from 'react';
2
- import { createRemoteJWKSet, jwtVerify } from 'jose';
2
+ import { createRemoteJWKSet, jwtVerify, errors } from 'jose';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
 
5
5
  // src/constants.ts
@@ -115,10 +115,13 @@ function hasOwnKey(value, key) {
115
115
  function normalizeUserinfo(raw) {
116
116
  const hasOrganizationId = hasOwnKey(raw, "organization_id");
117
117
  const hasOrganizationName = hasOwnKey(raw, "organization_name");
118
- const organizationFields = hasOrganizationId ? {
119
- organizationId: raw.organization_id ?? null,
120
- organizationName: hasOrganizationName ? raw.organization_name ?? null : null
121
- } : hasOrganizationName ? { organizationName: raw.organization_name ?? null } : {};
118
+ const hasOrganizationMemberRole = hasOwnKey(raw, "organization_member_role");
119
+ const organizationMemberRole = hasOrganizationMemberRole ? raw.organization_member_role ?? null : raw.subscription ? raw.subscription.member_role ?? null : void 0;
120
+ const organizationFields = {
121
+ ...hasOrganizationId ? { organizationId: raw.organization_id ?? null } : {},
122
+ ...hasOrganizationId || hasOrganizationName ? { organizationName: raw.organization_name ?? null } : {},
123
+ ...organizationMemberRole !== void 0 ? { organizationMemberRole } : {}
124
+ };
122
125
  return {
123
126
  sub: raw.sub,
124
127
  email: raw.email,
@@ -225,10 +228,29 @@ function createJwtVerifier(deps) {
225
228
  return { data: userInfo };
226
229
  } catch (error) {
227
230
  const message = error instanceof Error ? error.message : "JWT\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F";
228
- logger.error("JWT verification failed:", message);
231
+ if (error instanceof errors.JWTExpired) {
232
+ logger.debug("JWT verification failed (token expired):", message);
233
+ return {
234
+ error: createError(
235
+ errorCodes.TOKEN_EXPIRED,
236
+ "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u3066\u3044\u307E\u3059"
237
+ )
238
+ };
239
+ }
240
+ const isTokenLevelError = error instanceof errors.JWTClaimValidationFailed || error instanceof errors.JWTInvalid || error instanceof errors.JWSInvalid || error instanceof errors.JWSSignatureVerificationFailed || error instanceof errors.JOSEAlgNotAllowed || error instanceof errors.JOSENotSupported || error instanceof errors.JWKSNoMatchingKey || error instanceof errors.JWKSMultipleMatchingKeys;
241
+ if (isTokenLevelError) {
242
+ logger.warn("JWT verification failed:", message);
243
+ return {
244
+ error: createError(
245
+ errorCodes.TOKEN_VERIFICATION_ERROR,
246
+ `JWT\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${message}`
247
+ )
248
+ };
249
+ }
250
+ logger.error("JWT verification failed (JWKS fetch):", message);
229
251
  return {
230
252
  error: createError(
231
- errorCodes.TOKEN_VERIFICATION_ERROR,
253
+ errorCodes.NETWORK_ERROR,
232
254
  `JWT\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${message}`
233
255
  )
234
256
  };
@@ -253,7 +275,9 @@ function createVerifyAccessToken(deps) {
253
275
  serviceCode,
254
276
  logger,
255
277
  createError,
256
- errorCodes: { TOKEN_VERIFICATION_ERROR: errorCodes.TOKEN_VERIFICATION_ERROR }
278
+ // structural superset of JwtVerifierDeps.errorCodes — passing it
279
+ // wholesale removes the hand-transcription drift point
280
+ errorCodes
257
281
  });
258
282
  }
259
283
  return jwtVerify2;
@@ -1093,7 +1117,7 @@ function createNonContractMethods(deps) {
1093
1117
  }
1094
1118
 
1095
1119
  // src/client/version-check.ts
1096
- var SDK_VERSION = "5.17.0";
1120
+ var SDK_VERSION = "5.18.0";
1097
1121
  var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1098
1122
  var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1099
1123
  function sdkHeaders() {
@@ -2690,6 +2714,19 @@ function isBlockedFromUserinfo(sub) {
2690
2714
  return BLOCKING_EFFECTIVE_STATUSES.includes(effectiveStatus);
2691
2715
  }
2692
2716
 
2717
+ // src/client/error-codes.ts
2718
+ var FFID_ERROR_CODES = {
2719
+ NETWORK_ERROR: "NETWORK_ERROR",
2720
+ PARSE_ERROR: "PARSE_ERROR",
2721
+ UNKNOWN_ERROR: "UNKNOWN_ERROR",
2722
+ TOKEN_EXCHANGE_ERROR: "TOKEN_EXCHANGE_ERROR",
2723
+ TOKEN_REFRESH_ERROR: "TOKEN_REFRESH_ERROR",
2724
+ NO_TOKENS: "NO_TOKENS",
2725
+ TOKEN_VERIFICATION_ERROR: "TOKEN_VERIFICATION_ERROR",
2726
+ TOKEN_EXPIRED: "TOKEN_EXPIRED",
2727
+ STATE_MISMATCH_ERROR: "STATE_MISMATCH_ERROR"
2728
+ };
2729
+
2693
2730
  // src/client/ffid-client.ts
2694
2731
  var UNAUTHORIZED_STATUS2 = 401;
2695
2732
  var SDK_LOG_PREFIX = "[FFID SDK]";
@@ -2698,8 +2735,10 @@ var noopLogger = {
2698
2735
  },
2699
2736
  info: () => {
2700
2737
  },
2701
- warn: (...args) => console.warn(SDK_LOG_PREFIX, ...args),
2702
- error: (...args) => console.error(SDK_LOG_PREFIX, ...args)
2738
+ warn: () => {
2739
+ },
2740
+ error: () => {
2741
+ }
2703
2742
  };
2704
2743
  var consoleLogger = {
2705
2744
  debug: (...args) => console.debug(SDK_LOG_PREFIX, ...args),
@@ -2707,16 +2746,6 @@ var consoleLogger = {
2707
2746
  warn: (...args) => console.warn(SDK_LOG_PREFIX, ...args),
2708
2747
  error: (...args) => console.error(SDK_LOG_PREFIX, ...args)
2709
2748
  };
2710
- var FFID_ERROR_CODES = {
2711
- NETWORK_ERROR: "NETWORK_ERROR",
2712
- PARSE_ERROR: "PARSE_ERROR",
2713
- UNKNOWN_ERROR: "UNKNOWN_ERROR",
2714
- TOKEN_EXCHANGE_ERROR: "TOKEN_EXCHANGE_ERROR",
2715
- TOKEN_REFRESH_ERROR: "TOKEN_REFRESH_ERROR",
2716
- NO_TOKENS: "NO_TOKENS",
2717
- TOKEN_VERIFICATION_ERROR: "TOKEN_VERIFICATION_ERROR",
2718
- STATE_MISMATCH_ERROR: "STATE_MISMATCH_ERROR"
2719
- };
2720
2749
  var EXT_CHECK_ENDPOINT = "/api/v1/subscriptions/ext/check";
2721
2750
  var DEFAULT_ALLOW_GRACE = true;
2722
2751
  var DEFAULT_SERVICE_ACCESS_FAIL_POLICY = "failClosed";
@@ -5331,4 +5360,4 @@ function FFIDInquiryForm({
5331
5360
  );
5332
5361
  }
5333
5362
 
5334
- export { ACCESS_GRANTING_EFFECTIVE_STATUSES, BLOCKING_EFFECTIVE_STATUSES, DEFAULT_API_BASE_URL, DEFAULT_OAUTH_SCOPES, EFFECTIVE_SUBSCRIPTION_STATUSES, FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDProvider, FFIDSDKError, FFIDSubscriptionBadge, FFIDUserMenu, FFID_ANNOUNCEMENTS_ERROR_CODES, FFID_INQUIRY_CATEGORIES, FFID_INQUIRY_CATEGORIES_SITE_2026, cleanupStateStorage, computeEffectiveStatusFromSession, createFFIDAnnouncementsClient, createFFIDClient, createTokenStore, generateCodeChallenge, generateCodeVerifier, handleRedirectCallback, hasAccessFromUserinfo, isBlockedFromUserinfo, isFFIDInquiryCategorySite2026, normalizeRedirectUri, retrieveCodeVerifier, retrieveState, storeCodeVerifier, storeState, useFFID, useFFIDAnnouncements, useFFIDContext, useSubscription, withSubscription };
5363
+ export { ACCESS_GRANTING_EFFECTIVE_STATUSES, BLOCKING_EFFECTIVE_STATUSES, DEFAULT_API_BASE_URL, DEFAULT_OAUTH_SCOPES, EFFECTIVE_SUBSCRIPTION_STATUSES, FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDProvider, FFIDSDKError, FFIDSubscriptionBadge, FFIDUserMenu, FFID_ANNOUNCEMENTS_ERROR_CODES, FFID_ERROR_CODES, FFID_INQUIRY_CATEGORIES, FFID_INQUIRY_CATEGORIES_SITE_2026, cleanupStateStorage, computeEffectiveStatusFromSession, createFFIDAnnouncementsClient, createFFIDClient, createTokenStore, generateCodeChallenge, generateCodeVerifier, handleRedirectCallback, hasAccessFromUserinfo, isBlockedFromUserinfo, isFFIDInquiryCategorySite2026, normalizeRedirectUri, retrieveCodeVerifier, retrieveState, storeCodeVerifier, storeState, useFFID, useFFIDAnnouncements, useFFIDContext, useSubscription, withSubscription };
@@ -1,34 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var chunkHBPYSPBY_cjs = require('../chunk-HBPYSPBY.cjs');
3
+ var chunk55S5VUWR_cjs = require('../chunk-55S5VUWR.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "FFIDAnnouncementBadge", {
8
8
  enumerable: true,
9
- get: function () { return chunkHBPYSPBY_cjs.FFIDAnnouncementBadge; }
9
+ get: function () { return chunk55S5VUWR_cjs.FFIDAnnouncementBadge; }
10
10
  });
11
11
  Object.defineProperty(exports, "FFIDAnnouncementList", {
12
12
  enumerable: true,
13
- get: function () { return chunkHBPYSPBY_cjs.FFIDAnnouncementList; }
13
+ get: function () { return chunk55S5VUWR_cjs.FFIDAnnouncementList; }
14
14
  });
15
15
  Object.defineProperty(exports, "FFIDInquiryForm", {
16
16
  enumerable: true,
17
- get: function () { return chunkHBPYSPBY_cjs.FFIDInquiryForm; }
17
+ get: function () { return chunk55S5VUWR_cjs.FFIDInquiryForm; }
18
18
  });
19
19
  Object.defineProperty(exports, "FFIDLoginButton", {
20
20
  enumerable: true,
21
- get: function () { return chunkHBPYSPBY_cjs.FFIDLoginButton; }
21
+ get: function () { return chunk55S5VUWR_cjs.FFIDLoginButton; }
22
22
  });
23
23
  Object.defineProperty(exports, "FFIDOrganizationSwitcher", {
24
24
  enumerable: true,
25
- get: function () { return chunkHBPYSPBY_cjs.FFIDOrganizationSwitcher; }
25
+ get: function () { return chunk55S5VUWR_cjs.FFIDOrganizationSwitcher; }
26
26
  });
27
27
  Object.defineProperty(exports, "FFIDSubscriptionBadge", {
28
28
  enumerable: true,
29
- get: function () { return chunkHBPYSPBY_cjs.FFIDSubscriptionBadge; }
29
+ get: function () { return chunk55S5VUWR_cjs.FFIDSubscriptionBadge; }
30
30
  });
31
31
  Object.defineProperty(exports, "FFIDUserMenu", {
32
32
  enumerable: true,
33
- get: function () { return chunkHBPYSPBY_cjs.FFIDUserMenu; }
33
+ get: function () { return chunk55S5VUWR_cjs.FFIDUserMenu; }
34
34
  });
@@ -1,3 +1,3 @@
1
- export { G as FFIDAnnouncementBadge, ag as FFIDAnnouncementBadgeClassNames, ah as FFIDAnnouncementBadgeProps, H as FFIDAnnouncementList, ai as FFIDAnnouncementListClassNames, aj as FFIDAnnouncementListProps, Q as FFIDInquiryForm, R as FFIDInquiryFormCategoryItem, S as FFIDInquiryFormClassNames, T as FFIDInquiryFormLegalLayout, U as FFIDInquiryFormOrganization, V as FFIDInquiryFormPlaceholderContext, W as FFIDInquiryFormPrefill, X as FFIDInquiryFormProps, Y as FFIDInquiryFormSubmitData, Z as FFIDInquiryFormSubmitResult, $ as FFIDLoginButton, ak as FFIDLoginButtonProps, a2 as FFIDOrganizationSwitcher, al as FFIDOrganizationSwitcherClassNames, am as FFIDOrganizationSwitcherProps, a7 as FFIDSubscriptionBadge, an as FFIDSubscriptionBadgeClassNames, ao as FFIDSubscriptionBadgeProps, a9 as FFIDUserMenu, ap as FFIDUserMenuClassNames, aq as FFIDUserMenuProps } from '../index-CG0vObax.cjs';
1
+ export { G as FFIDAnnouncementBadge, ag as FFIDAnnouncementBadgeClassNames, ah as FFIDAnnouncementBadgeProps, H as FFIDAnnouncementList, ai as FFIDAnnouncementListClassNames, aj as FFIDAnnouncementListProps, Q as FFIDInquiryForm, R as FFIDInquiryFormCategoryItem, S as FFIDInquiryFormClassNames, T as FFIDInquiryFormLegalLayout, U as FFIDInquiryFormOrganization, V as FFIDInquiryFormPlaceholderContext, W as FFIDInquiryFormPrefill, X as FFIDInquiryFormProps, Y as FFIDInquiryFormSubmitData, Z as FFIDInquiryFormSubmitResult, $ as FFIDLoginButton, ak as FFIDLoginButtonProps, a2 as FFIDOrganizationSwitcher, al as FFIDOrganizationSwitcherClassNames, am as FFIDOrganizationSwitcherProps, a7 as FFIDSubscriptionBadge, an as FFIDSubscriptionBadgeClassNames, ao as FFIDSubscriptionBadgeProps, a9 as FFIDUserMenu, ap as FFIDUserMenuClassNames, aq as FFIDUserMenuProps } from '../index-Bkul-fRw.cjs';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
@@ -1,3 +1,3 @@
1
- export { G as FFIDAnnouncementBadge, ag as FFIDAnnouncementBadgeClassNames, ah as FFIDAnnouncementBadgeProps, H as FFIDAnnouncementList, ai as FFIDAnnouncementListClassNames, aj as FFIDAnnouncementListProps, Q as FFIDInquiryForm, R as FFIDInquiryFormCategoryItem, S as FFIDInquiryFormClassNames, T as FFIDInquiryFormLegalLayout, U as FFIDInquiryFormOrganization, V as FFIDInquiryFormPlaceholderContext, W as FFIDInquiryFormPrefill, X as FFIDInquiryFormProps, Y as FFIDInquiryFormSubmitData, Z as FFIDInquiryFormSubmitResult, $ as FFIDLoginButton, ak as FFIDLoginButtonProps, a2 as FFIDOrganizationSwitcher, al as FFIDOrganizationSwitcherClassNames, am as FFIDOrganizationSwitcherProps, a7 as FFIDSubscriptionBadge, an as FFIDSubscriptionBadgeClassNames, ao as FFIDSubscriptionBadgeProps, a9 as FFIDUserMenu, ap as FFIDUserMenuClassNames, aq as FFIDUserMenuProps } from '../index-CG0vObax.js';
1
+ export { G as FFIDAnnouncementBadge, ag as FFIDAnnouncementBadgeClassNames, ah as FFIDAnnouncementBadgeProps, H as FFIDAnnouncementList, ai as FFIDAnnouncementListClassNames, aj as FFIDAnnouncementListProps, Q as FFIDInquiryForm, R as FFIDInquiryFormCategoryItem, S as FFIDInquiryFormClassNames, T as FFIDInquiryFormLegalLayout, U as FFIDInquiryFormOrganization, V as FFIDInquiryFormPlaceholderContext, W as FFIDInquiryFormPrefill, X as FFIDInquiryFormProps, Y as FFIDInquiryFormSubmitData, Z as FFIDInquiryFormSubmitResult, $ as FFIDLoginButton, ak as FFIDLoginButtonProps, a2 as FFIDOrganizationSwitcher, al as FFIDOrganizationSwitcherClassNames, am as FFIDOrganizationSwitcherProps, a7 as FFIDSubscriptionBadge, an as FFIDSubscriptionBadgeClassNames, ao as FFIDSubscriptionBadgeProps, a9 as FFIDUserMenu, ap as FFIDUserMenuClassNames, aq as FFIDUserMenuProps } from '../index-Bkul-fRw.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
@@ -1 +1 @@
1
- export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-HLCHSKAF.js';
1
+ export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-L2H56C4W.js';
@@ -1240,10 +1240,12 @@ interface FFIDOAuthUserInfoSubscription {
1240
1240
  /**
1241
1241
  * Unified user-identity shape returned by `getSession()` (→ `/oauth/userinfo`)
1242
1242
  * and `verifyAccessToken()` (JWT or introspect path). `subscription`,
1243
- * `organizationId`, and `organizationName` are scope-gated on `/oauth/userinfo`
1244
- * (FFID #3380, requires `subscription:read`); JWT-only verify additionally
1245
- * omits `subscription` and `organizationName` when `includeProfile` is false
1246
- * because the JWT has `org_id` but no `org_name` claim.
1243
+ * `organizationId`, `organizationName`, and `organizationMemberRole` are
1244
+ * scope-gated on `/oauth/userinfo` (FFID #3380 / #4060, requires
1245
+ * `subscription:read`); JWT verification without `includeProfile`
1246
+ * additionally omits `subscription`, `organizationName`, and
1247
+ * `organizationMemberRole` because the JWT has `org_id` but no `org_name`
1248
+ * or membership-role claim.
1247
1249
  * See per-field JSDoc — misreading `undefined` is a security regression.
1248
1250
  */
1249
1251
  interface FFIDOAuthUserInfo {
@@ -1280,6 +1282,19 @@ interface FFIDOAuthUserInfo {
1280
1282
  * claim.
1281
1283
  */
1282
1284
  organizationName?: string | null | undefined;
1285
+ /**
1286
+ * Organization membership role, `null` if FFID cannot resolve a role for the
1287
+ * selected organization, or `undefined` if the granted scope omits
1288
+ * `subscription:read` on `/oauth/userinfo` (FFID #4060), or if the caller
1289
+ * used JWT verification without `includeProfile`. JWT payloads carry
1290
+ * `org_id` but no membership-role claim.
1291
+ *
1292
+ * This duplicates `subscription.memberRole` at the top level so consumers can
1293
+ * sync `(organizationId, organizationMemberRole)` without unpacking the full
1294
+ * subscription blob. Older FFID responses that omit the top-level wire field
1295
+ * are normalized from `subscription.member_role` when available.
1296
+ */
1297
+ organizationMemberRole?: FFIDOAuthUserInfoMemberRole | null | undefined;
1283
1298
  /**
1284
1299
  * Subscription summary for `(user, service, organization)`. Branch on
1285
1300
  * `effectiveStatus` (5.3.0+) for access decisions.
@@ -1240,10 +1240,12 @@ interface FFIDOAuthUserInfoSubscription {
1240
1240
  /**
1241
1241
  * Unified user-identity shape returned by `getSession()` (→ `/oauth/userinfo`)
1242
1242
  * and `verifyAccessToken()` (JWT or introspect path). `subscription`,
1243
- * `organizationId`, and `organizationName` are scope-gated on `/oauth/userinfo`
1244
- * (FFID #3380, requires `subscription:read`); JWT-only verify additionally
1245
- * omits `subscription` and `organizationName` when `includeProfile` is false
1246
- * because the JWT has `org_id` but no `org_name` claim.
1243
+ * `organizationId`, `organizationName`, and `organizationMemberRole` are
1244
+ * scope-gated on `/oauth/userinfo` (FFID #3380 / #4060, requires
1245
+ * `subscription:read`); JWT verification without `includeProfile`
1246
+ * additionally omits `subscription`, `organizationName`, and
1247
+ * `organizationMemberRole` because the JWT has `org_id` but no `org_name`
1248
+ * or membership-role claim.
1247
1249
  * See per-field JSDoc — misreading `undefined` is a security regression.
1248
1250
  */
1249
1251
  interface FFIDOAuthUserInfo {
@@ -1280,6 +1282,19 @@ interface FFIDOAuthUserInfo {
1280
1282
  * claim.
1281
1283
  */
1282
1284
  organizationName?: string | null | undefined;
1285
+ /**
1286
+ * Organization membership role, `null` if FFID cannot resolve a role for the
1287
+ * selected organization, or `undefined` if the granted scope omits
1288
+ * `subscription:read` on `/oauth/userinfo` (FFID #4060), or if the caller
1289
+ * used JWT verification without `includeProfile`. JWT payloads carry
1290
+ * `org_id` but no membership-role claim.
1291
+ *
1292
+ * This duplicates `subscription.memberRole` at the top level so consumers can
1293
+ * sync `(organizationId, organizationMemberRole)` without unpacking the full
1294
+ * subscription blob. Older FFID responses that omit the top-level wire field
1295
+ * are normalized from `subscription.member_role` when available.
1296
+ */
1297
+ organizationMemberRole?: FFIDOAuthUserInfoMemberRole | null | undefined;
1283
1298
  /**
1284
1299
  * Subscription summary for `(user, service, organization)`. Branch on
1285
1300
  * `effectiveStatus` (5.3.0+) for access decisions.
@@ -316,10 +316,12 @@ interface FFIDOAuthUserInfoSubscription {
316
316
  /**
317
317
  * Unified user-identity shape returned by `getSession()` (→ `/oauth/userinfo`)
318
318
  * and `verifyAccessToken()` (JWT or introspect path). `subscription`,
319
- * `organizationId`, and `organizationName` are scope-gated on `/oauth/userinfo`
320
- * (FFID #3380, requires `subscription:read`); JWT-only verify additionally
321
- * omits `subscription` and `organizationName` when `includeProfile` is false
322
- * because the JWT has `org_id` but no `org_name` claim.
319
+ * `organizationId`, `organizationName`, and `organizationMemberRole` are
320
+ * scope-gated on `/oauth/userinfo` (FFID #3380 / #4060, requires
321
+ * `subscription:read`); JWT verification without `includeProfile`
322
+ * additionally omits `subscription`, `organizationName`, and
323
+ * `organizationMemberRole` because the JWT has `org_id` but no `org_name`
324
+ * or membership-role claim.
323
325
  * See per-field JSDoc — misreading `undefined` is a security regression.
324
326
  */
325
327
  interface FFIDOAuthUserInfo {
@@ -356,6 +358,19 @@ interface FFIDOAuthUserInfo {
356
358
  * claim.
357
359
  */
358
360
  organizationName?: string | null | undefined;
361
+ /**
362
+ * Organization membership role, `null` if FFID cannot resolve a role for the
363
+ * selected organization, or `undefined` if the granted scope omits
364
+ * `subscription:read` on `/oauth/userinfo` (FFID #4060), or if the caller
365
+ * used JWT verification without `includeProfile`. JWT payloads carry
366
+ * `org_id` but no membership-role claim.
367
+ *
368
+ * This duplicates `subscription.memberRole` at the top level so consumers can
369
+ * sync `(organizationId, organizationMemberRole)` without unpacking the full
370
+ * subscription blob. Older FFID responses that omit the top-level wire field
371
+ * are normalized from `subscription.member_role` when available.
372
+ */
373
+ organizationMemberRole?: FFIDOAuthUserInfoMemberRole | null | undefined;
359
374
  /**
360
375
  * Subscription summary for `(user, service, organization)`. Branch on
361
376
  * `effectiveStatus` (5.3.0+) for access decisions.
@@ -316,10 +316,12 @@ interface FFIDOAuthUserInfoSubscription {
316
316
  /**
317
317
  * Unified user-identity shape returned by `getSession()` (→ `/oauth/userinfo`)
318
318
  * and `verifyAccessToken()` (JWT or introspect path). `subscription`,
319
- * `organizationId`, and `organizationName` are scope-gated on `/oauth/userinfo`
320
- * (FFID #3380, requires `subscription:read`); JWT-only verify additionally
321
- * omits `subscription` and `organizationName` when `includeProfile` is false
322
- * because the JWT has `org_id` but no `org_name` claim.
319
+ * `organizationId`, `organizationName`, and `organizationMemberRole` are
320
+ * scope-gated on `/oauth/userinfo` (FFID #3380 / #4060, requires
321
+ * `subscription:read`); JWT verification without `includeProfile`
322
+ * additionally omits `subscription`, `organizationName`, and
323
+ * `organizationMemberRole` because the JWT has `org_id` but no `org_name`
324
+ * or membership-role claim.
323
325
  * See per-field JSDoc — misreading `undefined` is a security regression.
324
326
  */
325
327
  interface FFIDOAuthUserInfo {
@@ -356,6 +358,19 @@ interface FFIDOAuthUserInfo {
356
358
  * claim.
357
359
  */
358
360
  organizationName?: string | null | undefined;
361
+ /**
362
+ * Organization membership role, `null` if FFID cannot resolve a role for the
363
+ * selected organization, or `undefined` if the granted scope omits
364
+ * `subscription:read` on `/oauth/userinfo` (FFID #4060), or if the caller
365
+ * used JWT verification without `includeProfile`. JWT payloads carry
366
+ * `org_id` but no membership-role claim.
367
+ *
368
+ * This duplicates `subscription.memberRole` at the top level so consumers can
369
+ * sync `(organizationId, organizationMemberRole)` without unpacking the full
370
+ * subscription blob. Older FFID responses that omit the top-level wire field
371
+ * are normalized from `subscription.member_role` when available.
372
+ */
373
+ organizationMemberRole?: FFIDOAuthUserInfoMemberRole | null | undefined;
359
374
  /**
360
375
  * Subscription summary for `(user, service, organization)`. Branch on
361
376
  * `effectiveStatus` (5.3.0+) for access decisions.