@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.cjs CHANGED
@@ -23,8 +23,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
23
23
  var index_exports = {};
24
24
  __export(index_exports, {
25
25
  LogLevel: () => LogLevel,
26
+ LogM8: () => LogM82,
26
27
  LogM8Utils: () => LogM8Utils,
27
- Logging: () => Logging,
28
28
  PluginKind: () => PluginKind
29
29
  });
30
30
  module.exports = __toCommonJS(index_exports);
@@ -144,6 +144,7 @@ var import_fs = require("fs");
144
144
 
145
145
  // src/LogM8Utils.ts
146
146
  var TIMESTAMP_TOKEN_REGEX = /(yyyy|SSS|hh|mm|ss|SS|zz|z|yy|MM|dd|A|a|h|S)/g;
147
+ var REGEX_MATCHER = /^\/(.+)\/([dgimsuvy]*)$/;
147
148
  var EXCLUDED_ERROR_KEYS = /* @__PURE__ */ new Set(["name", "message", "stack", "cause"]);
148
149
  var COMMON_NON_ENUMERABLE_PROPS = ["code", "errno", "syscall", "path"];
149
150
  var LogM8Utils = class _LogM8Utils {
@@ -539,6 +540,31 @@ var LogM8Utils = class _LogM8Utils {
539
540
  };
540
541
  return serializeErrorInternal(error, /* @__PURE__ */ new WeakSet());
541
542
  }
543
+ /**
544
+ * Take a regex in the format /regex/flags and parse it into a RegExp object
545
+ *
546
+ * @param regex regex in the format /regex/flags
547
+ * @param extraFlags additional flags to apply to the regex
548
+ * @returns RegExp object or undefined if the regex is invalid
549
+ */
550
+ static parseRegexFromString(regex, extraFlags) {
551
+ try {
552
+ const match = regex.match(REGEX_MATCHER);
553
+ if (match == null) return void 0;
554
+ const [, pattern, flags] = match;
555
+ let finalFlags = flags;
556
+ if (Array.isArray(extraFlags)) {
557
+ for (const flag of extraFlags) {
558
+ if (!flags.includes(flag)) {
559
+ finalFlags += flag;
560
+ }
561
+ }
562
+ }
563
+ return new RegExp(pattern, finalFlags);
564
+ } catch (_e) {
565
+ return void 0;
566
+ }
567
+ }
542
568
  };
543
569
 
544
570
  // src/appenders/FileAppender.ts
