/** * Internal TCF types used by the tcf module. * * @packageDocumentation */ import type { GlobalVendorList, TCFConsentData } from '../../types/iab-tcf'; import type { NonIABVendor } from '../../types/non-iab-vendor'; /** * IAB TCF 2.3 runtime state. * * @remarks * This interface encapsulates all IAB-specific state, including the Global Vendor List, * consent strings, and per-vendor/purpose consent states. * * @public */ export interface IABState { /** IAB TCF configuration */ config: IABConfig; /** Global Vendor List data (null when not yet fetched or in non-IAB region) */ gvl: GlobalVendorList | null; /** Whether GVL is currently being fetched */ isLoadingGVL: boolean; /** Non-IAB vendors configured by the publisher */ nonIABVendors: NonIABVendor[]; /** IAB TCF consent string (TC String) */ tcString: string | null; /** Per-vendor consent state (keyed by vendor ID) */ vendorConsents: Record; /** Per-vendor legitimate interest state */ vendorLegitimateInterests: Record; /** Per-purpose consent state (IAB purposes 1-11) */ purposeConsents: Record; /** Per-purpose legitimate interest state */ purposeLegitimateInterests: Record; /** Special feature opt-ins (e.g., precise geolocation) */ specialFeatureOptIns: Record; /** * Vendors disclosed to the user in the CMP UI (TCF 2.3 requirement). * * This tracks which vendors were shown to the user, regardless of * whether consent was given. Required for TC String generation. */ vendorsDisclosed: Record; /** CMP API controls (manages __tcfapi) */ cmpApi: CMPApi | null; /** Active tab for the IAB preference center UI */ preferenceCenterTab: 'purposes' | 'vendors'; } /** * IAB TCF action methods. * * @remarks * These methods manage IAB consent state and are accessed via `store.iab?.methodName()`. * * @public */ export interface IABActions { /** * Sets IAB purpose consent. * * @param purposeId - IAB purpose ID (1-11) * @param value - Whether consent is granted */ setPurposeConsent: (purposeId: number, value: boolean) => void; /** * Sets IAB purpose legitimate interest. * * @param purposeId - IAB purpose ID (1-11) * @param value - Whether legitimate interest is established */ setPurposeLegitimateInterest: (purposeId: number, value: boolean) => void; /** * Sets IAB vendor consent. * * @param vendorId - IAB or custom vendor ID * @param value - Whether consent is granted */ setVendorConsent: (vendorId: number | string, value: boolean) => void; /** * Sets IAB vendor legitimate interest. * * @param vendorId - IAB or custom vendor ID * @param value - Whether legitimate interest is established */ setVendorLegitimateInterest: (vendorId: number | string, value: boolean) => void; /** * Sets special feature opt-in. * * @param featureId - IAB special feature ID (1-2) * @param value - Whether opt-in is granted */ setSpecialFeatureOptIn: (featureId: number, value: boolean) => void; /** * Sets the active tab for the IAB preference center. * * @param tab - The tab to show first */ setPreferenceCenterTab: (tab: 'purposes' | 'vendors') => void; /** * Accepts all IAB purposes, vendors, and special features. */ acceptAll: () => void; /** * Rejects all IAB purposes (except necessary/Purpose 1) and vendors. */ rejectAll: () => void; /** * Saves IAB consents and generates TC String. * * @returns Promise that resolves when consents are saved */ save: () => Promise; /** * Updates IAB state (internal use). * * @param updates - Partial IAB state to merge * @internal */ _updateState: (updates: Partial) => void; } /** * Combined IAB state and actions. * * @remarks * This is the type of `store.iab` when IAB mode is enabled. * When IAB is not configured, `store.iab` is `null`. * * @public */ export type IABManager = IABState & IABActions; /** * Configuration for creating a CMP API instance. * * When cmpId or cmpVersion are omitted, defaults from `~/cmp-defaults` are used. * * @internal */ export interface CMPApiConfig { /** CMP ID registered with IAB Europe. Provided by the backend (inth.com) or client config. */ cmpId?: number; /** CMP version (default: package version from ~/cmp-defaults) */ cmpVersion?: number | string; /** Global Vendor List data */ gvl: GlobalVendorList; /** Whether GDPR applies */ gdprApplies?: boolean; } /** * CMP API control interface returned by createCMPApi. * * @public */ export interface CMPApi { /** * Updates the consent state with a new TC String. * * @param tcString - The new TC String * @param consentData - The consent data used to generate the string */ updateConsent: (tcString: string, consentData?: TCFConsentData) => void; /** * Sets the display status of the CMP UI. * * @param status - The new display status */ setDisplayStatus: (status: 'visible' | 'hidden' | 'disabled') => void; /** * Loads consent from storage (cookie/localStorage). * * @returns The loaded TC String, or null if none found */ loadFromStorage: () => string | null; /** * Saves the current TC String to storage. * * @param tcString - The TC String to save */ saveToStorage: (tcString: string) => void; /** * Gets the current TC String. */ getTcString: () => string; /** * Destroys the CMP API instance and cleans up. */ destroy: () => void; } /** * Contract for the IAB addon module. * * @remarks * Injected via `iab()` from `@c15t/iab`. Core never imports IAB runtime * code directly — it calls these methods through the injected module. * * @public */ export interface IABModule { /** Creates the IAB manager instance for the store. */ createIABManager: (config: IABConfig, get: () => import('../../store/type').ConsentStoreState, set: (partial: Partial) => void, manager: import('../../client/client-interface').ConsentManagerInterface) => IABManager; /** Initializes IAB mode (stub, GVL, CMP API). */ initializeIABMode: (config: IABConfig, storeAccess: { get: () => import('../../store/type').ConsentStoreState; set: (partial: Partial) => void; }, prefetchedGVL?: import('../../types/iab-tcf').GlobalVendorList | null) => Promise; /** Fetches the Global Vendor List. Used by client fallback paths. */ fetchGVL?: (vendorIds?: number[]) => Promise; } /** * IAB configuration for the consent manager store. * * @public */ export interface IABConfig { /** * Enable IAB TCF 2.3 mode. * * When enabled, c15t will: * - Fetch GVL from gvl.inth.app * - Initialize __tcfapi CMP API * - Generate TC Strings for IAB compliance * * Note: Only works in 'hosted' client mode (legacy alias: 'c15t') because it requires a backend. */ enabled: boolean; /** * IAB runtime module injected by `@c15t/iab`. * * @remarks * This is set automatically by the `iab()` factory from `@c15t/iab`. * Do not set this manually — use `iab({ ... })` instead. * * @internal */ _module?: IABModule; /** * CMP ID registered with IAB Europe. * * When using inth.com as the backend, this is automatically provided * via the `/init` endpoint — no client-side configuration needed. * * Only set this if you self-host and have your own CMP registration. * A valid (non-zero) CMP ID is required for IAB TCF compliance. * * @see https://iabeurope.eu/cmp-list/ - List of registered CMPs * @see https://iabeurope.eu/tcf-for-cmps/ - CMP registration information */ cmpId?: number; /** * CMP version. When omitted, defaults to package version from `~/cmp-defaults` * (which uses ~/version). */ cmpVersion?: number | string; /** * IAB-registered vendor IDs to include (optional). * * Used to scope the vendor list when fetching GVL or when hosted fallback * paths are used (e.g. if GVL fetch fails). * * @example * ```typescript * vendors: [1, 2, 10, 755] * ``` */ vendors?: number[]; /** * Custom vendors not registered with IAB. * * These are displayed separately in the consent UI with a note * that they have different privacy practices than IAB vendors. */ customVendors?: NonIABVendor[]; /** * Publisher country code (2-letter ISO). * @default 'US' */ publisherCountryCode?: string; /** * Whether consent is service-specific (not global). * @default true */ isServiceSpecific?: boolean; /** * Pre-loaded Global Vendor List for testing or SSR. * * When provided, skips network fetch entirely. This is useful for: * - Testing (avoids network calls and mocking complexity) * - SSR (use server-fetched GVL) * - Offline/air-gapped deployments * * @example * ```typescript * iab: { * enabled: true, * gvl: preloadedGVL, // Skip network fetch * } * ``` */ gvl?: GlobalVendorList; } /** * Result of GVL fetch operation. * * @internal */ export interface FetchGVLResult { /** The fetched GVL */ gvl: GlobalVendorList; /** Whether this was served from cache */ fromCache: boolean; } /** * Storage keys for IAB TCF data. * * @internal */ export declare const IAB_STORAGE_KEYS: { /** TC String cookie name (per TCF spec) */ readonly TC_STRING_COOKIE: "euconsent-v2"; /** TC String localStorage key (use same key as cookie for consistency) */ readonly TC_STRING_LOCAL: "euconsent-v2"; }; /** * Default GVL endpoint. * * @internal */ export declare const GVL_ENDPOINT = "https://gvl.inth.app";