@ncoderz/log-m8 1.0.2 → 1.2.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.d.ts CHANGED
@@ -521,13 +521,14 @@ interface PluginFactory<C extends PluginConfig = PluginConfig, P extends Plugin
521
521
  * Logging.flushAppenders();
522
522
  * ```
523
523
  */
524
- declare class LogM8 {
524
+ declare class LogM8$1 {
525
525
  private _initialized;
526
526
  private _pluginManager;
527
527
  private _loggers;
528
528
  private _appenders;
529
529
  private _filters;
530
- private _defaultLevel;
530
+ private _globalLogLevel;
531
+ private _globalLogLevelNumber;
531
532
  private _logLevelValues;
532
533
  private _logLevelSet;
533
534
  private _logBuffer;
@@ -601,6 +602,13 @@ declare class LogM8 {
601
602
  * ```
602
603
  */
603
604
  getLogger(name: string | string[]): Log;
605
+ /**
606
+ * Sets the global logging level or a specific logger's level.
607
+ *
608
+ * @param level - New logging level name (e.g., 'info', 'debug', 'off')
609
+ * @param logger - Optional logger name to set level for a specific logger
610
+ */
611
+ setLevel(level: LogLevelType, logger?: string): void;
604
612
  /**
605
613
  * Enables an appender to resume processing log events.
606
614
  *
@@ -1251,6 +1259,14 @@ declare class LogM8Utils {
1251
1259
  * }
1252
1260
  */
1253
1261
  static serializeError(error: unknown): SerializedError | null;
1262
+ /**
1263
+ * Take a regex in the format /regex/flags and parse it into a RegExp object
1264
+ *
1265
+ * @param regex regex in the format /regex/flags
1266
+ * @param extraFlags additional flags to apply to the regex
1267
+ * @returns RegExp object or undefined if the regex is invalid
1268
+ */
1269
+ static parseRegexFromString(regex: string, extraFlags?: string[]): RegExp | undefined;
1254
1270
  }
1255
1271
 
1256
1272
  /**
@@ -1261,16 +1277,16 @@ declare class LogM8Utils {
1261
1277
  *
1262
1278
  * @example
1263
1279
  * ```typescript
1264
- * import { Logging } from 'log-m8';
1280
+ * import { LogM8 } from 'log-m8';
1265
1281
  *
1266
1282
  * // Initialize with default console output
1267
- * Logging.init();
1283
+ * LogM8.init();
1268
1284
  *
1269
1285
  * // Get a logger and start logging
1270
- * const logger = Logging.getLogger('app');
1286
+ * const logger = LogM8.getLogger('app');
1271
1287
  * logger.info('Application started');
1272
1288
  * ```
1273
1289
  */
1274
- declare const Logging: LogM8;
1290
+ declare const LogM8: LogM8$1;
1275
1291
 
1276
- export { type Appender, type AppenderConfig, type ConsoleAppenderConfig, type DefaultFormatterConfig, type FileAppenderConfig, type Filter, type FilterConfig, type Formatter, type FormatterConfig, type Log, type LogContext, LogLevel, type LogLevelType, LogM8Utils, Logging, type LoggingConfig, type MatchFilterConfig, type Plugin, type PluginConfig, type PluginFactory, PluginKind, type PluginKindType };
1292
+ export { type Appender, type AppenderConfig, type ConsoleAppenderConfig, type DefaultFormatterConfig, type FileAppenderConfig, type Filter, type FilterConfig, type Formatter, type FormatterConfig, type Log, type LogContext, LogLevel, type LogLevelType, LogM8, LogM8Utils, type LoggingConfig, type MatchFilterConfig, type Plugin, type PluginConfig, type PluginFactory, PluginKind, type PluginKindType };
package/dist/index.js CHANGED
@@ -117,6 +117,7 @@ import { createWriteStream } from "fs";
117
117
 
118
118
  // src/LogM8Utils.ts
