@splitsoftware/splitio-commons 2.6.1-rc.0 → 2.7.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/CHANGES.txt CHANGED
@@ -1,4 +1,4 @@
1
- 2.7.0 (October XX, 2025)
1
+ 2.7.0 (October 7, 2025)
2
2
  - Added support for custom loggers: added `logger` configuration option and `LoggerAPI.setLogger` method to allow the SDK to use a custom logger.
3
3
 
4
4
  2.6.0 (September 18, 2025)
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Logger = exports._sprintf = exports.isLogLevelString = exports.LogLevels = void 0;
3
+ exports.Logger = exports._sprintf = exports.isLogLevelString = exports.DEFAULT_LOGGER = exports.LogLevels = void 0;
4
4
  var objectAssign_1 = require("../utils/lang/objectAssign");
5
5
  var lang_1 = require("../utils/lang");
6
6
  var commons_1 = require("../utils/settingsValidation/logger/commons");
@@ -18,6 +18,12 @@ var LogLevelIndexes = {
18
18
  ERROR: 4,
19
19
  NONE: 5
20
20
  };
21
+ exports.DEFAULT_LOGGER = {
22
+ debug: function (msg) { console.log('[DEBUG] ' + msg); },
23
+ info: function (msg) { console.log('[INFO] ' + msg); },
24
+ warn: function (msg) { console.log('[WARN] ' + msg); },
25
+ error: function (msg) { console.log('[ERROR] ' + msg); }
26
+ };
21
27
  function isLogLevelString(str) {
22
28
  return !!(0, lang_1.find)(exports.LogLevels, function (lvl) { return str === lvl; });
23
29
  }
@@ -42,7 +48,6 @@ exports._sprintf = _sprintf;
42
48
  var defaultOptions = {
43
49
  prefix: 'splitio',
44
50
  logLevel: exports.LogLevels.NONE,
45
- showLevel: true,
46
51
  };
