@naturalcycles/js-lib 14.63.0 → 14.67.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/decorators/logMethod.decorator.d.ts +5 -0
- package/dist/decorators/logMethod.decorator.js +9 -9
- package/dist/decorators/memo.decorator.d.ts +11 -0
- package/dist/decorators/memo.decorator.js +6 -6
- package/dist/decorators/memoFn.js +5 -5
- package/dist/decorators/memoSimple.decorator.d.ts +2 -0
- package/dist/decorators/memoSimple.decorator.js +4 -10
- package/dist/error/error.model.d.ts +5 -0
- package/dist/error/tryCatch.d.ts +5 -0
- package/dist/error/tryCatch.js +3 -6
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -2
- package/dist/log/commonLogger.d.ts +7 -12
- package/dist/log/commonLogger.js +53 -18
- package/dist/promise/pRetry.d.ts +5 -0
- package/dist/promise/pRetry.js +4 -4
- package/dist-esm/decorators/logMethod.decorator.js +9 -9
- package/dist-esm/decorators/memo.decorator.js +6 -6
- package/dist-esm/decorators/memoFn.js +5 -5
- package/dist-esm/decorators/memoSimple.decorator.js +4 -10
- package/dist-esm/error/tryCatch.js +3 -3
- package/dist-esm/index.js +2 -2
- package/dist-esm/log/commonLogger.js +50 -16
- package/dist-esm/promise/pRetry.js +4 -4
- package/package.json +1 -1
- package/src/decorators/logMethod.decorator.ts +15 -9
- package/src/decorators/memo.decorator.ts +27 -17
- package/src/decorators/memoFn.ts +11 -10
- package/src/decorators/memoSimple.decorator.ts +6 -4
- package/src/error/error.model.ts +7 -0
- package/src/error/tryCatch.ts +9 -7
- package/src/index.ts +6 -4
- package/src/log/commonLogger.ts +57 -22
- package/src/promise/pRetry.ts +16 -5
|
@@ -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('@
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
61
|
+
logger.log(`${methodSignature} @memo.dropCache()`);
|
|
68
62
|
cache.clear();
|
|
69
63
|
};
|
|
70
64
|
return descriptor;
|
package/dist/error/tryCatch.d.ts
CHANGED
|
@@ -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.
|
package/dist/error/tryCatch.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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,
|
|
57
|
+
import { CommonLogLevel, CommonLogFunction, CommonLogger, commonLoggerMinLevel, noopLogger, commonLogLevelNumber, commonLoggerPipe } 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,
|
|
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,
|
|
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, noopLogger, commonLogLevelNumber, commonLoggerPipe, _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.
|
|
6
|
+
exports._safeJsonStringify = exports.commonLoggerPipe = exports.commonLogLevelNumber = exports.noopLogger = 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,9 @@ 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, "
|
|
215
|
+
Object.defineProperty(exports, "commonLoggerMinLevel", { enumerable: true, get: function () { return commonLogger_1.commonLoggerMinLevel; } });
|
|
216
216
|
Object.defineProperty(exports, "noopLogger", { enumerable: true, get: function () { return commonLogger_1.noopLogger; } });
|
|
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; } });
|
|
217
219
|
const safeJsonStringify_1 = require("./string/safeJsonStringify");
|
|
218
220
|
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,16 @@ export interface CommonLogger {
|
|
|
28
29
|
error: CommonLogFunction;
|
|
29
30
|
}
|
|
30
31
|
/**
|
|
31
|
-
*
|
|
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
|
|
37
|
-
}
|
|
36
|
+
export declare const noopLogger: CommonLogger;
|
|
38
37
|
/**
|
|
39
|
-
* Creates a
|
|
40
|
-
*
|
|
41
|
-
* @experimental
|
|
38
|
+
* Creates a "child" logger that is "limited" to the specified CommonLogLevel.
|
|
42
39
|
*/
|
|
43
|
-
export declare function
|
|
40
|
+
export declare function commonLoggerMinLevel(logger: CommonLogger, minLevel: CommonLogLevel, mutate?: boolean): CommonLogger;
|
|
44
41
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* @experimental
|
|
42
|
+
* Creates a "proxy" CommonLogger that pipes log messages to all provided sub-loggers.
|
|
48
43
|
*/
|
|
49
|
-
export declare
|
|
44
|
+
export declare function commonLoggerPipe(loggers: CommonLogger[]): CommonLogger;
|
package/dist/log/commonLogger.js
CHANGED
|
@@ -1,27 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.noopLogger = exports.
|
|
3
|
+
exports.commonLoggerPipe = exports.commonLoggerMinLevel = exports.noopLogger = 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
|
-
*
|
|
11
|
+
* SimpleLogger that does nothing (noop).
|
|
6
12
|
*
|
|
7
13
|
* @experimental
|
|
8
14
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
exports.noopLogger = {
|
|
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.noopLogger;
|
|
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.
|
|
17
|
-
const noop = () => { };
|
|
51
|
+
exports.commonLoggerMinLevel = commonLoggerMinLevel;
|
|
18
52
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* @experimental
|
|
53
|
+
* Creates a "proxy" CommonLogger that pipes log messages to all provided sub-loggers.
|
|
22
54
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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;
|
package/dist/promise/pRetry.d.ts
CHANGED
|
@@ -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.
|
package/dist/promise/pRetry.js
CHANGED
|
@@ -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
|
-
|
|
29
|
+
logger.log(`${fname} attempt #${attempt}...`);
|
|
30
30
|
}
|
|
31
31
|
const r = await fn.apply(this, args);
|
|
32
32
|
if (logSuccess) {
|
|
33
|
-
|
|
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
|
-
|
|
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('@
|
|
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
|
-
|
|
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
|
-
|
|
87
|
+
logger.log(t.filter(Boolean).join(' '));
|
|
88
88
|
}
|