@feelflow/ffid-sdk 2.20.0 → 3.0.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.
Files changed (39) hide show
  1. package/README.md +37 -0
  2. package/dist/agency/index.cjs +3 -3
  3. package/dist/agency/index.d.cts +1 -1
  4. package/dist/agency/index.d.ts +1 -1
  5. package/dist/agency/index.js +2 -2
  6. package/dist/announcements/index.cjs +2 -2
  7. package/dist/announcements/index.js +1 -1
  8. package/dist/chunk-JEVK2XUM.js +5 -0
  9. package/dist/{chunk-KNEZ5OUQ.cjs → chunk-JNR4AKL5.cjs} +133 -3
  10. package/dist/{chunk-YUIITYBE.cjs → chunk-MDHKSVLP.cjs} +2 -0
  11. package/dist/{chunk-GCUVFSB2.js → chunk-XWI4BFKW.js} +133 -4
  12. package/dist/components/index.cjs +8 -8
  13. package/dist/components/index.d.cts +1 -1
  14. package/dist/components/index.d.ts +1 -1
  15. package/dist/components/index.js +1 -1
  16. package/dist/constants-D61jqRIO.d.cts +35 -0
  17. package/dist/constants-D61jqRIO.d.ts +35 -0
  18. package/dist/{ffid-client-Cjm_TKUc.d.cts → ffid-client-B26jbUp5.d.cts} +72 -0
  19. package/dist/{ffid-client-Cjm_TKUc.d.ts → ffid-client-B26jbUp5.d.ts} +72 -0
  20. package/dist/{index-0D2vYSLq.d.cts → index-C3zyNa4j.d.cts} +37 -1
  21. package/dist/{index-0D2vYSLq.d.ts → index-C3zyNa4j.d.ts} +37 -1
  22. package/dist/index.cjs +37 -31
  23. package/dist/index.d.cts +68 -4
  24. package/dist/index.d.ts +68 -4
  25. package/dist/index.js +4 -3
  26. package/dist/legal/index.cjs +3 -3
  27. package/dist/legal/index.d.cts +1 -1
  28. package/dist/legal/index.d.ts +1 -1
  29. package/dist/legal/index.js +2 -2
  30. package/dist/server/index.cjs +135 -5
  31. package/dist/server/index.d.cts +3 -3
  32. package/dist/server/index.d.ts +3 -3
  33. package/dist/server/index.js +130 -4
  34. package/dist/server/test/index.d.cts +1 -1
  35. package/dist/server/test/index.d.ts +1 -1
  36. package/package.json +1 -1
  37. package/dist/chunk-QBRM2RRC.js +0 -4
  38. package/dist/constants-DvTGHPZn.d.cts +0 -10
  39. package/dist/constants-DvTGHPZn.d.ts +0 -10
