{"version":3,"file":"index.cjs","sources":["../src/index.tsx"],"sourcesContent":["/**\n * @solid-analytics/solidstart\n *\n * SolidStart integration with server-side tracking support\n */\n\nimport {\n  createContext,\n  useContext,\n  onMount,\n  type Component,\n  type JSX,\n} from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport type { AnalyticsInstance } from \"analytics\";\nimport { createAnalyticsRuntime } from \"@solid-analytics/solid/runtime\";\nimport type {\n  AnalyticsRuntime,\n  AnalyticsOptions as BaseAnalyticsOptions,\n} from \"@solid-analytics/solid/runtime\";\nimport {\n  serverTrack,\n  serverIdentify,\n  serverPage,\n  type ServerTrackOptions,\n} from \"./server\";\n\nexport interface SolidStartAnalyticsOptions extends BaseAnalyticsOptions {\n  /**\n   * Server-side tracking mode\n   * - 'server-function': Use server functions (default for SolidStart)\n   * - 'queue': Queue events during SSR, replay on client\n   * - 'track': Track immediately on server\n   * - 'both': Track on both server and client\n   * - false: Client-only\n   *\n   * @default 'server-function'\n   */\n  ssr?: \"server-function\" | \"queue\" | \"track\" | \"both\" | false;\n\n  /**\n   * Server tracking options (only applies when ssr is 'server-function')\n   */\n  serverOptions?: Omit<ServerTrackOptions, \"client\">;\n}\n\nexport interface AnalyticsProviderProps {\n  /**\n   * Analytics client instance (must support SSR if using server-side tracking)\n   */\n  client?: AnalyticsInstance;\n\n  /**\n   * Configuration options\n   */\n  options?: SolidStartAnalyticsOptions;\n\n  /**\n   * Children\n   */\n  children: JSX.Element;\n}\n\n// Context for analytics runtime\nconst AnalyticsContext = createContext<AnalyticsRuntime>();\n\n/**\n * SolidStart Analytics Provider\n *\n * Provides analytics context with automatic server-side tracking support\n *\n * @example\n * ```tsx\n * import { AnalyticsProvider } from '@solid-analytics/solidstart'\n * import Analytics from 'analytics'\n * import segmentPlugin from '@analytics/segment'\n *\n * const client = Analytics({\n *   app: 'my-app',\n *   plugins: [segmentPlugin({ writeKey: 'key' })]\n * })\n *\n * export default function App() {\n *   return (\n *     <AnalyticsProvider\n *       client={client}\n *       options={{ ssr: 'server-function' }}\n *     >\n *       <button analytics:click=\"purchase\">Buy</button>\n *     </AnalyticsProvider>\n *   )\n * }\n * ```\n */\nexport const AnalyticsProvider: Component<AnalyticsProviderProps> = (props) => {\n  // Default to server-function mode for SolidStart\n  const ssrMode = props.options?.ssr ?? \"server-function\";\n\n  // Create runtime with SolidStart-specific defaults\n  const runtime = createAnalyticsRuntime({\n    ...props.options,\n    client: props.client,\n    ssr: ssrMode === \"server-function\" ? false : ssrMode,\n  });\n\n  // If using server-function mode, wrap track/identify/page with server functions\n  if (ssrMode === \"server-function\" && !isServer) {\n    const serverOptions = {\n      ...props.options?.serverOptions,\n      client: props.client,\n    };\n\n    // Wrap runtime methods to use server functions\n    const originalTrack = runtime.track;\n    const originalIdentify = runtime.identify;\n    const originalPage = runtime.page;\n\n    runtime.track = async (\n      eventName: string,\n      properties?: Record<string, any>,\n      domEvent?: any\n    ) => {\n      // Call server function for server-side tracking\n      await serverTrack(eventName, properties, serverOptions);\n\n      // Also track on client if configured\n      if (props.options?.serverOptions?.debug || props.options?.serverOptions?.debug) {\n        await originalTrack(eventName, properties, domEvent);\n      }\n    };\n\n    runtime.identify = async (userId: string, traits?: Record<string, any>) => {\n      await serverIdentify(userId, traits, serverOptions);\n\n      if (props.options?.serverOptions?.debug || props.options?.serverOptions?.debug) {\n        await originalIdentify(userId, traits);\n      }\n    };\n\n    runtime.page = async (\n      pageName?: string,\n      properties?: Record<string, any>\n    ) => {\n      await serverPage(pageName, properties, serverOptions);\n\n      if (props.options?.serverOptions?.debug || props.options?.serverOptions?.debug) {\n        await originalPage(pageName, properties);\n      }\n    };\n  }\n\n  // Set global runtime for Babel plugin\n  if (typeof globalThis !== \"undefined\") {\n    (globalThis as any).__analytics = runtime;\n  }\n\n  // Handle visibility tracking on mount (client-only)\n  onMount(() => {\n    if (isServer) return;\n\n    // Set up Intersection Observer for visibility tracking\n    const observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            const element = entry.target as HTMLElement;\n            const eventName = element.dataset.analyticsVisible;\n            const payloadStr = element.dataset.analyticsVisiblePayload;\n\n            if (eventName) {\n              let payload: any;\n              try {\n                payload = payloadStr ? JSON.parse(payloadStr) : undefined;\n              } catch (e) {\n                console.warn(\"[Analytics] Failed to parse visibility payload\");\n              }\n\n              runtime.track(eventName, payload);\n\n              // Unobserve after tracking (track once)\n              observer.unobserve(element);\n            }\n          }\n        });\n      },\n      {\n        threshold: 0.5, // 50% visible\n        rootMargin: \"0px\",\n      }\n    );\n\n    // Observe all elements with data-analytics-visible\n    document.querySelectorAll(\"[data-analytics-visible]\").forEach((el) => {\n      observer.observe(el);\n    });\n\n    // Handle identify on mount\n    const identifyElements = document.querySelectorAll(\n      \"[data-analytics-identify]\"\n    );\n    identifyElements.forEach((el) => {\n      try {\n        const data = JSON.parse(\n          el.getAttribute(\"data-analytics-identify\") || \"[]\"\n        );\n        const [userId, traits] = data;\n        if (userId) {\n          runtime.identify(userId, traits);\n        }\n      } catch (e) {\n        console.warn(\"[Analytics] Failed to parse identify data\");\n      }\n    });\n\n    // Handle page tracking on mount\n    const pageElements = document.querySelectorAll(\"[data-analytics-page]\");\n    pageElements.forEach((el) => {\n      try {\n        const data = JSON.parse(el.getAttribute(\"data-analytics-page\") || \"[]\");\n        const [pageName, properties] = data;\n        runtime.page(pageName, properties);\n      } catch (e) {\n        console.warn(\"[Analytics] Failed to parse page data\");\n      }\n    });\n  });\n\n  return (\n    <AnalyticsContext.Provider value={runtime}>\n      {props.children}\n    </AnalyticsContext.Provider>\n  );\n};\n\n/**\n * Hook to access analytics context\n *\n * @example\n * ```tsx\n * import { useAnalytics } from '@solid-analytics/solidstart'\n *\n * function MyComponent() {\n *   const analytics = useAnalytics()\n *\n *   const handleClick = () => {\n *     analytics.track('button_clicked', { button: 'cta' })\n *   }\n *\n *   return <button onClick={handleClick}>Click</button>\n * }\n * ```\n */\nexport function useAnalytics(): AnalyticsRuntime {\n  const context = useContext(AnalyticsContext);\n\n  if (!context) {\n    throw new Error(\"useAnalytics must be used within AnalyticsProvider\");\n  }\n\n  return context;\n}\n\n// Re-export server functions for convenience\nexport {\n  serverTrack,\n  serverIdentify,\n  serverPage,\n  serverTrackBatch,\n  createServerAnalytics,\n} from \"./server\";\nexport type { ServerTrackOptions, RequestContext } from \"./server\";\n\n// Re-export AnalyticsRuntime type (already imported above)\nexport type { AnalyticsRuntime };\n"],"names":["AnalyticsContext","createContext","AnalyticsProvider","props","ssrMode","options","ssr","runtime","createAnalyticsRuntime","client","isServer","serverOptions","originalTrack","track","originalIdentify","identify","originalPage","page","eventName","properties","domEvent","serverTrack","debug","userId","traits","serverIdentify","pageName","serverPage","globalThis","__analytics","onMount","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","element","target","dataset","analyticsVisible","payloadStr","analyticsVisiblePayload","payload","JSON","parse","undefined","console","warn","unobserve","threshold","rootMargin","document","querySelectorAll","el","observe","data","getAttribute","_$createComponent","Provider","value","children","useAnalytics","context","useContext","Error"],"mappings":"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"}