@cardano-sdk/util-dev 0.4.1-nightly.3 → 0.4.1-nightly.6

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/README.md CHANGED
@@ -7,3 +7,78 @@ Utilities for tests in other packages
7
7
  See [code coverage report].
8
8
 
9
9
  [code coverage report]: https://input-output-hk.github.io/cardano-js-sdk/coverage/util-dev
10
+
11
+ ## TestLogger
12
+
13
+ A _unit tests_ dedicated _logger_.
14
+
15
+ ```typescript
16
+ import { createLogger, logger } from '@cardano-sdk/util-dev';
17
+ import { deepStrictEqual } from 'assert';
18
+
19
+ logger.debug('Some debug data');
20
+ logger.error('Some error data');
21
+ // etc...
22
+
23
+ const newLogger = createLogger({ record: true });
24
+
25
+ newLogger.info('another message');
26
+ newLogger.debug({ test: 42 }, 'some message');
27
+ newLogger.error('error message', new Error('example error'));
28
+
29
+ deepStrictEqual(newLogger.messages, [
30
+ { level: 'info', message: ['another message'] },
31
+ { level: 'debug', message: [{ test: 42 }, 'some message'] },
32
+ { level: 'error', message: ['error message', new Error('example error')] }
33
+ ]);
34
+ ```
35
+
36
+ This logger is expressly designed to be used in unit tests: it keeps the unit tests output as clean as possible (logging only messages with `fatal` level), but, when required, it offers a quick and easy way to increase the verbosity of the tests without the need to change any file.
37
+
38
+ It also offer the option to record **all the logged values** to perform checks on what is logged by the tested program.
39
+
40
+ ### Tests development flow
41
+
42
+ While developing / maintaining / reviewing unit tests we often run the unit test command from our shell:
43
+
44
+ ```
45
+ yarn test
46
+ ```
47
+
48
+ As long as all the tests pass, we don't even need `TestLogger`.
49
+
50
+ But sometimes it may happen that some tests fail... sometimes...
51
+
52
+ In order to investigate the reason of the failure of a test, may be useful to access the logs.
53
+
54
+ If the test was written using `TestLogger`, the latter allows us to access and / or customize the logs through simple environment variables.
55
+
56
+ To increase the log level, just use the `TL_LEVEL` environment variable:
57
+
58
+ ```
59
+ TL_LEVEL=info yarn test
60
+ ```
61
+
62
+ By default, `TestLogger` uses [util.inspect](https://nodejs.org/api/util.html#utilinspectobject-options) and its `options` object can be customized with following environment variables:
63
+
64
+ - `TL_ARRAY` maps to `maxArrayLength`. Defaults to `100`. `0` maps to `Infinity`.
65
+ - `TL_BREAK` maps to `breakLength`. Defaults to tty width on a tty or `90` otherwise. `0` maps to `Infinity`.
66
+ - `TL_COLOR` maps to `colors`. Defaults to `true` on a tty `false` otherwise.
67
+ - `TL_COMPACT` maps to `compact`. Defaults to `3`. `0` maps to `false`.
68
+ - `TL_DEPTH` maps to `depth`. Defaults to `2`. `0` maps to `Infinity`.
69
+ - `TL_HIDDEN` maps to `showHidden`. Defaults to `false`.
70
+ - `TL_PROXY` maps to `showProxy`. Defaults to `false`.
71
+ - `TL_STRING` maps to `maxStringLength`. Defaults to `1000` (not `10000` as `util.inspect` does). `0` maps to `Infinity`.
72
+
73
+ so if (for example) we need to log full nested objects and `Proxy`s we could run our test command with:
74
+
75
+ ```
76
+ TL_PROXY=true TL_DEPTH=0 TL_LEVEL=info yarn test
77
+ ```
78
+
79
+ Even if `util.inspect` can be deeply customized (letting us to customize our log as well), it has the drawback that its output can't be cut and pasted on a source file or to perform a POST etc.
80
+ If we need to cut paste something from our log we can instruct `TestLogger` to use `JSONBig.stringify` instead; this will obviously make `TestLogger` to ignore environment variables which customize `util.inspect`.
81
+
82
+ ```
83
+ TL_LEVEL=info TL_JSON=true yarn test
84
+ ```
@@ -0,0 +1,35 @@
1
+ /// <reference types="node" />
2
+ declare const logLevels: {
3
+ debug: number;
4
+ error: number;
5
+ fatal: number;
6
+ info: number;
7
+ trace: number;
8
+ warn: number;
9
+ };
10
+ declare type LogLevel = keyof typeof logLevels;
11
+ export declare type LogFunction = (...args: unknown[]) => void;
12
+ export declare type LoggedMessage = {
13
+ level: LogLevel;
14
+ message: unknown[];
15
+ };
16
+ export declare type Logger = {
17
+ [l in LogLevel]: LogFunction;
18
+ };
19
+ export declare type TestLogger = Logger & {
20
+ messages: LoggedMessage[];
21
+ };
22
+ declare type TestStream = {
23
+ columns?: number;
24
+ isTTY?: boolean;
25
+ write: Function;
26
+ };
27
+ export interface TestLoggerOptions {
28
+ env?: NodeJS.ProcessEnv;
29
+ record?: boolean;
30
+ stream?: TestStream;
31
+ }
32
+ export declare const createLogger: (options?: TestLoggerOptions) => TestLogger;
33
+ export declare const logger: TestLogger;
34
+ export {};
35
+ //# sourceMappingURL=TestLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestLogger.d.ts","sourceRoot":"","sources":["../../src/TestLogger.ts"],"names":[],"mappings":";AAMA,QAAA,MAAM,SAAS;;;;;;;CAA+D,CAAC;AAG/E,aAAK,QAAQ,GAAG,MAAM,OAAO,SAAS,CAAC;AAMvC,oBAAY,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAKvD,oBAAY,aAAa,GAAG;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAKpE,oBAAY,MAAM,GAAG;KAAG,CAAC,IAAI,QAAQ,GAAG,WAAW;CAAE,CAAC;AAMtD,oBAAY,UAAU,GAAG,MAAM,GAAG;IAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;AAEhE,aAAK,UAAU,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAKzE,MAAM,WAAW,iBAAiB;IAIhC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAKxB,MAAM,CAAC,EAAE,OAAO,CAAC;IAKjB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAsCD,eAAO,MAAM,YAAY,aAAa,iBAAiB,eA0CtD,CAAC;AAKF,eAAO,MAAM,MAAM,YAAiB,CAAC"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.logger = exports.createLogger = void 0;
30
+ const envalid = __importStar(require("envalid"));
31
+ const util_1 = require("util");
32
+ const json_bigint_1 = __importDefault(require("json-bigint"));
33
+ const logLevels = { debug: 2, error: 5, fatal: 6, info: 3, trace: 1, warn: 4 };
34
+ const logLevelLabels = ['', 'TRACE ', 'DEBUG ', 'INFO ', 'WARNING', 'ERROR ', 'FATAL '];
35
+ const getConfig = (env, stream) => {
36
+ const { TL_ARRAY, TL_BREAK, TL_COLOR, TL_COMPACT, TL_DEPTH, TL_HIDDEN, TL_JSON, TL_LEVEL, TL_PROXY, TL_STRING } = envalid.cleanEnv(env, {
37
+ TL_ARRAY: envalid.num({ default: 100 }),
38
+ TL_BREAK: envalid.num({ default: stream?.columns ? stream?.columns - 33 : 90 }),
39
+ TL_COLOR: envalid.bool({ default: stream?.isTTY || false }),
40
+ TL_COMPACT: envalid.num({ default: 3 }),
41
+ TL_DEPTH: envalid.num({ default: 2 }),
42
+ TL_HIDDEN: envalid.bool({ default: false }),
43
+ TL_JSON: envalid.bool({ default: false }),
44
+ TL_LEVEL: envalid.str({ choices: Object.keys(logLevels), default: 'fatal' }),
45
+ TL_PROXY: envalid.bool({ default: false }),
46
+ TL_STRING: envalid.num({ default: 1000 })
47
+ });
48
+ const inspectOptions = {
49
+ breakLength: TL_BREAK || Number.POSITIVE_INFINITY,
50
+ colors: TL_COLOR,
51
+ compact: TL_COMPACT || false,
52
+ depth: TL_DEPTH || Number.POSITIVE_INFINITY,
53
+ maxArrayLength: TL_ARRAY || Number.POSITIVE_INFINITY,
54
+ maxStringLength: TL_STRING || Number.POSITIVE_INFINITY,
55
+ showHidden: TL_HIDDEN,
56
+ showProxy: TL_PROXY,
57
+ sorted: true
58
+ };
59
+ return { inspectOptions, minHeight: logLevels[TL_LEVEL], useJSON: TL_JSON };
60
+ };
61
+ const createLogger = (options = {}) => {
62
+ const { env, record, stream } = { env: process.env, stream: process.stdout, ...options };
63
+ const { minHeight, inspectOptions, useJSON } = getConfig(env, stream);
64
+ const messages = [];
65
+ const stringify = (data) => {
66
+ switch (typeof data) {
67
+ case 'bigint':
68
+ case 'boolean':
69
+ case 'number':
70
+ case 'symbol':
71
+ return data.toString();
72
+ case 'string':
73
+ return data;
74
+ case 'undefined':
75
+ return 'undefined';
76
+ case 'object':
77
+ if (useJSON)
78
+ return json_bigint_1.default.stringify(data);
79
+ case 'function':
80
+ return (0, util_1.inspect)(data, inspectOptions);
81
+ }
82
+ };
83
+ const getLogFunction = ([level, height]) => {
84
+ const label = logLevelLabels[height];
85
+ return (...message) => {
86
+ if (record)
87
+ messages.push({ level, message });
88
+ if (height < minHeight)
89
+ return;
90
+ const line = message.map(stringify).join(' ');
91
+ const now = new Date().toISOString().replace('T', ' ').replace('Z', '');
92
+ const lines = line.split('\n').map((_) => `${now} ${label} ${_}\n`);
93
+ stream.write(lines.join(''));
94
+ };
95
+ };
96
+ const logger = Object.fromEntries(Object.entries(logLevels).map((_) => [_[0], getLogFunction(_)]));
97
+ return { messages, ...logger };
98
+ };
99
+ exports.createLogger = createLogger;
100
+ exports.logger = (0, exports.createLogger)();
101
+ //# sourceMappingURL=TestLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestLogger.js","sourceRoot":"","sources":["../../src/TestLogger.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export * as AssetId from './assetId';
2
2
  export * as CslTestUtil from './cslTestUtil';
3
3
  export * as TxTestUtil from './txTestUtil';
4
+ export * from './TestLogger';
4
5
  export * from './util';
5
6
  export * from './createStubStakePoolProvider';
6
7
  export * from './stubLogger';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,cAAc,QAAQ,CAAC;AACvB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -30,6 +30,7 @@ exports.TxTestUtil = exports.CslTestUtil = exports.AssetId = void 0;
30
30
  exports.AssetId = __importStar(require("./assetId"));
31
31
  exports.CslTestUtil = __importStar(require("./cslTestUtil"));
32
32
  exports.TxTestUtil = __importStar(require("./txTestUtil"));
33
+ __exportStar(require("./TestLogger"), exports);
33
34
  __exportStar(require("./util"), exports);
34
35
  __exportStar(require("./createStubStakePoolProvider"), exports);
35
36
  __exportStar(require("./stubLogger"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAqC;AACrC,6DAA6C;AAC7C,2DAA2C;AAC3C,yCAAuB;AACvB,gEAA8C;AAC9C,+CAA6B;AAC7B,kDAAgC;AAChC,2DAAyC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAqC;AACrC,6DAA6C;AAC7C,2DAA2C;AAC3C,+CAA6B;AAC7B,yCAAuB;AACvB,gEAA8C;AAC9C,+CAA6B;AAC7B,kDAAgC;AAChC,2DAAyC"}