@@ -1,3 +1,3 @@
1
- export { M as FFIDAnnouncementBadge, al as FFIDAnnouncementBadgeClassNames, am as FFIDAnnouncementBadgeProps, N as FFIDAnnouncementList, an as FFIDAnnouncementListClassNames, ao as FFIDAnnouncementListProps, V as FFIDInquiryForm, W as FFIDInquiryFormCategoryItem, X as FFIDInquiryFormClassNames, Y as FFIDInquiryFormOrganization, Z as FFIDInquiryFormPlaceholderContext, _ as FFIDInquiryFormPrefill, $ as FFIDInquiryFormProps, a0 as FFIDInquiryFormSubmitData, a1 as FFIDInquiryFormSubmitResult, a3 as FFIDLoginButton, ap as FFIDLoginButtonProps, a9 as FFIDOrganizationSwitcher, aq as FFIDOrganizationSwitcherClassNames, ar as FFIDOrganizationSwitcherProps, ac as FFIDSubscriptionBadge, as as FFIDSubscriptionBadgeClassNames, at as FFIDSubscriptionBadgeProps, ae as FFIDUserMenu, au as FFIDUserMenuClassNames, av as FFIDUserMenuProps } from '../index-0D2vYSLq.js';
1
+ export { N as FFIDAnnouncementBadge, am as FFIDAnnouncementBadgeClassNames, an as FFIDAnnouncementBadgeProps, O as FFIDAnnouncementList, ao as FFIDAnnouncementListClassNames, ap as FFIDAnnouncementListProps, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormOrganization, _ as FFIDInquiryFormPlaceholderContext, $ as FFIDInquiryFormPrefill, a0 as FFIDInquiryFormProps, a1 as FFIDInquiryFormSubmitData, a2 as FFIDInquiryFormSubmitResult, a4 as FFIDLoginButton, aq as FFIDLoginButtonProps, aa as FFIDOrganizationSwitcher, ar as FFIDOrganizationSwitcherClassNames, as as FFIDOrganizationSwitcherProps, ad as FFIDSubscriptionBadge, at as FFIDSubscriptionBadgeClassNames, au as FFIDSubscriptionBadgeProps, af as FFIDUserMenu, av as FFIDUserMenuClassNames, aw as FFIDUserMenuProps } from '../index-C3zyNa4j.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
@@ -1 +1 @@
1
- export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-GCUVFSB2.js';
1
+ export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-XWI4BFKW.js';
@@ -0,0 +1,35 @@
1
+ /**
2
+ * FFID SDK Shared Constants
3
+ *
4
+ * Constants shared across all SDK entry points.
5
+ * Centralizing these prevents drift during domain/URL changes.
6
+ */
7
+ /** Default FFID API base URL (production) */
8
+ declare const DEFAULT_API_BASE_URL = "https://id.feelflow.net";
9
+ /**
10
+ * Recommended default OAuth scope set for FFID-connected services (v3.0.0+).
11
+ *
12
+ * Coverage:
13
+ * - `openid email profile` — OIDC standard claims (always required)
14
+ * - `subscription:read` — `/api/v1/subscriptions/ext/*` 系(プラン / 課金 gate)
15
+ * - `legal:read` — `/api/v1/legal/ext` 系(利用規約・同意状態)
16
+ *
17
+ * Add feature-specific scopes on top of this when needed (browser SDK):
18
+ * - `analytics:read` for `/api/v1/ext/analytics/config`
19
+ * - `organization:read` / `organization:write` for `/api/v1/organizations/ext/members`
20
+ * - `subscription:write` for self-serve plan changes
21
+ * - `legal:write` for recording user consent
22
+ * - `profile:read` / `profile:write` for profile UI
23
+ * - `organization:api-key` for org-level API key issuance
24
+ *
25
+ * **Note**: kept as a widened `string` (not `as const`) so consumers can
26
+ * concatenate additional scopes (e.g. `\`${DEFAULT_OAUTH_SCOPES} analytics:read\``)
27
+ * and so it remains assignable to `FFIDConfig.scope: string`. `widget:verify`
28
+ * is intentionally excluded — it is a service-key-only scope (`/api/v1/widget/*`),
29
+ * not used by the browser OAuth flow.
30
+ *
31
+ * Survey: feel-flow/feelflow-id-platform#2656 issuecomment-4324082742
32
+ */
33
+ declare const DEFAULT_OAUTH_SCOPES = "openid email profile subscription:read legal:read";
34
+
35
+ export { DEFAULT_API_BASE_URL as D, DEFAULT_OAUTH_SCOPES as a };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * FFID SDK Shared Constants
3
+ *
4
+ * Constants shared across all SDK entry points.
5
+ * Centralizing these prevents drift during domain/URL changes.
6
+ */
7
+ /** Default FFID API base URL (production) */
8
+ declare const DEFAULT_API_BASE_URL = "https://id.feelflow.net";
9
+ /**
10
+ * Recommended default OAuth scope set for FFID-connected services (v3.0.0+).
11
+ *
12
+ * Coverage:
13
+ * - `openid email profile` — OIDC standard claims (always required)
14
+ * - `subscription:read` — `/api/v1/subscriptions/ext/*` 系(プラン / 課金 gate)
15
+ * - `legal:read` — `/api/v1/legal/ext` 系(利用規約・同意状態)
16
+ *
17
+ * Add feature-specific scopes on top of this when needed (browser SDK):
18
+ * - `analytics:read` for `/api/v1/ext/analytics/config`
19
+ * - `organization:read` / `organization:write` for `/api/v1/organizations/ext/members`
20
+ * - `subscription:write` for self-serve plan changes
21
+ * - `legal:write` for recording user consent
22
+ * - `profile:read` / `profile:write` for profile UI
23
+ * - `organization:api-key` for org-level API key issuance
24
+ *
25
+ * **Note**: kept as a widened `string` (not `as const`) so consumers can
26
+ * concatenate additional scopes (e.g. `\`${DEFAULT_OAUTH_SCOPES} analytics:read\``)
27
+ * and so it remains assignable to `FFIDConfig.scope: string`. `widget:verify`
28
+ * is intentionally excluded — it is a service-key-only scope (`/api/v1/widget/*`),
29
+ * not used by the browser OAuth flow.
30
+ *
31
+ * Survey: feel-flow/feelflow-id-platform#2656 issuecomment-4324082742
32
+ */
33
+ declare const DEFAULT_OAUTH_SCOPES = "openid email profile subscription:read legal:read";
34
+
35
+ export { DEFAULT_API_BASE_URL as D, DEFAULT_OAUTH_SCOPES as a };
@@ -127,6 +127,40 @@ interface FFIDNewsletterUnsubscribeParams {
127
127
  interface FFIDNewsletterUnsubscribeResponse {
128
128
  ok: true;
129
129
  }
130
+ type FFIDNewsletterCampaignStatus = 'draft' | 'queued' | 'sending' | 'sent' | 'failed' | 'cancelled';
131
+ type FFIDNewsletterSegment = {
132
+ type: 'all';
133
+ } | {
134
+ type: 'filter';
135
+ conditions: Record<string, unknown>;
136
+ };
137
+ /**
138
+ * Body source XOR — exactly one of `htmlBody` / `templateId` must be set.
139
+ * V1 only ships `htmlBody`; `templateId` is reserved for SendGrid dynamic
140
+ * templates and is rejected server-side until that work lands.
141
+ */
142
+ type FFIDNewsletterBodySource = {
143
+ htmlBody: string;
144
+ templateId?: never;
145
+ } | {
146
+ templateId: string;
147
+ htmlBody?: never;
148
+ };
149
+ interface FFIDNewsletterDispatchParams {
150
+ subject: string;
151
+ /** Optional landing-page URL persisted on `newsletter_campaigns.article_url`. */
152
+ articleUrl?: string;
153
+ body: FFIDNewsletterBodySource;
154
+ /** Defaults to `{ type: 'all' }` server-side when omitted. */
155
+ segment?: FFIDNewsletterSegment;
156
+ }
157
+ interface FFIDNewsletterDispatchResponse {
158
+ campaignId: string;
159
+ totalRecipients: number;
160
+ status: FFIDNewsletterCampaignStatus;
161
+ sentCount: number;
162
+ failedCount: number;
163
+ }
130
164
 
131
165
  /** Cache adapter interface for FFID SDK token verification */
132
166
  /**
@@ -589,6 +623,19 @@ interface FFIDVerifyAccessTokenOptions {
589
623
  interface FFIDConfig {
590
624
  /** Service code to identify your application */
591
625
  serviceCode: string;
626
+ /**
627
+ * OAuth 2.0 scope (space-separated). Required since v3.0.0 (#2674).
628
+ *
629
+ * Use `DEFAULT_OAUTH_SCOPES` from `@feelflow/ffid-sdk` for the recommended
630
+ * baseline, or specify a least-privilege subset for your use case. Phase 3
631
+ * of `feelflow-id-platform#2656` will reject `/oauth/authorize` requests
632
+ * without this parameter, so passing an empty string here is also rejected
633
+ * — **except** in `service-key` mode (server-to-server, never calls
634
+ * `/oauth/authorize`), where `''` is permitted at runtime.
635
+ *
636
+ * @example 'openid email profile subscription:read legal:read'
637
+ */
638
+ scope: string;
592
639
  /** FFID API base URL (defaults to production) */
593
640
  apiBaseUrl?: string | undefined;
594
641
  /**
@@ -847,6 +894,29 @@ interface FFIDProfileCallOptions {
847
894
  */
848
895
  accessToken?: string;
849
896
  }