47
52
  var Logger = /** @class */ (function () {
48
53
  function Logger(options, codes) {
@@ -55,31 +60,38 @@ var Logger = /** @class */ (function () {
55
60
  this.logLevel = LogLevelIndexes[logLevel];
56
61
  };
57
62
  Logger.prototype.setLogger = function (logger) {
58
- if (!logger || (0, commons_1.isLogger)(logger)) {
59
- this.logger = logger;
60
- }
61
- else {
62
- this._log(exports.LogLevels.ERROR, 'Invalid `logger` instance. It must be an object with `debug`, `info`, `warn` and `error` methods. Defaulting to `console.log`');
63
- this.logger = undefined;
63
+ if (logger) {
64
+ if ((0, commons_1.isLogger)(logger)) {
65
+ this.logger = logger;
66
+ // If custom logger is set, all logs are either enabled or disabled
67
+ if (this.logLevel !== LogLevelIndexes.NONE)
68
+ this.setLogLevel(exports.LogLevels.DEBUG);
69
+ return;
70
+ }
71
+ else {
72
+ this.error('Invalid `logger` instance. It must be an object with `debug`, `info`, `warn` and `error` methods. Defaulting to `console.log`');
73
+ }
64
74
  }
75
+ // unset
76
+ this.logger = undefined;
65
77
  };
66
78
  Logger.prototype.debug = function (msg, args) {
67
79
  if (this._shouldLog(LogLevelIndexes.DEBUG))
68
- this._log(exports.LogLevels.DEBUG, msg, args);
80
+ this._log('debug', msg, args);
69
81
  };
70
82
  Logger.prototype.info = function (msg, args) {
71
83
  if (this._shouldLog(LogLevelIndexes.INFO))
72
- this._log(exports.LogLevels.INFO, msg, args);
84
+ this._log('info', msg, args);
73
85
  };
74
86
  Logger.prototype.warn = function (msg, args) {
75
87
  if (this._shouldLog(LogLevelIndexes.WARN))
76
- this._log(exports.LogLevels.WARN, msg, args);
88
+ this._log('warn', msg, args);
77
89
  };
78
90
  Logger.prototype.error = function (msg, args) {
79
91
  if (this._shouldLog(LogLevelIndexes.ERROR))
80
- this._log(exports.LogLevels.ERROR, msg, args);
92
+ this._log('error', msg, args);
81
93
  };
82
- Logger.prototype._log = function (level, msg, args) {
94
+ Logger.prototype._log = function (method, msg, args) {
83
95
  if (typeof msg === 'number') {
84
96
  var format = this.codes.get(msg);
85
97
  msg = format ? _sprintf(format, args) : "Message code " + msg + (args ? ', with args: ' + args.toString() : '');
@@ -88,27 +100,16 @@ var Logger = /** @class */ (function () {
88
100
  if (args)
89
101
  msg = _sprintf(msg, args);
90
102
  }
91
- var formattedText = this._generateLogMessage(level, msg);
92
- // Do not break on custom logger errors
103
+ if (this.options.prefix)
104
+ msg = this.options.prefix + ' => ' + msg;
93
105
  if (this.logger) {
94
- try { // @ts-expect-error
95
- this.logger[level.toLowerCase()](formattedText);
106
+ try {
107
+ this.logger[method](msg);
96
108
  return;
97
109
  }
98
110
  catch (e) { /* empty */ }
99
111
  }
100
- console.log(formattedText);
101
- };
102
- Logger.prototype._generateLogMessage = function (level, text) {
103
- var textPre = ' => ';
104
- var result = '';
105
- if (this.options.showLevel) {
106
- result += '[' + level + ']' + (level === exports.LogLevels.INFO || level === exports.LogLevels.WARN ? ' ' : '') + ' ';
107
- }
108
- if (this.options.prefix) {
109
- result += this.options.prefix + textPre;
110
- }
111
- return result += text;
112
+ exports.DEFAULT_LOGGER[method](msg);
112
113
  };
113
114
  Logger.prototype._shouldLog = function (level) {
114
115
  return level >= this.logLevel;
@@ -39,9 +39,9 @@ function validateLogger(settings) {
39
39
  var logLevel = debug !== undefined ? (0, commons_1.getLogLevel)(debug) : initialLogLevel;
40
40
  var log = new logger_1.Logger({ logLevel: logLevel || initialLogLevel }, allCodes);
41
41
  log.setLogger(logger);
42
- // @ts-ignore // if logLevel is undefined at this point, it means that settings `debug` value is invalid
42
+ // if logLevel is undefined at this point, it means that settings `debug` value is invalid
43
43
  if (!logLevel)
44
- log._log(logger_1.LogLevels.ERROR, 'Invalid Log Level - No changes to the logs will be applied.');
44
+ log._log('error', 'Invalid Log Level - No changes to the logs will be applied.');
45
45
  return log;
46
46
  }
47
47
  exports.validateLogger = validateLogger;
@@ -27,9 +27,9 @@ function validateLogger(settings) {
27
27
  }
28
28
  var log = new logger_1.Logger({ logLevel: logLevel || initialLogLevel });
29
29
  log.setLogger(logger);
30
- // @ts-ignore // `debug` value is invalid if logLevel is undefined at this point
30
+ // `debug` value is invalid if logLevel is undefined at this point
31
31
  if (!logLevel)
32
- log._log(logger_1.LogLevels.ERROR, 'Invalid `debug` value at config. Logs will be disabled.');
32
+ log._log('error', 'Invalid `debug` value at config. Logs will be disabled.');
33
33
  return log;
34
34
  }
35
35
  exports.validateLogger = validateLogger;
@@ -15,6 +15,12 @@ var LogLevelIndexes = {
15
15
  ERROR: 4,
16
16
  NONE: 5
17
17
  };
18
+ export var DEFAULT_LOGGER = {
19
+ debug: function (msg) { console.log('[DEBUG] ' + msg); },
20
+ info: function (msg) { console.log('[INFO] ' + msg); },
21
+ warn: function (msg) { console.log('[WARN] ' + msg); },
22
+ error: function (msg) { console.log('[ERROR] ' + msg); }
23
+ };
18
24
  export function isLogLevelString(str) {
19
25
  return !!find(LogLevels, function (lvl) { return str === lvl; });
20
26
  }
@@ -37,7 +43,6 @@ export function _sprintf(format, args) {
37
43
  var defaultOptions = {
38
44
  prefix: 'splitio',
39
45
  logLevel: LogLevels.NONE,
40
- showLevel: true,
41
46
  };
42
47
  var Logger = /** @class */ (function () {
43
48
  function Logger(options, codes) {
@@ -50,31 +55,38 @@ var Logger = /** @class */ (function () {
50
55
  this.logLevel = LogLevelIndexes[logLevel];
51
56
  };
52
57
  Logger.prototype.setLogger = function (logger) {
53
- if (!logger || isLogger(logger)) {
54
- this.logger = logger;
55
- }
56
- else {
57
- this._log(LogLevels.ERROR, 'Invalid `logger` instance. It must be an object with `debug`, `info`, `warn` and `error` methods. Defaulting to `console.log`');
58
- this.logger = undefined;
58
+ if (logger) {
59
+ if (isLogger(logger)) {
60
+ this.logger = logger;
61
+ // If custom logger is set, all logs are either enabled or disabled
62
+ if (this.logLevel !== LogLevelIndexes.NONE)
63
+ this.setLogLevel(LogLevels.DEBUG);
64
+ return;
65
+ }
66
+ else {
67
+ this.error('Invalid `logger` instance. It must be an object with `debug`, `info`, `warn` and `error` methods. Defaulting to `console.log`');
68
+ }
59
69
  }
70
+ // unset
71
+ this.logger = undefined;
60
72
  };
61
73
  Logger.prototype.debug = function (msg, args) {
62
74
  if (this._shouldLog(LogLevelIndexes.DEBUG))
63
- this._log(LogLevels.DEBUG, msg, args);
75
+ this._log('debug', msg, args);
64
76
  };
65
77
  Logger.prototype.info = function (msg, args) {
66
78
  if (this._shouldLog(LogLevelIndexes.INFO))
67
- this._log(LogLevels.INFO, msg, args);
79
+ this._log('info', msg, args);
68
80
  };
69
81
  Logger.prototype.warn = function (msg, args) {
70
82
  if (this._shouldLog(LogLevelIndexes.WARN))
71
- this._log(LogLevels.WARN, msg, args);
83
+ this._log('warn', msg, args);
72
84
  };
73
85
  Logger.prototype.error = function (msg, args) {
74
86
  if (this._shouldLog(LogLevelIndexes.ERROR))
75
- this._log(LogLevels.ERROR, msg, args);
87
+ this._log('error', msg, args);
76
88
  };
77
- Logger.prototype._log = function (level, msg, args) {
89
+ Logger.prototype._log = function (method, msg, args) {
78
90
  if (typeof msg === 'number') {
79
91
  var format = this.codes.get(msg);
80
92
  msg = format ? _sprintf(format, args) : "Message code " + msg + (args ? ', with args: ' + args.toString() : '');
@@ -83,27 +95,16 @@ var Logger = /** @class */ (function () {
83
95
  if (args)
84
96
  msg = _sprintf(msg, args);
85
97
  }
86
- var formattedText = this._generateLogMessage(level, msg);
87
- // Do not break on custom logger errors
98
+ if (this.options.prefix)
99
+ msg = this.options.prefix + ' => ' + msg;
88
100
  if (this.logger) {
89
- try { // @ts-expect-error
90
- this.logger[level.toLowerCase()](formattedText);
101
+ try {
102
+ this.logger[method](msg);
91
103
  return;
92
104
  }
93
105
  catch (e) { /* empty */ }
94
106
  }
95
- console.log(formattedText);
96
- };
97
- Logger.prototype._generateLogMessage = function (level, text) {
98
- var textPre = ' => ';
99
- var result = '';
100
- if (this.options.showLevel) {
101
- result += '[' + level + ']' + (level === LogLevels.INFO || level === LogLevels.WARN ? ' ' : '') + ' ';
102
- }
103
- if (this.options.prefix) {
104
- result += this.options.prefix + textPre;
105
- }
106
- return result += text;
107
+ DEFAULT_LOGGER[method](msg);
107
108
  };
108
109
  Logger.prototype._shouldLog = function (level) {
109
110
  return level >= this.logLevel;
@@ -36,8 +36,8 @@ export function validateLogger(settings) {
36
36
  var logLevel = debug !== undefined ? getLogLevel(debug) : initialLogLevel;
37
37
  var log = new Logger({ logLevel: logLevel || initialLogLevel }, allCodes);
38
38
  log.setLogger(logger);
39
- // @ts-ignore // if logLevel is undefined at this point, it means that settings `debug` value is invalid
39
+ // if logLevel is undefined at this point, it means that settings `debug` value is invalid
40
40
  if (!logLevel)
41
- log._log(LogLevels.ERROR, 'Invalid Log Level - No changes to the logs will be applied.');
41
+ log._log('error', 'Invalid Log Level - No changes to the logs will be applied.');
42
42
  return log;
43
43
  }
@@ -24,8 +24,8 @@ export function validateLogger(settings) {
24
24
  }
25
25
  var log = new Logger({ logLevel: logLevel || initialLogLevel });
26
26
  log.setLogger(logger);
27
- // @ts-ignore // `debug` value is invalid if logLevel is undefined at this point
27
+ // `debug` value is invalid if logLevel is undefined at this point
28
28
  if (!logLevel)
29
- log._log(LogLevels.ERROR, 'Invalid `debug` value at config. Logs will be disabled.');
29
+ log._log('error', 'Invalid `debug` value at config. Logs will be disabled.');
30
30
  return log;
31
31
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitsoftware/splitio-commons",
3
- "version": "2.6.1-rc.0",
3
+ "version": "2.7.0",
4
4
  "description": "Split JavaScript SDK common components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -57,7 +57,6 @@
57
57
  }
58
58
  },
59
59
  "devDependencies": {
60
- "@types/google.analytics": "0.0.40",
61
60
  "@types/ioredis": "^4.28.0",
62
61
  "@types/jest": "^27.0.0",
63
62
  "@types/lodash": "^4.14.162",
@@ -20,6 +20,13 @@ const LogLevelIndexes = {
20
20
  NONE: 5
21
21
  };
22
22
 
23
+ export const DEFAULT_LOGGER: SplitIO.Logger = {
24
+ debug(msg) { console.log('[DEBUG] ' + msg); },
25
+ info(msg) { console.log('[INFO] ' + msg); },
26
+ warn(msg) { console.log('[WARN] ' + msg); },
27
+ error(msg) { console.log('[ERROR] ' + msg); }
28
+ };
29
+
23
30
  export function isLogLevelString(str: string): str is SplitIO.LogLevel {
24
31
  return !!find(LogLevels, (lvl: string) => str === lvl);
25
32
  }
@@ -41,7 +48,6 @@ export function _sprintf(format: string = '', args: any[] = []): string {
41
48
  const defaultOptions = {
42
49
  prefix: 'splitio',
43
50
  logLevel: LogLevels.NONE,
44
- showLevel: true,
45
51
  };
46
52
 
47
53
  export class Logger implements ILogger {
@@ -63,31 +69,37 @@ export class Logger implements ILogger {
63
69
  }
64
70
 
65
71
  setLogger(logger?: SplitIO.Logger) {
66
- if (!logger || isLogger(logger)) {
67
- this.logger = logger;
68
- } else {
69
- this._log(LogLevels.ERROR, 'Invalid `logger` instance. It must be an object with `debug`, `info`, `warn` and `error` methods. Defaulting to `console.log`');
70
- this.logger = undefined;
72
+ if (logger) {
73
+ if (isLogger(logger)) {
74
+ this.logger = logger;
75
+ // If custom logger is set, all logs are either enabled or disabled
76
+ if (this.logLevel !== LogLevelIndexes.NONE) this.setLogLevel(LogLevels.DEBUG);
77
+ return;
78
+ } else {
79
+ this.error('Invalid `logger` instance. It must be an object with `debug`, `info`, `warn` and `error` methods. Defaulting to `console.log`');
80
+ }
71
81
  }
82
+ // unset
83
+ this.logger = undefined;
72
84
  }
73
85
 
74
86
  debug(msg: string | number, args?: any[]) {
75
- if (this._shouldLog(LogLevelIndexes.DEBUG)) this._log(LogLevels.DEBUG, msg, args);
87
+ if (this._shouldLog(LogLevelIndexes.DEBUG)) this._log('debug', msg, args);
76
88
  }
77
89
 
78
90
  info(msg: string | number, args?: any[]) {
79
- if (this._shouldLog(LogLevelIndexes.INFO)) this._log(LogLevels.INFO, msg, args);
91
+ if (this._shouldLog(LogLevelIndexes.INFO)) this._log('info', msg, args);
80
92
  }
81
93
 
82
94
  warn(msg: string | number, args?: any[]) {
83
- if (this._shouldLog(LogLevelIndexes.WARN)) this._log(LogLevels.WARN, msg, args);
95
+ if (this._shouldLog(LogLevelIndexes.WARN)) this._log('warn', msg, args);
84
96
  }
85
97
 
86
98
  error(msg: string | number, args?: any[]) {
87
- if (this._shouldLog(LogLevelIndexes.ERROR)) this._log(LogLevels.ERROR, msg, args);
99
+ if (this._shouldLog(LogLevelIndexes.ERROR)) this._log('error', msg, args);
88
100
  }
89
101
 
90
- private _log(level: SplitIO.LogLevel, msg: string | number, args?: any[]) {
102
+ _log(method: keyof SplitIO.Logger, msg: string | number, args?: any[]) {
91
103
  if (typeof msg === 'number') {
92
104
  const format = this.codes.get(msg);
93
105
  msg = format ? _sprintf(format, args) : `Message code ${msg}${args ? ', with args: ' + args.toString() : ''}`;
@@ -95,32 +107,15 @@ export class Logger implements ILogger {
95
107
  if (args) msg = _sprintf(msg, args);
96
108
  }
97
109
 
98
- const formattedText = this._generateLogMessage(level, msg);
110
+ if (this.options.prefix) msg = this.options.prefix + ' => ' + msg;
99
111
 
100
- // Do not break on custom logger errors
101
112
  if (this.logger) {
102
- try { // @ts-expect-error
103
- this.logger[level.toLowerCase()](formattedText);
113
+ try {
114
+ this.logger[method](msg);
104
115
  return;
105
116
  } catch (e) { /* empty */ }
106
117
  }
107
-
108
- console.log(formattedText);
109
- }
110
-
111
- private _generateLogMessage(level: SplitIO.LogLevel, text: string) {
112
- const textPre = ' => ';
113
- let result = '';
114
-
115
- if (this.options.showLevel) {
116
- result += '[' + level + ']' + (level === LogLevels.INFO || level === LogLevels.WARN ? ' ' : '') + ' ';
117
- }
118
-
119
- if (this.options.prefix) {
120
- result += this.options.prefix + textPre;
121
- }
122
-
123
- return result += text;
118
+ DEFAULT_LOGGER[method](msg);
124
119
  }
125
120
 
126
121
  private _shouldLog(level: number) {
@@ -3,7 +3,6 @@ import SplitIO from '../../types/splitio';
3
3
  export interface ILoggerOptions {
4
4
  prefix?: string;
5
5
  logLevel?: SplitIO.LogLevel;
6
- showLevel?: boolean; // @TODO remove this param eventually since it is not being set `false` anymore
7
6
  }
8
7
 
9
8
  export interface ILogger extends SplitIO.ILogger {
@@ -48,8 +48,8 @@ export function validateLogger(settings: { debug: unknown, logger?: SplitIO.Logg
48
48
  const log = new Logger({ logLevel: logLevel || initialLogLevel }, allCodes);
49
49
  log.setLogger(logger);
50
50
 
51
- // @ts-ignore // if logLevel is undefined at this point, it means that settings `debug` value is invalid
52
- if (!logLevel) log._log(LogLevels.ERROR, 'Invalid Log Level - No changes to the logs will be applied.');
51
+ // if logLevel is undefined at this point, it means that settings `debug` value is invalid
52
+ if (!logLevel) log._log('error', 'Invalid Log Level - No changes to the logs will be applied.');
53
53
 
54
54
  return log;
55
55
  }
@@ -32,8 +32,8 @@ export function validateLogger(settings: { debug: unknown, logger?: SplitIO.Logg
32
32
  const log = new Logger({ logLevel: logLevel || initialLogLevel });
33
33
  log.setLogger(logger);
34
34
 
35
- // @ts-ignore // `debug` value is invalid if logLevel is undefined at this point
36
- if (!logLevel) log._log(LogLevels.ERROR, 'Invalid `debug` value at config. Logs will be disabled.');
35
+ // `debug` value is invalid if logLevel is undefined at this point
36
+ if (!logLevel) log._log('error', 'Invalid `debug` value at config. Logs will be disabled.');
37
37
 
38
38
  return log;
39
39
  }
@@ -145,6 +145,8 @@ interface IPluggableSharedSettings {
145
145
  * config.debug = ErrorLogger()
146
146
  * ```
147
147
  *
148
+ * When combined with the `logger` option, any log level other than `NONE` (false) will be set to `DEBUG` (true), delegating log level control to the custom logger.
149
+ *
148
150
  * @defaultValue `false`
149
151
  */
150
152
  debug?: boolean | SplitIO.LogLevel | SplitIO.ILogger;
@@ -168,6 +170,8 @@ interface INonPluggableSharedSettings {
168
170
  * config.debug = 'WARN'
169
171
  * ```
170
172
  *
173
+ * When combined with the `logger` option, any log level other than `NONE` (false) will be set to `DEBUG` (true), delegating log level control to the custom logger.
174
+ *
171
175
  * @defaultValue `false`
172
176
  */
173
177
  debug?: boolean | SplitIO.LogLevel;