@productbet/tracker-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/logger.ts","../src/session.ts","../src/api-client.ts","../src/auto-tracker.ts","../src/recorder.ts","../src/console-tracker.ts","../src/network-tracker.ts","../src/tracker.ts"],"sourcesContent":["export interface TrackerOptions {\n ingestionUrl?: string\n enableSessionRecording?: boolean\n enableAutoTracking?: boolean\n autoTrackingOptions?: AutoTrackingOptions\n redaction?: RedactionOptions\n maxQueueSize?: number\n flushIntervalMs?: number\n enableConsoleTracking?: boolean\n enableNetworkTracking?: boolean\n recordCanvas?: boolean\n sessionTimeoutMs?: number\n debug?: boolean\n}\n\nexport interface AutoTrackingOptions {\n trackClicks?: boolean\n trackForms?: boolean\n trackNavigation?: boolean\n trackScrollDepth?: boolean\n detectRageClicks?: boolean\n detectDeadClicks?: boolean\n includeText?: boolean\n includeClasses?: boolean\n}\n\nexport interface RedactionOptions {\n mode: \"privacy-first\" | \"visibility-first\"\n unredactFields?: string[]\n}\n\nexport interface UserProperties {\n userId: string\n attributes?: Record<string, unknown>\n}\n\nexport interface TrackedEvent {\n type: EventType\n timestamp: number\n data: Record<string, unknown>\n sessionId: string\n windowId?: string\n}\n\nexport type EventType =\n | \"session_start\"\n | \"session_end\"\n | \"page_view\"\n | \"click\"\n | \"form_submit\"\n | \"form_change\"\n | \"scroll_depth\"\n | \"rage_click\"\n | \"dead_click\"\n | \"custom\"\n | \"console_error\"\n | \"console_warn\"\n | \"network_error\"\n | \"rrweb\"\n\nexport interface EventBatch {\n sessionId: string\n windowId?: string\n events: TrackedEvent[]\n replayEvents?: unknown[]\n endUserId?: string | null\n sdkVersion: string\n timestamp: number\n}\n\nexport interface IdentifyPayload {\n userId: string\n attributes: Record<string, unknown>\n sessionId: string\n}\n\nexport interface CustomEventPayload {\n sessionId: string\n eventName: string\n eventProperties: Record<string, unknown>\n endUserId?: string | null\n}\n\nexport interface IngestionResponse {\n success: boolean\n sessionCreated?: boolean\n monthlyLimitReached?: boolean\n}\n\nexport interface ElementInfo {\n tag: string\n id?: string\n classes?: string[]\n text?: string\n href?: string\n name?: string\n type?: string\n selector: string\n}\n\nexport const DEFAULT_OPTIONS: Required<TrackerOptions> = {\n ingestionUrl: \"https://productbet.io/tracking\",\n enableSessionRecording: false,\n enableAutoTracking: true,\n autoTrackingOptions: {\n trackClicks: true,\n trackForms: true,\n trackNavigation: true,\n trackScrollDepth: true,\n detectRageClicks: true,\n detectDeadClicks: true,\n includeText: true,\n includeClasses: true,\n },\n redaction: {\n mode: \"privacy-first\",\n unredactFields: [],\n },\n maxQueueSize: 1000,\n flushIntervalMs: 3000,\n enableConsoleTracking: true,\n enableNetworkTracking: true,\n recordCanvas: false,\n sessionTimeoutMs: 30 * 60 * 1000,\n debug: false,\n}\n\nexport const SDK_VERSION = \"0.1.0\"\n","let debugEnabled = false\n\nexport function setDebug(enabled: boolean): void {\n debugEnabled = enabled\n}\n\nexport function debug(...args: unknown[]): void {\n if (debugEnabled) {\n console.log(\"[ProductBet]\", ...args)\n }\n}\n\nexport function warn(...args: unknown[]): void {\n console.warn(\"[ProductBet]\", ...args)\n}\n\nexport function error(...args: unknown[]): void {\n console.error(\"[ProductBet]\", ...args)\n}\n","import { debug } from \"./logger\"\n\nconst STORAGE_KEY = \"pb_session\"\nconst WINDOW_ID_KEY = \"pb_window_id\"\n\ninterface PersistedSession {\n sessionId: string\n lastActivityAt: number\n startedAt: number\n}\n\nfunction generateId(): string {\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\"\n const segments = [8, 4, 4, 12]\n return segments\n .map((len) =>\n Array.from({ length: len }, () =>\n chars[Math.floor(Math.random() * chars.length)],\n ).join(\"\"),\n )\n .join(\"-\")\n}\n\nexport class SessionManager {\n private sessionId: string\n private windowId: string\n private startedAt: number\n private lastActivityAt: number\n private timeoutMs: number\n\n constructor(timeoutMs: number) {\n this.timeoutMs = timeoutMs\n this.windowId = this.getOrCreateWindowId()\n\n const restored = this.restore()\n if (restored) {\n this.sessionId = restored.sessionId\n this.startedAt = restored.startedAt\n this.lastActivityAt = restored.lastActivityAt\n debug(\"Restored session\", this.sessionId)\n } else {\n this.sessionId = generateId()\n this.startedAt = Date.now()\n this.lastActivityAt = Date.now()\n this.persist()\n debug(\"Created new session\", this.sessionId)\n }\n }\n\n getSessionId(): string {\n return this.sessionId\n }\n\n getWindowId(): string {\n return this.windowId\n }\n\n getStartedAt(): number {\n return this.startedAt\n }\n\n touch(): void {\n this.lastActivityAt = Date.now()\n this.persist()\n }\n\n isExpired(): boolean {\n return Date.now() - this.lastActivityAt > this.timeoutMs\n }\n\n rotate(): string {\n this.sessionId = generateId()\n this.startedAt = Date.now()\n this.lastActivityAt = Date.now()\n this.persist()\n debug(\"Rotated session\", this.sessionId)\n return this.sessionId\n }\n\n private persist(): void {\n try {\n const data: PersistedSession = {\n sessionId: this.sessionId,\n lastActivityAt: this.lastActivityAt,\n startedAt: this.startedAt,\n }\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n } catch {\n // localStorage may be unavailable (SSR, private browsing)\n }\n }\n\n private restore(): PersistedSession | null {\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (!raw) return null\n\n const data: PersistedSession = JSON.parse(raw)\n if (Date.now() - data.lastActivityAt > this.timeoutMs) {\n localStorage.removeItem(STORAGE_KEY)\n return null\n }\n return data\n } catch {\n return null\n }\n }\n\n private getOrCreateWindowId(): string {\n try {\n let id = sessionStorage.getItem(WINDOW_ID_KEY)\n if (!id) {\n id = generateId()\n sessionStorage.setItem(WINDOW_ID_KEY, id)\n }\n return id\n } catch {\n return generateId()\n }\n }\n}\n","import type {\n EventBatch,\n IdentifyPayload,\n CustomEventPayload,\n IngestionResponse,\n TrackedEvent,\n} from \"./types\"\nimport { SDK_VERSION } from \"./types\"\nimport { debug, warn, error as logError } from \"./logger\"\n\nconst MAX_PAYLOAD_BYTES = 1_000_000\nconst RETRY_DELAYS = [1000, 2000, 4000, 8000]\nconst QUEUE_STORAGE_KEY = \"pb_event_queue\"\nconst MIN_SESSION_DURATION_MS = 5_000\n\nexport class ApiClient {\n private apiKey: string\n private ingestionUrl: string\n private queue: TrackedEvent[] = []\n private replayQueue: unknown[] = []\n private maxQueueSize: number\n private flushIntervalMs: number\n private flushTimer: ReturnType<typeof setInterval> | null = null\n private sessionId: string\n private windowId?: string\n private endUserId: string | null = null\n private isFlushing = false\n private monthlyLimitReached = false\n private startedAt = Date.now()\n private sessionMatureEnough = false\n\n constructor(\n apiKey: string,\n ingestionUrl: string,\n sessionId: string,\n maxQueueSize: number,\n flushIntervalMs: number,\n windowId?: string,\n ) {\n this.apiKey = apiKey\n this.ingestionUrl = ingestionUrl.replace(/\\/$/, \"\")\n this.sessionId = sessionId\n this.windowId = windowId\n this.maxQueueSize = maxQueueSize\n this.flushIntervalMs = flushIntervalMs\n\n this.restoreQueue()\n }\n\n start(): void {\n this.flushTimer = setInterval(() => this.flush(), this.flushIntervalMs)\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", () => this.onUnload())\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === \"hidden\") this.onUnload()\n })\n }\n\n debug(\"ApiClient started, flushing every\", this.flushIntervalMs, \"ms\")\n }\n\n stop(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer)\n this.flushTimer = null\n }\n this.flush()\n }\n\n updateSessionId(sessionId: string): void {\n this.sessionId = sessionId\n }\n\n setEndUserId(userId: string | null): void {\n this.endUserId = userId\n }\n\n enqueueEvent(event: TrackedEvent): void {\n if (this.monthlyLimitReached) return\n\n this.queue.push(event)\n\n if (this.queue.length >= this.maxQueueSize) {\n this.flush()\n }\n }\n\n enqueueReplayEvent(event: unknown): void {\n if (this.monthlyLimitReached) return\n this.replayQueue.push(event)\n }\n\n async sendIdentify(payload: IdentifyPayload): Promise<void> {\n try {\n await this.post(\"/identify\", payload)\n debug(\"Identify sent\", payload.userId)\n } catch (err) {\n logError(\"Failed to send identify\", err)\n }\n }\n\n async sendCustomEvent(payload: CustomEventPayload): Promise<void> {\n try {\n await this.post(\"/custom\", payload)\n debug(\"Custom event sent\", payload.eventName)\n } catch (err) {\n logError(\"Failed to send custom event\", err)\n }\n }\n\n private async flush(): Promise<void> {\n if (this.isFlushing) return\n if (this.queue.length === 0 && this.replayQueue.length === 0) return\n if (this.monthlyLimitReached) return\n\n if (!this.sessionMatureEnough) {\n if (Date.now() - this.startedAt < MIN_SESSION_DURATION_MS) {\n debug(\"Session too short, buffering events\")\n return\n }\n this.sessionMatureEnough = true\n }\n\n this.isFlushing = true\n\n const events = this.queue.splice(0)\n const replayEvents = this.replayQueue.splice(0)\n\n const batch: EventBatch = {\n sessionId: this.sessionId,\n windowId: this.windowId,\n events,\n replayEvents: replayEvents.length > 0 ? replayEvents : undefined,\n endUserId: this.endUserId,\n sdkVersion: SDK_VERSION,\n timestamp: Date.now(),\n }\n\n try {\n const payload = JSON.stringify(batch)\n\n if (payload.length > MAX_PAYLOAD_BYTES) {\n await this.sendChunked(events, replayEvents)\n } else {\n const response = await this.post(\"/events\", batch)\n if (response?.monthlyLimitReached) {\n this.monthlyLimitReached = true\n warn(\"Monthly event limit reached. Tracking paused.\")\n }\n }\n\n this.clearPersistedQueue()\n debug(\"Flushed\", events.length, \"events +\", replayEvents.length, \"replay events\")\n } catch {\n this.queue.unshift(...events)\n this.replayQueue.unshift(...replayEvents)\n this.persistQueue()\n warn(\"Flush failed, events re-queued\")\n } finally {\n this.isFlushing = false\n }\n }\n\n private async sendChunked(\n events: TrackedEvent[],\n replayEvents: unknown[],\n ): Promise<void> {\n const chunkSize = Math.ceil(events.length / 2)\n for (let i = 0; i < events.length; i += chunkSize) {\n const chunk = events.slice(i, i + chunkSize)\n const replayChunk =\n i === 0 ? replayEvents : []\n const batch: EventBatch = {\n sessionId: this.sessionId,\n windowId: this.windowId,\n events: chunk,\n replayEvents:\n replayChunk.length > 0 ? replayChunk : undefined,\n endUserId: this.endUserId,\n sdkVersion: SDK_VERSION,\n timestamp: Date.now(),\n }\n await this.post(\"/events\", batch)\n }\n }\n\n private async post(\n path: string,\n body: unknown,\n retryCount = 0,\n ): Promise<IngestionResponse | null> {\n const url = `${this.ingestionUrl}${path}`\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n credentials: \"omit\",\n })\n\n if (response.status === 429) {\n this.monthlyLimitReached = true\n warn(\"Rate limited (429). Tracking paused.\")\n return { success: false, monthlyLimitReached: true }\n }\n\n if (response.status === 413 && retryCount === 0) {\n warn(\"Payload too large, will chunk on next flush\")\n return null\n }\n\n if (!response.ok) {\n let errorBody = \"\"\n try { errorBody = await response.text() } catch {}\n warn(`Ingestion error ${response.status}: ${errorBody}`)\n if (retryCount < RETRY_DELAYS.length) {\n const delay = RETRY_DELAYS[retryCount]!\n debug(\"Retrying in\", delay, \"ms (attempt\", retryCount + 1, \")\")\n await new Promise((r) => setTimeout(r, delay))\n return this.post(path, body, retryCount + 1)\n }\n throw new Error(`Ingestion failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n private onUnload(): void {\n if (this.queue.length === 0 && this.replayQueue.length === 0) return\n\n const batch: EventBatch = {\n sessionId: this.sessionId,\n windowId: this.windowId,\n events: this.queue.splice(0),\n replayEvents:\n this.replayQueue.length > 0\n ? this.replayQueue.splice(0)\n : undefined,\n endUserId: this.endUserId,\n sdkVersion: SDK_VERSION,\n timestamp: Date.now(),\n }\n\n const url = `${this.ingestionUrl}/events`\n const payload = JSON.stringify(batch)\n\n if (typeof navigator.sendBeacon === \"function\") {\n const blob = new Blob([payload], { type: \"application/json\" })\n const sent = navigator.sendBeacon(url, blob)\n if (sent) {\n debug(\"Sent via sendBeacon on unload\")\n return\n }\n }\n\n this.persistQueue()\n }\n\n private persistQueue(): void {\n try {\n if (this.queue.length > 0) {\n localStorage.setItem(\n QUEUE_STORAGE_KEY,\n JSON.stringify(this.queue),\n )\n }\n } catch {\n // localStorage unavailable\n }\n }\n\n private restoreQueue(): void {\n try {\n const raw = localStorage.getItem(QUEUE_STORAGE_KEY)\n if (raw) {\n const events: TrackedEvent[] = JSON.parse(raw)\n this.queue.unshift(...events)\n localStorage.removeItem(QUEUE_STORAGE_KEY)\n debug(\"Restored\", events.length, \"queued events\")\n }\n } catch {\n // ignore\n }\n }\n\n private clearPersistedQueue(): void {\n try {\n localStorage.removeItem(QUEUE_STORAGE_KEY)\n } catch {\n // ignore\n }\n }\n}\n","import type {\n TrackedEvent,\n AutoTrackingOptions,\n ElementInfo,\n RedactionOptions,\n} from \"./types\"\nimport { debug } from \"./logger\"\n\nconst RAGE_CLICK_THRESHOLD = 3\nconst RAGE_CLICK_WINDOW_MS = 1000\nconst RAGE_CLICK_RADIUS_PX = 30\nconst DEAD_CLICK_TIMEOUT_MS = 2500\n\nconst INTERACTIVE_TAGS = new Set([\n \"A\", \"BUTTON\", \"INPUT\", \"SELECT\", \"TEXTAREA\", \"LABEL\",\n])\n\nconst INTERACTIVE_ROLES = new Set([\n \"button\", \"link\", \"tab\", \"menuitem\", \"checkbox\", \"radio\",\n])\n\nfunction isInteractiveElement(el: HTMLElement): boolean {\n let current: HTMLElement | null = el\n while (current && current !== document.body) {\n if (INTERACTIVE_TAGS.has(current.tagName)) return true\n const role = current.getAttribute(\"role\")\n if (role && INTERACTIVE_ROLES.has(role)) return true\n if (current.hasAttribute(\"onclick\")) return true\n if (current.hasAttribute(\"tabindex\")) return true\n current = current.parentElement\n }\n try {\n if (window.getComputedStyle(el).cursor === \"pointer\") return true\n } catch {\n // getComputedStyle can throw on detached elements\n }\n return false\n}\n\ninterface ClickRecord {\n target: EventTarget | null\n timestamp: number\n x: number\n y: number\n}\n\nexport class AutoTracker {\n private options: AutoTrackingOptions\n private redaction: RedactionOptions\n private onEvent: (event: TrackedEvent) => void\n private sessionId: string\n private recentClicks: ClickRecord[] = []\n private scrollDepthMax = 0\n private scrollTimer: ReturnType<typeof setTimeout> | null = null\n private originalPushState: typeof history.pushState | null = null\n private originalReplaceState: typeof history.replaceState | null = null\n private cleanupFns: Array<() => void> = []\n\n constructor(\n options: AutoTrackingOptions,\n redaction: RedactionOptions,\n sessionId: string,\n onEvent: (event: TrackedEvent) => void,\n ) {\n this.options = options\n this.redaction = redaction\n this.sessionId = sessionId\n this.onEvent = onEvent\n }\n\n start(): void {\n if (typeof window === \"undefined\") return\n\n if (this.options.trackClicks !== false) this.setupClickTracking()\n if (this.options.trackForms !== false) this.setupFormTracking()\n if (this.options.trackNavigation !== false) this.setupNavigationTracking()\n if (this.options.trackScrollDepth !== false) this.setupScrollTracking()\n\n debug(\"AutoTracker started\")\n }\n\n stop(): void {\n this.cleanupFns.forEach((fn) => fn())\n this.cleanupFns = []\n\n if (this.originalPushState) {\n history.pushState = this.originalPushState\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState\n }\n\n debug(\"AutoTracker stopped\")\n }\n\n updateSessionId(sessionId: string): void {\n this.sessionId = sessionId\n }\n\n private setupClickTracking(): void {\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n if (!target) return\n\n const info = this.getElementInfo(target)\n this.emit(\"click\", {\n element: info,\n x: e.clientX,\n y: e.clientY,\n pageUrl: window.location.href,\n })\n\n if (this.options.detectRageClicks !== false) {\n this.checkRageClick(e)\n }\n\n if (this.options.detectDeadClicks !== false) {\n this.checkDeadClick(e, target)\n }\n }\n\n document.addEventListener(\"click\", handler, true)\n this.cleanupFns.push(() =>\n document.removeEventListener(\"click\", handler, true),\n )\n }\n\n private setupFormTracking(): void {\n const submitHandler = (e: SubmitEvent) => {\n const form = e.target as HTMLFormElement\n if (!form) return\n\n this.emit(\"form_submit\", {\n element: this.getElementInfo(form),\n action: form.action,\n method: form.method,\n pageUrl: window.location.href,\n })\n }\n\n const changeHandler = (e: Event) => {\n const target = e.target as HTMLElement\n if (!target) return\n if (![\"INPUT\", \"SELECT\", \"TEXTAREA\"].includes(target.tagName)) return\n\n const info = this.getElementInfo(target)\n this.emit(\"form_change\", {\n element: info,\n fieldType: (target as HTMLInputElement).type || target.tagName.toLowerCase(),\n pageUrl: window.location.href,\n })\n }\n\n document.addEventListener(\"submit\", submitHandler, true)\n document.addEventListener(\"change\", changeHandler, true)\n this.cleanupFns.push(\n () => document.removeEventListener(\"submit\", submitHandler, true),\n () => document.removeEventListener(\"change\", changeHandler, true),\n )\n }\n\n private setupNavigationTracking(): void {\n this.emitPageView()\n\n const popstateHandler = () => this.emitPageView()\n window.addEventListener(\"popstate\", popstateHandler)\n this.cleanupFns.push(() =>\n window.removeEventListener(\"popstate\", popstateHandler),\n )\n\n this.originalPushState = history.pushState.bind(history)\n this.originalReplaceState = history.replaceState.bind(history)\n\n history.pushState = (...args) => {\n this.originalPushState!(...args)\n this.emitPageView()\n }\n\n history.replaceState = (...args) => {\n this.originalReplaceState!(...args)\n this.emitPageView()\n }\n }\n\n private setupScrollTracking(): void {\n const handler = () => {\n if (this.scrollTimer) clearTimeout(this.scrollTimer)\n\n this.scrollTimer = setTimeout(() => {\n const scrollHeight = document.documentElement.scrollHeight\n const viewportHeight = window.innerHeight\n const scrollTop = window.scrollY\n\n if (scrollHeight <= viewportHeight) return\n\n const depth = Math.round(\n ((scrollTop + viewportHeight) / scrollHeight) * 100,\n )\n\n if (depth > this.scrollDepthMax) {\n this.scrollDepthMax = depth\n this.emit(\"scroll_depth\", {\n depth,\n pageUrl: window.location.href,\n })\n }\n }, 250)\n }\n\n window.addEventListener(\"scroll\", handler, { passive: true })\n this.cleanupFns.push(() =>\n window.removeEventListener(\"scroll\", handler),\n )\n }\n\n private checkRageClick(e: MouseEvent): void {\n const now = Date.now()\n this.recentClicks.push({\n target: e.target,\n timestamp: now,\n x: e.clientX,\n y: e.clientY,\n })\n\n this.recentClicks = this.recentClicks.filter(\n (c) => now - c.timestamp < RAGE_CLICK_WINDOW_MS,\n )\n\n if (this.recentClicks.length >= RAGE_CLICK_THRESHOLD) {\n const nearby = this.recentClicks.filter((c) => {\n const dx = Math.abs(c.x - e.clientX)\n const dy = Math.abs(c.y - e.clientY)\n return dx <= RAGE_CLICK_RADIUS_PX && dy <= RAGE_CLICK_RADIUS_PX\n })\n\n if (nearby.length >= RAGE_CLICK_THRESHOLD) {\n const target = e.target as HTMLElement\n this.emit(\"rage_click\", {\n element: this.getElementInfo(target),\n clickCount: nearby.length,\n windowMs: RAGE_CLICK_WINDOW_MS,\n pageUrl: window.location.href,\n })\n this.recentClicks = []\n }\n }\n }\n\n private checkDeadClick(_e: MouseEvent, target: HTMLElement): void {\n if (isInteractiveElement(target)) return\n\n const clickUrl = window.location.href\n let hadMutation = false\n let hadScroll = false\n let hadSelection = false\n\n const observer = new MutationObserver(() => {\n hadMutation = true\n })\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n })\n\n const scrollHandler = () => { hadScroll = true }\n const selectionHandler = () => {\n const sel = window.getSelection()\n if (sel && sel.toString().length > 0) hadSelection = true\n }\n\n window.addEventListener(\"scroll\", scrollHandler, { passive: true, capture: true })\n document.addEventListener(\"selectionchange\", selectionHandler)\n\n setTimeout(() => {\n observer.disconnect()\n window.removeEventListener(\"scroll\", scrollHandler, true)\n document.removeEventListener(\"selectionchange\", selectionHandler)\n\n const urlChanged = window.location.href !== clickUrl\n\n if (!hadMutation && !hadScroll && !hadSelection && !urlChanged) {\n const reportTarget = this.findReportableAncestor(target) ?? target\n this.emit(\"dead_click\", {\n element: this.getElementInfo(reportTarget),\n pageUrl: clickUrl,\n })\n }\n }, DEAD_CLICK_TIMEOUT_MS)\n }\n\n private findReportableAncestor(el: HTMLElement): HTMLElement | null {\n let current: HTMLElement | null = el.parentElement\n while (current && current !== document.body) {\n if (INTERACTIVE_TAGS.has(current.tagName)) return current\n if (current.getAttribute(\"role\") === \"button\") return current\n current = current.parentElement\n }\n return null\n }\n\n private emitPageView(): void {\n this.scrollDepthMax = 0\n\n this.emit(\"page_view\", {\n url: window.location.href,\n path: window.location.pathname,\n referrer: document.referrer,\n title: document.title,\n })\n }\n\n private emit(type: TrackedEvent[\"type\"], data: Record<string, unknown>): void {\n this.onEvent({\n type,\n timestamp: Date.now(),\n data,\n sessionId: this.sessionId,\n })\n }\n\n private getElementInfo(el: HTMLElement): ElementInfo {\n const info: ElementInfo = {\n tag: el.tagName.toLowerCase(),\n selector: this.buildSelector(el),\n }\n\n if (el.id) info.id = el.id\n\n if (this.options.includeClasses !== false && el.className) {\n const classes =\n typeof el.className === \"string\"\n ? el.className.split(/\\s+/).filter(Boolean)\n : []\n if (classes.length > 0) info.classes = classes\n }\n\n if (this.options.includeText !== false) {\n const isSensitiveInput = [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(el.tagName)\n if (!isSensitiveInput || this.redaction.mode !== \"privacy-first\") {\n const text = el.textContent?.trim().slice(0, 100)\n if (text) info.text = text\n }\n }\n\n if (el.tagName === \"A\") {\n info.href = (el as HTMLAnchorElement).href\n }\n\n if (\"name\" in el && typeof (el as HTMLInputElement).name === \"string\") {\n info.name = (el as HTMLInputElement).name\n }\n\n if (\"type\" in el && typeof (el as HTMLInputElement).type === \"string\") {\n info.type = (el as HTMLInputElement).type\n }\n\n return info\n }\n\n private buildSelector(el: HTMLElement): string {\n if (el.id) return `#${el.id}`\n\n const parts: string[] = []\n let current: HTMLElement | null = el\n\n for (let i = 0; i < 4 && current && current !== document.body; i++) {\n let part = current.tagName.toLowerCase()\n if (current.id) {\n part = `#${current.id}`\n parts.unshift(part)\n break\n }\n if (current.className && typeof current.className === \"string\") {\n const cls = current.className\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .join(\".\")\n if (cls) part += `.${cls}`\n }\n parts.unshift(part)\n current = current.parentElement\n }\n\n return parts.join(\" > \")\n }\n}\n","import type { RedactionOptions } from \"./types\"\nimport { debug, warn } from \"./logger\"\n\nexport class SessionRecorder {\n private recording = false\n private stopFn: (() => void) | null = null\n private onEvent: (event: unknown) => void\n private redaction: RedactionOptions\n private recordCanvas: boolean\n\n constructor(\n redaction: RedactionOptions,\n recordCanvas: boolean,\n onEvent: (event: unknown) => void,\n ) {\n this.redaction = redaction\n this.recordCanvas = recordCanvas\n this.onEvent = onEvent\n }\n\n async start(): Promise<void> {\n if (this.recording) return\n if (typeof window === \"undefined\") return\n\n try {\n const { record } = await import(\"rrweb\")\n\n const maskConfig = this.buildMaskConfig()\n\n const stopFn = record({\n emit: (event: unknown) => {\n this.onEvent(event)\n },\n ...maskConfig,\n recordCanvas: this.recordCanvas,\n sampling: {\n mousemove: true,\n mouseInteraction: true,\n scroll: 150,\n input: \"last\",\n },\n recordCrossOriginIframes: false,\n })\n\n if (stopFn) this.stopFn = stopFn\n this.recording = true\n debug(\"Session recording started\")\n } catch (err) {\n warn(\"Failed to start rrweb recording:\", err)\n }\n }\n\n stop(): void {\n if (this.stopFn) {\n this.stopFn()\n this.stopFn = null\n }\n this.recording = false\n debug(\"Session recording stopped\")\n }\n\n isRecording(): boolean {\n return this.recording\n }\n\n private buildMaskConfig(): Record<string, unknown> {\n if (this.redaction.mode === \"privacy-first\") {\n return {\n maskAllInputs: true,\n maskTextSelector: \"*\",\n maskInputOptions: {\n password: true,\n email: true,\n text: true,\n tel: true,\n url: true,\n search: true,\n number: true,\n textarea: true,\n select: true,\n },\n ...(this.redaction.unredactFields?.length\n ? {\n unmaskTextSelector:\n this.redaction.unredactFields\n .map((f) => `[data-pb-unmask=\"${f}\"]`)\n .join(\", \"),\n }\n : {}),\n }\n }\n\n return {\n maskAllInputs: false,\n maskInputOptions: {\n password: true,\n },\n }\n }\n}\n","import type { TrackedEvent } from \"./types\"\nimport { debug } from \"./logger\"\n\nexport class ConsoleTracker {\n private sessionId: string\n private onEvent: (event: TrackedEvent) => void\n private originalWarn: typeof console.warn | null = null\n private originalError: typeof console.error | null = null\n\n constructor(\n sessionId: string,\n onEvent: (event: TrackedEvent) => void,\n ) {\n this.sessionId = sessionId\n this.onEvent = onEvent\n }\n\n start(): void {\n if (typeof window === \"undefined\") return\n\n this.originalWarn = console.warn\n this.originalError = console.error\n\n console.warn = (...args: unknown[]) => {\n this.originalWarn?.apply(console, args)\n this.trackConsole(\"console_warn\", args)\n }\n\n console.error = (...args: unknown[]) => {\n this.originalError?.apply(console, args)\n this.trackConsole(\"console_error\", args)\n }\n\n window.addEventListener(\"error\", (e) => {\n this.onEvent({\n type: \"console_error\",\n timestamp: Date.now(),\n data: {\n message: e.message,\n filename: e.filename,\n lineno: e.lineno,\n colno: e.colno,\n stack: e.error?.stack,\n },\n sessionId: this.sessionId,\n })\n })\n\n window.addEventListener(\"unhandledrejection\", (e) => {\n this.onEvent({\n type: \"console_error\",\n timestamp: Date.now(),\n data: {\n message: String(e.reason),\n stack: e.reason?.stack,\n source: \"unhandledrejection\",\n },\n sessionId: this.sessionId,\n })\n })\n\n debug(\"ConsoleTracker started\")\n }\n\n stop(): void {\n if (this.originalWarn) console.warn = this.originalWarn\n if (this.originalError) console.error = this.originalError\n }\n\n updateSessionId(sessionId: string): void {\n this.sessionId = sessionId\n }\n\n private trackConsole(\n type: \"console_warn\" | \"console_error\",\n args: unknown[],\n ): void {\n const message = args\n .map((a) => {\n if (typeof a === \"string\") return a\n try {\n return JSON.stringify(a)\n } catch {\n return String(a)\n }\n })\n .join(\" \")\n\n if (message.includes(\"[ProductBet]\")) return\n\n this.onEvent({\n type,\n timestamp: Date.now(),\n data: {\n message: message.slice(0, 2000),\n url: window.location.href,\n },\n sessionId: this.sessionId,\n })\n }\n}\n","import type { TrackedEvent } from \"./types\"\nimport { debug } from \"./logger\"\n\nexport class NetworkTracker {\n private sessionId: string\n private ingestionUrl: string\n private onEvent: (event: TrackedEvent) => void\n private originalFetch: typeof fetch | null = null\n\n constructor(\n sessionId: string,\n ingestionUrl: string,\n onEvent: (event: TrackedEvent) => void,\n ) {\n this.sessionId = sessionId\n this.ingestionUrl = ingestionUrl\n this.onEvent = onEvent\n }\n\n start(): void {\n if (typeof window === \"undefined\") return\n if (this.originalFetch) return\n\n this.originalFetch = window.fetch.bind(window)\n const tracker = this\n\n window.fetch = function pbTrackedFetch(input: RequestInfo | URL, init?: RequestInit) {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.href\n : (input as Request).url\n\n if (url.startsWith(tracker.ingestionUrl)) {\n return tracker.originalFetch!(input, init)\n }\n\n const method = init?.method || \"GET\"\n const startTime = Date.now()\n\n return tracker.originalFetch!(input, init).then(\n (response: Response) => {\n if (response.status >= 400) {\n tracker.onEvent({\n type: \"network_error\",\n timestamp: Date.now(),\n data: {\n url: url.slice(0, 500),\n method,\n status: response.status,\n statusText: response.statusText,\n duration: Date.now() - startTime,\n errorType:\n response.status >= 500\n ? \"server_error\"\n : \"client_error\",\n },\n sessionId: tracker.sessionId,\n })\n }\n return response\n },\n (err: unknown) => {\n tracker.onEvent({\n type: \"network_error\",\n timestamp: Date.now(),\n data: {\n url: url.slice(0, 500),\n method,\n status: null,\n duration: Date.now() - startTime,\n errorType: \"network_error\",\n errorMessage:\n err instanceof Error ? err.message : String(err),\n },\n sessionId: tracker.sessionId,\n })\n throw err\n },\n )\n }\n\n debug(\"NetworkTracker started\")\n }\n\n stop(): void {\n if (this.originalFetch) {\n window.fetch = this.originalFetch\n this.originalFetch = null\n }\n }\n\n updateSessionId(sessionId: string): void {\n this.sessionId = sessionId\n }\n}\n","import type { TrackerOptions, TrackedEvent, UserProperties } from \"./types\"\nimport { DEFAULT_OPTIONS } from \"./types\"\nimport { SessionManager } from \"./session\"\nimport { ApiClient } from \"./api-client\"\nimport { AutoTracker } from \"./auto-tracker\"\nimport { SessionRecorder } from \"./recorder\"\nimport { ConsoleTracker } from \"./console-tracker\"\nimport { NetworkTracker } from \"./network-tracker\"\nimport { setDebug, debug, warn } from \"./logger\"\n\nlet globalInstance: ProductBetTracker | null = null\n\nconst IDLE_THRESHOLD_MS = 5 * 60_000\nconst USER_ACTIVITY_EVENTS = [\"click\", \"keydown\", \"scroll\", \"mousemove\"] as const\n\nexport class ProductBetTracker {\n private apiKey: string\n private options: Required<TrackerOptions>\n private session: SessionManager\n private apiClient: ApiClient\n private autoTracker: AutoTracker | null = null\n private recorder: SessionRecorder | null = null\n private consoleTracker: ConsoleTracker | null = null\n private networkTracker: NetworkTracker | null = null\n private started = false\n private activityCheckTimer: ReturnType<typeof setInterval> | null = null\n private lastActivityAt = Date.now()\n private idle = false\n\n private constructor(apiKey: string, options: TrackerOptions = {}) {\n this.apiKey = apiKey\n this.options = this.mergeOptions(options)\n\n setDebug(this.options.debug)\n\n this.session = new SessionManager(this.options.sessionTimeoutMs)\n\n this.apiClient = new ApiClient(\n this.apiKey,\n this.options.ingestionUrl,\n this.session.getSessionId(),\n this.options.maxQueueSize,\n this.options.flushIntervalMs,\n this.session.getWindowId(),\n )\n\n if (this.options.enableAutoTracking) {\n this.autoTracker = new AutoTracker(\n this.options.autoTrackingOptions,\n this.options.redaction,\n this.session.getSessionId(),\n (event) => this.handleEvent(event),\n )\n }\n\n if (this.options.enableSessionRecording) {\n this.recorder = new SessionRecorder(\n this.options.redaction,\n this.options.recordCanvas,\n (event) => this.apiClient.enqueueReplayEvent(event),\n )\n }\n\n if (this.options.enableConsoleTracking) {\n this.consoleTracker = new ConsoleTracker(\n this.session.getSessionId(),\n (event) => this.handleEvent(event),\n )\n }\n\n if (this.options.enableNetworkTracking) {\n this.networkTracker = new NetworkTracker(\n this.session.getSessionId(),\n this.options.ingestionUrl,\n (event) => this.handleEvent(event),\n )\n }\n\n debug(\"ProductBetTracker initialized\")\n }\n\n static init(\n apiKey: string,\n options?: TrackerOptions,\n ): ProductBetTracker {\n if (!apiKey) {\n throw new Error(\"ProductBet: apiKey is required\")\n }\n\n if (globalInstance) {\n warn(\"ProductBetTracker already initialized. Returning existing instance.\")\n return globalInstance\n }\n\n globalInstance = new ProductBetTracker(apiKey, options)\n return globalInstance\n }\n\n static getInstance(): ProductBetTracker | null {\n return globalInstance\n }\n\n start(): void {\n if (this.started) return\n if (typeof window === \"undefined\") {\n warn(\"ProductBetTracker.start() called in non-browser environment. Skipping.\")\n return\n }\n\n this.started = true\n\n this.apiClient.start()\n this.autoTracker?.start()\n this.recorder?.start()\n this.consoleTracker?.start()\n this.networkTracker?.start()\n\n this.handleEvent({\n type: \"session_start\",\n timestamp: Date.now(),\n data: {\n url: window.location.href,\n referrer: document.referrer,\n screenWidth: window.screen.width,\n screenHeight: window.screen.height,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n userAgent: navigator.userAgent,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n },\n sessionId: this.session.getSessionId(),\n })\n\n this.activityCheckTimer = setInterval(() => {\n if (this.session.isExpired()) {\n this.rotateSession()\n }\n this.checkIdle()\n }, 60_000)\n\n this.setupActivityListeners()\n\n debug(\"ProductBetTracker started\")\n }\n\n stop(): void {\n if (!this.started) return\n\n this.handleEvent({\n type: \"session_end\",\n timestamp: Date.now(),\n data: {},\n sessionId: this.session.getSessionId(),\n })\n\n this.autoTracker?.stop()\n this.recorder?.stop()\n this.consoleTracker?.stop()\n this.networkTracker?.stop()\n this.apiClient.stop()\n\n if (this.activityCheckTimer) {\n clearInterval(this.activityCheckTimer)\n this.activityCheckTimer = null\n }\n\n this.started = false\n debug(\"ProductBetTracker stopped\")\n }\n\n identify(userId: string, attributes?: Record<string, unknown>): void {\n const props: UserProperties = { userId, attributes }\n this.apiClient.setEndUserId(userId)\n this.apiClient.sendIdentify({\n userId: props.userId,\n attributes: props.attributes || {},\n sessionId: this.session.getSessionId(),\n })\n debug(\"User identified\", userId)\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n this.apiClient.sendCustomEvent({\n sessionId: this.session.getSessionId(),\n eventName,\n eventProperties: properties || {},\n endUserId: null,\n })\n }\n\n getSessionId(): string {\n return this.session.getSessionId()\n }\n\n setUnredactedFields(fields: string[]): void {\n this.options.redaction.unredactFields = fields\n }\n\n getUnredactedFields(): string[] {\n return this.options.redaction.unredactFields || []\n }\n\n private handleEvent(event: TrackedEvent): void {\n const isUserAction =\n event.type === \"click\" ||\n event.type === \"rage_click\" ||\n event.type === \"form_submit\" ||\n event.type === \"form_change\" ||\n event.type === \"page_view\" ||\n event.type === \"session_start\" ||\n event.type === \"session_end\"\n\n if (isUserAction) {\n this.lastActivityAt = Date.now()\n if (this.idle) {\n this.idle = false\n debug(\"User returned from idle\")\n }\n }\n\n if (this.idle && !isUserAction) return\n\n this.session.touch()\n this.apiClient.enqueueEvent(event)\n }\n\n private setupActivityListeners(): void {\n const onActivity = () => {\n this.lastActivityAt = Date.now()\n if (this.idle) {\n this.idle = false\n debug(\"User returned from idle\")\n }\n }\n for (const evt of USER_ACTIVITY_EVENTS) {\n window.addEventListener(evt, onActivity, { passive: true, capture: true })\n }\n }\n\n private checkIdle(): void {\n if (this.idle) return\n if (Date.now() - this.lastActivityAt > IDLE_THRESHOLD_MS) {\n this.idle = true\n debug(\"User idle, pausing background event capture\")\n }\n }\n\n private rotateSession(): void {\n const newSessionId = this.session.rotate()\n this.apiClient.updateSessionId(newSessionId)\n this.autoTracker?.updateSessionId(newSessionId)\n this.consoleTracker?.updateSessionId(newSessionId)\n this.networkTracker?.updateSessionId(newSessionId)\n debug(\"Session rotated to\", newSessionId)\n\n this.handleEvent({\n type: \"session_start\",\n timestamp: Date.now(),\n data: {\n url: window.location.href,\n rotated: true,\n },\n sessionId: newSessionId,\n })\n }\n\n private mergeOptions(\n partial: TrackerOptions,\n ): Required<TrackerOptions> {\n return {\n ...DEFAULT_OPTIONS,\n ...partial,\n autoTrackingOptions: {\n ...DEFAULT_OPTIONS.autoTrackingOptions,\n ...partial.autoTrackingOptions,\n },\n redaction: {\n ...DEFAULT_OPTIONS.redaction,\n ...partial.redaction,\n },\n }\n }\n}\n"],"names":["logError"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function setDebug(enabled: boolean): void;
2
+ export declare function debug(...args: unknown[]): void;
3
+ export declare function warn(...args: unknown[]): void;
4
+ export declare function error(...args: unknown[]): void;
@@ -0,0 +1,11 @@
1
+ import type { TrackedEvent } from "./types";
2
+ export declare class NetworkTracker {
3
+ private sessionId;
4
+ private ingestionUrl;
5
+ private onEvent;
6
+ private originalFetch;
7
+ constructor(sessionId: string, ingestionUrl: string, onEvent: (event: TrackedEvent) => void);
8
+ start(): void;
9
+ stop(): void;
10
+ updateSessionId(sessionId: string): void;
11
+ }
@@ -0,0 +1,13 @@
1
+ import type { RedactionOptions } from "./types";
2
+ export declare class SessionRecorder {
3
+ private recording;
4
+ private stopFn;
5
+ private onEvent;
6
+ private redaction;
7
+ private recordCanvas;
8
+ constructor(redaction: RedactionOptions, recordCanvas: boolean, onEvent: (event: unknown) => void);
9
+ start(): Promise<void>;
10
+ stop(): void;
11
+ isRecording(): boolean;
12
+ private buildMaskConfig;
13
+ }
@@ -0,0 +1,17 @@
1
+ export declare class SessionManager {
2
+ private sessionId;
3
+ private windowId;
4
+ private startedAt;
5
+ private lastActivityAt;
6
+ private timeoutMs;
7
+ constructor(timeoutMs: number);
8
+ getSessionId(): string;
9
+ getWindowId(): string;
10
+ getStartedAt(): number;
11
+ touch(): void;
12
+ isExpired(): boolean;
13
+ rotate(): string;
14
+ private persist;
15
+ private restore;
16
+ private getOrCreateWindowId;
17
+ }
@@ -0,0 +1,30 @@
1
+ import type { TrackerOptions } from "./types";
2
+ export declare class ProductBetTracker {
3
+ private apiKey;
4
+ private options;
5
+ private session;
6
+ private apiClient;
7
+ private autoTracker;
8
+ private recorder;
9
+ private consoleTracker;
10
+ private networkTracker;
11
+ private started;
12
+ private activityCheckTimer;
13
+ private lastActivityAt;
14
+ private idle;
15
+ private constructor();
16
+ static init(apiKey: string, options?: TrackerOptions): ProductBetTracker;
17
+ static getInstance(): ProductBetTracker | null;
18
+ start(): void;
19
+ stop(): void;
20
+ identify(userId: string, attributes?: Record<string, unknown>): void;
21
+ track(eventName: string, properties?: Record<string, unknown>): void;
22
+ getSessionId(): string;
23
+ setUnredactedFields(fields: string[]): void;
24
+ getUnredactedFields(): string[];
25
+ private handleEvent;
26
+ private setupActivityListeners;
27
+ private checkIdle;
28
+ private rotateSession;
29
+ private mergeOptions;
30
+ }
@@ -0,0 +1,77 @@
1
+ export interface TrackerOptions {
2
+ ingestionUrl?: string;
3
+ enableSessionRecording?: boolean;
4
+ enableAutoTracking?: boolean;
5
+ autoTrackingOptions?: AutoTrackingOptions;
6
+ redaction?: RedactionOptions;
7
+ maxQueueSize?: number;
8
+ flushIntervalMs?: number;
9
+ enableConsoleTracking?: boolean;
10
+ enableNetworkTracking?: boolean;
11
+ recordCanvas?: boolean;
12
+ sessionTimeoutMs?: number;
13
+ debug?: boolean;
14
+ }
15
+ export interface AutoTrackingOptions {
16
+ trackClicks?: boolean;
17
+ trackForms?: boolean;
18
+ trackNavigation?: boolean;
19
+ trackScrollDepth?: boolean;
20
+ detectRageClicks?: boolean;
21
+ detectDeadClicks?: boolean;
22
+ includeText?: boolean;
23
+ includeClasses?: boolean;
24
+ }
25
+ export interface RedactionOptions {
26
+ mode: "privacy-first" | "visibility-first";
27
+ unredactFields?: string[];
28
+ }
29
+ export interface UserProperties {
30
+ userId: string;
31
+ attributes?: Record<string, unknown>;
32
+ }
33
+ export interface TrackedEvent {
34
+ type: EventType;
35
+ timestamp: number;
36
+ data: Record<string, unknown>;
37
+ sessionId: string;
38
+ windowId?: string;
39
+ }
40
+ export type EventType = "session_start" | "session_end" | "page_view" | "click" | "form_submit" | "form_change" | "scroll_depth" | "rage_click" | "dead_click" | "custom" | "console_error" | "console_warn" | "network_error" | "rrweb";
41
+ export interface EventBatch {
42
+ sessionId: string;
43
+ windowId?: string;
44
+ events: TrackedEvent[];
45
+ replayEvents?: unknown[];
46
+ endUserId?: string | null;
47
+ sdkVersion: string;
48
+ timestamp: number;
49
+ }
50
+ export interface IdentifyPayload {
51
+ userId: string;
52
+ attributes: Record<string, unknown>;
53
+ sessionId: string;
54
+ }
55
+ export interface CustomEventPayload {
56
+ sessionId: string;
57
+ eventName: string;
58
+ eventProperties: Record<string, unknown>;
59
+ endUserId?: string | null;
60
+ }
61
+ export interface IngestionResponse {
62
+ success: boolean;
63
+ sessionCreated?: boolean;
64
+ monthlyLimitReached?: boolean;
65
+ }
66
+ export interface ElementInfo {
67
+ tag: string;
68
+ id?: string;
69
+ classes?: string[];
70
+ text?: string;
71
+ href?: string;
72
+ name?: string;
73
+ type?: string;
74
+ selector: string;
75
+ }
76
+ export declare const DEFAULT_OPTIONS: Required<TrackerOptions>;
77
+ export declare const SDK_VERSION = "0.1.0";
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@productbet/tracker-core",
3
+ "version": "0.1.0",
4
+ "description": "Core behavioral analytics SDK for ProductBet - session recording, event tracking, and user identification",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "dependencies": {
19
+ "rrweb": "^2.0.0-alpha.18"
20
+ },
21
+ "devDependencies": {
22
+ "@rollup/plugin-commonjs": "^28.0.0",
23
+ "@rollup/plugin-node-resolve": "^16.0.0",
24
+ "@rollup/plugin-typescript": "^12.0.0",
25
+ "rimraf": "^6.0.0",
26
+ "rollup": "^4.0.0",
27
+ "tslib": "^2.8.0",
28
+ "typescript": "^5.8.0"
29
+ },
30
+ "sideEffects": false,
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/productbet/productbet",
35
+ "directory": "packages/tracker-core"
36
+ },
37
+ "keywords": [
38
+ "analytics",
39
+ "session-recording",
40
+ "behavioral-analytics",
41
+ "productbet",
42
+ "rrweb"
43
+ ],
44
+ "scripts": {
45
+ "build": "rollup -c rollup.config.mjs",
46
+ "dev": "rollup -c rollup.config.mjs --watch",
47
+ "clean": "rimraf dist"
48
+ }
49
+ }