@naturalcycles/js-lib 14.56.1 → 14.60.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/array/array.util.d.ts +4 -0
- package/dist/array/array.util.js +4 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +10 -1
- package/dist/lazy.d.ts +30 -0
- package/dist/lazy.js +63 -0
- package/dist/log/commonLogger.d.ts +49 -0
- package/dist/log/commonLogger.js +27 -0
- package/dist/string/safeJsonStringify.d.ts +7 -0
- package/dist/string/safeJsonStringify.js +38 -0
- package/dist/types.d.ts +1 -1
- package/dist-esm/array/array.util.js +4 -0
- package/dist-esm/index.js +4 -1
- package/dist-esm/lazy.js +57 -0
- package/dist-esm/log/commonLogger.js +23 -0
- package/dist-esm/string/safeJsonStringify.js +34 -0
- package/package.json +1 -1
- package/src/array/array.util.ts +4 -0
- package/src/index.ts +20 -0
- package/src/lazy.ts +73 -0
- package/src/log/commonLogger.ts +65 -0
- package/src/string/safeJsonStringify.ts +44 -0
- package/src/types.ts +1 -1
|
@@ -16,6 +16,8 @@ export declare function _chunk<T>(array: readonly T[], size?: number): T[][];
|
|
|
16
16
|
/**
|
|
17
17
|
* Polyfill to Array.flat() with depth=1.
|
|
18
18
|
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
|
|
19
|
+
*
|
|
20
|
+
* @deprecated prefer native Array.flat(), it's supported since iOS 12
|
|
19
21
|
*/
|
|
20
22
|
export declare function _flatten<T>(arrays: T[][]): T[];
|
|
21
23
|
/**
|
|
@@ -25,6 +27,8 @@ export declare function _flatten<T>(arrays: T[][]): T[];
|
|
|
25
27
|
* @return Returns the new flattened array.
|
|
26
28
|
*
|
|
27
29
|
* Based on: https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_flattendeep
|
|
30
|
+
*
|
|
31
|
+
* @deprecated prefer native Array.flat(), it's supported since iOS 12
|
|
28
32
|
*/
|
|
29
33
|
export declare function _flattenDeep<T>(arr: RecursiveArray<T>): T[];
|
|
30
34
|
/**
|
package/dist/array/array.util.js
CHANGED
|
@@ -22,6 +22,8 @@ exports._chunk = _chunk;
|
|
|
22
22
|
/**
|
|
23
23
|
* Polyfill to Array.flat() with depth=1.
|
|
24
24
|
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
|
|
25
|
+
*
|
|
26
|
+
* @deprecated prefer native Array.flat(), it's supported since iOS 12
|
|
25
27
|
*/
|
|
26
28
|
function _flatten(arrays) {
|
|
27
29
|
// to flat single level array
|
|
@@ -35,6 +37,8 @@ exports._flatten = _flatten;
|
|
|
35
37
|
* @return Returns the new flattened array.
|
|
36
38
|
*
|
|
37
39
|
* Based on: https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_flattendeep
|
|
40
|
+
*
|
|
41
|
+
* @deprecated prefer native Array.flat(), it's supported since iOS 12
|
|
38
42
|
*/
|
|
39
43
|
function _flattenDeep(arr) {
|
|
40
44
|
return Array.isArray(arr)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { _by, _chunk, _countBy, _difference, _dropRightWhile, _dropWhile, _findLast, _flatten, _flattenDeep, _groupBy, _intersection, _last, _mapToObject, _shuffle, _sortBy, _sum, _sumBy, _takeRightWhile, _takeWhile, _uniq, _uniqBy } from './array/array.util';
|
|
2
|
+
import { _defineLazyProperty, _defineLazyProps, _lazyValue } from './lazy';
|
|
2
3
|
import { _parseQueryString } from './string/url.util';
|
|
3
4
|
import { _range } from './array/range';
|
|
4
5
|
import { PromiseDecoratorCfg, PromiseDecoratorResp, _createPromiseDecorator } from './decorators/createPromiseDecorator';
|
|
@@ -53,5 +54,7 @@ import { Class, ConditionalExcept, ConditionalPick, Merge, Promisable, PromiseVa
|
|
|
53
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';
|
|
54
55
|
import { _gb, _hb, _kb, _mb } from './unit/size.util';
|
|
55
56
|
import { is } from './vendor/is';
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
import { CommonLogLevel, CommonLogFunction, CommonLogger, SimpleLogger, createSimpleLogger, noopLogger } from './log/commonLogger';
|
|
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, };
|
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._parseQueryString = exports.generateJsonSchemaFromData = void 0;
|
|
6
|
+
exports._safeJsonStringify = exports.noopLogger = exports.createSimpleLogger = 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; } });
|
|
@@ -26,6 +26,10 @@ Object.defineProperty(exports, "_takeRightWhile", { enumerable: true, get: funct
|
|
|
26
26
|
Object.defineProperty(exports, "_takeWhile", { enumerable: true, get: function () { return array_util_1._takeWhile; } });
|
|
27
27
|
Object.defineProperty(exports, "_uniq", { enumerable: true, get: function () { return array_util_1._uniq; } });
|
|
28
28
|
Object.defineProperty(exports, "_uniqBy", { enumerable: true, get: function () { return array_util_1._uniqBy; } });
|
|
29
|
+
const lazy_1 = require("./lazy");
|
|
30
|
+
Object.defineProperty(exports, "_defineLazyProperty", { enumerable: true, get: function () { return lazy_1._defineLazyProperty; } });
|
|
31
|
+
Object.defineProperty(exports, "_defineLazyProps", { enumerable: true, get: function () { return lazy_1._defineLazyProps; } });
|
|
32
|
+
Object.defineProperty(exports, "_lazyValue", { enumerable: true, get: function () { return lazy_1._lazyValue; } });
|
|
29
33
|
const url_util_1 = require("./string/url.util");
|
|
30
34
|
Object.defineProperty(exports, "_parseQueryString", { enumerable: true, get: function () { return url_util_1._parseQueryString; } });
|
|
31
35
|
const range_1 = require("./array/range");
|
|
@@ -207,3 +211,8 @@ Object.defineProperty(exports, "_kb", { enumerable: true, get: function () { ret
|
|
|
207
211
|
Object.defineProperty(exports, "_mb", { enumerable: true, get: function () { return size_util_1._mb; } });
|
|
208
212
|
const is_1 = require("./vendor/is");
|
|
209
213
|
Object.defineProperty(exports, "is", { enumerable: true, get: function () { return is_1.is; } });
|
|
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; } });
|
|
217
|
+
const safeJsonStringify_1 = require("./string/safeJsonStringify");
|
|
218
|
+
Object.defineProperty(exports, "_safeJsonStringify", { enumerable: true, get: function () { return safeJsonStringify_1._safeJsonStringify; } });
|
package/dist/lazy.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AnyFunction, AnyObject } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* const value = lazyValue(() => expensiveComputation())
|
|
4
|
+
*
|
|
5
|
+
* value() // calls expensiveComputation() once
|
|
6
|
+
* value() // returns cached result
|
|
7
|
+
* value() // returns cached result
|
|
8
|
+
*
|
|
9
|
+
* Based on: https://github.com/sindresorhus/lazy-value
|
|
10
|
+
*/
|
|
11
|
+
export declare function _lazyValue<T extends AnyFunction>(fn: T): T;
|
|
12
|
+
/**
|
|
13
|
+
* interface Obj {
|
|
14
|
+
* v: number
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* const obj = {} as Obj
|
|
18
|
+
*
|
|
19
|
+
* _defineLazyProperty(obj, 'v', () => expensiveComputation())
|
|
20
|
+
* obj.v // runs expensiveComputation() once
|
|
21
|
+
* obj.v // cached value
|
|
22
|
+
* obj.v // cached value
|
|
23
|
+
*
|
|
24
|
+
* Based on: https://github.com/sindresorhus/define-lazy-prop
|
|
25
|
+
*/
|
|
26
|
+
export declare function _defineLazyProperty<OBJ extends AnyObject>(obj: OBJ, propertyName: keyof OBJ, fn: AnyFunction): OBJ;
|
|
27
|
+
/**
|
|
28
|
+
* Like _defineLazyProperty, but allows to define multiple props at once.
|
|
29
|
+
*/
|
|
30
|
+
export declare function _defineLazyProps<OBJ extends AnyObject>(obj: OBJ, props: Partial<Record<keyof OBJ, AnyFunction>>): OBJ;
|
package/dist/lazy.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports._defineLazyProps = exports._defineLazyProperty = exports._lazyValue = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* const value = lazyValue(() => expensiveComputation())
|
|
6
|
+
*
|
|
7
|
+
* value() // calls expensiveComputation() once
|
|
8
|
+
* value() // returns cached result
|
|
9
|
+
* value() // returns cached result
|
|
10
|
+
*
|
|
11
|
+
* Based on: https://github.com/sindresorhus/lazy-value
|
|
12
|
+
*/
|
|
13
|
+
function _lazyValue(fn) {
|
|
14
|
+
let isCalled = false;
|
|
15
|
+
let result;
|
|
16
|
+
return (() => {
|
|
17
|
+
if (!isCalled) {
|
|
18
|
+
isCalled = true;
|
|
19
|
+
result = fn();
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
exports._lazyValue = _lazyValue;
|
|
25
|
+
/**
|
|
26
|
+
* interface Obj {
|
|
27
|
+
* v: number
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* const obj = {} as Obj
|
|
31
|
+
*
|
|
32
|
+
* _defineLazyProperty(obj, 'v', () => expensiveComputation())
|
|
33
|
+
* obj.v // runs expensiveComputation() once
|
|
34
|
+
* obj.v // cached value
|
|
35
|
+
* obj.v // cached value
|
|
36
|
+
*
|
|
37
|
+
* Based on: https://github.com/sindresorhus/define-lazy-prop
|
|
38
|
+
*/
|
|
39
|
+
function _defineLazyProperty(obj, propertyName, fn) {
|
|
40
|
+
const define = (value) => Object.defineProperty(obj, propertyName, { value, enumerable: true, writable: true });
|
|
41
|
+
Object.defineProperty(obj, propertyName, {
|
|
42
|
+
configurable: true,
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get() {
|
|
45
|
+
const result = fn();
|
|
46
|
+
define(result);
|
|
47
|
+
return result;
|
|
48
|
+
},
|
|
49
|
+
set(value) {
|
|
50
|
+
define(value);
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
return obj;
|
|
54
|
+
}
|
|
55
|
+
exports._defineLazyProperty = _defineLazyProperty;
|
|
56
|
+
/**
|
|
57
|
+
* Like _defineLazyProperty, but allows to define multiple props at once.
|
|
58
|
+
*/
|
|
59
|
+
function _defineLazyProps(obj, props) {
|
|
60
|
+
Object.entries(props).forEach(([k, fn]) => _defineLazyProperty(obj, k, fn));
|
|
61
|
+
return obj;
|
|
62
|
+
}
|
|
63
|
+
exports._defineLazyProps = _defineLazyProps;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* These levels follow console.* naming,
|
|
3
|
+
* so you can use console[level] safely.
|
|
4
|
+
*
|
|
5
|
+
* `log` is considered default level.
|
|
6
|
+
*
|
|
7
|
+
* For simplicity - only these 3 levels are kept.
|
|
8
|
+
*
|
|
9
|
+
* @experimental
|
|
10
|
+
*/
|
|
11
|
+
export declare type CommonLogLevel = 'log' | 'warn' | 'error';
|
|
12
|
+
/**
|
|
13
|
+
* Function that takes any number of arguments and logs them all.
|
|
14
|
+
* It is expected that logged arguments are separated by "space", like console.log does.
|
|
15
|
+
*
|
|
16
|
+
* @experimental
|
|
17
|
+
*/
|
|
18
|
+
export declare type CommonLogFunction = (...args: any[]) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Interface is inspired/compatible with `console.*`
|
|
21
|
+
* So, `console` is a valid CommonLogger implementation as-is.
|
|
22
|
+
*
|
|
23
|
+
* @experimental
|
|
24
|
+
*/
|
|
25
|
+
export interface CommonLogger {
|
|
26
|
+
log: CommonLogFunction;
|
|
27
|
+
warn: CommonLogFunction;
|
|
28
|
+
error: CommonLogFunction;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
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')`
|
|
33
|
+
*
|
|
34
|
+
* @experimental
|
|
35
|
+
*/
|
|
36
|
+
export interface SimpleLogger extends CommonLogFunction, CommonLogger {
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Creates a SimpleLogger from CommonLogger.
|
|
40
|
+
*
|
|
41
|
+
* @experimental
|
|
42
|
+
*/
|
|
43
|
+
export declare function createSimpleLogger(logger: CommonLogger): SimpleLogger;
|
|
44
|
+
/**
|
|
45
|
+
* SimpleLogger that does nothing (noop).
|
|
46
|
+
*
|
|
47
|
+
* @experimental
|
|
48
|
+
*/
|
|
49
|
+
export declare const noopLogger: SimpleLogger;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.noopLogger = exports.createSimpleLogger = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Creates a SimpleLogger from CommonLogger.
|
|
6
|
+
*
|
|
7
|
+
* @experimental
|
|
8
|
+
*/
|
|
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
|
+
}
|
|
16
|
+
exports.createSimpleLogger = createSimpleLogger;
|
|
17
|
+
const noop = () => { };
|
|
18
|
+
/**
|
|
19
|
+
* SimpleLogger that does nothing (noop).
|
|
20
|
+
*
|
|
21
|
+
* @experimental
|
|
22
|
+
*/
|
|
23
|
+
exports.noopLogger = createSimpleLogger({
|
|
24
|
+
log: noop,
|
|
25
|
+
warn: noop,
|
|
26
|
+
error: noop,
|
|
27
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Reviver } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* JSON.stringify that avoids circular references, prints them as [Circular ~]
|
|
4
|
+
*
|
|
5
|
+
* Based on: https://github.com/moll/json-stringify-safe/
|
|
6
|
+
*/
|
|
7
|
+
export declare function _safeJsonStringify(obj: any, replacer?: Reviver, spaces?: number, cycleReplacer?: Reviver): string;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports._safeJsonStringify = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* JSON.stringify that avoids circular references, prints them as [Circular ~]
|
|
6
|
+
*
|
|
7
|
+
* Based on: https://github.com/moll/json-stringify-safe/
|
|
8
|
+
*/
|
|
9
|
+
function _safeJsonStringify(obj, replacer, spaces, cycleReplacer) {
|
|
10
|
+
return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);
|
|
11
|
+
}
|
|
12
|
+
exports._safeJsonStringify = _safeJsonStringify;
|
|
13
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions, no-bitwise */
|
|
14
|
+
function serializer(replacer, cycleReplacer) {
|
|
15
|
+
const stack = [];
|
|
16
|
+
const keys = [];
|
|
17
|
+
if (cycleReplacer == null) {
|
|
18
|
+
cycleReplacer = function (key, value) {
|
|
19
|
+
if (stack[0] === value)
|
|
20
|
+
return '[Circular ~]';
|
|
21
|
+
return '[Circular ~.' + keys.slice(0, stack.indexOf(value)).join('.') + ']';
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return function (key, value) {
|
|
25
|
+
if (stack.length > 0) {
|
|
26
|
+
const thisPos = stack.indexOf(this);
|
|
27
|
+
~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
|
|
28
|
+
~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
|
|
29
|
+
if (~stack.indexOf(value)) {
|
|
30
|
+
value = cycleReplacer.call(this, key, value);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
stack.push(value);
|
|
35
|
+
}
|
|
36
|
+
return replacer == null ? value : replacer.call(this, key, value);
|
|
37
|
+
};
|
|
38
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -136,7 +136,7 @@ export declare type BaseDBEntity = Partial<SavedDBEntity>;
|
|
|
136
136
|
export declare type Saved<E> = Merge<E, SavedDBEntity>;
|
|
137
137
|
export declare type Unsaved<E> = Merge<E, BaseDBEntity>;
|
|
138
138
|
/**
|
|
139
|
-
* Named type for JSON.parse second argument
|
|
139
|
+
* Named type for JSON.parse / JSON.stringify second argument
|
|
140
140
|
*/
|
|
141
141
|
export declare type Reviver = (this: any, key: string, value: any) => any;
|
|
142
142
|
/**
|
|
@@ -18,6 +18,8 @@ export function _chunk(array, size = 1) {
|
|
|
18
18
|
/**
|
|
19
19
|
* Polyfill to Array.flat() with depth=1.
|
|
20
20
|
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
|
|
21
|
+
*
|
|
22
|
+
* @deprecated prefer native Array.flat(), it's supported since iOS 12
|
|
21
23
|
*/
|
|
22
24
|
export function _flatten(arrays) {
|
|
23
25
|
// to flat single level array
|
|
@@ -30,6 +32,8 @@ export function _flatten(arrays) {
|
|
|
30
32
|
* @return Returns the new flattened array.
|
|
31
33
|
*
|
|
32
34
|
* Based on: https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_flattendeep
|
|
35
|
+
*
|
|
36
|
+
* @deprecated prefer native Array.flat(), it's supported since iOS 12
|
|
33
37
|
*/
|
|
34
38
|
export function _flattenDeep(arr) {
|
|
35
39
|
return Array.isArray(arr)
|
package/dist-esm/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { _by, _chunk, _countBy, _difference, _dropRightWhile, _dropWhile, _findLast, _flatten, _flattenDeep, _groupBy, _intersection, _last, _mapToObject, _shuffle, _sortBy, _sum, _sumBy, _takeRightWhile, _takeWhile, _uniq, _uniqBy, } from './array/array.util';
|
|
2
|
+
import { _defineLazyProperty, _defineLazyProps, _lazyValue } from './lazy';
|
|
2
3
|
import { _parseQueryString } from './string/url.util';
|
|
3
4
|
import { _range } from './array/range';
|
|
4
5
|
import { _createPromiseDecorator, } from './decorators/createPromiseDecorator';
|
|
@@ -49,4 +50,6 @@ import { _ms, _since } from './time/time.util';
|
|
|
49
50
|
import { _noop, _objectKeys, _passNothingPredicate, _passthroughMapper, _passthroughPredicate, _passUndefinedMapper, _stringMapEntries, _stringMapValues, } from './types';
|
|
50
51
|
import { _gb, _hb, _kb, _mb } from './unit/size.util';
|
|
51
52
|
import { is } from './vendor/is';
|
|
52
|
-
|
|
53
|
+
import { createSimpleLogger, noopLogger, } from './log/commonLogger';
|
|
54
|
+
import { _safeJsonStringify } from './string/safeJsonStringify';
|
|
55
|
+
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, };
|
package/dist-esm/lazy.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* const value = lazyValue(() => expensiveComputation())
|
|
3
|
+
*
|
|
4
|
+
* value() // calls expensiveComputation() once
|
|
5
|
+
* value() // returns cached result
|
|
6
|
+
* value() // returns cached result
|
|
7
|
+
*
|
|
8
|
+
* Based on: https://github.com/sindresorhus/lazy-value
|
|
9
|
+
*/
|
|
10
|
+
export function _lazyValue(fn) {
|
|
11
|
+
let isCalled = false;
|
|
12
|
+
let result;
|
|
13
|
+
return (() => {
|
|
14
|
+
if (!isCalled) {
|
|
15
|
+
isCalled = true;
|
|
16
|
+
result = fn();
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* interface Obj {
|
|
23
|
+
* v: number
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* const obj = {} as Obj
|
|
27
|
+
*
|
|
28
|
+
* _defineLazyProperty(obj, 'v', () => expensiveComputation())
|
|
29
|
+
* obj.v // runs expensiveComputation() once
|
|
30
|
+
* obj.v // cached value
|
|
31
|
+
* obj.v // cached value
|
|
32
|
+
*
|
|
33
|
+
* Based on: https://github.com/sindresorhus/define-lazy-prop
|
|
34
|
+
*/
|
|
35
|
+
export function _defineLazyProperty(obj, propertyName, fn) {
|
|
36
|
+
const define = (value) => Object.defineProperty(obj, propertyName, { value, enumerable: true, writable: true });
|
|
37
|
+
Object.defineProperty(obj, propertyName, {
|
|
38
|
+
configurable: true,
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get() {
|
|
41
|
+
const result = fn();
|
|
42
|
+
define(result);
|
|
43
|
+
return result;
|
|
44
|
+
},
|
|
45
|
+
set(value) {
|
|
46
|
+
define(value);
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
return obj;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Like _defineLazyProperty, but allows to define multiple props at once.
|
|
53
|
+
*/
|
|
54
|
+
export function _defineLazyProps(obj, props) {
|
|
55
|
+
Object.entries(props).forEach(([k, fn]) => _defineLazyProperty(obj, k, fn));
|
|
56
|
+
return obj;
|
|
57
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a SimpleLogger from CommonLogger.
|
|
3
|
+
*
|
|
4
|
+
* @experimental
|
|
5
|
+
*/
|
|
6
|
+
export function createSimpleLogger(logger) {
|
|
7
|
+
return Object.assign(((...args) => logger.log(...args)), {
|
|
8
|
+
log: (...args) => logger.log(...args),
|
|
9
|
+
warn: (...args) => logger.warn(...args),
|
|
10
|
+
error: (...args) => logger.error(...args),
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
const noop = () => { };
|
|
14
|
+
/**
|
|
15
|
+
* SimpleLogger that does nothing (noop).
|
|
16
|
+
*
|
|
17
|
+
* @experimental
|
|
18
|
+
*/
|
|
19
|
+
export const noopLogger = createSimpleLogger({
|
|
20
|
+
log: noop,
|
|
21
|
+
warn: noop,
|
|
22
|
+
error: noop,
|
|
23
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON.stringify that avoids circular references, prints them as [Circular ~]
|
|
3
|
+
*
|
|
4
|
+
* Based on: https://github.com/moll/json-stringify-safe/
|
|
5
|
+
*/
|
|
6
|
+
export function _safeJsonStringify(obj, replacer, spaces, cycleReplacer) {
|
|
7
|
+
return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);
|
|
8
|
+
}
|
|
9
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions, no-bitwise */
|
|
10
|
+
function serializer(replacer, cycleReplacer) {
|
|
11
|
+
const stack = [];
|
|
12
|
+
const keys = [];
|
|
13
|
+
if (cycleReplacer == null) {
|
|
14
|
+
cycleReplacer = function (key, value) {
|
|
15
|
+
if (stack[0] === value)
|
|
16
|
+
return '[Circular ~]';
|
|
17
|
+
return '[Circular ~.' + keys.slice(0, stack.indexOf(value)).join('.') + ']';
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return function (key, value) {
|
|
21
|
+
if (stack.length > 0) {
|
|
22
|
+
const thisPos = stack.indexOf(this);
|
|
23
|
+
~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
|
|
24
|
+
~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
|
|
25
|
+
if (~stack.indexOf(value)) {
|
|
26
|
+
value = cycleReplacer.call(this, key, value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
stack.push(value);
|
|
31
|
+
}
|
|
32
|
+
return replacer == null ? value : replacer.call(this, key, value);
|
|
33
|
+
};
|
|
34
|
+
}
|
package/package.json
CHANGED
package/src/array/array.util.ts
CHANGED
|
@@ -22,6 +22,8 @@ export function _chunk<T>(array: readonly T[], size = 1): T[][] {
|
|
|
22
22
|
/**
|
|
23
23
|
* Polyfill to Array.flat() with depth=1.
|
|
24
24
|
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
|
|
25
|
+
*
|
|
26
|
+
* @deprecated prefer native Array.flat(), it's supported since iOS 12
|
|
25
27
|
*/
|
|
26
28
|
export function _flatten<T>(arrays: T[][]): T[] {
|
|
27
29
|
// to flat single level array
|
|
@@ -35,6 +37,8 @@ export function _flatten<T>(arrays: T[][]): T[] {
|
|
|
35
37
|
* @return Returns the new flattened array.
|
|
36
38
|
*
|
|
37
39
|
* Based on: https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_flattendeep
|
|
40
|
+
*
|
|
41
|
+
* @deprecated prefer native Array.flat(), it's supported since iOS 12
|
|
38
42
|
*/
|
|
39
43
|
export function _flattenDeep<T>(arr: RecursiveArray<T>): T[] {
|
|
40
44
|
return Array.isArray(arr)
|
package/src/index.ts
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
_uniq,
|
|
22
22
|
_uniqBy,
|
|
23
23
|
} from './array/array.util'
|
|
24
|
+
import { _defineLazyProperty, _defineLazyProps, _lazyValue } from './lazy'
|
|
24
25
|
import { _parseQueryString } from './string/url.util'
|
|
25
26
|
import { _range } from './array/range'
|
|
26
27
|
import {
|
|
@@ -223,6 +224,15 @@ import {
|
|
|
223
224
|
} from './types'
|
|
224
225
|
import { _gb, _hb, _kb, _mb } from './unit/size.util'
|
|
225
226
|
import { is } from './vendor/is'
|
|
227
|
+
import {
|
|
228
|
+
CommonLogLevel,
|
|
229
|
+
CommonLogFunction,
|
|
230
|
+
CommonLogger,
|
|
231
|
+
SimpleLogger,
|
|
232
|
+
createSimpleLogger,
|
|
233
|
+
noopLogger,
|
|
234
|
+
} from './log/commonLogger'
|
|
235
|
+
import { _safeJsonStringify } from './string/safeJsonStringify'
|
|
226
236
|
|
|
227
237
|
export type {
|
|
228
238
|
MemoCache,
|
|
@@ -294,6 +304,10 @@ export type {
|
|
|
294
304
|
JsonSchemaArray,
|
|
295
305
|
JsonSchemaTuple,
|
|
296
306
|
JsonSchemaBuilder,
|
|
307
|
+
CommonLogLevel,
|
|
308
|
+
CommonLogFunction,
|
|
309
|
+
CommonLogger,
|
|
310
|
+
SimpleLogger,
|
|
297
311
|
}
|
|
298
312
|
|
|
299
313
|
export {
|
|
@@ -449,4 +463,10 @@ export {
|
|
|
449
463
|
JSON_SCHEMA_ORDER,
|
|
450
464
|
generateJsonSchemaFromData,
|
|
451
465
|
_parseQueryString,
|
|
466
|
+
_defineLazyProperty,
|
|
467
|
+
_defineLazyProps,
|
|
468
|
+
_lazyValue,
|
|
469
|
+
createSimpleLogger,
|
|
470
|
+
noopLogger,
|
|
471
|
+
_safeJsonStringify,
|
|
452
472
|
}
|
package/src/lazy.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { AnyFunction, AnyObject } from './types'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* const value = lazyValue(() => expensiveComputation())
|
|
5
|
+
*
|
|
6
|
+
* value() // calls expensiveComputation() once
|
|
7
|
+
* value() // returns cached result
|
|
8
|
+
* value() // returns cached result
|
|
9
|
+
*
|
|
10
|
+
* Based on: https://github.com/sindresorhus/lazy-value
|
|
11
|
+
*/
|
|
12
|
+
export function _lazyValue<T extends AnyFunction>(fn: T): T {
|
|
13
|
+
let isCalled = false
|
|
14
|
+
let result: any
|
|
15
|
+
|
|
16
|
+
return (() => {
|
|
17
|
+
if (!isCalled) {
|
|
18
|
+
isCalled = true
|
|
19
|
+
result = fn()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return result
|
|
23
|
+
}) as any
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* interface Obj {
|
|
28
|
+
* v: number
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* const obj = {} as Obj
|
|
32
|
+
*
|
|
33
|
+
* _defineLazyProperty(obj, 'v', () => expensiveComputation())
|
|
34
|
+
* obj.v // runs expensiveComputation() once
|
|
35
|
+
* obj.v // cached value
|
|
36
|
+
* obj.v // cached value
|
|
37
|
+
*
|
|
38
|
+
* Based on: https://github.com/sindresorhus/define-lazy-prop
|
|
39
|
+
*/
|
|
40
|
+
export function _defineLazyProperty<OBJ extends AnyObject>(
|
|
41
|
+
obj: OBJ,
|
|
42
|
+
propertyName: keyof OBJ,
|
|
43
|
+
fn: AnyFunction,
|
|
44
|
+
): OBJ {
|
|
45
|
+
const define = (value: any) =>
|
|
46
|
+
Object.defineProperty(obj, propertyName, { value, enumerable: true, writable: true })
|
|
47
|
+
|
|
48
|
+
Object.defineProperty(obj, propertyName, {
|
|
49
|
+
configurable: true,
|
|
50
|
+
enumerable: true,
|
|
51
|
+
get() {
|
|
52
|
+
const result = fn()
|
|
53
|
+
define(result)
|
|
54
|
+
return result
|
|
55
|
+
},
|
|
56
|
+
set(value) {
|
|
57
|
+
define(value)
|
|
58
|
+
},
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
return obj
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Like _defineLazyProperty, but allows to define multiple props at once.
|
|
66
|
+
*/
|
|
67
|
+
export function _defineLazyProps<OBJ extends AnyObject>(
|
|
68
|
+
obj: OBJ,
|
|
69
|
+
props: Partial<Record<keyof OBJ, AnyFunction>>,
|
|
70
|
+
): OBJ {
|
|
71
|
+
Object.entries(props).forEach(([k, fn]) => _defineLazyProperty(obj, k, fn!))
|
|
72
|
+
return obj
|
|
73
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* These levels follow console.* naming,
|
|
3
|
+
* so you can use console[level] safely.
|
|
4
|
+
*
|
|
5
|
+
* `log` is considered default level.
|
|
6
|
+
*
|
|
7
|
+
* For simplicity - only these 3 levels are kept.
|
|
8
|
+
*
|
|
9
|
+
* @experimental
|
|
10
|
+
*/
|
|
11
|
+
export type CommonLogLevel = 'log' | 'warn' | 'error'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Function that takes any number of arguments and logs them all.
|
|
15
|
+
* It is expected that logged arguments are separated by "space", like console.log does.
|
|
16
|
+
*
|
|
17
|
+
* @experimental
|
|
18
|
+
*/
|
|
19
|
+
export type CommonLogFunction = (...args: any[]) => void
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Interface is inspired/compatible with `console.*`
|
|
23
|
+
* So, `console` is a valid CommonLogger implementation as-is.
|
|
24
|
+
*
|
|
25
|
+
* @experimental
|
|
26
|
+
*/
|
|
27
|
+
export interface CommonLogger {
|
|
28
|
+
log: CommonLogFunction
|
|
29
|
+
warn: CommonLogFunction
|
|
30
|
+
error: CommonLogFunction
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Same as CommonLogger, but also is a "convenience function" itself.
|
|
35
|
+
* So you can do `logger('hey')` which is the same as `logger.log('hey')`
|
|
36
|
+
*
|
|
37
|
+
* @experimental
|
|
38
|
+
*/
|
|
39
|
+
export interface SimpleLogger extends CommonLogFunction, CommonLogger {}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Creates a SimpleLogger from CommonLogger.
|
|
43
|
+
*
|
|
44
|
+
* @experimental
|
|
45
|
+
*/
|
|
46
|
+
export function createSimpleLogger(logger: CommonLogger): SimpleLogger {
|
|
47
|
+
return Object.assign(((...args: any[]) => logger.log(...args)) as any, {
|
|
48
|
+
log: (...args: any[]) => logger.log(...args),
|
|
49
|
+
warn: (...args: any[]) => logger.warn(...args),
|
|
50
|
+
error: (...args: any[]) => logger.error(...args),
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const noop = () => {}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* SimpleLogger that does nothing (noop).
|
|
58
|
+
*
|
|
59
|
+
* @experimental
|
|
60
|
+
*/
|
|
61
|
+
export const noopLogger: SimpleLogger = createSimpleLogger({
|
|
62
|
+
log: noop,
|
|
63
|
+
warn: noop,
|
|
64
|
+
error: noop,
|
|
65
|
+
})
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Reviver } from '../types'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* JSON.stringify that avoids circular references, prints them as [Circular ~]
|
|
5
|
+
*
|
|
6
|
+
* Based on: https://github.com/moll/json-stringify-safe/
|
|
7
|
+
*/
|
|
8
|
+
export function _safeJsonStringify(
|
|
9
|
+
obj: any,
|
|
10
|
+
replacer?: Reviver,
|
|
11
|
+
spaces?: number,
|
|
12
|
+
cycleReplacer?: Reviver,
|
|
13
|
+
): string {
|
|
14
|
+
return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions, no-bitwise */
|
|
18
|
+
|
|
19
|
+
function serializer(replacer?: Reviver, cycleReplacer?: Reviver): Reviver {
|
|
20
|
+
const stack: any[] = []
|
|
21
|
+
const keys: string[] = []
|
|
22
|
+
|
|
23
|
+
if (cycleReplacer == null) {
|
|
24
|
+
cycleReplacer = function (key, value) {
|
|
25
|
+
if (stack[0] === value) return '[Circular ~]'
|
|
26
|
+
return '[Circular ~.' + keys.slice(0, stack.indexOf(value)).join('.') + ']'
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return function (key, value) {
|
|
31
|
+
if (stack.length > 0) {
|
|
32
|
+
const thisPos = stack.indexOf(this)
|
|
33
|
+
~thisPos ? stack.splice(thisPos + 1) : stack.push(this)
|
|
34
|
+
~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)
|
|
35
|
+
if (~stack.indexOf(value)) {
|
|
36
|
+
value = cycleReplacer!.call(this, key, value)
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
stack.push(value)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return replacer == null ? value : replacer.call(this, key, value)
|
|
43
|
+
}
|
|
44
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -165,7 +165,7 @@ export type Saved<E> = Merge<E, SavedDBEntity>
|
|
|
165
165
|
export type Unsaved<E> = Merge<E, BaseDBEntity>
|
|
166
166
|
|
|
167
167
|
/**
|
|
168
|
-
* Named type for JSON.parse second argument
|
|
168
|
+
* Named type for JSON.parse / JSON.stringify second argument
|
|
169
169
|
*/
|
|
170
170
|
export type Reviver = (this: any, key: string, value: any) => any
|
|
171
171
|
|