@@ -639,8 +665,8 @@ var MatchFilter = class {
639
665
  */
640
666
  init(config) {
641
667
  const cfg = config ?? {};
642
- this._allow = cfg.allow ?? void 0;
643
- this._deny = cfg.deny ?? void 0;
668
+ this._allow = this._prepareRules(cfg.allow);
669
+ this._deny = this._prepareRules(cfg.deny);
644
670
  this.enabled = cfg.enabled !== false;
645
671
  }
646
672
  dispose() {
@@ -658,13 +684,13 @@ var MatchFilter = class {
658
684
  if (this._allow && Object.keys(this._allow).length > 0) {
659
685
  for (const [path, expected] of Object.entries(this._allow)) {
660
686
  const actual = LogM8Utils.getPropertyByPath(logEvent, path);
661
- if (!this._isEqual(actual, expected)) return false;
687
+ if (!this._matches(actual, expected)) return false;
662
688
  }
663
689
  }
664
690
  if (this._deny && Object.keys(this._deny).length > 0) {
665
691
  for (const [path, expected] of Object.entries(this._deny)) {
666
692
  const actual = LogM8Utils.getPropertyByPath(logEvent, path);
667
- if (this._isEqual(actual, expected)) return false;
693
+ if (this._matches(actual, expected)) return false;
668
694
  }
669
695
  }
670
696
  return true;
@@ -672,6 +698,15 @@ var MatchFilter = class {
672
698
  return false;
673
699
  }
674
700
  }
701
+ // Matches actual against expected, supporting RegExp; otherwise deep equality.
702
+ _matches(actual, expected) {
703
+ if (expected instanceof RegExp) {
704
+ if (actual === void 0 || actual === null) return false;
705
+ const asString = typeof actual === "string" ? actual : String(actual);
706
+ return expected.test(asString);
707
+ }
708
+ return this._isEqual(actual, expected);
709
+ }
675
710
  // Simple deep equality for primitives, arrays, plain objects, dates
676
711
  _isEqual(a, b) {
677
712
  if (a === b) return true;
@@ -702,6 +737,20 @@ var MatchFilter = class {
702
737
  _isPlainObject(val) {
703
738
  return typeof val === "object" && val !== null && !Array.isArray(val) && Object.getPrototypeOf(val) === Object.prototype;
704
739
  }
740
+ // Convert rule map values: regex-like strings -> RegExp; leave others as-is.
741
+ _prepareRules(map) {
742
+ if (!map || Object.keys(map).length === 0) return void 0;
743
+ const prepared = {};
744
+ for (const [path, val] of Object.entries(map)) {
745
+ if (typeof val === "string") {
746
+ const rx = LogM8Utils.parseRegexFromString(val);
747
+ prepared[path] = rx ?? val;
748
+ } else {
749
+ prepared[path] = val;
750
+ }
751
+ }
752
+ return prepared;
753
+ }
705
754
  };
706
755
  var MatchFilterFactory = class {
707
756
  constructor() {
@@ -1027,16 +1076,27 @@ var DEFAULT_APPENDERS = [
1027
1076
  ];
1028
1077
  var LogM8 = class {
1029
1078
  constructor() {
1030
- __publicField(this, "_initialized", false);
1031
- __publicField(this, "_pluginManager", new PluginManager());
1032
- __publicField(this, "_loggers", /* @__PURE__ */ new Map());
1033
- __publicField(this, "_appenders", []);
1079
+ __publicField(this, "_initialized");
1080
+ __publicField(this, "_pluginManager");
1081
+ __publicField(this, "_loggers");
1082
+ __publicField(this, "_appenders");
1034
1083
  __publicField(this, "_filters", []);
1035
- __publicField(this, "_defaultLevel", LogLevel.info);
1036
- __publicField(this, "_logLevelValues", Object.values(LogLevel));
1037
- __publicField(this, "_logLevelSet", new Set(this._logLevelValues));
1084
+ __publicField(this, "_globalLogLevel");
1085
+ __publicField(this, "_globalLogLevelNumber");
1086
+ __publicField(this, "_logLevelValues");
1087
+ __publicField(this, "_logLevelSet");
1038
1088
  // Buffer for log events before the system is initialized
1039
- __publicField(this, "_logBuffer", []);
1089
+ __publicField(this, "_logBuffer");
1090
+ this._initialized = false;
1091
+ this._pluginManager = new PluginManager();
1092
+ this._loggers = /* @__PURE__ */ new Map();
1093
+ this._appenders = [];
1094
+ this._filters = [];
1095
+ this._logLevelValues = Object.values(LogLevel);
1096
+ this._logLevelSet = new Set(this._logLevelValues);
1097
+ this._globalLogLevel = LogLevel.info;
1098
+ this._globalLogLevelNumber = this._logLevelValues.indexOf(LogLevel.info);
1099
+ this._logBuffer = [];
1040
1100
  this._pluginManager.registerPluginFactory(new ConsoleAppenderFactory());
1041
1101
  this._pluginManager.registerPluginFactory(new FileAppenderFactory());
1042
1102
  this._pluginManager.registerPluginFactory(new DefaultFormatterFactory());
@@ -1073,10 +1133,10 @@ var LogM8 = class {
1073
1133
  init(config) {
1074
1134
  config = Object.assign({}, config);
1075
1135
  this._reset();
1076
- this._defaultLevel = this._logLevelSet.has(config.level) ? config.level : LogLevel.info;
1136
+ this._globalLogLevel = this._logLevelSet.has(config.level) ? config.level : LogLevel.info;
1077
1137
  for (const [name, level] of Object.entries(config.loggers ?? {})) {
1078
1138
  const logger = this.getLogger(name);
1079
- const l = this._logLevelSet.has(level) ? level : this._defaultLevel;
1139
+ const l = this._logLevelSet.has(level) ? level : this._globalLogLevel;
1080
1140
  logger.setLevel(l);
1081
1141
  }
1082
1142
  const appenderConfigs = config.appenders ?? DEFAULT_APPENDERS;
@@ -1173,7 +1233,7 @@ var LogM8 = class {
1173
1233
  if (existingLogger) return existingLogger;
1174
1234
  const logger = {
1175
1235
  name: nameStr,
1176
- level: this._defaultLevel,
1236
+ level: this._globalLogLevel,
1177
1237
  context: {}
1178
1238
  };
1179
1239
  logger.fatal = this._log.bind(this, logger, LogLevel.fatal);
@@ -1186,10 +1246,24 @@ var LogM8 = class {
1186
1246
  logger.setLevel = this._setLevel.bind(this, logger);
1187
1247
  logger.setContext = this._setContext.bind(this, logger);
1188
1248
  logger.getLogger = (name2) => this.getLogger([logger.name, name2]);
1189
- this._setLevel(logger, this._defaultLevel);
1249
+ this._setLevel(logger, this._globalLogLevel);
1190
1250
  this._loggers.set(logger.name, logger);
1191
1251
  return logger;
1192
1252
  }
1253
+ /**
1254
+ * Sets the global logging level or a specific logger's level.
1255
+ *
1256
+ * @param level - New logging level name (e.g., 'info', 'debug', 'off')
1257
+ * @param logger - Optional logger name to set level for a specific logger
1258
+ */
1259
+ setLevel(level, logger) {
1260
+ if (logger) {
1261
+ this.getLogger(logger).setLevel(level);
1262
+ } else {
1263
+ this._globalLogLevel = this._logLevelSet.has(level) ? level : this._globalLogLevel;
1264
+ this._globalLogLevelNumber = this._logLevelValues.indexOf(this._globalLogLevel);
1265
+ }
1266
+ }
1193
1267
  /**
1194
1268
  * Enables an appender to resume processing log events.
1195
1269
  *
@@ -1320,7 +1394,7 @@ var LogM8 = class {
1320
1394
  }
1321
1395
  _log(logger, level, message, ...data) {
1322
1396
  const levelNumber = this._logLevelValues.indexOf(level);
1323
- if (levelNumber > logger._levelNumber) return;
1397
+ if (levelNumber > logger._levelNumber || levelNumber > this._globalLogLevelNumber) return;
1324
1398
  const logEvent = {
1325
1399
  logger: logger.name,
1326
1400
  level,
@@ -1345,9 +1419,9 @@ var LogM8 = class {
1345
1419
  }
1346
1420
  }
1347
1421
  _setLevel(logger, level) {
1348
- logger.level = level;
1422
+ logger.level = this._logLevelSet.has(level) ? level : logger.level;
1349
1423
  logger._levelNumber = this._logLevelValues.indexOf(level);
1350
- logger.isEnabled = level !== LogLevel.off;
1424
+ logger.isEnabled = logger.level !== LogLevel.off;
1351
1425
  const levelNumber = logger._levelNumber;
1352
1426
  logger.isFatal = this._logLevelValues.indexOf(LogLevel.fatal) <= levelNumber;
1353
1427
  logger.isError = this._logLevelValues.indexOf(LogLevel.error) <= levelNumber;
@@ -1395,18 +1469,18 @@ var LogM8 = class {
1395
1469
  this.flushAppenders();
1396
1470
  this._appenders = [];
1397
1471
  this._loggers.clear();
1398
- this._defaultLevel = LogLevel.info;
1472
+ this._globalLogLevel = LogLevel.info;
1399
1473
  this._pluginManager.disposePlugins();
1400
1474
  }
1401
1475
  };
1402
1476
 
1403
1477
  // src/index.ts
1404
- var Logging = new LogM8();
1478
+ var LogM82 = new LogM8();
1405
1479
  // Annotate the CommonJS export names for ESM import in node:
1406
1480
  0 && (module.exports = {
1407
1481
  LogLevel,
1482
+ LogM8,
1408
1483
  LogM8Utils,
1409
- Logging,
1410
1484
  PluginKind
1411
1485
  });
1412
1486
  //# sourceMappingURL=index.cjs.map