From 2d06bac0170afb4f0376661758c6b75111988f82 Mon Sep 17 00:00:00 2001 From: 0thernet Date: Tue, 18 Aug 2026 00:56:29 -0400 Subject: [PATCH] Fix published client directive boundaries --- README.md | 2 +- dist/client.js | 3 +- dist/client.js.map | 6 +-- dist/react.js | 3 +- dist/react.js.map | 6 +-- package.json | 2 +- portfolio-inventory.json | 2 +- scripts/build.ts | 8 +++- scripts/check-bundle-boundaries.ts | 15 +++++-- scripts/package-smoke.ts | 64 +++++++++++++++++++++++++----- src/client.ts | 2 - src/react.tsx | 2 - 12 files changed, 84 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 20f2de5..59b6043 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Pin the immutable GitHub release and install the framework peers used by your ap ```json { "dependencies": { - "@hraness/posthog": "github:hraness/posthog#v0.1.1", + "@hraness/posthog": "github:hraness/posthog#v0.1.2", "next": "16.2.12", "react": "19.2.3" } diff --git a/dist/client.js b/dist/client.js index 628a9d6..47c1425 100644 --- a/dist/client.js +++ b/dist/client.js @@ -481,7 +481,6 @@ function classifyAnalyticsTraffic(site, referrer, currentUrl) { } // src/client.ts -"use client"; var BUILT_IN_EVENTS = new Set(["$pageview", "$pageleave", "$web_vitals", "$exception"]); var DEFAULT_API_HOST = "https://us.i.posthog.com"; var clientExceptionBudget = new ExceptionBudget({ @@ -713,4 +712,4 @@ export { capturePostHogEvent }; -//# debugId=28120A7D64B7EBF464756E2164756E21 +//# debugId=506097B8E608C77964756E2164756E21 diff --git a/dist/client.js.map b/dist/client.js.map index 4452bfc..108519f 100644 --- a/dist/client.js.map +++ b/dist/client.js.map @@ -2,12 +2,12 @@ "version": 3, "sources": ["../src/client.ts", "../src/site.ts", "../src/event.ts", "../src/traffic.ts"], "sourcesContent": [ - "\"use client\";\n\nimport { posthog } from \"posthog-js\";\nimport type { CaptureResult, PostHogConfig } from \"posthog-js\";\n\nimport {\n analyticsErrorFingerprint,\n ExceptionBudget,\n normalizeAnalyticsProperties,\n sanitizeAnalyticsError,\n sanitizeProviderProperties,\n type AnalyticsProperties,\n} from \"./event.js\";\nimport {\n canonicalAnalyticsUrl,\n classifyAnalyticsRoute,\n isAllowedAnalyticsHost,\n isAllowedCustomEvent,\n isAllowedDelegatedEvent,\n normalizeAnalyticsHostname,\n type PostHogSiteDefinition,\n} from \"./site.js\";\nimport { classifyAnalyticsTraffic } from \"./traffic.js\";\n\nconst BUILT_IN_EVENTS = new Set([\"$pageview\", \"$pageleave\", \"$web_vitals\", \"$exception\"]);\nconst DEFAULT_API_HOST = \"https://us.i.posthog.com\";\nconst clientExceptionBudget = new ExceptionBudget({\n totalLimit: 20,\n perFingerprintLimit: 2,\n windowMs: 60_000,\n});\nconst seenErrors = new WeakSet();\n\nlet activeSiteId: string | null = null;\n\nexport type BrowserAnalyticsEvidence = Readonly<{\n hostname: string;\n href: string;\n referrer: string;\n production: boolean;\n}>;\n\nexport type PostHogBrowserOptions = Readonly<{\n site: PostHogSiteDefinition;\n apiKey?: string | undefined;\n apiHost?: string | undefined;\n evidence?: BrowserAnalyticsEvidence;\n}>;\n\nexport type DelegatedAnalyticsEvent = Readonly<{\n eventName: string;\n properties: AnalyticsProperties;\n}>;\n\nexport function readDelegatedAnalyticsEvent(\n site: PostHogSiteDefinition,\n target: EventTarget | null,\n): DelegatedAnalyticsEvent | null {\n if (typeof Element === \"undefined\" || !(target instanceof Element)) {\n return null;\n }\n const element = target.closest(\"[data-analytics-event]\");\n if (typeof HTMLElement === \"undefined\" || !(element instanceof HTMLElement)) {\n return null;\n }\n const eventName = element.dataset.analyticsEvent?.trim();\n if (!eventName || !isAllowedDelegatedEvent(site, eventName)) {\n return null;\n }\n\n const rawProperties: Record = {\n ...(element.dataset.analyticsKind\n ? { target_kind: element.dataset.analyticsKind }\n : {}),\n ...(element.dataset.analyticsId\n ? { target_id: element.dataset.analyticsId }\n : {}),\n };\n if (typeof HTMLAnchorElement !== \"undefined\" && element instanceof HTMLAnchorElement) {\n try {\n const base = typeof window === \"undefined\"\n ? `https://${site.canonicalDomain}`\n : window.location.href;\n const targetUrl = new URL(element.href, base);\n if (targetUrl.protocol === \"http:\" || targetUrl.protocol === \"https:\") {\n const targetHost = normalizeAnalyticsHostname(targetUrl.hostname);\n rawProperties.target_host = targetHost;\n if (isAllowedAnalyticsHost(site, targetHost)) {\n const route = classifyAnalyticsRoute(site, targetUrl);\n if (route) {\n rawProperties.target_path = route.canonical_path;\n }\n }\n }\n } catch {\n // A malformed href simply contributes no target properties.\n }\n }\n return {\n eventName,\n properties: normalizeAnalyticsProperties(rawProperties),\n };\n}\n\nfunction currentBrowserEvidence(): BrowserAnalyticsEvidence | null {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return null;\n }\n return {\n hostname: window.location.hostname,\n href: window.location.href,\n referrer: document.referrer,\n production: typeof process !== \"undefined\"\n && process.env[\"NODE_ENV\"] === \"production\",\n };\n}\n\nexport function isPostHogBrowserEligible(options: PostHogBrowserOptions): boolean {\n const evidence = options.evidence ?? currentBrowserEvidence();\n return Boolean(\n evidence?.production\n && options.apiKey?.startsWith(\"phc_\")\n && isAllowedAnalyticsHost(options.site, evidence.hostname),\n );\n}\n\nfunction allowedEvent(site: PostHogSiteDefinition, eventName: string): boolean {\n return BUILT_IN_EVENTS.has(eventName) || isAllowedCustomEvent(site, eventName);\n}\n\nexport function createPostHogBeforeSend(\n site: PostHogSiteDefinition,\n resolveEvidence: () => Pick,\n): (capture: CaptureResult | null) => CaptureResult | null {\n return (capture) => {\n if (!capture || !allowedEvent(site, capture.event)) {\n return null;\n }\n const projectToken = typeof capture.properties.token === \"string\"\n && capture.properties.token.startsWith(\"phc_\")\n ? capture.properties.token\n : null;\n if (!projectToken) {\n return null;\n }\n const evidence = resolveEvidence();\n const rawCurrentUrl = typeof capture.properties.$current_url === \"string\"\n ? capture.properties.$current_url\n : evidence.href;\n const route = classifyAnalyticsRoute(site, rawCurrentUrl);\n if (!route) {\n return null;\n }\n const rawReferrer = typeof capture.properties.$referrer === \"string\"\n ? capture.properties.$referrer\n : evidence.referrer;\n const traffic = classifyAnalyticsTraffic(site, rawReferrer, rawCurrentUrl);\n const properties = sanitizeProviderProperties(site, capture.properties);\n // PostHog derives the batch api_key from this required transport property.\n // Preserve the already-validated public project token after generic strings\n // are redacted so ingestion can still attribute the event to its project.\n properties.token = projectToken;\n properties.$current_url = canonicalAnalyticsUrl(site, route.canonical_path);\n properties.$process_person_profile = false;\n\n return {\n uuid: capture.uuid,\n event: capture.event,\n properties: {\n ...properties,\n ...route,\n ...traffic,\n },\n ...(capture.timestamp ? { timestamp: capture.timestamp } : {}),\n };\n };\n}\n\nexport function createPostHogBrowserConfig(\n site: PostHogSiteDefinition,\n evidence: Pick,\n apiHost = DEFAULT_API_HOST,\n): Partial {\n return {\n api_host: apiHost,\n ui_host: apiHost.includes(\"eu.i.posthog.com\") ? \"https://eu.posthog.com\" : \"https://us.posthog.com\",\n defaults: \"2026-05-30\",\n autocapture: false,\n rageclick: false,\n capture_pageview: \"history_change\",\n capture_pageleave: true,\n capture_performance: {\n network_timing: false,\n web_vitals: true,\n web_vitals_allowed_metrics: [\"LCP\", \"CLS\", \"FCP\", \"INP\"],\n web_vitals_attribution: false,\n },\n capture_exceptions: false,\n enable_recording_console_log: false,\n capture_heatmaps: false,\n capture_dead_clicks: false,\n disable_session_recording: true,\n disable_surveys: true,\n disable_surveys_automatic_display: true,\n disable_product_tours: true,\n disable_conversations: true,\n advanced_disable_flags: true,\n advanced_disable_feature_flags: true,\n advanced_disable_feature_flags_on_first_load: true,\n person_profiles: \"never\",\n persistence: \"memory\",\n cookieless_mode: \"always\",\n respect_dnt: true,\n cross_subdomain_cookie: false,\n disableDeviceModel: true,\n disable_capture_url_hashes: true,\n mask_all_text: true,\n mask_all_element_attributes: true,\n mask_personal_data_properties: true,\n custom_personal_data_properties: [\"email\", \"token\", \"code\", \"key\", \"secret\"],\n properties_string_max_length: 2_048,\n internal_or_test_user_hostname: null,\n rate_limiting: {\n events_per_second: 2,\n events_burst_limit: 12,\n },\n before_send: createPostHogBeforeSend(site, () => evidence),\n };\n}\n\nexport function initializePostHogBrowser(options: PostHogBrowserOptions): boolean {\n if (!isPostHogBrowserEligible(options)) {\n return false;\n }\n if (activeSiteId === options.site.id) {\n return true;\n }\n const evidence = options.evidence ?? currentBrowserEvidence();\n if (!evidence || !options.apiKey) {\n return false;\n }\n posthog.init(\n options.apiKey,\n createPostHogBrowserConfig(options.site, evidence, options.apiHost),\n );\n activeSiteId = options.site.id;\n return true;\n}\n\nexport function capturePostHogEvent(\n site: PostHogSiteDefinition,\n eventName: string,\n properties: unknown = {},\n): boolean {\n if (activeSiteId !== site.id || !isAllowedCustomEvent(site, eventName)) {\n return false;\n }\n posthog.capture(eventName, normalizeAnalyticsProperties(properties));\n return true;\n}\n\nexport function capturePostHogException(\n site: PostHogSiteDefinition,\n value: unknown,\n properties: unknown = {},\n): boolean {\n if (activeSiteId !== site.id) {\n return false;\n }\n if (value && typeof value === \"object\") {\n if (seenErrors.has(value)) {\n return false;\n }\n seenErrors.add(value);\n }\n const error = sanitizeAnalyticsError(value);\n const fingerprint = analyticsErrorFingerprint(error);\n if (!clientExceptionBudget.allow(fingerprint)) {\n return false;\n }\n posthog.captureException(error, {\n ...normalizeAnalyticsProperties(properties),\n error_fingerprint: fingerprint,\n error_surface: \"browser\",\n });\n return true;\n}\n\nexport function installPostHogExceptionCapture(site: PostHogSiteDefinition): () => void {\n const onError = (event: ErrorEvent): void => {\n if (event.error instanceof Error) {\n capturePostHogException(site, event.error, { error_origin: \"window_error\" });\n }\n };\n const onUnhandledRejection = (event: PromiseRejectionEvent): void => {\n capturePostHogException(site, event.reason, { error_origin: \"unhandled_rejection\" });\n };\n window.addEventListener(\"error\", onError);\n window.addEventListener(\"unhandledrejection\", onUnhandledRejection);\n return () => {\n window.removeEventListener(\"error\", onError);\n window.removeEventListener(\"unhandledrejection\", onUnhandledRejection);\n };\n}\n\nexport function installDelegatedPostHogCapture(site: PostHogSiteDefinition): () => void {\n const onClick = (event: MouseEvent): void => {\n if (event.button !== 0) {\n return;\n }\n const delegated = readDelegatedAnalyticsEvent(site, event.target);\n if (delegated) {\n capturePostHogEvent(site, delegated.eventName, delegated.properties);\n }\n };\n document.addEventListener(\"click\", onClick);\n return () => {\n document.removeEventListener(\"click\", onClick);\n };\n}\n\nexport type { AnalyticsProperties };\n", + "import { posthog } from \"posthog-js\";\nimport type { CaptureResult, PostHogConfig } from \"posthog-js\";\n\nimport {\n analyticsErrorFingerprint,\n ExceptionBudget,\n normalizeAnalyticsProperties,\n sanitizeAnalyticsError,\n sanitizeProviderProperties,\n type AnalyticsProperties,\n} from \"./event.js\";\nimport {\n canonicalAnalyticsUrl,\n classifyAnalyticsRoute,\n isAllowedAnalyticsHost,\n isAllowedCustomEvent,\n isAllowedDelegatedEvent,\n normalizeAnalyticsHostname,\n type PostHogSiteDefinition,\n} from \"./site.js\";\nimport { classifyAnalyticsTraffic } from \"./traffic.js\";\n\nconst BUILT_IN_EVENTS = new Set([\"$pageview\", \"$pageleave\", \"$web_vitals\", \"$exception\"]);\nconst DEFAULT_API_HOST = \"https://us.i.posthog.com\";\nconst clientExceptionBudget = new ExceptionBudget({\n totalLimit: 20,\n perFingerprintLimit: 2,\n windowMs: 60_000,\n});\nconst seenErrors = new WeakSet();\n\nlet activeSiteId: string | null = null;\n\nexport type BrowserAnalyticsEvidence = Readonly<{\n hostname: string;\n href: string;\n referrer: string;\n production: boolean;\n}>;\n\nexport type PostHogBrowserOptions = Readonly<{\n site: PostHogSiteDefinition;\n apiKey?: string | undefined;\n apiHost?: string | undefined;\n evidence?: BrowserAnalyticsEvidence;\n}>;\n\nexport type DelegatedAnalyticsEvent = Readonly<{\n eventName: string;\n properties: AnalyticsProperties;\n}>;\n\nexport function readDelegatedAnalyticsEvent(\n site: PostHogSiteDefinition,\n target: EventTarget | null,\n): DelegatedAnalyticsEvent | null {\n if (typeof Element === \"undefined\" || !(target instanceof Element)) {\n return null;\n }\n const element = target.closest(\"[data-analytics-event]\");\n if (typeof HTMLElement === \"undefined\" || !(element instanceof HTMLElement)) {\n return null;\n }\n const eventName = element.dataset.analyticsEvent?.trim();\n if (!eventName || !isAllowedDelegatedEvent(site, eventName)) {\n return null;\n }\n\n const rawProperties: Record = {\n ...(element.dataset.analyticsKind\n ? { target_kind: element.dataset.analyticsKind }\n : {}),\n ...(element.dataset.analyticsId\n ? { target_id: element.dataset.analyticsId }\n : {}),\n };\n if (typeof HTMLAnchorElement !== \"undefined\" && element instanceof HTMLAnchorElement) {\n try {\n const base = typeof window === \"undefined\"\n ? `https://${site.canonicalDomain}`\n : window.location.href;\n const targetUrl = new URL(element.href, base);\n if (targetUrl.protocol === \"http:\" || targetUrl.protocol === \"https:\") {\n const targetHost = normalizeAnalyticsHostname(targetUrl.hostname);\n rawProperties.target_host = targetHost;\n if (isAllowedAnalyticsHost(site, targetHost)) {\n const route = classifyAnalyticsRoute(site, targetUrl);\n if (route) {\n rawProperties.target_path = route.canonical_path;\n }\n }\n }\n } catch {\n // A malformed href simply contributes no target properties.\n }\n }\n return {\n eventName,\n properties: normalizeAnalyticsProperties(rawProperties),\n };\n}\n\nfunction currentBrowserEvidence(): BrowserAnalyticsEvidence | null {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return null;\n }\n return {\n hostname: window.location.hostname,\n href: window.location.href,\n referrer: document.referrer,\n production: typeof process !== \"undefined\"\n && process.env[\"NODE_ENV\"] === \"production\",\n };\n}\n\nexport function isPostHogBrowserEligible(options: PostHogBrowserOptions): boolean {\n const evidence = options.evidence ?? currentBrowserEvidence();\n return Boolean(\n evidence?.production\n && options.apiKey?.startsWith(\"phc_\")\n && isAllowedAnalyticsHost(options.site, evidence.hostname),\n );\n}\n\nfunction allowedEvent(site: PostHogSiteDefinition, eventName: string): boolean {\n return BUILT_IN_EVENTS.has(eventName) || isAllowedCustomEvent(site, eventName);\n}\n\nexport function createPostHogBeforeSend(\n site: PostHogSiteDefinition,\n resolveEvidence: () => Pick,\n): (capture: CaptureResult | null) => CaptureResult | null {\n return (capture) => {\n if (!capture || !allowedEvent(site, capture.event)) {\n return null;\n }\n const projectToken = typeof capture.properties.token === \"string\"\n && capture.properties.token.startsWith(\"phc_\")\n ? capture.properties.token\n : null;\n if (!projectToken) {\n return null;\n }\n const evidence = resolveEvidence();\n const rawCurrentUrl = typeof capture.properties.$current_url === \"string\"\n ? capture.properties.$current_url\n : evidence.href;\n const route = classifyAnalyticsRoute(site, rawCurrentUrl);\n if (!route) {\n return null;\n }\n const rawReferrer = typeof capture.properties.$referrer === \"string\"\n ? capture.properties.$referrer\n : evidence.referrer;\n const traffic = classifyAnalyticsTraffic(site, rawReferrer, rawCurrentUrl);\n const properties = sanitizeProviderProperties(site, capture.properties);\n // PostHog derives the batch api_key from this required transport property.\n // Preserve the already-validated public project token after generic strings\n // are redacted so ingestion can still attribute the event to its project.\n properties.token = projectToken;\n properties.$current_url = canonicalAnalyticsUrl(site, route.canonical_path);\n properties.$process_person_profile = false;\n\n return {\n uuid: capture.uuid,\n event: capture.event,\n properties: {\n ...properties,\n ...route,\n ...traffic,\n },\n ...(capture.timestamp ? { timestamp: capture.timestamp } : {}),\n };\n };\n}\n\nexport function createPostHogBrowserConfig(\n site: PostHogSiteDefinition,\n evidence: Pick,\n apiHost = DEFAULT_API_HOST,\n): Partial {\n return {\n api_host: apiHost,\n ui_host: apiHost.includes(\"eu.i.posthog.com\") ? \"https://eu.posthog.com\" : \"https://us.posthog.com\",\n defaults: \"2026-05-30\",\n autocapture: false,\n rageclick: false,\n capture_pageview: \"history_change\",\n capture_pageleave: true,\n capture_performance: {\n network_timing: false,\n web_vitals: true,\n web_vitals_allowed_metrics: [\"LCP\", \"CLS\", \"FCP\", \"INP\"],\n web_vitals_attribution: false,\n },\n capture_exceptions: false,\n enable_recording_console_log: false,\n capture_heatmaps: false,\n capture_dead_clicks: false,\n disable_session_recording: true,\n disable_surveys: true,\n disable_surveys_automatic_display: true,\n disable_product_tours: true,\n disable_conversations: true,\n advanced_disable_flags: true,\n advanced_disable_feature_flags: true,\n advanced_disable_feature_flags_on_first_load: true,\n person_profiles: \"never\",\n persistence: \"memory\",\n cookieless_mode: \"always\",\n respect_dnt: true,\n cross_subdomain_cookie: false,\n disableDeviceModel: true,\n disable_capture_url_hashes: true,\n mask_all_text: true,\n mask_all_element_attributes: true,\n mask_personal_data_properties: true,\n custom_personal_data_properties: [\"email\", \"token\", \"code\", \"key\", \"secret\"],\n properties_string_max_length: 2_048,\n internal_or_test_user_hostname: null,\n rate_limiting: {\n events_per_second: 2,\n events_burst_limit: 12,\n },\n before_send: createPostHogBeforeSend(site, () => evidence),\n };\n}\n\nexport function initializePostHogBrowser(options: PostHogBrowserOptions): boolean {\n if (!isPostHogBrowserEligible(options)) {\n return false;\n }\n if (activeSiteId === options.site.id) {\n return true;\n }\n const evidence = options.evidence ?? currentBrowserEvidence();\n if (!evidence || !options.apiKey) {\n return false;\n }\n posthog.init(\n options.apiKey,\n createPostHogBrowserConfig(options.site, evidence, options.apiHost),\n );\n activeSiteId = options.site.id;\n return true;\n}\n\nexport function capturePostHogEvent(\n site: PostHogSiteDefinition,\n eventName: string,\n properties: unknown = {},\n): boolean {\n if (activeSiteId !== site.id || !isAllowedCustomEvent(site, eventName)) {\n return false;\n }\n posthog.capture(eventName, normalizeAnalyticsProperties(properties));\n return true;\n}\n\nexport function capturePostHogException(\n site: PostHogSiteDefinition,\n value: unknown,\n properties: unknown = {},\n): boolean {\n if (activeSiteId !== site.id) {\n return false;\n }\n if (value && typeof value === \"object\") {\n if (seenErrors.has(value)) {\n return false;\n }\n seenErrors.add(value);\n }\n const error = sanitizeAnalyticsError(value);\n const fingerprint = analyticsErrorFingerprint(error);\n if (!clientExceptionBudget.allow(fingerprint)) {\n return false;\n }\n posthog.captureException(error, {\n ...normalizeAnalyticsProperties(properties),\n error_fingerprint: fingerprint,\n error_surface: \"browser\",\n });\n return true;\n}\n\nexport function installPostHogExceptionCapture(site: PostHogSiteDefinition): () => void {\n const onError = (event: ErrorEvent): void => {\n if (event.error instanceof Error) {\n capturePostHogException(site, event.error, { error_origin: \"window_error\" });\n }\n };\n const onUnhandledRejection = (event: PromiseRejectionEvent): void => {\n capturePostHogException(site, event.reason, { error_origin: \"unhandled_rejection\" });\n };\n window.addEventListener(\"error\", onError);\n window.addEventListener(\"unhandledrejection\", onUnhandledRejection);\n return () => {\n window.removeEventListener(\"error\", onError);\n window.removeEventListener(\"unhandledrejection\", onUnhandledRejection);\n };\n}\n\nexport function installDelegatedPostHogCapture(site: PostHogSiteDefinition): () => void {\n const onClick = (event: MouseEvent): void => {\n if (event.button !== 0) {\n return;\n }\n const delegated = readDelegatedAnalyticsEvent(site, event.target);\n if (delegated) {\n capturePostHogEvent(site, delegated.eventName, delegated.properties);\n }\n };\n document.addEventListener(\"click\", onClick);\n return () => {\n document.removeEventListener(\"click\", onClick);\n };\n}\n\nexport type { AnalyticsProperties };\n", "export const POSTHOG_SCHEMA_VERSION = 1 as const;\n\nconst MAX_PATH_LENGTH = 512;\nconst MAX_SLUG_LENGTH = 160;\n\nexport type AnalyticsRouteRule = Readonly<{\n match: \"exact\" | \"prefix\";\n path: string;\n pageKind: string;\n contentGroup?: string;\n captureSlug?: boolean;\n}>;\n\nexport type PostHogSiteDefinition = Readonly<{\n id: string;\n canonicalDomain: string;\n allowedHosts: readonly string[];\n schemaVersion: number;\n routes: readonly AnalyticsRouteRule[];\n customEvents: readonly string[];\n delegatedEvents?: readonly string[];\n stripQueryAttribution?: boolean;\n unknownCanonicalPath?: string;\n}>;\n\nexport type AnalyticsRouteContext = Readonly<{\n analytics_schema_version: number;\n site_id: string;\n canonical_domain: string;\n canonical_path: string;\n page_kind: string;\n content_group?: string;\n content_slug?: string;\n}>;\n\nexport type AnalyticsLocation = Readonly<{\n hostname: string;\n pathname: string;\n}>;\n\nexport function normalizeAnalyticsHostname(hostname: string): string {\n return hostname.trim().toLowerCase().replace(/\\.$/, \"\").replace(/:\\d+$/, \"\");\n}\n\nexport function normalizeAnalyticsPathname(pathname: string): string {\n const withoutQuery = pathname.split(/[?#]/u, 1)[0] ?? \"/\";\n const withLeadingSlash = withoutQuery.startsWith(\"/\") ? withoutQuery : `/${withoutQuery}`;\n const collapsed = withLeadingSlash.replace(/\\/{2,}/gu, \"/\");\n const withoutTrailingSlash = collapsed.length > 1 ? collapsed.replace(/\\/+$/u, \"\") : collapsed;\n return withoutTrailingSlash.slice(0, MAX_PATH_LENGTH) || \"/\";\n}\n\nexport function isAllowedAnalyticsHost(\n site: PostHogSiteDefinition,\n hostname: string,\n): boolean {\n const normalized = normalizeAnalyticsHostname(hostname);\n return site.allowedHosts.some((candidate) => normalizeAnalyticsHostname(candidate) === normalized);\n}\n\nexport function parseAnalyticsLocation(\n site: PostHogSiteDefinition,\n value: string | URL | AnalyticsLocation,\n): AnalyticsLocation | null {\n if (typeof value === \"object\" && !(value instanceof URL)) {\n if (!isAllowedAnalyticsHost(site, value.hostname)) {\n return null;\n }\n return {\n hostname: normalizeAnalyticsHostname(value.hostname),\n pathname: normalizeAnalyticsPathname(value.pathname),\n };\n }\n\n try {\n const parsed = value instanceof URL\n ? value\n : new URL(value, `https://${site.canonicalDomain}`);\n if (!isAllowedAnalyticsHost(site, parsed.hostname)) {\n return null;\n }\n return {\n hostname: normalizeAnalyticsHostname(parsed.hostname),\n pathname: normalizeAnalyticsPathname(parsed.pathname),\n };\n } catch {\n return null;\n }\n}\n\nfunction ruleMatches(rule: AnalyticsRouteRule, pathname: string): boolean {\n const rulePath = normalizeAnalyticsPathname(rule.path);\n if (rule.match === \"exact\") {\n return pathname === rulePath;\n }\n return pathname === rulePath || pathname.startsWith(`${rulePath}/`);\n}\n\nfunction slugForRule(rule: AnalyticsRouteRule, pathname: string): string | undefined {\n if (!rule.captureSlug) {\n return undefined;\n }\n const rulePath = normalizeAnalyticsPathname(rule.path);\n const relative = pathname.slice(rulePath.length).replace(/^\\/+|\\/+$/gu, \"\");\n return relative ? relative.slice(0, MAX_SLUG_LENGTH) : undefined;\n}\n\nexport function classifyAnalyticsRoute(\n site: PostHogSiteDefinition,\n location: string | URL | AnalyticsLocation,\n): AnalyticsRouteContext | null {\n const parsed = parseAnalyticsLocation(site, location);\n if (!parsed) {\n return null;\n }\n\n const rule = site.routes.find((candidate) => ruleMatches(candidate, parsed.pathname));\n const contentSlug = rule ? slugForRule(rule, parsed.pathname) : undefined;\n return {\n analytics_schema_version: site.schemaVersion,\n site_id: site.id,\n canonical_domain: normalizeAnalyticsHostname(site.canonicalDomain),\n canonical_path: rule === undefined && site.unknownCanonicalPath !== undefined\n ? normalizeAnalyticsPathname(site.unknownCanonicalPath)\n : parsed.pathname,\n page_kind: rule?.pageKind ?? \"other\",\n ...(rule?.contentGroup ? { content_group: rule.contentGroup } : {}),\n ...(contentSlug ? { content_slug: contentSlug } : {}),\n };\n}\n\nexport function canonicalAnalyticsUrl(\n site: PostHogSiteDefinition,\n pathname: string,\n): string {\n return `https://${normalizeAnalyticsHostname(site.canonicalDomain)}${normalizeAnalyticsPathname(pathname)}`;\n}\n\nexport function isAllowedCustomEvent(\n site: PostHogSiteDefinition,\n eventName: string,\n): boolean {\n return site.customEvents.includes(eventName);\n}\n\nexport function isAllowedDelegatedEvent(\n site: PostHogSiteDefinition,\n eventName: string,\n): boolean {\n return site.delegatedEvents?.includes(eventName) ?? false;\n}\n", "import {\n canonicalAnalyticsUrl,\n classifyAnalyticsRoute,\n isAllowedAnalyticsHost,\n normalizeAnalyticsPathname,\n type PostHogSiteDefinition,\n} from \"./site.js\";\n\nconst MAX_PROPERTY_COUNT = 32;\nconst MAX_PROPERTY_KEY_LENGTH = 64;\nconst MAX_PROPERTY_STRING_LENGTH = 256;\nconst MAX_PROPERTY_ARRAY_LENGTH = 20;\nconst MAX_ERROR_MESSAGE_LENGTH = 512;\nconst MAX_ERROR_STACK_LENGTH = 6_000;\nconst MAX_PROVIDER_PROPERTY_STRING_LENGTH = 2_048;\n\nexport type AnalyticsPrimitive = string | number | boolean | null;\nexport type AnalyticsPropertyValue = AnalyticsPrimitive | readonly AnalyticsPrimitive[];\nexport type AnalyticsProperties = Readonly>;\n\nconst CURRENT_URL_KEYS = new Set([\n \"$current_url\",\n \"$initial_current_url\",\n \"$session_entry_url\",\n \"current_url\",\n \"url\",\n \"href\",\n \"url.full\",\n]);\n\nconst QUERY_ATTRIBUTION_PROPERTY_NAMES = new Set([\n \"_kx\",\n \"campaign_params\",\n \"dclid\",\n \"epik\",\n \"fbclid\",\n \"gad_source\",\n \"gbraid\",\n \"gclid\",\n \"gclsrc\",\n \"igshid\",\n \"irclid\",\n \"li_fat_id\",\n \"mc_cid\",\n \"msclkid\",\n \"qclid\",\n \"rdt_cid\",\n \"sccid\",\n \"ttclid\",\n \"twclid\",\n \"utm_campaign\",\n \"utm_content\",\n \"utm_medium\",\n \"utm_source\",\n \"utm_term\",\n \"wbraid\",\n]);\n\nconst REFERRER_URL_KEYS = new Set([\n \"$referrer\",\n \"$initial_referrer\",\n \"referrer\",\n]);\n\nfunction normalizedProviderPropertyName(key: string): string {\n return key.toLowerCase()\n .replace(/^\\$/u, \"\")\n .replace(/^(?:initial|session_entry)_/u, \"\");\n}\n\nfunction isProviderPathnameKey(key: string): boolean {\n return /^(?:\\$)?(?:(?:initial|session_entry|prev_pageview)_)?pathname$/u.test(\n key.toLowerCase(),\n );\n}\n\nfunction isQueryAttributionKey(key: string): boolean {\n return QUERY_ATTRIBUTION_PROPERTY_NAMES.has(\n normalizedProviderPropertyName(key),\n );\n}\n\nfunction cleanPropertyString(value: string): string {\n return Array.from(value, (character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n return codePoint < 32 || codePoint === 127 ? \" \" : character;\n }).join(\"\")\n .replace(/\\s{2,}/gu, \" \")\n .trim()\n .slice(0, MAX_PROPERTY_STRING_LENGTH);\n}\n\nfunction normalizePrimitive(value: unknown): AnalyticsPrimitive | undefined {\n if (value === null || typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n if (typeof value === \"string\") {\n return cleanPropertyString(value);\n }\n return undefined;\n}\n\nfunction normalizePropertyValue(value: unknown): AnalyticsPropertyValue | undefined {\n const primitive = normalizePrimitive(value);\n if (primitive !== undefined) {\n return primitive;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n const normalized = value\n .slice(0, MAX_PROPERTY_ARRAY_LENGTH)\n .map(normalizePrimitive)\n .filter((item): item is AnalyticsPrimitive => item !== undefined);\n return normalized;\n}\n\nexport function normalizeAnalyticsProperties(value: unknown): AnalyticsProperties {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n const normalized: Record = {};\n for (const [key, propertyValue] of Object.entries(value).slice(0, MAX_PROPERTY_COUNT)) {\n if (!/^[a-z][a-z0-9_]*$/u.test(key) || key.length > MAX_PROPERTY_KEY_LENGTH) {\n continue;\n }\n const safeValue = normalizePropertyValue(propertyValue);\n if (safeValue !== undefined) {\n normalized[key] = safeValue;\n }\n }\n return normalized;\n}\n\nfunction sanitizeThirdPartyUrl(value: string, originOnly: boolean): string {\n try {\n const parsed = new URL(value);\n return originOnly ? parsed.origin : `${parsed.origin}${normalizeAnalyticsPathname(parsed.pathname)}`;\n } catch {\n return \"\";\n }\n}\n\nfunction sanitizeUrlValue(\n site: PostHogSiteDefinition,\n key: string,\n value: string,\n): string {\n if (REFERRER_URL_KEYS.has(key)) {\n return sanitizeThirdPartyUrl(value, true);\n }\n if (isProviderPathnameKey(key)) {\n try {\n const parsed = new URL(value, `https://${site.canonicalDomain}`);\n if (!isAllowedAnalyticsHost(site, parsed.hostname)) return \"\";\n return classifyAnalyticsRoute(site, parsed)?.canonical_path ?? \"/\";\n } catch {\n return \"\";\n }\n }\n if (!CURRENT_URL_KEYS.has(key)) {\n return value;\n }\n try {\n const parsed = new URL(value, `https://${site.canonicalDomain}`);\n if (!isAllowedAnalyticsHost(site, parsed.hostname)) {\n return sanitizeThirdPartyUrl(parsed.href, true);\n }\n const route = classifyAnalyticsRoute(site, parsed);\n return canonicalAnalyticsUrl(site, route?.canonical_path ?? \"/\");\n } catch {\n return \"\";\n }\n}\n\nfunction sanitizeProviderValue(\n site: PostHogSiteDefinition,\n key: string,\n value: unknown,\n depth: number,\n seen: WeakSet,\n): unknown {\n if (site.stripQueryAttribution === true && isQueryAttributionKey(key)) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return redactSensitiveText(sanitizeUrlValue(site, key, value))\n .slice(0, MAX_PROVIDER_PROPERTY_STRING_LENGTH);\n }\n if (value === null || typeof value === \"boolean\" || typeof value === \"number\") {\n return value;\n }\n if (depth >= 5 || !value || typeof value !== \"object\") {\n return undefined;\n }\n if (seen.has(value)) {\n return undefined;\n }\n seen.add(value);\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeProviderValue(site, key, item, depth + 1, seen));\n }\n const result: Record = {};\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n const safeValue = sanitizeProviderValue(site, nestedKey, nestedValue, depth + 1, seen);\n if (safeValue !== undefined) {\n result[nestedKey] = safeValue;\n }\n }\n return result;\n}\n\nexport function sanitizeProviderProperties(\n site: PostHogSiteDefinition,\n properties: Readonly>,\n): Record {\n const seen = new WeakSet();\n const sanitized: Record = {};\n for (const [key, value] of Object.entries(properties)) {\n const safeValue = sanitizeProviderValue(site, key, value, 0, seen);\n if (safeValue !== undefined) {\n sanitized[key] = safeValue;\n }\n }\n return sanitized;\n}\n\nfunction redactSensitiveText(value: string): string {\n return value\n .replace(/\\b(?:phc|phx|phs|pha|phr)_[A-Za-z0-9_-]+\\b/gu, \"[credential]\")\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]+\\b/giu, \"Bearer [credential]\")\n .replace(/\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/gu, \"[credential]\")\n .replace(/([a-z][a-z0-9+.-]*:\\/\\/)([^/\\s?#]+)@/giu, \"$1[credential]@\")\n .replace(/\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/giu, \"[email]\")\n .replace(/(https?:\\/\\/[^\\s?#)]+)(?:\\?[^\\s#)]*)?(?:#[^\\s)]*)?/giu, \"$1\")\n .replace(/([/][^\\s?#)]+)\\?[^\\s#)]*/gu, \"$1\")\n .replace(/\\b(api[_-]?key|access[_-]?token|auth(?:orization)?|secret|password)=([^\\s&]+)/giu, \"$1=[redacted]\");\n}\n\nexport function sanitizeAnalyticsError(value: unknown): Error {\n try {\n if (!(value instanceof Error)) {\n return new Error(\"Non-Error rejection\");\n }\n const name = redactSensitiveText(value.name || \"Error\").slice(0, 80) || \"Error\";\n const message = redactSensitiveText(value.message || \"Unknown error\").slice(0, MAX_ERROR_MESSAGE_LENGTH);\n const sanitized = new Error(message);\n sanitized.name = name;\n if (value.stack) {\n sanitized.stack = redactSensitiveText(value.stack).slice(0, MAX_ERROR_STACK_LENGTH);\n }\n return sanitized;\n } catch {\n return new Error(\"Uninspectable rejection\");\n }\n}\n\nexport function analyticsErrorFingerprint(error: Error): string {\n const stackFrame = error.stack?.split(\"\\n\").slice(1, 3).join(\"\\n\") ?? \"\";\n const input = `${error.name}\\n${error.message}\\n${stackFrame}`;\n let hash = 2_166_136_261;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 16_777_619);\n }\n return `e_${(hash >>> 0).toString(16).padStart(8, \"0\")}`;\n}\n\nexport class ExceptionBudget {\n readonly #totalLimit: number;\n readonly #perFingerprintLimit: number;\n readonly #windowMs: number;\n #all: number[] = [];\n #byFingerprint = new Map();\n\n constructor(options: Readonly<{\n totalLimit: number;\n perFingerprintLimit: number;\n windowMs: number;\n }>) {\n this.#totalLimit = options.totalLimit;\n this.#perFingerprintLimit = options.perFingerprintLimit;\n this.#windowMs = options.windowMs;\n }\n\n get activeFingerprintCount(): number {\n return this.#byFingerprint.size;\n }\n\n allow(fingerprint: string, now = Date.now()): boolean {\n const threshold = now - this.#windowMs;\n this.#all = this.#all.filter((timestamp) => timestamp > threshold);\n for (const [candidate, timestamps] of this.#byFingerprint) {\n const active = timestamps.filter((timestamp) => timestamp > threshold);\n if (active.length === 0) {\n this.#byFingerprint.delete(candidate);\n } else if (active.length !== timestamps.length) {\n this.#byFingerprint.set(candidate, active);\n }\n }\n const matching = this.#byFingerprint.get(fingerprint) ?? [];\n if (this.#all.length >= this.#totalLimit || matching.length >= this.#perFingerprintLimit) {\n return false;\n }\n this.#all.push(now);\n matching.push(now);\n this.#byFingerprint.set(fingerprint, matching);\n return true;\n }\n}\n", "import {\n isAllowedAnalyticsHost,\n normalizeAnalyticsHostname,\n type PostHogSiteDefinition,\n} from \"./site.js\";\n\nexport type AnalyticsTrafficChannel =\n | \"direct\"\n | \"internal\"\n | \"organic_search\"\n | \"ai_referral\"\n | \"social\"\n | \"referral\";\n\nexport type AnalyticsTrafficContext = Readonly<{\n traffic_channel: AnalyticsTrafficChannel;\n traffic_source: string;\n referrer_host?: string;\n}>;\n\nconst AI_SOURCES = [\n [\"chatgpt\", [\"chatgpt.com\", \"chat.openai.com\"]],\n [\"perplexity\", [\"perplexity.ai\"]],\n [\"claude\", [\"claude.ai\"]],\n [\"gemini\", [\"gemini.google.com\"]],\n [\"copilot\", [\"copilot.microsoft.com\"]],\n [\"poe\", [\"poe.com\"]],\n [\"you.com\", [\"you.com\"]],\n [\"meta_ai\", [\"meta.ai\"]],\n] as const;\n\nconst SEARCH_SOURCES = [\n [\"google\", [\"google.com\", \"google.co.uk\", \"google.ca\", \"google.com.au\"]],\n [\"bing\", [\"bing.com\"]],\n [\"duckduckgo\", [\"duckduckgo.com\"]],\n [\"yahoo\", [\"search.yahoo.com\", \"yahoo.com\"]],\n [\"brave\", [\"search.brave.com\"]],\n [\"ecosia\", [\"ecosia.org\"]],\n [\"baidu\", [\"baidu.com\"]],\n [\"yandex\", [\"yandex.com\", \"yandex.ru\"]],\n] as const;\n\nconst SOCIAL_SOURCES = [\n [\"reddit\", [\"reddit.com\"]],\n [\"x\", [\"x.com\", \"twitter.com\", \"t.co\"]],\n [\"linkedin\", [\"linkedin.com\"]],\n [\"facebook\", [\"facebook.com\", \"fb.com\"]],\n [\"instagram\", [\"instagram.com\"]],\n [\"youtube\", [\"youtube.com\", \"youtu.be\"]],\n [\"mastodon\", [\"mastodon.social\"]],\n [\"threads\", [\"threads.net\"]],\n] as const;\n\nfunction hostnameMatches(hostname: string, domain: string): boolean {\n return hostname === domain || hostname.endsWith(`.${domain}`);\n}\n\nfunction sourceForHostname(\n hostname: string,\n sources: readonly (readonly [string, readonly string[]])[],\n): string | null {\n for (const [source, domains] of sources) {\n if (domains.some((domain) => hostnameMatches(hostname, domain))) {\n return source;\n }\n }\n return null;\n}\n\nfunction sourceForAttribution(\n value: string,\n sources: readonly (readonly [string, readonly string[]])[],\n): string | null {\n const normalized = value.trim().toLowerCase().replace(/^www\\./u, \"\");\n if (!normalized) {\n return null;\n }\n for (const [source, domains] of sources) {\n if (\n normalized === source\n || domains.some((domain) => hostnameMatches(normalized, domain))\n ) {\n return source;\n }\n }\n return null;\n}\n\nfunction parseAttributionSource(\n site: PostHogSiteDefinition,\n currentUrl: string | null | undefined,\n): string | null {\n if (!currentUrl) {\n return null;\n }\n try {\n return new URL(currentUrl, `https://${site.canonicalDomain}`)\n .searchParams.get(\"utm_source\");\n } catch {\n return null;\n }\n}\n\nfunction parseReferrerHostname(referrer: string | null | undefined): string | null {\n if (!referrer || referrer === \"$direct\") {\n return null;\n }\n try {\n return normalizeAnalyticsHostname(new URL(referrer).hostname);\n } catch {\n return \"\";\n }\n}\n\nexport function classifyAnalyticsTraffic(\n site: PostHogSiteDefinition,\n referrer: string | null | undefined,\n currentUrl?: string | null,\n): AnalyticsTrafficContext {\n const attributionSource = parseAttributionSource(site, currentUrl);\n if (attributionSource) {\n const attributedAiSource = sourceForAttribution(attributionSource, AI_SOURCES);\n if (attributedAiSource) {\n return {\n traffic_channel: \"ai_referral\",\n traffic_source: attributedAiSource,\n };\n }\n\n const attributedSearchSource = sourceForAttribution(\n attributionSource,\n SEARCH_SOURCES,\n );\n if (attributedSearchSource) {\n return {\n traffic_channel: \"organic_search\",\n traffic_source: attributedSearchSource,\n };\n }\n\n const attributedSocialSource = sourceForAttribution(\n attributionSource,\n SOCIAL_SOURCES,\n );\n if (attributedSocialSource) {\n return {\n traffic_channel: \"social\",\n traffic_source: attributedSocialSource,\n };\n }\n }\n\n const hostname = parseReferrerHostname(referrer);\n if (hostname === null) {\n return { traffic_channel: \"direct\", traffic_source: \"direct\" };\n }\n if (!hostname) {\n return { traffic_channel: \"referral\", traffic_source: \"unknown\" };\n }\n if (isAllowedAnalyticsHost(site, hostname)) {\n return {\n traffic_channel: \"internal\",\n traffic_source: \"internal\",\n referrer_host: hostname,\n };\n }\n\n const publicHostname = hostname.replace(/^www\\./u, \"\");\n\n const aiSource = sourceForHostname(publicHostname, AI_SOURCES);\n if (aiSource) {\n return {\n traffic_channel: \"ai_referral\",\n traffic_source: aiSource,\n referrer_host: publicHostname,\n };\n }\n\n const searchSource = sourceForHostname(publicHostname, SEARCH_SOURCES);\n if (searchSource) {\n return {\n traffic_channel: \"organic_search\",\n traffic_source: searchSource,\n referrer_host: publicHostname,\n };\n }\n\n const socialSource = sourceForHostname(publicHostname, SOCIAL_SOURCES);\n if (socialSource) {\n return {\n traffic_channel: \"social\",\n traffic_source: socialSource,\n referrer_host: publicHostname,\n };\n }\n\n return {\n traffic_channel: \"referral\",\n traffic_source: publicHostname,\n referrer_host: publicHostname,\n };\n}\n" ], - "mappings": ";;;AAEA;;;ACAA,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAqCjB,SAAS,0BAA0B,CAAC,UAA0B;AAAA,EACnE,OAAO,SAAS,KAAK,EAAE,YAAY,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,SAAS,EAAE;AAAA;AAGtE,SAAS,0BAA0B,CAAC,UAA0B;AAAA,EACnE,MAAM,eAAe,SAAS,MAAM,SAAS,CAAC,EAAE,MAAM;AAAA,EACtD,MAAM,mBAAmB,aAAa,WAAW,GAAG,IAAI,eAAe,IAAI;AAAA,EAC3E,MAAM,YAAY,iBAAiB,QAAQ,YAAY,GAAG;AAAA,EAC1D,MAAM,uBAAuB,UAAU,SAAS,IAAI,UAAU,QAAQ,SAAS,EAAE,IAAI;AAAA,EACrF,OAAO,qBAAqB,MAAM,GAAG,eAAe,KAAK;AAAA;AAGpD,SAAS,sBAAsB,CACpC,MACA,UACS;AAAA,EACT,MAAM,aAAa,2BAA2B,QAAQ;AAAA,EACtD,OAAO,KAAK,aAAa,KAAK,CAAC,cAAc,2BAA2B,SAAS,MAAM,UAAU;AAAA;AAG5F,SAAS,sBAAsB,CACpC,MACA,OAC0B;AAAA,EAC1B,IAAI,OAAO,UAAU,YAAY,EAAE,iBAAiB,MAAM;AAAA,IACxD,IAAI,CAAC,uBAAuB,MAAM,MAAM,QAAQ,GAAG;AAAA,MACjD,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,UAAU,2BAA2B,MAAM,QAAQ;AAAA,MACnD,UAAU,2BAA2B,MAAM,QAAQ;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,SAAS,iBAAiB,MAC5B,QACA,IAAI,IAAI,OAAO,WAAW,KAAK,iBAAiB;AAAA,IACpD,IAAI,CAAC,uBAAuB,MAAM,OAAO,QAAQ,GAAG;AAAA,MAClD,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,UAAU,2BAA2B,OAAO,QAAQ;AAAA,MACpD,UAAU,2BAA2B,OAAO,QAAQ;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,WAAW,CAAC,MAA0B,UAA2B;AAAA,EACxE,MAAM,WAAW,2BAA2B,KAAK,IAAI;AAAA,EACrD,IAAI,KAAK,UAAU,SAAS;AAAA,IAC1B,OAAO,aAAa;AAAA,EACtB;AAAA,EACA,OAAO,aAAa,YAAY,SAAS,WAAW,GAAG,WAAW;AAAA;AAGpE,SAAS,WAAW,CAAC,MAA0B,UAAsC;AAAA,EACnF,IAAI,CAAC,KAAK,aAAa;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,WAAW,2BAA2B,KAAK,IAAI;AAAA,EACrD,MAAM,WAAW,SAAS,MAAM,SAAS,MAAM,EAAE,QAAQ,eAAe,EAAE;AAAA,EAC1E,OAAO,WAAW,SAAS,MAAM,GAAG,eAAe,IAAI;AAAA;AAGlD,SAAS,sBAAsB,CACpC,MACA,UAC8B;AAAA,EAC9B,MAAM,SAAS,uBAAuB,MAAM,QAAQ;AAAA,EACpD,IAAI,CAAC,QAAQ;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,KAAK,OAAO,KAAK,CAAC,cAAc,YAAY,WAAW,OAAO,QAAQ,CAAC;AAAA,EACpF,MAAM,cAAc,OAAO,YAAY,MAAM,OAAO,QAAQ,IAAI;AAAA,EAChE,OAAO;AAAA,IACL,0BAA0B,KAAK;AAAA,IAC/B,SAAS,KAAK;AAAA,IACd,kBAAkB,2BAA2B,KAAK,eAAe;AAAA,IACjE,gBAAgB,SAAS,aAAa,KAAK,yBAAyB,YAChE,2BAA2B,KAAK,oBAAoB,IACpD,OAAO;AAAA,IACX,WAAW,MAAM,YAAY;AAAA,OACzB,MAAM,eAAe,EAAE,eAAe,KAAK,aAAa,IAAI,CAAC;AAAA,OAC7D,cAAc,EAAE,cAAc,YAAY,IAAI,CAAC;AAAA,EACrD;AAAA;AAGK,SAAS,qBAAqB,CACnC,MACA,UACQ;AAAA,EACR,OAAO,WAAW,2BAA2B,KAAK,eAAe,IAAI,2BAA2B,QAAQ;AAAA;AAGnG,SAAS,oBAAoB,CAClC,MACA,WACS;AAAA,EACT,OAAO,KAAK,aAAa,SAAS,SAAS;AAAA;AAGtC,SAAS,uBAAuB,CACrC,MACA,WACS;AAAA,EACT,OAAO,KAAK,iBAAiB,SAAS,SAAS,KAAK;AAAA;;;AC7ItD,IAAM,qBAAqB;AAC3B,IAAM,0BAA0B;AAChC,IAAM,6BAA6B;AACnC,IAAM,4BAA4B;AAClC,IAAM,2BAA2B;AACjC,IAAM,yBAAyB;AAC/B,IAAM,sCAAsC;AAM5C,IAAM,mBAAmB,IAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,mCAAmC,IAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,oBAAoB,IAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAqB;AAAA,EAC3D,OAAO,IAAI,YAAY,EACpB,QAAQ,QAAQ,EAAE,EAClB,QAAQ,gCAAgC,EAAE;AAAA;AAG/C,SAAS,qBAAqB,CAAC,KAAsB;AAAA,EACnD,OAAO,kEAAkE,KACvE,IAAI,YAAY,CAClB;AAAA;AAGF,SAAS,qBAAqB,CAAC,KAAsB;AAAA,EACnD,OAAO,iCAAiC,IACtC,+BAA+B,GAAG,CACpC;AAAA;AAGF,SAAS,mBAAmB,CAAC,OAAuB;AAAA,EAClD,OAAO,MAAM,KAAK,OAAO,CAAC,cAAc;AAAA,IACtC,MAAM,YAAY,UAAU,YAAY,CAAC,KAAK;AAAA,IAC9C,OAAO,YAAY,MAAM,cAAc,MAAM,MAAM;AAAA,GACpD,EAAE,KAAK,EAAE,EACP,QAAQ,YAAY,GAAG,EACvB,KAAK,EACL,MAAM,GAAG,0BAA0B;AAAA;AAGxC,SAAS,kBAAkB,CAAC,OAAgD;AAAA,EAC1E,IAAI,UAAU,QAAQ,OAAO,UAAU,WAAW;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,EAC1C;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,oBAAoB,KAAK;AAAA,EAClC;AAAA,EACA;AAAA;AAGF,SAAS,sBAAsB,CAAC,OAAoD;AAAA,EAClF,MAAM,YAAY,mBAAmB,KAAK;AAAA,EAC1C,IAAI,cAAc,WAAW;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAAA,IACzB;AAAA,EACF;AAAA,EACA,MAAM,aAAa,MAChB,MAAM,GAAG,yBAAyB,EAClC,IAAI,kBAAkB,EACtB,OAAO,CAAC,SAAqC,SAAS,SAAS;AAAA,EAClE,OAAO;AAAA;AAGF,SAAS,4BAA4B,CAAC,OAAqC;AAAA,EAChF,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAAA,IAC/D,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,aAAqD,CAAC;AAAA,EAC5D,YAAY,KAAK,kBAAkB,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG;AAAA,IACrF,IAAI,CAAC,qBAAqB,KAAK,GAAG,KAAK,IAAI,SAAS,yBAAyB;AAAA,MAC3E;AAAA,IACF;AAAA,IACA,MAAM,YAAY,uBAAuB,aAAa;AAAA,IACtD,IAAI,cAAc,WAAW;AAAA,MAC3B,WAAW,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,qBAAqB,CAAC,OAAe,YAA6B;AAAA,EACzE,IAAI;AAAA,IACF,MAAM,SAAS,IAAI,IAAI,KAAK;AAAA,IAC5B,OAAO,aAAa,OAAO,SAAS,GAAG,OAAO,SAAS,2BAA2B,OAAO,QAAQ;AAAA,IACjG,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,gBAAgB,CACvB,MACA,KACA,OACQ;AAAA,EACR,IAAI,kBAAkB,IAAI,GAAG,GAAG;AAAA,IAC9B,OAAO,sBAAsB,OAAO,IAAI;AAAA,EAC1C;AAAA,EACA,IAAI,sBAAsB,GAAG,GAAG;AAAA,IAC9B,IAAI;AAAA,MACF,MAAM,SAAS,IAAI,IAAI,OAAO,WAAW,KAAK,iBAAiB;AAAA,MAC/D,IAAI,CAAC,uBAAuB,MAAM,OAAO,QAAQ;AAAA,QAAG,OAAO;AAAA,MAC3D,OAAO,uBAAuB,MAAM,MAAM,GAAG,kBAAkB;AAAA,MAC/D,MAAM;AAAA,MACN,OAAO;AAAA;AAAA,EAEX;AAAA,EACA,IAAI,CAAC,iBAAiB,IAAI,GAAG,GAAG;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,MAAM,SAAS,IAAI,IAAI,OAAO,WAAW,KAAK,iBAAiB;AAAA,IAC/D,IAAI,CAAC,uBAAuB,MAAM,OAAO,QAAQ,GAAG;AAAA,MAClD,OAAO,sBAAsB,OAAO,MAAM,IAAI;AAAA,IAChD;AAAA,IACA,MAAM,QAAQ,uBAAuB,MAAM,MAAM;AAAA,IACjD,OAAO,sBAAsB,MAAM,OAAO,kBAAkB,GAAG;AAAA,IAC/D,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,qBAAqB,CAC5B,MACA,KACA,OACA,OACA,MACS;AAAA,EACT,IAAI,KAAK,0BAA0B,QAAQ,sBAAsB,GAAG,GAAG;AAAA,IACrE;AAAA,EACF;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,oBAAoB,iBAAiB,MAAM,KAAK,KAAK,CAAC,EAC1D,MAAM,GAAG,mCAAmC;AAAA,EACjD;AAAA,EACA,IAAI,UAAU,QAAQ,OAAO,UAAU,aAAa,OAAO,UAAU,UAAU;AAAA,IAC7E,OAAO;AAAA,EACT;AAAA,EACA,IAAI,SAAS,KAAK,CAAC,SAAS,OAAO,UAAU,UAAU;AAAA,IACrD;AAAA,EACF;AAAA,EACA,IAAI,KAAK,IAAI,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AAAA,EACA,KAAK,IAAI,KAAK;AAAA,EACd,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,OAAO,MAAM,IAAI,CAAC,SAAS,sBAAsB,MAAM,KAAK,MAAM,QAAQ,GAAG,IAAI,CAAC;AAAA,EACpF;AAAA,EACA,MAAM,SAAkC,CAAC;AAAA,EACzC,YAAY,WAAW,gBAAgB,OAAO,QAAQ,KAAK,GAAG;AAAA,IAC5D,MAAM,YAAY,sBAAsB,MAAM,WAAW,aAAa,QAAQ,GAAG,IAAI;AAAA,IACrF,IAAI,cAAc,WAAW;AAAA,MAC3B,OAAO,aAAa;AAAA,IACtB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,0BAA0B,CACxC,MACA,YACyB;AAAA,EACzB,MAAM,OAAO,IAAI;AAAA,EACjB,MAAM,YAAqC,CAAC;AAAA,EAC5C,YAAY,KAAK,UAAU,OAAO,QAAQ,UAAU,GAAG;AAAA,IACrD,MAAM,YAAY,sBAAsB,MAAM,KAAK,OAAO,GAAG,IAAI;AAAA,IACjE,IAAI,cAAc,WAAW;AAAA,MAC3B,UAAU,OAAO;AAAA,IACnB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,mBAAmB,CAAC,OAAuB;AAAA,EAClD,OAAO,MACJ,QAAQ,gDAAgD,cAAc,EACtE,QAAQ,uCAAuC,qBAAqB,EACpE,QAAQ,2DAA2D,cAAc,EACjF,QAAQ,2CAA2C,iBAAiB,EACpE,QAAQ,gDAAgD,SAAS,EACjE,QAAQ,yDAAyD,IAAI,EACrE,QAAQ,8BAA8B,IAAI,EAC1C,QAAQ,oFAAoF,eAAe;AAAA;AAGzG,SAAS,sBAAsB,CAAC,OAAuB;AAAA,EAC5D,IAAI;AAAA,IACF,IAAI,EAAE,iBAAiB,QAAQ;AAAA,MAC7B,OAAO,IAAI,MAAM,qBAAqB;AAAA,IACxC;AAAA,IACA,MAAM,OAAO,oBAAoB,MAAM,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,KAAK;AAAA,IACxE,MAAM,UAAU,oBAAoB,MAAM,WAAW,eAAe,EAAE,MAAM,GAAG,wBAAwB;AAAA,IACvG,MAAM,YAAY,IAAI,MAAM,OAAO;AAAA,IACnC,UAAU,OAAO;AAAA,IACjB,IAAI,MAAM,OAAO;AAAA,MACf,UAAU,QAAQ,oBAAoB,MAAM,KAAK,EAAE,MAAM,GAAG,sBAAsB;AAAA,IACpF;AAAA,IACA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO,IAAI,MAAM,yBAAyB;AAAA;AAAA;AAIvC,SAAS,yBAAyB,CAAC,OAAsB;AAAA,EAC9D,MAAM,aAAa,MAAM,OAAO,MAAM;AAAA,CAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK;AAAA,CAAI,KAAK;AAAA,EACtE,MAAM,QAAQ,GAAG,MAAM;AAAA,EAAS,MAAM;AAAA,EAAY;AAAA,EAClD,IAAI,OAAO;AAAA,EACX,SAAS,QAAQ,EAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AAAA,IACpD,QAAQ,MAAM,WAAW,KAAK;AAAA,IAC9B,OAAO,KAAK,KAAK,MAAM,QAAU;AAAA,EACnC;AAAA,EACA,OAAO,MAAM,SAAS,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA;AAAA;AAGhD,MAAM,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACT,OAAiB,CAAC;AAAA,EAClB,iBAAiB,IAAI;AAAA,EAErB,WAAW,CAAC,SAIR;AAAA,IACF,KAAK,cAAc,QAAQ;AAAA,IAC3B,KAAK,uBAAuB,QAAQ;AAAA,IACpC,KAAK,YAAY,QAAQ;AAAA;AAAA,MAGvB,sBAAsB,GAAW;AAAA,IACnC,OAAO,KAAK,eAAe;AAAA;AAAA,EAG7B,KAAK,CAAC,aAAqB,MAAM,KAAK,IAAI,GAAY;AAAA,IACpD,MAAM,YAAY,MAAM,KAAK;AAAA,IAC7B,KAAK,OAAO,KAAK,KAAK,OAAO,CAAC,cAAc,YAAY,SAAS;AAAA,IACjE,YAAY,WAAW,eAAe,KAAK,gBAAgB;AAAA,MACzD,MAAM,SAAS,WAAW,OAAO,CAAC,cAAc,YAAY,SAAS;AAAA,MACrE,IAAI,OAAO,WAAW,GAAG;AAAA,QACvB,KAAK,eAAe,OAAO,SAAS;AAAA,MACtC,EAAO,SAAI,OAAO,WAAW,WAAW,QAAQ;AAAA,QAC9C,KAAK,eAAe,IAAI,WAAW,MAAM;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,MAAM,WAAW,KAAK,eAAe,IAAI,WAAW,KAAK,CAAC;AAAA,IAC1D,IAAI,KAAK,KAAK,UAAU,KAAK,eAAe,SAAS,UAAU,KAAK,sBAAsB;AAAA,MACxF,OAAO;AAAA,IACT;AAAA,IACA,KAAK,KAAK,KAAK,GAAG;AAAA,IAClB,SAAS,KAAK,GAAG;AAAA,IACjB,KAAK,eAAe,IAAI,aAAa,QAAQ;AAAA,IAC7C,OAAO;AAAA;AAEX;;;ACrSA,IAAM,aAAa;AAAA,EACjB,CAAC,WAAW,CAAC,eAAe,iBAAiB,CAAC;AAAA,EAC9C,CAAC,cAAc,CAAC,eAAe,CAAC;AAAA,EAChC,CAAC,UAAU,CAAC,WAAW,CAAC;AAAA,EACxB,CAAC,UAAU,CAAC,mBAAmB,CAAC;AAAA,EAChC,CAAC,WAAW,CAAC,uBAAuB,CAAC;AAAA,EACrC,CAAC,OAAO,CAAC,SAAS,CAAC;AAAA,EACnB,CAAC,WAAW,CAAC,SAAS,CAAC;AAAA,EACvB,CAAC,WAAW,CAAC,SAAS,CAAC;AACzB;AAEA,IAAM,iBAAiB;AAAA,EACrB,CAAC,UAAU,CAAC,cAAc,gBAAgB,aAAa,eAAe,CAAC;AAAA,EACvE,CAAC,QAAQ,CAAC,UAAU,CAAC;AAAA,EACrB,CAAC,cAAc,CAAC,gBAAgB,CAAC;AAAA,EACjC,CAAC,SAAS,CAAC,oBAAoB,WAAW,CAAC;AAAA,EAC3C,CAAC,SAAS,CAAC,kBAAkB,CAAC;AAAA,EAC9B,CAAC,UAAU,CAAC,YAAY,CAAC;AAAA,EACzB,CAAC,SAAS,CAAC,WAAW,CAAC;AAAA,EACvB,CAAC,UAAU,CAAC,cAAc,WAAW,CAAC;AACxC;AAEA,IAAM,iBAAiB;AAAA,EACrB,CAAC,UAAU,CAAC,YAAY,CAAC;AAAA,EACzB,CAAC,KAAK,CAAC,SAAS,eAAe,MAAM,CAAC;AAAA,EACtC,CAAC,YAAY,CAAC,cAAc,CAAC;AAAA,EAC7B,CAAC,YAAY,CAAC,gBAAgB,QAAQ,CAAC;AAAA,EACvC,CAAC,aAAa,CAAC,eAAe,CAAC;AAAA,EAC/B,CAAC,WAAW,CAAC,eAAe,UAAU,CAAC;AAAA,EACvC,CAAC,YAAY,CAAC,iBAAiB,CAAC;AAAA,EAChC,CAAC,WAAW,CAAC,aAAa,CAAC;AAC7B;AAEA,SAAS,eAAe,CAAC,UAAkB,QAAyB;AAAA,EAClE,OAAO,aAAa,UAAU,SAAS,SAAS,IAAI,QAAQ;AAAA;AAG9D,SAAS,iBAAiB,CACxB,UACA,SACe;AAAA,EACf,YAAY,QAAQ,YAAY,SAAS;AAAA,IACvC,IAAI,QAAQ,KAAK,CAAC,WAAW,gBAAgB,UAAU,MAAM,CAAC,GAAG;AAAA,MAC/D,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,oBAAoB,CAC3B,OACA,SACe;AAAA,EACf,MAAM,aAAa,MAAM,KAAK,EAAE,YAAY,EAAE,QAAQ,WAAW,EAAE;AAAA,EACnE,IAAI,CAAC,YAAY;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EACA,YAAY,QAAQ,YAAY,SAAS;AAAA,IACvC,IACE,eAAe,UACZ,QAAQ,KAAK,CAAC,WAAW,gBAAgB,YAAY,MAAM,CAAC,GAC/D;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,sBAAsB,CAC7B,MACA,YACe;AAAA,EACf,IAAI,CAAC,YAAY;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,OAAO,IAAI,IAAI,YAAY,WAAW,KAAK,iBAAiB,EACzD,aAAa,IAAI,YAAY;AAAA,IAChC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,qBAAqB,CAAC,UAAoD;AAAA,EACjF,IAAI,CAAC,YAAY,aAAa,WAAW;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,OAAO,2BAA2B,IAAI,IAAI,QAAQ,EAAE,QAAQ;AAAA,IAC5D,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIJ,SAAS,wBAAwB,CACtC,MACA,UACA,YACyB;AAAA,EACzB,MAAM,oBAAoB,uBAAuB,MAAM,UAAU;AAAA,EACjE,IAAI,mBAAmB;AAAA,IACrB,MAAM,qBAAqB,qBAAqB,mBAAmB,UAAU;AAAA,IAC7E,IAAI,oBAAoB;AAAA,MACtB,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IAEA,MAAM,yBAAyB,qBAC7B,mBACA,cACF;AAAA,IACA,IAAI,wBAAwB;AAAA,MAC1B,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IAEA,MAAM,yBAAyB,qBAC7B,mBACA,cACF;AAAA,IACA,IAAI,wBAAwB;AAAA,MAC1B,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,sBAAsB,QAAQ;AAAA,EAC/C,IAAI,aAAa,MAAM;AAAA,IACrB,OAAO,EAAE,iBAAiB,UAAU,gBAAgB,SAAS;AAAA,EAC/D;AAAA,EACA,IAAI,CAAC,UAAU;AAAA,IACb,OAAO,EAAE,iBAAiB,YAAY,gBAAgB,UAAU;AAAA,EAClE;AAAA,EACA,IAAI,uBAAuB,MAAM,QAAQ,GAAG;AAAA,IAC1C,OAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,SAAS,QAAQ,WAAW,EAAE;AAAA,EAErD,MAAM,WAAW,kBAAkB,gBAAgB,UAAU;AAAA,EAC7D,IAAI,UAAU;AAAA,IACZ,OAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,kBAAkB,gBAAgB,cAAc;AAAA,EACrE,IAAI,cAAc;AAAA,IAChB,OAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,kBAAkB,gBAAgB,cAAc;AAAA,EACrE,IAAI,cAAc;AAAA,IAChB,OAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AAAA;;;AHxMF;AAwBA,IAAM,kBAAkB,IAAI,IAAI,CAAC,aAAa,cAAc,eAAe,YAAY,CAAC;AACxF,IAAM,mBAAmB;AACzB,IAAM,wBAAwB,IAAI,gBAAgB;AAAA,EAChD,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,UAAU;AACZ,CAAC;AACD,IAAM,aAAa,IAAI;AAEvB,IAAI,eAA8B;AAqB3B,SAAS,2BAA2B,CACzC,MACA,QACgC;AAAA,EAChC,IAAI,OAAO,YAAY,eAAe,EAAE,kBAAkB,UAAU;AAAA,IAClE,OAAO;AAAA,EACT;AAAA,EACA,MAAM,UAAU,OAAO,QAAQ,wBAAwB;AAAA,EACvD,IAAI,OAAO,gBAAgB,eAAe,EAAE,mBAAmB,cAAc;AAAA,IAC3E,OAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY,QAAQ,QAAQ,gBAAgB,KAAK;AAAA,EACvD,IAAI,CAAC,aAAa,CAAC,wBAAwB,MAAM,SAAS,GAAG;AAAA,IAC3D,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAAyC;AAAA,OACzC,QAAQ,QAAQ,gBAChB,EAAE,aAAa,QAAQ,QAAQ,cAAc,IAC7C,CAAC;AAAA,OACD,QAAQ,QAAQ,cAChB,EAAE,WAAW,QAAQ,QAAQ,YAAY,IACzC,CAAC;AAAA,EACP;AAAA,EACA,IAAI,OAAO,sBAAsB,eAAe,mBAAmB,mBAAmB;AAAA,IACpF,IAAI;AAAA,MACF,MAAM,OAAO,OAAO,WAAW,cAC3B,WAAW,KAAK,oBAChB,OAAO,SAAS;AAAA,MACpB,MAAM,YAAY,IAAI,IAAI,QAAQ,MAAM,IAAI;AAAA,MAC5C,IAAI,UAAU,aAAa,WAAW,UAAU,aAAa,UAAU;AAAA,QACrE,MAAM,aAAa,2BAA2B,UAAU,QAAQ;AAAA,QAChE,cAAc,cAAc;AAAA,QAC5B,IAAI,uBAAuB,MAAM,UAAU,GAAG;AAAA,UAC5C,MAAM,QAAQ,uBAAuB,MAAM,SAAS;AAAA,UACpD,IAAI,OAAO;AAAA,YACT,cAAc,cAAc,MAAM;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA,YAAY,6BAA6B,aAAa;AAAA,EACxD;AAAA;AAGF,SAAS,sBAAsB,GAAoC;AAAA,EACjE,IAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AAAA,IACpE,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,UAAU,OAAO,SAAS;AAAA,IAC1B,MAAM,OAAO,SAAS;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,YAAY,OAAO,YAAY,eAC1B,QAAQ,IAAI,gBAAgB;AAAA,EACnC;AAAA;AAGK,SAAS,wBAAwB,CAAC,SAAyC;AAAA,EAChF,MAAM,WAAW,QAAQ,YAAY,uBAAuB;AAAA,EAC5D,OAAO,QACL,UAAU,cACP,QAAQ,QAAQ,WAAW,MAAM,KACjC,uBAAuB,QAAQ,MAAM,SAAS,QAAQ,CAC3D;AAAA;AAGF,SAAS,YAAY,CAAC,MAA6B,WAA4B;AAAA,EAC7E,OAAO,gBAAgB,IAAI,SAAS,KAAK,qBAAqB,MAAM,SAAS;AAAA;AAGxE,SAAS,uBAAuB,CACrC,MACA,iBACyD;AAAA,EACzD,OAAO,CAAC,YAAY;AAAA,IAClB,IAAI,CAAC,WAAW,CAAC,aAAa,MAAM,QAAQ,KAAK,GAAG;AAAA,MAClD,OAAO;AAAA,IACT;AAAA,IACA,MAAM,eAAe,OAAO,QAAQ,WAAW,UAAU,YACpD,QAAQ,WAAW,MAAM,WAAW,MAAM,IAC3C,QAAQ,WAAW,QACnB;AAAA,IACJ,IAAI,CAAC,cAAc;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IACA,MAAM,WAAW,gBAAgB;AAAA,IACjC,MAAM,gBAAgB,OAAO,QAAQ,WAAW,iBAAiB,WAC7D,QAAQ,WAAW,eACnB,SAAS;AAAA,IACb,MAAM,QAAQ,uBAAuB,MAAM,aAAa;AAAA,IACxD,IAAI,CAAC,OAAO;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,MAAM,cAAc,OAAO,QAAQ,WAAW,cAAc,WACxD,QAAQ,WAAW,YACnB,SAAS;AAAA,IACb,MAAM,UAAU,yBAAyB,MAAM,aAAa,aAAa;AAAA,IACzE,MAAM,aAAa,2BAA2B,MAAM,QAAQ,UAAU;AAAA,IAItE,WAAW,QAAQ;AAAA,IACnB,WAAW,eAAe,sBAAsB,MAAM,MAAM,cAAc;AAAA,IAC1E,WAAW,0BAA0B;AAAA,IAErC,OAAO;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,YAAY;AAAA,WACP;AAAA,WACA;AAAA,WACA;AAAA,MACL;AAAA,SACI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,IAC9D;AAAA;AAAA;AAIG,SAAS,0BAA0B,CACxC,MACA,UACA,UAAU,kBACc;AAAA,EACxB,OAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,QAAQ,SAAS,kBAAkB,IAAI,2BAA2B;AAAA,IAC3E,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,MACnB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,4BAA4B,CAAC,OAAO,OAAO,OAAO,KAAK;AAAA,MACvD,wBAAwB;AAAA,IAC1B;AAAA,IACA,oBAAoB;AAAA,IACpB,8BAA8B;AAAA,IAC9B,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,IAC3B,iBAAiB;AAAA,IACjB,mCAAmC;AAAA,IACnC,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,gCAAgC;AAAA,IAChC,8CAA8C;AAAA,IAC9C,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,wBAAwB;AAAA,IACxB,oBAAoB;AAAA,IACpB,4BAA4B;AAAA,IAC5B,eAAe;AAAA,IACf,6BAA6B;AAAA,IAC7B,+BAA+B;AAAA,IAC/B,iCAAiC,CAAC,SAAS,SAAS,QAAQ,OAAO,QAAQ;AAAA,IAC3E,8BAA8B;AAAA,IAC9B,gCAAgC;AAAA,IAChC,eAAe;AAAA,MACb,mBAAmB;AAAA,MACnB,oBAAoB;AAAA,IACtB;AAAA,IACA,aAAa,wBAAwB,MAAM,MAAM,QAAQ;AAAA,EAC3D;AAAA;AAGK,SAAS,wBAAwB,CAAC,SAAyC;AAAA,EAChF,IAAI,CAAC,yBAAyB,OAAO,GAAG;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,iBAAiB,QAAQ,KAAK,IAAI;AAAA,IACpC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,WAAW,QAAQ,YAAY,uBAAuB;AAAA,EAC5D,IAAI,CAAC,YAAY,CAAC,QAAQ,QAAQ;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EACA,QAAQ,KACN,QAAQ,QACR,2BAA2B,QAAQ,MAAM,UAAU,QAAQ,OAAO,CACpE;AAAA,EACA,eAAe,QAAQ,KAAK;AAAA,EAC5B,OAAO;AAAA;AAGF,SAAS,mBAAmB,CACjC,MACA,WACA,aAAsB,CAAC,GACd;AAAA,EACT,IAAI,iBAAiB,KAAK,MAAM,CAAC,qBAAqB,MAAM,SAAS,GAAG;AAAA,IACtE,OAAO;AAAA,EACT;AAAA,EACA,QAAQ,QAAQ,WAAW,6BAA6B,UAAU,CAAC;AAAA,EACnE,OAAO;AAAA;AAGF,SAAS,uBAAuB,CACrC,MACA,OACA,aAAsB,CAAC,GACd;AAAA,EACT,IAAI,iBAAiB,KAAK,IAAI;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,IACtC,IAAI,WAAW,IAAI,KAAK,GAAG;AAAA,MACzB,OAAO;AAAA,IACT;AAAA,IACA,WAAW,IAAI,KAAK;AAAA,EACtB;AAAA,EACA,MAAM,QAAQ,uBAAuB,KAAK;AAAA,EAC1C,MAAM,cAAc,0BAA0B,KAAK;AAAA,EACnD,IAAI,CAAC,sBAAsB,MAAM,WAAW,GAAG;AAAA,IAC7C,OAAO;AAAA,EACT;AAAA,EACA,QAAQ,iBAAiB,OAAO;AAAA,OAC3B,6BAA6B,UAAU;AAAA,IAC1C,mBAAmB;AAAA,IACnB,eAAe;AAAA,EACjB,CAAC;AAAA,EACD,OAAO;AAAA;AAGF,SAAS,8BAA8B,CAAC,MAAyC;AAAA,EACtF,MAAM,UAAU,CAAC,UAA4B;AAAA,IAC3C,IAAI,MAAM,iBAAiB,OAAO;AAAA,MAChC,wBAAwB,MAAM,MAAM,OAAO,EAAE,cAAc,eAAe,CAAC;AAAA,IAC7E;AAAA;AAAA,EAEF,MAAM,uBAAuB,CAAC,UAAuC;AAAA,IACnE,wBAAwB,MAAM,MAAM,QAAQ,EAAE,cAAc,sBAAsB,CAAC;AAAA;AAAA,EAErF,OAAO,iBAAiB,SAAS,OAAO;AAAA,EACxC,OAAO,iBAAiB,sBAAsB,oBAAoB;AAAA,EAClE,OAAO,MAAM;AAAA,IACX,OAAO,oBAAoB,SAAS,OAAO;AAAA,IAC3C,OAAO,oBAAoB,sBAAsB,oBAAoB;AAAA;AAAA;AAIlE,SAAS,8BAA8B,CAAC,MAAyC;AAAA,EACtF,MAAM,UAAU,CAAC,UAA4B;AAAA,IAC3C,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,YAAY,4BAA4B,MAAM,MAAM,MAAM;AAAA,IAChE,IAAI,WAAW;AAAA,MACb,oBAAoB,MAAM,UAAU,WAAW,UAAU,UAAU;AAAA,IACrE;AAAA;AAAA,EAEF,SAAS,iBAAiB,SAAS,OAAO;AAAA,EAC1C,OAAO,MAAM;AAAA,IACX,SAAS,oBAAoB,SAAS,OAAO;AAAA;AAAA;", - "debugId": "28120A7D64B7EBF464756E2164756E21", + "mappings": "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", + "debugId": "506097B8E608C77964756E2164756E21", "names": [] } \ No newline at end of file diff --git a/dist/react.js b/dist/react.js index a230328..5933d72 100644 --- a/dist/react.js +++ b/dist/react.js @@ -9,7 +9,6 @@ import { installDelegatedPostHogCapture, installPostHogExceptionCapture } from "./client.js"; -"use client"; function initialize(props) { return initializePostHogBrowser({ site: props.site, @@ -58,4 +57,4 @@ export { PostHogAnalytics }; -//# debugId=D3B58E2F629890F264756E2164756E21 +//# debugId=CD53137435EEFC5D64756E2164756E21 diff --git a/dist/react.js.map b/dist/react.js.map index 8a752ec..72c2d45 100644 --- a/dist/react.js.map +++ b/dist/react.js.map @@ -2,9 +2,9 @@ "version": 3, "sources": ["../src/react.tsx"], "sourcesContent": [ - "\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport {\n capturePostHogEvent,\n capturePostHogException,\n initializePostHogBrowser,\n installDelegatedPostHogCapture,\n installPostHogExceptionCapture,\n type PostHogBrowserOptions,\n} from \"./client.js\";\nimport type { PostHogSiteDefinition } from \"./site.js\";\n\nexport type PostHogAnalyticsProps = Readonly<{\n site: PostHogSiteDefinition;\n apiKey?: string | undefined;\n apiHost?: string | undefined;\n}>;\n\nfunction initialize(props: PostHogAnalyticsProps): boolean {\n return initializePostHogBrowser({\n site: props.site,\n apiKey: props.apiKey,\n apiHost: props.apiHost,\n });\n}\n\nexport function PostHogAnalytics(props: PostHogAnalyticsProps) {\n const { apiHost, apiKey, site } = props;\n useEffect(() => {\n if (!initialize({ apiHost, apiKey, site })) {\n return undefined;\n }\n const removeExceptions = installPostHogExceptionCapture(site);\n const removeDelegated = installDelegatedPostHogCapture(site);\n return () => {\n removeDelegated();\n removeExceptions();\n };\n }, [apiHost, apiKey, site]);\n return null;\n}\n\nexport function PostHogExceptionReporter(\n props: PostHogAnalyticsProps & Readonly<{ error: unknown; origin?: string }>,\n) {\n const { apiHost, apiKey, error, origin, site } = props;\n useEffect(() => {\n if (initialize({ apiHost, apiKey, site })) {\n capturePostHogException(site, error, {\n error_origin: origin ?? \"react_error_boundary\",\n });\n }\n }, [apiHost, apiKey, error, origin, site]);\n return null;\n}\n\nexport function PostHogEventReporter(\n props: PostHogAnalyticsProps & Readonly<{\n eventName: string;\n properties?: unknown;\n }>,\n) {\n const { apiHost, apiKey, eventName, properties, site } = props;\n useEffect(() => {\n if (initialize({ apiHost, apiKey, site })) {\n capturePostHogEvent(site, eventName, properties);\n }\n }, [apiHost, apiKey, eventName, properties, site]);\n return null;\n}\n\nexport type { PostHogBrowserOptions };\n" + "import { useEffect } from \"react\";\n\nimport {\n capturePostHogEvent,\n capturePostHogException,\n initializePostHogBrowser,\n installDelegatedPostHogCapture,\n installPostHogExceptionCapture,\n type PostHogBrowserOptions,\n} from \"./client.js\";\nimport type { PostHogSiteDefinition } from \"./site.js\";\n\nexport type PostHogAnalyticsProps = Readonly<{\n site: PostHogSiteDefinition;\n apiKey?: string | undefined;\n apiHost?: string | undefined;\n}>;\n\nfunction initialize(props: PostHogAnalyticsProps): boolean {\n return initializePostHogBrowser({\n site: props.site,\n apiKey: props.apiKey,\n apiHost: props.apiHost,\n });\n}\n\nexport function PostHogAnalytics(props: PostHogAnalyticsProps) {\n const { apiHost, apiKey, site } = props;\n useEffect(() => {\n if (!initialize({ apiHost, apiKey, site })) {\n return undefined;\n }\n const removeExceptions = installPostHogExceptionCapture(site);\n const removeDelegated = installDelegatedPostHogCapture(site);\n return () => {\n removeDelegated();\n removeExceptions();\n };\n }, [apiHost, apiKey, site]);\n return null;\n}\n\nexport function PostHogExceptionReporter(\n props: PostHogAnalyticsProps & Readonly<{ error: unknown; origin?: string }>,\n) {\n const { apiHost, apiKey, error, origin, site } = props;\n useEffect(() => {\n if (initialize({ apiHost, apiKey, site })) {\n capturePostHogException(site, error, {\n error_origin: origin ?? \"react_error_boundary\",\n });\n }\n }, [apiHost, apiKey, error, origin, site]);\n return null;\n}\n\nexport function PostHogEventReporter(\n props: PostHogAnalyticsProps & Readonly<{\n eventName: string;\n properties?: unknown;\n }>,\n) {\n const { apiHost, apiKey, eventName, properties, site } = props;\n useEffect(() => {\n if (initialize({ apiHost, apiKey, site })) {\n capturePostHogEvent(site, eventName, properties);\n }\n }, [apiHost, apiKey, eventName, properties, site]);\n return null;\n}\n\nexport type { PostHogBrowserOptions };\n" ], - "mappings": ";;;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJA;AAoBA,SAAS,UAAU,CAAC,OAAuC;AAAA,EACzD,OAAO,yBAAyB;AAAA,IAC9B,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,EACjB,CAAC;AAAA;AAGI,SAAS,gBAAgB,CAAC,OAA8B;AAAA,EAC7D,QAAQ,SAAS,QAAQ,SAAS;AAAA,EAClC,UAAU,MAAM;AAAA,IACd,IAAI,CAAC,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,GAAG;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,MAAM,mBAAmB,+BAA+B,IAAI;AAAA,IAC5D,MAAM,kBAAkB,+BAA+B,IAAI;AAAA,IAC3D,OAAO,MAAM;AAAA,MACX,gBAAgB;AAAA,MAChB,iBAAiB;AAAA;AAAA,KAElB,CAAC,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC1B,OAAO;AAAA;AAGF,SAAS,wBAAwB,CACtC,OACA;AAAA,EACA,QAAQ,SAAS,QAAQ,OAAO,QAAQ,SAAS;AAAA,EACjD,UAAU,MAAM;AAAA,IACd,IAAI,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,GAAG;AAAA,MACzC,wBAAwB,MAAM,OAAO;AAAA,QACnC,cAAc,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,KACC,CAAC,SAAS,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAAA,EACzC,OAAO;AAAA;AAGF,SAAS,oBAAoB,CAClC,OAIA;AAAA,EACA,QAAQ,SAAS,QAAQ,WAAW,YAAY,SAAS;AAAA,EACzD,UAAU,MAAM;AAAA,IACd,IAAI,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,GAAG;AAAA,MACzC,oBAAoB,MAAM,WAAW,UAAU;AAAA,IACjD;AAAA,KACC,CAAC,SAAS,QAAQ,WAAW,YAAY,IAAI,CAAC;AAAA,EACjD,OAAO;AAAA;", - "debugId": "D3B58E2F629890F264756E2164756E21", + "mappings": ";;;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,SAAS,UAAU,CAAC,OAAuC;AAAA,EACzD,OAAO,yBAAyB;AAAA,IAC9B,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,EACjB,CAAC;AAAA;AAGI,SAAS,gBAAgB,CAAC,OAA8B;AAAA,EAC7D,QAAQ,SAAS,QAAQ,SAAS;AAAA,EAClC,UAAU,MAAM;AAAA,IACd,IAAI,CAAC,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,GAAG;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,MAAM,mBAAmB,+BAA+B,IAAI;AAAA,IAC5D,MAAM,kBAAkB,+BAA+B,IAAI;AAAA,IAC3D,OAAO,MAAM;AAAA,MACX,gBAAgB;AAAA,MAChB,iBAAiB;AAAA;AAAA,KAElB,CAAC,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC1B,OAAO;AAAA;AAGF,SAAS,wBAAwB,CACtC,OACA;AAAA,EACA,QAAQ,SAAS,QAAQ,OAAO,QAAQ,SAAS;AAAA,EACjD,UAAU,MAAM;AAAA,IACd,IAAI,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,GAAG;AAAA,MACzC,wBAAwB,MAAM,OAAO;AAAA,QACnC,cAAc,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,KACC,CAAC,SAAS,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAAA,EACzC,OAAO;AAAA;AAGF,SAAS,oBAAoB,CAClC,OAIA;AAAA,EACA,QAAQ,SAAS,QAAQ,WAAW,YAAY,SAAS;AAAA,EACzD,UAAU,MAAM;AAAA,IACd,IAAI,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,GAAG;AAAA,MACzC,oBAAoB,MAAM,WAAW,UAAU;AAAA,IACjD;AAAA,KACC,CAAC,SAAS,QAAQ,WAAW,YAAY,IAAI,CAAC;AAAA,EACjD,OAAO;AAAA;", + "debugId": "CD53137435EEFC5D64756E2164756E21", "names": [] } \ No newline at end of file diff --git a/package.json b/package.json index 19e9916..39f660e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hraness/posthog", - "version": "0.1.1", + "version": "0.1.2", "description": "Privacy-preserving PostHog analytics primitives for modern web applications.", "license": "MIT", "type": "module", diff --git a/portfolio-inventory.json b/portfolio-inventory.json index 079c012..83fa6b1 100644 --- a/portfolio-inventory.json +++ b/portfolio-inventory.json @@ -8,7 +8,7 @@ "name": "@hraness/posthog", "path": ".", "visibility": "public", - "version": "0.1.1" + "version": "0.1.2" } ], "dependencies": [], diff --git a/scripts/build.ts b/scripts/build.ts index 6e2744b..8753677 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -1,5 +1,9 @@ import { rm } from "node:fs/promises"; +// Bun can retain source directives after bundled imports. Emit this boundary +// only as a banner so each published client entry has one valid prologue. +const CLIENT_DIRECTIVE = '"use client";'; + type BuildGroup = Readonly<{ entrypoints: readonly string[]; target: "browser" | "node"; @@ -15,12 +19,12 @@ const groups: readonly BuildGroup[] = [ { entrypoints: ["src/client.ts"], target: "browser", - banner: '"use client";', + banner: CLIENT_DIRECTIVE, }, { entrypoints: ["src/react.tsx"], target: "browser", - banner: '"use client";', + banner: CLIENT_DIRECTIVE, external: ["./client*"], }, { diff --git a/scripts/check-bundle-boundaries.ts b/scripts/check-bundle-boundaries.ts index 02c029a..8c23343 100644 --- a/scripts/check-bundle-boundaries.ts +++ b/scripts/check-bundle-boundaries.ts @@ -11,6 +11,17 @@ const allowedImports = new Map>([ ]); const staticImport = /(?:from\s+|import\s*)["']([^"']+)["']/gu; +const clientDirective = /(["'])use client\1\s*;/gu; + +function assertClientBoundary(entry: string, source: string): void { + if (!source.startsWith('"use client";\n')) { + throw new Error(`${entry} does not start with its Next.js client boundary`); + } + if ([...source.matchAll(clientDirective)].length !== 1) { + throw new Error(`${entry} must contain exactly one Next.js client boundary`); + } +} + for (const [entry, allowed] of allowedImports) { const source = await readFile(`dist/${entry}.js`, "utf8"); const imports = [...source.matchAll(staticImport)].map((match) => match[1]); @@ -33,9 +44,7 @@ for (const entry of browserEntries) { for (const entry of ["client", "react"]) { const source = await readFile(`dist/${entry}.js`, "utf8"); - if (!source.startsWith('"use client";')) { - throw new Error(`${entry} does not preserve its Next.js client boundary`); - } + assertClientBoundary(entry, source); } const clientSource = await readFile("dist/client.js", "utf8"); diff --git a/scripts/package-smoke.ts b/scripts/package-smoke.ts index 1ae4b53..01dba54 100644 --- a/scripts/package-smoke.ts +++ b/scripts/package-smoke.ts @@ -13,7 +13,7 @@ const specifiers = [ `${packageName}/server`, `${packageName}/traffic`, ]; -const verifiedNextVersions = ["16.2.12", "16.3.0"] as const; +const verifiedNextVersions = ["16.2.12", "16.3.1"] as const; const verificationPackages = [ "@types/node@24.13.3", "@types/react@19.2.18", @@ -34,6 +34,16 @@ const environment = { NEXT_TELEMETRY_DISABLED: "1", TMPDIR: temporary, }; +const clientDirective = /(["'])use client\1\s*;/gu; + +function assertClientBoundary(label: string, source: string): void { + if (!source.startsWith('"use client";\n')) { + throw new Error(`${label} does not start with its Next.js client boundary`); + } + if ([...source.matchAll(clientDirective)].length !== 1) { + throw new Error(`${label} must contain exactly one Next.js client boundary`); + } +} async function run( command: string[], @@ -94,6 +104,11 @@ try { await mkdir(temporary, { mode: 0o700 }); const nodeExecutable = resolveGenuineNodeExecutable(); + for (const entry of ["client", "react"]) { + const source = await Bun.file(join(repository, "dist", `${entry}.js`)).text(); + assertClientBoundary(`dist/${entry}.js`, source); + } + await run([ process.execPath, "pm", @@ -152,6 +167,10 @@ try { if (await Bun.file(join(installedRoot, "src", "client.test.ts")).exists()) { throw new Error("installed package must not contain source tests"); } + for (const entry of ["client", "react"]) { + const source = await Bun.file(join(installedRoot, "dist", `${entry}.js`)).text(); + assertClientBoundary(`packed dist/${entry}.js for Next ${nextVersion}`, source); + } await writeFile(join(consumer, "runtime-smoke.mjs"), ` import { readFile } from "node:fs/promises"; @@ -253,14 +272,41 @@ if (!reactSource.includes('from "./client.js"') || reactSource.includes("activeS "", ].join("\n"), ); - await writeFile( - join(consumer, "app", "layout.js"), - "export default function Layout({ children }) { return {children}; }\n", - ); - await writeFile( - join(consumer, "app", "page.js"), - "export default function Page() { return
PostHog package smoke
; }\n", - ); + await writeFile(join(consumer, "app", "analytics.js"), [ + '"use client";', + "", + 'import { isPostHogBrowserEligible } from "@hraness/posthog/client";', + 'import { PostHogAnalytics } from "@hraness/posthog/react";', + "", + "const site = {", + ' id: "package-smoke",', + ' canonicalDomain: "example.com",', + ' allowedHosts: ["example.com"],', + " schemaVersion: 1,", + ' routes: [{ match: "exact", path: "/", pageKind: "home" }],', + " customEvents: [],", + "};", + "", + "export function Analytics() {", + ' void isPostHogBrowserEligible({ site, apiKey: "phc_public" });', + ' return ;', + "}", + "", + ].join("\n")); + await writeFile(join(consumer, "app", "layout.js"), [ + "export default function Layout({ children }) {", + " return {children};", + "}", + "", + ].join("\n")); + await writeFile(join(consumer, "app", "page.js"), [ + 'import { Analytics } from "./analytics";', + "", + "export default function Page() {", + " return
PostHog package smoke
;", + "}", + "", + ].join("\n")); await run([ nodeExecutable, join(consumer, "node_modules", "next", "dist", "bin", "next"), diff --git a/src/client.ts b/src/client.ts index 4ff0868..584ad2e 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,5 +1,3 @@ -"use client"; - import { posthog } from "posthog-js"; import type { CaptureResult, PostHogConfig } from "posthog-js"; diff --git a/src/react.tsx b/src/react.tsx index ea02dc8..d0fbb56 100644 --- a/src/react.tsx +++ b/src/react.tsx @@ -1,5 +1,3 @@ -"use client"; - import { useEffect } from "react"; import {