Skip to content

Commit df028a7

Browse files
fix(operators): log test completed
1 parent 0402eb1 commit df028a7

File tree

6 files changed

+109
-43
lines changed

6 files changed

+109
-43
lines changed

package-lock.json

Lines changed: 21 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/operators/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
"dependencies": {
2525
"@rxjs-collection/observables": "*",
2626
"ansi-colors": "4.1.3",
27-
"consola": "3.2.3",
27+
"ascii-table3": "^0.9.0",
28+
"debug": "^4.3.7",
2829
"fast-equals": "5.0.1",
2930
"rxjs": "7.8.1"
3031
},

packages/operators/src/log.js

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,74 @@
1-
import { bgGreen } from 'ansi-colors';
1+
import { AsciiTable3, AlignmentEnum } from 'ascii-table3';
2+
import chalk from 'chalk';
23
import debug from 'debug';
3-
import { connectable, finalize, Observable, Subject } from 'rxjs';
4+
import { connectable, finalize, Observable, Subject, tap, toArray } from 'rxjs';
5+
import util from 'util';
46

5-
export const enableLog = tag => debug.enable(tag);
7+
const getAlignments = list => {
8+
return list.map(v => {
9+
switch (typeof v) {
10+
case 'number':
11+
return AlignmentEnum.RIGHT;
12+
case 'string':
13+
return AlignmentEnum.LEFT;
14+
default:
15+
return AlignmentEnum.LEFT;
16+
}
17+
});
18+
};
19+
20+
export const defaultLogger = tag => {
21+
const logger = debug(tag);
22+
logger.log = global.console.log.bind(console);
23+
return {
24+
default: logger,
25+
error: debug(`${tag}:error`),
26+
complete: () => logger(chalk.white.bgGreen.bold('complete!'))
27+
};
28+
};
29+
30+
const tableLogger = tag => {
31+
debug.formatters.t = data => {
32+
if (!data.length) return;
33+
const table = new AsciiTable3();
34+
table.setHeading.apply(table, ['index', ...Object.keys(data[0])]);
35+
table.setAligns(getAlignments([0, ...Object.values(data[0])]));
36+
table.addRowMatrix(
37+
data.map((entry, index) => [
38+
index,
39+
...Object.values(entry).map(item => util.inspect(item, { colors: true, depth: 0 }))
40+
])
41+
);
42+
return table.toString();
43+
};
644

7-
export const log = tag => {
845
const logger = debug(tag);
946
logger.log = global.console.log.bind(console);
10-
const error = debug(`${tag}:error`);
1147

48+
return {
49+
default: val => logger('%t', val),
50+
error: debug(`${tag}:error`),
51+
complete: () => logger(chalk.bgGreen.bold('complete!'))
52+
};
53+
};
54+
55+
export const enableLog = tag => debug.enable(tag);
56+
57+
export const log = (tag, logger = defaultLogger(tag)) => {
1258
if (debug.enabled(tag)) {
1359
return source => {
1460
return new Observable(observer => {
1561
return source.subscribe({
1662
next: val => {
17-
logger(val);
63+
logger.default(val);
1864
observer.next(val);
1965
},
2066
error: err => {
21-
error(err);
67+
logger.error(err);
2268
observer.error(err);
2369
},
2470
complete: () => {
25-
logger(bgGreen.bold('complete!'));
71+
logger.complete();
2672
observer.complete();
2773
}
2874
});
@@ -33,11 +79,12 @@ export const log = tag => {
3379
return source => source;
3480
};
3581

36-
export const logResult = (tag, observable) => {
82+
export const logResult = (tag, observable, logger = tableLogger) => {
3783
return new Promise(done => {
3884
connectable(
3985
observable.pipe(
40-
log(tag),
86+
toArray(),
87+
log(tag, logger(tag)),
4188
finalize(() => done())
4289
),
4390
{ connector: () => new Subject() }

packages/operators/src/log.test.js

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { from, map } from 'rxjs';
22
import { TestScheduler } from 'rxjs/testing';
3+
import stripAnsi from 'strip-ansi';
34
import { afterAll, beforeEach, describe, expect, test, vi } from 'vitest';
45

5-
import { enableLog, log, logResult } from './log';
6+
import { defaultLogger, enableLog, log, logResult } from './log';
67

78
describe('log', () => {
89
let testScheduler;
@@ -39,7 +40,7 @@ describe('log', () => {
3940

4041
const actual = [];
4142
vi.spyOn(console, 'log').mockImplementation(v => {
42-
actual.push(replaceDateTimeISOString(stripAnsiCodes(v)));
43+
actual.push(replaceDateTimeISOString(stripAnsi(v)));
4344
return v;
4445
});
4546

@@ -55,36 +56,47 @@ describe('log', () => {
5556
});
5657
});
5758

58-
test('logResult', async () => {
59+
test('logResult - defaultLogger', async () => {
5960
const actual = [];
61+
6062
vi.spyOn(console, 'log').mockImplementation(v => {
61-
actual.push(replaceDateTimeISOString(stripAnsiCodes(v)));
63+
actual.push(replaceDateTimeISOString(stripAnsi(v)));
6264
return v;
6365
});
6466

6567
const expectedVal = [
66-
' operators:log:result content a',
67-
' operators:log:result content b',
68-
' operators:log:result content c',
68+
" operators:log:result [ 'content a', 'content b', 'content c' ]",
6969
' operators:log:result complete!'
7070
];
7171

7272
const triggerVal = ['content a', 'content b', 'content c'];
7373

74+
enableLog('operators:log:result');
75+
await logResult('operators:log:result', from(triggerVal), defaultLogger);
76+
expect(actual).deep.equal(expectedVal);
77+
});
78+
79+
test('logResult - tableLogger', async () => {
80+
const actual = [];
81+
82+
vi.spyOn(console, 'log').mockImplementation(v => {
83+
actual.push(replaceDateTimeISOString(stripAnsi(v)));
84+
return v;
85+
});
86+
87+
const expectedVal = [
88+
` operators:log:result +-------+-------------+\n| index | text |\n+-------+-------------+\n| 0 | 'content a' |\n| 1 | 'content b' |\n| 2 | 'content c' |\n+-------+-------------+\n`,
89+
' operators:log:result complete!'
90+
];
91+
92+
const triggerVal = [{ text: 'content a' }, { text: 'content b' }, { text: 'content c' }];
93+
7494
enableLog('operators:log:result');
7595
await logResult('operators:log:result', from(triggerVal));
7696
expect(actual).deep.equal(expectedVal);
7797
});
7898
});
7999

80-
const stripAnsiCodes = str => {
81-
return str.replace(
82-
// eslint-disable-next-line security/detect-unsafe-regex, no-control-regex
83-
/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,
84-
''
85-
);
86-
};
87-
88100
const replaceDateTimeISOString = str => {
89101
return str.replace(
90102
/^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])\.[0-9]{3}Z/,

packages/playground/src/demo/index.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { delay, from } from 'rxjs';
22
import { describe, test } from 'vitest';
33

4-
describe('playground stephan', () => {
4+
describe.skip('playground stephan', () => {
55
test('basics', async () => {
66
const s = from([1, 2, 3, 4, 5, 6, 7, 8, 9])
77
.pipe(delay(4000))

vitest.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export default defineConfig({
1212
'commitlint.config.js',
1313
'eslint.ignores.js',
1414
'vitest.workspace.js',
15+
'./coverage/**/*.*',
1516
'./packages/mocks/',
1617
'./packages/*/src/index.js'
1718
]

0 commit comments

Comments
 (0)