897
+ /**
898
+ * Response shape from `GET /api/v1/ext/analytics/config?service=<code>`.
899
+ *
900
+ * Returned by `FFIDClient.getAnalyticsConfig()`. Narrower than the admin-side
901
+ * `AnalyticsService` shape to avoid leaking internal columns
902
+ * (`ga4StreamId`, `lastSyncedAt`, `description`).
903
+ *
904
+ * @see Issue #2347
905
+ */
906
+ interface FFIDAnalyticsConfig {
907
+ /** Service slug (kebab-case) — echoed back so callers can sanity-check */
908
+ code: string;
909
+ /** GA4 Measurement ID (`G-XXXXXXX`) */
910
+ measurementId: string;
911
+ /** GA4 displayName at the time of the last sync */
912
+ displayName: string;
913
+ /**
914
+ * `false` when the GA4 data stream has been archived. The measurement id is
915
+ * still returned so in-flight events do not 5xx during a cutover window —
916
+ * the caller should disable tracking on the next deploy.
917
+ */
918
+ isActive: boolean;
919
+ }
850
920
  /**
851
921
  * Request payload for `updateProfile`.
852
922
  *
@@ -1064,6 +1134,7 @@ declare function createFFIDClient(config: FFIDConfig): {
1064
1134
  }) => Promise<FFIDApiResponse<FFIDRemoveMemberResponse>>;
1065
1135
  getProfile: (options?: FFIDProfileCallOptions) => Promise<FFIDApiResponse<FFIDUserProfile>>;
1066
1136
  updateProfile: (data: FFIDUpdateUserProfileRequest, options?: FFIDProfileCallOptions) => Promise<FFIDApiResponse<FFIDUserProfile>>;
1137
+ getAnalyticsConfig: (serviceCode: string, options?: FFIDProfileCallOptions) => Promise<FFIDApiResponse<FFIDAnalyticsConfig>>;
1067
1138
  createCheckoutSession: (params: FFIDCreateCheckoutParams) => Promise<FFIDApiResponse<FFIDCheckoutSessionResponse>>;
1068
1139
  createPortalSession: (params: FFIDCreatePortalParams) => Promise<FFIDApiResponse<FFIDPortalSessionResponse>>;
1069
1140
  listPlans: () => Promise<FFIDApiResponse<FFIDListPlansResponse>>;
@@ -1101,6 +1172,7 @@ declare function createFFIDClient(config: FFIDConfig): {
1101
1172
  subscribe: (params: FFIDNewsletterSubscribeParams) => Promise<FFIDApiResponse<FFIDNewsletterSubscribeResponse>>;
1102
1173
  confirm: (params: FFIDNewsletterConfirmParams) => Promise<FFIDApiResponse<FFIDNewsletterConfirmResponse>>;
1103
1174
  unsubscribe: (params: FFIDNewsletterUnsubscribeParams) => Promise<FFIDApiResponse<FFIDNewsletterUnsubscribeResponse>>;
1175
+ dispatch: (params: FFIDNewsletterDispatchParams) => Promise<FFIDApiResponse<FFIDNewsletterDispatchResponse>>;
1104
1176
  };
1105
1177
  /** Inquiry methods (create) */
