@naturalcycles/js-lib 14.64.0 → 14.68.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.
@@ -1,3 +1,4 @@
1
+ import { CommonLogger } from '..';
1
2
  /**
2
3
  * $r - result
3
4
  *
@@ -36,6 +37,10 @@ export interface LogMethodOptions {
36
37
  * Overrides `logResult`.
37
38
  */
38
39
  logResultFn?: LogResultFn;
40
+ /**
41
+ * Defaults to `console`
42
+ */
43
+ logger?: CommonLogger;
39
44
  }
40
45
  /**
41
46
  * Console-logs when method had started, when it finished, time taken and if error happened.
@@ -21,11 +21,11 @@ const decorator_util_1 = require("./decorator.util");
21
21
  function _LogMethod(opt = {}) {
22
22
  return (target, key, descriptor) => {
23
23
  if (typeof descriptor.value !== 'function') {
24
- throw new TypeError('@LogMillis can be applied only to methods');
24
+ throw new TypeError('@_LogMethod can be applied only to methods');
25
25
  }
26
26
  const originalFn = descriptor.value;
27
27
  const keyStr = String(key);
28
- const { avg, noLogArgs, logStart, logResult, noLogResultLength } = opt;
28
+ const { avg, noLogArgs, logStart, logResult, noLogResultLength, logger = console } = opt;
29
29
  let { logResultFn } = opt;
30
30
  if (!logResultFn) {
31
31
  if (logResult) {
@@ -46,29 +46,29 @@ function _LogMethod(opt = {}) {
46
46
  const argsStr = (0, decorator_util_1._getArgsSignature)(args, noLogArgs);
47
47
  const callSignature = `${methodSignature}(${argsStr}) #${++count}`;
48
48
  if (logStart)
49
- console.log(`>> ${callSignature}`);
49
+ logger.log(`>> ${callSignature}`);
50
50
  try {
51
51
  const res = originalFn.apply(ctx, args);
52
52
  if (res && typeof res.then === 'function') {
53
53
  // Result is a Promise, will wait for resolution or rejection
54
54
  return res
55
55
  .then((r) => {
56
- logFinished(callSignature, started, sma, logResultFn, r);
56
+ logFinished(logger, callSignature, started, sma, logResultFn, r);
57
57
  return r;
58
58
  })
59
59
  .catch((err) => {
60
- logFinished(callSignature, started, sma, logResultFn, undefined, err);
60
+ logFinished(logger, callSignature, started, sma, logResultFn, undefined, err);
61
61
  return Promise.reject(err);
62
62
  });
63
63
  }
64
64
  else {
65
65
  // not a Promise
66
- logFinished(callSignature, started, sma, logResultFn, res);
66
+ logFinished(logger, callSignature, started, sma, logResultFn, res);
67
67
  return res;
68
68
  }
69
69
  }
70
70
  catch (err) {
71
- logFinished(callSignature, started, sma, logResultFn, undefined, err);
71
+ logFinished(logger, callSignature, started, sma, logResultFn, undefined, err);
72
72
  throw err; // rethrow
73
73
  }
74
74
  };
@@ -76,7 +76,7 @@ function _LogMethod(opt = {}) {
76
76
  };
77
77
  }
78
78
  exports._LogMethod = _LogMethod;
79
- function logFinished(callSignature, started, sma, logResultFn, res, err) {
79
+ function logFinished(logger, callSignature, started, sma, logResultFn, res, err) {
80
80
  const millis = Date.now() - started;
81
81
  const t = ['<<', callSignature, 'took', (0, time_util_1._ms)(millis)];
82
82
  if (sma) {
@@ -88,5 +88,5 @@ function logFinished(callSignature, started, sma, logResultFn, res, err) {
88
88
  else if (logResultFn) {
89
89
  t.push(...logResultFn(res));
90
90
  }
91
- console.log(t.filter(Boolean).join(' '));
91
+ logger.log(t.filter(Boolean).join(' '));
92
92
  }
@@ -1,11 +1,22 @@
1
+ import { CommonLogger } from '../log/commonLogger';
1
2
  import { MemoCache } from './memo.util';
2
3
  export interface MemoOptions {
4
+ /**
5
+ * Default to false
6
+ */
3
7
  logHit?: boolean;
8
+ /**
9
+ * Default to false
10
+ */
4
11
  logMiss?: boolean;
5
12
  /**
6
13
  * Skip logging method arguments.
7
14
  */
8
15
  noLogArgs?: boolean;