119
119
  var TIMESTAMP_TOKEN_REGEX = /(yyyy|SSS|hh|mm|ss|SS|zz|z|yy|MM|dd|A|a|h|S)/g;
120
+ var REGEX_MATCHER = /^\/(.+)\/([dgimsuvy]*)$/;
120
121
  var EXCLUDED_ERROR_KEYS = /* @__PURE__ */ new Set(["name", "message", "stack", "cause"]);
121
122
  var COMMON_NON_ENUMERABLE_PROPS = ["code", "errno", "syscall", "path"];
122
123
  var LogM8Utils = class _LogM8Utils {
@@ -512,6 +513,31 @@ var LogM8Utils = class _LogM8Utils {
512
513
  };
513
514
  return serializeErrorInternal(error, /* @__PURE__ */ new WeakSet());
514
515
  }
516
+ /**
517
+ * Take a regex in the format /regex/flags and parse it into a RegExp object
518
+ *
519
+ * @param regex regex in the format /regex/flags
520
+ * @param extraFlags additional flags to apply to the regex
521
+ * @returns RegExp object or undefined if the regex is invalid
522
+ */
523
+ static parseRegexFromString(regex, extraFlags) {
524
+ try {
525
+ const match = regex.match(REGEX_MATCHER);
526
+ if (match == null) return void 0;
527
+ const [, pattern, flags] = match;
528
+ let finalFlags = flags;
529
+ if (Array.isArray(extraFlags)) {
530
+ for (const flag of extraFlags) {
531
+ if (!flags.includes(flag)) {
532
+ finalFlags += flag;
533
+ }
534
+ }
535
+ }
536
+ return new RegExp(pattern, finalFlags);
537
+ } catch (_e) {
538
+ return void 0;
539
+ }
540
+ }
515
541
  };
516
542
 
517
543
  // src/appenders/FileAppender.ts
