@wgtechlabs/log-engine 2.2.2 โ†’ 2.3.0-dev.aafa39c

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.
Files changed (56) hide show
  1. package/README.md +234 -37
  2. package/dist/cjs/formatter/emoji-data.cjs +87 -0
  3. package/dist/cjs/formatter/emoji-data.d.ts +18 -0
  4. package/dist/cjs/formatter/emoji-data.d.ts.map +1 -0
  5. package/dist/cjs/formatter/emoji-data.js.map +1 -0
  6. package/dist/cjs/formatter/emoji-selector.cjs +209 -0
  7. package/dist/cjs/formatter/emoji-selector.d.ts +74 -0
  8. package/dist/cjs/formatter/emoji-selector.d.ts.map +1 -0
  9. package/dist/cjs/formatter/emoji-selector.js.map +1 -0
  10. package/dist/cjs/formatter/index.cjs +6 -1
  11. package/dist/cjs/formatter/index.d.ts +2 -0
  12. package/dist/cjs/formatter/index.d.ts.map +1 -1
  13. package/dist/cjs/formatter/index.js.map +1 -1
  14. package/dist/cjs/formatter/message-formatter.cjs +24 -3
  15. package/dist/cjs/formatter/message-formatter.d.ts +3 -2
  16. package/dist/cjs/formatter/message-formatter.d.ts.map +1 -1
  17. package/dist/cjs/formatter/message-formatter.js.map +1 -1
  18. package/dist/cjs/index.cjs +36 -16
  19. package/dist/cjs/index.d.ts +29 -12
  20. package/dist/cjs/index.d.ts.map +1 -1
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/logger/core.cjs +43 -22
  23. package/dist/cjs/logger/core.d.ts +22 -11
  24. package/dist/cjs/logger/core.d.ts.map +1 -1
  25. package/dist/cjs/logger/core.js.map +1 -1
  26. package/dist/cjs/types/index.d.ts +59 -15
  27. package/dist/cjs/types/index.d.ts.map +1 -1
  28. package/dist/cjs/types/index.js.map +1 -1
  29. package/dist/esm/formatter/emoji-data.d.ts +18 -0
  30. package/dist/esm/formatter/emoji-data.d.ts.map +1 -0
  31. package/dist/esm/formatter/emoji-data.js +84 -0
  32. package/dist/esm/formatter/emoji-data.js.map +1 -0
  33. package/dist/esm/formatter/emoji-selector.d.ts +74 -0
  34. package/dist/esm/formatter/emoji-selector.d.ts.map +1 -0
  35. package/dist/esm/formatter/emoji-selector.js +205 -0
  36. package/dist/esm/formatter/emoji-selector.js.map +1 -0
  37. package/dist/esm/formatter/index.d.ts +2 -0
  38. package/dist/esm/formatter/index.d.ts.map +1 -1
  39. package/dist/esm/formatter/index.js +2 -0
  40. package/dist/esm/formatter/index.js.map +1 -1
  41. package/dist/esm/formatter/message-formatter.d.ts +3 -2
  42. package/dist/esm/formatter/message-formatter.d.ts.map +1 -1
  43. package/dist/esm/formatter/message-formatter.js +24 -3
  44. package/dist/esm/formatter/message-formatter.js.map +1 -1
  45. package/dist/esm/index.d.ts +29 -12
  46. package/dist/esm/index.d.ts.map +1 -1
  47. package/dist/esm/index.js +32 -15
  48. package/dist/esm/index.js.map +1 -1
  49. package/dist/esm/logger/core.d.ts +22 -11
  50. package/dist/esm/logger/core.d.ts.map +1 -1
  51. package/dist/esm/logger/core.js +44 -23
  52. package/dist/esm/logger/core.js.map +1 -1
  53. package/dist/esm/types/index.d.ts +59 -15
  54. package/dist/esm/types/index.d.ts.map +1 -1
  55. package/dist/esm/types/index.js.map +1 -1
  56. package/package.json +3 -2
package/README.md CHANGED
@@ -1,35 +1,27 @@
1
- # Log Engine ๐Ÿ“œ๐Ÿš‚ [![made by](https://img.shields.io/badge/made%20by-WG%20Tech%20Labs-0060a0.svg?logo=github&longCache=true&labelColor=181717&style=flat-square)](https://github.com/wgtechlabs)
1
+ # @wgtechlabs/log-engine
2
2
 
