@cookieyes/core 0.1.0 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cookie.ts","../src/translations/en.ts","../src/i18n.ts","../src/scripts.ts","../src/sync.ts","../src/manager.ts","../src/network-blocker.ts","../src/runtime.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ConsentCategory, ConsentSnapshot, Regulation } from \"./types.js\";\n\nconst COOKIE_NAME = \"cookieyes-consent\";\nconst CONSENT_CATEGORIES: ConsentCategory[] = [\n \"necessary\",\n \"functional\",\n \"analytics\",\n \"performance\",\n \"advertisement\",\n];\n\ntype RawCookieFields = {\n consentid?: string;\n consent?: string;\n action?: string;\n necessary?: string;\n functional?: string;\n analytics?: string;\n performance?: string;\n advertisement?: string;\n lastRenewedDate?: string;\n};\n\nexport function parseCookie(raw: string): RawCookieFields {\n const fields: RawCookieFields = {};\n const pairs = raw.split(\",\");\n for (const pair of pairs) {\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim() as keyof RawCookieFields;\n const value = pair.slice(colonIdx + 1).trim();\n if (key in fields || VALID_KEYS.has(key)) {\n fields[key] = value;\n }\n }\n return fields;\n}\n\nconst VALID_KEYS = new Set<keyof RawCookieFields>([\n \"consentid\",\n \"consent\",\n \"action\",\n \"necessary\",\n \"functional\",\n \"analytics\",\n \"performance\",\n \"advertisement\",\n \"lastRenewedDate\",\n]);\n\nexport function serializeCookie(snapshot: ConsentSnapshot): string {\n const parts: string[] = [\n `consentid:${snapshot.consentId}`,\n `consent:${snapshot.hasActed ? \"yes\" : \"no\"}`,\n `action:${snapshot.hasActed ? \"yes\" : \"no\"}`,\n ];\n for (const cat of CONSENT_CATEGORIES) {\n parts.push(`${cat}:${snapshot.categories[cat] ? \"yes\" : \"no\"}`);\n }\n parts.push(`lastRenewedDate:${snapshot.lastRenewed ?? Date.now()}`);\n return parts.join(\",\");\n}\n\nexport function readConsentCookie(): RawCookieFields | null {\n if (typeof document === \"undefined\") return null;\n const cookies = document.cookie.split(\";\");\n for (const cookie of cookies) {\n const trimmed = cookie.trim();\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const name = trimmed.slice(0, eqIdx).trim();\n if (name === COOKIE_NAME) {\n const value = trimmed.slice(eqIdx + 1).trim();\n return parseCookie(decodeURIComponent(value));\n }\n }\n return null;\n}\n\nexport function writeConsentCookie(snapshot: ConsentSnapshot): void {\n if (typeof document === \"undefined\") return;\n const value = encodeURIComponent(serializeCookie(snapshot));\n const maxAge = 365 * 24 * 60 * 60; // 1 year\n document.cookie = `${COOKIE_NAME}=${value}; max-age=${maxAge}; path=/; SameSite=Lax`;\n}\n\nexport function clearConsentCookie(): void {\n if (typeof document === \"undefined\") return;\n document.cookie = `${COOKIE_NAME}=; max-age=0; path=/`;\n}\n\nexport function generateConsentId(): string {\n const array = new Uint8Array(32);\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n crypto.getRandomValues(array);\n } else {\n for (let i = 0; i < array.length; i++) {\n array[i] = Math.floor(Math.random() * 256);\n }\n }\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\")\n .slice(0, 44);\n}\n\nexport function rawFieldsToSnapshot(\n fields: RawCookieFields,\n regulation: Regulation,\n): ConsentSnapshot {\n const categories: Record<ConsentCategory, boolean> = {\n necessary: true,\n functional: fields.functional === \"yes\",\n analytics: fields.analytics === \"yes\",\n performance: fields.performance === \"yes\",\n advertisement: fields.advertisement === \"yes\",\n };\n\n return {\n consentId: fields.consentid ?? generateConsentId(),\n hasActed: fields.action === \"yes\",\n categories,\n regulation,\n lastRenewed: fields.lastRenewedDate ? Number(fields.lastRenewedDate) : undefined,\n };\n}\n\nexport function defaultSnapshot(consentId: string, regulation: Regulation): ConsentSnapshot {\n const isOptOut = regulation === \"CCPA\";\n return {\n consentId,\n hasActed: false,\n categories: {\n necessary: true,\n functional: isOptOut,\n analytics: isOptOut,\n performance: isOptOut,\n advertisement: isOptOut,\n },\n regulation,\n };\n}\n","import type { TranslationMap } from \"../types.js\";\n\nexport const en: TranslationMap = {\n bannerTitle: \"We value your privacy\",\n bannerDescription:\n \"We use cookies to enhance your browsing experience, serve personalised ads or content, and analyse our traffic. By clicking \\u201cAccept All\\u201d, you consent to our use of cookies.\",\n acceptAll: \"Accept All\",\n rejectAll: \"Reject All\",\n managePreferences: \"Customise\",\n savePreferences: \"Save My Preferences\",\n doNotSell: \"Do Not Sell or Share My Personal Information\",\n ccpaDescription:\n \"This website or its third-party tools process personal data. You can opt out of the sale of your personal information by clicking on the \\u201cDo Not Sell or Share My Personal Information\\u201d link.\",\n accept: \"Accept\",\n poweredBy: \"Powered by CookieYes\",\n preferencesTitle: \"Customise Consent Preferences\",\n preferencesIntro:\n \"We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.\",\n categories: {\n necessary: {\n label: \"Necessary\",\n description:\n \"Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.\",\n },\n functional: {\n label: \"Functional\",\n description:\n \"Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.\",\n },\n analytics: {\n label: \"Analytics\",\n description:\n \"Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.\",\n },\n performance: {\n label: \"Performance\",\n description:\n \"Performance cookies are used to understand and analyse the key performance indexes of the website which helps in delivering a better user experience for the visitors.\",\n },\n advertisement: {\n label: \"Advertisement\",\n description:\n \"Advertisement cookies are used to provide visitors with customised advertisements based on the pages you visited previously and to analyse the effectiveness of the ad campaigns.\",\n },\n },\n optOut: {\n title: \"Opt-out Preferences\",\n description:\n 'We use third-party cookies that help us analyse how you use this website, store your preferences, and provide the content and advertisements that are relevant to you. However, you can opt out of these cookies by checking \"Do Not Sell or Share My Personal Information\" and clicking the \"Save My Preferences\" button. Once you opt out, you can opt in again at any time by unchecking \"Do Not Sell or Share My Personal Information\" and clicking the \"Save My Preferences\" button.',\n cancel: \"Cancel\",\n successText: \"Your opt-out preference has been honored.\",\n successCountdown: \"Banner closes automatically in {seconds} s...\",\n },\n};\n","import { en } from \"./translations/en.js\";\nimport type { I18nConfig, TranslationMap } from \"./types.js\";\n\nexport { en as defaultTranslations };\n\nexport function resolveTranslations(i18n?: I18nConfig): TranslationMap {\n const messages = i18n?.messages ?? {};\n const detect = i18n?.detectBrowserLanguage ?? true;\n\n const candidates: string[] = [];\n if (i18n?.locale) candidates.push(i18n.locale);\n if (detect && typeof navigator !== \"undefined\" && navigator.language) {\n candidates.push(navigator.language);\n }\n\n for (const tag of candidates) {\n const primary = tag.split(\"-\")[0]?.toLowerCase() ?? \"\";\n const hit = messages[tag] ?? (primary ? messages[primary] : undefined);\n if (hit) return hit;\n }\n return messages.en ?? en;\n}\n","import type { ConsentCategory, ScriptEntry } from \"./types.js\";\n\nconst registry = new Map<string, ScriptEntry>();\nconst loaded = new Set<string>();\nconst injected = new Map<string, HTMLScriptElement>();\n\nexport function registerScript(entry: ScriptEntry): void {\n registry.set(entry.id, entry);\n}\n\nexport function applyScripts(categories: Record<ConsentCategory, boolean>): void {\n if (typeof document === \"undefined\") return;\n\n for (const [id, entry] of registry) {\n const allowed = categories[entry.category] === true;\n const strategy = entry.strategy ?? \"afterConsent\";\n\n if (allowed) {\n if (strategy === \"lazyOnce\" && loaded.has(id)) continue;\n if (!injected.has(id)) {\n injectScript(id, entry);\n }\n } else {\n removeScript(id);\n }\n }\n}\n\nfunction injectScript(id: string, entry: ScriptEntry): void {\n const existing = document.getElementById(id);\n if (existing) return;\n\n const el = document.createElement(\"script\");\n el.id = id;\n el.src = entry.src;\n el.async = true;\n if (entry.onLoad) {\n el.addEventListener(\"load\", entry.onLoad, { once: true });\n }\n document.head.appendChild(el);\n injected.set(id, el);\n loaded.add(id);\n}\n\nfunction removeScript(id: string): void {\n const el = injected.get(id);\n if (el) {\n el.remove();\n injected.delete(id);\n }\n}\n","import type { ConsentPayload, ConsentSnapshot } from \"./types.js\";\n\nexport function buildConsentPayload(snapshot: ConsentSnapshot): ConsentPayload {\n return {\n consentId: snapshot.consentId,\n categories: snapshot.categories,\n regulation: snapshot.regulation,\n domain: typeof window !== \"undefined\" ? window.location.hostname : \"unknown\",\n };\n}\n\nexport async function pushConsent(\n apiUrl: string,\n apiKey: string | undefined,\n snapshot: ConsentSnapshot,\n): Promise<void> {\n const payload = buildConsentPayload(snapshot);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n\n try {\n await fetch(apiUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n keepalive: true,\n });\n } catch {\n // Backend sync is best-effort — never fail the consent flow\n }\n}\n","import {\n clearConsentCookie,\n defaultSnapshot,\n generateConsentId,\n rawFieldsToSnapshot,\n readConsentCookie,\n writeConsentCookie,\n} from \"./cookie.js\";\nimport { applyScripts, registerScript } from \"./scripts.js\";\nimport { buildConsentPayload, pushConsent } from \"./sync.js\";\nimport type {\n ConsentCategory,\n ConsentConfig,\n ConsentManager,\n ConsentSnapshot,\n ScriptEntry,\n} from \"./types.js\";\n\nconst ALL_CATEGORIES: ConsentCategory[] = [\n \"necessary\",\n \"functional\",\n \"analytics\",\n \"performance\",\n \"advertisement\",\n];\n\nexport function createConsentManager(config: ConsentConfig): ConsentManager {\n const listeners = new Set<(state: ConsentSnapshot) => void>();\n\n let state: ConsentSnapshot;\n let isPreferencesOpen = false;\n let lastPersistedCategories: Record<ConsentCategory, boolean>;\n\n // --- Synchronous initialisation from cookie ---\n const rawFields = readConsentCookie();\n const savedRegulation = config.regulation ?? \"DEFAULT\";\n\n if (rawFields) {\n state = rawFieldsToSnapshot(rawFields, savedRegulation);\n } else {\n const consentId = generateConsentId();\n state = defaultSnapshot(consentId, savedRegulation);\n\n // CCPA is an opt-out model: consent is implicit from page load.\n // Write the cookie immediately so all-category values (yes) are available\n // to third-party scripts before the user has explicitly acted.\n if (state.regulation === \"CCPA\") {\n writeConsentCookie(state);\n }\n }\n lastPersistedCategories = { ...state.categories };\n\n // Fire onConsentReady synchronously on next tick.\n Promise.resolve().then(() => config.onConsentReady?.(state));\n\n function notify(): void {\n const snap = snapshot();\n for (const fn of listeners) fn(snap);\n applyScripts(state.categories);\n }\n\n function snapshot(): ConsentSnapshot {\n return {\n consentId: state.consentId,\n hasActed: state.hasActed,\n categories: { ...state.categories },\n regulation: state.regulation,\n lastRenewed: state.lastRenewed,\n };\n }\n\n function persist(): void {\n state = {\n ...state,\n hasActed: true,\n lastRenewed: Date.now(),\n };\n writeConsentCookie(state);\n if (config.backend) {\n // Best-effort: swallow both sync throws and async rejections so a\n // broken/missing backend never breaks the consent UX.\n try {\n Promise.resolve(config.backend.persist(buildConsentPayload(state))).catch(() => undefined);\n } catch {\n // sync throw from .persist itself\n }\n } else if (config.apiUrl) {\n void pushConsent(config.apiUrl, config.apiKey, state);\n }\n\n // Detect \"revoke\" — any category that was previously consented but now isn't.\n let didRevoke = false;\n for (const cat of ALL_CATEGORIES) {\n if (lastPersistedCategories[cat] && !state.categories[cat]) {\n didRevoke = true;\n break;\n }\n }\n lastPersistedCategories = { ...state.categories };\n\n notify();\n config.onConsentUpdate?.(state);\n\n // Reload after notify + callbacks fire so consumer code can observe the change.\n // pushConsent uses keepalive: true so it survives the navigation.\n if (didRevoke && config.reloadOnRevoke && typeof window !== \"undefined\") {\n window.location.reload();\n }\n }\n\n const manager: ConsentManager = {\n get consentId() {\n return state.consentId;\n },\n get hasActed() {\n return state.hasActed;\n },\n get categories() {\n return { ...state.categories };\n },\n get regulation() {\n return state.regulation;\n },\n get lastRenewed() {\n return state.lastRenewed;\n },\n get isPreferencesOpen() {\n return isPreferencesOpen;\n },\n\n acceptAll() {\n state = {\n ...state,\n categories: {\n necessary: true,\n functional: true,\n analytics: true,\n performance: true,\n advertisement: true,\n },\n };\n isPreferencesOpen = false;\n persist();\n },\n\n rejectAll() {\n state = {\n ...state,\n categories: {\n necessary: true,\n functional: false,\n analytics: false,\n performance: false,\n advertisement: false,\n },\n };\n isPreferencesOpen = false;\n persist();\n },\n\n acceptSelected(categories: ConsentCategory[]) {\n const cats = { ...state.categories };\n for (const cat of ALL_CATEGORIES) {\n if (cat === \"necessary\") continue;\n cats[cat] = categories.includes(cat);\n }\n state = { ...state, categories: cats };\n isPreferencesOpen = false;\n persist();\n },\n\n updateCategory(category: ConsentCategory, value: boolean) {\n if (category === \"necessary\") return;\n state = {\n ...state,\n categories: { ...state.categories, [category]: value },\n };\n notify();\n },\n\n savePreferences() {\n isPreferencesOpen = false;\n persist();\n },\n\n resetConsent() {\n clearConsentCookie();\n const consentId = generateConsentId();\n state = defaultSnapshot(consentId, state.regulation);\n isPreferencesOpen = false;\n notify();\n },\n\n showPreferences() {\n isPreferencesOpen = true;\n notify();\n },\n\n hidePreferences() {\n isPreferencesOpen = false;\n notify();\n },\n\n subscribe(listener: (state: ConsentSnapshot) => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n\n registerScript(entry: ScriptEntry) {\n registerScript(entry);\n applyScripts(state.categories);\n },\n };\n\n // Apply scripts for any that were already registered before manager created\n applyScripts(state.categories);\n\n return manager;\n}\n","import type { ConsentCategory } from \"./types.js\";\n\nexport type NetworkBlockerRule = {\n id: string;\n domain: string;\n pathIncludes?: string | undefined;\n methods?: string[] | undefined;\n category: ConsentCategory;\n};\n\nexport type BlockedRequestInfo = {\n rule: NetworkBlockerRule;\n url: string;\n method: string;\n};\n\nexport type NetworkBlockerConfig = {\n rules: NetworkBlockerRule[];\n onRequestBlocked?: ((info: BlockedRequestInfo) => void) | undefined;\n logBlockedRequests?: boolean | undefined;\n};\n\ntype ConsentChecker = (category: ConsentCategory) => boolean;\n\nfunction findBlockingRule(\n rules: NetworkBlockerRule[],\n url: string,\n method: string,\n hasConsent: ConsentChecker,\n): NetworkBlockerRule | null {\n let parsed: URL;\n try {\n const base = typeof window !== \"undefined\" ? window.location.href : \"http://localhost\";\n parsed = new URL(url, base);\n } catch {\n return null;\n }\n const host = parsed.hostname.toLowerCase();\n const path = parsed.pathname + parsed.search;\n const upperMethod = method.toUpperCase();\n\n for (const rule of rules) {\n const ruleHost = rule.domain.toLowerCase();\n if (host !== ruleHost && !host.endsWith(\".\" + ruleHost)) continue;\n if (rule.pathIncludes && !path.includes(rule.pathIncludes)) continue;\n if (rule.methods && !rule.methods.map((m) => m.toUpperCase()).includes(upperMethod)) {\n continue;\n }\n if (hasConsent(rule.category)) continue;\n return rule;\n }\n return null;\n}\n\ntype InstallationState = {\n originalFetch: typeof fetch;\n originalXhrOpen: typeof XMLHttpRequest.prototype.open;\n originalXhrSend: typeof XMLHttpRequest.prototype.send;\n};\n\nlet active: InstallationState | null = null;\n\nexport function installNetworkBlocker(\n config: NetworkBlockerConfig,\n hasConsent: ConsentChecker,\n): () => void {\n if (typeof window === \"undefined\") return () => undefined;\n if (active) return () => undefined;\n if (!config.rules.length) return () => undefined;\n\n const state: InstallationState = {\n originalFetch: window.fetch,\n originalXhrOpen: XMLHttpRequest.prototype.open,\n originalXhrSend: XMLHttpRequest.prototype.send,\n };\n active = state;\n\n const logBlocked = config.logBlockedRequests !== false;\n function notify(info: BlockedRequestInfo): void {\n if (logBlocked) {\n // eslint-disable-next-line no-console\n console.warn(\n `[cookieyes] blocked ${info.method} ${info.url} (rule \"${info.rule.id}\", category: ${info.rule.category})`,\n );\n }\n config.onRequestBlocked?.(info);\n }\n\n window.fetch = function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n let url = \"\";\n let method = init?.method ?? \"GET\";\n if (typeof input === \"string\") {\n url = input;\n } else if (input instanceof URL) {\n url = input.toString();\n } else {\n url = (input as Request).url;\n method = init?.method ?? (input as Request).method;\n }\n const blockingRule = findBlockingRule(config.rules, url, method, hasConsent);\n if (blockingRule) {\n notify({ rule: blockingRule, url, method });\n return Promise.reject(\n new TypeError(\n `Blocked by consent (rule: ${blockingRule.id}, category: ${blockingRule.category})`,\n ),\n );\n }\n return state.originalFetch.call(window, input, init);\n };\n\n type XHRMeta = { _cyUrl?: string; _cyMethod?: string };\n XMLHttpRequest.prototype.open = function patchedOpen(\n this: XMLHttpRequest & XHRMeta,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n this._cyUrl = url.toString();\n this._cyMethod = method;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return state.originalXhrOpen.apply(this, [method, url, ...rest] as any);\n };\n\n XMLHttpRequest.prototype.send = function patchedSend(\n this: XMLHttpRequest & XHRMeta,\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const url = this._cyUrl ?? \"\";\n const method = this._cyMethod ?? \"GET\";\n const blockingRule = findBlockingRule(config.rules, url, method, hasConsent);\n if (blockingRule) {\n notify({ rule: blockingRule, url, method });\n this.abort();\n return;\n }\n return state.originalXhrSend.call(this, body);\n };\n\n return uninstallNetworkBlocker;\n}\n\nexport function uninstallNetworkBlocker(): void {\n if (!active) return;\n if (typeof window !== \"undefined\") {\n window.fetch = active.originalFetch;\n XMLHttpRequest.prototype.open = active.originalXhrOpen;\n XMLHttpRequest.prototype.send = active.originalXhrSend;\n }\n active = null;\n}\n","import { createConsentManager } from \"./manager.js\";\nimport { installNetworkBlocker } from \"./network-blocker.js\";\nimport type {\n ActiveUI,\n ConsentCategory,\n ConsentChangePayload,\n ConsentConfig,\n ConsentRuntime,\n ConsentRuntimeOptions,\n ConsentStore,\n ConsentStoreState,\n} from \"./types.js\";\n\nfunction splitCategories(categories: Record<ConsentCategory, boolean>): ConsentChangePayload {\n const allowed: ConsentCategory[] = [];\n const denied: ConsentCategory[] = [];\n for (const cat of Object.keys(categories) as ConsentCategory[]) {\n if (categories[cat]) allowed.push(cat);\n else denied.push(cat);\n }\n return { allowedCategories: allowed, deniedCategories: denied };\n}\n\nlet _runtime: ConsentRuntime | null = null;\n\nexport function getOrCreateConsentRuntime(options: ConsentRuntimeOptions): ConsentRuntime {\n if (_runtime) return _runtime;\n\n const changeListeners = new Set<(payload: ConsentChangePayload) => void>();\n const userOnConsentUpdate = options.onConsentUpdate;\n\n const cfg: ConsentConfig = {};\n if (options.mode === \"self-hosted\") {\n if (options.backend) cfg.backend = options.backend;\n else if (options.backendURL) cfg.apiUrl = options.backendURL;\n }\n if (options.apiKey) cfg.apiKey = options.apiKey;\n if (options.overrides?.regulation) cfg.regulation = options.overrides.regulation;\n if (options.colorScheme) cfg.colorScheme = options.colorScheme;\n if (options.theme) cfg.theme = options.theme;\n if (options.reloadOnRevoke) cfg.reloadOnRevoke = options.reloadOnRevoke;\n if (options.onConsentReady) cfg.onConsentReady = options.onConsentReady;\n\n cfg.onConsentUpdate = (snap) => {\n userOnConsentUpdate?.(snap);\n const payload = splitCategories(snap.categories);\n for (const fn of changeListeners) fn(payload);\n };\n\n const manager = createConsentManager(cfg);\n\n function activeUI(): ActiveUI {\n if (manager.isPreferencesOpen) return \"dialog\";\n if (!manager.hasActed) return \"banner\";\n return null;\n }\n\n function buildState(): ConsentStoreState {\n const categories = manager.categories;\n return {\n consentId: manager.consentId,\n hasActed: manager.hasActed,\n categories,\n consents: categories,\n regulation: manager.regulation,\n lastRenewed: manager.lastRenewed,\n activeUI: activeUI(),\n has: (category) => manager.categories[category] ?? false,\n saveConsents: async (target) => {\n if (target === \"all\") manager.acceptAll();\n else if (target === \"necessary\") manager.rejectAll();\n else manager.acceptSelected(target);\n },\n setConsent: (category, value) => manager.updateCategory(category, value),\n subscribeToConsentChanges: (listener) => {\n changeListeners.add(listener);\n return () => {\n changeListeners.delete(listener);\n };\n },\n };\n }\n\n const consentStore: ConsentStore = {\n subscribe: (listener) => manager.subscribe(() => listener(buildState())),\n getState: buildState,\n };\n\n if (options.networkBlocker && options.networkBlocker.rules.length > 0) {\n installNetworkBlocker(options.networkBlocker, (cat) => manager.categories[cat] === true);\n }\n\n _runtime = { consentManager: manager, consentStore };\n return _runtime;\n}\n\nexport function resetConsentRuntime(): void {\n _runtime = null;\n}\n"]}
1
+ {"version":3,"file":"index.cjs","sources":["../src/cookie.ts","../src/categories.ts","../src/config.ts","../src/deprecations.ts","../src/google-consent-mode.ts","../src/translations/en.ts","../src/scripts.ts","../src/stop-handlers.ts","../src/sync.ts","../src/manager.ts","../src/network-blocker.ts","../src/runtime.ts","../src/i18n.ts"],"sourcesContent":["import type { ResolvedCategories } from \"./categories.js\";\nimport type { ConsentSnapshot, Regulation } from \"./types.js\";\n\nconst COOKIE_NAME = \"cookieyes-consent\";\n\n// Meta keys carry consent metadata; every other `key:value` pair in the cookie\n// is a category id → \"yes\"/\"no\", so custom taxonomies serialize without a\n// fixed schema. Exported so category validation can reject ids that would\n// collide with these (see resolveCategories) — a single source of truth.\nexport const COOKIE_META_KEYS = new Set([\n \"consentid\",\n \"consent\",\n \"action\",\n \"tax\",\n \"lastRenewedDate\",\n]);\n\nexport type RawCookieFields = {\n consentid?: string;\n consent?: string;\n action?: string;\n /** Taxonomy signature stored with the consent (see ResolvedCategories.taxonomyHash). */\n tax?: string;\n lastRenewedDate?: string;\n /** Every non-meta pair: category id → \"yes\" | \"no\". */\n categories: Record<string, string>;\n};\n\nexport function parseCookie(raw: string): RawCookieFields {\n const fields: RawCookieFields = { categories: {} };\n for (const pair of raw.split(\",\")) {\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const value = pair.slice(colonIdx + 1).trim();\n if (COOKIE_META_KEYS.has(key)) {\n (fields as Record<string, unknown>)[key] = value;\n } else if (key.length > 0) {\n fields.categories[key] = value;\n }\n }\n return fields;\n}\n\nexport function serializeCookie(snapshot: ConsentSnapshot): string {\n const parts: string[] = [\n `consentid:${snapshot.consentId}`,\n `consent:${snapshot.hasActed ? \"yes\" : \"no\"}`,\n `action:${snapshot.hasActed ? \"yes\" : \"no\"}`,\n ];\n if (snapshot.taxonomyHash) parts.push(`tax:${snapshot.taxonomyHash}`);\n for (const [id, granted] of Object.entries(snapshot.categories)) {\n parts.push(`${id}:${granted ? \"yes\" : \"no\"}`);\n }\n parts.push(`lastRenewedDate:${snapshot.lastRenewed ?? Date.now()}`);\n return parts.join(\",\");\n}\n\nexport function readConsentCookie(): RawCookieFields | null {\n if (typeof document === \"undefined\") return null;\n const cookies = document.cookie.split(\";\");\n for (const cookie of cookies) {\n const trimmed = cookie.trim();\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const name = trimmed.slice(0, eqIdx).trim();\n if (name === COOKIE_NAME) {\n const value = trimmed.slice(eqIdx + 1).trim();\n return parseCookie(decodeURIComponent(value));\n }\n }\n return null;\n}\n\nexport function writeConsentCookie(snapshot: ConsentSnapshot): void {\n if (typeof document === \"undefined\") return;\n const value = encodeURIComponent(serializeCookie(snapshot));\n const maxAge = 365 * 24 * 60 * 60; // 1 year\n document.cookie = `${COOKIE_NAME}=${value}; max-age=${maxAge}; path=/; SameSite=Lax`;\n}\n\nexport function clearConsentCookie(): void {\n if (typeof document === \"undefined\") return;\n document.cookie = `${COOKIE_NAME}=; max-age=0; path=/`;\n}\n\nexport function generateConsentId(): string {\n const array = new Uint8Array(32);\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n crypto.getRandomValues(array);\n } else {\n for (let i = 0; i < array.length; i++) {\n array[i] = Math.floor(Math.random() * 256);\n }\n }\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\")\n .slice(0, 44);\n}\n\n/**\n * Build a snapshot from stored cookie fields, against the *resolved* taxonomy.\n * Required categories are always granted; everything else reflects the stored\n * \"yes\"/\"no\" (absent → not granted). Carries the stored taxonomy hash so the\n * caller can detect a taxonomy change.\n */\nexport function rawFieldsToSnapshot(\n fields: RawCookieFields,\n regulation: Regulation,\n resolved: ResolvedCategories,\n): ConsentSnapshot {\n const categories: Record<string, boolean> = {};\n for (const id of resolved.ids) {\n categories[id] = resolved.requiredIds.has(id) ? true : fields.categories[id] === \"yes\";\n }\n return {\n consentId: fields.consentid ?? generateConsentId(),\n hasActed: fields.action === \"yes\",\n categories,\n regulation,\n lastRenewed: fields.lastRenewedDate ? Number(fields.lastRenewedDate) : undefined,\n taxonomyHash: fields.tax,\n };\n}\n\nexport function defaultSnapshot(\n consentId: string,\n regulation: Regulation,\n resolved: ResolvedCategories,\n): ConsentSnapshot {\n const isOptOut = regulation === \"CCPA\";\n const categories: Record<string, boolean> = {};\n for (const id of resolved.ids) {\n // CCPA is opt-out: everything implicitly on until the visitor opts out.\n // Otherwise only the required category(ies) start on.\n categories[id] = resolved.requiredIds.has(id) ? true : isOptOut;\n }\n return {\n consentId,\n hasActed: false,\n categories,\n regulation,\n taxonomyHash: resolved.taxonomyHash,\n };\n}\n","import { COOKIE_META_KEYS } from \"./cookie.js\";\nimport type { ConsentCategory } from \"./types.js\";\n\n/**\n * Google Consent Mode v2 storage/signal types. A category can declare which of\n * these it represents via {@link CategoryDef.gcm}; the SDK then broadcasts them\n * (see google-consent-mode.ts). `security_storage` is always granted and is\n * handled by the broadcast itself, so it never needs to be mapped.\n */\nexport type GoogleConsentSignal =\n | \"ad_storage\"\n | \"ad_user_data\"\n | \"ad_personalization\"\n | \"analytics_storage\"\n | \"functionality_storage\"\n | \"personalization_storage\"\n | \"security_storage\";\n\n/**\n * A single consent category. `id` is the stable key stored in the cookie and\n * used everywhere (banner, preferences, read APIs, integrations). Exactly one\n * category should be marked `required` — the always-on, non-optional one (like\n * the default \"necessary\") — flagged explicitly here, never inferred from a\n * name, so it survives full renaming.\n */\nexport type CategoryDef = {\n id: ConsentCategory;\n /** The always-on, non-optional category. At least one is required. */\n required?: boolean | undefined;\n /** Display label. Falls back to the translation for built-in ids. */\n label?: string | undefined;\n /** Display description. Falls back to the translation for built-in ids. */\n description?: string | undefined;\n /** Google Consent Mode signals this category governs (see {@link GoogleConsentSignal}). */\n gcm?: GoogleConsentSignal[] | undefined;\n};\n\n/**\n * The built-in five, used verbatim when a customer configures nothing. GCM\n * mapping mirrors production's `_ckySetGoogleConsentMode` (analytics →\n * analytics_storage, advertisement → the ad_* signals, functional →\n * functionality/personalization; performance maps to nothing; security_storage\n * is always granted by the broadcast).\n */\nexport const DEFAULT_CATEGORIES: CategoryDef[] = [\n { id: \"necessary\", required: true },\n { id: \"functional\", gcm: [\"functionality_storage\", \"personalization_storage\"] },\n { id: \"analytics\", gcm: [\"analytics_storage\"] },\n { id: \"performance\" },\n { id: \"advertisement\", gcm: [\"ad_storage\", \"ad_user_data\", \"ad_personalization\"] },\n];\n\nexport type ResolvedCategories = {\n /** Ordered category definitions actually in effect. */\n list: CategoryDef[];\n /** Ordered ids (fast access). */\n ids: ConsentCategory[];\n /** Ids marked `required` (always granted, never toggleable). */\n requiredIds: Set<ConsentCategory>;\n /** Stable signature of this taxonomy; a change here re-requests consent. */\n taxonomyHash: string;\n /** True when the built-in five are in effect (configured or fallback). */\n isDefault: boolean;\n};\n\n/** Small, stable non-crypto hash → short base36 string, for the cookie stamp. */\nfunction hashString(input: string): string {\n let h = 2166136261;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return (h >>> 0).toString(36);\n}\n\nfunction build(list: CategoryDef[], isDefault: boolean): ResolvedCategories {\n const ids = list.map((c) => c.id);\n const requiredIds = new Set(list.filter((c) => c.required).map((c) => c.id));\n // Signature includes id + required flag + gcm, so any meaningful change to\n // the taxonomy invalidates prior consent (see the manager's load check).\n const signature = list\n .map((c) => `${c.id}:${c.required ? 1 : 0}:${(c.gcm ?? []).join(\"+\")}`)\n .join(\"|\");\n return { list, ids, requiredIds, taxonomyHash: hashString(signature), isDefault };\n}\n\n/**\n * Validate a custom category config. Returns a human-readable reason if it's\n * invalid, or `null` if it's good. Order matters: the first failing rule wins.\n */\nfunction validationError(defs: CategoryDef[]): string | null {\n const ids = defs.map((d) => d.id);\n if (ids.some((id) => typeof id !== \"string\" || id.length === 0)) {\n return \"every category needs a non-empty string id\";\n }\n // `,` and `:` are the cookie's field/key delimiters — an id containing either\n // would corrupt persistence silently on the round-trip.\n if (ids.some((id) => id.includes(\",\") || id.includes(\":\"))) {\n return \"category ids must not contain ',' or ':'\";\n }\n if (new Set(ids).size !== ids.length) {\n return \"category ids must be unique\";\n }\n // Ids that would collide with the cookie's reserved metadata keys — a category\n // named e.g. \"consent\" or \"tax\" would corrupt persistence silently.\n if (ids.some((id) => COOKIE_META_KEYS.has(id))) {\n return `category ids must not be one of the reserved keys: ${[...COOKIE_META_KEYS].join(\", \")}`;\n }\n if (!defs.some((d) => d.required === true)) {\n return \"at least one category must be marked { required: true }\";\n }\n return null;\n}\n\n/**\n * Resolve the category list from config. Returns the built-in five when nothing\n * is configured. On an invalid custom config (empty, duplicate/reserved ids, or\n * no `required` category) it warns and falls back to the built-in five, rather\n * than leaving the visitor a broken/empty or unprotected setup.\n */\nexport function resolveCategories(defs?: CategoryDef[]): ResolvedCategories {\n if (!defs || defs.length === 0) return build(DEFAULT_CATEGORIES, true);\n\n const error = validationError(defs);\n if (error) {\n if (typeof console !== \"undefined\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[cookieyes] Invalid categories config (${error}). Falling back to the ` +\n \"default five (necessary, functional, analytics, performance, advertisement).\",\n );\n }\n return build(DEFAULT_CATEGORIES, true);\n }\n\n return build(defs, false);\n}\n","import type { CategoryDef } from \"./categories.js\";\nimport type { NetworkBlockerConfig } from \"./network-blocker.js\";\nimport type { BuiltInIntegration, StopHandler } from \"./stop-handlers.js\";\nimport type {\n ColorScheme,\n ConsentBackend,\n ConsentCategory,\n ConsentRuntimeMode,\n ConsentSnapshot,\n CookieYesConfig,\n I18nConfig,\n Regulation,\n ThemeConfig,\n} from \"./types.js\";\n\n/**\n * The canonical config with every deprecated alias already collapsed into its\n * top-level key. Both `@cookieyes/core` and `@cookieyes/react` consume the\n * output of {@link _normalizeConfig}, so alias resolution lives in exactly one\n * place and the two packages can never drift.\n *\n * @internal\n */\nexport type _NormalizedConfig = {\n mode: ConsentRuntimeMode;\n regulation?: Regulation | undefined;\n colorScheme?: ColorScheme | undefined;\n theme?: ThemeConfig | undefined;\n i18n?: I18nConfig | undefined;\n consentCategories?: ConsentCategory[] | undefined;\n categories?: CategoryDef[] | undefined;\n networkBlocker?: NetworkBlockerConfig | undefined;\n reloadOnRevoke?: boolean | undefined;\n integrations?: BuiltInIntegration[] | undefined;\n customStopHandlers?: StopHandler[] | undefined;\n onConsentReady?: ((state: ConsentSnapshot) => void) | undefined;\n onConsentUpdate?: ((state: ConsentSnapshot) => void) | undefined;\n apiUrl?: string | undefined;\n apiKey?: string | undefined;\n backend?: ConsentBackend | undefined;\n};\n\nfunction warn(message: string): void {\n if (typeof console !== \"undefined\") {\n // eslint-disable-next-line no-console\n console.warn(message);\n }\n}\n\n/**\n * Resolve a public {@link CookieYesConfig} into its canonical internal form.\n *\n * Deprecated aliases map silently to their canonical key when used alone; when\n * an alias and its canonical key are both present, the canonical key wins and\n * exactly one warning is logged for that collision.\n *\n * - `overrides.regulation` → `regulation`\n * - `backendURL` → `apiUrl`\n *\n * @internal\n */\nexport function _normalizeConfig(config: CookieYesConfig): _NormalizedConfig {\n const normalized: _NormalizedConfig = { mode: config.mode };\n\n // ── regulation (top-level) ⇐ deprecated overrides.regulation ──────────────\n const nestedRegulation = config.overrides?.regulation;\n if (config.regulation !== undefined) {\n normalized.regulation = config.regulation;\n if (nestedRegulation !== undefined) {\n warn(\n \"[CookieYes] Received both `regulation` and the deprecated \" +\n \"`overrides.regulation`. Using the top-level `regulation` and ignoring \" +\n \"`overrides`. Drop the `overrides` object — it is deprecated and will be \" +\n \"removed after three release cycles.\",\n );\n }\n } else if (nestedRegulation !== undefined) {\n normalized.regulation = nestedRegulation;\n }\n\n if (config.colorScheme !== undefined) normalized.colorScheme = config.colorScheme;\n if (config.theme !== undefined) normalized.theme = config.theme;\n if (config.i18n !== undefined) normalized.i18n = config.i18n;\n if (config.consentCategories !== undefined)\n normalized.consentCategories = config.consentCategories;\n if (config.categories !== undefined) normalized.categories = config.categories;\n if (config.networkBlocker !== undefined) normalized.networkBlocker = config.networkBlocker;\n if (config.reloadOnRevoke !== undefined) normalized.reloadOnRevoke = config.reloadOnRevoke;\n if (config.integrations !== undefined) normalized.integrations = config.integrations;\n if (config.customStopHandlers !== undefined)\n normalized.customStopHandlers = config.customStopHandlers;\n if (config.onConsentReady !== undefined) normalized.onConsentReady = config.onConsentReady;\n if (config.onConsentUpdate !== undefined) normalized.onConsentUpdate = config.onConsentUpdate;\n\n // ── backend keys (self-hosted only) ⇐ deprecated backendURL ───────────────\n if (config.mode === \"self-hosted\") {\n if (config.apiKey !== undefined) normalized.apiKey = config.apiKey;\n if (config.backend !== undefined) normalized.backend = config.backend;\n\n if (config.apiUrl !== undefined) {\n normalized.apiUrl = config.apiUrl;\n if (config.backendURL !== undefined) {\n warn(\n \"[CookieYes] Received both `apiUrl` and the deprecated `backendURL`. \" +\n \"Using `apiUrl` and ignoring `backendURL`. Rename `backendURL` to \" +\n \"`apiUrl` — the alias is deprecated and will be removed after three \" +\n \"release cycles.\",\n );\n }\n } else if (config.backendURL !== undefined) {\n normalized.apiUrl = config.backendURL;\n }\n }\n\n return normalized;\n}\n","let warnedOfflineMode = false;\n\n/**\n * One-time-per-page-load console warning for `mode: \"offline\"`.\n * Both @cookieyes/core and @cookieyes/react call this so the wording and the\n * \"once\" behavior stay identical no matter which package reads the setting.\n */\nexport function _warnOfflineModeDeprecated(): void {\n if (warnedOfflineMode) return;\n warnedOfflineMode = true;\n if (typeof console === \"undefined\") return;\n // eslint-disable-next-line no-console\n console.warn(\n '[cookieyes] mode: \"offline\" has been renamed to \"cookie-only\". Both do exactly ' +\n 'the same thing, but \"offline\" is deprecated and will be removed in 3 releases. ' +\n 'Update to .mode(\"cookie-only\") (or { mode: \"cookie-only\" }).',\n );\n}\n\n/** @internal test-only — resets the one-time warning guard between test cases. */\nexport function _resetOfflineModeWarning(): void {\n warnedOfflineMode = false;\n}\n","import type { GoogleConsentSignal, ResolvedCategories } from \"./categories.js\";\n\n/**\n * The full set of Google Consent Mode v2 signals. We always broadcast all\n * seven so any Google tag (GA4, Ads, GTM-managed tags) sees a complete picture,\n * rather than only the ones a customer happened to map.\n */\nconst ALL_SIGNALS: GoogleConsentSignal[] = [\n \"ad_storage\",\n \"ad_user_data\",\n \"ad_personalization\",\n \"analytics_storage\",\n \"functionality_storage\",\n \"personalization_storage\",\n \"security_storage\",\n];\n\ntype GcmValue = \"granted\" | \"denied\";\n\ntype WindowWithDataLayer = Window & {\n dataLayer?: unknown[];\n};\n\n/**\n * True when a Google `dataLayer` is present on the page. That's our single\n * trigger: if a dataLayer exists, some Google service is (or will be) listening,\n * so we broadcast. No dataLayer → no-op.\n */\nfunction hasDataLayer(): boolean {\n if (typeof window === \"undefined\") return false;\n return Array.isArray((window as WindowWithDataLayer).dataLayer);\n}\n\n/**\n * Compute the granted/denied value for every GCM signal from the current\n * category consent, using each category's `gcm` mapping.\n *\n * - A signal is `granted` if *any* granted category maps to it.\n * - `security_storage` is always `granted` (it's strictly necessary and not\n * consentable — this mirrors production's behaviour).\n * - A signal that no category maps to defaults to `denied`.\n */\nexport function computeGoogleConsent(\n resolved: ResolvedCategories,\n categories: Record<string, boolean>,\n): Record<GoogleConsentSignal, GcmValue> {\n const result = {} as Record<GoogleConsentSignal, GcmValue>;\n for (const signal of ALL_SIGNALS) {\n result[signal] = \"denied\";\n }\n // security_storage is never gated on consent.\n result.security_storage = \"granted\";\n\n for (const def of resolved.list) {\n if (!def.gcm || def.gcm.length === 0) continue;\n if (!categories[def.id]) continue;\n for (const signal of def.gcm) {\n result[signal] = \"granted\";\n }\n }\n return result;\n}\n\n/**\n * Push a Consent Mode `update` for all seven signals onto the dataLayer, if one\n * is present. Safe to call on load and on every consent change; a no-op when no\n * Google service is on the page.\n *\n * The customer is responsible for the Consent Mode *default* (the gtag snippet\n * that must run before their Google tags, typically denying everything). This\n * function owns the *update* that reflects the visitor's actual choice.\n */\nexport function broadcastGoogleConsent(\n resolved: ResolvedCategories,\n categories: Record<string, boolean>,\n): void {\n if (!hasDataLayer()) return;\n\n const consent = computeGoogleConsent(resolved, categories);\n const dataLayer = (window as WindowWithDataLayer).dataLayer;\n if (!dataLayer) return;\n\n // Emit the command in gtag's exact wire format: `gtag()` is defined as\n // `function gtag(){ dataLayer.push(arguments); }`, so Google's Consent Mode\n // reads back an *arguments object* — not a plain array. We reproduce that\n // shape here (rather than pushing an array) so every GTM/gtag version\n // recognises the `consent` command reliably, without needing a global\n // `gtag()` to already exist on the page. Empty params keep `arguments` legal;\n // the variable's type makes the 3-arg call typecheck.\n const gtag: (...args: unknown[]) => void = function () {\n // biome-ignore lint/complexity/noArguments: gtag's wire format IS the arguments object — this is the canonical Google snippet.\n dataLayer.push(arguments);\n };\n gtag(\"consent\", \"update\", consent);\n}\n","import type { TranslationMap } from \"../types.js\";\n\nexport const en: TranslationMap = {\n bannerTitle: \"We value your privacy\",\n bannerDescription:\n \"We use cookies to enhance your browsing experience, serve personalised ads or content, and analyse our traffic. By clicking \\u201cAccept All\\u201d, you consent to our use of cookies.\",\n acceptAll: \"Accept All\",\n rejectAll: \"Reject All\",\n managePreferences: \"Customise\",\n savePreferences: \"Save My Preferences\",\n doNotSell: \"Do Not Sell or Share My Personal Information\",\n ccpaDescription:\n \"This website or its third-party tools process personal data. You can opt out of the sale of your personal information by clicking on the \\u201cDo Not Sell or Share My Personal Information\\u201d link.\",\n accept: \"Accept\",\n poweredBy: \"Powered by CookieYes\",\n preferencesTitle: \"Customise Consent Preferences\",\n preferencesIntro:\n \"We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.\",\n categories: {\n necessary: {\n label: \"Necessary\",\n description:\n \"Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.\",\n },\n functional: {\n label: \"Functional\",\n description:\n \"Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.\",\n },\n analytics: {\n label: \"Analytics\",\n description:\n \"Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.\",\n },\n performance: {\n label: \"Performance\",\n description:\n \"Performance cookies are used to understand and analyse the key performance indexes of the website which helps in delivering a better user experience for the visitors.\",\n },\n advertisement: {\n label: \"Advertisement\",\n description:\n \"Advertisement cookies are used to provide visitors with customised advertisements based on the pages you visited previously and to analyse the effectiveness of the ad campaigns.\",\n },\n },\n optOut: {\n title: \"Opt-out Preferences\",\n description:\n 'We use third-party cookies that help us analyse how you use this website, store your preferences, and provide the content and advertisements that are relevant to you. However, you can opt out of these cookies by checking \"Do Not Sell or Share My Personal Information\" and clicking the \"Save My Preferences\" button. Once you opt out, you can opt in again at any time by unchecking \"Do Not Sell or Share My Personal Information\" and clicking the \"Save My Preferences\" button.',\n cancel: \"Cancel\",\n successText: \"Your opt-out preference has been honored.\",\n successCountdown: \"Banner closes automatically in {seconds} s...\",\n },\n reloadNotice: {\n message:\n \"Some tracking on this page can only be fully stopped by reloading. Reload to apply your change, or dismiss to keep browsing.\",\n reloadButton: \"Reload page\",\n dismissButton: \"Dismiss\",\n },\n};\n","import type { ScriptEntry } from \"./types.js\";\n\nconst registry = new Map<string, ScriptEntry>();\nconst injected = new Map<string, HTMLScriptElement>();\n\nexport function registerScript(entry: ScriptEntry): void {\n registry.set(entry.id, entry);\n}\n\n/**\n * Inject each registered script whose category is granted. Pass the *committed*\n * consent so an unsaved toggle never loads a script. Once injected, a script\n * stays — revoking doesn't unload it (that can't undo what already ran); the\n * block takes effect on the next page load.\n */\nexport function applyScripts(categories: Record<string, boolean>): void {\n if (typeof document === \"undefined\") return;\n\n for (const [id, entry] of registry) {\n if (categories[entry.category] !== true) continue;\n if (injected.has(id)) continue;\n injectScript(id, entry);\n }\n}\n\nfunction injectScript(id: string, entry: ScriptEntry): void {\n const existing = document.getElementById(id);\n if (existing) return;\n\n const el = document.createElement(\"script\");\n el.id = id;\n el.src = entry.src;\n el.async = true;\n if (entry.onLoad) {\n el.addEventListener(\"load\", entry.onLoad, { once: true });\n }\n document.head.appendChild(el);\n injected.set(id, el);\n}\n","import type { ConsentCategory } from \"./types.js\";\n\n/**\n * A tool that can be stopped (and optionally resumed) at runtime when consent\n * for its category changes — no page reload needed. `stop()` is called when the\n * category is revoked; `resume()` (if provided) when it's re-granted.\n *\n * If `stop()` throws, that tool is treated as \"couldn't be stopped cleanly\" and\n * falls back to the reload notice for that one tool — it never breaks the page.\n */\nexport type StopHandler = {\n id: string;\n category: ConsentCategory;\n stop: () => void;\n resume?: (() => void) | undefined;\n};\n\n/**\n * A tool with no known clean runtime stop — revoking its category can only be\n * fully applied by reloading the page. Registering one means \"if this category\n * is revoked, show the visitor the reload notice.\"\n */\nexport type ReloadOnlyHandler = {\n id: string;\n category: ConsentCategory;\n needsReload: true;\n};\n\nexport type AnyStopHandler = StopHandler | ReloadOnlyHandler;\n\nfunction isReloadOnly(h: AnyStopHandler): h is ReloadOnlyHandler {\n return \"needsReload\" in h && h.needsReload === true;\n}\n\n/**\n * Built-in, first-party integrations. Each maps to either a clean stop-handler\n * or a reload-only marker (see the audit in the README).\n *\n * Note: Google Analytics 4 and Google Tag Manager are **not** listed here.\n * They're governed by Google Consent Mode v2, which the SDK broadcasts\n * automatically whenever a `dataLayer` is present (see google-consent-mode.ts)\n * — on load and on every consent change, derived from each category's `gcm`\n * mapping. So you don't register them as integrations; just add the standard\n * Consent Mode default snippet and the SDK owns the updates.\n *\n * VERIFIED clean-stop vendors (documented, stable runtime opt-out):\n * - `meta` — `fbq('consent','revoke'|'grant')`, Meta's official consent API.\n *\n * The rest have no confident, documented runtime stop, so they're modelled as\n * reload-only (Story 1's honest answer). Upgrading any of them to a clean-stop\n * later is a one-line change here once a real API is confirmed.\n */\nexport type BuiltInIntegration =\n | { vendor: \"meta\"; category?: ConsentCategory | undefined }\n | { vendor: \"tiktok\"; category?: ConsentCategory | undefined }\n | { vendor: \"linkedin\"; category?: ConsentCategory | undefined }\n | { vendor: \"hotjar\"; category?: ConsentCategory | undefined }\n | { vendor: \"segment\"; category?: ConsentCategory | undefined };\n\ntype WindowWithVendors = Window &\n typeof globalThis & {\n fbq?: (...args: unknown[]) => void;\n };\n\nexport function resolveBuiltInIntegration(cfg: BuiltInIntegration): AnyStopHandler {\n switch (cfg.vendor) {\n case \"meta\":\n return {\n id: \"meta\",\n category: cfg.category ?? \"advertisement\",\n stop: () => (window as WindowWithVendors).fbq?.(\"consent\", \"revoke\"),\n resume: () => (window as WindowWithVendors).fbq?.(\"consent\", \"grant\"),\n };\n // No confident documented runtime stop — reload-only (see README audit).\n case \"tiktok\":\n return { id: \"tiktok\", category: cfg.category ?? \"advertisement\", needsReload: true };\n case \"linkedin\":\n return { id: \"linkedin\", category: cfg.category ?? \"advertisement\", needsReload: true };\n case \"hotjar\":\n return { id: \"hotjar\", category: cfg.category ?? \"analytics\", needsReload: true };\n case \"segment\":\n return { id: \"segment\", category: cfg.category ?? \"analytics\", needsReload: true };\n }\n}\n\n// --- Registry (module-level, mirrors scripts.ts) ---\n\nconst handlers = new Map<string, AnyStopHandler>();\n// Tracks which clean-stop handlers are currently in the \"stopped\" state, so we\n// only fire stop()/resume() on an actual transition, not on every save.\nconst stopped = new Set<string>();\n// Tracks reload-only handlers whose category is currently granted (so the tool\n// is presumed to be running). A reload notice is raised only when one of these\n// transitions granted → denied — i.e. a genuine withdrawal of something that\n// could be active — not on a standing/first-time reject where it never ran.\nconst reloadActive = new Set<string>();\n\nexport function registerStopHandler(handler: AnyStopHandler): void {\n handlers.set(handler.id, handler);\n}\n\n/** Test-only: reset registry + transition state between cases. */\nexport function _clearStopHandlers(): void {\n handlers.clear();\n stopped.clear();\n reloadActive.clear();\n}\n\nexport type StopHandlerResult = {\n /** Ids of reload-only tools just revoked (were granted, now denied). */\n reloadRequiredBy: string[];\n};\n\n/**\n * Reconcile every registered handler against the current consent state:\n * - clean handler denied → run `stop()` (once), or flag reload if it throws\n * - clean handler granted → run `resume()` (once) for anything previously stopped\n * - reload-only handler → flag reload only on a granted → denied transition\n *\n * Never throws: a failing `stop()` is downgraded to a reload requirement for\n * that one tool, so a broken handler can't break the page.\n */\nexport function applyStopHandlers(categories: Record<string, boolean>): StopHandlerResult {\n const reloadRequiredBy: string[] = [];\n\n for (const handler of handlers.values()) {\n const denied = categories[handler.category] !== true;\n\n if (isReloadOnly(handler)) {\n if (denied) {\n // Only a genuine revoke (was granted/active, now denied) warrants the\n // notice — a first-time or standing reject never had it running.\n if (reloadActive.has(handler.id)) {\n reloadRequiredBy.push(handler.id);\n reloadActive.delete(handler.id);\n }\n } else {\n reloadActive.add(handler.id);\n }\n continue;\n }\n\n if (denied) {\n if (!stopped.has(handler.id)) {\n try {\n handler.stop();\n stopped.add(handler.id);\n } catch {\n // Couldn't stop cleanly → fall back to the reload notice for this one.\n reloadRequiredBy.push(handler.id);\n }\n }\n } else if (stopped.has(handler.id)) {\n stopped.delete(handler.id);\n try {\n handler.resume?.();\n } catch {\n // A failed resume is non-fatal; the next accept re-attempts nothing\n // worse than the tool staying stopped until reload.\n }\n }\n }\n\n return { reloadRequiredBy };\n}\n\n/**\n * Load-time initialization: reflect the *full* stored consent state in both\n * directions, once, so tools start in the right mode from first paint.\n *\n * This is distinct from {@link applyStopHandlers} (which only fires on\n * transitions): a returning visitor who previously *granted* a category must\n * get a `resume()` at load — e.g. Consent Mode `update: granted` — otherwise\n * they stay stuck in the page's deny-by-default state despite having consented.\n * Denied categories get `stop()`. It never raises a reload notice (a fresh load\n * needs no \"reload to apply\"), but it *does* seed reload-only tools' active\n * state from the stored consent, so a later live revoke is correctly detected.\n */\nexport function initStopHandlers(categories: Record<string, boolean>): void {\n for (const handler of handlers.values()) {\n const denied = categories[handler.category] !== true;\n\n if (isReloadOnly(handler)) {\n // Seed active state (granted = presumed running) so a later granted →\n // denied revoke raises the notice; never raise it at load itself.\n if (denied) reloadActive.delete(handler.id);\n else reloadActive.add(handler.id);\n continue;\n }\n\n try {\n if (denied) {\n handler.stop();\n stopped.add(handler.id);\n } else {\n // Granted at load → reflect stored consent (e.g. Consent Mode grant).\n stopped.delete(handler.id);\n handler.resume?.();\n }\n } catch {\n // Never let a vendor handler break page load; state simply stays as-is.\n }\n }\n}\n","import type { ConsentPayload, ConsentSnapshot } from \"./types.js\";\n\nexport function buildConsentPayload(snapshot: ConsentSnapshot): ConsentPayload {\n return {\n consentId: snapshot.consentId,\n categories: snapshot.categories,\n regulation: snapshot.regulation,\n domain: typeof window !== \"undefined\" ? window.location.hostname : \"unknown\",\n };\n}\n\nexport async function pushConsent(\n apiUrl: string,\n apiKey: string | undefined,\n snapshot: ConsentSnapshot,\n): Promise<void> {\n const payload = buildConsentPayload(snapshot);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n\n try {\n await fetch(apiUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n keepalive: true,\n });\n } catch {\n // Backend sync is best-effort — never fail the consent flow\n }\n}\n","import { resolveCategories } from \"./categories.js\";\nimport {\n clearConsentCookie,\n defaultSnapshot,\n generateConsentId,\n rawFieldsToSnapshot,\n readConsentCookie,\n writeConsentCookie,\n} from \"./cookie.js\";\nimport { broadcastGoogleConsent } from \"./google-consent-mode.js\";\nimport { applyScripts, registerScript } from \"./scripts.js\";\nimport {\n applyStopHandlers,\n initStopHandlers,\n registerStopHandler,\n resolveBuiltInIntegration,\n} from \"./stop-handlers.js\";\nimport { buildConsentPayload, pushConsent } from \"./sync.js\";\nimport type {\n ConsentCategory,\n ConsentConfig,\n ConsentManager,\n ConsentSnapshot,\n ReloadNoticeState,\n ScriptEntry,\n} from \"./types.js\";\n\nexport function createConsentManager(config: ConsentConfig): ConsentManager {\n const listeners = new Set<(state: ConsentSnapshot) => void>();\n\n // Resolve the category taxonomy (built-in five, or the customer's, or a\n // validated fallback to the five). Everything below is driven by this.\n const resolved = resolveCategories(config.categories);\n\n let state: ConsentSnapshot;\n let isPreferencesOpen = false;\n let lastPersistedCategories: Record<string, boolean>;\n // Consent actually in effect — changes only on a real decision (accept /\n // reject / save / reset / load), never on a dialog toggle. Gating reads this;\n // `state.categories` stays live to drive the dialog checkboxes.\n let committedCategories: Record<string, boolean>;\n\n /** Build a category map over the resolved ids; required ids are always granted. */\n function buildCategories(\n grantNonRequired: (id: ConsentCategory) => boolean,\n ): Record<string, boolean> {\n const cats: Record<string, boolean> = {};\n for (const id of resolved.ids) {\n cats[id] = resolved.requiredIds.has(id) ? true : grantNonRequired(id);\n }\n return cats;\n }\n\n // Reload-notice state: `reasons` is the set of handler ids that currently\n // can't be stopped cleanly; `dismissed` suppresses the notice until a\n // genuinely different set of reasons appears (so it doesn't keep popping up).\n let reloadReasons: string[] = [];\n let reloadDismissed = false;\n\n // Register stop-handlers: built-in integrations + the customer's own.\n for (const integration of config.integrations ?? []) {\n registerStopHandler(resolveBuiltInIntegration(integration));\n }\n for (const handler of config.customStopHandlers ?? []) {\n registerStopHandler(handler);\n }\n\n // --- Synchronous initialisation from cookie ---\n const rawFields = readConsentCookie();\n const savedRegulation = config.regulation ?? \"DEFAULT\";\n\n // Decide whether stored consent is still valid for the current taxonomy:\n // - tax stamp matches → reuse it.\n // - legacy cookie (no stamp) on the default taxonomy → reuse it (upgrade-safe:\n // never resets existing users who were on the built-in five).\n // - otherwise (taxonomy changed) → re-request from scratch.\n const storedTax = rawFields?.tax;\n const taxMatches = storedTax === resolved.taxonomyHash;\n const legacyCookie = storedTax === undefined;\n const storedConsentValid =\n rawFields != null && (taxMatches || (legacyCookie && resolved.isDefault));\n\n if (rawFields != null && storedConsentValid) {\n state = rawFieldsToSnapshot(rawFields, savedRegulation, resolved);\n } else {\n const consentId = rawFields?.consentid ?? generateConsentId();\n state = defaultSnapshot(consentId, savedRegulation, resolved);\n // Taxonomy changed under an existing visitor → drop the stale cookie so we\n // genuinely re-request rather than leaving a mismatched record behind.\n if (rawFields != null) clearConsentCookie();\n\n // CCPA is an opt-out model: consent is implicit from page load.\n // Write the cookie immediately so all-category values (yes) are available\n // to third-party scripts before the user has explicitly acted.\n if (state.regulation === \"CCPA\") {\n writeConsentCookie(state);\n }\n }\n // The state's taxonomy is always the resolved one — stamp it so cookies\n // written from here on carry the current signature (upgrades legacy cookies).\n state = { ...state, taxonomyHash: resolved.taxonomyHash };\n lastPersistedCategories = { ...state.categories };\n committedCategories = { ...state.categories };\n\n // Fire onConsentReady synchronously on next tick.\n Promise.resolve().then(() => config.onConsentReady?.(state));\n\n function notify(): void {\n const snap = snapshot();\n for (const fn of listeners) fn(snap);\n // Scripts are applied from committed consent (below), not here — so a dialog\n // toggle, which calls notify, never loads a gated script before save.\n }\n\n /** Apply script gating against the committed consent, not the working toggles. */\n function applyCommittedScripts(): void {\n applyScripts(committedCategories);\n }\n\n function snapshot(): ConsentSnapshot {\n return {\n consentId: state.consentId,\n hasActed: state.hasActed,\n categories: { ...state.categories },\n regulation: state.regulation,\n lastRenewed: state.lastRenewed,\n taxonomyHash: state.taxonomyHash,\n };\n }\n\n function setReloadReasons(reasons: string[]): void {\n const changed =\n reasons.length !== reloadReasons.length || reasons.some((r, i) => r !== reloadReasons[i]);\n if (changed) {\n reloadReasons = reasons;\n // A genuinely new set of blocked tools → allow the notice to show again.\n reloadDismissed = false;\n }\n }\n\n function persist(): void {\n state = {\n ...state,\n hasActed: true,\n lastRenewed: Date.now(),\n };\n writeConsentCookie(state);\n if (config.backend) {\n // Best-effort: swallow both sync throws and async rejections so a\n // broken/missing backend never breaks the consent UX.\n try {\n Promise.resolve(config.backend.persist(buildConsentPayload(state))).catch(() => undefined);\n } catch {\n // sync throw from .persist itself\n }\n } else if (config.apiUrl) {\n void pushConsent(config.apiUrl, config.apiKey, state);\n }\n\n // Detect \"revoke\" — any category that was previously consented but now isn't.\n let didRevoke = false;\n for (const id of resolved.ids) {\n if (lastPersistedCategories[id] && !state.categories[id]) {\n didRevoke = true;\n break;\n }\n }\n lastPersistedCategories = { ...state.categories };\n // This is a real decision → commit it, and (re)apply script gating from it.\n committedCategories = { ...state.categories };\n applyCommittedScripts();\n\n // Stop (or resume) integrations to match the new consent state — without a\n // reload. Anything with no clean runtime stop comes back in reloadRequiredBy\n // and surfaces the reload notice instead of silently continuing to track.\n const { reloadRequiredBy } = applyStopHandlers(committedCategories);\n setReloadReasons(reloadRequiredBy);\n\n // Broadcast Google Consent Mode signals for the new state (no-op unless a\n // dataLayer is present). Derived from the category → GCM-signal mapping.\n broadcastGoogleConsent(resolved, committedCategories);\n\n notify();\n config.onConsentUpdate?.(state);\n\n // Legacy opt-in hard reload (off by default). The stop-handlers above are\n // the safe path; this remains only for customers who explicitly want it.\n // pushConsent uses keepalive: true so it survives the navigation.\n if (didRevoke && config.reloadOnRevoke && typeof window !== \"undefined\") {\n window.location.reload();\n }\n }\n\n const manager: ConsentManager = {\n get consentId() {\n return state.consentId;\n },\n get hasActed() {\n return state.hasActed;\n },\n get categories() {\n return { ...state.categories };\n },\n get committedCategories() {\n return { ...committedCategories };\n },\n get regulation() {\n return state.regulation;\n },\n get lastRenewed() {\n return state.lastRenewed;\n },\n get taxonomyHash() {\n return state.taxonomyHash;\n },\n get isPreferencesOpen() {\n return isPreferencesOpen;\n },\n\n acceptAll() {\n state = { ...state, categories: buildCategories(() => true) };\n isPreferencesOpen = false;\n persist();\n },\n\n rejectAll() {\n state = { ...state, categories: buildCategories(() => false) };\n isPreferencesOpen = false;\n persist();\n },\n\n acceptSelected(categories: ConsentCategory[]) {\n state = { ...state, categories: buildCategories((id) => categories.includes(id)) };\n isPreferencesOpen = false;\n persist();\n },\n\n updateCategory(category: ConsentCategory, value: boolean) {\n // Required categories are always on and can't be toggled off.\n if (resolved.requiredIds.has(category)) return;\n // Ignore ids that aren't part of the configured taxonomy.\n if (!resolved.ids.includes(category)) return;\n state = {\n ...state,\n categories: { ...state.categories, [category]: value },\n };\n notify();\n },\n\n savePreferences() {\n isPreferencesOpen = false;\n persist();\n },\n\n resetConsent() {\n clearConsentCookie();\n const consentId = generateConsentId();\n state = defaultSnapshot(consentId, state.regulation, resolved);\n committedCategories = { ...state.categories };\n lastPersistedCategories = { ...state.categories };\n isPreferencesOpen = false;\n // Realign clean-stop flags with the reset state; clear any reload notice\n // (a reset re-prompts, so a stale \"reload to apply\" message is wrong).\n applyStopHandlers(committedCategories);\n broadcastGoogleConsent(resolved, committedCategories);\n reloadReasons = [];\n reloadDismissed = false;\n notify();\n },\n\n showPreferences() {\n isPreferencesOpen = true;\n notify();\n },\n\n hidePreferences() {\n isPreferencesOpen = false;\n notify();\n },\n\n subscribe(listener: (state: ConsentSnapshot) => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n\n registerScript(entry: ScriptEntry) {\n registerScript(entry);\n applyCommittedScripts();\n },\n\n get reloadNotice(): ReloadNoticeState {\n return {\n required: reloadReasons.length > 0 && !reloadDismissed,\n reasons: [...reloadReasons],\n };\n },\n\n dismissReloadNotice() {\n if (reloadDismissed) return;\n reloadDismissed = true;\n notify();\n },\n };\n\n // Apply scripts for any that were already registered before manager created\n applyCommittedScripts();\n\n // Reflect the full stored consent at load — in both directions — so tools\n // start in the right mode from first paint. In particular a returning\n // visitor who previously *granted* a category gets a resume (e.g. Consent\n // Mode `update: granted`), instead of being stuck in the page's\n // deny-by-default state. No reload notice at load (that's only for live\n // revokes). Live changes after this go through applyStopHandlers.\n initStopHandlers(state.categories);\n\n // Broadcast the initial Consent Mode state on load (no-op unless a Google\n // dataLayer is present), so Google tags see the returning visitor's choice\n // — or the deny-by-default for a first-time visitor — from first paint.\n broadcastGoogleConsent(resolved, state.categories);\n\n return manager;\n}\n","import type { ConsentCategory } from \"./types.js\";\n\nexport type NetworkBlockerRule = {\n id: string;\n domain: string;\n pathIncludes?: string | undefined;\n methods?: string[] | undefined;\n category: ConsentCategory;\n};\n\nexport type BlockedRequestInfo = {\n rule: NetworkBlockerRule;\n url: string;\n method: string;\n};\n\nexport type NetworkBlockerConfig = {\n rules: NetworkBlockerRule[];\n onRequestBlocked?: ((info: BlockedRequestInfo) => void) | undefined;\n logBlockedRequests?: boolean | undefined;\n};\n\ntype ConsentChecker = (category: ConsentCategory) => boolean;\n\nfunction findBlockingRule(\n rules: NetworkBlockerRule[],\n url: string,\n method: string,\n hasConsent: ConsentChecker,\n): NetworkBlockerRule | null {\n let parsed: URL;\n try {\n const base = typeof window !== \"undefined\" ? window.location.href : \"http://localhost\";\n parsed = new URL(url, base);\n } catch {\n return null;\n }\n const host = parsed.hostname.toLowerCase();\n const path = parsed.pathname + parsed.search;\n const upperMethod = method.toUpperCase();\n\n for (const rule of rules) {\n const ruleHost = rule.domain.toLowerCase();\n if (host !== ruleHost && !host.endsWith(\".\" + ruleHost)) continue;\n if (rule.pathIncludes && !path.includes(rule.pathIncludes)) continue;\n if (rule.methods && !rule.methods.map((m) => m.toUpperCase()).includes(upperMethod)) {\n continue;\n }\n if (hasConsent(rule.category)) continue;\n return rule;\n }\n return null;\n}\n\ntype InstallationState = {\n originalFetch: typeof fetch;\n originalXhrOpen: typeof XMLHttpRequest.prototype.open;\n originalXhrSend: typeof XMLHttpRequest.prototype.send;\n originalSendBeacon: typeof navigator.sendBeacon | undefined;\n};\n\nlet active: InstallationState | null = null;\n\nexport function installNetworkBlocker(\n config: NetworkBlockerConfig,\n hasConsent: ConsentChecker,\n): () => void {\n if (typeof window === \"undefined\") return () => undefined;\n if (active) return () => undefined;\n if (!config.rules.length) return () => undefined;\n\n const state: InstallationState = {\n originalFetch: window.fetch,\n originalXhrOpen: XMLHttpRequest.prototype.open,\n originalXhrSend: XMLHttpRequest.prototype.send,\n // `navigator.sendBeacon` is how GA4, Meta, and others fire exit/unload\n // tracking — fetch/XHR interception alone misses it, so patch it too.\n // Store the raw reference (not bound) so uninstall restores it exactly.\n originalSendBeacon:\n typeof navigator !== \"undefined\" && typeof navigator.sendBeacon === \"function\"\n ? navigator.sendBeacon\n : undefined,\n };\n active = state;\n\n const logBlocked = config.logBlockedRequests !== false;\n function notify(info: BlockedRequestInfo): void {\n if (logBlocked) {\n // eslint-disable-next-line no-console\n console.warn(\n `[cookieyes] blocked ${info.method} ${info.url} (rule \"${info.rule.id}\", category: ${info.rule.category})`,\n );\n }\n config.onRequestBlocked?.(info);\n }\n\n window.fetch = function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n let url = \"\";\n let method = init?.method ?? \"GET\";\n if (typeof input === \"string\") {\n url = input;\n } else if (input instanceof URL) {\n url = input.toString();\n } else {\n url = (input as Request).url;\n method = init?.method ?? (input as Request).method;\n }\n const blockingRule = findBlockingRule(config.rules, url, method, hasConsent);\n if (blockingRule) {\n notify({ rule: blockingRule, url, method });\n return Promise.reject(\n new TypeError(\n `Blocked by consent (rule: ${blockingRule.id}, category: ${blockingRule.category})`,\n ),\n );\n }\n return state.originalFetch.call(window, input, init);\n };\n\n type XHRMeta = { _cyUrl?: string; _cyMethod?: string };\n XMLHttpRequest.prototype.open = function patchedOpen(\n this: XMLHttpRequest & XHRMeta,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n this._cyUrl = url.toString();\n this._cyMethod = method;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return state.originalXhrOpen.apply(this, [method, url, ...rest] as any);\n };\n\n XMLHttpRequest.prototype.send = function patchedSend(\n this: XMLHttpRequest & XHRMeta,\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const url = this._cyUrl ?? \"\";\n const method = this._cyMethod ?? \"GET\";\n const blockingRule = findBlockingRule(config.rules, url, method, hasConsent);\n if (blockingRule) {\n notify({ rule: blockingRule, url, method });\n this.abort();\n return;\n }\n return state.originalXhrSend.call(this, body);\n };\n\n if (state.originalSendBeacon) {\n const originalSendBeacon = state.originalSendBeacon;\n navigator.sendBeacon = function patchedSendBeacon(\n url: string | URL,\n data?: BodyInit | null,\n ): boolean {\n // sendBeacon is always a POST.\n const blockingRule = findBlockingRule(config.rules, url.toString(), \"POST\", hasConsent);\n if (blockingRule) {\n notify({ rule: blockingRule, url: url.toString(), method: \"POST\" });\n // Returning true tells the caller the beacon was \"queued\" — nothing is\n // actually sent. Returning false makes some libraries retry via other\n // transports, which we'd then also block; true is the quieter stop.\n return true;\n }\n return originalSendBeacon.call(navigator, url, data);\n };\n }\n\n return uninstallNetworkBlocker;\n}\n\nexport function uninstallNetworkBlocker(): void {\n if (!active) return;\n if (typeof window !== \"undefined\") {\n window.fetch = active.originalFetch;\n XMLHttpRequest.prototype.open = active.originalXhrOpen;\n XMLHttpRequest.prototype.send = active.originalXhrSend;\n if (active.originalSendBeacon) {\n navigator.sendBeacon = active.originalSendBeacon;\n }\n }\n active = null;\n}\n","import { _normalizeConfig } from \"./config.js\";\nimport { _warnOfflineModeDeprecated } from \"./deprecations.js\";\nimport { createConsentManager } from \"./manager.js\";\nimport { installNetworkBlocker } from \"./network-blocker.js\";\nimport type {\n ActiveUI,\n ConsentCategory,\n ConsentChangePayload,\n ConsentConfig,\n ConsentRuntime,\n ConsentStore,\n ConsentStoreState,\n CookieYesConfig,\n} from \"./types.js\";\n\nfunction splitCategories(categories: Record<string, boolean>): ConsentChangePayload {\n const allowed: ConsentCategory[] = [];\n const denied: ConsentCategory[] = [];\n for (const cat of Object.keys(categories) as ConsentCategory[]) {\n if (categories[cat]) allowed.push(cat);\n else denied.push(cat);\n }\n return { allowedCategories: allowed, deniedCategories: denied };\n}\n\nlet _runtime: ConsentRuntime | null = null;\n\nexport function getOrCreateConsentRuntime(config: CookieYesConfig): ConsentRuntime {\n if (_runtime) return _runtime;\n\n // `\"offline\"` is a deprecated alias for `\"cookie-only\"` — same behavior, one\n // warning per page load. Checked on the raw config before normalization.\n if (config.mode === \"offline\") _warnOfflineModeDeprecated();\n\n // Collapse deprecated aliases (`overrides.regulation` → `regulation`,\n // `backendURL` → `apiUrl`) into the one canonical shape both packages share.\n const options = _normalizeConfig(config);\n const changeListeners = new Set<(payload: ConsentChangePayload) => void>();\n const userOnConsentUpdate = options.onConsentUpdate;\n\n const cfg: ConsentConfig = {};\n if (options.mode === \"self-hosted\") {\n if (options.backend) cfg.backend = options.backend;\n else if (options.apiUrl) cfg.apiUrl = options.apiUrl;\n }\n if (options.apiKey) cfg.apiKey = options.apiKey;\n if (options.regulation) cfg.regulation = options.regulation;\n if (options.colorScheme) cfg.colorScheme = options.colorScheme;\n if (options.theme) cfg.theme = options.theme;\n if (options.reloadOnRevoke) cfg.reloadOnRevoke = options.reloadOnRevoke;\n if (options.integrations) cfg.integrations = options.integrations;\n if (options.customStopHandlers) cfg.customStopHandlers = options.customStopHandlers;\n if (options.categories) cfg.categories = options.categories;\n if (options.onConsentReady) cfg.onConsentReady = options.onConsentReady;\n\n cfg.onConsentUpdate = (snap) => {\n userOnConsentUpdate?.(snap);\n const payload = splitCategories(snap.categories);\n for (const fn of changeListeners) fn(payload);\n };\n\n const manager = createConsentManager(cfg);\n\n function activeUI(): ActiveUI {\n if (manager.isPreferencesOpen) return \"dialog\";\n if (!manager.hasActed) return \"banner\";\n return null;\n }\n\n function buildState(): ConsentStoreState {\n // `consents`/`categories` are live (drive checkboxes); `committedConsents`\n // and `has()` are the consent in effect (gate scripts/embeds on those).\n const categories = manager.categories;\n return {\n consentId: manager.consentId,\n hasActed: manager.hasActed,\n categories,\n consents: categories,\n committedConsents: manager.committedCategories,\n regulation: manager.regulation,\n lastRenewed: manager.lastRenewed,\n taxonomyHash: manager.taxonomyHash,\n activeUI: activeUI(),\n has: (category) => manager.committedCategories[category] === true,\n saveConsents: async (target) => {\n if (target === \"all\") manager.acceptAll();\n else if (target === \"necessary\") manager.rejectAll();\n else manager.acceptSelected(target);\n },\n setConsent: (category, value) => manager.updateCategory(category, value),\n subscribeToConsentChanges: (listener) => {\n changeListeners.add(listener);\n return () => {\n changeListeners.delete(listener);\n };\n },\n };\n }\n\n const consentStore: ConsentStore = {\n subscribe: (listener) => manager.subscribe(() => listener(buildState())),\n getState: buildState,\n };\n\n if (options.networkBlocker && options.networkBlocker.rules.length > 0) {\n installNetworkBlocker(\n options.networkBlocker,\n (cat) => manager.committedCategories[cat] === true,\n );\n }\n\n _runtime = { consentManager: manager, consentStore };\n return _runtime;\n}\n\n/**\n * Canonical setup entry point. Alias of {@link getOrCreateConsentRuntime} that\n * accepts the same {@link CookieYesConfig} and returns the same process-wide\n * singleton — provided so documentation can use one setup name (`initCookieYes`)\n * across every package.\n */\nexport function initCookieYes(config: CookieYesConfig): ConsentRuntime {\n return getOrCreateConsentRuntime(config);\n}\n\nexport function resetConsentRuntime(): void {\n _runtime = null;\n}\n","import { en } from \"./translations/en.js\";\nimport type { I18nConfig, TranslationMap } from \"./types.js\";\n\nexport { en as defaultTranslations };\n\nexport function resolveTranslations(i18n?: I18nConfig): TranslationMap {\n const messages = i18n?.messages ?? {};\n const detect = i18n?.detectBrowserLanguage ?? true;\n\n const candidates: string[] = [];\n if (i18n?.locale) candidates.push(i18n.locale);\n if (detect && typeof navigator !== \"undefined\" && navigator.language) {\n candidates.push(navigator.language);\n }\n\n for (const tag of candidates) {\n const primary = tag.split(\"-\")[0]?.toLowerCase() ?? \"\";\n const hit = messages[tag] ?? (primary ? messages[primary] : undefined);\n if (hit) return hit;\n }\n return messages.en ?? en;\n}\n"],"names":["COOKIE_NAME","COOKIE_META_KEYS","Set","parseCookie","raw","fields","categories","pair","split","colonIdx","indexOf","key","slice","trim","value","has","length","serializeCookie","snapshot","parts","consentId","hasActed","taxonomyHash","push","id","granted","Object","entries","lastRenewed","Date","now","join","writeConsentCookie","document","encodeURIComponent","cookie","clearConsentCookie","generateConsentId","array","Uint8Array","crypto","getRandomValues","i","Math","floor","random","btoa","String","fromCharCode","replace","defaultSnapshot","regulation","resolved","isOptOut","ids","requiredIds","DEFAULT_CATEGORIES","required","gcm","hashString","input","h","charCodeAt","imul","toString","build","list","isDefault","map","c","filter","signature","resolveCategories","defs","error","d","some","includes","size","validationError","console","warn","message","_normalizeConfig","config","normalized","mode","nestedRegulation","overrides","colorScheme","theme","i18n","consentCategories","networkBlocker","reloadOnRevoke","integrations","customStopHandlers","onConsentReady","onConsentUpdate","apiKey","backend","apiUrl","backendURL","warnedOfflineMode","_warnOfflineModeDeprecated","ALL_SIGNALS","computeGoogleConsent","result","signal","security_storage","def","broadcastGoogleConsent","window","Array","isArray","dataLayer","consent","arguments","gtag","en","bannerTitle","bannerDescription","acceptAll","rejectAll","managePreferences","savePreferences","doNotSell","ccpaDescription","accept","poweredBy","preferencesTitle","preferencesIntro","necessary","label","description","functional","analytics","performance","advertisement","optOut","title","cancel","successText","successCountdown","reloadNotice","reloadButton","dismissButton","registry","Map","injected","injectScript","entry","getElementById","el","createElement","src","async","onLoad","addEventListener","once","head","appendChild","set","isReloadOnly","needsReload","resolveBuiltInIntegration","cfg","vendor","category","stop","fbq","resume","handlers","stopped","reloadActive","registerStopHandler","handler","applyStopHandlers","reloadRequiredBy","values","denied","delete","add","buildConsentPayload","domain","location","hostname","createConsentManager","listeners","state","lastPersistedCategories","committedCategories","isPreferencesOpen","buildCategories","grantNonRequired","cats","reloadReasons","reloadDismissed","integration","rawFields","cookies","trimmed","eqIdx","decodeURIComponent","readConsentCookie","savedRegulation","storedTax","tax","taxMatches","storedConsentValid","consentid","action","lastRenewedDate","Number","rawFieldsToSnapshot","notify","snap","fn","applyCommittedScripts","applyScripts","persist","Promise","resolve","catch","payload","headers","Authorization","fetch","method","body","JSON","stringify","keepalive","pushConsent","didRevoke","reasons","r","reload","then","manager","acceptSelected","updateCategory","resetConsent","showPreferences","hidePreferences","subscribe","listener","registerScript","dismissReloadNotice","initStopHandlers","findBlockingRule","rules","url","hasConsent","parsed","base","href","URL","host","toLowerCase","path","pathname","search","upperMethod","toUpperCase","rule","ruleHost","endsWith","pathIncludes","methods","m","active","installNetworkBlocker","originalFetch","originalXhrOpen","XMLHttpRequest","prototype","open","originalXhrSend","send","originalSendBeacon","navigator","sendBeacon","logBlocked","logBlockedRequests","info","onRequestBlocked","init","blockingRule","reject","TypeError","call","rest","this","_cyUrl","_cyMethod","apply","abort","data","uninstallNetworkBlocker","_runtime","getOrCreateConsentRuntime","options","changeListeners","userOnConsentUpdate","allowed","cat","keys","allowedCategories","deniedCategories","splitCategories","buildState","consents","committedConsents","activeUI","saveConsents","target","setConsent","subscribeToConsentChanges","consentStore","getState","consentManager","clear","messages","detect","detectBrowserLanguage","candidates","locale","language","tag","primary","hit"],"mappings":"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"}