@feelflow/ffid-sdk 5.18.0 → 5.21.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.
@@ -264,10 +264,12 @@ var OAUTH_INTROSPECT_ENDPOINT = "/api/v1/oauth/introspect";
264
264
  var CACHE_KEY_PREFIX = "ffid:introspect:";
265
265
  var HEX_BASE = 16;
266
266
  var HEX_BYTE_WIDTH = 2;
267
- var TOKEN_LOG_PREFIX_LENGTH = 8;
268
267
  function createVerifyAccessToken(deps) {
269
268
  const { authMode, baseUrl, serviceCode, serviceApiKey, verifyStrategy, logger, createError, errorCodes, cache, timeout } = deps;
270
269
  let jwtVerify2 = null;
270
+ let cacheReadFailureEscalated = false;
271
+ let cacheWriteFailureEscalated = false;
272
+ let missingSubtleCryptoLogged = false;
271
273
  function getJwtVerifier() {
272
274
  if (!jwtVerify2) {
273
275
  jwtVerify2 = createJwtVerifier({
@@ -327,8 +329,9 @@ function createVerifyAccessToken(deps) {
327
329
  }
328
330
  const url = `${baseUrl}${OAUTH_INTROSPECT_ENDPOINT}`;
329
331
  logger.debug("Verifying access token:", url);
330
- const cacheKey = cache ? await buildCacheKey(accessToken, cacheKeySuffix) : "";
331
- if (cache) {
332
+ const cacheKey = cache ? await buildCacheKey(accessToken, cacheKeySuffix) : null;
333
+ let verificationCacheDegraded = cache !== void 0 && cacheKey === null;
334
+ if (cache && cacheKey !== null) {
332
335
  try {
333
336
  const cached = await cache.adapter.get(cacheKey);
334
337
  if (cached && typeof cached === "object" && "sub" in cached) {
@@ -336,7 +339,16 @@ function createVerifyAccessToken(deps) {
336
339
  return { data: cached };
337
340
  }
338
341
  } catch (cacheError) {
339
- logger.warn("Cache read failed, falling back to API call:", cacheError);
342
+ verificationCacheDegraded = true;
343
+ if (!cacheReadFailureEscalated) {
344
+ cacheReadFailureEscalated = true;
345
+ logger.error(
346
+ "Cache read failed \u2014 falling back to API call. Redis \u7B49\u306E cache adapter \u969C\u5BB3\u6642\u306F\u5168 verification \u304C introspect \u306B degrade \u3057\u307E\u3059\uFF08\u3053\u306E error \u306F instance \u3054\u3068\u306B\u521D\u56DE\u306E\u307F\u3001\u4EE5\u964D\u306F warn\uFF09:",
347
+ cacheError
348
+ );
349
+ } else {
350
+ logger.warn("Cache read failed, falling back to API call:", cacheError);
351
+ }
340
352
  }
341
353
  }
342
354
  const fetchOptions = {
@@ -431,31 +443,40 @@ function createVerifyAccessToken(deps) {
431
443
  }
432
444
  } : base;
433
445
  const userinfo = normalizeUserinfo(raw);
434
- if (cache) {
446
+ if (cache && cacheKey !== null) {
435
447
  try {
436
448
  await cache.adapter.set(cacheKey, userinfo, cache.ttl);
437
449
  } catch (cacheError) {
438
- logger.warn("Cache write failed (result still returned):", cacheError);
450
+ verificationCacheDegraded = true;
451
+ if (!cacheWriteFailureEscalated) {
452
+ cacheWriteFailureEscalated = true;
453
+ logger.error(
454
+ "Cache write failed \u2014 result still returned. cache adapter \u969C\u5BB3\u6642\u306F introspect \u7D50\u679C\u304C\u30AD\u30E3\u30C3\u30B7\u30E5\u3055\u308C\u305A\u5168 verification \u304C API \u547C\u3073\u51FA\u3057\u306B degrade \u3057\u307E\u3059\uFF08\u3053\u306E error \u306F instance \u3054\u3068\u306B\u521D\u56DE\u306E\u307F\u3001\u4EE5\u964D\u306F warn\uFF09:",
455
+ cacheError
456
+ );
457
+ } else {
458
+ logger.warn("Cache write failed (result still returned):", cacheError);
459
+ }
439
460
  }
440
461
  }
441
- return { data: userinfo };
462
+ return verificationCacheDegraded ? { data: userinfo, meta: { verificationCacheDegraded: true } } : { data: userinfo };
442
463
  }
443
464
  async function buildCacheKey(token, suffix) {
444
- let key;
445
- if (typeof globalThis.crypto?.subtle?.digest === "function") {
446
- const encoder = new TextEncoder();
447
- const data = encoder.encode(token);
448
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
449
- const hashArray = Array.from(new Uint8Array(hashBuffer));
450
- const hashHex = hashArray.map((b) => b.toString(HEX_BASE).padStart(HEX_BYTE_WIDTH, "0")).join("");
451
- key = CACHE_KEY_PREFIX + hashHex;
452
- } else {
453
- const tokenPrefix = token.length > TOKEN_LOG_PREFIX_LENGTH ? token.substring(0, TOKEN_LOG_PREFIX_LENGTH) + "..." : "***";
454
- logger.warn(
455
- `crypto.subtle \u304C\u5229\u7528\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u30AD\u30E3\u30C3\u30B7\u30E5\u30AD\u30FC\u306B\u30CF\u30C3\u30B7\u30E5\u5316\u3055\u308C\u3066\u3044\u306A\u3044\u30C8\u30FC\u30AF\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059 (token prefix: ${tokenPrefix})`
456
- );
457
- key = CACHE_KEY_PREFIX + token;
458
- }
465
+ if (typeof globalThis.crypto?.subtle?.digest !== "function") {
466
+ if (!missingSubtleCryptoLogged) {
467
+ missingSubtleCryptoLogged = true;
468
+ logger.error(
469
+ "crypto.subtle \u304C\u5229\u7528\u3067\u304D\u306A\u3044\u305F\u3081 introspect \u7D50\u679C\u306E\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u7121\u52B9\u5316\u3057\u307E\u3057\u305F\uFF08\u30CF\u30C3\u30B7\u30E5\u5316\u3055\u308C\u3066\u3044\u306A\u3044\u30C8\u30FC\u30AF\u30F3\u3092 cache key \u306B\u4F7F\u308F\u306A\u3044\u305F\u3081\u306E\u63AA\u7F6E #4119\uFF09\u3002\u5168 verification \u304C API \u547C\u3073\u51FA\u3057\u306B\u306A\u308A\u307E\u3059"
470
+ );
471
+ }
472
+ return null;
473
+ }
474
+ const encoder = new TextEncoder();
475
+ const data = encoder.encode(token);
476
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
477
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
478
+ const hashHex = hashArray.map((b) => b.toString(HEX_BASE).padStart(HEX_BYTE_WIDTH, "0")).join("");
479
+ const key = CACHE_KEY_PREFIX + hashHex;
459
480
  return suffix ? `${key}:${suffix}` : key;
460
481
  }
461
482
  return verifyAccessToken;
@@ -873,6 +894,93 @@ function createMembersMethods(deps) {
873
894
  return { listMembers, addMember, updateMemberRole, removeMember };
874
895
  }
875
896
 
897
+ // src/client/provisioning-methods.ts
898
+ var USER_PROVISION_ENDPOINT = "/api/v1/ext/users/provision";
899
+ var ORGANIZATION_PROVISION_ENDPOINT = "/api/v1/ext/organizations/provision";
900
+ var MAX_PROVISION_MEMBERS = 100;
901
+ var ASSIGNABLE_MEMBER_ROLES = {
902
+ admin: true,
903
+ member: true,
904
+ viewer: true
905
+ };
906
+ function isAssignableMemberRole(role) {
907
+ return Object.hasOwn(ASSIGNABLE_MEMBER_ROLES, role);
908
+ }
909
+ function createProvisioningMethods(deps) {
910
+ const { fetchWithAuth, createError, authMode } = deps;
911
+ function serviceKeyModeError() {
912
+ if (authMode === "service-key") return null;
913
+ return createError(
914
+ "VALIDATION_ERROR",
915
+ "provisionUser / provisionOrganization \u306F service-key \u8A8D\u8A3C\uFF08X-Service-Api-Key\uFF09\u3067\u306E\u307F\u5229\u7528\u3067\u304D\u307E\u3059\u3002Bearer / cookie \u30E2\u30FC\u30C9\u3067\u306F\u547C\u3073\u51FA\u305B\u307E\u305B\u3093"
916
+ );
917
+ }
918
+ async function provisionUser(params) {
919
+ const modeError = serviceKeyModeError();
920
+ if (modeError) return { error: modeError };
921
+ if (!params.email || !params.email.trim()) {
922
+ return { error: createError("VALIDATION_ERROR", "email \u306F\u5FC5\u9808\u3067\u3059") };
923
+ }
924
+ const body = { email: params.email.trim() };
925
+ if (params.profile !== void 0) body.profile = params.profile;
926
+ if (params.dryRun !== void 0) body.dryRun = params.dryRun;
927
+ return fetchWithAuth(USER_PROVISION_ENDPOINT, {
928
+ method: "POST",
929
+ body: JSON.stringify(body)
930
+ });
931
+ }
932
+ async function provisionOrganization(params) {
933
+ const modeError = serviceKeyModeError();
934
+ if (modeError) return { error: modeError };
935
+ if (!params.name || !params.name.trim()) {
936
+ return { error: createError("VALIDATION_ERROR", "name \u306F\u5FC5\u9808\u3067\u3059") };
937
+ }
938
+ if (!params.ownerEmail || !params.ownerEmail.trim()) {
939
+ return { error: createError("VALIDATION_ERROR", "ownerEmail \u306F\u5FC5\u9808\u3067\u3059") };
940
+ }
941
+ if (params.members) {
942
+ if (params.members.length > MAX_PROVISION_MEMBERS) {
943
+ return {
944
+ error: createError(
945
+ "VALIDATION_ERROR",
946
+ `members \u306F1\u30EA\u30AF\u30A8\u30B9\u30C8\u3042\u305F\u308A\u6700\u5927 ${MAX_PROVISION_MEMBERS} \u4EF6\u307E\u3067\u3067\u3059`
947
+ )
948
+ };
949
+ }
950
+ for (const member of params.members) {
951
+ if (!member.email || !member.email.trim()) {
952
+ return { error: createError("VALIDATION_ERROR", "members[].email \u306F\u5FC5\u9808\u3067\u3059") };
953
+ }
954
+ if (!isAssignableMemberRole(member.role)) {
955
+ return {
956
+ error: createError(
957
+ "VALIDATION_ERROR",
958
+ "members[].role \u306F admin\u3001member\u3001viewer \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
959
+ )
960
+ };
961
+ }
962
+ }
963
+ }
964
+ const body = {
965
+ name: params.name.trim(),
966
+ ownerEmail: params.ownerEmail.trim()
967
+ };
968
+ if (params.billingEmail !== void 0) body.billingEmail = params.billingEmail.trim();
969
+ if (params.members !== void 0) {
970
+ body.members = params.members.map((member) => ({
971
+ email: member.email.trim(),
972
+ role: member.role
973
+ }));
974
+ }
975
+ if (params.dryRun !== void 0) body.dryRun = params.dryRun;
976
+ return fetchWithAuth(ORGANIZATION_PROVISION_ENDPOINT, {
977
+ method: "POST",
978
+ body: JSON.stringify(body)
979
+ });
980
+ }
981
+ return { provisionUser, provisionOrganization };
982
+ }
983
+
876
984
  // src/client/seat-methods.ts
877
985
  function seatsEndpoint(subscriptionId) {
878
986
  return `/api/v1/subscriptions/ext/${encodeURIComponent(subscriptionId)}/seats/assignments`;
@@ -1117,7 +1225,7 @@ function createNonContractMethods(deps) {
1117
1225
  }
1118
1226
 
1119
1227
  // src/client/version-check.ts
1120
- var SDK_VERSION = "5.18.0";
1228
+ var SDK_VERSION = "5.21.0";
1121
1229
  var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1122
1230
  var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1123
1231
  function sdkHeaders() {
@@ -1359,33 +1467,48 @@ function createOAuthTokenMethods(deps) {
1359
1467
  async function signOutToken() {
1360
1468
  const tokens = tokenStore.getTokens();
1361
1469
  tokenStore.clearTokens();
1470
+ const allRevoked = {
1471
+ revoked: true,
1472
+ accessTokenRevoked: true,
1473
+ refreshTokenRevoked: true
1474
+ };
1362
1475
  if (!tokens) {
1363
1476
  logger.debug("No tokens to revoke");
1364
- return { data: void 0 };
1477
+ return { data: allRevoked };
1365
1478
  }
1366
- const url = `${baseUrl}${OAUTH_REVOKE_ENDPOINT}`;
1367
- logger.debug("Revoking token:", url);
1368
- try {
1369
- const response = await fetch(url, {
1370
- method: "POST",
1371
- credentials: "omit",
1372
- headers: { "Content-Type": "application/x-www-form-urlencoded", ...sdkHeaders() },
1373
- body: new URLSearchParams({
1374
- token: tokens.accessToken,
1375
- client_id: clientId
1376
- }).toString()
1377
- });
1378
- if (!response.ok) {
1379
- logger.warn(
1380
- "\u30C8\u30FC\u30AF\u30F3\u7121\u52B9\u5316\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30B5\u30FC\u30D0\u30FC\u3067\u5931\u6557\u3057\u307E\u3057\u305F:",
1381
- `status=${response.status}`
1382
- );
1479
+ async function revokeOAuthToken(token, tokenTypeHint) {
1480
+ const url = `${baseUrl}${OAUTH_REVOKE_ENDPOINT}`;
1481
+ try {
1482
+ const response = await fetch(url, {
1483
+ method: "POST",
1484
+ credentials: "omit",
1485
+ headers: { "Content-Type": "application/x-www-form-urlencoded", ...sdkHeaders() },
1486
+ body: new URLSearchParams({
1487
+ token,
1488
+ client_id: clientId,
1489
+ token_type_hint: tokenTypeHint
1490
+ }).toString()
1491
+ });
1492
+ return response.ok;
1493
+ } catch {
1494
+ return false;
1383
1495
  }
1384
- } catch (error) {
1385
- logger.warn("\u30C8\u30FC\u30AF\u30F3\u7121\u52B9\u5316\u306E\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30EA\u30AF\u30A8\u30B9\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F:", error);
1496
+ }
1497
+ logger.debug("Revoking tokens:", `${baseUrl}${OAUTH_REVOKE_ENDPOINT}`);
1498
+ const accessTokenRevoked = await revokeOAuthToken(tokens.accessToken, "access_token");
1499
+ if (!accessTokenRevoked) {
1500
+ logger.warn("\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306E\u7121\u52B9\u5316\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30B5\u30FC\u30D0\u30FC\u3067\u5931\u6557\u3057\u307E\u3057\u305F");
1501
+ }
1502
+ const refreshTokenRevoked = tokens.refreshToken ? await revokeOAuthToken(tokens.refreshToken, "refresh_token") : true;
1503
+ if (tokens.refreshToken && !refreshTokenRevoked) {
1504
+ logger.warn("\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306E\u7121\u52B9\u5316\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30B5\u30FC\u30D0\u30FC\u3067\u5931\u6557\u3057\u307E\u3057\u305F");
1505
+ }
1506
+ const revoked = accessTokenRevoked && refreshTokenRevoked;
1507
+ if (!revoked) {
1508
+ logger.warn("\u30C8\u30FC\u30AF\u30F3\u7121\u52B9\u5316\u304C\u4E00\u90E8\u307E\u305F\u306F\u5168\u90E8\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30ED\u30FC\u30AB\u30EB\u30C8\u30FC\u30AF\u30F3\u306F\u30AF\u30EA\u30A2\u6E08\u307F\uFF09");
1386
1509
  }
1387
1510
  logger.debug("Token sign-out completed");
1388
- return { data: void 0 };
1511
+ return { data: { revoked, accessTokenRevoked, refreshTokenRevoked } };
1389
1512
  }
1390
1513
  return { exchangeCodeForTokens, refreshAccessToken, signOutToken };
1391
1514
  }
@@ -1549,7 +1672,7 @@ function createSessionMethods(deps) {
1549
1672
  }
1550
1673
  if (response.status === NO_CONTENT_STATUS) {
1551
1674
  logger.debug("Response: 204 No Content");
1552
- return { data: void 0 };
1675
+ return { data: { revoked: true } };
1553
1676
  }
1554
1677
  if (!response.ok) {
1555
1678
  try {
@@ -1576,7 +1699,7 @@ function createSessionMethods(deps) {
1576
1699
  }
1577
1700
  }
1578
1701
  logger.debug("Response:", response.status);
1579
- return { data: void 0 };
1702
+ return { data: { revoked: true } };
1580
1703
  }
1581
1704
  return { getSession, signOutCookie };
1582
1705
  }
@@ -1794,6 +1917,9 @@ var REDIRECT_LOOP_WINDOW_MS = 6e4;
1794
1917
  var REDIRECT_LOOP_THRESHOLD = 3;
1795
1918
  var storageReadFailureLogged = false;
1796
1919
  var storageWriteFailureLogged = false;
1920
+ function isLoopDetectionDegraded() {
1921
+ return storageReadFailureLogged || storageWriteFailureLogged;
1922
+ }
1797
1923
  function logStorageReadFailure(logger, err) {
1798
1924
  if (storageReadFailureLogged) return;
1799
1925
  storageReadFailureLogged = true;
@@ -1938,9 +2064,16 @@ function createRedirectMethods(deps) {
1938
2064
  }
1939
2065
  const state = generateRandomState();
1940
2066
  if (!storeState(state, logger)) {
2067
+ cleanupVerifierStorage(logger);
2068
+ cleanupStateStorage(logger);
1941
2069
  logger.error(
1942
- "redirectToAuthorize: OAuth state \u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08storage \u5229\u7528\u4E0D\u53EF\uFF09\u3002\u30B3\u30FC\u30EB\u30D0\u30C3\u30AF\u3067\u306E CSRF \u691C\u8A3C\u304C\u5931\u6557\u3057\u307E\u3059"
2070
+ "redirectToAuthorize: OAuth state \u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08storage \u5229\u7528\u4E0D\u53EF\uFF09\u3002\u8A8D\u53EF\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3092\u4E2D\u6B62\u3057\u307E\u3057\u305F"
1943
2071
  );
2072
+ return {
2073
+ success: false,
2074
+ code: "state_persistence_failed",
2075
+ error: "OAuth state \u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08storage \u5229\u7528\u4E0D\u53EF\uFF09\u3002\u8A8D\u53EF\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3092\u4E2D\u6B62\u3057\u307E\u3057\u305F"
2076
+ };
1944
2077
  }
1945
2078
  const redirectUri = resolvedRedirectUri ?? window.location.origin + window.location.pathname;
1946
2079
  const params = new URLSearchParams({
@@ -1975,7 +2108,7 @@ function createRedirectMethods(deps) {
1975
2108
  rollbackLastRedirectAttempt(authorizeKey, logger);
1976
2109
  throw err;
1977
2110
  }
1978
- return { success: true };
2111
+ return isLoopDetectionDegraded() ? { success: true, loopDetectionDisabled: true } : { success: true };
1979
2112
  }
1980
2113
  async function redirectToLogin(options) {
1981
2114
  if (typeof window === "undefined") {
@@ -3128,6 +3261,11 @@ function createFFIDClient(config) {
3128
3261
  createError,
3129
3262
  serviceCode: config.serviceCode
3130
3263
  });
3264
+ const { provisionUser, provisionOrganization } = createProvisioningMethods({
3265
+ fetchWithAuth,
3266
+ createError,
3267
+ authMode
3268
+ });
3131
3269
  const { getProfile, updateProfile } = createProfileMethods({
3132
3270
  fetchWithAuth,
3133
3271
  createError
@@ -3223,6 +3361,8 @@ function createFFIDClient(config) {
3223
3361
  addMember,
3224
3362
  updateMemberRole,
3225
3363
  removeMember,
3364
+ provisionUser,
3365
+ provisionOrganization,
3226
3366
  getProfile,
3227
3367
  updateProfile,
3228
3368
  // Non-contract ext API coverage (#3783)
@@ -4235,7 +4375,8 @@ var quietLogger = {
4235
4375
  },
4236
4376
  warn: () => {
4237
4377
  },
4238
- error: (...args) => console.error(SDK_LOG_PREFIX2, ...args)
4378
+ error: () => {
4379
+ }
4239
4380
  };
4240
4381
  var consoleLogger2 = {
4241
4382
  debug: (...args) => console.debug(SDK_LOG_PREFIX2, ...args),
@@ -1,34 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var chunk55S5VUWR_cjs = require('../chunk-55S5VUWR.cjs');
3
+ var chunkRDQ4R3XC_cjs = require('../chunk-RDQ4R3XC.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "FFIDAnnouncementBadge", {
8
8
  enumerable: true,
9
- get: function () { return chunk55S5VUWR_cjs.FFIDAnnouncementBadge; }
9
+ get: function () { return chunkRDQ4R3XC_cjs.FFIDAnnouncementBadge; }
10
10
  });
11
11
  Object.defineProperty(exports, "FFIDAnnouncementList", {
12
12
  enumerable: true,
13
- get: function () { return chunk55S5VUWR_cjs.FFIDAnnouncementList; }
13
+ get: function () { return chunkRDQ4R3XC_cjs.FFIDAnnouncementList; }
14
14
  });
15
15
  Object.defineProperty(exports, "FFIDInquiryForm", {
16
16
  enumerable: true,
17
- get: function () { return chunk55S5VUWR_cjs.FFIDInquiryForm; }
17
+ get: function () { return chunkRDQ4R3XC_cjs.FFIDInquiryForm; }
18
18
  });
19
19
  Object.defineProperty(exports, "FFIDLoginButton", {
20
20
  enumerable: true,
21
- get: function () { return chunk55S5VUWR_cjs.FFIDLoginButton; }
21
+ get: function () { return chunkRDQ4R3XC_cjs.FFIDLoginButton; }
22
22
  });
23
23
  Object.defineProperty(exports, "FFIDOrganizationSwitcher", {
24
24
  enumerable: true,
25
- get: function () { return chunk55S5VUWR_cjs.FFIDOrganizationSwitcher; }
25
+ get: function () { return chunkRDQ4R3XC_cjs.FFIDOrganizationSwitcher; }
26
26
  });
27
27
  Object.defineProperty(exports, "FFIDSubscriptionBadge", {
28
28
  enumerable: true,
29
- get: function () { return chunk55S5VUWR_cjs.FFIDSubscriptionBadge; }
29
+ get: function () { return chunkRDQ4R3XC_cjs.FFIDSubscriptionBadge; }
30
30
  });
31
31
  Object.defineProperty(exports, "FFIDUserMenu", {
32
32
  enumerable: true,
33
- get: function () { return chunk55S5VUWR_cjs.FFIDUserMenu; }
33
+ get: function () { return chunkRDQ4R3XC_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-Bkul-fRw.cjs';
1
+ export { H as FFIDAnnouncementBadge, ai as FFIDAnnouncementBadgeClassNames, aj as FFIDAnnouncementBadgeProps, I as FFIDAnnouncementList, ak as FFIDAnnouncementListClassNames, al as FFIDAnnouncementListProps, S as FFIDInquiryForm, T as FFIDInquiryFormCategoryItem, U as FFIDInquiryFormClassNames, V as FFIDInquiryFormLegalLayout, W as FFIDInquiryFormOrganization, X as FFIDInquiryFormPlaceholderContext, Y as FFIDInquiryFormPrefill, Z as FFIDInquiryFormProps, _ as FFIDInquiryFormSubmitData, $ as FFIDInquiryFormSubmitResult, a1 as FFIDLoginButton, am as FFIDLoginButtonProps, a4 as FFIDOrganizationSwitcher, an as FFIDOrganizationSwitcherClassNames, ao as FFIDOrganizationSwitcherProps, a9 as FFIDSubscriptionBadge, ap as FFIDSubscriptionBadgeClassNames, aq as FFIDSubscriptionBadgeProps, ab as FFIDUserMenu, ar as FFIDUserMenuClassNames, as as FFIDUserMenuProps } from '../index--wRiPlpi.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-Bkul-fRw.js';
1
+ export { H as FFIDAnnouncementBadge, ai as FFIDAnnouncementBadgeClassNames, aj as FFIDAnnouncementBadgeProps, I as FFIDAnnouncementList, ak as FFIDAnnouncementListClassNames, al as FFIDAnnouncementListProps, S as FFIDInquiryForm, T as FFIDInquiryFormCategoryItem, U as FFIDInquiryFormClassNames, V as FFIDInquiryFormLegalLayout, W as FFIDInquiryFormOrganization, X as FFIDInquiryFormPlaceholderContext, Y as FFIDInquiryFormPrefill, Z as FFIDInquiryFormProps, _ as FFIDInquiryFormSubmitData, $ as FFIDInquiryFormSubmitResult, a1 as FFIDLoginButton, am as FFIDLoginButtonProps, a4 as FFIDOrganizationSwitcher, an as FFIDOrganizationSwitcherClassNames, ao as FFIDOrganizationSwitcherProps, a9 as FFIDSubscriptionBadge, ap as FFIDSubscriptionBadgeClassNames, aq as FFIDSubscriptionBadgeProps, ab as FFIDUserMenu, ar as FFIDUserMenuClassNames, as as FFIDUserMenuProps } from '../index--wRiPlpi.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
@@ -1 +1 @@
1
- export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-L2H56C4W.js';
1
+ export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-U57ZDFEN.js';