16
+ /**
17
+ * Default to `console`
18
+ */
19
+ logger?: CommonLogger;
9
20
  /**
10
21
  * Provide a custom implementation of MemoCache.
11
22
  * Function that creates an instance of `MemoCache`.
@@ -33,7 +33,7 @@ const _Memo = (opt = {}) => (target, key, descriptor) => {
33
33
  // UPD: tests show that normal Map also doesn't leak (to be tested further)
34
34
  // Normal Map is needed to allow .dropCache()
35
35
  const cache = new Map();
36
- const { logHit, logMiss, noLogArgs, cacheFactory = () => new memo_util_1.MapMemoCache(), cacheKeyFn = memo_util_1.jsonMemoSerializer, noCacheRejected, noCacheResolved, } = opt;
36
+ const { logHit = false, logMiss = false, noLogArgs = false, logger = console, cacheFactory = () => new memo_util_1.MapMemoCache(), cacheKeyFn = memo_util_1.jsonMemoSerializer, noCacheRejected = false, noCacheResolved = false, } = opt;
37
37
  const awaitPromise = Boolean(noCacheRejected || noCacheResolved);
38
38
  const keyStr = String(key);
39
39
  const methodSignature = (0, decorator_util_1._getTargetMethodSignature)(target, keyStr);
@@ -45,7 +45,7 @@ const _Memo = (opt = {}) => (target, key, descriptor) => {
45
45
  }
46
46
  else if (cache.get(ctx).has(cacheKey)) {
47
47
  if (logHit) {
48
- console.log(`${(0, decorator_util_1._getMethodSignature)(ctx, keyStr)}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memoInstance hit`);
48
+ logger.log(`${(0, decorator_util_1._getMethodSignature)(ctx, keyStr)}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @_Memo hit`);
49
49
  }
50
50
  const res = cache.get(ctx).get(cacheKey);
51
51
  if (awaitPromise) {
@@ -62,7 +62,7 @@ const _Memo = (opt = {}) => (target, key, descriptor) => {
62
62
  .then(res => {
63
63
  // console.log('RESOLVED', res)
64
64
  if (logMiss) {
65
- console.log(`${(0, decorator_util_1._getMethodSignature)(ctx, keyStr)}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memo miss resolved (${(0, time_util_1._since)(started)})`);
65
+ logger.log(`${(0, decorator_util_1._getMethodSignature)(ctx, keyStr)}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @_Memo miss resolved (${(0, time_util_1._since)(started)})`);
66
66
  }
67
67
  if (!noCacheResolved) {
68
68
  cache.get(ctx).set(cacheKey, res);
@@ -72,7 +72,7 @@ const _Memo = (opt = {}) => (target, key, descriptor) => {
72
72
  .catch(err => {
73
73
  // console.log('REJECTED', err)
74
74
  if (logMiss) {
75
- console.log(`${(0, decorator_util_1._getMethodSignature)(ctx, keyStr)}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memo miss rejected (${(0, time_util_1._since)(started)})`);
75
+ logger.log(`${(0, decorator_util_1._getMethodSignature)(ctx, keyStr)}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @_Memo miss rejected (${(0, time_util_1._since)(started)})`);
76
76
  }
77
77
  if (!noCacheRejected) {
78
78
  // We put it to cache as raw Error, not Promise.reject(err)
@@ -85,14 +85,14 @@ const _Memo = (opt = {}) => (target, key, descriptor) => {
85
85
  }
86
86
  else {
87
87
  if (logMiss) {
88
- console.log(`${(0, decorator_util_1._getMethodSignature)(ctx, keyStr)}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memo miss (${(0, time_util_1._since)(started)})`);
88
+ logger.log(`${(0, decorator_util_1._getMethodSignature)(ctx, keyStr)}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @_Memo miss (${(0, time_util_1._since)(started)})`);
89
89
  }
90
90
  cache.get(ctx).set(cacheKey, res);
91
91
  return res;
92
92
  }
93
93
  };
94
94
  descriptor.value.dropCache = () => {
95
- console.log(`${methodSignature} @memo.dropCache()`);
95
+ logger.log(`${methodSignature} @_Memo.dropCache()`);
96
96
  cache.forEach(memoCache => memoCache.clear());
97
97
  cache.clear();
98
98
  };
@@ -5,7 +5,7 @@ const time_util_1 = require("../time/time.util");
5
5
  const decorator_util_1 = require("./decorator.util");
6
6
  const memo_util_1 = require("./memo.util");
7
7
  function _memoFn(fn, opt = {}) {
8
- const { logHit, logMiss, noLogArgs, noCacheRejected, noCacheResolved, cacheFactory = () => new memo_util_1.MapMemoCache(), cacheKeyFn = memo_util_1.jsonMemoSerializer, } = opt;
8
+ const { logHit = false, logMiss = false, noLogArgs = false, logger = console, noCacheRejected = false, noCacheResolved = false, cacheFactory = () => new memo_util_1.MapMemoCache(), cacheKeyFn = memo_util_1.jsonMemoSerializer, } = opt;
9
9
  const cache = cacheFactory();
10
10
  const awaitPromise = Boolean(noCacheRejected || noCacheResolved);
11
11
  const fnName = fn.name;
@@ -14,7 +14,7 @@ function _memoFn(fn, opt = {}) {
14
14
  const cacheKey = cacheKeyFn(args);
15
15
  if (cache.has(cacheKey)) {
16
16
  if (logHit) {
17
- console.log(`${fnName}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) memoFn hit`);
17
+ logger.log(`${fnName}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) memoFn hit`);
18
18
  }
19
19
  const res = cache.get(cacheKey);
20
20
  if (awaitPromise) {
@@ -31,7 +31,7 @@ function _memoFn(fn, opt = {}) {
31
31
  .then(res => {
32
32
  // console.log('RESOLVED', res)
33
33
  if (logMiss) {
34
- console.log(`${fnName}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) memoFn miss resolved (${(0, time_util_1._since)(started)})`);
34
+ logger.log(`${fnName}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) memoFn miss resolved (${(0, time_util_1._since)(started)})`);
35
35
  }
36
36
  if (!noCacheResolved) {
37
37
  cache.set(cacheKey, res);
@@ -41,7 +41,7 @@ function _memoFn(fn, opt = {}) {
41
41
  .catch(err => {
42
42
  // console.log('REJECTED', err)
43
43
  if (logMiss) {
44
- console.log(`${fnName}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) memoFn miss rejected (${(0, time_util_1._since)(started)})`);
44
+ logger.log(`${fnName}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) memoFn miss rejected (${(0, time_util_1._since)(started)})`);
45
45
  }
46
46
  if (!noCacheRejected) {
47
47
  // We put it to cache as raw Error, not Promise.reject(err)
@@ -54,7 +54,7 @@ function _memoFn(fn, opt = {}) {
54
54
  }
55
55
  else {
56
56
  if (logMiss) {
57
- console.log(`${fnName}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memo miss (${(0, time_util_1._since)(started)})`);
57
+ logger.log(`${fnName}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) memoFn miss (${(0, time_util_1._since)(started)})`);
58
58
  }
59
59
  cache.set(cacheKey, res);
60
60
  return res;
@@ -1,7 +1,9 @@
1
+ import { CommonLogger } from '../log/commonLogger';
1
2
  export interface MemoOpts {
2
3
  logHit?: boolean;
3
4
  logMiss?: boolean;
4
5
  noLogArgs?: boolean;
6
+ logger?: CommonLogger;
5
7
  }
6
8
  /**
7
9
  * Memoizes the method of the class, so it caches the output and returns the cached version if the "key"
@@ -6,12 +6,6 @@
6
6
  // https://community.risingstack.com/the-worlds-fastest-javascript-memoization-library/
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.memoSimple = void 0;
9
- /*
10
- Optimized for 0 arguments (using SingleValueCache).
11
- Optimized for 1 primitive argument (skips JSON.stringify).
12
- Otherwise resorts to JSON.stringify.
13
- Benchmark shows similar perf for ObjectCache and MapCache.
14
- */
15
9
  const decorator_util_1 = require("./decorator.util");
