{"version":3,"file":"pino-logger-client.cjs","sources":["../../common/types.ts","../src/console-logger.ts","../src/serializer.ts","../src/index.ts"],"sourcesContent":["export enum LogVerbosity {\n    Info = 'INFO',\n    Warn = 'WARN',\n    Error = 'ERROR',\n    Success = 'SUCCESS',\n}\nexport enum LogStyle {\n    Info = '\\x1b[38;2;255;255;255;48;2;92;147;156;1m ',\n    Warn = '\\x1b[38;2;255;255;255;48;2;247;171;105;1m ',\n    Error = '\\x1b[38;2;255;255;255;48;2;238;91;96;1m ',\n    Success = '\\x1b[38;2;255;255;255;48;2;41;159;111;1m ',\n    // NOTE: \\x1b makes everything look good in color supporting terminals as well\n}\n\nexport interface LogMessage {\n    message: string\n    localTime: Date\n    windowCleaned?: string\n}\n","import { LogMessage, LogStyle, LogVerbosity } from '../../common/types'\n\nconst log = (\n    verbosity: LogVerbosity,\n    selectedLogStyle: LogStyle,\n    loggerName: string,\n    message: LogMessage\n): void => {\n    const date = () => new Date().toLocaleTimeString()\n    const messageDate = `\\n${date()}`\n\n    const separator = '\\x1b[0m'\n    const consoledOutput = `${selectedLogStyle}${loggerName} > ${verbosity}: ${separator} `\n\n    switch (verbosity) {\n        case LogVerbosity.Warn:\n            console.warn(consoledOutput, message.message, messageDate)\n            break\n        case LogVerbosity.Error:\n            console.error(consoledOutput, message.message, messageDate)\n            break\n        case LogVerbosity.Info:\n        case LogVerbosity.Success:\n        default:\n            console.log(consoledOutput, message.message, messageDate)\n    }\n}\n\nconst logger = {\n    info: (message: LogMessage, loggerName: string) => {\n        log(LogVerbosity.Info, LogStyle.Info, loggerName, message)\n    },\n    warn: (message: LogMessage, loggerName: string) => {\n        log(LogVerbosity.Warn, LogStyle.Warn, loggerName, message)\n    },\n    error: (message: LogMessage, loggerName: string) => {\n        log(LogVerbosity.Error, LogStyle.Error, loggerName, message)\n    },\n    success: (message: LogMessage, loggerName: string) => {\n        log(LogVerbosity.Success, LogStyle.Success, loggerName, message)\n    },\n}\nexport default logger\n","import { LogMessage } from '../../common/types'\n\n// NOTE: Inspiration from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value\nexport const getCircularReplacer = () => {\n    const seen = new WeakSet()\n    return (key: any, value: any) => {\n        if (typeof value === 'object' && value !== null) {\n            if (seen.has(value)) {\n                return\n            }\n            seen.add(value)\n        }\n        return value\n    }\n}\n\nconst messageSerializer = (message: any): LogMessage => {\n    let payload = {\n        localTime: new Date(),\n        message: '',\n        windowCleaned: '',\n    }\n    try {\n        payload.message =\n            typeof message === 'string'\n                ? message\n                : JSON.stringify(message, getCircularReplacer(), '\\t')\n    } catch (e) {\n        payload.message = 'Error while generating log message'\n    }\n\n    try {\n        // NOTE: Getting the window in a iframe will cause a same-origin policy error.\n        //  Attach the window object only when available.\n        payload.windowCleaned = JSON.stringify(window, getCircularReplacer())\n    } catch (e) {\n        payload.windowCleaned = 'Error while generating window log'\n    }\n\n    return payload\n}\n\nexport default messageSerializer\n","import logger from './console-logger'\nimport { LogMessage, LogVerbosity } from '../../common/types'\nimport messageSerializer from './serializer'\n\nclass Logger {\n    localName = 'Logger'\n    apiUrl: string | false = 'http://localhost:3000'\n    unhandledListener: any\n    errorListener: any\n\n    constructor(apiUrl: string | false, loggerName?: string) {\n        this.apiUrl = apiUrl\n        this.localName = loggerName!\n\n        window.addEventListener(\n            'unhandledrejection',\n            (e) => this.registeredUnhandledErrors(e, this.localName),\n            false\n        )\n        this.registerWindowError()\n    }\n\n    public info(message: string) {\n        const serializedMessage = messageSerializer(message)\n        this.apiCall(LogVerbosity.Info, serializedMessage)\n        if ('production' !== process.env.NODE_ENV) {\n            logger.info(serializedMessage, this.localName)\n        }\n    }\n\n    public warn(message: string) {\n        const serializedMessage = messageSerializer(message)\n        this.apiCall(LogVerbosity.Warn, serializedMessage)\n        if ('production' !== process.env.NODE_ENV) {\n            logger.warn(serializedMessage, this.localName)\n        }\n    }\n\n    public error(message: string) {\n        const serializedMessage = messageSerializer(message)\n        this.apiCall(LogVerbosity.Error, serializedMessage)\n        if ('production' !== process.env.NODE_ENV) {\n            logger.error(serializedMessage, this.localName)\n        }\n    }\n\n    public success(message: string) {\n        const serializedMessage = messageSerializer(message)\n        this.apiCall(LogVerbosity.Success, serializedMessage)\n        if ('production' !== process.env.NODE_ENV) {\n            logger.success(serializedMessage, this.localName)\n        }\n    }\n\n    public unregisterListeners() {\n        // FIXME: We're actually not unregistering because of the inline declaration of the function\n        window.removeEventListener(\n            'unhandledrejection',\n            (e) => this.registeredUnhandledErrors(e, this.localName),\n            false\n        )\n        // @ts-ignore\n        window.onerror = undefined\n    }\n\n    private registerWindowError() {\n        // NOTE: Just like Sentry or other crash reporting app, we're going to listen to window.onerror and pass that to the api\n        window.onerror = (message, source, line, col, error) => {\n            const serializedMessage = messageSerializer(\n                `${message}\\n${source}\\n${line}:${col}\\n${error}`\n            )\n            this.apiCall(LogVerbosity.Error, serializedMessage)\n            if ('production' !== process.env.NODE_ENV) {\n                logger.error(serializedMessage, this.localName)\n            }\n\n            // NOTE: 'Eat' the error, in case of breaking error, the app will still stop executing\n            //  per https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event#usage_notes\n            return 'production' !== process.env.NODE_ENV\n            // TODO: What other consequences could have if we eat this error in Production?\n        }\n    }\n\n    private registeredUnhandledErrors(e: any, localName: string) {\n        const serializedMessage = messageSerializer(e.reason)\n        if ('production' === process.env.NODE_ENV) {\n            this.apiCall(LogVerbosity.Error, serializedMessage)\n        } else {\n            logger.error(serializedMessage, localName)\n        }\n    }\n\n    private apiCall(severity: LogVerbosity, message: LogMessage): void {\n        // Example POST method implementation:\n        async function postData(url: string, data = {}) {\n            // Default options are marked with *\n            const response = await fetch(url, {\n                method: 'POST', // *GET, POST, PUT, DELETE, etc.\n                mode: 'no-cors', // no-cors, *cors, same-origin\n                cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n                credentials: 'same-origin', // include, *same-origin, omit\n                headers: {\n                    'Content-Type': 'application/json',\n                    // 'Content-Type': 'application/x-www-form-urlencoded',\n                },\n                redirect: 'follow', // manual, *follow, error\n                referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url\n                body: JSON.stringify(data), // body data type must match \"Content-Type\" header\n            })\n            return response.json() // parses JSON response into native JavaScript objects\n        }\n\n        if (this.apiUrl) {\n            postData(this.apiUrl, { severity, message }).catch((e) => {\n                if ('production' !== process.env.NODE_ENV) {\n                    logger.error(\n                        messageSerializer(\n                            'Loggin API unreachable, investigate network tab'\n                        ),\n                        this.localName\n                    )\n                }\n            })\n        }\n    }\n}\n\nexport default Logger\n"],"names":["LogVerbosity","LogStyle","log","verbosity","selectedLogStyle","loggerName","message","messageDate","consoledOutput","logger","getCircularReplacer","seen","key","value","messageSerializer","payload","Logger","apiUrl","e","serializedMessage","source","line","col","error","localName","severity","postData","url","data"],"mappings":"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"}