@@ -612,8 +638,8 @@ var MatchFilter = class {
612
638
  */
613
639
  init(config) {
614
640
  const cfg = config ?? {};
615
- this._allow = cfg.allow ?? void 0;
616
- this._deny = cfg.deny ?? void 0;
641
+ this._allow = this._prepareRules(cfg.allow);
642
+ this._deny = this._prepareRules(cfg.deny);
617
643
  this.enabled = cfg.enabled !== false;
618
644
  }
619
645
  dispose() {
@@ -631,13 +657,13 @@ var MatchFilter = class {
631
657
  if (this._allow && Object.keys(this._allow).length > 0) {
632
658
  for (const [path, expected] of Object.entries(this._allow)) {
633
659
  const actual = LogM8Utils.getPropertyByPath(logEvent, path);
634
- if (!this._isEqual(actual, expected)) return false;
660
+ if (!this._matches(actual, expected)) return false;
635
661
  }
636
662
  }
637
663
  if (this._deny && Object.keys(this._deny).length > 0) {
638
664
  for (const [path, expected] of Object.entries(this._deny)) {
639
665
  const actual = LogM8Utils.getPropertyByPath(logEvent, path);
640
- if (this._isEqual(actual, expected)) return false;
666
+ if (this._matches(actual, expected)) return false;
641
667
  }
642
668
  }
643
669
  return true;
@@ -645,6 +671,15 @@ var MatchFilter = class {
645
671
  return false;
646
672
  }
647
673
  }
674
+ // Matches actual against expected, supporting RegExp; otherwise deep equality.
675
+ _matches(actual, expected) {
676
+ if (expected instanceof RegExp) {
677
+ if (actual === void 0 || actual === null) return false;
678
+ const asString = typeof actual === "string" ? actual : String(actual);
679
+ return expected.test(asString);
680
+ }
681
+ return this._isEqual(actual, expected);
682
+ }
648
683
  // Simple deep equality for primitives, arrays, plain objects, dates
649
684
  _isEqual(a, b) {
650
685
  if (a === b) return true;
@@ -675,6 +710,20 @@ var MatchFilter = class {
675
710
  _isPlainObject(val) {
676
711
  return typeof val === "object" && val !== null && !Array.isArray(val) && Object.getPrototypeOf(val) === Object.prototype;
677
712
  }
713
+ // Convert rule map values: regex-like strings -> RegExp; leave others as-is.
714
+ _prepareRules(map) {
715
+ if (!map || Object.keys(map).length === 0) return void 0;
716
+ const prepared = {};
717
+ for (const [path, val] of Object.entries(map)) {
718
+ if (typeof val === "string") {
719
+ const rx = LogM8Utils.parseRegexFromString(val);
720
+ prepared[path] = rx ?? val;
721
+ } else {
722
+ prepared[path] = val;
723
+ }
724
+ }
725
+ return prepared;
726
+ }
678
727
  };
679
728
  var MatchFilterFactory = class {
680
729
  constructor() {
@@ -1000,16 +1049,27 @@ var DEFAULT_APPENDERS = [
1000
1049
  ];
1001
1050
  var LogM8 = class {
1002
1051
  constructor() {
1003
- __publicField(this, "_initialized", false);
1004
- __publicField(this, "_pluginManager", new PluginManager());
1005
- __publicField(this, "_loggers", /* @__PURE__ */ new Map());
1006
- __publicField(this, "_appenders", []);
1052
+ __publicField(this, "_initialized");
1053
+ __publicField(this, "_pluginManager");
1054
+ __publicField(this, "_loggers");
1055
+ __publicField(this, "_appenders");
1007
1056
  __publicField(this, "_filters", []);
1008
- __publicField(this, "_defaultLevel", LogLevel.info);
1009
- __publicField(this, "_logLevelValues", Object.values(LogLevel));
1010
- __publicField(this, "_logLevelSet", new Set(this._logLevelValues));
1057
+ __publicField(this, "_globalLogLevel");
1058
+ __publicField(this, "_globalLogLevelNumber");
1059
+ __publicField(this, "_logLevelValues");
1060
+ __publicField(this, "_logLevelSet");
1011
1061
  // Buffer for log events before the system is initialized
1012
- __publicField(this, "_logBuffer", []);
1062
+ __publicField(this, "_logBuffer");
1063
+ this._initialized = false;
1064
+ this._pluginManager = new PluginManager();
1065
+ this._loggers = /* @__PURE__ */ new Map();
1066
+ this._appenders = [];
1067
+ this._filters = [];
1068
+ this._logLevelValues = Object.values(LogLevel);
1069
+ this._logLevelSet = new Set(this._logLevelValues);
1070
+ this._globalLogLevel = LogLevel.info;
1071
+ this._globalLogLevelNumber = this._logLevelValues.indexOf(LogLevel.info);
1072
+ this._logBuffer = [];
1013
1073
  this._pluginManager.registerPluginFactory(new ConsoleAppenderFactory());
1014
1074
  this._pluginManager.registerPluginFactory(new FileAppenderFactory());
1015
1075
  this._pluginManager.registerPluginFactory(new DefaultFormatterFactory());
@@ -1046,10 +1106,10 @@ var LogM8 = class {
1046
1106
  init(config) {
1047
1107
  config = Object.assign({}, config);
1048
1108
  this._reset();
1049
- this._defaultLevel = this._logLevelSet.has(config.level) ? config.level : LogLevel.info;
1109
+ this._globalLogLevel = this._logLevelSet.has(config.level) ? config.level : LogLevel.info;
1050
1110
  for (const [name, level] of Object.entries(config.loggers ?? {})) {
1051
1111
  const logger = this.getLogger(name);
1052
- const l = this._logLevelSet.has(level) ? level : this._defaultLevel;
1112
+ const l = this._logLevelSet.has(level) ? level : this._globalLogLevel;
1053
1113
  logger.setLevel(l);
1054
1114
  }
1055
1115
  const appenderConfigs = config.appenders ?? DEFAULT_APPENDERS;
@@ -1146,7 +1206,7 @@ var LogM8 = class {
1146
1206
  if (existingLogger) return existingLogger;
1147
1207
  const logger = {
1148
1208
  name: nameStr,
1149
- level: this._defaultLevel,
1209
+ level: this._globalLogLevel,
1150
1210
  context: {}
1151
1211
  };
1152
1212
  logger.fatal = this._log.bind(this, logger, LogLevel.fatal);
@@ -1159,10 +1219,24 @@ var LogM8 = class {
1159
1219
  logger.setLevel = this._setLevel.bind(this, logger);
1160
1220
  logger.setContext = this._setContext.bind(this, logger);
1161
1221
  logger.getLogger = (name2) => this.getLogger([logger.name, name2]);
1162
- this._setLevel(logger, this._defaultLevel);
1222
+ this._setLevel(logger, this._globalLogLevel);
1163
1223
  this._loggers.set(logger.name, logger);
1164
1224
  return logger;
1165
1225
  }
1226
+ /**
1227
+ * Sets the global logging level or a specific logger's level.
1228
+ *
1229
+ * @param level - New logging level name (e.g., 'info', 'debug', 'off')
1230
+ * @param logger - Optional logger name to set level for a specific logger
1231
+ */
1232
+ setLevel(level, logger) {
1233
+ if (logger) {
1234
+ this.getLogger(logger).setLevel(level);
1235
+ } else {
1236
+ this._globalLogLevel = this._logLevelSet.has(level) ? level : this._globalLogLevel;
1237
+ this._globalLogLevelNumber = this._logLevelValues.indexOf(this._globalLogLevel);
1238
+ }
1239
+ }
1166
1240
  /**
1167
1241
  * Enables an appender to resume processing log events.
1168
1242
  *
@@ -1293,7 +1367,7 @@ var LogM8 = class {
1293
1367
  }
1294
1368
  _log(logger, level, message, ...data) {
1295
1369
  const levelNumber = this._logLevelValues.indexOf(level);
1296
- if (levelNumber > logger._levelNumber) return;
1370
+ if (levelNumber > logger._levelNumber || levelNumber > this._globalLogLevelNumber) return;
1297
1371
  const logEvent = {
1298
1372
  logger: logger.name,
1299
1373
  level,
@@ -1318,9 +1392,9 @@ var LogM8 = class {
1318
1392
  }
1319
1393
  }
1320
1394
  _setLevel(logger, level) {
1321
- logger.level = level;
1395
+ logger.level = this._logLevelSet.has(level) ? level : logger.level;
1322
1396
  logger._levelNumber = this._logLevelValues.indexOf(level);
1323
- logger.isEnabled = level !== LogLevel.off;
1397
+ logger.isEnabled = logger.level !== LogLevel.off;
1324
1398
  const levelNumber = logger._levelNumber;
1325
1399
  logger.isFatal = this._logLevelValues.indexOf(LogLevel.fatal) <= levelNumber;
1326
1400
  logger.isError = this._logLevelValues.indexOf(LogLevel.error) <= levelNumber;
@@ -1368,17 +1442,17 @@ var LogM8 = class {
1368
1442
  this.flushAppenders();
1369
1443
  this._appenders = [];
1370
1444
  this._loggers.clear();
1371
- this._defaultLevel = LogLevel.info;
1445
+ this._globalLogLevel = LogLevel.info;
1372
1446
  this._pluginManager.disposePlugins();
1373
1447
  }
1374
1448
  };
1375
1449
 
1376
1450
  // src/index.ts
1377
- var Logging = new LogM8();
1451
+ var LogM82 = new LogM8();
1378
1452
  export {
1379
1453
  LogLevel,
1454
+ LogM82 as LogM8,
1380
1455
  LogM8Utils,
1381
- Logging,
1382
1456
  PluginKind
1383
1457
  };
1384
1458
  //# sourceMappingURL=index.js.map