@pl4yzonellc/empire-analytics 0.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/core/environment.ts","../src/privacy/errors.ts","../src/privacy/rules.ts","../src/utils/logger.ts","../src/privacy/sanitize.ts","../src/privacy/path.ts","../src/utils/stable-stringify.ts","../src/core/config.ts","../src/utils/env.ts","../src/providers/plausible/script.ts","../src/providers/plausible/revenue.ts","../src/providers/plausible/package-runtime.ts","../src/providers/plausible/PlausibleAdapter.ts","../src/providers/console/ConsoleAdapter.ts","../src/providers/factory.ts","../src/core/AnalyticsClient.ts"],"names":["value"],"mappings":"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","file":"chunk-J5GXHJNU.js","sourcesContent":["/**\n * Error model.\n *\n * Every error the library surfaces is an {@link AnalyticsError} carrying a stable\n * machine-readable `code`. Provider implementation details are never leaked through\n * the `message`; the originating error (if any) is attached as `cause` for opt-in\n * inspection by `config.onError`.\n */\n\nexport type AnalyticsErrorCode =\n | 'config_invalid'\n | 'initialization_failed'\n | 'provider_unavailable'\n | 'script_load_failed'\n | 'track_failed'\n | 'pageview_failed'\n | 'destroy_failed'\n | 'privacy_violation'\n | 'unknown';\n\nexport interface AnalyticsErrorOptions {\n code?: AnalyticsErrorCode;\n cause?: unknown;\n}\n\nexport class AnalyticsError extends Error {\n readonly code: AnalyticsErrorCode;\n override readonly cause?: unknown;\n\n constructor(message: string, options: AnalyticsErrorOptions = {}) {\n super(message);\n this.name = 'AnalyticsError';\n this.code = options.code ?? 'unknown';\n if (options.cause !== undefined) {\n this.cause = options.cause;\n }\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown synchronously from `initialize()` when the supplied config is invalid. */\nexport class AnalyticsConfigError extends AnalyticsError {\n constructor(message: string, options: Omit<AnalyticsErrorOptions, 'code'> = {}) {\n super(message, { ...options, code: 'config_invalid' });\n this.name = 'AnalyticsConfigError';\n }\n}\n\n/**\n * Normalize an unknown thrown value into an {@link AnalyticsError} with a generic,\n * provider-neutral message. Existing `AnalyticsError`s pass through unchanged.\n */\nexport function toAnalyticsError(value: unknown, code: AnalyticsErrorCode): AnalyticsError {\n if (value instanceof AnalyticsError) {\n return value;\n }\n const message =\n value instanceof Error && value.message\n ? value.message\n : `Analytics operation failed (${code})`;\n return new AnalyticsError(message, { code, cause: value });\n}\n","import type { AnalyticsEnvironment } from './types';\n\nexport const ANALYTICS_ENVIRONMENTS: readonly AnalyticsEnvironment[] = [\n 'development',\n 'test',\n 'staging',\n 'production',\n];\n\nexport function isAnalyticsEnvironment(value: unknown): value is AnalyticsEnvironment {\n return typeof value === 'string' && (ANALYTICS_ENVIRONMENTS as readonly string[]).includes(value);\n}\n\n/**\n * Default enabled state per environment when `config.enabled` is not set.\n *\n * development → disabled\n * test → disabled\n * staging → disabled (opt in with `enabled: true`)\n * production → enabled\n */\nexport function defaultEnabledForEnvironment(environment: AnalyticsEnvironment): boolean {\n return environment === 'production';\n}\n\nexport function defaultDebugForEnvironment(environment: AnalyticsEnvironment): boolean {\n return environment === 'development';\n}\n","import { AnalyticsError } from '../core/errors';\n\nexport type PrivacyViolationCategory = 'sensitive' | 'pii';\n\n/**\n * Raised when a prohibited property reaches the sanitizer while the privacy policy\n * is configured to `throw` (development / debug default for `sensitive` keys).\n *\n * The error names the offending **key path only** — the value is never read,\n * stored, or logged.\n */\nexport class AnalyticsPrivacyError extends AnalyticsError {\n readonly key: string;\n readonly category: PrivacyViolationCategory;\n\n constructor(params: { key: string; category: PrivacyViolationCategory }) {\n super(`Analytics blocked a ${params.category} property: \"${params.key}\"`, {\n code: 'privacy_violation',\n });\n this.name = 'AnalyticsPrivacyError';\n this.key = params.key;\n this.category = params.category;\n }\n}\n","/**\n * Key classification rules.\n *\n * Two tiers:\n * - `sensitive` — always blocked. Credentials, tokens, card data, government ids.\n * - `pii` — direct personal identifiers. Blocked by default but configurable\n * (`privacy.onPii`), since some products legitimately need e.g. a\n * coarse `country`.\n *\n * Matching is done on a normalized key: lowercased, stripped of every non\n * alphanumeric character. `credit_card`, `credit-card`, `creditCard` and\n * `CreditCard` all normalize to `creditcard`.\n */\n\nexport type KeyClassification = 'sensitive' | 'pii' | null;\n\n/** Substring matches — catch prefixed/suffixed variants (`userPassword`, `stripeSecretKey`). */\nconst SENSITIVE_SUBSTRINGS: readonly string[] = [\n 'password',\n 'passphrase',\n 'passcode',\n 'pwd',\n 'secret',\n 'token',\n 'apikey',\n 'accesskey',\n 'privatekey',\n 'secretkey',\n 'clientsecret',\n 'authorization',\n 'bearer',\n 'credential',\n 'jwt',\n 'creditcard',\n 'cardnumber',\n 'cardno',\n 'cvv',\n 'cvc',\n 'cardsecuritycode',\n 'ssn',\n 'socialsecurity',\n 'sortcode',\n 'routingnumber',\n 'accountnumber',\n 'iban',\n 'bankaccount',\n];\n\n/** Exact matches only — too short/ambiguous for substring matching. */\nconst SENSITIVE_EXACT: ReadonlySet<string> = new Set([\n 'pin',\n 'otp',\n 'mfa',\n 'totp',\n 'auth',\n 'cookie',\n 'session',\n 'sessionid',\n 'salt',\n 'signature',\n 'sig',\n 'taxid',\n 'ein',\n 'nationalid',\n 'passportnumber',\n 'driverslicense',\n 'licensenumber',\n 'ccv',\n 'securitycode',\n]);\n\nconst PII_SUBSTRINGS: readonly string[] = [\n 'email',\n 'phone',\n 'firstname',\n 'lastname',\n 'fullname',\n 'givenname',\n 'familyname',\n 'streetaddress',\n 'homeaddress',\n 'mailingaddress',\n 'billingaddress',\n 'shippingaddress',\n];\n\nconst PII_EXACT: ReadonlySet<string> = new Set([\n 'phonenumber',\n 'mobilenumber',\n 'mobilephone',\n 'telephone',\n 'tel',\n 'address',\n 'dob',\n 'dateofbirth',\n 'birthdate',\n 'ipaddress',\n]);\n\n/** Exposed so consumers can inspect / document the defaults. */\nexport const DEFAULT_SENSITIVE_KEYS: readonly string[] = [\n ...SENSITIVE_SUBSTRINGS,\n ...SENSITIVE_EXACT,\n];\nexport const DEFAULT_PII_KEYS: readonly string[] = [...PII_SUBSTRINGS, ...PII_EXACT];\n\nexport function normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nexport interface KeyRuleOptions {\n /** Extra keys to always treat as `sensitive` (normalized substring match). */\n extraBlockedKeys?: readonly string[];\n /** Keys to force-allow even if a built-in rule would block them (normalized exact match). */\n allowKeys?: readonly string[];\n}\n\n/**\n * Classify a raw property key.\n *\n * Precedence: `allowKeys` → extra blocked → sensitive (built-in) → pii (built-in).\n */\nexport function classifyKey(rawKey: string, options: KeyRuleOptions = {}): KeyClassification {\n const normalized = normalizeKey(rawKey);\n if (normalized === '') {\n return null;\n }\n\n const allow = new Set((options.allowKeys ?? []).map(normalizeKey));\n if (allow.has(normalized)) {\n return null;\n }\n\n const extraBlocked = (options.extraBlockedKeys ?? []).map(normalizeKey);\n if (extraBlocked.some((term) => term !== '' && normalized.includes(term))) {\n return 'sensitive';\n }\n\n if (SENSITIVE_EXACT.has(normalized)) {\n return 'sensitive';\n }\n if (SENSITIVE_SUBSTRINGS.some((term) => normalized.includes(term))) {\n return 'sensitive';\n }\n\n if (PII_EXACT.has(normalized)) {\n return 'pii';\n }\n if (PII_SUBSTRINGS.some((term) => normalized.includes(term))) {\n return 'pii';\n }\n\n return null;\n}\n","/**\n * Tiny internal logger abstraction.\n *\n * The library never scatters `console.*` calls. All diagnostic output goes through\n * a `Logger`. When `debug` is off the logger is completely silent — production\n * behaviour is \"fail silently\" (errors are still routed to `config.onError`).\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface Logger {\n debug(message: string, data?: unknown): void;\n info(message: string, data?: unknown): void;\n warn(message: string, data?: unknown): void;\n error(message: string, data?: unknown): void;\n /** Returns a logger with an extra scope segment appended to the prefix. */\n child(scope: string): Logger;\n}\n\nexport type LoggerSink = Pick<Console, 'debug' | 'info' | 'warn' | 'error'>;\n\nexport interface LoggerOptions {\n debug?: boolean;\n prefix?: string;\n sink?: LoggerSink;\n}\n\nconst NOOP = (): void => undefined;\n\nconst SILENT_LOGGER: Logger = {\n debug: NOOP,\n info: NOOP,\n warn: NOOP,\n error: NOOP,\n child: () => SILENT_LOGGER,\n};\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { debug = false, prefix = '[Analytics]', sink } = options;\n\n if (!debug) {\n return SILENT_LOGGER;\n }\n\n const target: LoggerSink =\n sink ??\n (typeof console !== 'undefined'\n ? console\n : { debug: NOOP, info: NOOP, warn: NOOP, error: NOOP });\n\n const write =\n (level: LogLevel) =>\n (message: string, data?: unknown): void => {\n const line = `${prefix} ${message}`;\n if (data === undefined) {\n target[level](line);\n } else {\n target[level](line, data);\n }\n };\n\n const logger: Logger = {\n debug: write('debug'),\n info: write('info'),\n warn: write('warn'),\n error: write('error'),\n child: (scope: string) => createLogger({ debug, prefix: `${prefix} ${scope}`, sink }),\n };\n\n return logger;\n}\n\nexport { SILENT_LOGGER };\n","import { type Logger, SILENT_LOGGER } from '../utils/logger';\nimport { AnalyticsPrivacyError } from './errors';\nimport { classifyKey } from './rules';\nimport type { ResolvedPrivacyPolicy, SanitizeResult } from './types';\n\nconst DEFAULT_POLICY: ResolvedPrivacyPolicy = {\n onSensitive: 'strip',\n onPii: 'warn',\n blockKeys: [],\n allowKeys: [],\n maxDepth: 4,\n maxProperties: 64,\n maxStringLength: 1024,\n maxArrayLength: 64,\n};\n\n/** Merge a partial policy onto the built-in defaults. */\nexport function resolvePrivacyPolicy(\n partial: Partial<ResolvedPrivacyPolicy> = {},\n): ResolvedPrivacyPolicy {\n return { ...DEFAULT_POLICY, ...partial };\n}\n\ntype WalkOutcome = { keep: false } | { keep: true; value: unknown };\n\nconst DROP: WalkOutcome = { keep: false };\n\n/**\n * Sanitize a property bag before it reaches any adapter.\n *\n * Guarantees:\n * - prohibited keys (see {@link classifyKey}) are removed, warned, or throw\n * depending on `policy`\n * - functions, symbols, `undefined`, `null`, `NaN`/`Infinity` are dropped\n * - `Date` → ISO string, `bigint` → decimal string\n * - circular references are broken (the offending branch is dropped)\n * - depth, property count, string length and array length are capped\n * - prohibited **values** are never read, logged, or included in the result\n */\nexport function sanitizeProperties(\n input: Record<string, unknown> | undefined,\n policy: ResolvedPrivacyPolicy = DEFAULT_POLICY,\n logger: Logger = SILENT_LOGGER,\n): SanitizeResult {\n const blocked: string[] = [];\n const seen = new WeakSet<object>();\n let kept = 0;\n\n const handleViolation = (path: string, category: 'sensitive' | 'pii'): void => {\n blocked.push(path);\n const mode = category === 'sensitive' ? policy.onSensitive : policy.onPii;\n if (mode === 'throw') {\n throw new AnalyticsPrivacyError({ key: path, category });\n }\n if (mode === 'warn') {\n logger.warn(`Blocked ${category} property \"${path}\" (value omitted)`);\n }\n };\n\n const walkValue = (value: unknown, depth: number, path: string): WalkOutcome => {\n if (value === null || value === undefined) return DROP;\n\n switch (typeof value) {\n case 'function':\n case 'symbol':\n logger.debug(`Dropped ${typeof value} value at \"${path}\"`);\n return DROP;\n case 'bigint':\n return { keep: true, value: value.toString() };\n case 'boolean':\n return { keep: true, value };\n case 'number':\n return Number.isFinite(value) ? { keep: true, value } : DROP;\n case 'string':\n return {\n keep: true,\n value:\n value.length > policy.maxStringLength ? value.slice(0, policy.maxStringLength) : value,\n };\n default:\n break;\n }\n\n if (value instanceof Date) {\n return Number.isFinite(value.getTime()) ? { keep: true, value: value.toISOString() } : DROP;\n }\n\n // `typeof value === 'object'` and not null at this point.\n if (typeof value !== 'object' || value === null) return DROP;\n\n if (seen.has(value)) {\n logger.debug(`Dropped circular reference at \"${path}\"`);\n return DROP;\n }\n if (depth >= policy.maxDepth) {\n logger.debug(`Dropped value at \"${path}\" (max depth ${policy.maxDepth})`);\n return DROP;\n }\n seen.add(value);\n\n let outcome: WalkOutcome;\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n for (const item of (value as unknown[]).slice(0, policy.maxArrayLength)) {\n const child = walkValue(item, depth + 1, `${path}[]`);\n if (child.keep) out.push(child.value);\n }\n outcome = { keep: true, value: out };\n } else {\n outcome = {\n keep: true,\n value: walkObject(value as Record<string, unknown>, depth, path),\n };\n }\n\n seen.delete(value);\n return outcome;\n };\n\n const walkObject = (\n obj: Record<string, unknown>,\n depth: number,\n parentPath: string,\n ): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(obj)) {\n const path = parentPath ? `${parentPath}.${key}` : key;\n const classification = classifyKey(key, {\n extraBlockedKeys: policy.blockKeys,\n allowKeys: policy.allowKeys,\n });\n\n if (classification === 'sensitive') {\n handleViolation(path, 'sensitive');\n continue;\n }\n if (classification === 'pii') {\n if (policy.onPii === 'allow') {\n // fall through and keep the value\n } else {\n handleViolation(path, 'pii');\n continue;\n }\n }\n\n if (kept >= policy.maxProperties) {\n logger.debug(`Reached max property count (${policy.maxProperties}); dropping \"${path}\"`);\n continue;\n }\n\n const child = walkValue(raw, depth + 1, path);\n if (child.keep) {\n out[key] = child.value;\n kept += 1;\n }\n }\n return out;\n };\n\n const root = input ?? {};\n seen.add(root);\n const value = walkObject(root, 0, '');\n return { value, blocked };\n}\n","import { classifyKey } from './rules';\n\n/**\n * Strip query-string parameters whose key classifies as `sensitive` from a URL or\n * path. Used before a path is handed to a provider for explicit page-view tracking,\n * so a stray `?token=…` or `?password=…` never leaves the browser as analytics data.\n *\n * PII params (e.g. `?email=`) are intentionally left intact here — removing them\n * would frequently corrupt legitimate campaign/referrer analytics. Callers that\n * need PII stripped should not put PII in URLs.\n */\nexport function stripSensitiveQueryParams(pathOrUrl: string): string {\n const queryIndex = pathOrUrl.indexOf('?');\n if (queryIndex === -1) {\n return pathOrUrl;\n }\n\n const base = pathOrUrl.slice(0, queryIndex);\n const afterQuery = pathOrUrl.slice(queryIndex + 1);\n\n const hashIndex = afterQuery.indexOf('#');\n const rawQuery = hashIndex === -1 ? afterQuery : afterQuery.slice(0, hashIndex);\n const hash = hashIndex === -1 ? '' : afterQuery.slice(hashIndex);\n\n if (rawQuery === '') {\n return pathOrUrl;\n }\n\n const kept: string[] = [];\n for (const pair of rawQuery.split('&')) {\n if (pair === '') continue;\n const eq = pair.indexOf('=');\n const key = decodeURIComponentSafe(eq === -1 ? pair : pair.slice(0, eq));\n if (classifyKey(key) === 'sensitive') {\n continue;\n }\n kept.push(pair);\n }\n\n const query = kept.length > 0 ? `?${kept.join('&')}` : '';\n return `${base}${query}${hash}`;\n}\n\nfunction decodeURIComponentSafe(value: string): string {\n try {\n return decodeURIComponent(value.replace(/\\+/g, ' '));\n } catch {\n return value;\n }\n}\n","/**\n * Deterministic stringification used to build a stable \"signature\" for a config\n * object. Keys are sorted, functions collapse to a constant token (so changing a\n * callback identity does not change the signature), and cycles are tolerated.\n *\n * This is intentionally not a general-purpose serializer — it exists only so the\n * React provider can decide whether a config change is meaningful enough to\n * re-initialize the client.\n */\nexport function stableStringify(value: unknown): string {\n const seen = new WeakSet<object>();\n\n const walk = (input: unknown): string => {\n if (input === null) return 'null';\n if (input === undefined) return 'undefined';\n\n if (typeof input === 'function') return '\"[fn]\"';\n if (typeof input === 'symbol') return '\"[symbol]\"';\n if (typeof input === 'string') return JSON.stringify(input);\n if (typeof input === 'boolean') return input ? 'true' : 'false';\n if (typeof input === 'bigint') return `\"${input.toString()}n\"`;\n if (typeof input === 'number') return Number.isFinite(input) ? `${input}` : '\"[number]\"';\n\n if (typeof input === 'object') {\n if (seen.has(input)) return '\"[circular]\"';\n seen.add(input);\n\n let result: string;\n if (Array.isArray(input)) {\n result = `[${input.map((item: unknown) => walk(item)).join(',')}]`;\n } else {\n const record = input as Record<string, unknown>;\n const keys = Object.keys(record).sort();\n result = `{${keys.map((key) => `${JSON.stringify(key)}:${walk(record[key])}`).join(',')}}`;\n }\n\n seen.delete(input);\n return result;\n }\n\n return '\"[unknown]\"';\n };\n\n return walk(value);\n}\n","import { AnalyticsConfigError } from './errors';\nimport {\n defaultDebugForEnvironment,\n defaultEnabledForEnvironment,\n isAnalyticsEnvironment,\n} from './environment';\nimport type { AnalyticsConfig, ResolvedAnalyticsConfig } from './types';\nimport { stableStringify } from '../utils/stable-stringify';\nimport type {\n PiiMode,\n PrivacyConfig,\n PrivacyViolationMode,\n ResolvedPrivacyPolicy,\n} from '../privacy/types';\nimport type { ResolvedPlausibleConfig } from '../providers/plausible/types';\nimport type { ResolvedConsoleConfig } from '../providers/console/types';\n\nfunction resolvePrivacy(\n privacy: PrivacyConfig | undefined,\n environment: ResolvedAnalyticsConfig['environment'],\n debug: boolean,\n): ResolvedPrivacyPolicy {\n const isProduction = environment === 'production';\n\n const defaultSensitive: PrivacyViolationMode = debug ? 'throw' : isProduction ? 'strip' : 'warn';\n\n let onSensitive: PrivacyViolationMode = privacy?.onSensitive ?? defaultSensitive;\n let onPii: PiiMode = privacy?.onPii ?? 'warn';\n\n // Analytics must never crash a production app.\n if (isProduction && onSensitive === 'throw') onSensitive = 'strip';\n if (isProduction && onPii === 'throw') onPii = 'warn';\n\n const clampPositive = (value: number | undefined, fallback: number): number =>\n typeof value === 'number' && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;\n\n return {\n onSensitive,\n onPii,\n blockKeys: privacy?.blockKeys ?? [],\n allowKeys: privacy?.allowKeys ?? [],\n maxDepth: clampPositive(privacy?.maxDepth, 4),\n maxProperties: clampPositive(privacy?.maxProperties, 64),\n maxStringLength: clampPositive(privacy?.maxStringLength, 1024),\n maxArrayLength: clampPositive(privacy?.maxArrayLength, 64),\n };\n}\n\nfunction resolvePlausible(config: Extract<AnalyticsConfig, { provider: 'plausible' }>): {\n resolved: ResolvedPlausibleConfig;\n} {\n const p = config.plausible;\n if (!p || typeof p.domain !== 'string' || p.domain.trim() === '') {\n throw new AnalyticsConfigError(\n \"Plausible provider requires a non-empty `plausible.domain` (e.g. 'example.com').\",\n );\n }\n\n const resolved: ResolvedPlausibleConfig = {\n domain: p.domain.trim(),\n mode: p.mode === 'package' ? 'package' : 'cdn',\n injectScript: p.injectScript ?? true,\n autoPageViews: p.autoPageViews ?? true,\n hashRouting: p.hashRouting ?? false,\n outboundLinks: p.outboundLinks ?? false,\n fileDownloads: p.fileDownloads ?? false,\n taggedEvents: p.taggedEvents ?? false,\n revenue: p.revenue ?? true,\n trackLocalhost: p.trackLocalhost ?? false,\n };\n if (p.scriptUrl) resolved.scriptUrl = p.scriptUrl;\n if (p.endpoint) resolved.endpoint = p.endpoint;\n\n return { resolved };\n}\n\nfunction resolveConsole(\n config: Extract<AnalyticsConfig, { provider: 'console' }>,\n): ResolvedConsoleConfig {\n const c = config.console;\n const fallbackSink: ResolvedConsoleConfig['sink'] =\n typeof console !== 'undefined'\n ? console\n : {\n log: () => undefined,\n info: () => undefined,\n group: () => undefined,\n groupEnd: () => undefined,\n };\n return {\n sink: c?.sink ?? fallbackSink,\n prefix: c?.prefix ?? '[Analytics:console]',\n };\n}\n\n/**\n * Validate + normalize an {@link AnalyticsConfig}. Throws {@link AnalyticsConfigError}\n * synchronously for structural problems (unknown environment/provider, missing\n * Plausible domain, missing custom adapter).\n */\nexport function resolveConfig(config: AnalyticsConfig): ResolvedAnalyticsConfig {\n if (config == null || typeof config !== 'object') {\n throw new AnalyticsConfigError('Analytics config must be an object.');\n }\n\n if (!isAnalyticsEnvironment(config.environment)) {\n throw new AnalyticsConfigError(\n `Unknown environment \"${String(\n config.environment,\n )}\". Expected: development | test | staging | production.`,\n );\n }\n const environment = config.environment;\n\n const providerName: string = config.provider;\n if (providerName !== 'plausible' && providerName !== 'console' && providerName !== 'custom') {\n throw new AnalyticsConfigError(\n `Unknown provider \"${providerName}\". Expected: plausible | console | custom.`,\n );\n }\n\n const enabledExplicit = typeof config.enabled === 'boolean';\n const enabled = enabledExplicit\n ? (config.enabled as boolean)\n : defaultEnabledForEnvironment(environment);\n const disabledReason = enabled\n ? undefined\n : enabledExplicit\n ? 'analytics disabled by config (enabled: false)'\n : `analytics disabled by default for the \"${environment}\" environment`;\n\n const debug =\n typeof config.debug === 'boolean' ? config.debug : defaultDebugForEnvironment(environment);\n\n const resolved: ResolvedAnalyticsConfig = {\n provider: config.provider,\n environment,\n enabled,\n debug,\n includeTenantKey: config.includeTenantKey ?? false,\n tenantPropertyName: config.tenantPropertyName ?? 'tenant',\n defaultProperties: { ...config.defaultProperties },\n privacy: resolvePrivacy(config.privacy, environment, debug),\n };\n\n if (disabledReason) resolved.disabledReason = disabledReason;\n if (typeof config.tenantKey === 'string' && config.tenantKey !== '') {\n resolved.tenantKey = config.tenantKey;\n }\n if (config.onError) resolved.onError = config.onError;\n if (config.onEvent) resolved.onEvent = config.onEvent;\n\n if (config.provider === 'plausible') {\n resolved.plausible = resolvePlausible(config).resolved;\n } else if (config.provider === 'console') {\n resolved.console = resolveConsole(config);\n } else {\n if (typeof config.adapter !== 'function') {\n throw new AnalyticsConfigError(\n \"Custom provider requires an `adapter` factory: { provider: 'custom', adapter: (ctx) => AnalyticsAdapter }.\",\n );\n }\n resolved.adapter = config.adapter;\n }\n\n return resolved;\n}\n\n/**\n * Stable signature of the meaningful parts of a config. Function-valued fields\n * (`onError`, `onEvent`, custom `adapter`) collapse to constants so that changing\n * a callback identity does not force a re-initialization.\n */\nexport function configSignature(config: AnalyticsConfig): string {\n return stableStringify(config);\n}\n","/**\n * SSR-safe access to browser globals.\n *\n * The library primarily targets React 19 + Vite browser apps, but must not throw\n * when evaluated in a non-browser context (SSR, unit tests without jsdom, workers).\n */\n\nexport function getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== 'undefined' ? window : undefined;\n}\n\nexport function getDocument(): Document | undefined {\n return typeof document !== 'undefined' ? document : undefined;\n}\n\nexport function isBrowser(): boolean {\n return getWindow() !== undefined && getDocument() !== undefined;\n}\n","import { AnalyticsError } from '../../core/errors';\nimport { type Logger, SILENT_LOGGER } from '../../utils/logger';\nimport { getDocument, getWindow } from '../../utils/env';\nimport type { PlausibleBrowserWindow, PlausibleFunction, PlausibleScriptExtension } from './types';\n\nconst SCRIPT_MARKER = 'data-empire-analytics';\nconst SCRIPT_MARKER_VALUE = 'plausible';\nconst DEFAULT_HOST = 'https://plausible.io';\n\n/** Documented ordering of Plausible script variants in the composed filename. */\nconst EXTENSION_ORDER: readonly PlausibleScriptExtension[] = [\n 'hash',\n 'outbound-links',\n 'file-downloads',\n 'tagged-events',\n 'pageview-props',\n 'revenue',\n 'compat',\n 'manual',\n 'local',\n];\n\n/** Module-level so duplicate injection is prevented across every adapter instance. */\nconst loadPromises = new Map<string, Promise<void>>();\nconst managedScripts = new Set<HTMLScriptElement>();\nlet createdQueueStub = false;\n\nexport interface LoadPlausibleScriptOptions {\n domain: string;\n scriptUrl?: string;\n endpoint?: string;\n extensions?: readonly PlausibleScriptExtension[];\n}\n\nexport function buildScriptUrl(options: LoadPlausibleScriptOptions): string {\n if (options.scriptUrl) {\n return options.scriptUrl;\n }\n const requested = new Set(options.extensions ?? []);\n const ordered = EXTENSION_ORDER.filter((ext) => requested.has(ext));\n const suffix = ordered.length > 0 ? `.${ordered.join('.')}` : '';\n return `${DEFAULT_HOST}/js/script${suffix}.js`;\n}\n\n/**\n * Install the `window.plausible` queue stub so calls made before the real script\n * finishes loading are buffered and replayed. Mirrors Plausible's own snippet.\n */\nexport function ensureQueueStub(): void {\n const win = getWindow() as PlausibleBrowserWindow | undefined;\n if (!win) return;\n if (typeof win.plausible === 'function') return;\n\n const stub = function plausibleStub(...args: unknown[]): void {\n (stub.q = stub.q ?? []).push(args);\n } as PlausibleFunction;\n stub.q = [];\n win.plausible = stub;\n createdQueueStub = true;\n}\n\nfunction findExistingScript(doc: Document, src: string): HTMLScriptElement | null {\n const ours = doc.querySelector<HTMLScriptElement>(\n `script[${SCRIPT_MARKER}=\"${SCRIPT_MARKER_VALUE}\"]`,\n );\n if (ours) return ours;\n\n // A hand-added Plausible snippet in index.html also counts — never double-inject.\n const scripts = Array.from(doc.querySelectorAll<HTMLScriptElement>('script[src]'));\n return (\n scripts.find(\n (el) => el.src === src || (el.src.includes('/js/script') && el.hasAttribute('data-domain')),\n ) ?? null\n );\n}\n\n/**\n * Idempotently load the Plausible browser script.\n *\n * - no-op (resolves) when there is no `window`/`document` (SSR-safe)\n * - never injects a second tag for the same script\n * - rejects with a generic {@link AnalyticsError} (`script_load_failed`) on error,\n * and cleans up so a later attempt can retry\n */\nexport function loadPlausibleScript(\n options: LoadPlausibleScriptOptions,\n logger: Logger = SILENT_LOGGER,\n): Promise<void> {\n const win = getWindow();\n const doc = getDocument();\n if (!win || !doc) {\n logger.debug('No browser environment; skipping Plausible script load');\n return Promise.resolve();\n }\n\n const src = buildScriptUrl(options);\n ensureQueueStub();\n\n const cached = loadPromises.get(src);\n if (cached) return cached;\n\n const existing = findExistingScript(doc, src);\n if (existing) {\n logger.debug('Plausible script already present; not injecting a duplicate');\n const resolved = Promise.resolve();\n loadPromises.set(src, resolved);\n return resolved;\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n const script = doc.createElement('script');\n script.src = src;\n script.defer = true;\n script.setAttribute(SCRIPT_MARKER, SCRIPT_MARKER_VALUE);\n script.setAttribute('data-domain', options.domain);\n if (options.endpoint) {\n script.setAttribute('data-api', options.endpoint);\n }\n\n script.addEventListener('load', () => {\n logger.debug('Plausible script loaded', { src });\n resolve();\n });\n script.addEventListener('error', () => {\n managedScripts.delete(script);\n script.remove();\n loadPromises.delete(src);\n logger.debug('Plausible script failed to load', { src });\n reject(\n new AnalyticsError('Analytics tracking script failed to load', {\n code: 'script_load_failed',\n }),\n );\n });\n\n const mount = doc.head ?? doc.body ?? doc.documentElement;\n mount.appendChild(script);\n managedScripts.add(script);\n });\n\n loadPromises.set(src, promise);\n return promise;\n}\n\n/**\n * Remove scripts this library injected and reset module-level state. Safe to call\n * repeatedly and in non-browser environments. Only deletes the `window.plausible`\n * global if *we* created the queue stub.\n */\nexport function removePlausibleScript(): void {\n for (const script of managedScripts) {\n script.remove();\n }\n managedScripts.clear();\n loadPromises.clear();\n\n if (createdQueueStub) {\n const win = getWindow() as PlausibleBrowserWindow | undefined;\n if (win) {\n try {\n delete win.plausible;\n } catch {\n win.plausible = undefined;\n }\n }\n createdQueueStub = false;\n }\n}\n","import type { PlausibleEventOptions, PlausiblePropValue } from './types';\n\n/**\n * Translate the SDK's generic property bag into Plausible's payload shape.\n *\n * SDK concept → Plausible\n * ----------------------------------- ------------------------------------------\n * `{ revenue: 49.99, currency: 'USD' }` `{ revenue: { amount: 49.99, currency: 'USD' } }`\n * `{ revenue: { amount, currency } }` same\n * everything else (primitives) `props`\n * nested objects/arrays JSON-stringified into `props` (last resort;\n * the privacy sanitizer has usually flattened\n * these already)\n *\n * Raw financial / payment-card fields are never forwarded — those keys are removed\n * by the privacy layer before this function is reached.\n */\nexport function toPlausiblePayload(\n properties?: Record<string, unknown>,\n): PlausibleEventOptions | undefined {\n if (!properties) return undefined;\n\n const { revenue, currency, ...rest } = properties as {\n revenue?: unknown;\n currency?: unknown;\n [key: string]: unknown;\n };\n\n const amount =\n typeof revenue === 'number'\n ? revenue\n : isRevenueObject(revenue) && typeof revenue.amount === 'number'\n ? revenue.amount\n : undefined;\n\n const currencyCode =\n typeof currency === 'string'\n ? currency\n : isRevenueObject(revenue) && typeof revenue.currency === 'string'\n ? revenue.currency\n : undefined;\n\n const props: Record<string, PlausiblePropValue> = {};\n for (const [key, value] of Object.entries(rest)) {\n const coerced = coerce(value);\n if (coerced !== undefined) {\n props[key] = coerced;\n }\n }\n\n const options: PlausibleEventOptions = {};\n\n if (amount !== undefined && Number.isFinite(amount) && currencyCode) {\n options.revenue = { amount, currency: currencyCode };\n } else {\n // No usable revenue pair — keep whatever was provided as plain props.\n if (amount !== undefined && Number.isFinite(amount)) props.revenue = amount;\n if (currencyCode) props.currency = currencyCode;\n }\n\n if (Object.keys(props).length > 0) {\n options.props = props;\n }\n\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nfunction isRevenueObject(value: unknown): value is { amount?: unknown; currency?: unknown } {\n return typeof value === 'object' && value !== null;\n}\n\nfunction coerce(value: unknown): PlausiblePropValue | undefined {\n if (value === null || value === undefined) return undefined;\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') {\n return value as PlausiblePropValue;\n }\n if (type === 'object') {\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n","import { AnalyticsError } from '../../core/errors';\nimport type { Logger } from '../../utils/logger';\nimport type { PlausiblePropValue } from './types';\n\n/**\n * Minimal local view of the official `@plausible-analytics/tracker` module.\n *\n * Declared here (rather than `import`ed) so the SDK stays decoupled from that\n * package's pre-1.0 type churn, and so `mode: 'package'` remains a genuinely\n * optional peer dependency.\n */\nexport interface PlausibleTrackerInitConfig {\n domain: string;\n endpoint?: string;\n autoCapturePageviews?: boolean;\n hashBasedRouting?: boolean;\n outboundLinks?: boolean;\n fileDownloads?: boolean;\n captureOnLocalhost?: boolean;\n logging?: boolean;\n /** We always pass `false` — application code must never touch `window.plausible`. */\n bindToWindow?: boolean;\n}\n\nexport interface PlausibleTrackerEventOptions {\n props?: Record<string, PlausiblePropValue>;\n revenue?: { amount: number; currency: string };\n /** Override the tracked URL (the package uses `url`, the CDN script uses `u`). */\n url?: string;\n interactive?: boolean;\n callback?: (result?: { status?: number; error?: unknown }) => void;\n}\n\nexport interface PlausibleTrackerModule {\n init: (config: PlausibleTrackerInitConfig) => void;\n track: (eventName: string, options?: PlausibleTrackerEventOptions) => void;\n}\n\nconst SPECIFIER = '@plausible-analytics/tracker';\n\nlet cache: Promise<PlausibleTrackerModule> | undefined;\n\n/**\n * Lazily import `@plausible-analytics/tracker`. The result is cached so repeated\n * adapter instances share one module instance. A missing package produces a\n * generic {@link AnalyticsError} (`provider_unavailable`) — never an unhandled\n * module-resolution crash.\n */\nexport function loadPlausibleTrackerModule(logger: Logger): Promise<PlausibleTrackerModule> {\n cache ??= importTrackerModule(logger);\n return cache;\n}\n\nasync function importTrackerModule(logger: Logger): Promise<PlausibleTrackerModule> {\n try {\n const mod = (await import(SPECIFIER)) as unknown as Partial<PlausibleTrackerModule>;\n if (typeof mod.init !== 'function' || typeof mod.track !== 'function') {\n throw new Error(`\"${SPECIFIER}\" did not export init()/track()`);\n }\n return { init: mod.init, track: mod.track };\n } catch (cause) {\n cache = undefined;\n logger.debug(`Could not load ${SPECIFIER}`, {\n error: cause instanceof Error ? cause.message : String(cause),\n });\n throw new AnalyticsError(\n `Plausible \"package\" mode needs the optional peer dependency \"${SPECIFIER}\". ` +\n `Run \\`pnpm add ${SPECIFIER}\\` or switch to \\`plausible.mode: 'cdn'\\`.`,\n { code: 'provider_unavailable', cause },\n );\n }\n}\n\n/** Test seam — clears the module cache. */\nexport function resetPlausibleTrackerModuleCache(): void {\n cache = undefined;\n}\n","import type { AnalyticsAdapter, AnalyticsAdapterContext } from '../types';\nimport { type Logger } from '../../utils/logger';\nimport { getWindow } from '../../utils/env';\nimport type {\n PlausibleBrowserWindow,\n PlausibleEventOptions,\n PlausibleScriptExtension,\n ResolvedPlausibleConfig,\n} from './types';\nimport { ensureQueueStub, loadPlausibleScript, removePlausibleScript } from './script';\nimport { toPlausiblePayload } from './revenue';\nimport {\n loadPlausibleTrackerModule,\n type PlausibleTrackerEventOptions,\n type PlausibleTrackerInitConfig,\n type PlausibleTrackerModule,\n} from './package-runtime';\n\nfunction resolveExtensions(config: ResolvedPlausibleConfig): PlausibleScriptExtension[] {\n const extensions: PlausibleScriptExtension[] = [];\n if (!config.autoPageViews) extensions.push('manual');\n if (config.hashRouting) extensions.push('hash');\n if (config.outboundLinks) extensions.push('outbound-links');\n if (config.fileDownloads) extensions.push('file-downloads');\n if (config.taggedEvents) extensions.push('tagged-events');\n if (config.revenue) extensions.push('revenue');\n if (config.trackLocalhost) extensions.push('local');\n return extensions;\n}\n\nfunction toAbsoluteUrl(path: string, win: Window): string {\n try {\n return new URL(path, win.location.href).toString();\n } catch {\n return path;\n }\n}\n\n/**\n * The one place that knows about Plausible.\n *\n * Two runtimes, selected by `plausible.mode`:\n * - `'cdn'` (default) — inject the hosted `<script data-domain>` and call\n * `window.plausible(...)`\n * - `'package'` — drive the official `@plausible-analytics/tracker` module,\n * loaded via a lazy dynamic `import()` (an optional peer dependency)\n *\n * Neither runtime detail escapes this folder.\n */\nexport class PlausibleAdapter implements AnalyticsAdapter {\n readonly name = 'plausible';\n\n readonly #config: ResolvedPlausibleConfig;\n readonly #logger: Logger;\n #packageTrack: PlausibleTrackerModule['track'] | null = null;\n\n constructor(config: ResolvedPlausibleConfig, context: AnalyticsAdapterContext) {\n this.#config = config;\n this.#logger = context.logger.child('[plausible]');\n }\n\n async initialize(): Promise<void> {\n const win = getWindow();\n if (!win) {\n this.#logger.debug('No window; Plausible runs browser-side only (SSR no-op)');\n return;\n }\n\n if (this.#config.mode === 'package') {\n await this.#initPackage();\n return;\n }\n\n if (this.#config.injectScript) {\n await loadPlausibleScript(\n {\n domain: this.#config.domain,\n scriptUrl: this.#config.scriptUrl,\n endpoint: this.#config.endpoint,\n extensions: resolveExtensions(this.#config),\n },\n this.#logger,\n );\n } else {\n this.#logger.debug('injectScript=false; expecting a host-provided Plausible snippet');\n ensureQueueStub();\n }\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n const payload = toPlausiblePayload(properties);\n if (this.#config.mode === 'package') {\n this.#packageCall(eventName, payload);\n } else {\n this.#cdnCall(eventName, payload);\n }\n }\n\n pageView(path?: string): void {\n const win = getWindow();\n const url = path && win ? toAbsoluteUrl(path, win) : undefined;\n\n if (this.#config.mode === 'package') {\n this.#packageCall('pageview', url ? { u: url } : undefined);\n return;\n }\n this.#cdnCall('pageview', url ? { u: url } : undefined);\n }\n\n destroy(): void {\n if (this.#config.mode === 'package') {\n // `@plausible-analytics/tracker` exposes no teardown; drop our reference so\n // no further events are sent through it.\n this.#packageTrack = null;\n return;\n }\n if (this.#config.injectScript) {\n removePlausibleScript();\n }\n }\n\n async #initPackage(): Promise<void> {\n const mod = await loadPlausibleTrackerModule(this.#logger);\n\n const initConfig: PlausibleTrackerInitConfig = {\n domain: this.#config.domain,\n autoCapturePageviews: this.#config.autoPageViews,\n hashBasedRouting: this.#config.hashRouting,\n outboundLinks: this.#config.outboundLinks,\n fileDownloads: this.#config.fileDownloads,\n captureOnLocalhost: this.#config.trackLocalhost,\n bindToWindow: false,\n logging: false,\n };\n if (this.#config.endpoint) initConfig.endpoint = this.#config.endpoint;\n\n mod.init(initConfig);\n this.#packageTrack = mod.track;\n this.#logger.debug('Plausible tracker package ready', { domain: this.#config.domain });\n }\n\n #packageCall(eventName: string, cdnPayload?: PlausibleEventOptions): void {\n const track = this.#packageTrack;\n if (!track) {\n this.#logger.debug('Plausible tracker not ready; event dropped', { event: eventName });\n return;\n }\n\n const options: PlausibleTrackerEventOptions = {};\n if (cdnPayload?.props) options.props = cdnPayload.props;\n if (cdnPayload?.revenue) options.revenue = cdnPayload.revenue;\n if (cdnPayload?.u) options.url = cdnPayload.u;\n\n try {\n if (Object.keys(options).length > 0) {\n track(eventName, options);\n } else {\n track(eventName);\n }\n } catch (error) {\n this.#logger.debug('Plausible tracker threw; event dropped', {\n event: eventName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n #cdnCall(eventName: string, options?: PlausibleEventOptions): void {\n const win = getWindow() as PlausibleBrowserWindow | undefined;\n const plausible = win?.plausible;\n\n if (typeof plausible !== 'function') {\n // Browser global unavailable (SSR, blocked by a privacy extension, not loaded\n // yet and no stub). Never throw — analytics must not break the host app.\n this.#logger.debug('window.plausible unavailable; event dropped', { event: eventName });\n return;\n }\n\n try {\n if (options) {\n plausible(eventName, options);\n } else {\n plausible(eventName);\n }\n } catch (error) {\n this.#logger.debug('window.plausible threw; event dropped', {\n event: eventName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n","import type { AnalyticsAdapter, AnalyticsAdapterContext } from '../types';\nimport type { ResolvedConsoleConfig } from './types';\n\n/**\n * A dependency-free adapter that prints events instead of sending them anywhere.\n *\n * Useful as:\n * - a local-development provider (`provider: 'console'`) so you can see events\n * without a Plausible account\n * - a smoke-test target in consuming apps\n *\n * Unlike the internal debug logger this always writes (it *is* the destination),\n * so it is not gated by `config.debug`.\n */\nexport class ConsoleAdapter implements AnalyticsAdapter {\n readonly name = 'console';\n\n readonly #config: ResolvedConsoleConfig;\n\n constructor(config: ResolvedConsoleConfig, _context: AnalyticsAdapterContext) {\n this.#config = config;\n }\n\n initialize(): void {\n this.#config.sink.info(`${this.#config.prefix} ready`);\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n this.#config.sink.log(`${this.#config.prefix} track`, {\n event: eventName,\n properties: properties ?? {},\n });\n }\n\n pageView(path?: string): void {\n this.#config.sink.log(`${this.#config.prefix} pageView`, { path: path ?? '(current)' });\n }\n\n destroy(): void {\n this.#config.sink.info(`${this.#config.prefix} destroyed`);\n }\n}\n","import { AnalyticsConfigError } from '../core/errors';\nimport type { ResolvedAnalyticsConfig } from '../core/types';\nimport type { AnalyticsAdapter, AnalyticsAdapterContext } from './types';\nimport { PlausibleAdapter } from './plausible/PlausibleAdapter';\nimport { ConsoleAdapter } from './console/ConsoleAdapter';\n\n/**\n * Map a resolved config to a concrete adapter. This is the only place that knows\n * which adapter classes exist; the core client depends solely on\n * {@link AnalyticsAdapter}.\n *\n * Adding `GoogleAnalyticsAdapter`, `PostHogAdapter`, … later means adding a case\n * here (and a provider config type) — application-facing APIs do not change.\n */\nexport function createAdapter(\n config: ResolvedAnalyticsConfig,\n context: AnalyticsAdapterContext,\n): AnalyticsAdapter {\n switch (config.provider) {\n case 'plausible': {\n if (!config.plausible) {\n throw new AnalyticsConfigError('Resolved config is missing the Plausible block.');\n }\n return new PlausibleAdapter(config.plausible, context);\n }\n case 'console': {\n if (!config.console) {\n throw new AnalyticsConfigError('Resolved config is missing the console block.');\n }\n return new ConsoleAdapter(config.console, context);\n }\n case 'custom': {\n if (!config.adapter) {\n throw new AnalyticsConfigError('Resolved config is missing the custom adapter factory.');\n }\n return config.adapter(context);\n }\n default: {\n const exhaustive: never = config.provider;\n throw new AnalyticsConfigError(`Unsupported provider: ${String(exhaustive)}`);\n }\n }\n}\n","import { type AnalyticsError, toAnalyticsError } from './errors';\nimport { configSignature, resolveConfig } from './config';\nimport type {\n AnalyticsClient,\n AnalyticsClientState,\n AnalyticsConfig,\n AnalyticsEventInfo,\n ResolvedAnalyticsConfig,\n} from './types';\nimport { createLogger, type Logger } from '../utils/logger';\nimport { sanitizeProperties } from '../privacy/sanitize';\nimport { AnalyticsPrivacyError } from '../privacy/errors';\nimport { stripSensitiveQueryParams } from '../privacy/path';\nimport { createAdapter } from '../providers/factory';\nimport type { AnalyticsAdapter } from '../providers/types';\nimport type { AnalyticsEventName, TrackArgs } from '../events/types';\n\n/**\n * Framework-independent analytics client. Contains no React and no\n * provider-specific code — it talks only to {@link AnalyticsAdapter}.\n */\nclass AnalyticsClientImpl implements AnalyticsClient {\n #config: ResolvedAnalyticsConfig | null = null;\n #adapter: AnalyticsAdapter | null = null;\n #logger: Logger = createLogger();\n #initialized = false;\n #enabled = false;\n #signature: string | null = null;\n #initPromise: Promise<void> | null = null;\n /** Bumped on every initialize()/destroy(); guards stale async work. */\n #epoch = 0;\n\n async initialize(config: AnalyticsConfig): Promise<void> {\n const resolved = resolveConfig(config);\n const signature = configSignature(config);\n\n // Idempotent: same config → no-op (StrictMode / duplicate mounts).\n if (this.#initialized && this.#signature === signature) {\n await (this.#initPromise ?? Promise.resolve());\n return;\n }\n\n if (this.#initialized) {\n this.#teardownAdapter();\n }\n\n this.#epoch += 1;\n this.#config = resolved;\n this.#signature = signature;\n this.#logger = createLogger({ debug: resolved.debug });\n this.#enabled = resolved.enabled;\n this.#initialized = true;\n\n if (!resolved.enabled) {\n this.#logger.debug('Analytics disabled', {\n environment: resolved.environment,\n provider: resolved.provider,\n reason: resolved.disabledReason,\n });\n this.#initPromise = Promise.resolve();\n return;\n }\n\n this.#initPromise = this.#startAdapter(resolved);\n await this.#initPromise;\n }\n\n track<K extends AnalyticsEventName>(event: K, ...args: TrackArgs<K>): void {\n const properties: Record<string, unknown> | undefined = args[0];\n\n try {\n if (!this.#initialized || !this.#config) {\n this.#logger.warn(`track(\"${event}\") called before initialize()`);\n return;\n }\n const config = this.#config;\n const baseInfo = {\n type: 'event' as const,\n name: event,\n provider: config.provider,\n environment: config.environment,\n enabled: this.#enabled,\n };\n\n if (!this.#enabled) {\n const reason = config.disabledReason ?? 'analytics disabled';\n this.#logger.debug('Event skipped', { ...baseInfo, reason });\n this.#emitEventInfo({ ...baseInfo, delivered: false, reason });\n return;\n }\n\n const merged: Record<string, unknown> = {\n ...config.defaultProperties,\n ...properties,\n };\n if (config.includeTenantKey && config.tenantKey !== undefined) {\n merged[config.tenantPropertyName] = config.tenantKey;\n }\n\n const { value: safeProperties, blocked } = sanitizeProperties(\n merged,\n config.privacy,\n this.#logger.child('[privacy]'),\n );\n\n this.#logger.debug('Event', {\n ...baseInfo,\n properties: safeProperties,\n ...(blocked.length > 0 ? { blockedKeys: blocked } : {}),\n });\n\n this.#adapter?.track(event, safeProperties);\n\n this.#emitEventInfo({\n ...baseInfo,\n delivered: this.#adapter != null,\n properties: safeProperties,\n ...(blocked.length > 0 ? { blockedKeys: blocked } : {}),\n ...(this.#adapter == null ? { reason: 'provider not ready' } : {}),\n });\n } catch (error) {\n if (error instanceof AnalyticsPrivacyError) {\n this.#handleError(error);\n throw error;\n }\n this.#handleError(toAnalyticsError(error, 'track_failed'));\n }\n }\n\n pageView(path?: string): void {\n try {\n if (!this.#initialized || !this.#config) {\n this.#logger.warn('pageView() called before initialize()');\n return;\n }\n const config = this.#config;\n const safePath = typeof path === 'string' ? stripSensitiveQueryParams(path) : undefined;\n const baseInfo = {\n type: 'pageview' as const,\n name: safePath ?? '(current)',\n provider: config.provider,\n environment: config.environment,\n enabled: this.#enabled,\n };\n\n if (!this.#enabled) {\n const reason = config.disabledReason ?? 'analytics disabled';\n this.#logger.debug('Page view skipped', { ...baseInfo, reason });\n this.#emitEventInfo({ ...baseInfo, delivered: false, reason });\n return;\n }\n\n this.#logger.debug('Page view', baseInfo);\n this.#adapter?.pageView(safePath);\n this.#emitEventInfo({ ...baseInfo, delivered: this.#adapter != null });\n } catch (error) {\n this.#handleError(toAnalyticsError(error, 'pageview_failed'));\n }\n }\n\n isEnabled(): boolean {\n return this.#enabled;\n }\n\n isInitialized(): boolean {\n return this.#initialized;\n }\n\n setEnabled(enabled: boolean): void {\n if (this.#enabled === enabled) return;\n this.#enabled = enabled;\n\n if (!this.#initialized || !this.#config) {\n return;\n }\n\n this.#logger.debug(`Analytics ${enabled ? 'enabled' : 'disabled'} at runtime`);\n\n if (enabled && !this.#adapter) {\n this.#initPromise = this.#startAdapter(this.#config);\n }\n }\n\n getState(): AnalyticsClientState {\n return {\n initialized: this.#initialized,\n enabled: this.#enabled,\n environment: this.#config?.environment ?? null,\n provider: this.#config?.provider ?? null,\n debug: this.#config?.debug ?? false,\n };\n }\n\n destroy(): void {\n this.#epoch += 1;\n this.#teardownAdapter();\n this.#logger.debug('Analytics destroyed');\n this.#config = null;\n this.#signature = null;\n this.#initialized = false;\n this.#enabled = false;\n this.#initPromise = null;\n this.#logger = createLogger();\n }\n\n #startAdapter(resolved: ResolvedAnalyticsConfig): Promise<void> {\n let adapter: AnalyticsAdapter;\n try {\n adapter = createAdapter(resolved, { logger: this.#logger });\n } catch (error) {\n this.#handleError(toAnalyticsError(error, 'initialization_failed'));\n return Promise.resolve();\n }\n\n this.#adapter = adapter;\n const epoch = this.#epoch;\n\n return (async () => {\n try {\n await adapter.initialize();\n if (this.#epoch !== epoch) return;\n this.#logger.debug('Provider ready', {\n provider: adapter.name,\n environment: resolved.environment,\n });\n } catch (error) {\n if (this.#epoch !== epoch) return;\n this.#handleError(toAnalyticsError(error, 'initialization_failed'));\n }\n })();\n }\n\n #teardownAdapter(): void {\n const adapter = this.#adapter;\n this.#adapter = null;\n if (!adapter) return;\n try {\n adapter.destroy();\n } catch (error) {\n this.#handleError(toAnalyticsError(error, 'destroy_failed'));\n }\n }\n\n #emitEventInfo(info: AnalyticsEventInfo): void {\n const handler = this.#config?.onEvent;\n if (!handler) return;\n try {\n handler(info);\n } catch (error) {\n this.#logger.debug('config.onEvent handler threw (ignored)', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n #handleError(error: AnalyticsError): void {\n this.#logger.error(error.message, { code: error.code });\n const handler = this.#config?.onError;\n if (!handler) return;\n try {\n handler(error);\n } catch (handlerError) {\n this.#logger.debug('config.onError handler threw (ignored)', {\n error: handlerError instanceof Error ? handlerError.message : String(handlerError),\n });\n }\n }\n}\n\n/**\n * Create an isolated analytics client. Prefer the shared {@link analytics}\n * singleton for app code; use this for tests, or when an app legitimately needs\n * multiple independent clients.\n */\nexport function createAnalyticsClient(): AnalyticsClient {\n return new AnalyticsClientImpl();\n}\n\nexport { AnalyticsClientImpl };\n"]}
@@ -0,0 +1,200 @@
1
+ import { A as AnalyticsClient, a as AnalyticsError, b as AnalyticsEnvironment, B as BaseAnalyticsEventMap, R as ResolvedPrivacyPolicy, L as Logger, S as SanitizeResult, c as AnalyticsConfig, d as AnalyticsEventName, T as TrackArgs } from './types-Bzaq1v4t.js';
2
+ export { e as AnalyticsAdapter, f as AnalyticsAdapterContext, g as AnalyticsAdapterFactory, h as AnalyticsClientState, i as AnalyticsConfigBase, j as AnalyticsConfigError, k as AnalyticsErrorCode, l as AnalyticsErrorHandler, m as AnalyticsEventInfo, n as AnalyticsEventMap, o as AnalyticsEventProperties, p as AnalyticsProviderName, q as AuthenticationEventMap, C as CommonEventMap, r as ConsoleAnalyticsConfig, s as ConsoleProviderConfig, t as CustomAnalyticsConfig, E as EcommerceEventMap, u as EngagementEventMap, v as LeadGenerationEventMap, P as PiiMode, w as PlausibleAnalyticsConfig, x as PlausibleProviderConfig, y as PlausibleRuntimeMode, z as PlausibleScriptExtension, D as PrivacyConfig, F as PrivacyViolationMode, G as ResolvedAnalyticsConfig, H as toAnalyticsError } from './types-Bzaq1v4t.js';
3
+ import { ReactNode, ReactElement } from 'react';
4
+
5
+ /**
6
+ * The shared, process-wide analytics client.
7
+ *
8
+ * - Importing this module has **no side effects** — no scripts are injected and
9
+ * nothing is configured until `initialize()` runs.
10
+ * - `AnalyticsProvider` initializes this same instance by default, so React and
11
+ * non-React code observe one consistent client.
12
+ * - Fully resettable for tests via `analytics.destroy()`.
13
+ */
14
+ declare const analytics: AnalyticsClient;
15
+
16
+ /**
17
+ * Create an isolated analytics client. Prefer the shared {@link analytics}
18
+ * singleton for app code; use this for tests, or when an app legitimately needs
19
+ * multiple independent clients.
20
+ */
21
+ declare function createAnalyticsClient(): AnalyticsClient;
22
+
23
+ type PrivacyViolationCategory = 'sensitive' | 'pii';
24
+ /**
25
+ * Raised when a prohibited property reaches the sanitizer while the privacy policy
26
+ * is configured to `throw` (development / debug default for `sensitive` keys).
27
+ *
28
+ * The error names the offending **key path only** — the value is never read,
29
+ * stored, or logged.
30
+ */
31
+ declare class AnalyticsPrivacyError extends AnalyticsError {
32
+ readonly key: string;
33
+ readonly category: PrivacyViolationCategory;
34
+ constructor(params: {
35
+ key: string;
36
+ category: PrivacyViolationCategory;
37
+ });
38
+ }
39
+
40
+ declare const ANALYTICS_ENVIRONMENTS: readonly AnalyticsEnvironment[];
41
+ declare function isAnalyticsEnvironment(value: unknown): value is AnalyticsEnvironment;
42
+
43
+ /**
44
+ * Runtime view of the standardized catalog, grouped by category. Useful for
45
+ * documentation, dev tooling and tests. Keeping this in sync with
46
+ * {@link BaseAnalyticsEventMap} is enforced by a type-level test.
47
+ */
48
+ declare const ANALYTICS_EVENT_CATALOG: {
49
+ readonly common: readonly ["cta_clicked", "outbound_link_clicked", "download_clicked", "search_performed"];
50
+ readonly leadGeneration: readonly ["contact_form_started", "contact_form_submitted", "phone_clicked", "email_clicked", "appointment_started", "appointment_completed"];
51
+ readonly authentication: readonly ["login_started", "login_completed", "login_failed", "signup_started", "signup_completed"];
52
+ readonly ecommerce: readonly ["product_viewed", "add_to_cart", "remove_from_cart", "checkout_started", "checkout_completed", "purchase_completed"];
53
+ readonly engagement: readonly ["video_started", "video_completed", "document_downloaded", "social_link_clicked"];
54
+ };
55
+ type AnalyticsEventCategory = keyof typeof ANALYTICS_EVENT_CATALOG;
56
+ /** Flat list of every standardized event name. */
57
+ declare const ALL_ANALYTICS_EVENTS: readonly (keyof BaseAnalyticsEventMap)[];
58
+ /** Fast membership check against the standardized catalog. */
59
+ declare function isKnownAnalyticsEvent(name: string): name is keyof BaseAnalyticsEventMap;
60
+
61
+ /**
62
+ * Sanitize a property bag before it reaches any adapter.
63
+ *
64
+ * Guarantees:
65
+ * - prohibited keys (see {@link classifyKey}) are removed, warned, or throw
66
+ * depending on `policy`
67
+ * - functions, symbols, `undefined`, `null`, `NaN`/`Infinity` are dropped
68
+ * - `Date` → ISO string, `bigint` → decimal string
69
+ * - circular references are broken (the offending branch is dropped)
70
+ * - depth, property count, string length and array length are capped
71
+ * - prohibited **values** are never read, logged, or included in the result
72
+ */
73
+ declare function sanitizeProperties(input: Record<string, unknown> | undefined, policy?: ResolvedPrivacyPolicy, logger?: Logger): SanitizeResult;
74
+
75
+ /**
76
+ * Key classification rules.
77
+ *
78
+ * Two tiers:
79
+ * - `sensitive` — always blocked. Credentials, tokens, card data, government ids.
80
+ * - `pii` — direct personal identifiers. Blocked by default but configurable
81
+ * (`privacy.onPii`), since some products legitimately need e.g. a
82
+ * coarse `country`.
83
+ *
84
+ * Matching is done on a normalized key: lowercased, stripped of every non
85
+ * alphanumeric character. `credit_card`, `credit-card`, `creditCard` and
86
+ * `CreditCard` all normalize to `creditcard`.
87
+ */
88
+ type KeyClassification = 'sensitive' | 'pii' | null;
89
+ /** Exposed so consumers can inspect / document the defaults. */
90
+ declare const DEFAULT_SENSITIVE_KEYS: readonly string[];
91
+ declare const DEFAULT_PII_KEYS: readonly string[];
92
+ declare function normalizeKey(key: string): string;
93
+ interface KeyRuleOptions {
94
+ /** Extra keys to always treat as `sensitive` (normalized substring match). */
95
+ extraBlockedKeys?: readonly string[];
96
+ /** Keys to force-allow even if a built-in rule would block them (normalized exact match). */
97
+ allowKeys?: readonly string[];
98
+ }
99
+ /**
100
+ * Classify a raw property key.
101
+ *
102
+ * Precedence: `allowKeys` → extra blocked → sensitive (built-in) → pii (built-in).
103
+ */
104
+ declare function classifyKey(rawKey: string, options?: KeyRuleOptions): KeyClassification;
105
+
106
+ /**
107
+ * Strip query-string parameters whose key classifies as `sensitive` from a URL or
108
+ * path. Used before a path is handed to a provider for explicit page-view tracking,
109
+ * so a stray `?token=…` or `?password=…` never leaves the browser as analytics data.
110
+ *
111
+ * PII params (e.g. `?email=`) are intentionally left intact here — removing them
112
+ * would frequently corrupt legitimate campaign/referrer analytics. Callers that
113
+ * need PII stripped should not put PII in URLs.
114
+ */
115
+ declare function stripSensitiveQueryParams(pathOrUrl: string): string;
116
+
117
+ interface AnalyticsProviderProps {
118
+ /** Provider-agnostic configuration. */
119
+ config: AnalyticsConfig;
120
+ /**
121
+ * Client instance to drive. Defaults to the shared `analytics` singleton so
122
+ * React and non-React code share one client. Pass `createAnalyticsClient()` (or
123
+ * a mock) for isolation in tests or advanced multi-client setups. Must be stable.
124
+ */
125
+ client?: AnalyticsClient;
126
+ children: ReactNode;
127
+ }
128
+ /**
129
+ * Initializes analytics and exposes the client through React context.
130
+ *
131
+ * - initializes on mount, reconfigures when the *meaningful* config changes,
132
+ * and destroys on unmount
133
+ * - StrictMode-safe: `initialize()` is idempotent and a stale double-invoke can't
134
+ * resurrect a destroyed client
135
+ * - callback identity changes (`onError`, `onEvent`) never trigger re-init
136
+ * - contains zero Plausible-specific behaviour
137
+ *
138
+ * Place it once, near the root of the app.
139
+ */
140
+ declare function AnalyticsProvider({ config, client, children }: AnalyticsProviderProps): ReactNode;
141
+
142
+ /**
143
+ * Access the active {@link AnalyticsClient}.
144
+ *
145
+ * @throws if called outside an `<AnalyticsProvider>`.
146
+ */
147
+ declare function useAnalytics(): AnalyticsClient;
148
+
149
+ type TrackEventFn = <K extends AnalyticsEventName>(event: K, ...args: TrackArgs<K>) => void;
150
+ /**
151
+ * Convenience hook returning a stable, strongly typed `track` function.
152
+ *
153
+ * Equivalent to `useAnalytics().track`, but referentially stable so it can sit in
154
+ * `useEffect` / `useCallback` dependency arrays without churn.
155
+ *
156
+ * ```tsx
157
+ * const track = useTrackEvent();
158
+ * useEffect(() => track('product_viewed', { productId: id }), [id, track]);
159
+ * ```
160
+ */
161
+ declare function useTrackEvent(): TrackEventFn;
162
+
163
+ type TriggerProp = 'onClick' | 'onAuxClick' | 'onContextMenu';
164
+ type PropertiesProp<K extends AnalyticsEventName> = TrackArgs<K> extends [infer P] ? {
165
+ properties: P;
166
+ } : TrackArgs<K> extends [(infer P)?] ? {
167
+ properties?: P;
168
+ } : {
169
+ properties?: undefined;
170
+ };
171
+ type TrackProps<K extends AnalyticsEventName = AnalyticsEventName> = {
172
+ /** Event to send when the child fires the trigger event. */
173
+ event: K;
174
+ /** DOM handler prop that triggers tracking. Default `"onClick"`. */
175
+ on?: TriggerProp;
176
+ /** Exactly one valid React element. */
177
+ children: ReactElement;
178
+ } & PropertiesProp<K>;
179
+ /**
180
+ * Fire an analytics event when its single child element is activated, without
181
+ * altering the child's behaviour.
182
+ *
183
+ * ```tsx
184
+ * <Track event="phone_clicked" properties={{ location: 'header' }}>
185
+ * <a href="tel:+10000000000">Call</a>
186
+ * </Track>
187
+ * ```
188
+ *
189
+ * Guarantees:
190
+ * - the child's own handler still runs (it runs *first*)
191
+ * - the event is never `preventDefault`ed and no props other than the trigger
192
+ * handler are touched, so navigation and accessibility are preserved
193
+ * - no wrapper DOM node is added
194
+ *
195
+ * Only accepts a single valid element. For anything more complex, call
196
+ * `useAnalytics()` / `useTrackEvent()` directly.
197
+ */
198
+ declare function Track<K extends AnalyticsEventName>(props: TrackProps<K>): ReactElement;
199
+
200
+ export { ALL_ANALYTICS_EVENTS, ANALYTICS_ENVIRONMENTS, ANALYTICS_EVENT_CATALOG, AnalyticsClient, AnalyticsConfig, AnalyticsEnvironment, AnalyticsError, type AnalyticsEventCategory, AnalyticsEventName, AnalyticsPrivacyError, AnalyticsProvider, type AnalyticsProviderProps, BaseAnalyticsEventMap, DEFAULT_PII_KEYS, DEFAULT_SENSITIVE_KEYS, type KeyClassification, type PrivacyViolationCategory, ResolvedPrivacyPolicy, SanitizeResult, Track, TrackArgs, type TrackEventFn, type TrackProps, analytics, classifyKey, createAnalyticsClient, isAnalyticsEnvironment, isKnownAnalyticsEvent, normalizeKey, sanitizeProperties, stripSensitiveQueryParams, useAnalytics, useTrackEvent };
package/dist/index.js ADDED
@@ -0,0 +1,117 @@
1
+ import { createAnalyticsClient, configSignature, toAnalyticsError, AnalyticsPrivacyError } from './chunk-J5GXHJNU.js';
2
+ export { ANALYTICS_ENVIRONMENTS, AnalyticsConfigError, AnalyticsError, AnalyticsPrivacyError, DEFAULT_PII_KEYS, DEFAULT_SENSITIVE_KEYS, classifyKey, createAnalyticsClient, isAnalyticsEnvironment, normalizeKey, sanitizeProperties, stripSensitiveQueryParams, toAnalyticsError } from './chunk-J5GXHJNU.js';
3
+ import { createContext, useRef, useMemo, useEffect, useContext, useCallback, Children, cloneElement } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ // src/core/singleton.ts
7
+ var analytics = /* @__PURE__ */ createAnalyticsClient();
8
+
9
+ // src/events/catalog.ts
10
+ var ANALYTICS_EVENT_CATALOG = {
11
+ common: ["cta_clicked", "outbound_link_clicked", "download_clicked", "search_performed"],
12
+ leadGeneration: [
13
+ "contact_form_started",
14
+ "contact_form_submitted",
15
+ "phone_clicked",
16
+ "email_clicked",
17
+ "appointment_started",
18
+ "appointment_completed"
19
+ ],
20
+ authentication: [
21
+ "login_started",
22
+ "login_completed",
23
+ "login_failed",
24
+ "signup_started",
25
+ "signup_completed"
26
+ ],
27
+ ecommerce: [
28
+ "product_viewed",
29
+ "add_to_cart",
30
+ "remove_from_cart",
31
+ "checkout_started",
32
+ "checkout_completed",
33
+ "purchase_completed"
34
+ ],
35
+ engagement: ["video_started", "video_completed", "document_downloaded", "social_link_clicked"]
36
+ };
37
+ var ALL_ANALYTICS_EVENTS = Object.values(ANALYTICS_EVENT_CATALOG).flat();
38
+ function isKnownAnalyticsEvent(name) {
39
+ return ALL_ANALYTICS_EVENTS.includes(name);
40
+ }
41
+ var AnalyticsContext = createContext(null);
42
+ AnalyticsContext.displayName = "AnalyticsContext";
43
+ function AnalyticsProvider({ config, client, children }) {
44
+ const resolvedClient = client ?? analytics;
45
+ const onErrorRef = useRef(config.onError);
46
+ const onEventRef = useRef(config.onEvent);
47
+ onErrorRef.current = config.onError;
48
+ onEventRef.current = config.onEvent;
49
+ const signature = useMemo(() => configSignature(config), [config]);
50
+ const effectiveConfig = useMemo(
51
+ () => ({
52
+ ...config,
53
+ onError: (error) => onErrorRef.current?.(error),
54
+ onEvent: (info) => onEventRef.current?.(info)
55
+ }),
56
+ // eslint-disable-next-line react-hooks/exhaustive-deps
57
+ [signature]
58
+ );
59
+ useEffect(() => {
60
+ let active = true;
61
+ resolvedClient.initialize(effectiveConfig).catch((error) => {
62
+ if (!active) return;
63
+ onErrorRef.current?.(toAnalyticsError(error, "initialization_failed"));
64
+ });
65
+ return () => {
66
+ active = false;
67
+ resolvedClient.destroy();
68
+ };
69
+ }, [resolvedClient, signature]);
70
+ return /* @__PURE__ */ jsx(AnalyticsContext.Provider, { value: resolvedClient, children });
71
+ }
72
+ function useAnalytics() {
73
+ const client = useContext(AnalyticsContext);
74
+ if (!client) {
75
+ throw new Error(
76
+ "useAnalytics() must be used within an <AnalyticsProvider>. Wrap your app (or the relevant subtree) in <AnalyticsProvider config={...}>."
77
+ );
78
+ }
79
+ return client;
80
+ }
81
+ function useTrackEvent() {
82
+ const analytics2 = useAnalytics();
83
+ return useCallback(
84
+ (event, ...args) => {
85
+ analytics2.track(event, ...args);
86
+ },
87
+ [analytics2]
88
+ );
89
+ }
90
+ function Track(props) {
91
+ const { event, on = "onClick", children } = props;
92
+ const properties = props.properties;
93
+ const analytics2 = useAnalytics();
94
+ const child = Children.only(children);
95
+ const childProps = child.props;
96
+ const originalHandler = childProps[on];
97
+ const handleTrigger = useCallback(
98
+ (domEvent) => {
99
+ if (typeof originalHandler === "function") {
100
+ originalHandler(domEvent);
101
+ }
102
+ try {
103
+ analytics2.track(event, ...[properties]);
104
+ } catch (error) {
105
+ if (error instanceof AnalyticsPrivacyError) throw error;
106
+ }
107
+ },
108
+ [analytics2, event, properties, originalHandler]
109
+ );
110
+ return cloneElement(child, {
111
+ [on]: handleTrigger
112
+ });
113
+ }
114
+
115
+ export { ALL_ANALYTICS_EVENTS, ANALYTICS_EVENT_CATALOG, AnalyticsProvider, Track, analytics, isKnownAnalyticsEvent, useAnalytics, useTrackEvent };
116
+ //# sourceMappingURL=index.js.map
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/singleton.ts","../src/events/catalog.ts","../src/react/context.ts","../src/react/AnalyticsProvider.tsx","../src/react/useAnalytics.ts","../src/react/useTrackEvent.ts","../src/react/Track.tsx"],"names":["analytics","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import { createAnalyticsClient } from './AnalyticsClient';\nimport type { AnalyticsClient } from './types';\n\n/**\n * The shared, process-wide analytics client.\n *\n * - Importing this module has **no side effects** — no scripts are injected and\n * nothing is configured until `initialize()` runs.\n * - `AnalyticsProvider` initializes this same instance by default, so React and\n * non-React code observe one consistent client.\n * - Fully resettable for tests via `analytics.destroy()`.\n */\nexport const analytics: AnalyticsClient = /* @__PURE__ */ createAnalyticsClient();\n","import type { BaseAnalyticsEventMap } from './types';\n\n/**\n * Runtime view of the standardized catalog, grouped by category. Useful for\n * documentation, dev tooling and tests. Keeping this in sync with\n * {@link BaseAnalyticsEventMap} is enforced by a type-level test.\n */\nexport const ANALYTICS_EVENT_CATALOG = {\n common: ['cta_clicked', 'outbound_link_clicked', 'download_clicked', 'search_performed'],\n leadGeneration: [\n 'contact_form_started',\n 'contact_form_submitted',\n 'phone_clicked',\n 'email_clicked',\n 'appointment_started',\n 'appointment_completed',\n ],\n authentication: [\n 'login_started',\n 'login_completed',\n 'login_failed',\n 'signup_started',\n 'signup_completed',\n ],\n ecommerce: [\n 'product_viewed',\n 'add_to_cart',\n 'remove_from_cart',\n 'checkout_started',\n 'checkout_completed',\n 'purchase_completed',\n ],\n engagement: ['video_started', 'video_completed', 'document_downloaded', 'social_link_clicked'],\n} as const satisfies Record<string, readonly (keyof BaseAnalyticsEventMap)[]>;\n\nexport type AnalyticsEventCategory = keyof typeof ANALYTICS_EVENT_CATALOG;\n\n/** Flat list of every standardized event name. */\nexport const ALL_ANALYTICS_EVENTS: readonly (keyof BaseAnalyticsEventMap)[] =\n Object.values(ANALYTICS_EVENT_CATALOG).flat();\n\n/** Fast membership check against the standardized catalog. */\nexport function isKnownAnalyticsEvent(name: string): name is keyof BaseAnalyticsEventMap {\n return (ALL_ANALYTICS_EVENTS as readonly string[]).includes(name);\n}\n","import { createContext } from 'react';\nimport type { AnalyticsClient } from '../core/types';\n\n/**\n * Holds the active {@link AnalyticsClient}. `null` means \"no `<AnalyticsProvider>`\n * above this component\" — `useAnalytics()` turns that into a helpful error.\n */\nexport const AnalyticsContext = createContext<AnalyticsClient | null>(null);\n\nAnalyticsContext.displayName = 'AnalyticsContext';\n","import { useEffect, useMemo, useRef, type ReactNode } from 'react';\nimport { AnalyticsContext } from './context';\nimport { analytics as sharedAnalytics } from '../core/singleton';\nimport { configSignature } from '../core/config';\nimport { toAnalyticsError } from '../core/errors';\nimport type { AnalyticsClient, AnalyticsConfig } from '../core/types';\n\nexport interface AnalyticsProviderProps {\n /** Provider-agnostic configuration. */\n config: AnalyticsConfig;\n /**\n * Client instance to drive. Defaults to the shared `analytics` singleton so\n * React and non-React code share one client. Pass `createAnalyticsClient()` (or\n * a mock) for isolation in tests or advanced multi-client setups. Must be stable.\n */\n client?: AnalyticsClient;\n children: ReactNode;\n}\n\n/**\n * Initializes analytics and exposes the client through React context.\n *\n * - initializes on mount, reconfigures when the *meaningful* config changes,\n * and destroys on unmount\n * - StrictMode-safe: `initialize()` is idempotent and a stale double-invoke can't\n * resurrect a destroyed client\n * - callback identity changes (`onError`, `onEvent`) never trigger re-init\n * - contains zero Plausible-specific behaviour\n *\n * Place it once, near the root of the app.\n */\nexport function AnalyticsProvider({ config, client, children }: AnalyticsProviderProps): ReactNode {\n const resolvedClient = client ?? sharedAnalytics;\n\n const onErrorRef = useRef(config.onError);\n const onEventRef = useRef(config.onEvent);\n onErrorRef.current = config.onError;\n onEventRef.current = config.onEvent;\n\n // Signature ignores function-valued fields, so changing a handler identity\n // (a common React re-render artifact) does not re-initialize the client.\n const signature = useMemo(() => configSignature(config), [config]);\n\n const effectiveConfig = useMemo<AnalyticsConfig>(\n () => ({\n ...config,\n onError: (error) => onErrorRef.current?.(error),\n onEvent: (info) => onEventRef.current?.(info),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [signature],\n );\n\n useEffect(() => {\n let active = true;\n\n resolvedClient.initialize(effectiveConfig).catch((error: unknown) => {\n if (!active) return;\n onErrorRef.current?.(toAnalyticsError(error, 'initialization_failed'));\n });\n\n return () => {\n active = false;\n resolvedClient.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resolvedClient, signature]);\n\n return <AnalyticsContext.Provider value={resolvedClient}>{children}</AnalyticsContext.Provider>;\n}\n","import { useContext } from 'react';\nimport { AnalyticsContext } from './context';\nimport type { AnalyticsClient } from '../core/types';\n\n/**\n * Access the active {@link AnalyticsClient}.\n *\n * @throws if called outside an `<AnalyticsProvider>`.\n */\nexport function useAnalytics(): AnalyticsClient {\n const client = useContext(AnalyticsContext);\n if (!client) {\n throw new Error(\n 'useAnalytics() must be used within an <AnalyticsProvider>. ' +\n 'Wrap your app (or the relevant subtree) in <AnalyticsProvider config={...}>.',\n );\n }\n return client;\n}\n","import { useCallback } from 'react';\nimport { useAnalytics } from './useAnalytics';\nimport type { AnalyticsEventName, TrackArgs } from '../events/types';\n\nexport type TrackEventFn = <K extends AnalyticsEventName>(event: K, ...args: TrackArgs<K>) => void;\n\n/**\n * Convenience hook returning a stable, strongly typed `track` function.\n *\n * Equivalent to `useAnalytics().track`, but referentially stable so it can sit in\n * `useEffect` / `useCallback` dependency arrays without churn.\n *\n * ```tsx\n * const track = useTrackEvent();\n * useEffect(() => track('product_viewed', { productId: id }), [id, track]);\n * ```\n */\nexport function useTrackEvent(): TrackEventFn {\n const analytics = useAnalytics();\n return useCallback<TrackEventFn>(\n (event, ...args) => {\n analytics.track(event, ...args);\n },\n [analytics],\n );\n}\n","import { Children, cloneElement, useCallback, type ReactElement } from 'react';\nimport { useAnalytics } from './useAnalytics';\nimport { AnalyticsPrivacyError } from '../privacy/errors';\nimport type { AnalyticsEventName, AnalyticsEventProperties, TrackArgs } from '../events/types';\n\ntype TriggerProp = 'onClick' | 'onAuxClick' | 'onContextMenu';\n\ntype PropertiesProp<K extends AnalyticsEventName> =\n TrackArgs<K> extends [infer P]\n ? { properties: P }\n : TrackArgs<K> extends [(infer P)?]\n ? { properties?: P }\n : { properties?: undefined };\n\nexport type TrackProps<K extends AnalyticsEventName = AnalyticsEventName> = {\n /** Event to send when the child fires the trigger event. */\n event: K;\n /** DOM handler prop that triggers tracking. Default `\"onClick\"`. */\n on?: TriggerProp;\n /** Exactly one valid React element. */\n children: ReactElement;\n} & PropertiesProp<K>;\n\n/**\n * Fire an analytics event when its single child element is activated, without\n * altering the child's behaviour.\n *\n * ```tsx\n * <Track event=\"phone_clicked\" properties={{ location: 'header' }}>\n * <a href=\"tel:+10000000000\">Call</a>\n * </Track>\n * ```\n *\n * Guarantees:\n * - the child's own handler still runs (it runs *first*)\n * - the event is never `preventDefault`ed and no props other than the trigger\n * handler are touched, so navigation and accessibility are preserved\n * - no wrapper DOM node is added\n *\n * Only accepts a single valid element. For anything more complex, call\n * `useAnalytics()` / `useTrackEvent()` directly.\n */\nexport function Track<K extends AnalyticsEventName>(props: TrackProps<K>): ReactElement {\n const { event, on = 'onClick', children } = props;\n const properties = (props as { properties?: AnalyticsEventProperties<K> }).properties;\n const analytics = useAnalytics();\n\n const child = Children.only(children);\n const childProps = child.props as Record<string, unknown>;\n const originalHandler = childProps[on];\n\n const handleTrigger = useCallback(\n (domEvent: unknown) => {\n if (typeof originalHandler === 'function') {\n (originalHandler as (e: unknown) => void)(domEvent);\n }\n try {\n analytics.track(event, ...([properties] as unknown as TrackArgs<K>));\n } catch (error) {\n // A privacy 'throw' is an intentional development signal — let it surface.\n if (error instanceof AnalyticsPrivacyError) throw error;\n // Anything else must never break the child's interaction.\n }\n },\n [analytics, event, properties, originalHandler],\n );\n\n return cloneElement(child as ReactElement<Record<string, unknown>>, {\n [on]: handleTrigger,\n });\n}\n"]}