@feelflow/ffid-sdk 5.25.0 → 5.27.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.
@@ -119,6 +119,16 @@ function normalizeEntitlements(raw) {
119
119
  return trimmed.length > 0 ? [trimmed] : [];
120
120
  });
121
121
  }
122
+ function normalizeSeatAssignmentClaim(raw, organizationId, subscriptionId) {
123
+ if (!raw || typeof raw !== "object") return null;
124
+ const { organization_id, subscription_id, status } = raw;
125
+ if (typeof organization_id !== "string" || typeof subscription_id !== "string" || typeof status !== "string" || !["active", "revoking", "revoked"].includes(status) || organization_id !== organizationId || subscription_id !== subscriptionId) return null;
126
+ return {
127
+ organizationId: organization_id,
128
+ subscriptionId: subscription_id,
129
+ status
130
+ };
131
+ }
122
132
  function normalizeUserinfo(raw) {
123
133
  const hasOrganizationId = hasOwnKey(raw, "organization_id");
124
134
  const hasOrganizationName = hasOwnKey(raw, "organization_name");
@@ -152,6 +162,11 @@ function normalizeUserinfo(raw) {
152
162
  organizationId: raw.subscription.organization_id ?? null,
153
163
  organizationName: hasOwnKey(raw.subscription, "organization_name") ? raw.subscription.organization_name ?? null : null,
154
164
  hasSeatAssignment: raw.subscription.has_seat_assignment ?? false,
165
+ seatAssignment: hasOwnKey(raw.subscription, "seat_assignment") ? normalizeSeatAssignmentClaim(
166
+ raw.subscription.seat_assignment,
167
+ raw.subscription.organization_id ?? null,
168
+ raw.subscription.subscription_id ?? null
169
+ ) : void 0,
155
170
  // #3464: legacy FFID (< this issue) omits the field on the wire.
156
171
  // The "unknown" axis is unused — no consumer differentiates "server
157
172
  // didn't tell us" from "definitely not scheduled" because the
@@ -450,6 +465,7 @@ function createVerifyAccessToken(deps) {
450
465
  organization_id: introspectResponse.subscription.organization_id,
451
466
  organization_name: introspectResponse.subscription.organization_name ?? null,
452
467
  has_seat_assignment: introspectResponse.subscription.has_seat_assignment ?? false,
468
+ ...Object.prototype.hasOwnProperty.call(introspectResponse.subscription, "seat_assignment") ? { seat_assignment: introspectResponse.subscription.seat_assignment } : {},
453
469
  // #4333: forward pack entitlement codes through the introspect →
454
470
  // userinfo normalization boundary. normalizeUserinfo guards the
455
471
  // value, so an older FFID that omits it degrades to `[]`.
@@ -824,6 +840,213 @@ function createSubscriptionMethods(deps) {
824
840
  };
825
841
  }
826
842
 
843
+ // src/types/published-catalog.ts
844
+ var FFID_CATALOG_ENVIRONMENTS = ["staging", "production"];
845
+ var FFID_CATALOG_PUBLICATION_STATUSES = [
846
+ "approved",
847
+ "superseded",
848
+ "revoking",
849
+ "revoked"
850
+ ];
851
+
852
+ // src/shared/catalog-hash.ts
853
+ var CATALOG_HASH_PATTERN = /^[0-9a-f]{64}$/;
854
+
855
+ // src/client/catalog-methods.ts
856
+ var EXT_CATALOG_ENDPOINT = "/api/v1/subscriptions/ext/catalog";
857
+ var MALFORMED_CATALOG_CODE = "MALFORMED_PUBLISHED_CATALOG";
858
+ var PUBLICATION_STATUSES = new Set(
859
+ FFID_CATALOG_PUBLICATION_STATUSES
860
+ );
861
+ var CATALOG_ENVIRONMENTS = new Set(FFID_CATALOG_ENVIRONMENTS);
862
+ var BILLING_INTERVALS = /* @__PURE__ */ new Set(["monthly", "yearly"]);
863
+ var TAX_BEHAVIORS = /* @__PURE__ */ new Set(["inclusive", "exclusive"]);
864
+ var PUBLICATION_HASH_FIELDS = [
865
+ "praxisCopyHash",
866
+ "ffidCheckoutCopyHash",
867
+ "legalDisclosureHash",
868
+ "taxConfigurationHash",
869
+ "paymentConfigurationHash",
870
+ "scopeHash"
871
+ ];
872
+ var PUBLICATION_REQUIRED_TIMESTAMP_FIELDS = ["reviewedAt", "effectiveAt"];
873
+ var PUBLICATION_NULLABLE_TIMESTAMP_FIELDS = [
874
+ "supersededAt",
875
+ "sellThroughUntil",
876
+ "revocationEffectiveAt"
877
+ ];
878
+ function malformed(detail) {
879
+ return new FFIDSDKError(
880
+ MALFORMED_CATALOG_CODE,
881
+ `SDK: server returned malformed PublishedCatalog \u2014 ${detail}`
882
+ );
883
+ }
884
+ function isNullableIsoString(value) {
885
+ return value === null || typeof value === "string" && value.trim() !== "";
886
+ }
887
+ function isNonNegativeIntOrNull(value) {
888
+ return value === null || typeof value === "number" && Number.isInteger(value) && value >= 0;
889
+ }
890
+ function validatePublishedPlan(plan, index) {
891
+ if (plan === null || typeof plan !== "object") {
892
+ throw malformed(`plans[${index}] must be an object`);
893
+ }
894
+ const record = plan;
895
+ for (const key of Object.keys(record)) {
896
+ if (/stripe/i.test(key)) {
897
+ throw malformed(
898
+ `plans[${index}] contains a Stripe identifier field (${JSON.stringify(key)}) \u2014 published catalogs must never expose Stripe IDs`
899
+ );
900
+ }
901
+ }
902
+ if (isBlankString(record.code)) {
903
+ throw malformed(`plans[${index}].code must be a non-empty string`);
904
+ }
905
+ if (isBlankString(record.name)) {
906
+ throw malformed(`plans[${index}].name must be a non-empty string`);
907
+ }
908
+ if (record.description !== null && typeof record.description !== "string") {
909
+ throw malformed(`plans[${index}].description must be string or null`);
910
+ }
911
+ if (isBlankString(record.currency)) {
912
+ throw malformed(`plans[${index}].currency must be a non-empty string`);
913
+ }
914
+ if (!isNonNegativeIntOrNull(record.priceMonthly)) {
915
+ throw malformed(`plans[${index}].priceMonthly must be a non-negative integer or null`);
916
+ }
917
+ if (!isNonNegativeIntOrNull(record.priceYearly)) {
918
+ throw malformed(`plans[${index}].priceYearly must be a non-negative integer or null`);
919
+ }
920
+ if (typeof record.taxBehavior !== "string" || !TAX_BEHAVIORS.has(record.taxBehavior)) {
921
+ throw malformed(
922
+ `plans[${index}].taxBehavior must be inclusive | exclusive (got ${JSON.stringify(record.taxBehavior)})`
923
+ );
924
+ }
925
+ const intervals = record.billingIntervals;
926
+ if (!Array.isArray(intervals) || intervals.length === 0 || intervals.some((interval) => typeof interval !== "string" || !BILLING_INTERVALS.has(interval))) {
927
+ throw malformed(
928
+ `plans[${index}].billingIntervals must be a non-empty array of monthly | yearly`
929
+ );
930
+ }
931
+ if (intervals.includes("monthly") && record.priceMonthly === null) {
932
+ throw malformed(`plans[${index}] offers monthly billing but priceMonthly is null`);
933
+ }
934
+ if (intervals.includes("yearly") && record.priceYearly === null) {
935
+ throw malformed(`plans[${index}] offers yearly billing but priceYearly is null`);
936
+ }
937
+ if (typeof record.minSeats !== "number" || !Number.isInteger(record.minSeats) || record.minSeats < 1) {
938
+ throw malformed(`plans[${index}].minSeats must be a positive integer`);
939
+ }
940
+ if (record.maxSeats !== null && (typeof record.maxSeats !== "number" || !Number.isInteger(record.maxSeats) || record.maxSeats < 1)) {
941
+ throw malformed(`plans[${index}].maxSeats must be a positive integer or null`);
942
+ }
943
+ if (record.maxSeats !== null && record.maxSeats < record.minSeats) {
944
+ throw malformed(`plans[${index}].maxSeats must be >= minSeats`);
945
+ }
946
+ if (typeof record.displayOrder !== "number" || !Number.isInteger(record.displayOrder)) {
947
+ throw malformed(`plans[${index}].displayOrder must be an integer`);
948
+ }
949
+ }
950
+ function validatePublishedCatalog(catalog) {
951
+ if (catalog === null || typeof catalog !== "object") {
952
+ throw malformed(
953
+ `expected object, got ${catalog === null ? "null" : typeof catalog}`
954
+ );
955
+ }
956
+ const c = catalog;
957
+ const service = c.service;
958
+ if (service === null || typeof service !== "object") {
959
+ throw malformed("service must be an object");
960
+ }
961
+ const s = service;
962
+ if (isBlankString(s.code)) {
963
+ throw malformed("service.code must be a non-empty string");
964
+ }
965
+ if (isBlankString(s.name)) {
966
+ throw malformed("service.name must be a non-empty string");
967
+ }
968
+ if (isBlankString(c.catalogVersion)) {
969
+ throw malformed("catalogVersion must be a non-empty string");
970
+ }
971
+ const publication = c.publication;
972
+ if (publication === null || typeof publication !== "object") {
973
+ throw malformed("publication must be an object");
974
+ }
975
+ const p = publication;
976
+ if (isBlankString(p.serviceCode)) {
977
+ throw malformed("publication.serviceCode must be a non-empty string");
978
+ }
979
+ if (typeof p.environment !== "string" || !CATALOG_ENVIRONMENTS.has(p.environment)) {
980
+ throw malformed(
981
+ `publication.environment must be staging | production (got ${JSON.stringify(p.environment)})`
982
+ );
983
+ }
984
+ if (p.catalogVersion !== c.catalogVersion) {
985
+ throw malformed(
986
+ `publication.catalogVersion (${JSON.stringify(p.catalogVersion)}) does not match top-level catalogVersion (${JSON.stringify(c.catalogVersion)})`
987
+ );
988
+ }
989
+ if (typeof p.status !== "string" || !PUBLICATION_STATUSES.has(p.status)) {
990
+ throw malformed(
991
+ `publication.status must be one of approved | superseded | revoking | revoked (got ${JSON.stringify(p.status)})`
992
+ );
993
+ }
994
+ for (const field of PUBLICATION_HASH_FIELDS) {
995
+ const value = p[field];
996
+ if (typeof value !== "string" || !CATALOG_HASH_PATTERN.test(value)) {
997
+ throw malformed(`publication.${field} must be lowercase SHA-256 hex (64 chars)`);
998
+ }
999
+ }
1000
+ if (typeof p.salesEpoch !== "number" || !Number.isInteger(p.salesEpoch) || p.salesEpoch < 1) {
1001
+ throw malformed(
1002
+ `publication.salesEpoch must be a positive integer (got ${JSON.stringify(p.salesEpoch)})`
1003
+ );
1004
+ }
1005
+ if (isBlankString(p.approvalId)) {
1006
+ throw malformed("publication.approvalId must be a non-empty string");
1007
+ }
1008
+ for (const field of PUBLICATION_REQUIRED_TIMESTAMP_FIELDS) {
1009
+ if (isBlankString(p[field])) {
1010
+ throw malformed(`publication.${field} must be a non-empty ISO 8601 string`);
1011
+ }
1012
+ }
1013
+ for (const field of PUBLICATION_NULLABLE_TIMESTAMP_FIELDS) {
1014
+ if (!isNullableIsoString(p[field])) {
1015
+ throw malformed(`publication.${field} must be a non-empty ISO 8601 string or null`);
1016
+ }
1017
+ }
1018
+ if (!Array.isArray(c.plans)) {
1019
+ throw malformed(`plans must be an array (got ${typeof c.plans})`);
1020
+ }
1021
+ for (const [index, plan] of c.plans.entries()) {
1022
+ validatePublishedPlan(plan, index);
1023
+ }
1024
+ }
1025
+ function createCatalogMethods(deps) {
1026
+ const { fetchWithAuth, createError } = deps;
1027
+ async function getPublishedCatalog(serviceCode) {
1028
+ if (isBlankString(serviceCode)) {
1029
+ return {
1030
+ error: createError("VALIDATION_ERROR", "serviceCode \u306F\u5FC5\u9808\u3067\u3059")
1031
+ };
1032
+ }
1033
+ const requestedCode = serviceCode.trim();
1034
+ const response = await fetchWithAuth(
1035
+ `${EXT_CATALOG_ENDPOINT}/${encodeURIComponent(requestedCode)}`
1036
+ );
1037
+ if (response.data !== void 0) {
1038
+ validatePublishedCatalog(response.data);
1039
+ if (response.data.service.code !== requestedCode || response.data.publication.serviceCode !== requestedCode) {
1040
+ throw malformed(
1041
+ `response is for service ${JSON.stringify(response.data.service.code)} (publication: ${JSON.stringify(response.data.publication.serviceCode)}) but ${JSON.stringify(requestedCode)} was requested`
1042
+ );
1043
+ }
1044
+ }
1045
+ return response;
1046
+ }
1047
+ return { getPublishedCatalog };
1048
+ }
1049
+
827
1050
  // src/client/members-methods.ts
828
1051
  var EXT_MEMBERS_ENDPOINT = "/api/v1/organizations/ext/members";
829
1052
  function createMembersMethods(deps) {
@@ -1266,7 +1489,7 @@ function validateTokenResponse(tokenResponse) {
1266
1489
  }
1267
1490
 
1268
1491
  // src/client/version-check.ts
1269
- var SDK_VERSION = "5.25.0";
1492
+ var SDK_VERSION = "5.27.0";
1270
1493
  var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1271
1494
  var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1272
1495
  function sdkHeaders() {
@@ -2710,39 +2933,7 @@ var BLOCKING_EFFECTIVE_STATUSES = [
2710
2933
  "trial_expired"
2711
2934
  ];
2712
2935
 
2713
- // src/client/error-codes.ts
2714
- var FFID_ERROR_CODES = {
2715
- NETWORK_ERROR: "NETWORK_ERROR",
2716
- PARSE_ERROR: "PARSE_ERROR",
2717
- UNKNOWN_ERROR: "UNKNOWN_ERROR",
2718
- TOKEN_EXCHANGE_ERROR: "TOKEN_EXCHANGE_ERROR",
2719
- TOKEN_REFRESH_ERROR: "TOKEN_REFRESH_ERROR",
2720
- NO_TOKENS: "NO_TOKENS",
2721
- TOKEN_VERIFICATION_ERROR: "TOKEN_VERIFICATION_ERROR",
2722
- TOKEN_EXPIRED: "TOKEN_EXPIRED",
2723
- STATE_MISMATCH_ERROR: "STATE_MISMATCH_ERROR"
2724
- };
2725
-
2726
- // src/client/ffid-client.ts
2727
- var UNAUTHORIZED_STATUS2 = 401;
2728
- var SDK_LOG_PREFIX = "[FFID SDK]";
2729
- var noopLogger = {
2730
- debug: () => {
2731
- },
2732
- info: () => {
2733
- },
2734
- warn: () => {
2735
- },
2736
- error: () => {
2737
- }
2738
- };
2739
- var consoleLogger = {
2740
- debug: (...args) => console.debug(SDK_LOG_PREFIX, ...args),
2741
- info: (...args) => console.info(SDK_LOG_PREFIX, ...args),
2742
- warn: (...args) => console.warn(SDK_LOG_PREFIX, ...args),
2743
- error: (...args) => console.error(SDK_LOG_PREFIX, ...args)
2744
- };
2745
- var EXT_CHECK_ENDPOINT = "/api/v1/subscriptions/ext/check";
2936
+ // src/client/service-access-decision.ts
2746
2937
  var DEFAULT_ALLOW_GRACE = true;
2747
2938
  var DEFAULT_SERVICE_ACCESS_FAIL_POLICY = "failClosed";
2748
2939
  var SERVICE_ACCESS_DENIED_CODE = "SERVICE_ACCESS_DENIED";
@@ -2809,6 +3000,40 @@ function failClosedServiceAccessDecision(params, error) {
2809
3000
  error
2810
3001
  };
2811
3002
  }
3003
+
3004
+ // src/client/error-codes.ts
3005
+ var FFID_ERROR_CODES = {
3006
+ NETWORK_ERROR: "NETWORK_ERROR",
3007
+ PARSE_ERROR: "PARSE_ERROR",
3008
+ UNKNOWN_ERROR: "UNKNOWN_ERROR",
3009
+ TOKEN_EXCHANGE_ERROR: "TOKEN_EXCHANGE_ERROR",
3010
+ TOKEN_REFRESH_ERROR: "TOKEN_REFRESH_ERROR",
3011
+ NO_TOKENS: "NO_TOKENS",
3012
+ TOKEN_VERIFICATION_ERROR: "TOKEN_VERIFICATION_ERROR",
3013
+ TOKEN_EXPIRED: "TOKEN_EXPIRED",
3014
+ STATE_MISMATCH_ERROR: "STATE_MISMATCH_ERROR"
3015
+ };
3016
+
3017
+ // src/client/ffid-client.ts
3018
+ var UNAUTHORIZED_STATUS2 = 401;
3019
+ var SDK_LOG_PREFIX = "[FFID SDK]";
3020
+ var noopLogger = {
3021
+ debug: () => {
3022
+ },
3023
+ info: () => {
3024
+ },
3025
+ warn: () => {
3026
+ },
3027
+ error: () => {
3028
+ }
3029
+ };
3030
+ var consoleLogger = {
3031
+ debug: (...args) => console.debug(SDK_LOG_PREFIX, ...args),
3032
+ info: (...args) => console.info(SDK_LOG_PREFIX, ...args),
3033
+ warn: (...args) => console.warn(SDK_LOG_PREFIX, ...args),
3034
+ error: (...args) => console.error(SDK_LOG_PREFIX, ...args)
3035
+ };
3036
+ var EXT_CHECK_ENDPOINT = "/api/v1/subscriptions/ext/check";
2812
3037
  function resolveRedirectUri(raw, logger) {
2813
3038
  if (raw === null) return null;
2814
3039
  try {
@@ -3126,6 +3351,10 @@ function createFFIDClient(config) {
3126
3351
  fetchWithAuth,
3127
3352
  createError
3128
3353
  });
3354
+ const { getPublishedCatalog } = createCatalogMethods({
3355
+ fetchWithAuth,
3356
+ createError
3357
+ });
3129
3358
  const { listMembers, addMember, updateMemberRole, removeMember } = createMembersMethods({
3130
3359
  fetchWithAuth,
3131
3360
  createError,
@@ -3252,6 +3481,7 @@ function createFFIDClient(config) {
3252
3481
  assignSeats,
3253
3482
  unassignSeat,
3254
3483
  listPlans,
3484
+ getPublishedCatalog,
3255
3485
  getSubscription,
3256
3486
  subscribe,
3257
3487
  changePlan,
@@ -1,5 +1,5 @@
1
- import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-BZERrMAF.cjs';
2
- export { f as FFIDAddMemberParams, g as FFIDAddMemberRequest, h as FFIDAddMemberResponse, i as FFIDAssignableMemberRole, j as FFIDCacheConfig, k as FFIDClient, l as FFIDConfig, m as FFIDListMembersResponse, n as FFIDMemberRole, o as FFIDOrganization, p as FFIDOrganizationMember, q as FFIDOtpSendResponse, r as FFIDOtpVerifyResponse, s as FFIDPasswordResetConfirmResponse, t as FFIDPasswordResetResponse, u as FFIDPasswordResetVerifyResponse, v as FFIDProfileCallOptions, w as FFIDProvisionMemberPlan, x as FFIDProvisionMemberPlanStatus, y as FFIDProvisionMemberResult, z as FFIDProvisionMemberStatus, A as FFIDProvisionOrganizationDryRun, B as FFIDProvisionOrganizationMemberInput, C as FFIDProvisionOrganizationOutcome, D as FFIDProvisionOrganizationParams, E as FFIDProvisionOrganizationResponse, G as FFIDProvisionUserDryRun, H as FFIDProvisionUserOutcome, I as FFIDProvisionUserParams, J as FFIDProvisionUserProfileInput, K as FFIDProvisionUserResponse, L as FFIDProvisionedOrganization, M as FFIDProvisionedUser, N as FFIDRemoveMemberResponse, O as FFIDResetSessionResponse, P as FFIDSubscription, Q as FFIDUpdateMemberRoleResponse, R as FFIDUpdateUserProfileRequest, S as FFIDUser, T as FFIDUserProfile, U as TokenData, V as TokenStore, W as createFFIDClient, X as createTokenStore } from '../ffid-client-BZERrMAF.cjs';
1
+ import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-BlVuH6ja.cjs';
2
+ export { f as FFIDAddMemberParams, g as FFIDAddMemberRequest, h as FFIDAddMemberResponse, i as FFIDAssignableMemberRole, j as FFIDCacheConfig, k as FFIDClient, l as FFIDConfig, m as FFIDListMembersResponse, n as FFIDMemberRole, o as FFIDOrganization, p as FFIDOrganizationMember, q as FFIDOtpSendResponse, r as FFIDOtpVerifyResponse, s as FFIDPasswordResetConfirmResponse, t as FFIDPasswordResetResponse, u as FFIDPasswordResetVerifyResponse, v as FFIDProfileCallOptions, w as FFIDProvisionMemberPlan, x as FFIDProvisionMemberPlanStatus, y as FFIDProvisionMemberResult, z as FFIDProvisionMemberStatus, A as FFIDProvisionOrganizationDryRun, B as FFIDProvisionOrganizationMemberInput, C as FFIDProvisionOrganizationOutcome, D as FFIDProvisionOrganizationParams, E as FFIDProvisionOrganizationResponse, G as FFIDProvisionUserDryRun, H as FFIDProvisionUserOutcome, I as FFIDProvisionUserParams, J as FFIDProvisionUserProfileInput, K as FFIDProvisionUserResponse, L as FFIDProvisionedOrganization, M as FFIDProvisionedUser, N as FFIDRemoveMemberResponse, O as FFIDResetSessionResponse, P as FFIDSubscription, Q as FFIDUpdateMemberRoleResponse, R as FFIDUpdateUserProfileRequest, S as FFIDUser, T as FFIDUserProfile, U as TokenData, V as TokenStore, W as createFFIDClient, X as createTokenStore } from '../ffid-client-BlVuH6ja.cjs';
3
3
  export { D as DEFAULT_API_BASE_URL, a as DEFAULT_OAUTH_SCOPES } from '../constants-D61jqRIO.cjs';
4
4
  import { z } from 'zod';
5
5
  import '../types-Cjb9J0rL.cjs';
@@ -1,5 +1,5 @@
1
- import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-CFZPX5ej.js';
2
- export { f as FFIDAddMemberParams, g as FFIDAddMemberRequest, h as FFIDAddMemberResponse, i as FFIDAssignableMemberRole, j as FFIDCacheConfig, k as FFIDClient, l as FFIDConfig, m as FFIDListMembersResponse, n as FFIDMemberRole, o as FFIDOrganization, p as FFIDOrganizationMember, q as FFIDOtpSendResponse, r as FFIDOtpVerifyResponse, s as FFIDPasswordResetConfirmResponse, t as FFIDPasswordResetResponse, u as FFIDPasswordResetVerifyResponse, v as FFIDProfileCallOptions, w as FFIDProvisionMemberPlan, x as FFIDProvisionMemberPlanStatus, y as FFIDProvisionMemberResult, z as FFIDProvisionMemberStatus, A as FFIDProvisionOrganizationDryRun, B as FFIDProvisionOrganizationMemberInput, C as FFIDProvisionOrganizationOutcome, D as FFIDProvisionOrganizationParams, E as FFIDProvisionOrganizationResponse, G as FFIDProvisionUserDryRun, H as FFIDProvisionUserOutcome, I as FFIDProvisionUserParams, J as FFIDProvisionUserProfileInput, K as FFIDProvisionUserResponse, L as FFIDProvisionedOrganization, M as FFIDProvisionedUser, N as FFIDRemoveMemberResponse, O as FFIDResetSessionResponse, P as FFIDSubscription, Q as FFIDUpdateMemberRoleResponse, R as FFIDUpdateUserProfileRequest, S as FFIDUser, T as FFIDUserProfile, U as TokenData, V as TokenStore, W as createFFIDClient, X as createTokenStore } from '../ffid-client-CFZPX5ej.js';
1
+ import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-BqnzUmG7.js';
2
+ export { f as FFIDAddMemberParams, g as FFIDAddMemberRequest, h as FFIDAddMemberResponse, i as FFIDAssignableMemberRole, j as FFIDCacheConfig, k as FFIDClient, l as FFIDConfig, m as FFIDListMembersResponse, n as FFIDMemberRole, o as FFIDOrganization, p as FFIDOrganizationMember, q as FFIDOtpSendResponse, r as FFIDOtpVerifyResponse, s as FFIDPasswordResetConfirmResponse, t as FFIDPasswordResetResponse, u as FFIDPasswordResetVerifyResponse, v as FFIDProfileCallOptions, w as FFIDProvisionMemberPlan, x as FFIDProvisionMemberPlanStatus, y as FFIDProvisionMemberResult, z as FFIDProvisionMemberStatus, A as FFIDProvisionOrganizationDryRun, B as FFIDProvisionOrganizationMemberInput, C as FFIDProvisionOrganizationOutcome, D as FFIDProvisionOrganizationParams, E as FFIDProvisionOrganizationResponse, G as FFIDProvisionUserDryRun, H as FFIDProvisionUserOutcome, I as FFIDProvisionUserParams, J as FFIDProvisionUserProfileInput, K as FFIDProvisionUserResponse, L as FFIDProvisionedOrganization, M as FFIDProvisionedUser, N as FFIDRemoveMemberResponse, O as FFIDResetSessionResponse, P as FFIDSubscription, Q as FFIDUpdateMemberRoleResponse, R as FFIDUpdateUserProfileRequest, S as FFIDUser, T as FFIDUserProfile, U as TokenData, V as TokenStore, W as createFFIDClient, X as createTokenStore } from '../ffid-client-BqnzUmG7.js';
3
3
  export { D as DEFAULT_API_BASE_URL, a as DEFAULT_OAUTH_SCOPES } from '../constants-D61jqRIO.js';
4
4
  import { z } from 'zod';
5
5
  import '../types-Cjb9J0rL.js';