@syntropysoft/syntropyfront 0.2.3 → 0.2.4

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/core/BreadcrumbManager.js","../src/core/ErrorManager.js","../src/core/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\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 * SyntropyFront - Observability library with automatic capture\n * Single responsibility: Automatically capture events and send errors with context\n */\nimport { BreadcrumbManager } from './core/BreadcrumbManager.js';\nimport { ErrorManager } from './core/ErrorManager.js';\nimport { Logger } from './core/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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"}
1
+ {"version":3,"file":"index.js","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 * 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.min.js","sources":["../src/core/BreadcrumbManager.js","../src/core/ErrorManager.js","../src/core/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\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 * SyntropyFront - Observability library with automatic capture\n * Single responsibility: Automatically capture events and send errors with context\n */\nimport { BreadcrumbManager } from './core/BreadcrumbManager.js';\nimport { ErrorManager } from './core/ErrorManager.js';\nimport { Logger } from './core/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":["BreadcrumbManager","constructor","this","breadcrumbs","add","category","message","data","breadcrumb","timestamp","Date","toISOString","push","getAll","clear","getCount","length","ErrorManager","errors","send","error","context","errorData","stack","Logger","isSilent","log","console","warn","enableLogging","disableLogging","breadcrumbManager","errorManager","logger","maxEvents","fetchConfig","onErrorCallback","isActive","originalHandlers","init","setupAutomaticCapture","configure","config","fetch","onError","url","window","setupClickCapture","setupErrorCapture","setupHttpCapture","setupConsoleCapture","document","addEventListener","event","element","target","addBreadcrumb","tagName","id","className","x","clientX","y","clientY","onerror","onunhandledrejection","source","lineno","colno","errorPayload","type","getBreadcrumbs","handleError","reason","originalFetch","args","options","method","then","response","status","catch","originalLog","originalError","originalWarn","join","apply","callbackError","postToEndpoint","defaultOptions","headers","body","JSON","stringify","slice","forEach","b","clearBreadcrumbs","sendError","getErrors","clearErrors","getStats","hasFetchConfig","hasErrorCallback","endpoint"],"mappings":"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"}
1
+ {"version":3,"file":"index.min.js","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 * 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":["BreadcrumbManager","constructor","this","breadcrumbs","add","category","message","data","breadcrumb","timestamp","Date","toISOString","push","getAll","clear","getCount","length","ErrorManager","errors","send","error","context","errorData","stack","Logger","isSilent","log","console","warn","enableLogging","disableLogging","breadcrumbManager","errorManager","logger","maxEvents","fetchConfig","onErrorCallback","isActive","originalHandlers","init","setupAutomaticCapture","configure","config","fetch","onError","url","window","setupClickCapture","setupErrorCapture","setupHttpCapture","setupConsoleCapture","document","addEventListener","event","element","target","addBreadcrumb","tagName","id","className","x","clientX","y","clientY","onerror","onunhandledrejection","source","lineno","colno","errorPayload","type","getBreadcrumbs","handleError","reason","originalFetch","args","options","method","then","response","status","catch","originalLog","originalError","originalWarn","join","apply","callbackError","postToEndpoint","defaultOptions","headers","body","JSON","stringify","slice","forEach","b","clearBreadcrumbs","sendError","getErrors","clearErrors","getStats","hasFetchConfig","hasErrorCallback","endpoint"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syntropysoft/syntropyfront",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "type": "module",
5
5
  "description": "🚀 Observability library with automatic capture - Just 1 line of code! Automatically captures clicks, errors, HTTP calls, and console logs with flexible error handling.",
6
6
  "main": "dist/index.js",
@@ -23,13 +23,16 @@
23
23
  "build": "rollup -c",
24
24
  "build:watch": "rollup -c -w",
25
25
  "dev": "npm run build:watch",
26
- "test": "vitest",
27
- "test:watch": "vitest --watch",
28
- "test:coverage": "vitest --coverage",
29
- "prepublishOnly": "npm run build",
26
+ "test": "jest",
27
+ "test:watch": "jest --watch",
28
+ "test:coverage": "jest --config jest.config.coverage.cjs",
29
+ "test:mutation": "stryker run",
30
+ "test:mutation:watch": "stryker run --watch",
31
+ "test:mutation:quick": "stryker run stryker.quick.conf.json",
30
32
  "clean": "rm -rf dist",
31
33
  "lint": "eslint src --ext .js",
32
- "lint:fix": "eslint src --ext .js --fix"
34
+ "lint:fix": "eslint src --ext .js --fix",
35
+ "prepublishOnly": "npm run clean && npm run build && npm test"
33
36
  },
34
37
  "keywords": [
35
38
  "frontend",
@@ -65,14 +68,20 @@
65
68
  "flatted": "^3.3.3"
66
69
  },
67
70
  "devDependencies": {
71
+ "@babel/core": "^7.28.0",
72
+ "@babel/preset-env": "^7.28.0",
73
+ "@jest/globals": "^30.0.5",
68
74
  "@rollup/plugin-commonjs": "^25.0.0",
69
75
  "@rollup/plugin-node-resolve": "^15.0.0",
70
76
  "@rollup/plugin-terser": "^0.4.0",
71
- "@vitest/coverage-v8": "^3.2.4",
77
+ "@stryker-mutator/core": "^8.7.1",
78
+ "@stryker-mutator/jest-runner": "^8.7.1",
79
+ "@stryker-mutator/vitest-runner": "^8.7.1",
80
+ "babel-jest": "^30.0.5",
72
81
  "eslint": "^8.0.0",
73
- "jsdom": "^26.1.0",
74
- "rollup": "^3.0.0",
75
- "vitest": "^3.2.4"
82
+ "jest": "^30.0.5",
83
+ "jest-environment-jsdom": "^30.0.5",
84
+ "rollup": "^3.0.0"
76
85
  },
77
86
  "browserslist": [
78
87
  "> 1%",