@crimsonsunset/jsg-logger 1.7.13 → 1.7.14

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 (74) hide show
  1. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  2. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  3. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  4. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  5. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  6. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  7. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  8. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  9. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  10. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  11. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  12. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  13. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  14. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  15. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  16. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  17. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  18. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  19. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  20. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  21. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  22. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  23. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  24. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  25. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  26. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  27. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  28. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  29. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js +5 -0
  30. package/devtools/dist/__vite-browser-external-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW-2Ng8QIWW.js.map +1 -0
  31. package/devtools/dist/panel-entry-Ahej53sX-y0jCvGoU-BGR5GUGQ-B-CAdAd3-DipRT8xT-CSMwqnO2-CHbiC4Qe-BRrWXqYD-CNcJekPg.js +13932 -0
  32. package/devtools/dist/panel-entry-Ahej53sX-y0jCvGoU-BGR5GUGQ-B-CAdAd3-DipRT8xT-CSMwqnO2-CHbiC4Qe-BRrWXqYD-CNcJekPg.js.map +1 -0
  33. package/devtools/dist/panel-entry-B0ZWdsQY-DQdquw3J-TpkzsLdj-BGvdXuoS-CzTJvBQl-CAQNpg2W-Bo2gswMb-CAJV5DP5-DZe7oWlk-tDqwNUld.js +13923 -0
  34. package/devtools/dist/panel-entry-B0ZWdsQY-DQdquw3J-TpkzsLdj-BGvdXuoS-CzTJvBQl-CAQNpg2W-Bo2gswMb-CAJV5DP5-DZe7oWlk-tDqwNUld.js.map +1 -0
  35. package/devtools/dist/panel-entry-B2MhZ3gp.js +13975 -0
  36. package/devtools/dist/panel-entry-B2MhZ3gp.js.map +1 -0
  37. package/devtools/dist/{panel-entry-BZ56bT66-BMyD75mc.js → panel-entry-BZ56bT66-BMyD75mc-BxfcB-io-DLFBg4X2-By57n0cz-DG9FfyPU-tsDeIORn-Brgs9eZh-C1aTwqVx-Bga5v200-D2uIBkta-DFygDOuM-CiZQ0ZWs-CK-Qy7JF-3_LfnrLj-C80pq-Ox-BAydVBl9.js} +4 -4
  38. package/devtools/dist/panel-entry-BZ56bT66-BMyD75mc-BxfcB-io-DLFBg4X2-By57n0cz-DG9FfyPU-tsDeIORn-Brgs9eZh-C1aTwqVx-Bga5v200-D2uIBkta-DFygDOuM-CiZQ0ZWs-CK-Qy7JF-3_LfnrLj-C80pq-Ox-BAydVBl9.js.map +1 -0
  39. package/devtools/dist/panel-entry-BaBkkSt6-B3YoMX06.js +13963 -0
  40. package/devtools/dist/panel-entry-BaBkkSt6-B3YoMX06.js.map +1 -0
  41. package/devtools/dist/panel-entry-CIG0rw0G-C23A9sjU-CbDuened.js +13957 -0
  42. package/devtools/dist/panel-entry-CIG0rw0G-C23A9sjU-CbDuened.js.map +1 -0
  43. package/devtools/dist/panel-entry-CLDrp2P4-BhE5Qmzo-DsrDp_aW-D77vFWhc-D0p-3Vck-juqy3fYf-Dla5eR-o-CER385zO-3kQqst6Z-mEXeTQxs-XDwY_WUW-CcUUttdq-BGVY77mY.js +13914 -0
  44. package/devtools/dist/panel-entry-CLDrp2P4-BhE5Qmzo-DsrDp_aW-D77vFWhc-D0p-3Vck-juqy3fYf-Dla5eR-o-CER385zO-3kQqst6Z-mEXeTQxs-XDwY_WUW-CcUUttdq-BGVY77mY.js.map +1 -0
  45. package/devtools/dist/panel-entry-Car1txqz-Cujk5tL9-pWwzfz1C-C_CMO2R5-BtcT6buV-DEh6fx7S-BLtwgJNF-CUuTgFqX.js +13935 -0
  46. package/devtools/dist/panel-entry-Car1txqz-Cujk5tL9-pWwzfz1C-C_CMO2R5-BtcT6buV-DEh6fx7S-BLtwgJNF-CUuTgFqX.js.map +1 -0
  47. package/devtools/dist/panel-entry-CdHyTMuR-wqllnGMv-CJFeg7x9-C7mRB5fj-DOgQaLRi-yYTqC4-t-DKUNOg6F-BtruRO_z-BDQrJIZQ-ByHq-LMj-Drlk5OTb-BAoinR4q-CD8VtN79-Cidg8klg-CA9PGoiF.js +13728 -0
  48. package/devtools/dist/panel-entry-CdHyTMuR-wqllnGMv-CJFeg7x9-C7mRB5fj-DOgQaLRi-yYTqC4-t-DKUNOg6F-BtruRO_z-BDQrJIZQ-ByHq-LMj-Drlk5OTb-BAoinR4q-CD8VtN79-Cidg8klg-CA9PGoiF.js.map +1 -0
  49. package/devtools/dist/panel-entry-D53S3yYJ-DlRCzJ0q-BnWPSxII-B57eqdYD-CRpb7P7m-CSgQ8r4U-DqjeAoTP.js +13935 -0
  50. package/devtools/dist/panel-entry-D53S3yYJ-DlRCzJ0q-BnWPSxII-B57eqdYD-CRpb7P7m-CSgQ8r4U-DqjeAoTP.js.map +1 -0
  51. package/devtools/dist/panel-entry-D6EQIVsV-51lrmGiZ-D4qVD_00-DVb1ySI7-C_RfHhv5-D78tUI3_.js +13945 -0
  52. package/devtools/dist/panel-entry-D6EQIVsV-51lrmGiZ-D4qVD_00-DVb1ySI7-C_RfHhv5-D78tUI3_.js.map +1 -0
  53. package/devtools/dist/{panel-entry-Da9n85v7.js → panel-entry-Da9n85v7-C6Gam2oq-DDT89MNj-D9ZqvcEM-Dx--LZLa-BJiXK46m-DGuagWzT-B6evq62k-Cj2QcsAJ-BnxooYWW-D4oxy7MQ-g1-2DT91-DESRmxtW-BFO1EmVx-MWoTuzW5-Cg1SKwet.js} +4 -4
  54. package/devtools/dist/panel-entry-Da9n85v7-C6Gam2oq-DDT89MNj-D9ZqvcEM-Dx--LZLa-BJiXK46m-DGuagWzT-B6evq62k-Cj2QcsAJ-BnxooYWW-D4oxy7MQ-g1-2DT91-DESRmxtW-BFO1EmVx-MWoTuzW5-Cg1SKwet.js.map +1 -0
  55. package/devtools/dist/panel-entry-DeLbn5Tk-P7ZtOAd3-DXeez3fy-BFxPfyZi-9L9N-1f8-DzO_hXuM-CWXuuiJk-CI3ufk2T-CP3JflFQ-CLoczwy1-D7ukr7PE-DbMhopxi-BHxIMhDL-CDnadrxB.js +13999 -0
  56. package/devtools/dist/panel-entry-DeLbn5Tk-P7ZtOAd3-DXeez3fy-BFxPfyZi-9L9N-1f8-DzO_hXuM-CWXuuiJk-CI3ufk2T-CP3JflFQ-CLoczwy1-D7ukr7PE-DbMhopxi-BHxIMhDL-CDnadrxB.js.map +1 -0
  57. package/devtools/dist/panel-entry-Dh3i-JKj-D7NSYIQS-C_qI61WQ-BfJ0BW16-Df40_Q6R.js +13951 -0
  58. package/devtools/dist/panel-entry-Dh3i-JKj-D7NSYIQS-C_qI61WQ-BfJ0BW16-Df40_Q6R.js.map +1 -0
  59. package/devtools/dist/panel-entry-DlWAx2yA-vZadFV4d-DTvClgVl-zRu1NJo4-rPRjTg0e-dbBSWeq3-jx9KYEq_-B3sEcSWI-DeCc9Glr-02P4pIqr-CrzX1Fsr-C1C-Fcde.js +13921 -0
  60. package/devtools/dist/panel-entry-DlWAx2yA-vZadFV4d-DTvClgVl-zRu1NJo4-rPRjTg0e-dbBSWeq3-jx9KYEq_-B3sEcSWI-DeCc9Glr-02P4pIqr-CrzX1Fsr-C1C-Fcde.js.map +1 -0
  61. package/devtools/dist/{panel-entry-DzGsV7s--DzGsV7s--DzGsV7s-.js → panel-entry-DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s-.js} +1 -1
  62. package/devtools/dist/panel-entry-DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s--DzGsV7s-.js.map +1 -0
  63. package/devtools/dist/panel-entry-F_czAD5m-haMWJ-NK-CsYx2f8v-CczoKRsz-CIS8-qZe-F0ks_Y8t-CZBpt1gj-QmZJhT5N-460P-RpL-CKLofb-z-DEXl2ipp.js +13921 -0
  64. package/devtools/dist/panel-entry-F_czAD5m-haMWJ-NK-CsYx2f8v-CczoKRsz-CIS8-qZe-F0ks_Y8t-CZBpt1gj-QmZJhT5N-460P-RpL-CKLofb-z-DEXl2ipp.js.map +1 -0
  65. package/devtools/dist/panel-entry-L66PnOAy-CSPip1Cq-DIdgAB36-D56Z9rwz.js +13957 -0
  66. package/devtools/dist/panel-entry-L66PnOAy-CSPip1Cq-DIdgAB36-D56Z9rwz.js.map +1 -0
  67. package/devtools/dist/panel-entry.js +449 -193
  68. package/devtools/dist/panel-entry.js.map +1 -1
  69. package/docs/roadmap.md +5 -0
  70. package/index.js +118 -7
  71. package/package.json +1 -1
  72. package/devtools/dist/panel-entry-BZ56bT66-BMyD75mc.js.map +0 -1
  73. package/devtools/dist/panel-entry-Da9n85v7.js.map +0 -1
  74. package/devtools/dist/panel-entry-DzGsV7s--DzGsV7s--DzGsV7s-.js.map +0 -1
