@syntropysoft/syntropyfront
Version:
đ Observability library with automatic capture - Just 1 line of code! Automatically captures clicks, errors, HTTP calls, and console logs with flexible error handling.
1 lines âą 22.4 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/core/breadcrumbs/BreadcrumbManager.js","../src/core/utils/ErrorManager.js","../src/core/utils/Logger.js","../src/index.js"],"sourcesContent":["/**\n * BreadcrumbManager - Gestiona breadcrumbs\n * Responsabilidad Ășnica: Almacenar y gestionar breadcrumbs\n */\nexport class BreadcrumbManager {\n constructor() {\n this.breadcrumbs = [];\n }\n\n add(category, message, data = {}) {\n const breadcrumb = {\n category,\n message,\n data,\n timestamp: new Date().toISOString()\n };\n \n this.breadcrumbs.push(breadcrumb);\n return breadcrumb;\n }\n\n getAll() {\n return this.breadcrumbs;\n }\n\n clear() {\n this.breadcrumbs = [];\n }\n\n getCount() {\n return this.breadcrumbs.length;\n }\n} ","/**\n * ErrorManager - Gestiona errores\n * Responsabilidad Ășnica: Formatear y gestionar errores\n */\nexport class ErrorManager {\n constructor() {\n this.errors = [];\n }\n\n send(error, context = {}) {\n const errorData = {\n message: error.message,\n stack: error.stack,\n context,\n timestamp: new Date().toISOString()\n };\n \n this.errors.push(errorData);\n return errorData;\n }\n\n getAll() {\n return this.errors;\n }\n\n clear() {\n this.errors = [];\n }\n\n getCount() {\n return this.errors.length;\n }\n} ","/**\n * Logger - Hace logging solo en errores\n * Responsabilidad Ășnica: Mostrar mensajes solo cuando hay errores\n */\nexport class Logger {\n constructor() {\n this.isSilent = true; // Por defecto silente\n }\n\n log(message, data = null) {\n // No loggear nada en modo silente\n if (this.isSilent) return;\n \n if (data) {\n console.log(message, data);\n } else {\n console.log(message);\n }\n }\n\n error(message, data = null) {\n // SIEMPRE loggear errores (ignora modo silencioso)\n if (data) {\n console.error(message, data);\n } else {\n console.error(message);\n }\n }\n\n warn(message, data = null) {\n // Solo warnings importantes\n if (data) {\n console.warn(message, data);\n } else {\n console.warn(message);\n }\n }\n\n // MĂ©todo para activar logging (solo para debug)\n enableLogging() {\n this.isSilent = false;\n }\n\n // MĂ©todo para desactivar logging\n disableLogging() {\n this.isSilent = true;\n }\n} ","/**\n * Copyright 2024 Syntropysoft\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * SyntropyFront - Observability library with automatic capture\n * Single responsibility: Automatically capture events and send errors with context\n */\nimport { BreadcrumbManager } from './core/breadcrumbs/BreadcrumbManager.js';\nimport { ErrorManager } from './core/utils/ErrorManager.js';\nimport { Logger } from './core/utils/Logger.js';\n\nclass SyntropyFront {\n constructor() {\n // Basic managers\n this.breadcrumbManager = new BreadcrumbManager();\n this.errorManager = new ErrorManager();\n this.logger = new Logger();\n \n // Default configuration\n this.maxEvents = 50;\n this.fetchConfig = null; // Complete fetch configuration\n this.onErrorCallback = null; // User-defined error handler\n this.isActive = false;\n \n // Automatic capture\n this.originalHandlers = {};\n \n // Auto-initialize\n this.init();\n }\n\n init() {\n this.isActive = true;\n \n // Configure automatic capture immediately\n this.setupAutomaticCapture();\n \n console.log('đ SyntropyFront: Initialized with automatic capture');\n }\n\n /**\n * Configure SyntropyFront\n * @param {Object} config - Configuration\n * @param {number} config.maxEvents - Maximum number of events to store\n * @param {Object} config.fetch - Complete fetch configuration\n * @param {string} config.fetch.url - Endpoint URL\n * @param {Object} config.fetch.options - Fetch options (headers, method, etc.)\n * @param {Function} config.onError - User-defined error handler callback\n */\n configure(config = {}) {\n this.maxEvents = config.maxEvents || this.maxEvents;\n this.fetchConfig = config.fetch;\n this.onErrorCallback = config.onError;\n \n if (this.onErrorCallback) {\n console.log(`â
SyntropyFront: Configured - maxEvents: ${this.maxEvents}, custom error handler`);\n } else if (this.fetchConfig) {\n console.log(`â
SyntropyFront: Configured - maxEvents: ${this.maxEvents}, endpoint: ${this.fetchConfig.url}`);\n } else {\n console.log(`â
SyntropyFront: Configured - maxEvents: ${this.maxEvents}, console only`);\n }\n }\n\n /**\n * Configure automatic event capture\n */\n setupAutomaticCapture() {\n if (typeof window === 'undefined') return;\n\n // Capture clicks\n this.setupClickCapture();\n \n // Capture errors\n this.setupErrorCapture();\n \n // Capture HTTP calls\n this.setupHttpCapture();\n \n // Capture console logs\n this.setupConsoleCapture();\n }\n\n /**\n * Capture user clicks\n */\n setupClickCapture() {\n const clickHandler = (event) => {\n const element = event.target;\n this.addBreadcrumb('user', 'click', {\n element: element.tagName,\n id: element.id,\n className: element.className,\n x: event.clientX,\n y: event.clientY\n });\n };\n\n document.addEventListener('click', clickHandler);\n }\n\n /**\n * Automatically capture errors\n */\n setupErrorCapture() {\n // Save original handlers\n this.originalHandlers.onerror = window.onerror;\n this.originalHandlers.onunhandledrejection = window.onunhandledrejection;\n\n // Intercept errors\n window.onerror = (message, source, lineno, colno, error) => {\n const errorPayload = {\n type: 'uncaught_exception',\n error: { message, source, lineno, colno, stack: error?.stack },\n breadcrumbs: this.getBreadcrumbs(),\n timestamp: new Date().toISOString()\n };\n\n this.handleError(errorPayload);\n \n // Call original handler\n if (this.originalHandlers.onerror) {\n return this.originalHandlers.onerror(message, source, lineno, colno, error);\n }\n \n return false;\n };\n\n // Intercept rejected promises\n window.onunhandledrejection = (event) => {\n const errorPayload = {\n type: 'unhandled_rejection',\n error: {\n message: event.reason?.message || 'Promise rejection without message',\n stack: event.reason?.stack,\n },\n breadcrumbs: this.getBreadcrumbs(),\n timestamp: new Date().toISOString()\n };\n\n this.handleError(errorPayload);\n \n // Call original handler\n if (this.originalHandlers.onunhandledrejection) {\n this.originalHandlers.onunhandledrejection(event);\n }\n };\n }\n\n /**\n * Capture HTTP calls\n */\n setupHttpCapture() {\n // Intercept fetch\n const originalFetch = window.fetch;\n window.fetch = (...args) => {\n const [url, options] = args;\n \n this.addBreadcrumb('http', 'fetch', {\n url,\n method: options?.method || 'GET'\n });\n\n return originalFetch(...args).then(response => {\n this.addBreadcrumb('http', 'fetch_response', {\n url,\n status: response.status\n });\n return response;\n }).catch(error => {\n this.addBreadcrumb('http', 'fetch_error', {\n url,\n error: error.message\n });\n throw error;\n });\n };\n }\n\n /**\n * Capture console logs\n */\n setupConsoleCapture() {\n const originalLog = console.log;\n const originalError = console.error;\n const originalWarn = console.warn;\n\n console.log = (...args) => {\n this.addBreadcrumb('console', 'log', { message: args.join(' ') });\n originalLog.apply(console, args);\n };\n\n console.error = (...args) => {\n this.addBreadcrumb('console', 'error', { message: args.join(' ') });\n originalError.apply(console, args);\n };\n\n console.warn = (...args) => {\n this.addBreadcrumb('console', 'warn', { message: args.join(' ') });\n originalWarn.apply(console, args);\n };\n }\n\n /**\n * Handle errors - priority: onError callback > fetch > console\n */\n handleError(errorPayload) {\n // Default log\n this.logger.error('â Error:', errorPayload);\n \n // Priority 1: User-defined callback (maximum flexibility)\n if (this.onErrorCallback) {\n try {\n this.onErrorCallback(errorPayload);\n } catch (callbackError) {\n console.warn('SyntropyFront: Error in user callback:', callbackError);\n }\n return;\n }\n \n // Priority 2: Fetch to endpoint\n if (this.fetchConfig) {\n this.postToEndpoint(errorPayload);\n return;\n }\n \n // Priority 3: Console only (default)\n // Already logged above\n }\n\n /**\n * Post error object using fetch configuration\n */\n postToEndpoint(errorPayload) {\n const { url, options = {} } = this.fetchConfig;\n \n // Default configuration\n const defaultOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n },\n body: JSON.stringify(errorPayload),\n ...options\n };\n\n fetch(url, defaultOptions).catch(error => {\n console.warn('SyntropyFront: Error posting to endpoint:', error);\n });\n }\n\n // Public API\n addBreadcrumb(category, message, data = {}) {\n if (!this.isActive) return;\n \n const breadcrumb = this.breadcrumbManager.add(category, message, data);\n \n // Keep only the last maxEvents\n const breadcrumbs = this.breadcrumbManager.getAll();\n if (breadcrumbs.length > this.maxEvents) {\n this.breadcrumbManager.clear();\n breadcrumbs.slice(-this.maxEvents).forEach(b => this.breadcrumbManager.add(b.category, b.message, b.data));\n }\n \n return breadcrumb;\n }\n\n getBreadcrumbs() {\n return this.breadcrumbManager.getAll();\n }\n\n clearBreadcrumbs() {\n this.breadcrumbManager.clear();\n }\n\n sendError(error, context = {}) {\n if (!this.isActive) return;\n \n const errorData = this.errorManager.send(error, context);\n const errorPayload = {\n ...errorData,\n breadcrumbs: this.getBreadcrumbs(),\n timestamp: new Date().toISOString()\n };\n \n this.handleError(errorPayload);\n return errorData;\n }\n\n getErrors() {\n return this.errorManager.getAll();\n }\n\n clearErrors() {\n this.errorManager.clear();\n }\n\n // Utility methods\n getStats() {\n return {\n breadcrumbs: this.breadcrumbManager.getCount(),\n errors: this.errorManager.getCount(),\n isActive: this.isActive,\n maxEvents: this.maxEvents,\n hasFetchConfig: !!this.fetchConfig,\n hasErrorCallback: !!this.onErrorCallback,\n endpoint: this.fetchConfig?.url || 'console'\n };\n }\n}\n\n// Single instance - auto-initializes\nconst syntropyFront = new SyntropyFront();\n\n// Export the instance\nexport default syntropyFront; "],"names":[],"mappings":"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"}