3
- [![codecov](https://img.shields.io/codecov/c/github/wgtechlabs/log-engine?token=PWRJTBVKQ9&style=flat-square&logo=codecov&labelColor=181717)](https://codecov.io/gh/wgtechlabs/log-engine) [![npm downloads](https://img.shields.io/npm/dm/%40wgtechlabs%2Flog-engine?style=flat-square&logo=npm&label=installs&labelColor=181717&color=%23CD0000)](https://www.npmjs.com/package/@wgtechlabs/log-engine) [![sponsors](https://img.shields.io/badge/sponsor-%E2%9D%A4-%23db61a2.svg?&logo=github&logoColor=white&labelColor=181717&style=flat-square)](https://github.com/sponsors/wgtechlabs) [![release](https://img.shields.io/github/release/wgtechlabs/log-engine.svg?logo=github&labelColor=181717&color=green&style=flat-square)](https://github.com/wgtechlabs/log-engine/releases) [![star](https://img.shields.io/github/stars/wgtechlabs/log-engine.svg?&logo=github&labelColor=181717&color=yellow&style=flat-square)](https://github.com/wgtechlabs/log-engine/stargazers) [![license](https://img.shields.io/github/license/wgtechlabs/log-engine.svg?&logo=github&labelColor=181717&style=flat-square)](https://github.com/wgtechlabs/log-engine/blob/main/license)
4
-
5
- [![banner](https://raw.githubusercontent.com/wgtechlabs/log-engine/main/.github/assets/repo_banner.jpg)](https://github.com/wgtechlabs/log-engine)
3
+ ![GitHub Repo Banner](https://ghrb.waren.build/banner?header=log-engine+%F0%9F%93%9C%F0%9F%9A%82&subheader=ultimate+logging+solution&bg=016EEA&color=FFFFFF&headerfont=Google+Sans+Code&subheaderfont=Kinewave&watermarkpos=bottom-right)
4
+ <!-- Created with GitHub Repo Banner by Waren Gonzaga: https://ghrb.waren.build -->
6
5
 
7
- WG's Log Engine is the **ultimate logging solution for Node.js developers** - a lightweight, battle-tested utility specifically engineered for Discord bots, Telegram bots, web servers, APIs, and server-side applications. Born from real-world development challenges and proven in production environments like the [Unthread Discord Bot](https://github.com/wgtechlabs/unthread-discord-bot/), Log Engine delivers enterprise-grade logging with zero complexity, beautiful color-coded console output, **revolutionary configurable output routing**, and **advanced automatic data redaction with comprehensive PII protection**.
6
+ [![codecov](https://img.shields.io/codecov/c/github/wgtechlabs/log-engine?token=PWRJTBVKQ9&style=flat-square&logo=codecov&labelColor=181717)](https://codecov.io/gh/wgtechlabs/log-engine) [![npm downloads](https://img.shields.io/npm/dm/%40wgtechlabs%2Flog-engine?style=flat-square&logo=npm&label=installs&labelColor=181717&color=%23CD0000)](https://www.npmjs.com/package/@wgtechlabs/log-engine) [![sponsors](https://img.shields.io/badge/sponsor-%E2%9D%A4-%23db61a2.svg?&logo=github&logoColor=white&labelColor=181717&style=flat-square)](https://github.com/sponsors/wgtechlabs) [![release](https://img.shields.io/github/release/wgtechlabs/log-engine.svg?logo=github&labelColor=181717&color=green&style=flat-square)](https://github.com/wgtechlabs/log-engine/releases) [![star](https://img.shields.io/github/stars/wgtechlabs/log-engine.svg?&logo=github&labelColor=181717&color=yellow&style=flat-square)](https://github.com/wgtechlabs/log-engine/stargazers) [![license](https://img.shields.io/github/license/wgtechlabs/log-engine.svg?&logo=github&labelColor=181717&style=flat-square)](https://github.com/wgtechlabs/log-engine/blob/main/license)
8
7
 
9
- **The first logging library with built-in advanced PII protection, configurable output handlers, and comprehensive TypeScript support.** Stop wrestling with logging configurations and start building amazing applications safely. Whether you're creating the next viral Discord community bot, building high-performance APIs, developing microservices, or deploying production servers, Log Engine provides intelligent logging with vibrant colors, flexible output routing to any destination, advanced customizable redaction patterns, and automatic sensitive data protection that scales with your application's growth - from your first "Hello World" to handling millions of requests across distributed systems.
8
+ Log Engine is a lightweight, zero-dependency logging library for Node.js, built because logging should protect sensitive data and just work, without complex configs or security afterthoughts. Through automatic environment detection, **built-in PII redaction**, **configurable output routing**, color-coded console output, and full TypeScript support, it delivers enterprise-grade logging for Discord bots, web servers, APIs, and any server-side application. Proven in production environments like the [Unthread Discord Bot](https://github.com/wgtechlabs/unthread-discord-bot/).
10
9
 
11
10
  ## โฃ๏ธ Motivation
12
11
 
13
- Picture this: It's 2 AM, your server is crashing in production, and you're staring at a terminal filled with thousands of debug messages mixed with critical errors. Sound familiar? I've been there too many times. I created Log Engine because every developer deserves to sleep peacefully, knowing their logs are working intelligently in the background.
14
-
15
- Log Engine transforms your development experience from chaotic debugging sessions into confident, data-driven problem solving. No more guessing what went wrong, no more drowning in irrelevant logs, no more manual configuration headaches. Just clear, contextual information exactly when and where you need it. Because great applications deserve great logging, and great developers deserve tools that just work.
12
+ I created Log Engine after too many 2 AM debugging sessions, staring at terminals flooded with noise while hunting for the one error that matters. Every developer deserves clear, contextual logs that just work, no guessing, no configuration headaches, no drowning in irrelevant output. Great applications deserve great logging.
16
13
 
17
14
  ## โœจ Key Features
18
15
 
19
- - **๐Ÿ”’ Advanced Data Redaction (Enhanced!)**: Built-in PII protection with **custom regex patterns**, **dynamic field management**, and **environment-based configuration** - the first logging library with comprehensive security-first logging by default.
20
- - **๐ŸŽฏ Configurable Output Handlers (New!)**: Revolutionary output routing system supporting **custom destinations**, **multiple simultaneous outputs**, and **production-ready handlers** - redirect logs to files, HTTP endpoints, GUI applications, testing frameworks, or any custom destination with zero configuration complexity.
21
- - **โšก Custom Redaction Patterns**: Add your own regex patterns for advanced field detection and enterprise-specific data protection requirements.
22
- - **๐ŸŽฏ Dynamic Field Management**: Runtime configuration of sensitive fields with case-insensitive matching and partial field name detection.
23
- - **๐Ÿ› ๏ธ Developer-Friendly API**: Advanced redaction methods including `testFieldRedaction()`, `withoutRedaction()`, and comprehensive configuration management.
24
- - **๐Ÿ“Š Comprehensive TypeScript Support**: Full type definitions with 15+ interfaces covering all functionality for maximum developer experience and IDE support.
25
- - **๐Ÿš€ Lightweight & Fast**: Minimal overhead with maximum performance - designed to enhance your application, not slow it down.
26
- - **๐Ÿ“š No Learning Curve**: Dead simple API that you can master in seconds. No extensive documentation, complex configurations, or setup required - Log Engine works instantly.
27
- - **๐ŸŒˆ Colorized Console Output**: Beautiful ANSI color-coded log levels with intelligent terminal formatting - instantly identify message severity at a glance with color-coded output.
28
- - **๐ŸŽ›๏ธ Multiple Log Modes**: Support for DEBUG, INFO, WARN, ERROR, SILENT, OFF, and special LOG levels with smart filtering - just set your mode and let it handle the rest.
29
- - **โš™๏ธ Auto-Configuration**: Intelligent environment-based setup using NODE_ENV variables. No config files, initialization scripts, or manual setup - Log Engine works perfectly out of the box.
30
- - **โœจ Enhanced Formatting**: Structured log entries with dual timestamps (ISO + human-readable) and colored level indicators for maximum readability.
31
- - **๐Ÿ”— Zero Dependencies**: No external dependencies for maximum compatibility and security - keeps your bundle clean and your project simple.
32
- - **๐Ÿ”Œ Easy Integration**: Simple API that works seamlessly with existing Node.js applications. Just `import` and start logging - no middleware, plugins, or configuration required.
16
+ - **๐Ÿ”’ Advanced Data Redaction** โ€” Built-in PII protection with custom regex patterns, dynamic field management, and environment-based configuration. Security-first logging by default.
17
+ - **๐ŸŽฏ Configurable Output Handlers** โ€” Route logs to any destination: files, HTTP endpoints, databases, or multiple outputs simultaneously.
18
+ - **๐ŸŽจ Context-Aware Emoji** โ€” Intelligent emoji selection based on log content with 37 curated gitmoji mappings, fully customizable.
19
+ - **๐ŸŒˆ Color-Coded Console Output** โ€” ANSI color-coded levels and timestamps for instant severity recognition.
20
+ - **๐ŸŽ›๏ธ Multiple Log Modes** โ€” DEBUG, INFO, WARN, ERROR, SILENT, OFF, and a special always-visible LOG level.
21
+ - **โš™๏ธ Auto-Configuration** โ€” Detects `NODE_ENV` and sets appropriate log levels automatically. No setup required.
22
+ - **๐Ÿ“Š Full TypeScript Support** โ€” 15+ type definitions and interfaces for complete IDE support.
23
+ - **๐Ÿ”— Zero Dependencies** โ€” No external dependencies. Lightweight with automated bundle size monitoring under 1MB.
24
+ - **๐Ÿ”Œ Simple API** โ€” Just `import` and start logging. No middleware, plugins, or configuration files needed.
33
25
 
34
26
  ## โš ๏ธ Breaking Changes Notice
35
27
 
@@ -327,15 +319,15 @@ LogEngine.log('Critical message'); // โŒ Hidden with OFF - complete silence!
327
319
 
328
320
  ### Log Format
329
321
 
330
- Log messages are beautifully formatted with colorized timestamps, levels, and smart terminal output:
322
+ Log messages are formatted with colorized timestamps, levels, context-aware emoji, and smart terminal output:
331
323
 
332
324
  ```bash
333
325
  # Example colorized output (colors visible in terminal)
334
- [2025-05-29T16:57:45.678Z][4:57PM][DEBUG]: Debugging application flow
335
- [2025-05-29T16:57:46.123Z][4:57PM][INFO]: Server started successfully
336
- [2025-05-29T16:57:47.456Z][4:57PM][WARN]: API rate limit approaching
337
- [2025-05-29T16:57:48.789Z][4:57PM][ERROR]: Database connection failed
338
- [2025-05-29T16:57:49.012Z][4:57PM][LOG]: Application startup complete
326
+ [2025-05-29T16:57:45.678Z][4:57PM][DEBUG][๐Ÿž]: Debugging application flow
327
+ [2025-05-29T16:57:46.123Z][4:57PM][INFO][๐Ÿš€]: Server started successfully
328
+ [2025-05-29T16:57:47.456Z][4:57PM][WARN][โšก๏ธ]: API rate limit approaching
329
+ [2025-05-29T16:57:48.789Z][4:57PM][ERROR][๐Ÿ—ƒ๏ธ]: Database connection failed
330
+ [2025-05-29T16:57:49.012Z][4:57PM][LOG][โœ…]: Application startup complete
339
331
  ```
340
332
 
341
333
  **Color Scheme:**
@@ -346,6 +338,7 @@ Log messages are beautifully formatted with colorized timestamps, levels, and sm
346
338
  - ๐Ÿ”ด **ERROR**: Red - Error messages requiring immediate action
347
339
  - ๐ŸŸข **LOG**: Green - Critical messages that always display
348
340
  - โšซ **Timestamps**: Gray (ISO) and Cyan (local time) for easy scanning
341
+ - ๐ŸŽจ **Emoji**: Context-aware emoji selected based on log content (can be disabled via `includeEmoji: false`)
349
342
 
350
343
  ### Customizing Log Elements
351
344
 
@@ -353,10 +346,11 @@ Log messages are beautifully formatted with colorized timestamps, levels, and sm
353
346
 
354
347
  #### Available Customization Options
355
348
 
356
- You can control the inclusion of timestamp elements:
349
+ You can control the inclusion of these elements:
357
350
 
358
351
  - **ISO Timestamp**: `[2025-05-29T16:57:45.678Z]` - Precise UTC timestamp
359
352
  - **Local Time**: `[4:57PM]` - Human-readable local time
353
+ - **Emoji**: `[๐Ÿš€]` - Context-aware emoji indicator (enabled by default)
360
354
  - **Log Level**: `[INFO]` - Always included (non-customizable as per design)
361
355
 
362
356
  #### Format Configuration Examples
@@ -364,10 +358,10 @@ You can control the inclusion of timestamp elements:
364
358
  ```typescript
365
359
  import { LogEngine, LogMode } from '@wgtechlabs/log-engine';
366
360
 
367
- // Default format (backward compatible)
361
+ // Default format (backward compatible - emoji enabled by default)
368
362
  LogEngine.configure({ mode: LogMode.DEBUG });
369
363
  LogEngine.info('Server started');
370
- // Output: [2025-05-29T16:57:45.678Z][4:57PM][INFO]: Server started
364
+ // Output: [2025-05-29T16:57:45.678Z][4:57PM][INFO][๐Ÿš€]: Server started
371
365
 
372
366
  // Only ISO timestamp
373
367
  LogEngine.configure({
@@ -378,7 +372,7 @@ LogEngine.configure({
378
372
  }
379
373
  });
380
374
  LogEngine.info('Database connected');
381
- // Output: [2025-05-29T16:57:45.678Z][INFO]: Database connected
375
+ // Output: [2025-05-29T16:57:45.678Z][INFO][๐Ÿ—ƒ๏ธ]: Database connected
382
376
 
383
377
  // Only local time
384
378
  LogEngine.configure({
@@ -389,14 +383,15 @@ LogEngine.configure({
389
383
  }
390
384
  });
391
385
  LogEngine.warn('Rate limit approaching');
392
- // Output: [4:57PM][WARN]: Rate limit approaching
386
+ // Output: [4:57PM][WARN][โšก๏ธ]: Rate limit approaching
393
387
 
394
- // Minimal format (no timestamps)
388
+ // Minimal format (no timestamps, no emoji)
395
389
  LogEngine.configure({
396
390
  mode: LogMode.DEBUG,
397
391
  format: {
398
392
  includeIsoTimestamp: false,
399
- includeLocalTime: false
393
+ includeLocalTime: false,
394
+ includeEmoji: false
400
395
  }
401
396
  });
402
397
  LogEngine.error('Connection failed');
@@ -413,6 +408,207 @@ LogEngine.error('Connection failed');
413
408
 
414
409
  **Note**: Log levels (`[DEBUG]`, `[INFO]`, `[WARN]`, `[ERROR]`, `[LOG]`) are always included regardless of configuration to maintain log clarity and filtering capabilities.
415
410
 
411
+ ## ๐ŸŽจ Context-Aware Emoji Support
412
+
413
+ **LogEngine features intelligent emoji support that enhances log readability by adding visual context to each log message.** The emoji engine analyzes your log content (level + message + data) and automatically selects the most relevant emoji, making it easier to visually parse large logs and instantly identify the type of each log line.
414
+
415
+ ### Features
416
+
417
+ - **๐ŸŽฏ Context-Aware Selection**: Automatically analyzes message content and data to select appropriate emoji
418
+ - **๐Ÿ“ฆ Rich Emoji Set**: Based on [gitmoji](https://gitmoji.dev) with 40+ curated emoji mappings
419
+ - **๐Ÿ”„ Smart Fallback**: Uses level-specific emoji when no context match is found
420
+ - **๐Ÿ› ๏ธ Fully Customizable**: Extend or override emoji mappings and fallback behavior
421
+ - **โœ… Enabled by Default**: Emoji are automatically included in logs (can be disabled via `includeEmoji: false`)
422
+
423
+ ### Quick Start
424
+
425
+ ```typescript
426
+ import { LogEngine } from '@wgtechlabs/log-engine';
427
+
428
+ // Emoji are enabled by default - just start logging!
429
+ LogEngine.error('Database connection failed');
430
+ // Output: [2026-02-11T14:00:00.000Z][2:00PM][ERROR][๐Ÿ—ƒ๏ธ]: Database connection failed
431
+
432
+ LogEngine.info('Deployed to production successfully');
433
+ // Output: [2026-02-11T14:00:01.000Z][2:00PM][INFO][๐Ÿš€]: Deployed to production successfully
434
+
435
+ LogEngine.warn('Performance degradation detected');
436
+ // Output: [2026-02-11T14:00:02.000Z][2:00PM][WARN][โšก๏ธ]: Performance degradation detected
437
+
438
+ LogEngine.info('Unknown event happened');
439
+ // Output: [2026-02-11T14:00:03.000Z][2:00PM][INFO][โ„น๏ธ]: Unknown event happened (fallback)
440
+
441
+ // Disable emoji if needed
442
+ LogEngine.configure({
443
+ format: {
444
+ includeEmoji: false
445
+ }
446
+ });
447
+ ```
448
+
449
+ ### Context-Aware Emoji Mappings
450
+
451
+ LogEngine intelligently matches keywords in your log messages to select appropriate emoji:
452
+
453
+ | Context | Keywords | Emoji | Example |
454
+ |---------|----------|-------|---------|
455
+ | **Database** | database, db, sql, query, mongo, postgres | ๐Ÿ—ƒ๏ธ | "Database query failed" |
456
+ | **Deployment** | deploy, release, launched, production | ๐Ÿš€ | "Deployed to production" |
457
+ | **Performance** | performance, speed, optimize, latency | โšก๏ธ | "Performance issues detected" |
458
+ | **Security** | security, vulnerability, auth, permission | ๐Ÿ”’๏ธ | "Security breach detected" |
459
+ | **Critical** | critical, urgent, emergency, crash | ๐Ÿš‘๏ธ | "Critical system failure" |
460
+ | **Bugs** | bug, fix, defect, issue | ๐Ÿ› | "Fixed bug in login" |
461
+ | **Network** | network, http, api, endpoint | ๐ŸŒ | "API request failed" |
462
+ | **Testing** | tests, testing, validation | โœ… | "All tests passed" |
463
+
464
+ ### Fallback Emoji by Level
465
+
466
+ When no context-specific emoji matches, LogEngine uses these fallback emoji:
467
+
468
+ | Log Level | Emoji | Description |
469
+ |-----------|-------|-------------|
470
+ | `DEBUG` | ๐Ÿž | Debugging information |
471
+ | `INFO` | โ„น๏ธ | General information |
472
+ | `WARN` | โš ๏ธ | Warning messages |
473
+ | `ERROR` | โŒ | Error messages |
474
+ | `LOG` | โœ… | Critical log messages |
475
+
476
+ ### Custom Emoji Configuration
477
+
478
+ #### Custom Context Mappings
479
+
480
+ Add your own emoji mappings for custom contexts:
481
+
482
+ ```typescript
483
+ LogEngine.configure({
484
+ format: {
485
+ emoji: {
486
+ customMappings: [
487
+ {
488
+ emoji: '๐ŸŽฏ',
489
+ code: ':dart:',
490
+ description: 'Goal achieved',
491
+ keywords: ['goal', 'target', 'achieved', 'milestone']
492
+ },
493
+ {
494
+ emoji: '๐Ÿ’ฐ',
495
+ code: ':moneybag:',
496
+ description: 'Payment operations',
497
+ keywords: ['payment', 'transaction', 'billing', 'invoice']
498
+ }
499
+ ]
500
+ }
501
+ }
502
+ });
503
+
504
+ LogEngine.info('Payment processed successfully');
505
+ // Output: [INFO][๐Ÿ’ฐ]: Payment processed successfully
506
+
507
+ LogEngine.info('Sales target achieved');
508
+ // Output: [INFO][๐ŸŽฏ]: Sales target achieved
509
+ ```
510
+
511
+ #### Custom Fallback Emoji
512
+
513
+ Override the default fallback emoji for each log level:
514
+
515
+ ```typescript
516
+ LogEngine.configure({
517
+ format: {
518
+ emoji: {
519
+ customFallbacks: {
520
+ DEBUG: '๐Ÿ”',
521
+ INFO: '๐Ÿ“ข',
522
+ WARN: '๐Ÿšจ',
523
+ ERROR: '๐Ÿ’€',
524
+ LOG: '๐ŸŽ‰'
525
+ }
526
+ }
527
+ }
528
+ });
529
+
530
+ LogEngine.info('Generic info message');
531
+ // Output: [INFO][๐Ÿ“ข]: Generic info message
532
+ ```
533
+
534
+ #### Use Custom Mappings Exclusively
535
+
536
+ Use only your custom mappings and ignore the built-in set:
537
+
538
+ ```typescript
539
+ LogEngine.configure({
540
+ format: {
541
+ emoji: {
542
+ useCustomOnly: true,
543
+ customMappings: [
544
+ // Your custom mappings only
545
+ ]
546
+ }
547
+ }
548
+ });
549
+ ```
550
+
551
+ ### Data Context Analysis
552
+
553
+ The emoji selector also analyzes data objects for context:
554
+
555
+ ```typescript
556
+ LogEngine.info('Operation completed', {
557
+ database: 'postgres',
558
+ table: 'users',
559
+ rows: 1000
560
+ });
561
+ // Output: [INFO][๐Ÿ—ƒ๏ธ]: Operation completed { database: 'postgres', ... }
562
+
563
+ LogEngine.warn('Issue detected', {
564
+ performance: 'degraded',
565
+ latency: '500ms'
566
+ });
567
+ // Output: [WARN][โšก๏ธ]: Issue detected { performance: 'degraded', ... }
568
+ ```
569
+
570
+ ### Programmatic Access
571
+
572
+ Access emoji utilities directly for advanced use cases:
573
+
574
+ ```typescript
575
+ import { EmojiSelector, EMOJI_MAPPINGS, FALLBACK_EMOJI } from '@wgtechlabs/log-engine';
576
+
577
+ // Check all available emoji mappings
578
+ console.log(EMOJI_MAPPINGS);
579
+ // [{ emoji: '๐Ÿ›', code: ':bug:', description: 'Fix a bug', keywords: [...] }, ...]
580
+
581
+ // Check fallback emoji
582
+ console.log(FALLBACK_EMOJI);
583
+ // { DEBUG: '๐Ÿž', INFO: 'โ„น๏ธ', WARN: 'โš ๏ธ', ERROR: 'โŒ', LOG: 'โœ…' }
584
+
585
+ // Configure emoji selector directly (for customization)
586
+ EmojiSelector.configure({
587
+ customMappings: [...]
588
+ });
589
+ ```
590
+
591
+ ### Output Format
592
+
593
+ With emoji (enabled by default), the log format is:
594
+
595
+ ```text
596
+ [ISO_TIMESTAMP][LOCAL_TIME][LEVEL][EMOJI]: message [data]
597
+ ```
598
+
599
+ Example:
600
+ ```text
601
+ [2026-02-11T14:00:00.000Z][2:00PM][ERROR][๐Ÿ—ƒ๏ธ]: Database connection failed
602
+ ```
603
+
604
+ ### Benefits
605
+
606
+ - **๐Ÿ‘๏ธ Visual Clarity**: Instantly identify log context at a glance
607
+ - **๐ŸŽฏ Better Debugging**: Quickly locate specific types of logs in large outputs
608
+ - **๐ŸŽจ Enhanced UX**: More engaging and pleasant logging experience
609
+ - **๐Ÿ”ง Flexible**: Fully customizable to match your project's needs
610
+ - **๐Ÿ”’ Compatibility Note**: Enabled by default โ€“ existing log output will include emojis; disable or customize emoji behavior via configuration to preserve prior formats
611
+
416
612
  ## ๐Ÿ”’ Advanced Data Redaction
417
613
 
418
614
  **LogEngine features comprehensive built-in PII protection with advanced customization capabilities that automatically redacts sensitive information from your logs.** This security-first approach prevents accidental exposure of passwords, tokens, emails, and other sensitive data while maintaining full debugging capabilities with enterprise-grade flexibility.
@@ -901,7 +1097,8 @@ Contributions are welcome, create a pull request to this repo and I will review
901
1097
  - `pnpm lint:security` - Run security-focused linting
902
1098
  - `pnpm secure` - Run comprehensive security checks
903
1099
  - `pnpm build` - Build the TypeScript project
904
- - `pnpm validate` - Run full validation (lint + test + build)
1100
+ - `pnpm size:check` - Check bundle size to maintain lightweight feature
1101
+ - `pnpm validate` - Run full validation (lint + test + build + size check)
905
1102
 
906
1103
  Read the project's [contributing guide](./CONTRIBUTING.md) for detailed development setup, testing guidelines, and contribution requirements.
907
1104
 
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ /**
3
+ * Emoji data for context-aware logging
4
+ * Based on gitmoji.dev emoji set
5
+ * Each entry maps emoji to keywords that help identify when to use it
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.FALLBACK_EMOJI = exports.EMOJI_MAPPINGS = void 0;
9
+ /**
10
+ * Curated emoji mappings for context-aware logging
11
+ * Based on the gitmoji set from https://gitmoji.dev
12
+ * Ordered by specificity - more specific keywords first
13
+ */
14
+ exports.EMOJI_MAPPINGS = [
15
+ // More specific contexts first
16
+ // Database (specific)
17
+ { emoji: '๐Ÿ—ƒ๏ธ', code: ':card_file_box:', description: 'Database related', keywords: ['database', 'db', 'sql', 'query', 'table', 'schema', 'migration', 'mongo', 'postgres', 'mysql'] },
18
+ // Deployment and releases (specific)
19
+ { emoji: '๐Ÿš€', code: ':rocket:', description: 'Deploy or release', keywords: ['deploy', 'deployed', 'deployment', 'release', 'launched', 'production'] },
20
+ // Performance (specific)
21
+ { emoji: 'โšก๏ธ', code: ':zap:', description: 'Improve performance', keywords: ['performance', 'speed', 'optimize', 'fast', 'slow', 'latency', 'throughput'] },
22
+ // Security (specific)
23
+ { emoji: '๐Ÿ”’๏ธ', code: ':lock:', description: 'Fix security issues', keywords: ['security', 'secure', 'vulnerability', 'exploit', 'auth', 'authentication', 'authorization', 'permission'] },
24
+ // Critical issues (specific)
25
+ { emoji: '๐Ÿš‘๏ธ', code: ':ambulance:', description: 'Critical hotfix', keywords: ['critical', 'hotfix', 'urgent', 'emergency', 'crash', 'fatal'] },
26
+ // Bugs and fixes (specific)
27
+ { emoji: '๐Ÿ›', code: ':bug:', description: 'Fix a bug', keywords: ['bug', 'fix', 'fixed', 'fixing', 'defect', 'issue'] },
28
+ // Less specific/generic contexts last
29
+ // Errors and failures (generic)
30
+ { emoji: 'โŒ', code: ':x:', description: 'Error or failure', keywords: ['error', 'fail', 'failed', 'failure', 'exception', 'reject'] },
31
+ { emoji: '๐Ÿ”ฅ', code: ':fire:', description: 'Remove code or files', keywords: ['remove', 'delete', 'deprecated', 'obsolete'] },
32
+ { emoji: '๐ŸŒ', code: ':snail:', description: 'Slow performance', keywords: ['timeout', 'hang', 'freeze'] },
33
+ { emoji: '๐Ÿ”“๏ธ', code: ':unlock:', description: 'Unlock or access', keywords: ['unlock', 'access', 'grant', 'allow'] },
34
+ { emoji: '๐Ÿ’พ', code: ':floppy_disk:', description: 'Save or persist data', keywords: ['save', 'saved', 'saving', 'persist', 'write', 'store'] },
35
+ { emoji: '๐ŸŽ‰', code: ':tada:', description: 'Initial commit or milestone', keywords: ['initial', 'milestone', 'celebrate', 'success', 'complete'] },
36
+ // Configuration
37
+ { emoji: '๐Ÿ”ง', code: ':wrench:', description: 'Configuration changes', keywords: ['config', 'configuration', 'setting', 'settings', 'configure'] },
38
+ { emoji: 'โš™๏ธ', code: ':gear:', description: 'Configuration or settings', keywords: ['setup', 'init', 'initialize'] },
39
+ // API and network
40
+ { emoji: '๐ŸŒ', code: ':globe_with_meridians:', description: 'Network or internet', keywords: ['network', 'internet', 'http', 'https', 'request', 'response', 'api', 'endpoint'] },
41
+ { emoji: '๐Ÿ”Œ', code: ':electric_plug:', description: 'Connection or plugin', keywords: ['connect', 'connection', 'disconnect', 'plugin', 'integration'] },
42
+ // Testing
43
+ { emoji: 'โœ…', code: ':white_check_mark:', description: 'Tests passing', keywords: ['tests', 'testing', 'pass', 'passed', 'validation', 'validate'] },
44
+ { emoji: '๐Ÿงช', code: ':test_tube:', description: 'Running tests', keywords: ['experiment', 'trial', 'spec'] },
45
+ // Documentation
46
+ { emoji: '๐Ÿ“', code: ':memo:', description: 'Add or update documentation', keywords: ['document', 'documentation', 'docs', 'readme', 'comment'] },
47
+ { emoji: '๐Ÿ’ก', code: ':bulb:', description: 'New idea or insight', keywords: ['idea', 'insight', 'suggestion', 'tip', 'hint'] },
48
+ // Dependencies
49
+ { emoji: 'โž•', code: ':heavy_plus_sign:', description: 'Add dependency', keywords: ['add', 'added', 'adding', 'install', 'dependency', 'package'] },
50
+ { emoji: 'โž–', code: ':heavy_minus_sign:', description: 'Remove dependency', keywords: ['uninstall', 'removed'] },
51
+ { emoji: 'โฌ†๏ธ', code: ':arrow_up:', description: 'Upgrade dependencies', keywords: ['upgrade', 'update', 'updated'] },
52
+ { emoji: 'โฌ‡๏ธ', code: ':arrow_down:', description: 'Downgrade dependencies', keywords: ['downgrade', 'rollback'] },
53
+ // Files and structure
54
+ { emoji: '๐Ÿ“ฆ', code: ':package:', description: 'Update compiled files', keywords: ['package', 'build', 'compile', 'bundle'] },
55
+ { emoji: '๐Ÿšš', code: ':truck:', description: 'Move or rename files', keywords: ['move', 'moved', 'rename', 'renamed', 'relocate'] },
56
+ // Work in progress
57
+ { emoji: '๐Ÿšง', code: ':construction:', description: 'Work in progress', keywords: ['wip', 'progress', 'working', 'ongoing', 'incomplete'] },
58
+ // Breaking changes
59
+ { emoji: '๐Ÿ’ฅ', code: ':boom:', description: 'Breaking changes', keywords: ['breaking', 'break', 'incompatible'] },
60
+ // Accessibility
61
+ { emoji: 'โ™ฟ๏ธ', code: ':wheelchair:', description: 'Improve accessibility', keywords: ['accessibility', 'a11y', 'accessible'] },
62
+ // Internationalization
63
+ { emoji: '๐ŸŒ', code: ':earth_africa:', description: 'Internationalization', keywords: ['i18n', 'localization', 'l10n', 'translation', 'language'] },
64
+ // UI and styling
65
+ { emoji: '๐Ÿ’„', code: ':lipstick:', description: 'Update UI and style', keywords: ['ui', 'style', 'css', 'design', 'interface', 'layout'] },
66
+ { emoji: '๐ŸŽจ', code: ':art:', description: 'Improve structure', keywords: ['refactor', 'refactoring', 'restructure', 'format'] },
67
+ // Logging and monitoring
68
+ { emoji: '๐Ÿ”Š', code: ':loud_sound:', description: 'Add or update logs', keywords: ['logging', 'trace'] },
69
+ { emoji: '๐Ÿ”‡', code: ':mute:', description: 'Remove logs', keywords: ['silent', 'quiet', 'mute'] },
70
+ { emoji: '๐Ÿ“Š', code: ':bar_chart:', description: 'Analytics or metrics', keywords: ['analytics', 'metrics', 'stats', 'statistics', 'monitor', 'monitoring'] },
71
+ // Code review
72
+ { emoji: '๐Ÿ‘Œ', code: ':ok_hand:', description: 'Code review changes', keywords: ['review', 'approve', 'approved', 'lgtm'] },
73
+ // Catch-all for new features (put last)
74
+ { emoji: 'โœจ', code: ':sparkles:', description: 'New feature', keywords: ['feature', 'new', 'enhancement', 'improve', 'improved'] },
75
+ ];
76
+ /**
77
+ * Default fallback emoji for each log level
78
+ * These are used when no context-specific emoji matches
79
+ */
80
+ exports.FALLBACK_EMOJI = {
81
+ DEBUG: '๐Ÿž',
82
+ INFO: 'โ„น๏ธ',
83
+ WARN: 'โš ๏ธ',
84
+ ERROR: 'โŒ',
85
+ LOG: 'โœ…'
86
+ };
87
+ //# sourceMappingURL=emoji-data.js.map
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Emoji data for context-aware logging
3
+ * Based on gitmoji.dev emoji set
4
+ * Each entry maps emoji to keywords that help identify when to use it
5
+ */
6
+ import { EmojiMapping } from '../types';
7
+ /**
8
+ * Curated emoji mappings for context-aware logging
9
+ * Based on the gitmoji set from https://gitmoji.dev
10
+ * Ordered by specificity - more specific keywords first
11
+ */
12
+ export declare const EMOJI_MAPPINGS: EmojiMapping[];
13
+ /**
14
+ * Default fallback emoji for each log level
15
+ * These are used when no context-specific emoji matches
16
+ */
17
+ export declare const FALLBACK_EMOJI: Record<'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'LOG', string>;
18
+ //# sourceMappingURL=emoji-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji-data.d.ts","sourceRoot":"","sources":["../../../src/formatter/emoji-data.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,YAAY,EAsFxC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,EAAE,MAAM,CAMtF,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji-data.js","sourceRoot":"","sources":["../../../src/formatter/emoji-data.ts"],"names":[],"mappings":"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"}