{"version":3,"sources":["../package.json","../src/utils/util.ts","../src/handlers/clickHandler.ts","../src/utils/logger.ts","../src/server.ts","../src/vitals.ts","../src/record.ts","../src/methods.ts","../src/lib.ts"],"sourcesContent":["{\n    \"name\": \"@loglib/tracker\",\n    \"version\": \"0.8.0\",\n    \"description\": \"A simple tracker for loglib\",\n    \"main\": \"./dist/index.js\",\n    \"packageManager\": \"pnpm@7.9.5\",\n    \"scripts\": {\n        \"test\": \"vitest\",\n        \"dev\": \"rm -rf /dist & tsup --watch\",\n        \"build\": \"rm -rf /dist & tsup\",\n        \"lint\": \"rome check .\"\n    },\n    \"exports\": {\n        \".\": {\n            \"browser\": \"./dist/index.js\",\n            \"import\": \"./dist/index.js\",\n            \"require\": \"./dist/index.cjs\"\n        },\n        \"./react\": {\n            \"browser\": \"./dist/react/index.js\",\n            \"import\": \"./dist/react/index.js\",\n            \"require\": \"./dist/react/index.cjs\"\n        }\n    },\n    \"typesVersions\": {\n        \"*\": {\n            \"*\": [\n                \"dist/index.d.ts\"\n            ],\n            \"react\": [\n                \"dist/react/index.d.ts\"\n            ]\n        }\n    },\n    \"types\": \"dist/index.d.ts\",\n    \"keywords\": [\n        \"loglib\",\n        \"event tracker\",\n        \"web analytics\",\n        \"analytics\"\n    ],\n    \"author\": \"\",\n    \"license\": \"MIT\",\n    \"files\": [\n        \"dist\",\n        \"package.json\",\n        \"LICENSE\",\n        \"README.md\"\n    ],\n    \"devDependencies\": {\n        \"@changesets/changelog-git\": \"^0.1.14\",\n        \"@changesets/changelog-github\": \"^0.4.8\",\n        \"@changesets/cli\": \"^2.26.1\",\n        \"@loglib/types\": \"0.0.1\",\n        \"@types/jest\": \"^29.5.1\",\n        \"@types/node\": \"^18.15.13\",\n        \"@types/react\": \"^18.2.0\",\n        \"@types/testing-library__jest-dom\": \"^5.14.5\",\n        \"@vitest/browser\": \"^0.31.1\",\n        \"happy-dom\": \"^9.20.3\",\n        \"react\": \"^18.2.0\",\n        \"sinon\": \"^15.0.4\",\n        \"terser\": \"^5.17.3\",\n        \"tsup\": \"^6.7.0\",\n        \"typescript\": \"^5.1.6\",\n        \"vitest\": \"^0.31.0\",\n        \"webdriverio\": \"^8.10.5\"\n    },\n    \"peerDependencies\": {\n        \"react\": \"^16.8||^17||^18\"\n    },\n    \"dependencies\": {\n        \"web-vitals\": \"^3.4.0\"\n    }\n}\n","import { ServerEvents } from \"../types\";\n\nexport function getVisitorId() {\n    const getId = () => localStorage.getItem(\"loglib-id\");\n    if (window.llc.consent === \"denied\" && !getId()) {\n        return \"\";\n    } else {\n        window.llc.consent = \"granted\";\n        if (!getId()) {\n            window.localStorage.setItem(\"loglib-id\", guid());\n        }\n        return getId();\n    }\n}\n\nexport function flush() {\n    window.lli.eventsBank = [];\n}\n\nexport function checkDoNotTrackClass(e: Event) {\n    const target = e.target as HTMLButtonElement;\n    if (target.hasAttribute(\"doNotTrack\")) {\n        return true;\n    }\n    return false;\n}\n\nexport const getUrlParams = () => {\n    const urlSearchParams = new URLSearchParams(window.location.search);\n    return Object.fromEntries(urlSearchParams.entries());\n};\n\nexport const isUndefined = function (obj: any): obj is undefined {\n    return obj === void 0;\n};\n\nexport function isProduction() {\n    return window.llc.env === \"prod\";\n}\nexport function isDevelopment() {\n    return window.llc.env === \"dev\";\n}\n\nexport function guid(): string {\n    let d = new Date().getTime();\n    const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n        const r = ((d + Math.random() * 16) % 16) | 0;\n        d = Math.floor(d / 16);\n        return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n    });\n    return uuid;\n}\n\nexport function detectEnvironment() {\n    try {\n        const env = process.env.NODE_ENV;\n        if (env === \"development\" || env === \"test\") {\n            return \"dev\";\n        }\n    } catch {\n        return \"prod\";\n    }\n    return \"prod\";\n}\n\nexport const getPath = (url: string) => {\n    if (url.substring(0, 4) === \"http\") {\n        return `/${url.split(\"/\").splice(3).join(\"/\")}`;\n    }\n    return url;\n};\n\nexport const hook = (\n    _this: History,\n    method: keyof History,\n    callback: (...args: string[]) => void,\n) => {\n    const orig = _this[method];\n    return (...args: string[]) => {\n        callback(...args);\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access\n        return orig.apply(_this, args);\n    };\n};\n\nexport const clearIntervals = () => {\n    window.lli.intervals.forEach((intervalId) => clearInterval(intervalId));\n};\nexport const addInterval = (interval: NodeJS.Timer) => {\n    window.lli.intervals.push(interval);\n};\n\nexport function q(e: ServerEvents) {\n    window.lli.eventsBank.push(e);\n}\n\nexport function getUrl() {\n    if (typeof process === \"undefined\") {\n        return \"https://api.loglib.io\";\n    }\n    if (process.env.NEXT_PUBLIC_LOGLIB_URL || process.env.LOGLIB_URL) {\n        const url = process.env.NEXT_PUBLIC_LOGLIB_URL ?? process.env.LOGLIB_URL;\n        return `${url}/api/loglib`;\n    }\n    return \"https://api.loglib.io\";\n}\n\nexport const parseHost = (url: string) => {\n    //this is incase they update the tracker but didn't remove the host\n    if (url === \"https://loglib.io\" || url === \"https://www.loglib.io\") {\n        return \"https://loglib.io/api/loglib\";\n    } else {\n        return url;\n    }\n};\n\nexport const setSessionStartTime = (time: number) => {\n    sessionStorage.setItem(\"loglib-session-start-time\", time.toString());\n};\n\nexport const getSessionDuration = () => {\n    const startTime = sessionStorage.getItem(\"loglib-session-start-time\");\n    if (startTime) {\n        return (Date.now() - parseInt(startTime)) / 1000;\n    }\n    return 0;\n};\n","import { checkDoNotTrackClass, guid, q } from \"../utils/util\";\n\nexport const clickHandler = (e: Event) => {\n    const target = e.target as HTMLButtonElement;\n    const payload: Record<string, string> = {};\n    if (checkDoNotTrackClass(e)) return;\n    if (!window.llc.autoTrack) return;\n    if (typeof target.onclick !== \"function\" && target.nodeName !== \"BUTTON\") {\n        return;\n    }\n    q({\n        id: guid(),\n        eventName: target.textContent?.replace(/[\\W_]+/g, \"\") ?? \"\",\n        eventType: \"click\",\n        page: location.pathname,\n        payload,\n    });\n};\n","export const Logger = (debug: boolean) => {\n    return {\n        log(...args: any[]) {\n            debug &&\n                console.log(...args)\n        },\n        error(...args: any[]) {\n            debug &&\n                console.error(...args)\n        }\n    }\n}","import { Logger } from \"./utils/logger\";\nimport { flush, getSessionDuration, getUrlParams, getVisitorId, isDevelopment } from \"./utils/util\";\n\nexport function sendPageView(currentRef: string, currentUrl: string) {\n    const dataToSend = {\n        id: window.lli.pageId,\n        path: \"/hits\",\n        currentPath: currentUrl,\n        referrerPath: currentRef,\n        referrerDomain: document.referrer,\n        websiteId: window.llc.id,\n        host: location.href,\n        sdkVersion: window.lli.sdkVersion,\n        visitorId: getVisitorId(),\n        sessionId: window.lli.sessionId,\n        screenWidth: window.screen.width,\n        language: navigator.language,\n        queryParams: getUrlParams(),\n        pageId: window.lli.pageId,\n        duration: (Date.now() - window.lli.timeOnPage) / 1000,\n    };\n    send(dataToSend);\n}\n\nexport function sendEvents() {\n    if (window.lli.eventsBank.length) {\n        const eventToSend = {\n            path: \"/event\",\n            events: window.lli.eventsBank,\n            websiteId: window.llc.id,\n            visitorId: getVisitorId(),\n            sessionId: window.lli.sessionId,\n            screenWidth: window.screen.width,\n            language: navigator.language ?? \"en\",\n        };\n        send(eventToSend, flush);\n    }\n}\n\nexport function sendVisitor(payload: Record<string, string>) {\n    const visitorToSend = {\n        path: \"/visitor\",\n        data: payload,\n        websiteId: window.llc.id,\n        visitorId: getVisitorId(),\n        sessionId: window.lli.sessionId,\n        pageId: window.lli.pageId,\n        duration: getSessionDuration(),\n    };\n    send(visitorToSend);\n}\n\nexport async function send(\n    data: Record<string, any> | Array<Record<string, any>>,\n    onSuccess?: () => void,\n    onError?: () => void,\n    path?: string\n) {\n    const logger = Logger(window.llc.debug);\n    const url = path ? window.llc.host + path : window.llc.host;\n    if (!data || (Array.isArray(data) && data.length === 0)) {\n        logger.log(\"skipping empty request...\");\n        return;\n    }\n    if (isDevelopment()) {\n        logger.log(\"skipping development logs...\");\n        return;\n    }\n    logger.log(\"sending...\", data);\n    let retryCount = 0;\n    const maxRetries = 3;\n    async function sendRequest(host: string) {\n        try {\n            if (!window.llc.useBeacon) {\n                await fetch(host, {\n                    body: JSON.stringify(data),\n                    method: \"POST\",\n                    keepalive: true,\n                    headers: {\n                        \"Content-Type\": \"application/json\",\n                    },\n                }).then(() => onSuccess?.());\n            } else {\n                navigator.sendBeacon(host, JSON.stringify(data));\n                onSuccess?.();\n            }\n        } catch {\n            const xhr = new XMLHttpRequest();\n            xhr.open(\"POST\", host);\n            xhr.setRequestHeader(\"Content-Type\", \"text/plain\");\n            xhr.onload = async () => {\n                if (xhr.status === 200) {\n                    onSuccess?.();\n                } else {\n                    await retry();\n                }\n                logger.error(xhr.statusText);\n            };\n            xhr.onerror = async () => {\n                onError?.();\n                await retry();\n                logger.error(\"Couldn't send request to the server. See the XHR error.\");\n            };\n            xhr.send(JSON.stringify(data));\n        }\n    }\n    async function retry() {\n        if (retryCount < maxRetries) {\n            retryCount++;\n            logger.log(`Retrying request. Attempt ${retryCount} of ${maxRetries}...`);\n            await new Promise((resolve) => setTimeout(resolve, 1000 * retryCount));\n        } else {\n            logger.error(\"Request failed after multiple retries.\");\n        }\n    }\n    if (Array.isArray(url)) {\n        for (const host of url) {\n            await sendRequest(host);\n        }\n    } else {\n        await sendRequest(url);\n    }\n}\n","import {\n    CLSMetricWithAttribution,\n    FCPMetricWithAttribution,\n    FIDMetricWithAttribution,\n    INPMetricWithAttribution,\n    LCPMetricWithAttribution,\n    TTFBMetricWithAttribution,\n    onCLS,\n    onFCP,\n    onFID,\n    onINP,\n    onLCP,\n    onTTFB,\n} from \"web-vitals/attribution\";\nimport { send } from \"./server\";\nimport { getUrlParams, getVisitorId } from \"./utils/util\";\n\nexport function recordWebVitals() {\n    const queue = window.lli.vitalQueue;\n    function addToQueue(\n        metric:\n            | CLSMetricWithAttribution\n            | FIDMetricWithAttribution\n            | LCPMetricWithAttribution\n            | FCPMetricWithAttribution\n            | INPMetricWithAttribution\n            | TTFBMetricWithAttribution,\n    ) {\n        const data = {\n            visitorId: getVisitorId(),\n            sessionId: window.lli.sessionId,\n            sdkVersion: window.lli.sdkVersion,\n            screenWidth: window.screen.width,\n            language: navigator.language,\n            queryParams: getUrlParams(),\n            currentPath: window.lli.currentUrl,\n            id: metric.id,\n            delta: metric.delta,\n            value: metric.value,\n            name: metric.name,\n            rating: metric.rating,\n            navigationType: metric.navigationType,\n            websiteId: window.llc.id,\n        };\n        queue.add(data);\n    }\n    onCLS(addToQueue);\n    onFCP(addToQueue);\n    onFID(addToQueue);\n    onINP(addToQueue);\n    onTTFB(addToQueue);\n    onLCP(addToQueue);\n}\n\nexport function flushVitalQueue() {\n    const queue = window.lli.vitalQueue;\n    if (queue.size > 0) {\n        send([...queue], undefined, undefined, \"/vitals\");\n        queue.clear();\n    }\n}\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { clickHandler } from \"./handlers/clickHandler\";\nimport { sendEvents, sendPageView } from \"./server\";\nimport { Config } from \"./types\";\nimport { Logger } from \"./utils/logger\";\nimport {\n    addInterval,\n    clearIntervals,\n    detectEnvironment,\n    getPath,\n    getUrl,\n    guid,\n    hook,\n    parseHost,\n} from \"./utils/util\";\nimport { flushVitalQueue, recordWebVitals } from \"./vitals\";\n\n/**\n * Initializes the web analytics tracker with the specified configuration options.\n * @param {Partial<Config>} [config] - The configuration options for the tracker. See {@link Config} for overview\n * @see [Documentation](https://loglib.io/docs) for details.\n */\nexport function record(config?: Partial<Config>) {\n    //Set Config\n    const defaultConfig: NonNullable<Config> = {\n        id: \"\",\n        debug: false,\n        autoTrack: false,\n        env: \"auto\",\n        postInterval: 5,\n        host: getUrl(),\n        consent: \"denied\",\n        webVitals: true,\n        pageAnalytics: true,\n        customEvents: true,\n    };\n    if (config?.host) {\n        if (Array.isArray(config.host)) {\n            config.host = config.host.map((host) => parseHost(host));\n        } else {\n            config.host = parseHost(config.host);\n        }\n    }\n    window.llc = config ? { ...defaultConfig, ...config } : defaultConfig;\n\n    //Set Internal\n    const now = Date.now();\n    const packageJson = require(\"../package.json\") as { version: string };\n    window.lli = {\n        eventsBank: [],\n        vitalQueue: new Set(),\n        startTime: now,\n        currentUrl: `${location.pathname}${location.search}`,\n        currentRef: document.referrer,\n        timeOnPage: now,\n        sessionId: guid(),\n        pageId: guid(),\n        intervals: [],\n        sdkVersion: packageJson.version,\n    };\n    const logger = Logger(window.llc.debug);\n    logger.log(\"start recording...\", window.llc);\n\n    //Set environment\n    if (window.llc.env === \"auto\") {\n        const env = detectEnvironment();\n        window.llc.env = env;\n    }\n\n    //Auto Tracker\n    if (window.llc.autoTrack) {\n        window.addEventListener(\"click\", clickHandler);\n        //TODO: Add more auto trackers for d/t events\n    }\n\n    //vitals\n    if (window.llc.webVitals) {\n        recordWebVitals();\n        const eventsInterval = setInterval(() => {\n            flushVitalQueue();\n        }, window.llc.postInterval * 1000);\n        addInterval(eventsInterval);\n        sessionEndHandler(flushVitalQueue);\n    }\n\n    //Custom events\n    if (window.llc.customEvents) {\n        const eventsInterval = setInterval(() => {\n            sendEvents();\n        }, window.llc.postInterval * 1000);\n        addInterval(eventsInterval);\n        sessionEndHandler(sendEvents);\n    }\n\n    //page views\n    if (window.llc.pageAnalytics) {\n        //Navigation Handler\n        history.pushState = hook(history, \"pushState\", navigationHandler);\n        history.replaceState = hook(history, \"replaceState\", navigationHandler);\n        const currentRef = window.lli.currentRef;\n        const currentUrl = window.lli.currentUrl;\n        sessionEndHandler(() => sendPageView(currentRef, currentUrl));\n    }\n}\n\nexport const navigationHandler = (_: string, __: string, url: string) => {\n    if (!url) return;\n    const currentRef = window.lli.currentRef;\n    const currentUrl = window.lli.currentUrl;\n    window.lli.currentRef = window.lli.currentUrl;\n    window.lli.currentUrl = getPath(url.toString());\n    if (currentUrl !== currentRef) {\n        sendPageView(currentUrl, currentRef);\n        sendEvents();\n        window.lli.pageId = guid();\n        window.lli.timeOnPage = Date.now();\n    }\n};\n\nconst sessionEndHandler = async (fn: () => void) => {\n    document.onvisibilitychange = () => {\n        if (document.visibilityState === \"hidden\") {\n            fn();\n            sendEvents();\n            clearIntervals();\n        } else {\n            //there should be already a config\n            if (window.llc) {\n                record(window.llc);\n            }\n        }\n    };\n};\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { sendVisitor } from \"./server\";\nimport { getSessionDuration, getUrlParams, guid, q } from \"./utils/util\";\n\nexport const track = (name: string, payload: Record<string, any> = {}) => {\n    const event = {\n        id: guid(),\n        eventName: name,\n        eventType: \"manual\",\n        payload,\n        page: window.location.pathname,\n        referrerPath: window.lli.currentUrl,\n        referrerDomain: window.lli.currentRef,\n        duration: getSessionDuration(),\n        pageId: window.lli.pageId,\n        queryParams: getUrlParams(),\n    };\n    window.llc.customEvents && q(event);\n};\n\nexport const identify = (payload: Record<string, string>) => {\n    window.llc.consent === \"granted\" && sendVisitor(payload);\n};\n\nexport const setConsent = (concent: \"granted\" | \"denied\") => {\n    window.llc.consent = concent;\n    sendVisitor({ concent });\n};\n","import { record } from \"./record\";\nimport { identify, setConsent, track } from \"./methods\";\n\nexport const loglib = {\n    record: record,\n    track: track,\n    identify: identify,\n    setConsent,\n};\n"],"mappings":"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","names":[]}