@ncoderz/log-m8 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -22,10 +22,16 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
22
22
  // src/index.ts
23
23
  var index_exports = {};
24
24
  __export(index_exports, {
25
+ ConsoleAppender: () => ConsoleAppender,
26
+ DefaultFormatter: () => DefaultFormatter,
27
+ FileAppender: () => FileAppender,
28
+ JsonFormatter: () => JsonFormatter,
25
29
  LogLevel: () => LogLevel,
26
30
  LogM8: () => LogM82,
27
31
  LogM8Utils: () => LogM8Utils,
32
+ MatchFilter: () => MatchFilter,
28
33
  NullLogger: () => NullLogger,
34
+ PACKAGE_INFO: () => PACKAGE_INFO,
29
35
  PluginKind: () => PluginKind
30
36
  });
31
37
  module.exports = __toCommonJS(index_exports);
@@ -1106,6 +1112,7 @@ var LogM8 = class {
1106
1112
  __publicField(this, "_globalLogLevelNumber");
1107
1113
  __publicField(this, "_logLevelValues");
1108
1114
  __publicField(this, "_logLevelSet");
1115
+ __publicField(this, "_logLevelIndexMap");
1109
1116
  // Buffer for log events before the system is initialized
1110
1117
  __publicField(this, "_logBuffer");
1111
1118
  this._initialized = false;
@@ -1115,8 +1122,11 @@ var LogM8 = class {
1115
1122
  this._filters = [];
1116
1123
  this._logLevelValues = Object.values(LogLevel);
1117
1124
  this._logLevelSet = new Set(this._logLevelValues);
1125
+ this._logLevelIndexMap = new Map(
1126
+ this._logLevelValues.map((level, index) => [level, index])
1127
+ );
1118
1128
  this._globalLogLevel = LogLevel.info;
1119
- this._globalLogLevelNumber = this._logLevelValues.indexOf(LogLevel.info);
1129
+ this._globalLogLevelNumber = this._logLevelIndexMap.get(LogLevel.info);
1120
1130
  this._logBuffer = [];
1121
1131
  this._pluginManager.registerPluginFactory(new ConsoleAppenderFactory());
1122
1132
  this._pluginManager.registerPluginFactory(new FileAppenderFactory());
@@ -1163,32 +1173,7 @@ var LogM8 = class {
1163
1173
  }
1164
1174
  const appenderConfigs = config.appenders ?? DEFAULT_APPENDERS;
1165
1175
  for (const appenderConfigOrName of appenderConfigs) {
1166
- const appender = this._pluginManager.createPlugin(
1167
- PluginKind.appender,
1168
- appenderConfigOrName
1169
- );
1170
- const appenderConfig = LogM8Utils.isString(appenderConfigOrName) ? {
1171
- name: appender.name
1172
- } : appenderConfigOrName;
1173
- const formatter = appenderConfig?.formatter ? this._pluginManager.createPlugin(
1174
- PluginKind.formatter,
1175
- appenderConfig.formatter
1176
- ) : void 0;
1177
- const filters = [];
1178
- const ac = appenderConfig;
1179
- for (const filterConfig of ac.filters ?? []) {
1180
- const filter = this._pluginManager.createPlugin(PluginKind.filter, filterConfig);
1181
- if (filter) {
1182
- filters.push(filter);
1183
- } else {
1184
- if (console && console.log) {
1185
- console.log(
1186
- `LogM8: Filter '${filterConfig}' not found for appender ${appenderConfig.name}.`
1187
- );
1188
- }
1189
- }
1190
- }
1191
- appender.init(appenderConfig, formatter, filters);
1176
+ const appender = this._createAndInitAppender(appenderConfigOrName);
1192
1177
  this._appenders.push(appender);
1193
1178
  }
1194
1179
  this._sortAppenders();
@@ -1295,7 +1280,7 @@ var LogM8 = class {
1295
1280
  this.getLogger(logger).setLevel(levelStr);
1296
1281
  } else {
1297
1282
  this._globalLogLevel = this._logLevelSet.has(levelStr) ? levelStr : this._globalLogLevel;
1298
- this._globalLogLevelNumber = this._logLevelValues.indexOf(this._globalLogLevel);
1283
+ this._globalLogLevelNumber = this._logLevelIndexMap.get(this._globalLogLevel);
1299
1284
  }
1300
1285
  }
1301
1286
  /**
@@ -1318,6 +1303,101 @@ var LogM8 = class {
1318
1303
  if (!appender) return;
1319
1304
  appender.enabled = false;
1320
1305
  }
1306
+ /**
1307
+ * Adds an appender to the logging system at runtime.
1308
+ *
1309
+ * Creates and initializes the appender using the plugin factory system,
1310
+ * including any configured formatter and filters. The appender is inserted
1311
+ * into the priority-sorted appender list and immediately begins receiving
1312
+ * log events.
1313
+ *
1314
+ * Must be called after init(). The appender name must not already be in use.
1315
+ *
1316
+ * @param config - Appender name (string) or full configuration object
1317
+ *
1318
+ * @throws {Error} When called before init()
1319
+ * @throws {Error} When an appender with the same name already exists
1320
+ * @throws {Error} When the referenced plugin factory is not registered
1321
+ *
1322
+ * @example
1323
+ * ```typescript
1324
+ * // Add by name (uses factory defaults)
1325
+ * Logging.addAppender('console');
1326
+ *
1327
+ * // Add with full configuration
1328
+ * Logging.addAppender({
1329
+ * name: 'file',
1330
+ * filename: 'debug.log',
1331
+ * formatter: 'json-formatter',
1332
+ * filters: ['sensitive-data'],
1333
+ * priority: 10
1334
+ * });
1335
+ * ```
1336
+ */
1337
+ addAppender(config) {
1338
+ if (!this._initialized) {
1339
+ throw new Error("LogM8: Cannot add appender before init()");
1340
+ }
1341
+ const name = typeof config === "string" ? config : config.name;
1342
+ if (this._getAppender(name)) {
1343
+ throw new Error(`LogM8: Appender '${name}' already exists`);
1344
+ }
1345
+ const appender = this._createAndInitAppender(config);
1346
+ this._appenders.push(appender);
1347
+ this._sortAppenders();
1348
+ }
1349
+ /**
1350
+ * Removes an appender from the logging system at runtime.
1351
+ *
1352
+ * Flushes any buffered output, disposes the appender, and removes it
1353
+ * from the active appender list. The appender will no longer receive
1354
+ * log events after removal.
1355
+ *
1356
+ * @param name - Name of the appender to remove
1357
+ * @returns True if the appender was found and removed, false otherwise
1358
+ *
1359
+ * @example
1360
+ * ```typescript
1361
+ * // Remove a dynamically added appender
1362
+ * Logging.removeAppender('file');
1363
+ *
1364
+ * // Check if removal succeeded
1365
+ * if (!Logging.removeAppender('unknown')) {
1366
+ * console.warn('Appender not found');
1367
+ * }
1368
+ * ```
1369
+ */
1370
+ removeAppender(name) {
1371
+ const appender = this._getAppender(name);
1372
+ if (!appender) return false;
1373
+ try {
1374
+ appender.flush();
1375
+ } catch (err) {
1376
+ if (console && console.error) {
1377
+ console.error(`LogM8: Failed to flush appender during removal: ${appender.name}:`, err);
1378
+ }
1379
+ }
1380
+ appender.dispose();
1381
+ this._appenders = this._appenders.filter((a) => a !== appender);
1382
+ return true;
1383
+ }
1384
+ /**
1385
+ * Returns the names of all currently registered appenders.
1386
+ *
1387
+ * The returned array is a snapshot; modifications to it do not affect
1388
+ * the logging system. Names are in priority-sorted order (highest first).
1389
+ *
1390
+ * @returns Array of appender names
1391
+ *
1392
+ * @example
1393
+ * ```typescript
1394
+ * const names = Logging.getAppenderNames();
1395
+ * console.log('Active appenders:', names); // ['console', 'file']
1396
+ * ```
1397
+ */
1398
+ getAppenderNames() {
1399
+ return this._appenders.map((a) => a.name);
1400
+ }
1321
1401
  /**
1322
1402
  * Forces an appender to flush any buffered output.
1323
1403
  *
@@ -1426,9 +1506,10 @@ var LogM8 = class {
1426
1506
  registerPluginFactory(pluginFactory) {
1427
1507
  this._pluginManager.registerPluginFactory(pluginFactory);
1428
1508
  }
1429
- _log(logger, level, message, ...data) {
1430
- const levelNumber = this._logLevelValues.indexOf(level);
1509
+ _log(logger, level, message) {
1510
+ const levelNumber = this._logLevelIndexMap.get(level);
1431
1511
  if (levelNumber > logger._levelNumber || levelNumber > this._globalLogLevelNumber) return;
1512
+ const data = arguments.length > 3 ? Array.prototype.slice.call(arguments, 3) : [];
1432
1513
  const logEvent = {
1433
1514
  logger: logger.name,
1434
1515
  level,
@@ -1455,16 +1536,16 @@ var LogM8 = class {
1455
1536
  _setLevel(logger, level) {
1456
1537
  const levelStr = (level ?? "").trim().toLowerCase();
1457
1538
  logger.level = this._logLevelSet.has(levelStr) ? levelStr : logger.level;
1458
- logger._levelNumber = this._logLevelValues.indexOf(logger.level);
1539
+ logger._levelNumber = this._logLevelIndexMap.get(logger.level);
1459
1540
  logger.isEnabled = logger.level !== LogLevel.off;
1460
1541
  const levelNumber = logger._levelNumber;
1461
- logger.isFatal = this._logLevelValues.indexOf(LogLevel.fatal) <= levelNumber;
1462
- logger.isError = this._logLevelValues.indexOf(LogLevel.error) <= levelNumber;
1463
- logger.isWarn = this._logLevelValues.indexOf(LogLevel.warn) <= levelNumber;
1464
- logger.isInfo = this._logLevelValues.indexOf(LogLevel.info) <= levelNumber;
1465
- logger.isDebug = this._logLevelValues.indexOf(LogLevel.debug) <= levelNumber;
1466
- logger.isTrack = this._logLevelValues.indexOf(LogLevel.track) <= levelNumber;
1467
- logger.isTrace = this._logLevelValues.indexOf(LogLevel.trace) <= levelNumber;
1542
+ logger.isFatal = this._logLevelIndexMap.get(LogLevel.fatal) <= levelNumber;
1543
+ logger.isError = this._logLevelIndexMap.get(LogLevel.error) <= levelNumber;
1544
+ logger.isWarn = this._logLevelIndexMap.get(LogLevel.warn) <= levelNumber;
1545
+ logger.isInfo = this._logLevelIndexMap.get(LogLevel.info) <= levelNumber;
1546
+ logger.isDebug = this._logLevelIndexMap.get(LogLevel.debug) <= levelNumber;
1547
+ logger.isTrack = this._logLevelIndexMap.get(LogLevel.track) <= levelNumber;
1548
+ logger.isTrace = this._logLevelIndexMap.get(LogLevel.trace) <= levelNumber;
1468
1549
  }
1469
1550
  _setContext(logger, context) {
1470
1551
  logger.context = context ?? {};
@@ -1487,11 +1568,40 @@ var LogM8 = class {
1487
1568
  }
1488
1569
  }
1489
1570
  }
1571
+ _createAndInitAppender(appenderConfigOrName) {
1572
+ const appender = this._pluginManager.createPlugin(
1573
+ PluginKind.appender,
1574
+ appenderConfigOrName
1575
+ );
1576
+ const appenderConfig = LogM8Utils.isString(appenderConfigOrName) ? {
1577
+ name: appender.name
1578
+ } : appenderConfigOrName;
1579
+ const formatter = appenderConfig?.formatter ? this._pluginManager.createPlugin(
1580
+ PluginKind.formatter,
1581
+ appenderConfig.formatter
1582
+ ) : void 0;
1583
+ const filters = [];
1584
+ const ac = appenderConfig;
1585
+ for (const filterConfig of ac.filters ?? []) {
1586
+ const filter = this._pluginManager.createPlugin(PluginKind.filter, filterConfig);
1587
+ if (filter) {
1588
+ filters.push(filter);
1589
+ } else {
1590
+ if (console && console.log) {
1591
+ console.log(
1592
+ `LogM8: Filter '${filterConfig}' not found for appender ${appenderConfig.name}.`
1593
+ );
1594
+ }
1595
+ }
1596
+ }
1597
+ appender.init(appenderConfig, formatter, filters);
1598
+ return appender;
1599
+ }
1490
1600
  _getAppender(name) {
1491
1601
  return this._appenders.find((a) => a.name === name);
1492
1602
  }
1493
1603
  _sortAppenders() {
1494
- this._appenders.sort((a, b) => {
1604
+ this._appenders = [...this._appenders].sort((a, b) => {
1495
1605
  const aPriority = a?.priority ?? 0;
1496
1606
  const bPriority = b?.priority ?? 0;
1497
1607
  return bPriority - aPriority;
@@ -1509,6 +1619,15 @@ var LogM8 = class {
1509
1619
  }
1510
1620
  };
1511
1621
 
1622
+ // src/_generated/package_info.ts
1623
+ var PACKAGE_INFO = {
1624
+ "name": "@ncoderz/log-m8",
1625
+ "version": "1.3.0",
1626
+ "author": "RA Sewell <richard.sewell@ncoderz.com>",
1627
+ "license": "BSD-2-Clause",
1628
+ "description": "Logging system for TypeScript / JavaScript"
1629
+ };
1630
+
1512
1631
  // src/NullLogger.ts
1513
1632
  var NullLogger = class {
1514
1633
  constructor() {
@@ -1552,10 +1671,16 @@ var NullLogger = class {
1552
1671
  var LogM82 = new LogM8();
1553
1672
  // Annotate the CommonJS export names for ESM import in node:
1554
1673
  0 && (module.exports = {
1674
+ ConsoleAppender,
1675
+ DefaultFormatter,
1676
+ FileAppender,
1677
+ JsonFormatter,
1555
1678
  LogLevel,
1556
1679
  LogM8,
1557
1680
  LogM8Utils,
1681
+ MatchFilter,
1558
1682
  NullLogger,
1683
+ PACKAGE_INFO,
1559
1684
  PluginKind
1560
1685
  });
1561
1686
  //# sourceMappingURL=index.cjs.map