package/docs/roadmap.md CHANGED
@@ -435,6 +435,11 @@ Console filtering updates
435
435
 
436
436
  ### **🔮 Future Enhancements**
437
437
 
438
+ #### **Component Management** (Future)
439
+ - [ ] **Component removal notification** - Subscribe to component removal events (currently only addition events are supported)
440
+ - [ ] **Component lifecycle tracking** - Track when components are created and removed
441
+ - **Note:** Component addition notifications are implemented. Removal notifications are deferred for future enhancement (see TODO in `index.js:817`)
442
+
438
443
  #### **Advanced Filtering** (Phase 6.5)
439
444
  - [ ] **File-level controls** - Panel interface for file overrides
440
445
  - [ ] **Search filtering** - Filter logs by message content
package/index.js CHANGED
@@ -57,6 +57,7 @@ class JSGLogger {
57
57
  this.environment = null; // Will be set after config loads
58
58
  this.initialized = false;
59
59
  this.components = {}; // Auto-discovery getters
60
+ this.componentSubscribers = []; // Subscribers for component change events
60
61
  }
61
62
 
62
63
  /**
@@ -75,6 +76,7 @@ class JSGLogger {
75
76
  // Make runtime controls available globally in browser for debugging
76
77
  if (isBrowser() && typeof window !== 'undefined' && JSGLogger._enhancedLoggers?.controls) {
77
78
  window.JSG_Logger = JSGLogger._enhancedLoggers.controls;
79
+ window.__JSG_Logger_Enhanced__ = JSGLogger._enhancedLoggers;
78
80
  }
79
81
  } else if (hasOptions) {
80
82
  // Instance exists but new options provided - reinitialize
@@ -84,6 +86,7 @@ class JSGLogger {
84
86
  // (same as getInstanceSync behavior)
85
87
  if (isBrowser() && typeof window !== 'undefined' && JSGLogger._enhancedLoggers?.controls) {
86
88
  window.JSG_Logger = JSGLogger._enhancedLoggers.controls;
89
+ window.__JSG_Logger_Enhanced__ = JSGLogger._enhancedLoggers;
87
90
  }
88
91
  }
89
92
 
@@ -92,21 +95,62 @@ class JSGLogger {
92
95
 
93
96
  /**
94
97
  * Get singleton instance synchronously (for environments without async support)
98
+ * Checks window.JSG_Logger first to ensure singleton works across separate bundles
95
99
  * @param {Object} options - Initialization options (only used on first call)
96
100
  * @returns {Object} Enhanced logger exports with controls API
97
101
  */
