@syntropysoft/syntropyfront 0.2.0 → 0.2.3

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/README.md CHANGED
@@ -1,4 +1,24 @@
1
- # SyntropyFront
1
+ <p align="center">
2
+ <img src="./assets/syntropysoft-logo.png" alt="SyntropySoft Logo" width="170"/>
3
+ </p>
4
+
5
+ <h1 align="center">SyntropyFront</h1>
6
+
7
+ <p align="center">
8
+ <strong>From Chaos to Clarity</strong>
9
+ <br />
10
+ The Observability Library for High-Performance Teams
11
+ </p>
12
+
13
+ <p align="center">
14
+ <a href="https://www.npmjs.com/package/@syntropysoft/syntropyfront"><img src="https://img.shields.io/npm/v/@syntropysoft/syntropyfront.svg" alt="NPM Version"></a>
15
+ <a href="https://github.com/Syntropysoft/SyntropyLog/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@syntropysoft/syntropyfront.svg" alt="License"></a>
16
+ <a href="#"><img src="https://img.shields.io/badge/status-ready%20for%20production-brightgreen.svg" alt="Ready for Production"></a>
17
+ <a href="#"><img src="https://github.com/Syntropysoft/syntropyfront/workflows/CodeQL/badge.svg" alt="CodeQL"></a>
18
+ <a href="#"><img src="https://img.shields.io/badge/dependabot-enabled-brightgreen.svg" alt="Dependabot"></a>
19
+ </p>
20
+
21
+ ---
2
22
 
3
23
  🚀 **Observability library with automatic capture - Just 1 line of code!**
4
24
 
@@ -19,14 +39,14 @@ SyntropyFront automatically captures user interactions, errors, HTTP calls, and
19
39
  ### Basic Usage (1 line of code!)
20
40
 
21
41
  ```javascript
22
- import syntropyFront from 'syntropyfront';
42
+ import syntropyFront from '@syntropysoft/syntropyfront';
23
43
  // That's it! Auto-initializes and captures everything automatically
24
44
  ```
25
45
 
26
46
  ### With Custom Configuration
27
47
 
28
48
  ```javascript
29
- import syntropyFront from 'syntropyfront';
49
+ import syntropyFront from '@syntropysoft/syntropyfront';
30
50
 
31
51
  // Option 1: Console only (default)
32
52
  syntropyFront.configure({
@@ -75,7 +95,9 @@ syntropyFront.configure({
75
95
  ## 📦 Installation
76
96
 
77
97
  ```bash
78
- npm install syntropyfront
98
+ npm install @syntropysoft/syntropyfront
99
+ ```
100
+
79
101
  ## 🎯 How It Works
80
102
 
81
103
  SyntropyFront automatically:
@@ -222,7 +244,7 @@ SyntropyFront captures the essentials by default, but you can extend it to captu
222
244
  ### Adding Custom Event Capture
223
245
 
224
246
  ```javascript
225
- import syntropyFront from 'syntropyfront';
247
+ import syntropyFront from '@syntropysoft/syntropyfront';
226
248
 
227
249
  // Add scroll tracking