1106
1178
  inquiry: {
@@ -127,6 +127,40 @@ interface FFIDNewsletterUnsubscribeParams {
127
127
  interface FFIDNewsletterUnsubscribeResponse {
128
128
  ok: true;
129
129
  }
130
+ type FFIDNewsletterCampaignStatus = 'draft' | 'queued' | 'sending' | 'sent' | 'failed' | 'cancelled';
131
+ type FFIDNewsletterSegment = {
132
+ type: 'all';
133
+ } | {
134
+ type: 'filter';
135
+ conditions: Record<string, unknown>;
136
+ };
137
+ /**
138
+ * Body source XOR — exactly one of `htmlBody` / `templateId` must be set.
139
+ * V1 only ships `htmlBody`; `templateId` is reserved for SendGrid dynamic
140
+ * templates and is rejected server-side until that work lands.
141
+ */
142
+ type FFIDNewsletterBodySource = {
143
+ htmlBody: string;
144
+ templateId?: never;
145
+ } | {
146
+ templateId: string;
147
+ htmlBody?: never;
148
+ };
149
+ interface FFIDNewsletterDispatchParams {
150
+ subject: string;
151
+ /** Optional landing-page URL persisted on `newsletter_campaigns.article_url`. */
152
+ articleUrl?: string;
153
+ body: FFIDNewsletterBodySource;
154
+ /** Defaults to `{ type: 'all' }` server-side when omitted. */
155
+ segment?: FFIDNewsletterSegment;
156
+ }
157
+ interface FFIDNewsletterDispatchResponse {
158
+ campaignId: string;
159
+ totalRecipients: number;
160
+ status: FFIDNewsletterCampaignStatus;
161
+ sentCount: number;
162
+ failedCount: number;
163
+ }
130
164
 
131
165
  /** Cache adapter interface for FFID SDK token verification */
132
166
  /**
@@ -589,6 +623,19 @@ interface FFIDVerifyAccessTokenOptions {
589
623
  interface FFIDConfig {
590
624
  /** Service code to identify your application */
591
625
  serviceCode: string;
626
+ /**
627
+ * OAuth 2.0 scope (space-separated). Required since v3.0.0 (#2674).
628
+ *
629
+ * Use `DEFAULT_OAUTH_SCOPES` from `@feelflow/ffid-sdk` for the recommended
630
+ * baseline, or specify a least-privilege subset for your use case. Phase 3
631
+ * of `feelflow-id-platform#2656` will reject `/oauth/authorize` requests
632
+ * without this parameter, so passing an empty string here is also rejected
633
+ * — **except** in `service-key` mode (server-to-server, never calls
634
+ * `/oauth/authorize`), where `''` is permitted at runtime.
635
+ *
636
+ * @example 'openid email profile subscription:read legal:read'
637
+ */
638
+ scope: string;
592
639
  /** FFID API base URL (defaults to production) */
593
640
  apiBaseUrl?: string | undefined;
594
641
  /**
@@ -847,6 +894,29 @@ interface FFIDProfileCallOptions {
847
894
  */
848
895
  accessToken?: string;
849
896
  }
897
+ /**
898
+ * Response shape from `GET /api/v1/ext/analytics/config?service=<code>`.
899
+ *
900
+ * Returned by `FFIDClient.getAnalyticsConfig()`. Narrower than the admin-side
901
+ * `AnalyticsService` shape to avoid leaking internal columns
902
+ * (`ga4StreamId`, `lastSyncedAt`, `description`).
903
+ *
904
+ * @see Issue #2347
905
+ */
906
+ interface FFIDAnalyticsConfig {
907
+ /** Service slug (kebab-case) — echoed back so callers can sanity-check */
908
+ code: string;
909
+ /** GA4 Measurement ID (`G-XXXXXXX`) */
910
+ measurementId: string;
911
+ /** GA4 displayName at the time of the last sync */
912
+ displayName: string;
913
+ /**
914
+ * `false` when the GA4 data stream has been archived. The measurement id is
915
+ * still returned so in-flight events do not 5xx during a cutover window —
916
+ * the caller should disable tracking on the next deploy.
917
+ */
918
+ isActive: boolean;
919
+ }
850
920
  /**
851
921
  * Request payload for `updateProfile`.
852
922
  *
@@ -1064,6 +1134,7 @@ declare function createFFIDClient(config: FFIDConfig): {
1064
1134
  }) => Promise<FFIDApiResponse<FFIDRemoveMemberResponse>>;
1065
1135
  getProfile: (options?: FFIDProfileCallOptions) => Promise<FFIDApiResponse<FFIDUserProfile>>;
1066
1136
  updateProfile: (data: FFIDUpdateUserProfileRequest, options?: FFIDProfileCallOptions) => Promise<FFIDApiResponse<FFIDUserProfile>>;
1137
+ getAnalyticsConfig: (serviceCode: string, options?: FFIDProfileCallOptions) => Promise<FFIDApiResponse<FFIDAnalyticsConfig>>;
1067
1138
  createCheckoutSession: (params: FFIDCreateCheckoutParams) => Promise<FFIDApiResponse<FFIDCheckoutSessionResponse>>;
1068
1139
  createPortalSession: (params: FFIDCreatePortalParams) => Promise<FFIDApiResponse<FFIDPortalSessionResponse>>;
1069
1140
  listPlans: () => Promise<FFIDApiResponse<FFIDListPlansResponse>>;
@@ -1101,6 +1172,7 @@ declare function createFFIDClient(config: FFIDConfig): {
1101
1172
  subscribe: (params: FFIDNewsletterSubscribeParams) => Promise<FFIDApiResponse<FFIDNewsletterSubscribeResponse>>;
1102
1173
  confirm: (params: FFIDNewsletterConfirmParams) => Promise<FFIDApiResponse<FFIDNewsletterConfirmResponse>>;
1103
1174
  unsubscribe: (params: FFIDNewsletterUnsubscribeParams) => Promise<FFIDApiResponse<FFIDNewsletterUnsubscribeResponse>>;
1175
+ dispatch: (params: FFIDNewsletterDispatchParams) => Promise<FFIDApiResponse<FFIDNewsletterDispatchResponse>>;
1104
1176
  };
1105
1177
  /** Inquiry methods (create) */
1106
1178
  inquiry: {
@@ -192,6 +192,19 @@ interface FFIDVerifyAccessTokenOptions {
192
192
  interface FFIDConfig {
193
193
  /** Service code to identify your application */
194
194
  serviceCode: string;
195
+ /**
196
+ * OAuth 2.0 scope (space-separated). Required since v3.0.0 (#2674).
197
+ *
198
+ * Use `DEFAULT_OAUTH_SCOPES` from `@feelflow/ffid-sdk` for the recommended
199
+ * baseline, or specify a least-privilege subset for your use case. Phase 3
200
+ * of `feelflow-id-platform#2656` will reject `/oauth/authorize` requests
201
+ * without this parameter, so passing an empty string here is also rejected
202
+ * — **except** in `service-key` mode (server-to-server, never calls
203
+ * `/oauth/authorize`), where `''` is permitted at runtime.
204
+ *
205
+ * @example 'openid email profile subscription:read legal:read'
206
+ */
207
+ scope: string;
195
208
  /** FFID API base URL (defaults to production) */
196
209
  apiBaseUrl?: string | undefined;
197
210
  /**
@@ -580,6 +593,29 @@ interface FFIDProfileCallOptions {
580
593
  */
581
594
  accessToken?: string;
582
595
  }
596
+ /**
597
+ * Response shape from `GET /api/v1/ext/analytics/config?service=<code>`.
598
+ *
599
+ * Returned by `FFIDClient.getAnalyticsConfig()`. Narrower than the admin-side
600
+ * `AnalyticsService` shape to avoid leaking internal columns
601
+ * (`ga4StreamId`, `lastSyncedAt`, `description`).
602
+ *
603
+ * @see Issue #2347
604
+ */
605
+ interface FFIDAnalyticsConfig {
606
+ /** Service slug (kebab-case) — echoed back so callers can sanity-check */
607
+ code: string;
608
+ /** GA4 Measurement ID (`G-XXXXXXX`) */
609
+ measurementId: string;
610
+ /** GA4 displayName at the time of the last sync */
611
+ displayName: string;
612
+ /**
613
+ * `false` when the GA4 data stream has been archived. The measurement id is
614
+ * still returned so in-flight events do not 5xx during a cutover window —
615
+ * the caller should disable tracking on the next deploy.
616
+ */
617
+ isActive: boolean;
618
+ }
583
619
  /**
584
620
  * Request payload for `updateProfile`.
585
621
  *
@@ -1386,4 +1422,4 @@ interface FFIDInquiryFormPlaceholderContext {
1386
1422
  }
1387
1423
  declare function FFIDInquiryForm({ mode, prefill, organizations, preselectedOrganizationId, categories, termsVersion, privacyVersion, termsHref, privacyHref, turnstileToken, turnstileSlot, onSubmit, onChange, separateLegalCheckboxes, messagePlaceholder, requireCategorySelection, unstyled, classNames, locale, className, }: FFIDInquiryFormProps): react_jsx_runtime.JSX.Element;
1388
1424
 
1389
- export { type FFIDInquiryFormProps as $, type FFIDSubscription as A, type FFIDSubscriptionContextValue as B, type FFIDAnnouncementsClientConfig as C, type FFIDAnnouncementsApiResponse as D, type EffectiveSubscriptionStatus as E, type FFIDSubscriptionStatus as F, type AnnouncementListResponse as G, type FFIDAnnouncementsLogger as H, type Announcement as I, type AnnouncementStatus as J, type AnnouncementType as K, type ListAnnouncementsOptions as L, FFIDAnnouncementBadge as M, FFIDAnnouncementList as N, type FFIDAnnouncementsError as O, type FFIDAnnouncementsErrorCode as P, type FFIDAnnouncementsServerResponse as Q, type FFIDCacheConfig as R, type FFIDContextValue as S, type FFIDInquiryCategory as T, type FFIDInquiryCategorySite2026 as U, FFIDInquiryForm as V, type FFIDInquiryFormCategoryItem as W, type FFIDInquiryFormClassNames as X, type FFIDInquiryFormOrganization as Y, type FFIDInquiryFormPlaceholderContext as Z, type FFIDInquiryFormPrefill as _, type FFIDConfig as a, type FFIDInquiryFormSubmitData as a0, type FFIDInquiryFormSubmitResult as a1, type FFIDJwtClaims as a2, FFIDLoginButton as a3, type FFIDMemberStatus as a4, type FFIDOAuthTokenResponse as a5, type FFIDOAuthUserInfoMemberRole as a6, type FFIDOAuthUserInfoSubscription as a7, type FFIDOrganizationMember as a8, FFIDOrganizationSwitcher as a9, type FFIDRedirectErrorCode as aa, type FFIDSeatModel as ab, FFIDSubscriptionBadge as ac, type FFIDTokenIntrospectionResponse as ad, FFIDUserMenu as ae, FFID_INQUIRY_CATEGORIES as af, FFID_INQUIRY_CATEGORIES_SITE_2026 as ag, type UseFFIDAnnouncementsOptions as ah, type UseFFIDAnnouncementsReturn as ai, isFFIDInquiryCategorySite2026 as aj, useFFIDAnnouncements as ak, type FFIDAnnouncementBadgeClassNames as al, type FFIDAnnouncementBadgeProps as am, type FFIDAnnouncementListClassNames as an, type FFIDAnnouncementListProps as ao, type FFIDLoginButtonProps as ap, type FFIDOrganizationSwitcherClassNames as aq, type FFIDOrganizationSwitcherProps as ar, type FFIDSubscriptionBadgeClassNames as as, type FFIDSubscriptionBadgeProps as at, type FFIDUserMenuClassNames as au, type FFIDUserMenuProps as av, type FFIDApiResponse as b, type FFIDSessionResponse as c, type FFIDRedirectResult as d, type FFIDError as e, type FFIDSubscriptionCheckResponse as f, type FFIDListMembersResponse as g, type FFIDMemberRole as h, type FFIDUpdateMemberRoleResponse as i, type FFIDRemoveMemberResponse as j, type FFIDProfileCallOptions as k, type FFIDUserProfile as l, type FFIDUpdateUserProfileRequest as m, type FFIDCreateCheckoutParams as n, type FFIDCheckoutSessionResponse as o, type FFIDCreatePortalParams as p, type FFIDPortalSessionResponse as q, type FFIDVerifyAccessTokenOptions as r, type FFIDOAuthUserInfo as s, type FFIDInquiryCreateParams as t, type FFIDInquiryCreateResponse as u, type FFIDAuthMode as v, type FFIDLogger as w, type FFIDCacheAdapter as x, type FFIDUser as y, type FFIDOrganization as z };
1425
+ export { type FFIDInquiryFormPrefill as $, type FFIDOrganization as A, type FFIDSubscription as B, type FFIDSubscriptionContextValue as C, type FFIDAnnouncementsClientConfig as D, type EffectiveSubscriptionStatus as E, type FFIDSubscriptionStatus as F, type FFIDAnnouncementsApiResponse as G, type AnnouncementListResponse as H, type FFIDAnnouncementsLogger as I, type Announcement as J, type AnnouncementStatus as K, type ListAnnouncementsOptions as L, type AnnouncementType as M, FFIDAnnouncementBadge as N, FFIDAnnouncementList as O, type FFIDAnnouncementsError as P, type FFIDAnnouncementsErrorCode as Q, type FFIDAnnouncementsServerResponse as R, type FFIDCacheConfig as S, type FFIDContextValue as T, type FFIDInquiryCategory as U, type FFIDInquiryCategorySite2026 as V, FFIDInquiryForm as W, type FFIDInquiryFormCategoryItem as X, type FFIDInquiryFormClassNames as Y, type FFIDInquiryFormOrganization as Z, type FFIDInquiryFormPlaceholderContext as _, type FFIDConfig as a, type FFIDInquiryFormProps as a0, type FFIDInquiryFormSubmitData as a1, type FFIDInquiryFormSubmitResult as a2, type FFIDJwtClaims as a3, FFIDLoginButton as a4, type FFIDMemberStatus as a5, type FFIDOAuthTokenResponse as a6, type FFIDOAuthUserInfoMemberRole as a7, type FFIDOAuthUserInfoSubscription as a8, type FFIDOrganizationMember as a9, FFIDOrganizationSwitcher as aa, type FFIDRedirectErrorCode as ab, type FFIDSeatModel as ac, FFIDSubscriptionBadge as ad, type FFIDTokenIntrospectionResponse as ae, FFIDUserMenu as af, FFID_INQUIRY_CATEGORIES as ag, FFID_INQUIRY_CATEGORIES_SITE_2026 as ah, type UseFFIDAnnouncementsOptions as ai, type UseFFIDAnnouncementsReturn as aj, isFFIDInquiryCategorySite2026 as ak, useFFIDAnnouncements as al, type FFIDAnnouncementBadgeClassNames as am, type FFIDAnnouncementBadgeProps as an, type FFIDAnnouncementListClassNames as ao, type FFIDAnnouncementListProps as ap, type FFIDLoginButtonProps as aq, type FFIDOrganizationSwitcherClassNames as ar, type FFIDOrganizationSwitcherProps as as, type FFIDSubscriptionBadgeClassNames as at, type FFIDSubscriptionBadgeProps as au, type FFIDUserMenuClassNames as av, type FFIDUserMenuProps as aw, type FFIDApiResponse as b, type FFIDSessionResponse as c, type FFIDRedirectResult as d, type FFIDError as e, type FFIDSubscriptionCheckResponse as f, type FFIDListMembersResponse as g, type FFIDMemberRole as h, type FFIDUpdateMemberRoleResponse as i, type FFIDRemoveMemberResponse as j, type FFIDProfileCallOptions as k, type FFIDUserProfile as l, type FFIDUpdateUserProfileRequest as m, type FFIDAnalyticsConfig as n, type FFIDCreateCheckoutParams as o, type FFIDCheckoutSessionResponse as p, type FFIDCreatePortalParams as q, type FFIDPortalSessionResponse as r, type FFIDVerifyAccessTokenOptions as s, type FFIDOAuthUserInfo as t, type FFIDInquiryCreateParams as u, type FFIDInquiryCreateResponse as v, type FFIDAuthMode as w, type FFIDLogger as x, type FFIDCacheAdapter as y, type FFIDUser as z };
@@ -192,6 +192,19 @@ interface FFIDVerifyAccessTokenOptions {
192
192
  interface FFIDConfig {
193
193
  /** Service code to identify your application */
194
194
  serviceCode: string;
195
+ /**
196
+ * OAuth 2.0 scope (space-separated). Required since v3.0.0 (#2674).
197
+ *
198
+ * Use `DEFAULT_OAUTH_SCOPES` from `@feelflow/ffid-sdk` for the recommended
199
+ * baseline, or specify a least-privilege subset for your use case. Phase 3
200
+ * of `feelflow-id-platform#2656` will reject `/oauth/authorize` requests
201
+ * without this parameter, so passing an empty string here is also rejected
202
+ * — **except** in `service-key` mode (server-to-server, never calls
203
+ * `/oauth/authorize`), where `''` is permitted at runtime.
204
+ *
205
+ * @example 'openid email profile subscription:read legal:read'
206
+ */
207
+ scope: string;
195
208
  /** FFID API base URL (defaults to production) */
196
209
  apiBaseUrl?: string | undefined;
197
210
  /**
@@ -580,6 +593,29 @@ interface FFIDProfileCallOptions {
580
593
  */
581
594
  accessToken?: string;
582
595
  }
596
+ /**
597
+ * Response shape from `GET /api/v1/ext/analytics/config?service=<code>`.
598
+ *
599
+ * Returned by `FFIDClient.getAnalyticsConfig()`. Narrower than the admin-side
600
+ * `AnalyticsService` shape to avoid leaking internal columns
601
+ * (`ga4StreamId`, `lastSyncedAt`, `description`).
602
+ *
603
+ * @see Issue #2347
604
+ */
605
+ interface FFIDAnalyticsConfig {
606
+ /** Service slug (kebab-case) — echoed back so callers can sanity-check */
607
+ code: string;
608
+ /** GA4 Measurement ID (`G-XXXXXXX`) */
609
+ measurementId: string;
610
+ /** GA4 displayName at the time of the last sync */
611
+ displayName: string;
612
+ /**
613
+ * `false` when the GA4 data stream has been archived. The measurement id is
614
+ * still returned so in-flight events do not 5xx during a cutover window —
615
+ * the caller should disable tracking on the next deploy.
616
+ */
617
+ isActive: boolean;
618
+ }
583
619
  /**
584
620
  * Request payload for `updateProfile`.
585
621
  *
@@ -1386,4 +1422,4 @@ interface FFIDInquiryFormPlaceholderContext {
1386
1422
  }
1387
1423
  declare function FFIDInquiryForm({ mode, prefill, organizations, preselectedOrganizationId, categories, termsVersion, privacyVersion, termsHref, privacyHref, turnstileToken, turnstileSlot, onSubmit, onChange, separateLegalCheckboxes, messagePlaceholder, requireCategorySelection, unstyled, classNames, locale, className, }: FFIDInquiryFormProps): react_jsx_runtime.JSX.Element;
1388
1424
 
1389
- export { type FFIDInquiryFormProps as $, type FFIDSubscription as A, type FFIDSubscriptionContextValue as B, type FFIDAnnouncementsClientConfig as C, type FFIDAnnouncementsApiResponse as D, type EffectiveSubscriptionStatus as E, type FFIDSubscriptionStatus as F, type AnnouncementListResponse as G, type FFIDAnnouncementsLogger as H, type Announcement as I, type AnnouncementStatus as J, type AnnouncementType as K, type ListAnnouncementsOptions as L, FFIDAnnouncementBadge as M, FFIDAnnouncementList as N, type FFIDAnnouncementsError as O, type FFIDAnnouncementsErrorCode as P, type FFIDAnnouncementsServerResponse as Q, type FFIDCacheConfig as R, type FFIDContextValue as S, type FFIDInquiryCategory as T, type FFIDInquiryCategorySite2026 as U, FFIDInquiryForm as V, type FFIDInquiryFormCategoryItem as W, type FFIDInquiryFormClassNames as X, type FFIDInquiryFormOrganization as Y, type FFIDInquiryFormPlaceholderContext as Z, type FFIDInquiryFormPrefill as _, type FFIDConfig as a, type FFIDInquiryFormSubmitData as a0, type FFIDInquiryFormSubmitResult as a1, type FFIDJwtClaims as a2, FFIDLoginButton as a3, type FFIDMemberStatus as a4, type FFIDOAuthTokenResponse as a5, type FFIDOAuthUserInfoMemberRole as a6, type FFIDOAuthUserInfoSubscription as a7, type FFIDOrganizationMember as a8, FFIDOrganizationSwitcher as a9, type FFIDRedirectErrorCode as aa, type FFIDSeatModel as ab, FFIDSubscriptionBadge as ac, type FFIDTokenIntrospectionResponse as ad, FFIDUserMenu as ae, FFID_INQUIRY_CATEGORIES as af, FFID_INQUIRY_CATEGORIES_SITE_2026 as ag, type UseFFIDAnnouncementsOptions as ah, type UseFFIDAnnouncementsReturn as ai, isFFIDInquiryCategorySite2026 as aj, useFFIDAnnouncements as ak, type FFIDAnnouncementBadgeClassNames as al, type FFIDAnnouncementBadgeProps as am, type FFIDAnnouncementListClassNames as an, type FFIDAnnouncementListProps as ao, type FFIDLoginButtonProps as ap, type FFIDOrganizationSwitcherClassNames as aq, type FFIDOrganizationSwitcherProps as ar, type FFIDSubscriptionBadgeClassNames as as, type FFIDSubscriptionBadgeProps as at, type FFIDUserMenuClassNames as au, type FFIDUserMenuProps as av, type FFIDApiResponse as b, type FFIDSessionResponse as c, type FFIDRedirectResult as d, type FFIDError as e, type FFIDSubscriptionCheckResponse as f, type FFIDListMembersResponse as g, type FFIDMemberRole as h, type FFIDUpdateMemberRoleResponse as i, type FFIDRemoveMemberResponse as j, type FFIDProfileCallOptions as k, type FFIDUserProfile as l, type FFIDUpdateUserProfileRequest as m, type FFIDCreateCheckoutParams as n, type FFIDCheckoutSessionResponse as o, type FFIDCreatePortalParams as p, type FFIDPortalSessionResponse as q, type FFIDVerifyAccessTokenOptions as r, type FFIDOAuthUserInfo as s, type FFIDInquiryCreateParams as t, type FFIDInquiryCreateResponse as u, type FFIDAuthMode as v, type FFIDLogger as w, type FFIDCacheAdapter as x, type FFIDUser as y, type FFIDOrganization as z };
1425
+ export { type FFIDInquiryFormPrefill as $, type FFIDOrganization as A, type FFIDSubscription as B, type FFIDSubscriptionContextValue as C, type FFIDAnnouncementsClientConfig as D, type EffectiveSubscriptionStatus as E, type FFIDSubscriptionStatus as F, type FFIDAnnouncementsApiResponse as G, type AnnouncementListResponse as H, type FFIDAnnouncementsLogger as I, type Announcement as J, type AnnouncementStatus as K, type ListAnnouncementsOptions as L, type AnnouncementType as M, FFIDAnnouncementBadge as N, FFIDAnnouncementList as O, type FFIDAnnouncementsError as P, type FFIDAnnouncementsErrorCode as Q, type FFIDAnnouncementsServerResponse as R, type FFIDCacheConfig as S, type FFIDContextValue as T, type FFIDInquiryCategory as U, type FFIDInquiryCategorySite2026 as V, FFIDInquiryForm as W, type FFIDInquiryFormCategoryItem as X, type FFIDInquiryFormClassNames as Y, type FFIDInquiryFormOrganization as Z, type FFIDInquiryFormPlaceholderContext as _, type FFIDConfig as a, type FFIDInquiryFormProps as a0, type FFIDInquiryFormSubmitData as a1, type FFIDInquiryFormSubmitResult as a2, type FFIDJwtClaims as a3, FFIDLoginButton as a4, type FFIDMemberStatus as a5, type FFIDOAuthTokenResponse as a6, type FFIDOAuthUserInfoMemberRole as a7, type FFIDOAuthUserInfoSubscription as a8, type FFIDOrganizationMember as a9, FFIDOrganizationSwitcher as aa, type FFIDRedirectErrorCode as ab, type FFIDSeatModel as ac, FFIDSubscriptionBadge as ad, type FFIDTokenIntrospectionResponse as ae, FFIDUserMenu as af, FFID_INQUIRY_CATEGORIES as ag, FFID_INQUIRY_CATEGORIES_SITE_2026 as ah, type UseFFIDAnnouncementsOptions as ai, type UseFFIDAnnouncementsReturn as aj, isFFIDInquiryCategorySite2026 as ak, useFFIDAnnouncements as al, type FFIDAnnouncementBadgeClassNames as am, type FFIDAnnouncementBadgeProps as an, type FFIDAnnouncementListClassNames as ao, type FFIDAnnouncementListProps as ap, type FFIDLoginButtonProps as aq, type FFIDOrganizationSwitcherClassNames as ar, type FFIDOrganizationSwitcherProps as as, type FFIDSubscriptionBadgeClassNames as at, type FFIDSubscriptionBadgeProps as au, type FFIDUserMenuClassNames as av, type FFIDUserMenuProps as aw, type FFIDApiResponse as b, type FFIDSessionResponse as c, type FFIDRedirectResult as d, type FFIDError as e, type FFIDSubscriptionCheckResponse as f, type FFIDListMembersResponse as g, type FFIDMemberRole as h, type FFIDUpdateMemberRoleResponse as i, type FFIDRemoveMemberResponse as j, type FFIDProfileCallOptions as k, type FFIDUserProfile as l, type FFIDUpdateUserProfileRequest as m, type FFIDAnalyticsConfig as n, type FFIDCreateCheckoutParams as o, type FFIDCheckoutSessionResponse as p, type FFIDCreatePortalParams as q, type FFIDPortalSessionResponse as r, type FFIDVerifyAccessTokenOptions as s, type FFIDOAuthUserInfo as t, type FFIDInquiryCreateParams as u, type FFIDInquiryCreateResponse as v, type FFIDAuthMode as w, type FFIDLogger as x, type FFIDCacheAdapter as y, type FFIDUser as z };
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkKNEZ5OUQ_cjs = require('./chunk-KNEZ5OUQ.cjs');
3
+ var chunkJNR4AKL5_cjs = require('./chunk-JNR4AKL5.cjs');
4
4
  var react = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
 
@@ -53,8 +53,8 @@ function defaultRedirect(url) {
53
53
  }
54
54
  function useRequireActiveSubscription(options) {
55
55
  const { redirectTo, allowGrace = true, onRedirect } = options;
56
- const { isLoading, error } = chunkKNEZ5OUQ_cjs.useFFIDContext();
57
- const { effectiveStatus, isBlocked, isGrace } = chunkKNEZ5OUQ_cjs.useSubscription();
56
+ const { isLoading, error } = chunkJNR4AKL5_cjs.useFFIDContext();
57
+ const { effectiveStatus, isBlocked, isGrace } = chunkJNR4AKL5_cjs.useSubscription();
58
58
  const hasFetchError = error !== null && effectiveStatus === null;
59
59
  const shouldRedirect = !isLoading && !hasFetchError && (isBlocked || !allowGrace && isGrace || effectiveStatus === null);
60
60
  react.useEffect(() => {
@@ -75,7 +75,7 @@ function useRequireActiveSubscription(options) {
75
75
  }
76
76
  function withFFIDAuth(Component, options = {}) {
77
77
  const WrappedComponent = (props) => {
78
- const { isLoading, isAuthenticated, login } = chunkKNEZ5OUQ_cjs.useFFIDContext();
78
+ const { isLoading, isAuthenticated, login } = chunkJNR4AKL5_cjs.useFFIDContext();
79
79
  const hasRedirected = react.useRef(false);
80
80
  react.useEffect(() => {
81
81
  if (!isLoading && !isAuthenticated && options.redirectToLogin && !hasRedirected.current) {
@@ -100,115 +100,121 @@ function withFFIDAuth(Component, options = {}) {
100
100
 
101
101
  // src/newsletter/types.ts
102
102
  var FFID_NEWSLETTER_TYPES = ["inquiry_followup", "general"];
103
+ var FFID_NEWSLETTER_DISPATCH_MAX_RECIPIENTS = 1e3;
103
104
 
104
105
  Object.defineProperty(exports, "DEFAULT_API_BASE_URL", {
105
106
  enumerable: true,
106
- get: function () { return chunkKNEZ5OUQ_cjs.DEFAULT_API_BASE_URL; }
107
+ get: function () { return chunkJNR4AKL5_cjs.DEFAULT_API_BASE_URL; }
108
+ });
109
+ Object.defineProperty(exports, "DEFAULT_OAUTH_SCOPES", {
110
+ enumerable: true,
111
+ get: function () { return chunkJNR4AKL5_cjs.DEFAULT_OAUTH_SCOPES; }
107
112
  });
108
113
  Object.defineProperty(exports, "FFIDAnnouncementBadge", {
109
114
  enumerable: true,
110
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDAnnouncementBadge; }
115
+ get: function () { return chunkJNR4AKL5_cjs.FFIDAnnouncementBadge; }
111
116
  });
112
117
  Object.defineProperty(exports, "FFIDAnnouncementList", {
113
118
  enumerable: true,
114
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDAnnouncementList; }
119
+ get: function () { return chunkJNR4AKL5_cjs.FFIDAnnouncementList; }
115
120
  });
116
121
  Object.defineProperty(exports, "FFIDInquiryForm", {
117
122
  enumerable: true,
118
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDInquiryForm; }
123
+ get: function () { return chunkJNR4AKL5_cjs.FFIDInquiryForm; }
119
124
  });
120
125
  Object.defineProperty(exports, "FFIDLoginButton", {
121
126
  enumerable: true,
122
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDLoginButton; }
127
+ get: function () { return chunkJNR4AKL5_cjs.FFIDLoginButton; }
123
128
  });
124
129
  Object.defineProperty(exports, "FFIDOrganizationSwitcher", {
125
130
  enumerable: true,
126
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDOrganizationSwitcher; }
131
+ get: function () { return chunkJNR4AKL5_cjs.FFIDOrganizationSwitcher; }
127
132
  });
128
133
  Object.defineProperty(exports, "FFIDProvider", {
129
134
  enumerable: true,
130
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDProvider; }
135
+ get: function () { return chunkJNR4AKL5_cjs.FFIDProvider; }
131
136
  });
132
137
  Object.defineProperty(exports, "FFIDSDKError", {
133
138
  enumerable: true,
134
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDSDKError; }
139
+ get: function () { return chunkJNR4AKL5_cjs.FFIDSDKError; }
135
140
  });
136
141
  Object.defineProperty(exports, "FFIDSubscriptionBadge", {
137
142
  enumerable: true,
138
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDSubscriptionBadge; }
143
+ get: function () { return chunkJNR4AKL5_cjs.FFIDSubscriptionBadge; }
139
144
  });
140
145
  Object.defineProperty(exports, "FFIDUserMenu", {
141
146
  enumerable: true,
142
- get: function () { return chunkKNEZ5OUQ_cjs.FFIDUserMenu; }
147
+ get: function () { return chunkJNR4AKL5_cjs.FFIDUserMenu; }
143
148
  });
144
149
  Object.defineProperty(exports, "FFID_ANNOUNCEMENTS_ERROR_CODES", {
145
150
  enumerable: true,
146
- get: function () { return chunkKNEZ5OUQ_cjs.FFID_ANNOUNCEMENTS_ERROR_CODES; }
151
+ get: function () { return chunkJNR4AKL5_cjs.FFID_ANNOUNCEMENTS_ERROR_CODES; }
147
152
  });
148
153
  Object.defineProperty(exports, "FFID_INQUIRY_CATEGORIES", {
149
154
  enumerable: true,
150
- get: function () { return chunkKNEZ5OUQ_cjs.FFID_INQUIRY_CATEGORIES; }
155
+ get: function () { return chunkJNR4AKL5_cjs.FFID_INQUIRY_CATEGORIES; }
151
156
  });
152
157
  Object.defineProperty(exports, "FFID_INQUIRY_CATEGORIES_SITE_2026", {
153
158
  enumerable: true,
154
- get: function () { return chunkKNEZ5OUQ_cjs.FFID_INQUIRY_CATEGORIES_SITE_2026; }
159
+ get: function () { return chunkJNR4AKL5_cjs.FFID_INQUIRY_CATEGORIES_SITE_2026; }
155
160
  });
156
161
  Object.defineProperty(exports, "computeEffectiveStatusFromSession", {
157
162
  enumerable: true,
158
- get: function () { return chunkKNEZ5OUQ_cjs.computeEffectiveStatusFromSession; }
163
+ get: function () { return chunkJNR4AKL5_cjs.computeEffectiveStatusFromSession; }
159
164
  });
160
165
  Object.defineProperty(exports, "createFFIDAnnouncementsClient", {
161
166
  enumerable: true,
162
- get: function () { return chunkKNEZ5OUQ_cjs.createFFIDAnnouncementsClient; }
167
+ get: function () { return chunkJNR4AKL5_cjs.createFFIDAnnouncementsClient; }
163
168
  });
164
169
  Object.defineProperty(exports, "createFFIDClient", {
165
170
  enumerable: true,
166
- get: function () { return chunkKNEZ5OUQ_cjs.createFFIDClient; }
171
+ get: function () { return chunkJNR4AKL5_cjs.createFFIDClient; }
167
172
  });
168
173
  Object.defineProperty(exports, "createTokenStore", {
169
174
  enumerable: true,
170
- get: function () { return chunkKNEZ5OUQ_cjs.createTokenStore; }
175
+ get: function () { return chunkJNR4AKL5_cjs.createTokenStore; }
171
176
  });
172
177
  Object.defineProperty(exports, "generateCodeChallenge", {
173
178
  enumerable: true,
174
- get: function () { return chunkKNEZ5OUQ_cjs.generateCodeChallenge; }
179
+ get: function () { return chunkJNR4AKL5_cjs.generateCodeChallenge; }
175
180
  });
176
181
  Object.defineProperty(exports, "generateCodeVerifier", {
177
182
  enumerable: true,
178
- get: function () { return chunkKNEZ5OUQ_cjs.generateCodeVerifier; }
183
+ get: function () { return chunkJNR4AKL5_cjs.generateCodeVerifier; }
179
184
  });
180
185
  Object.defineProperty(exports, "isFFIDInquiryCategorySite2026", {
181
186
  enumerable: true,
182
- get: function () { return chunkKNEZ5OUQ_cjs.isFFIDInquiryCategorySite2026; }
187
+ get: function () { return chunkJNR4AKL5_cjs.isFFIDInquiryCategorySite2026; }
183
188
  });
184
189
  Object.defineProperty(exports, "normalizeRedirectUri", {
185
190
  enumerable: true,
186
- get: function () { return chunkKNEZ5OUQ_cjs.normalizeRedirectUri; }
191
+ get: function () { return chunkJNR4AKL5_cjs.normalizeRedirectUri; }
187
192
  });
188
193
  Object.defineProperty(exports, "retrieveCodeVerifier", {
189
194
  enumerable: true,
190
- get: function () { return chunkKNEZ5OUQ_cjs.retrieveCodeVerifier; }
195
+ get: function () { return chunkJNR4AKL5_cjs.retrieveCodeVerifier; }
191
196
  });
192
197
  Object.defineProperty(exports, "storeCodeVerifier", {
193
198
  enumerable: true,
194
- get: function () { return chunkKNEZ5OUQ_cjs.storeCodeVerifier; }
199
+ get: function () { return chunkJNR4AKL5_cjs.storeCodeVerifier; }
195
200
  });
196
201
  Object.defineProperty(exports, "useFFID", {
197
202
  enumerable: true,
198
- get: function () { return chunkKNEZ5OUQ_cjs.useFFID; }
203
+ get: function () { return chunkJNR4AKL5_cjs.useFFID; }
199
204
  });
200
205
  Object.defineProperty(exports, "useFFIDAnnouncements", {
201
206
  enumerable: true,
202
- get: function () { return chunkKNEZ5OUQ_cjs.useFFIDAnnouncements; }
207
+ get: function () { return chunkJNR4AKL5_cjs.useFFIDAnnouncements; }
203
208
  });
204
209
  Object.defineProperty(exports, "useSubscription", {
205
210
  enumerable: true,
206
- get: function () { return chunkKNEZ5OUQ_cjs.useSubscription; }
211
+ get: function () { return chunkJNR4AKL5_cjs.useSubscription; }
207
212
  });
208
213
  Object.defineProperty(exports, "withSubscription", {
209
214
  enumerable: true,
210
- get: function () { return chunkKNEZ5OUQ_cjs.withSubscription; }
215
+ get: function () { return chunkJNR4AKL5_cjs.withSubscription; }
211
216
  });
217
+ exports.FFID_NEWSLETTER_DISPATCH_MAX_RECIPIENTS = FFID_NEWSLETTER_DISPATCH_MAX_RECIPIENTS;
212
218
  exports.FFID_NEWSLETTER_TYPES = FFID_NEWSLETTER_TYPES;
213
219
  exports.createKVCacheAdapter = createKVCacheAdapter;
214
220
  exports.createMemoryCacheAdapter = createMemoryCacheAdapter;