98
102
  static getInstanceSync(options = {}) {
99
103
  const hasOptions = options && Object.keys(options).length > 0;
104
+
105
+ // If options are provided, we need to reinitialize even if global instance exists
106
+ // This ensures config changes (like devtools.enabled) are applied
107
+ if (hasOptions) {
108
+ // Reinitialize with new options - this will update the global references
109
+ if (!JSGLogger._instance) {
110
+ JSGLogger._instance = new JSGLogger();
111
+ }
112
+ JSGLogger._enhancedLoggers = JSGLogger._instance.initSync(options);
113
+
114
+ // Update global references after reinitialization
115
+ if (isBrowser() && typeof window !== 'undefined' && JSGLogger._enhancedLoggers?.controls) {
116
+ window.JSG_Logger = JSGLogger._enhancedLoggers.controls;
117
+ window.__JSG_Logger_Enhanced__ = JSGLogger._enhancedLoggers;
118
+ }
119
+
120
+ return JSGLogger._enhancedLoggers;
121
+ }
122
+
123
+ // No options provided - check window.JSG_Logger first to ensure singleton works across bundles
124
+ // This is critical when devtools bundle loads separately from main app
125
+ if (isBrowser() && typeof window !== 'undefined' && window.JSG_Logger) {
126
+ // If enhanced loggers reference exists, use it (preferred)
127
+ if (window.__JSG_Logger_Enhanced__) {
128
+ return window.__JSG_Logger_Enhanced__;
129
+ }
130
+ // Fallback: reconstruct enhanced loggers from controls object
131
+ // This handles cases where __JSG_Logger_Enhanced__ wasn't set
132
+ const globalControls = window.JSG_Logger;
133
+ return {
134
+ ...globalControls,
135
+ controls: globalControls,
136
+ getComponent: globalControls.getComponent,
137
+ getInstanceSync: JSGLogger.getInstanceSync.bind(JSGLogger),
138
+ getInstance: JSGLogger.getInstance.bind(JSGLogger),
139
+ logPerformance: JSGLogger.logPerformance.bind(JSGLogger),
140
+ JSGLogger: JSGLogger
141
+ };
142
+ }
100
143
 
144
+ // No options and no global instance - first time initialization
101
145
  if (!JSGLogger._instance) {
102
- // First time initialization
103
146
  JSGLogger._instance = new JSGLogger();
104
147
  JSGLogger._enhancedLoggers = JSGLogger._instance.initSync(options);
105
- } else if (hasOptions) {
106
- // Instance exists but new options provided - reinitialize
107
- // Only reinit if flag is not set (first init hasn't completed yet)
108
- // or if we need to apply new config
109
- JSGLogger._enhancedLoggers = JSGLogger._instance.initSync(options);
148
+
149
+ // Make runtime controls available globally in browser for debugging
150
+ if (isBrowser() && typeof window !== 'undefined' && JSGLogger._enhancedLoggers?.controls) {
151
+ window.JSG_Logger = JSGLogger._enhancedLoggers.controls;
152
+ window.__JSG_Logger_Enhanced__ = JSGLogger._enhancedLoggers;
153
+ }
110
154
  }
111
155
 
112
156
  return JSGLogger._enhancedLoggers;
@@ -265,6 +309,12 @@ class JSGLogger {
265
309
 
266
310
  // Create loggers for all available components using default config
267
311
  const components = configManager.getAvailableComponents();
312
+
313
+ // Debug: Log components being created during initialization
314
+ // Note: Using console.log because this.loggers is empty at this point
315
+ if (components.length > 0) {
316
+ console.log(`[JSG-LOGGER] Creating ${components.length} loggers during initSync:`, components);
317
+ }
268
318
 
269
319
  components.forEach(componentName => {
270
320
  // Use original createLogger to bypass utility method caching
@@ -282,6 +332,19 @@ class JSGLogger {
282
332
 
283
333
  // Create auto-discovery getters (eager)
284
334
  this._createAutoDiscoveryGetters();
335
+
336
+ // Notify component subscribers after reinitialization (if components changed)
337
+ // This ensures panel sees components created during reinit, not just via getComponent()
338
+ if (this.componentSubscribers.length > 0) {
339
+ const currentComponents = Object.keys(this.loggers);
340
+ this.componentSubscribers.forEach(callback => {
341
+ try {
342
+ callback(currentComponents);
343
+ } catch (error) {
344
+ console.error('Component subscriber error:', error);
345
+ }
346
+ });
347
+ }
285
348
 
286
349
  this.initialized = true;
287
350
 
@@ -494,7 +557,25 @@ class JSGLogger {
494
557
  },
495
558
 
496
559
  // Component controls
497
- listComponents: () => configManager.getAvailableComponents(),
560
+ listComponents: () => Object.keys(this.loggers),
561
+ subscribeToComponents: (callback) => {
562
+ this.componentSubscribers.push(callback);
563
+ // Immediately call callback with current component list (don't wait for changes)
564
+ // This ensures panel sees components created during reinitialization
565
+ const currentComponents = Object.keys(this.loggers);
566
+ try {
567
+ callback(currentComponents);
568
+ } catch (error) {
569
+ console.error('Component subscriber error (initial call):', error);
570
+ }
571
+ // Return unsubscribe function
572
+ return () => {
573
+ const index = this.componentSubscribers.indexOf(callback);
574
+ if (index > -1) {
575
+ this.componentSubscribers.splice(index, 1);
576
+ }
577
+ };
578
+ },
498
579
  enableDebugMode: () => {
499
580
  Object.keys(this.loggers).forEach(component => {
500
581
  if (this.loggers[component]) {
@@ -801,6 +882,26 @@ class JSGLogger {
801
882
  if (camelName !== componentName) {
802
883
  this.components[camelName] = () => this.getComponent(componentName);
803
884
  }
885
+
886
+ // Notify component subscribers of the change (emit on every add, not deduplicated)
887
+ // TODO: Add component removal notification support (future enhancement)
888
+ const currentComponents = Object.keys(this.loggers);
889
+ if (this.componentSubscribers.length > 0) {
890
+ if (this.loggers.core) {
891
+ this.loggers.core.debug(`Notifying ${this.componentSubscribers.length} subscribers of component change`, {
892
+ component: componentName,
893
+ totalComponents: currentComponents.length,
894
+ components: currentComponents
895
+ });
896
+ }
897
+ }
898
+ this.componentSubscribers.forEach(callback => {
899
+ try {
900
+ callback(currentComponents);
901
+ } catch (error) {
902
+ console.error('Component subscriber error:', error);
903
+ }
904
+ });
804
905
  }
805
906
 
806
907
  return this.loggers[componentName];
@@ -858,10 +959,18 @@ class JSGLogger {
858
959
 
859
960
  /**
860
961
  * Get singleton controls without triggering initialization
962
+ * Checks window.JSG_Logger first to ensure singleton works across separate bundles
861
963
  * Returns the controls object from the current singleton instance if it exists
862
964
  * @returns {Object|null} Controls object or null if singleton not initialized
863
965
  */
864
966
  static getControls() {
967
+ // Check window.JSG_Logger first to ensure singleton works across bundles
968
+ // This is critical when devtools bundle loads separately from main app
969
+ if (isBrowser() && typeof window !== 'undefined' && window.JSG_Logger) {
970
+ return window.JSG_Logger;
971
+ }
972
+
973
+ // Fall back to local instance if global doesn't exist
865
974
  return JSGLogger._enhancedLoggers?.controls || null;
866
975
  }
867
976
  }
@@ -871,8 +980,10 @@ class JSGLogger {
871
980
  const enhancedLoggers = JSGLogger.getInstanceSync();
872
981
 
873
982
  // Make runtime controls available globally in browser for debugging
983
+ // Also store enhanced loggers reference so getInstanceSync() can access it across bundles
874
984
  if (isBrowser() && typeof window !== 'undefined') {
875
985
  window.JSG_Logger = enhancedLoggers.controls;
986
+ window.__JSG_Logger_Enhanced__ = enhancedLoggers;
876
987
  }
877
988
 
878
989
  // Add static methods to the enhanced loggers for convenience
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crimsonsunset/jsg-logger",
3
- "version": "1.7.13",
3
+ "version": "1.7.14",
4
4
  "type": "module",
5
5
  "description": "Multi-environment logger with smart detection, file-level overrides, and beautiful console formatting. Test it live: https://logger.joesangiorgio.com/",
6
6
  "main": "index.js",