228
250
  window.addEventListener('scroll', () => {
@@ -299,7 +321,7 @@ SyntropyFront works with any JavaScript framework:
299
321
 
300
322
  ```jsx
301
323
  import React from 'react';
302
- import syntropyFront from 'syntropyfront';
324
+ import syntropyFront from '@syntropysoft/syntropyfront';
303
325
 
304
326
  function App() {
305
327
  // SyntropyFront auto-initializes on import
@@ -321,7 +343,7 @@ function App() {
321
343
  </template>
322
344
 
323
345
  <script>
324
- import syntropyFront from 'syntropyfront';
346
+ import syntropyFront from '@syntropysoft/syntropyfront';
325
347
 
326
348
  export default {
327
349
  methods: {
@@ -336,7 +358,7 @@ export default {
336
358
  ### Manual Error Reporting
337
359
 
338
360
  ```javascript
339
- import syntropyFront from 'syntropyfront';
361
+ import syntropyFront from '@syntropysoft/syntropyfront';
340
362
 
341
363
  try {
342
364
  // Your code here
@@ -352,7 +374,7 @@ syntropyFront.sendError(new Error('Something went wrong'));
352
374
  ### Extending with Custom Events
353
375
 
354
376
  ```javascript
355
- import syntropyFront from 'syntropyfront';
377
+ import syntropyFront from '@syntropysoft/syntropyfront';
356
378
 
357
379
  // Add your custom event listeners
358
380
  window.addEventListener('scroll', () => {
@@ -399,4 +421,4 @@ Contributions are welcome! Please feel free to submit a Pull Request.
399
421
 
400
422
  ---
401
423
 
402
- **Made with ❤️ for better web observability**
424
+ **Made with ❤️ for better web observability**
package/dist/index.cjs CHANGED
@@ -271,19 +271,19 @@ class SyntropyFront {
271
271
  const [url, options] = args;
272
272
 
273
273
  this.addBreadcrumb('http', 'fetch', {
274
- url: url,
274
+ url,
275
275
  method: options?.method || 'GET'
276
276
  });
277
277
 
278
278
  return originalFetch(...args).then(response => {
279
279
  this.addBreadcrumb('http', 'fetch_response', {
280
- url: url,
280
+ url,
281
281
  status: response.status
282
282
  });
283
283
  return response;
284
284
  }).catch(error => {
285
285
  this.addBreadcrumb('http', 'fetch_error', {
286
- url: url,
286
+ url,
287
287
  error: error.message
288
288
  });
289
289
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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: url,\n method: options?.method || 'GET'\n });\n\n return originalFetch(...args).then(response => {\n this.addBreadcrumb('http', 'fetch_response', {\n url: url,\n status: response.status\n });\n return response;\n }).catch(error => {\n this.addBreadcrumb('http', 'fetch_error', {\n url: 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.cjs","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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"}
package/dist/index.js CHANGED
@@ -267,19 +267,19 @@ class SyntropyFront {
267
267
  const [url, options] = args;
268
268
 
269
269
  this.addBreadcrumb('http', 'fetch', {
270
- url: url,
270
+ url,
271
271
  method: options?.method || 'GET'
272
272
  });
273
273
 
274
274
  return originalFetch(...args).then(response => {
275
275
  this.addBreadcrumb('http', 'fetch_response', {
276
- url: url,
276
+ url,
277
277
  status: response.status
278
278
  });
279
279
  return response;
280
280
  }).catch(error => {
281
281
  this.addBreadcrumb('http', 'fetch_error', {
282
- url: url,
282
+ url,
283
283
  error: error.message
284
284
  });
285
285
  throw error;
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: url,\n method: options?.method || 'GET'\n });\n\n return originalFetch(...args).then(response => {\n this.addBreadcrumb('http', 'fetch_response', {\n url: url,\n status: response.status\n });\n return response;\n }).catch(error => {\n this.addBreadcrumb('http', 'fetch_error', {\n url: 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/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 +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: url,\n method: options?.method || 'GET'\n });\n\n return originalFetch(...args).then(response => {\n this.addBreadcrumb('http', 'fetch_response', {\n url: url,\n status: response.status\n });\n return response;\n }).catch(error => {\n this.addBreadcrumb('http', 'fetch_error', {\n url: 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":"0CAIO,MAAMA,EACT,WAAAC,GACIC,KAAKC,YAAc,EACtB,CAED,GAAAC,CAAIC,EAAUC,EAASC,EAAO,CAAA,GAC1B,MAAMC,EAAa,CACfH,WACAC,UACAC,OACAE,WAAW,IAAIC,MAAOC,eAI1B,OADAT,KAAKC,YAAYS,KAAKJ,GACfA,CACV,CAED,MAAAK,GACI,OAAOX,KAAKC,WACf,CAED,KAAAW,GACIZ,KAAKC,YAAc,EACtB,CAED,QAAAY,GACI,OAAOb,KAAKC,YAAYa,MAC3B,EC3BE,MAAMC,EACT,WAAAhB,GACIC,KAAKgB,OAAS,EACjB,CAED,IAAAC,CAAKC,EAAOC,EAAU,IAClB,MAAMC,EAAY,CACdhB,QAASc,EAAMd,QACfiB,MAAOH,EAAMG,MACbF,UACAZ,WAAW,IAAIC,MAAOC,eAI1B,OADAT,KAAKgB,OAAON,KAAKU,GACVA,CACV,CAED,MAAAT,GACI,OAAOX,KAAKgB,MACf,CAED,KAAAJ,GACIZ,KAAKgB,OAAS,EACjB,CAED,QAAAH,GACI,OAAOb,KAAKgB,OAAOF,MACtB,EC3BE,MAAMQ,EACT,WAAAvB,GACIC,KAAKuB,UAAW,CACnB,CAED,GAAAC,CAAIpB,EAASC,EAAO,MAEZL,KAAKuB,WAELlB,EACAoB,QAAQD,IAAIpB,EAASC,GAErBoB,QAAQD,IAAIpB,GAEnB,CAED,KAAAc,CAAMd,EAASC,EAAO,MAEdA,EACAoB,QAAQP,MAAMd,EAASC,GAEvBoB,QAAQP,MAAMd,EAErB,CAED,IAAAsB,CAAKtB,EAASC,EAAO,MAEbA,EACAoB,QAAQC,KAAKtB,EAASC,GAEtBoB,QAAQC,KAAKtB,EAEpB,CAGD,aAAAuB,GACI3B,KAAKuB,UAAW,CACnB,CAGD,cAAAK,GACI5B,KAAKuB,UAAW,CACnB,SCuQiB,IA7StB,MACI,WAAAxB,GAEIC,KAAK6B,kBAAoB,IAAI/B,EAC7BE,KAAK8B,aAAe,IAAIf,EACxBf,KAAK+B,OAAS,IAAIT,EAGlBtB,KAAKgC,UAAY,GACjBhC,KAAKiC,YAAc,KACnBjC,KAAKkC,gBAAkB,KACvBlC,KAAKmC,UAAW,EAGhBnC,KAAKoC,iBAAmB,GAGxBpC,KAAKqC,MACR,CAED,IAAAA,GACIrC,KAAKmC,UAAW,EAGhBnC,KAAKsC,wBAELb,QAAQD,IAAI,uDACf,CAWD,SAAAe,CAAUC,EAAS,IACfxC,KAAKgC,UAAYQ,EAAOR,WAAahC,KAAKgC,UAC1ChC,KAAKiC,YAAcO,EAAOC,MAC1BzC,KAAKkC,gBAAkBM,EAAOE,QAE1B1C,KAAKkC,gBACLT,QAAQD,IAAI,4CAA4CxB,KAAKgC,mCACtDhC,KAAKiC,YACZR,QAAQD,IAAI,4CAA4CxB,KAAKgC,wBAAwBhC,KAAKiC,YAAYU,OAEtGlB,QAAQD,IAAI,4CAA4CxB,KAAKgC,0BAEpE,CAKD,qBAAAM,GAC0B,oBAAXM,SAGX5C,KAAK6C,oBAGL7C,KAAK8C,oBAGL9C,KAAK+C,mBAGL/C,KAAKgD,sBACR,CAKD,iBAAAH,GAYII,SAASC,iBAAiB,QAXJC,IAClB,MAAMC,EAAUD,EAAME,OACtBrD,KAAKsD,cAAc,OAAQ,QAAS,CAChCF,QAASA,EAAQG,QACjBC,GAAIJ,EAAQI,GACZC,UAAWL,EAAQK,UACnBC,EAAGP,EAAMQ,QACTC,EAAGT,EAAMU,WAKpB,CAKD,iBAAAf,GAEI9C,KAAKoC,iBAAiB0B,QAAUlB,OAAOkB,QACvC9D,KAAKoC,iBAAiB2B,qBAAuBnB,OAAOmB,qBAGpDnB,OAAOkB,QAAU,CAAC1D,EAAS4D,EAAQC,EAAQC,EAAOhD,KAC9C,MAAMiD,EAAe,CACjBC,KAAM,qBACNlD,MAAO,CAAEd,UAAS4D,SAAQC,SAAQC,QAAO7C,MAAOH,GAAOG,OACvDpB,YAAaD,KAAKqE,iBAClB9D,WAAW,IAAIC,MAAOC,eAM1B,OAHAT,KAAKsE,YAAYH,KAGbnE,KAAKoC,iBAAiB0B,SACf9D,KAAKoC,iBAAiB0B,QAAQ1D,EAAS4D,EAAQC,EAAQC,EAAOhD,IAO7E0B,OAAOmB,qBAAwBZ,IAC3B,MAAMgB,EAAe,CACjBC,KAAM,sBACNlD,MAAO,CACHd,QAAS+C,EAAMoB,QAAQnE,SAAW,oCAClCiB,MAAO8B,EAAMoB,QAAQlD,OAEzBpB,YAAaD,KAAKqE,iBAClB9D,WAAW,IAAIC,MAAOC,eAG1BT,KAAKsE,YAAYH,GAGbnE,KAAKoC,iBAAiB2B,sBACtB/D,KAAKoC,iBAAiB2B,qBAAqBZ,GAGtD,CAKD,gBAAAJ,GAEI,MAAMyB,EAAgB5B,OAAOH,MAC7BG,OAAOH,MAAQ,IAAIgC,KACf,MAAO9B,EAAK+B,GAAWD,EAOvB,OALAzE,KAAKsD,cAAc,OAAQ,QAAS,CAChCX,IAAKA,EACLgC,OAAQD,GAASC,QAAU,QAGxBH,KAAiBC,GAAMG,KAAKC,IAC/B7E,KAAKsD,cAAc,OAAQ,iBAAkB,CACzCX,IAAKA,EACLmC,OAAQD,EAASC,SAEdD,IACRE,MAAM7D,IAKL,MAJAlB,KAAKsD,cAAc,OAAQ,cAAe,CACtCX,IAAKA,EACLzB,MAAOA,EAAMd,UAEXc,IAGjB,CAKD,mBAAA8B,GACI,MAAMgC,EAAcvD,QAAQD,IACtByD,EAAgBxD,QAAQP,MACxBgE,EAAezD,QAAQC,KAE7BD,QAAQD,IAAM,IAAIiD,KACdzE,KAAKsD,cAAc,UAAW,MAAO,CAAElD,QAASqE,EAAKU,KAAK,OAC1DH,EAAYI,MAAM3D,QAASgD,IAG/BhD,QAAQP,MAAQ,IAAIuD,KAChBzE,KAAKsD,cAAc,UAAW,QAAS,CAAElD,QAASqE,EAAKU,KAAK,OAC5DF,EAAcG,MAAM3D,QAASgD,IAGjChD,QAAQC,KAAO,IAAI+C,KACfzE,KAAKsD,cAAc,UAAW,OAAQ,CAAElD,QAASqE,EAAKU,KAAK,OAC3DD,EAAaE,MAAM3D,QAASgD,GAEnC,CAKD,WAAAH,CAAYH,GAKR,GAHAnE,KAAK+B,OAAOb,MAAM,WAAYiD,GAG1BnE,KAAKkC,gBACL,IACIlC,KAAKkC,gBAAgBiC,EACxB,CAAC,MAAOkB,GACL5D,QAAQC,KAAK,yCAA0C2D,EAC1D,MAKDrF,KAAKiC,aACLjC,KAAKsF,eAAenB,EAM3B,CAKD,cAAAmB,CAAenB,GACX,MAAMxB,IAAEA,EAAG+B,QAAEA,EAAU,CAAE,GAAK1E,KAAKiC,YAG7BsD,EAAiB,CACnBZ,OAAQ,OACRa,QAAS,CACL,eAAgB,sBACbd,EAAQc,SAEfC,KAAMC,KAAKC,UAAUxB,MAClBO,GAGPjC,MAAME,EAAK4C,GAAgBR,MAAM7D,IAC7BO,QAAQC,KAAK,4CAA6CR,IAEjE,CAGD,aAAAoC,CAAcnD,EAAUC,EAASC,EAAO,CAAA,GACpC,IAAKL,KAAKmC,SAAU,OAEpB,MAAM7B,EAAaN,KAAK6B,kBAAkB3B,IAAIC,EAAUC,EAASC,GAG3DJ,EAAcD,KAAK6B,kBAAkBlB,SAM3C,OALIV,EAAYa,OAASd,KAAKgC,YAC1BhC,KAAK6B,kBAAkBjB,QACvBX,EAAY2F,OAAO5F,KAAKgC,WAAW6D,QAAQC,GAAK9F,KAAK6B,kBAAkB3B,IAAI4F,EAAE3F,SAAU2F,EAAE1F,QAAS0F,EAAEzF,QAGjGC,CACV,CAED,cAAA+D,GACI,OAAOrE,KAAK6B,kBAAkBlB,QACjC,CAED,gBAAAoF,GACI/F,KAAK6B,kBAAkBjB,OAC1B,CAED,SAAAoF,CAAU9E,EAAOC,EAAU,IACvB,IAAKnB,KAAKmC,SAAU,OAEpB,MAAMf,EAAYpB,KAAK8B,aAAab,KAAKC,EAAOC,GAC1CgD,EAAe,IACd/C,EACHnB,YAAaD,KAAKqE,iBAClB9D,WAAW,IAAIC,MAAOC,eAI1B,OADAT,KAAKsE,YAAYH,GACV/C,CACV,CAED,SAAA6E,GACI,OAAOjG,KAAK8B,aAAanB,QAC5B,CAED,WAAAuF,GACIlG,KAAK8B,aAAalB,OACrB,CAGD,QAAAuF,GACI,MAAO,CACHlG,YAAaD,KAAK6B,kBAAkBhB,WACpCG,OAAQhB,KAAK8B,aAAajB,WAC1BsB,SAAUnC,KAAKmC,SACfH,UAAWhC,KAAKgC,UAChBoE,iBAAkBpG,KAAKiC,YACvBoE,mBAAoBrG,KAAKkC,gBACzBoE,SAAUtG,KAAKiC,aAAaU,KAAO,UAE1C"}
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syntropysoft/syntropyfront",
3
- "version": "0.2.0",
3
+ "version": "0.2.3",
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",
@@ -59,7 +59,7 @@
59
59
  },
60
60
  "homepage": "https://github.com/Syntropysoft/syntropyfront#readme",
61
61
  "engines": {
62
- "node": ">=14.0.0"
62
+ "node": ">=18.0.0"
63
63
  },
64
64
  "dependencies": {
65
65
  "flatted": "^3.3.3"
@@ -68,11 +68,11 @@
68
68
  "@rollup/plugin-commonjs": "^25.0.0",
69
69
  "@rollup/plugin-node-resolve": "^15.0.0",
70
70
  "@rollup/plugin-terser": "^0.4.0",
71
- "@vitest/coverage-v8": "^0.34.6",
71
+ "@vitest/coverage-v8": "^3.2.4",
72
72
  "eslint": "^8.0.0",
73
73
  "jsdom": "^26.1.0",
74
74
  "rollup": "^3.0.0",
75
- "vitest": "^0.34.0"
75
+ "vitest": "^3.2.4"
76
76
  },
77
77
  "browserslist": [
78
78
  "> 1%",