16
10
  const memo_util_1 = require("./memo.util");
17
11
  // memoSimple decorator is NOT exported. Only used in benchmarks currently
@@ -43,7 +37,7 @@ const memoSimple = (opt = {}) => (target, key, descriptor) => {
43
37
  }
44
38
  */
45
39
  const cache = new memo_util_1.MapMemoCache();
46
- const { logHit, logMiss, noLogArgs } = opt;
40
+ const { logHit, logMiss, noLogArgs, logger = console } = opt;
47
41
  const keyStr = String(key);
48
42
  const methodSignature = (0, decorator_util_1._getTargetMethodSignature)(target, keyStr);
49
43
  descriptor.value = function (...args) {
@@ -51,20 +45,20 @@ const memoSimple = (opt = {}) => (target, key, descriptor) => {
51
45
  const cacheKey = (0, memo_util_1.jsonMemoSerializer)(args);
52
46
  if (cache.has(cacheKey)) {
53
47
  if (logHit) {
54
- console.log(`${methodSignature}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memo hit`);
48
+ logger.log(`${methodSignature}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memo hit`);
55
49
  }
56
50
  return cache.get(cacheKey);
57
51
  }
58
52
  const d = Date.now();
59
53
  const res = originalFn.apply(ctx, args);
60
54
  if (logMiss) {
61
- console.log(`${methodSignature}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memo miss (${Date.now() - d} ms)`);
55
+ logger.log(`${methodSignature}(${(0, decorator_util_1._getArgsSignature)(args, noLogArgs)}) @memo miss (${Date.now() - d} ms)`);
62
56
  }
63
57
  cache.set(cacheKey, res);
64
58
  return res;
65
59
  };
66
60
  descriptor.value.dropCache = () => {
67
- console.log(`${methodSignature} @memo.dropCache()`);
61
+ logger.log(`${methodSignature} @memo.dropCache()`);
68
62
  cache.clear();
69
63
  };
70
64
  return descriptor;
@@ -41,7 +41,6 @@ export interface HttpErrorData extends ErrorData {
41
41
  *
42
42
  * GET /api/some-endpoint
43
43
  */
44
- endpoint?: string;
45
44
  /**
46
45
  * Set to true when the error was thrown after response headers were sent.
47
46
  */
@@ -1,3 +1,4 @@
1
+ import { CommonLogger } from '../index';
1
2
  import { AnyFunction } from '../types';
2
3
  export interface TryCatchOptions {
3
4
  /**
@@ -13,6 +14,10 @@ export interface TryCatchOptions {
13
14
  * @default true
14
15
  */
15
16
  logError?: boolean;
17
+ /**
18
+ * Default to `console`
19
+ */
20
+ logger?: CommonLogger;
16
21
  }
17
22
  /**
18
23
  * Decorates a function with "try/catch", so it'll never reject/throw.
@@ -11,23 +11,20 @@ const index_1 = require("../index");
11
11
  * @experimental
12
12
  */
13
13
  function _tryCatch(fn, opt = {}) {
14
- const { onError, logError, logSuccess } = {
15
- logError: true,
16
- ...opt,
17
- };
14
+ const { onError, logError = true, logSuccess = false, logger = console } = opt;
18
15
  const fname = fn.name || 'anonymous';
19
16
  return async function (...args) {
20
17
  const started = Date.now();
21
18
  try {
22
19
  const r = await fn.apply(this, args);
23
20
  if (logSuccess) {
24
- console.log(`tryCatch.${fname} succeeded in ${(0, index_1._since)(started)}`);
21
+ logger.log(`tryCatch.${fname} succeeded in ${(0, index_1._since)(started)}`);
25
22
  }
26
23
  return r;
27
24
  }
28
25
  catch (err) {
29
26
  if (logError) {
30
- console.warn(`tryCatch.${fname} error in ${(0, index_1._since)(started)}:\n${(0, index_1._stringifyAny)(err, {
27
+ logger.warn(`tryCatch.${fname} error in ${(0, index_1._since)(started)}:\n${(0, index_1._stringifyAny)(err, {
31
28
  includeErrorData: true,
32
29
  })}`);
33
30
  }
package/dist/index.d.ts CHANGED
@@ -54,7 +54,7 @@ import { Class, ConditionalExcept, ConditionalPick, Merge, Promisable, PromiseVa
54
54
  import { AsyncMapper, AsyncPredicate, BaseDBEntity, CreatedUpdated, CreatedUpdatedId, ObjectWithId, AnyObjectWithId, Saved, Unsaved, BatchResult, InstanceId, IsoDate, IsoDateTime, KeyValueTuple, Mapper, ObjectMapper, ObjectPredicate, Predicate, PromiseMap, AnyObject, AnyFunction, Reviver, SavedDBEntity, StringMap, UnixTimestamp, ValueOf, ValuesOf, _noop, _objectKeys, _passNothingPredicate, _passthroughMapper, _passthroughPredicate, _passUndefinedMapper, _stringMapEntries, _stringMapValues } from './types';
55
55
  import { _gb, _hb, _kb, _mb } from './unit/size.util';
56
56
  import { is } from './vendor/is';
57
- import { CommonLogLevel, CommonLogFunction, CommonLogger, SimpleLogger, createSimpleLogger, noopLogger } from './log/commonLogger';
57
+ import { CommonLogLevel, CommonLogFunction, CommonLogger, commonLoggerMinLevel, commonLoggerNoop, commonLogLevelNumber, commonLoggerPipe, commonLoggerPrefix } from './log/commonLogger';
58
58
  import { _safeJsonStringify } from './string/safeJsonStringify';
59
- export type { MemoCache, PromiseDecoratorCfg, PromiseDecoratorResp, ErrorData, ErrorObject, HttpErrorData, HttpErrorResponse, Admin401ErrorData, Admin403ErrorData, StringMap, PromiseMap, AnyObject, AnyFunction, ValuesOf, ValueOf, KeyValueTuple, ObjectMapper, ObjectPredicate, InstanceId, IsoDate, IsoDateTime, Reviver, PMapOptions, Mapper, AsyncMapper, Predicate, AsyncPredicate, BatchResult, DeferredPromise, PRetryOptions, PTimeoutOptions, TryCatchOptions, StringifyAnyOptions, JsonStringifyFunction, Merge, ReadonlyDeep, Promisable, PromiseValue, Simplify, ConditionalPick, ConditionalExcept, Class, UnixTimestamp, BaseDBEntity, SavedDBEntity, Saved, Unsaved, CreatedUpdated, CreatedUpdatedId, ObjectWithId, AnyObjectWithId, JsonSchema, JsonSchemaAny, JsonSchemaOneOf, JsonSchemaAllOf, JsonSchemaAnyOf, JsonSchemaNot, JsonSchemaRef, JsonSchemaConst, JsonSchemaEnum, JsonSchemaString, JsonSchemaNumber, JsonSchemaBoolean, JsonSchemaNull, JsonSchemaRootObject, JsonSchemaObject, JsonSchemaArray, JsonSchemaTuple, JsonSchemaBuilder, CommonLogLevel, CommonLogFunction, CommonLogger, SimpleLogger, };
60
- export { is, _Memo, _memoFn, _LogMethod, _getArgsSignature, _createPromiseDecorator, AppError, HttpError, AssertionError, _isErrorObject, _isHttpErrorObject, _isHttpErrorResponse, _assert, _assertEquals, _assertDeepEquals, _assertIsError, _assertIsString, _assertIsNumber, _assertTypeOf, _randomInt, _randomArrayItem, _createDeterministicRandom, _inRange, _stringMapValues, _stringMapEntries, _objectKeys, _capitalize, _upperFirst, _lowerFirst, _split, _removeWhitespace, _substringBefore, _substringBeforeLast, _substringAfter, _substringAfterLast, _substringBetweenLast, _replaceAll, _nl2br, _truncate, _truncateMiddle, _pick, _omit, _filterFalsyValues, _filterUndefinedValues, _filterNullishValues, _filterEmptyArrays, _filterEmptyValues, _filterObject, _undefinedIfEmpty, _isObject, _isPrimitive, _mapKeys, _mapValues, _mapObject, _objectNullValuesToUndefined, _deepEquals, _deepCopy, _isEmptyObject, _isEmpty, _merge, _deepTrim, _sortObjectDeep, _sortObject, _get, _set, _has, _unset, _mask, _invert, _invertMap, _by, _groupBy, _sortBy, _sortNumbers, _toFixed, _toPrecision, _round, _findLast, _takeWhile, _takeRightWhile, _dropWhile, _dropRightWhile, _countBy, _intersection, _difference, _shuffle, _mapToObject, _findKeyByValue, _anyToError, _anyToErrorObject, _errorToErrorObject, _errorObjectToAppError, _range, _uniq, _uniqBy, _flatten, _flattenDeep, _chunk, SimpleMovingAverage, _average, _averageWeighted, _percentile, _median, _debounce, _throttle, _Debounce, _Throttle, pMap, _passthroughMapper, _passUndefinedMapper, _passthroughPredicate, _passNothingPredicate, _noop, pBatch, ErrorMode, pFilter, pProps, pDelay, pDefer, pHang, pState, AggregatedError, pRetry, pTimeout, pTuple, _Retry, _Timeout, _tryCatch, _TryCatch, _try, pTry, _jsonParseIfPossible, _stringifyAny, _ms, _since, _hb, _gb, _mb, _kb, _snakeCase, _camelCase, _kebabCase, _sum, _sumBy, _clamp, _last, mergeJsonSchemaObjects, jsonSchema, JsonSchemaAnyBuilder, JSON_SCHEMA_ORDER, generateJsonSchemaFromData, _parseQueryString, _defineLazyProperty, _defineLazyProps, _lazyValue, createSimpleLogger, noopLogger, _safeJsonStringify, };
59
+ export type { MemoCache, PromiseDecoratorCfg, PromiseDecoratorResp, ErrorData, ErrorObject, HttpErrorData, HttpErrorResponse, Admin401ErrorData, Admin403ErrorData, StringMap, PromiseMap, AnyObject, AnyFunction, ValuesOf, ValueOf, KeyValueTuple, ObjectMapper, ObjectPredicate, InstanceId, IsoDate, IsoDateTime, Reviver, PMapOptions, Mapper, AsyncMapper, Predicate, AsyncPredicate, BatchResult, DeferredPromise, PRetryOptions, PTimeoutOptions, TryCatchOptions, StringifyAnyOptions, JsonStringifyFunction, Merge, ReadonlyDeep, Promisable, PromiseValue, Simplify, ConditionalPick, ConditionalExcept, Class, UnixTimestamp, BaseDBEntity, SavedDBEntity, Saved, Unsaved, CreatedUpdated, CreatedUpdatedId, ObjectWithId, AnyObjectWithId, JsonSchema, JsonSchemaAny, JsonSchemaOneOf, JsonSchemaAllOf, JsonSchemaAnyOf, JsonSchemaNot, JsonSchemaRef, JsonSchemaConst, JsonSchemaEnum, JsonSchemaString, JsonSchemaNumber, JsonSchemaBoolean, JsonSchemaNull, JsonSchemaRootObject, JsonSchemaObject, JsonSchemaArray, JsonSchemaTuple, JsonSchemaBuilder, CommonLogLevel, CommonLogFunction, CommonLogger, };
60
+ export { is, _Memo, _memoFn, _LogMethod, _getArgsSignature, _createPromiseDecorator, AppError, HttpError, AssertionError, _isErrorObject, _isHttpErrorObject, _isHttpErrorResponse, _assert, _assertEquals, _assertDeepEquals, _assertIsError, _assertIsString, _assertIsNumber, _assertTypeOf, _randomInt, _randomArrayItem, _createDeterministicRandom, _inRange, _stringMapValues, _stringMapEntries, _objectKeys, _capitalize, _upperFirst, _lowerFirst, _split, _removeWhitespace, _substringBefore, _substringBeforeLast, _substringAfter, _substringAfterLast, _substringBetweenLast, _replaceAll, _nl2br, _truncate, _truncateMiddle, _pick, _omit, _filterFalsyValues, _filterUndefinedValues, _filterNullishValues, _filterEmptyArrays, _filterEmptyValues, _filterObject, _undefinedIfEmpty, _isObject, _isPrimitive, _mapKeys, _mapValues, _mapObject, _objectNullValuesToUndefined, _deepEquals, _deepCopy, _isEmptyObject, _isEmpty, _merge, _deepTrim, _sortObjectDeep, _sortObject, _get, _set, _has, _unset, _mask, _invert, _invertMap, _by, _groupBy, _sortBy, _sortNumbers, _toFixed, _toPrecision, _round, _findLast, _takeWhile, _takeRightWhile, _dropWhile, _dropRightWhile, _countBy, _intersection, _difference, _shuffle, _mapToObject, _findKeyByValue, _anyToError, _anyToErrorObject, _errorToErrorObject, _errorObjectToAppError, _range, _uniq, _uniqBy, _flatten, _flattenDeep, _chunk, SimpleMovingAverage, _average, _averageWeighted, _percentile, _median, _debounce, _throttle, _Debounce, _Throttle, pMap, _passthroughMapper, _passUndefinedMapper, _passthroughPredicate, _passNothingPredicate, _noop, pBatch, ErrorMode, pFilter, pProps, pDelay, pDefer, pHang, pState, AggregatedError, pRetry, pTimeout, pTuple, _Retry, _Timeout, _tryCatch, _TryCatch, _try, pTry, _jsonParseIfPossible, _stringifyAny, _ms, _since, _hb, _gb, _mb, _kb, _snakeCase, _camelCase, _kebabCase, _sum, _sumBy, _clamp, _last, mergeJsonSchemaObjects, jsonSchema, JsonSchemaAnyBuilder, JSON_SCHEMA_ORDER, generateJsonSchemaFromData, _parseQueryString, _defineLazyProperty, _defineLazyProps, _lazyValue, commonLoggerMinLevel, commonLoggerNoop, commonLogLevelNumber, commonLoggerPipe, commonLoggerPrefix, _safeJsonStringify, };
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports._isObject = exports._undefinedIfEmpty = exports._filterObject = exports._filterEmptyValues = exports._filterEmptyArrays = exports._filterNullishValues = exports._filterUndefinedValues = exports._filterFalsyValues = exports._omit = exports._pick = exports._truncateMiddle = exports._truncate = exports._nl2br = exports._replaceAll = exports._substringBetweenLast = exports._substringAfterLast = exports._substringAfter = exports._substringBeforeLast = exports._substringBefore = exports._removeWhitespace = exports._split = exports._lowerFirst = exports._upperFirst = exports._capitalize = exports._objectKeys = exports._stringMapEntries = exports._stringMapValues = exports._inRange = exports._createDeterministicRandom = exports._randomArrayItem = exports._randomInt = exports._assertTypeOf = exports._assertIsNumber = exports._assertIsString = exports._assertIsError = exports._assertDeepEquals = exports._assertEquals = exports._assert = exports._isHttpErrorResponse = exports._isHttpErrorObject = exports._isErrorObject = exports.AssertionError = exports.HttpError = exports.AppError = exports._createPromiseDecorator = exports._getArgsSignature = exports._LogMethod = exports._memoFn = exports._Memo = exports.is = void 0;
4
4
  exports._average = exports.SimpleMovingAverage = exports._chunk = exports._flattenDeep = exports._flatten = exports._uniqBy = exports._uniq = exports._range = exports._errorObjectToAppError = exports._errorToErrorObject = exports._anyToErrorObject = exports._anyToError = exports._findKeyByValue = exports._mapToObject = exports._shuffle = exports._difference = exports._intersection = exports._countBy = exports._dropRightWhile = exports._dropWhile = exports._takeRightWhile = exports._takeWhile = exports._findLast = exports._round = exports._toPrecision = exports._toFixed = exports._sortNumbers = exports._sortBy = exports._groupBy = exports._by = exports._invertMap = exports._invert = exports._mask = exports._unset = exports._has = exports._set = exports._get = exports._sortObject = exports._sortObjectDeep = exports._deepTrim = exports._merge = exports._isEmpty = exports._isEmptyObject = exports._deepCopy = exports._deepEquals = exports._objectNullValuesToUndefined = exports._mapObject = exports._mapValues = exports._mapKeys = exports._isPrimitive = void 0;
5
5
  exports.JSON_SCHEMA_ORDER = exports.JsonSchemaAnyBuilder = exports.jsonSchema = exports.mergeJsonSchemaObjects = exports._last = exports._clamp = exports._sumBy = exports._sum = exports._kebabCase = exports._camelCase = exports._snakeCase = exports._kb = exports._mb = exports._gb = exports._hb = exports._since = exports._ms = exports._stringifyAny = exports._jsonParseIfPossible = exports.pTry = exports._try = exports._TryCatch = exports._tryCatch = exports._Timeout = exports._Retry = exports.pTuple = exports.pTimeout = exports.pRetry = exports.AggregatedError = exports.pState = exports.pHang = exports.pDefer = exports.pDelay = exports.pProps = exports.pFilter = exports.ErrorMode = exports.pBatch = exports._noop = exports._passNothingPredicate = exports._passthroughPredicate = exports._passUndefinedMapper = exports._passthroughMapper = exports.pMap = exports._Throttle = exports._Debounce = exports._throttle = exports._debounce = exports._median = exports._percentile = exports._averageWeighted = void 0;
6
- exports._safeJsonStringify = exports.noopLogger = exports.createSimpleLogger = exports._lazyValue = exports._defineLazyProps = exports._defineLazyProperty = exports._parseQueryString = exports.generateJsonSchemaFromData = void 0;
6
+ exports._safeJsonStringify = exports.commonLoggerPrefix = exports.commonLoggerPipe = exports.commonLogLevelNumber = exports.commonLoggerNoop = exports.commonLoggerMinLevel = exports._lazyValue = exports._defineLazyProps = exports._defineLazyProperty = exports._parseQueryString = exports.generateJsonSchemaFromData = void 0;
7
7
  const array_util_1 = require("./array/array.util");
8
8
  Object.defineProperty(exports, "_by", { enumerable: true, get: function () { return array_util_1._by; } });
9
9
  Object.defineProperty(exports, "_chunk", { enumerable: true, get: function () { return array_util_1._chunk; } });
@@ -212,7 +212,10 @@ Object.defineProperty(exports, "_mb", { enumerable: true, get: function () { ret
212
212
  const is_1 = require("./vendor/is");
213
213
  Object.defineProperty(exports, "is", { enumerable: true, get: function () { return is_1.is; } });
214
214
  const commonLogger_1 = require("./log/commonLogger");
215
- Object.defineProperty(exports, "createSimpleLogger", { enumerable: true, get: function () { return commonLogger_1.createSimpleLogger; } });
216
- Object.defineProperty(exports, "noopLogger", { enumerable: true, get: function () { return commonLogger_1.noopLogger; } });
215
+ Object.defineProperty(exports, "commonLoggerMinLevel", { enumerable: true, get: function () { return commonLogger_1.commonLoggerMinLevel; } });
216
+ Object.defineProperty(exports, "commonLoggerNoop", { enumerable: true, get: function () { return commonLogger_1.commonLoggerNoop; } });
217
+ Object.defineProperty(exports, "commonLogLevelNumber", { enumerable: true, get: function () { return commonLogger_1.commonLogLevelNumber; } });
218
+ Object.defineProperty(exports, "commonLoggerPipe", { enumerable: true, get: function () { return commonLogger_1.commonLoggerPipe; } });
219
+ Object.defineProperty(exports, "commonLoggerPrefix", { enumerable: true, get: function () { return commonLogger_1.commonLoggerPrefix; } });
217
220
  const safeJsonStringify_1 = require("./string/safeJsonStringify");
218
221
  Object.defineProperty(exports, "_safeJsonStringify", { enumerable: true, get: function () { return safeJsonStringify_1._safeJsonStringify; } });
@@ -9,6 +9,7 @@
9
9
  * @experimental
10
10
  */
11
11
  export declare type CommonLogLevel = 'log' | 'warn' | 'error';
12
+ export declare const commonLogLevelNumber: Record<CommonLogLevel, number>;
12
13
  /**
13
14
  * Function that takes any number of arguments and logs them all.
14
15
  * It is expected that logged arguments are separated by "space", like console.log does.
@@ -28,22 +29,20 @@ export interface CommonLogger {
28
29
  error: CommonLogFunction;
29
30
  }
30
31
  /**
31
- * Same as CommonLogger, but also is a "convenience function" itself.
32
- * So you can do `logger('hey')` which is the same as `logger.log('hey')`
32
+ * SimpleLogger that does nothing (noop).
33
33
  *
34
34
  * @experimental
35
35
  */
36
- export interface SimpleLogger extends CommonLogFunction, CommonLogger {
37
- }
36
+ export declare const commonLoggerNoop: CommonLogger;
38
37
  /**
39
- * Creates a SimpleLogger from CommonLogger.
40
- *
41
- * @experimental
38
+ * Creates a "child" logger that is "limited" to the specified CommonLogLevel.
42
39
  */
43
- export declare function createSimpleLogger(logger: CommonLogger): SimpleLogger;
40
+ export declare function commonLoggerMinLevel(logger: CommonLogger, minLevel: CommonLogLevel, mutate?: boolean): CommonLogger;
44
41
  /**
45
- * SimpleLogger that does nothing (noop).
46
- *
47
- * @experimental
42
+ * Creates a "proxy" CommonLogger that pipes log messages to all provided sub-loggers.
43
+ */
44
+ export declare function commonLoggerPipe(loggers: CommonLogger[]): CommonLogger;
45
+ /**
46
+ * Creates a "child" CommonLogger with prefix (one or multiple).
48
47
  */
49
- export declare const noopLogger: SimpleLogger;
48
+ export declare function commonLoggerPrefix(logger: CommonLogger, ...prefixes: any[]): CommonLogger;
@@ -1,27 +1,73 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noopLogger = exports.createSimpleLogger = void 0;
3
+ exports.commonLoggerPrefix = exports.commonLoggerPipe = exports.commonLoggerMinLevel = exports.commonLoggerNoop = exports.commonLogLevelNumber = void 0;
4
+ const index_1 = require("../index");
5
+ exports.commonLogLevelNumber = {
6
+ log: 10,
7
+ warn: 20,
8
+ error: 30,
9
+ };
4
10
  /**
5
- * Creates a SimpleLogger from CommonLogger.
11
+ * SimpleLogger that does nothing (noop).
6
12
  *
7
13
  * @experimental
8
14
  */
9
- function createSimpleLogger(logger) {
10
- return Object.assign(((...args) => logger.log(...args)), {
11
- log: (...args) => logger.log(...args),
12
- warn: (...args) => logger.warn(...args),
13
- error: (...args) => logger.error(...args),
14
- });
15
+ exports.commonLoggerNoop = {
16
+ log: index_1._noop,
17
+ warn: index_1._noop,
18
+ error: index_1._noop,
19
+ };
20
+ /**
21
+ * Creates a "child" logger that is "limited" to the specified CommonLogLevel.
22
+ */
23
+ function commonLoggerMinLevel(logger, minLevel, mutate = false) {
24
+ const level = exports.commonLogLevelNumber[minLevel];
25
+ if (mutate) {
26
+ if (level > exports.commonLogLevelNumber['log']) {
27
+ logger.log = index_1._noop;
28
+ if (level > exports.commonLogLevelNumber['warn']) {
29
+ logger.warn = index_1._noop;
30
+ if (level > exports.commonLogLevelNumber['error']) {
31
+ logger.error = index_1._noop;
32
+ }
33
+ }
34
+ }
35
+ return logger;
36
+ }
37
+ if (level <= exports.commonLogLevelNumber['log']) {
38
+ // All levels are kept
39
+ return logger;
40
+ }
41
+ if (level > exports.commonLogLevelNumber['error']) {
42
+ // "Log nothing" logger
43
+ return exports.commonLoggerNoop;
44
+ }
45
+ return {
46
+ log: index_1._noop,
47
+ warn: level <= exports.commonLogLevelNumber['warn'] ? logger.warn.bind(logger) : index_1._noop,
48
+ error: logger.error.bind(logger), // otherwise it's "log nothing" logger (same as noopLogger)
49
+ };
15
50
  }
16
- exports.createSimpleLogger = createSimpleLogger;
17
- const noop = () => { };
51
+ exports.commonLoggerMinLevel = commonLoggerMinLevel;
18
52
  /**
19
- * SimpleLogger that does nothing (noop).
20
- *
21
- * @experimental
53
+ * Creates a "proxy" CommonLogger that pipes log messages to all provided sub-loggers.
22
54
  */
23
- exports.noopLogger = createSimpleLogger({
24
- log: noop,
25
- warn: noop,
26
- error: noop,
27
- });
55
+ function commonLoggerPipe(loggers) {
56
+ return {
57
+ log: (...args) => loggers.forEach(logger => logger.log(...args)),
58
+ warn: (...args) => loggers.forEach(logger => logger.warn(...args)),
59
+ error: (...args) => loggers.forEach(logger => logger.error(...args)),
60
+ };
61
+ }
62
+ exports.commonLoggerPipe = commonLoggerPipe;
63
+ /**
64
+ * Creates a "child" CommonLogger with prefix (one or multiple).
65
+ */
66
+ function commonLoggerPrefix(logger, ...prefixes) {
67
+ return {
68
+ log: (...args) => logger.log(...prefixes, ...args),
69
+ warn: (...args) => logger.warn(...prefixes, ...args),
70
+ error: (...args) => logger.error(...prefixes, ...args),
71
+ };
72
+ }
73
+ exports.commonLoggerPrefix = commonLoggerPrefix;
@@ -1,3 +1,4 @@
1
+ import { CommonLogger } from '..';
1
2
  export interface PRetryOptions {
2
3
  /**
3
4
  * How many attempts to try.
@@ -52,6 +53,10 @@ export interface PRetryOptions {
52
53
  * @default false
53
54
  */
54
55
  logNone?: boolean;
56
+ /**
57
+ * Default to `console`
58
+ */
59
+ logger?: CommonLogger;
55
60
  }
56
61
  /**
57
62
  * Returns a Function (!), enhanced with retry capabilities.
@@ -8,7 +8,7 @@ const __1 = require("..");
8
8
  */
9
9
  // eslint-disable-next-line @typescript-eslint/ban-types
10
10
  function pRetry(fn, opt = {}) {
11
- const { maxAttempts = 4, delay: initialDelay = 1000, delayMultiplier = 2, predicate } = opt;
11
+ const { maxAttempts = 4, delay: initialDelay = 1000, delayMultiplier = 2, predicate, logger = console, } = opt;
12
12
  let { logFirstAttempt = false, logRetries = true, logFailures = false, logSuccess = false } = opt;
13
13
  if (opt.logAll) {
14
14
  logFirstAttempt = logRetries = logFailures = true;
@@ -26,17 +26,17 @@ function pRetry(fn, opt = {}) {
26
26
  try {
27
27
  attempt++;
28
28
  if ((attempt === 1 && logFirstAttempt) || (attempt > 1 && logRetries)) {
29
- console.log(`${fname} attempt #${attempt}...`);
29
+ logger.log(`${fname} attempt #${attempt}...`);
30
30
  }
31
31
  const r = await fn.apply(this, args);
32
32
  if (logSuccess) {
33
- console.log(`${fname} attempt #${attempt} succeeded in ${(0, __1._since)(started)}`);
33
+ logger.log(`${fname} attempt #${attempt} succeeded in ${(0, __1._since)(started)}`);
34
34
  }
35
35
  resolve(r);
36
36
  }
37
37
  catch (err) {
38
38
  if (logFailures) {
39
- console.warn(`${fname} attempt #${attempt} error in ${(0, __1._since)(started)}:\n${(0, __1._stringifyAny)(err, {
39
+ logger.warn(`${fname} attempt #${attempt} error in ${(0, __1._since)(started)}:\n${(0, __1._stringifyAny)(err, {
40
40
  includeErrorData: true,
41
41
  })}`);
42
42
  }
@@ -18,11 +18,11 @@ import { _getArgsSignature, _getMethodSignature } from './decorator.util';
18
18
  export function _LogMethod(opt = {}) {
19
19
  return (target, key, descriptor) => {
20
20
  if (typeof descriptor.value !== 'function') {
21
- throw new TypeError('@LogMillis can be applied only to methods');
21
+ throw new TypeError('@_LogMethod can be applied only to methods');
22
22
  }
23
23
  const originalFn = descriptor.value;
24
24
  const keyStr = String(key);
25
- const { avg, noLogArgs, logStart, logResult, noLogResultLength } = opt;
25
+ const { avg, noLogArgs, logStart, logResult, noLogResultLength, logger = console } = opt;
26
26
  let { logResultFn } = opt;
27
27
  if (!logResultFn) {
28
28
  if (logResult) {
@@ -43,36 +43,36 @@ export function _LogMethod(opt = {}) {
43
43
  const argsStr = _getArgsSignature(args, noLogArgs);
44
44
  const callSignature = `${methodSignature}(${argsStr}) #${++count}`;
45
45
  if (logStart)
46
- console.log(`>> ${callSignature}`);
46
+ logger.log(`>> ${callSignature}`);
47
47
  try {
48
48
  const res = originalFn.apply(ctx, args);
49
49
  if (res && typeof res.then === 'function') {
50
50
  // Result is a Promise, will wait for resolution or rejection
51
51
  return res
52
52
  .then((r) => {
53
- logFinished(callSignature, started, sma, logResultFn, r);
53
+ logFinished(logger, callSignature, started, sma, logResultFn, r);
54
54
  return r;
55
55
  })
56
56
  .catch((err) => {
57
- logFinished(callSignature, started, sma, logResultFn, undefined, err);
57
+ logFinished(logger, callSignature, started, sma, logResultFn, undefined, err);
58
58
  return Promise.reject(err);
59
59
  });
60
60
  }
61
61
  else {
62
62
  // not a Promise
63
- logFinished(callSignature, started, sma, logResultFn, res);
63
+ logFinished(logger, callSignature, started, sma, logResultFn, res);
64
64
  return res;
65
65
  }
66
66
  }
67
67
  catch (err) {
68
- logFinished(callSignature, started, sma, logResultFn, undefined, err);
68
+ logFinished(logger, callSignature, started, sma, logResultFn, undefined, err);
69
69
  throw err; // rethrow
70
70
  }
71
71
  };
72
72
  return descriptor;
73
73
  };
74
74
  }
75
- function logFinished(callSignature, started, sma, logResultFn, res, err) {
75
+ function logFinished(logger, callSignature, started, sma, logResultFn, res, err) {
76
76
  const millis = Date.now() - started;
77
77
  const t = ['<<', callSignature, 'took', _ms(millis)];
78
78
  if (sma) {
@@ -84,5 +84,5 @@ function logFinished(callSignature, started, sma, logResultFn, res, err) {
84
84
  else if (logResultFn) {
85
85
  t.push(...logResultFn(res));
86
86
  }
87
- console.log(t.filter(Boolean).join(' '));
87
+ logger.log(t.filter(Boolean).join(' '));
88
88
  }