concurrently 9.2.0 → 10.0.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/README.md +25 -15
- package/dist/bin/{concurrently.js → index.js} +23 -52
- package/dist/bin/index.spec.d.ts +1 -0
- package/dist/bin/index.spec.js +368 -0
- package/dist/bin/normalize-cli-command.d.ts +1 -0
- package/dist/bin/normalize-cli-command.js +15 -0
- package/dist/bin/normalize-cli-command.spec.d.ts +1 -0
- package/dist/bin/normalize-cli-command.spec.js +36 -0
- package/dist/bin/read-package-json.d.ts +4 -0
- package/dist/bin/read-package-json.js +17 -0
- package/dist/lib/__fixtures__/create-mock-instance.d.ts +2 -0
- package/dist/lib/__fixtures__/create-mock-instance.js +5 -0
- package/dist/lib/__fixtures__/fake-command.d.ts +6 -0
- package/dist/lib/__fixtures__/fake-command.js +37 -0
- package/dist/lib/assert.d.ts +10 -0
- package/dist/lib/assert.js +24 -0
- package/dist/lib/assert.spec.d.ts +1 -0
- package/dist/lib/assert.spec.js +41 -0
- package/dist/{src → lib}/command-parser/expand-arguments.d.ts +7 -7
- package/dist/lib/command-parser/expand-arguments.js +36 -0
- package/dist/lib/command-parser/expand-arguments.spec.d.ts +1 -0
- package/dist/lib/command-parser/expand-arguments.spec.js +57 -0
- package/dist/{src → lib}/command-parser/expand-shortcut.d.ts +2 -2
- package/dist/{src → lib}/command-parser/expand-shortcut.js +1 -5
- package/dist/lib/command-parser/expand-shortcut.spec.d.ts +1 -0
- package/dist/lib/command-parser/expand-shortcut.spec.js +36 -0
- package/dist/{src → lib}/command-parser/expand-wildcard.d.ts +2 -2
- package/dist/{src → lib}/command-parser/expand-wildcard.js +25 -31
- package/dist/lib/command-parser/expand-wildcard.spec.d.ts +1 -0
- package/dist/lib/command-parser/expand-wildcard.spec.js +288 -0
- package/dist/{src → lib}/command.d.ts +7 -10
- package/dist/{src → lib}/command.js +13 -32
- package/dist/lib/command.spec.d.ts +1 -0
- package/dist/lib/command.spec.js +369 -0
- package/dist/{src → lib}/completion-listener.d.ts +2 -3
- package/dist/{src → lib}/completion-listener.js +9 -36
- package/dist/lib/completion-listener.spec.d.ts +1 -0
- package/dist/lib/completion-listener.spec.js +229 -0
- package/dist/{src → lib}/concurrently.d.ts +10 -12
- package/dist/{src → lib}/concurrently.js +34 -47
- package/dist/lib/concurrently.spec.d.ts +1 -0
- package/dist/lib/concurrently.spec.js +320 -0
- package/dist/{src → lib}/date-format.d.ts +2 -2
- package/dist/{src → lib}/date-format.js +101 -77
- package/dist/lib/date-format.spec.d.ts +1 -0
- package/dist/lib/date-format.spec.js +480 -0
- package/dist/{src → lib}/defaults.d.ts +2 -6
- package/dist/{src → lib}/defaults.js +16 -23
- package/dist/{src → lib}/flow-control/input-handler.d.ts +4 -5
- package/dist/{src → lib}/flow-control/input-handler.js +8 -34
- package/dist/lib/flow-control/input-handler.spec.d.ts +1 -0
- package/dist/lib/flow-control/input-handler.spec.js +116 -0
- package/dist/{src → lib}/flow-control/kill-on-signal.d.ts +3 -5
- package/dist/{src → lib}/flow-control/kill-on-signal.js +3 -7
- package/dist/lib/flow-control/kill-on-signal.spec.d.ts +1 -0
- package/dist/lib/flow-control/kill-on-signal.spec.js +63 -0
- package/dist/{src → lib}/flow-control/kill-others.d.ts +3 -4
- package/dist/{src → lib}/flow-control/kill-others.js +8 -15
- package/dist/lib/flow-control/kill-others.spec.d.ts +1 -0
- package/dist/lib/flow-control/kill-others.spec.js +98 -0
- package/dist/{src → lib}/flow-control/log-error.d.ts +3 -3
- package/dist/{src → lib}/flow-control/log-error.js +1 -5
- package/dist/lib/flow-control/log-error.spec.d.ts +1 -0
- package/dist/lib/flow-control/log-error.spec.js +33 -0
- package/dist/{src → lib}/flow-control/log-exit.d.ts +3 -3
- package/dist/{src → lib}/flow-control/log-exit.js +1 -5
- package/dist/lib/flow-control/log-exit.spec.d.ts +1 -0
- package/dist/lib/flow-control/log-exit.spec.js +24 -0
- package/dist/{src → lib}/flow-control/log-output.d.ts +3 -3
- package/dist/{src → lib}/flow-control/log-output.js +1 -5
- package/dist/lib/flow-control/log-output.spec.d.ts +1 -0
- package/dist/lib/flow-control/log-output.spec.js +33 -0
- package/dist/{src → lib}/flow-control/log-timings.d.ts +3 -3
- package/dist/{src → lib}/flow-control/log-timings.js +11 -44
- package/dist/lib/flow-control/log-timings.spec.d.ts +1 -0
- package/dist/lib/flow-control/log-timings.spec.js +89 -0
- package/dist/{src → lib}/flow-control/logger-padding.d.ts +3 -3
- package/dist/{src → lib}/flow-control/logger-padding.js +7 -7
- package/dist/lib/flow-control/logger-padding.spec.d.ts +1 -0
- package/dist/lib/flow-control/logger-padding.spec.js +60 -0
- package/dist/{src → lib}/flow-control/output-error-handler.d.ts +4 -6
- package/dist/{src → lib}/flow-control/output-error-handler.js +3 -7
- package/dist/lib/flow-control/output-error-handler.spec.d.ts +1 -0
- package/dist/lib/flow-control/output-error-handler.spec.js +41 -0
- package/dist/{src → lib}/flow-control/restart-process.d.ts +4 -4
- package/dist/{src → lib}/flow-control/restart-process.js +10 -37
- package/dist/lib/flow-control/restart-process.spec.d.ts +1 -0
- package/dist/lib/flow-control/restart-process.spec.js +127 -0
- package/dist/{src → lib}/flow-control/teardown.d.ts +4 -5
- package/dist/{src → lib}/flow-control/teardown.js +6 -33
- package/dist/lib/flow-control/teardown.spec.d.ts +1 -0
- package/dist/lib/flow-control/teardown.spec.js +93 -0
- package/dist/{src → lib}/index.d.ts +21 -20
- package/dist/lib/index.js +98 -0
- package/dist/lib/jsonc.d.ts +8 -0
- package/dist/{src → lib}/jsonc.js +3 -8
- package/dist/lib/jsonc.spec.d.ts +1 -0
- package/dist/lib/jsonc.spec.js +73 -0
- package/dist/{src → lib}/logger.d.ts +3 -2
- package/dist/{src → lib}/logger.js +112 -53
- package/dist/lib/logger.spec.d.ts +1 -0
- package/dist/lib/logger.spec.js +507 -0
- package/dist/{src → lib}/observables.d.ts +1 -2
- package/dist/{src → lib}/observables.js +3 -7
- package/dist/lib/observables.spec.d.ts +1 -0
- package/dist/lib/observables.spec.js +29 -0
- package/dist/{src → lib}/output-writer.d.ts +3 -4
- package/dist/{src → lib}/output-writer.js +4 -31
- package/dist/lib/output-writer.spec.d.ts +1 -0
- package/dist/lib/output-writer.spec.js +96 -0
- package/dist/lib/prefix-color-selector.d.ts +21 -0
- package/dist/{src → lib}/prefix-color-selector.js +14 -31
- package/dist/lib/prefix-color-selector.spec.d.ts +1 -0
- package/dist/lib/prefix-color-selector.spec.js +159 -0
- package/dist/{src → lib}/spawn.d.ts +19 -16
- package/dist/lib/spawn.js +105 -0
- package/dist/lib/spawn.spec.d.ts +1 -0
- package/dist/lib/spawn.spec.js +100 -0
- package/dist/lib/utils.d.ts +25 -0
- package/dist/lib/utils.js +52 -0
- package/dist/lib/utils.spec.d.ts +1 -0
- package/dist/lib/utils.spec.js +58 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/README.md +6 -0
- package/docs/cli/passthrough-arguments.md +8 -8
- package/docs/cli/prefixing.md +44 -4
- package/docs/cli/shortcuts.md +2 -2
- package/docs/shell-resolution.md +48 -0
- package/package.json +64 -85
- package/dist/bin/read-package.d.ts +0 -6
- package/dist/bin/read-package.js +0 -47
- package/dist/src/assert.d.ts +0 -5
- package/dist/src/assert.js +0 -16
- package/dist/src/command-parser/command-parser.d.ts +0 -19
- package/dist/src/command-parser/command-parser.js +0 -2
- package/dist/src/command-parser/expand-arguments.js +0 -39
- package/dist/src/command-parser/strip-quotes.d.ts +0 -16
- package/dist/src/command-parser/strip-quotes.js +0 -17
- package/dist/src/flow-control/flow-controller.d.ts +0 -13
- package/dist/src/flow-control/flow-controller.js +0 -2
- package/dist/src/index.js +0 -99
- package/dist/src/jsonc.d.ts +0 -8
- package/dist/src/prefix-color-selector.d.ts +0 -11
- package/dist/src/spawn.js +0 -49
- package/index.d.mts +0 -7
- package/index.d.ts +0 -11
- package/index.js +0 -14
- package/index.mjs +0 -10
- /package/dist/bin/{concurrently.d.ts → index.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import { subscribeSpyTo } from '@hirez_io/observer-spy';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { FakeCommand } from './__fixtures__/fake-command.js';
|
|
5
|
+
import { Logger } from './logger.js';
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
// Force Chalk to use colors, otherwise tests may pass when they were supposed to be failing.
|
|
8
|
+
chalk.level = 3;
|
|
9
|
+
});
|
|
10
|
+
const createLogger = (...options) => {
|
|
11
|
+
const logger = new Logger(...options);
|
|
12
|
+
vi.spyOn(logger, 'log');
|
|
13
|
+
const spy = subscribeSpyTo(logger.output);
|
|
14
|
+
return { logger, spy };
|
|
15
|
+
};
|
|
16
|
+
describe('#log()', () => {
|
|
17
|
+
it('emits prefix + text in the output stream', () => {
|
|
18
|
+
const { logger, spy } = createLogger({});
|
|
19
|
+
logger.log('foo', 'bar');
|
|
20
|
+
const values = spy.getValues();
|
|
21
|
+
expect(values).toHaveLength(2);
|
|
22
|
+
expect(values[0]).toEqual({ command: undefined, text: 'foo' });
|
|
23
|
+
expect(values[1]).toEqual({ command: undefined, text: 'bar' });
|
|
24
|
+
});
|
|
25
|
+
it('emits multiple lines of text with prefix on each', () => {
|
|
26
|
+
const { logger, spy } = createLogger({});
|
|
27
|
+
logger.log('foo', 'bar\nbaz\n');
|
|
28
|
+
const values = spy.getValues();
|
|
29
|
+
expect(values).toHaveLength(2);
|
|
30
|
+
expect(values[0]).toEqual({ command: undefined, text: 'foo' });
|
|
31
|
+
expect(values[1]).toEqual({ command: undefined, text: 'bar\nfoobaz\n' });
|
|
32
|
+
});
|
|
33
|
+
it('does not emit prefix if previous call from same command did not finish with a LF', () => {
|
|
34
|
+
const { logger, spy } = createLogger({});
|
|
35
|
+
const command = new FakeCommand();
|
|
36
|
+
logger.log('foo', 'bar', command);
|
|
37
|
+
logger.log('foo', 'baz', command);
|
|
38
|
+
expect(spy.getValuesLength()).toBe(3);
|
|
39
|
+
expect(spy.getLastValue()).toEqual({ command, text: 'baz' });
|
|
40
|
+
});
|
|
41
|
+
it('emits LF and prefix if previous call is from different command and did not finish with a LF', () => {
|
|
42
|
+
const { logger, spy } = createLogger({});
|
|
43
|
+
const command1 = new FakeCommand();
|
|
44
|
+
logger.log('foo', 'bar', command1);
|
|
45
|
+
const command2 = new FakeCommand();
|
|
46
|
+
logger.log('foo', 'baz', command2);
|
|
47
|
+
const values = spy.getValues();
|
|
48
|
+
expect(values).toHaveLength(5);
|
|
49
|
+
expect(values).toContainEqual({ command: command1, text: '\n' });
|
|
50
|
+
expect(values).toContainEqual({ command: command2, text: 'foo' });
|
|
51
|
+
expect(values).toContainEqual({ command: command2, text: 'baz' });
|
|
52
|
+
});
|
|
53
|
+
it('does not emit prefix nor handle text if logger is in raw mode', () => {
|
|
54
|
+
const { logger, spy } = createLogger({ raw: true });
|
|
55
|
+
logger.log('foo', 'bar\nbaz\n');
|
|
56
|
+
const values = spy.getValues();
|
|
57
|
+
expect(values).toHaveLength(1);
|
|
58
|
+
expect(values[0]).toEqual({ command: undefined, text: 'bar\nbaz\n' });
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('#logGlobalEvent()', () => {
|
|
62
|
+
it('does nothing if in raw mode', () => {
|
|
63
|
+
const { logger } = createLogger({ raw: true });
|
|
64
|
+
logger.logGlobalEvent('foo');
|
|
65
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
66
|
+
});
|
|
67
|
+
it('logs in gray dim style with arrow prefix', () => {
|
|
68
|
+
const { logger } = createLogger({});
|
|
69
|
+
logger.logGlobalEvent('foo');
|
|
70
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('foo')}\n`);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('#logCommandText()', () => {
|
|
74
|
+
it('logs with name if no prefixFormat is set', () => {
|
|
75
|
+
const { logger } = createLogger({});
|
|
76
|
+
const cmd = new FakeCommand('bla');
|
|
77
|
+
logger.logCommandText('foo', cmd);
|
|
78
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[bla]')} `, 'foo', cmd);
|
|
79
|
+
});
|
|
80
|
+
it('logs with index if no prefixFormat is set, and command has no name', () => {
|
|
81
|
+
const { logger } = createLogger({});
|
|
82
|
+
const cmd = new FakeCommand('', undefined, 2);
|
|
83
|
+
logger.logCommandText('foo', cmd);
|
|
84
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[2]')} `, 'foo', cmd);
|
|
85
|
+
});
|
|
86
|
+
it('logs with prefixFormat set to pid', () => {
|
|
87
|
+
const { logger } = createLogger({ prefixFormat: 'pid' });
|
|
88
|
+
const cmd = new FakeCommand();
|
|
89
|
+
cmd.pid = 123;
|
|
90
|
+
logger.logCommandText('foo', cmd);
|
|
91
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[123]')} `, 'foo', cmd);
|
|
92
|
+
});
|
|
93
|
+
it('logs with prefixFormat set to name', () => {
|
|
94
|
+
const { logger } = createLogger({ prefixFormat: 'name' });
|
|
95
|
+
const cmd = new FakeCommand('bar');
|
|
96
|
+
logger.logCommandText('foo', cmd);
|
|
97
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[bar]')} `, 'foo', cmd);
|
|
98
|
+
});
|
|
99
|
+
it('logs with prefixFormat set to index', () => {
|
|
100
|
+
const { logger } = createLogger({ prefixFormat: 'index' });
|
|
101
|
+
const cmd = new FakeCommand(undefined, undefined, 3);
|
|
102
|
+
logger.logCommandText('foo', cmd);
|
|
103
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[3]')} `, 'foo', cmd);
|
|
104
|
+
});
|
|
105
|
+
it('logs with prefixFormat set to time (with timestampFormat)', () => {
|
|
106
|
+
const { logger } = createLogger({ prefixFormat: 'time', timestampFormat: 'yyyy' });
|
|
107
|
+
const cmd = new FakeCommand();
|
|
108
|
+
logger.logCommandText('foo', cmd);
|
|
109
|
+
const year = new Date().getFullYear();
|
|
110
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset(`[${year}]`)} `, 'foo', cmd);
|
|
111
|
+
});
|
|
112
|
+
it('logs with templated prefixFormat', () => {
|
|
113
|
+
const { logger } = createLogger({ prefixFormat: '{index}-{name}' });
|
|
114
|
+
const cmd = new FakeCommand('bar');
|
|
115
|
+
logger.logCommandText('foo', cmd);
|
|
116
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('0-bar')} `, 'foo', cmd);
|
|
117
|
+
});
|
|
118
|
+
it('does not strip spaces from beginning or end of prefixFormat', () => {
|
|
119
|
+
const { logger } = createLogger({ prefixFormat: ' {index}-{name} ' });
|
|
120
|
+
const cmd = new FakeCommand('bar');
|
|
121
|
+
logger.logCommandText('foo', cmd);
|
|
122
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset(' 0-bar ')} `, 'foo', cmd);
|
|
123
|
+
});
|
|
124
|
+
it('logs with no prefix', () => {
|
|
125
|
+
const { logger } = createLogger({ prefixFormat: 'none' });
|
|
126
|
+
const cmd = new FakeCommand();
|
|
127
|
+
logger.logCommandText('foo', cmd);
|
|
128
|
+
expect(logger.log).toHaveBeenCalledWith(chalk.reset(''), 'foo', cmd);
|
|
129
|
+
});
|
|
130
|
+
it('logs prefix using command line itself', () => {
|
|
131
|
+
const { logger } = createLogger({ prefixFormat: 'command' });
|
|
132
|
+
const cmd = new FakeCommand();
|
|
133
|
+
logger.logCommandText('foo', cmd);
|
|
134
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[echo foo]')} `, 'foo', cmd);
|
|
135
|
+
});
|
|
136
|
+
it('logs prefix using command line itself, capped at commandLength bytes', () => {
|
|
137
|
+
const { logger } = createLogger({ prefixFormat: 'command', commandLength: 6 });
|
|
138
|
+
const cmd = new FakeCommand();
|
|
139
|
+
logger.logCommandText('foo', cmd);
|
|
140
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[ec..oo]')} `, 'foo', cmd);
|
|
141
|
+
});
|
|
142
|
+
it('logs default prefixes with padding', () => {
|
|
143
|
+
const { logger } = createLogger({});
|
|
144
|
+
const cmd = new FakeCommand('foo');
|
|
145
|
+
logger.setPrefixLength(5);
|
|
146
|
+
logger.logCommandText('bar', cmd);
|
|
147
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[foo ]')} `, 'bar', cmd);
|
|
148
|
+
});
|
|
149
|
+
it('logs templated prefixes with padding', () => {
|
|
150
|
+
const { logger } = createLogger({ prefixFormat: '{name}-{index}' });
|
|
151
|
+
const cmd = new FakeCommand('foo', undefined, 0);
|
|
152
|
+
logger.setPrefixLength(6);
|
|
153
|
+
logger.logCommandText('bar', cmd);
|
|
154
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('foo-0 ')} `, 'bar', cmd);
|
|
155
|
+
});
|
|
156
|
+
it('logs prefix using prefixColor from command', () => {
|
|
157
|
+
const { logger } = createLogger({});
|
|
158
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
159
|
+
prefixColor: 'blue',
|
|
160
|
+
});
|
|
161
|
+
logger.logCommandText('foo', cmd);
|
|
162
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.blue('[1]')} `, 'foo', cmd);
|
|
163
|
+
});
|
|
164
|
+
it('logs prefix using default color if prefixColor from command is not a valid color', () => {
|
|
165
|
+
const { logger } = createLogger({});
|
|
166
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
167
|
+
prefixColor: 'fake.bold',
|
|
168
|
+
});
|
|
169
|
+
logger.logCommandText('foo', cmd);
|
|
170
|
+
expect(logger.log).toHaveBeenCalledWith(chalk.reset('[1]') + ' ', 'foo', cmd);
|
|
171
|
+
});
|
|
172
|
+
it('logs prefix in gray dim if prefixColor from command does not exist', () => {
|
|
173
|
+
const { logger } = createLogger({});
|
|
174
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
175
|
+
prefixColor: 'blue.fake',
|
|
176
|
+
});
|
|
177
|
+
logger.logCommandText('foo', cmd);
|
|
178
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[1]')} `, 'foo', cmd);
|
|
179
|
+
});
|
|
180
|
+
it('logs prefix using prefixColor from command if prefixColor is a hex value', () => {
|
|
181
|
+
const { logger } = createLogger({});
|
|
182
|
+
const prefixColor = '#32bd8a';
|
|
183
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
184
|
+
prefixColor,
|
|
185
|
+
});
|
|
186
|
+
logger.logCommandText('foo', cmd);
|
|
187
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.hex(prefixColor)('[1]')} `, 'foo', cmd);
|
|
188
|
+
});
|
|
189
|
+
it('logs prefix using prefixColor from command if prefixColor is a hex value with modifiers', () => {
|
|
190
|
+
const { logger } = createLogger({});
|
|
191
|
+
const prefixColor = '#32bd8a.inverse';
|
|
192
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
193
|
+
prefixColor,
|
|
194
|
+
});
|
|
195
|
+
logger.logCommandText('foo', cmd);
|
|
196
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.hex(prefixColor).inverse('[1]')} `, 'foo', cmd);
|
|
197
|
+
});
|
|
198
|
+
it('logs prefix using prefixColor from command if prefixColor is a bg hex value (short form)', () => {
|
|
199
|
+
const { logger } = createLogger({});
|
|
200
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
201
|
+
prefixColor: 'bg#32bd8a',
|
|
202
|
+
});
|
|
203
|
+
logger.logCommandText('foo', cmd);
|
|
204
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.bgHex('#32bd8a')('[1]')} `, 'foo', cmd);
|
|
205
|
+
});
|
|
206
|
+
it('logs prefix using prefixColor from command if prefixColor is a bg hex value with modifiers (short form)', () => {
|
|
207
|
+
const { logger } = createLogger({});
|
|
208
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
209
|
+
prefixColor: 'bg#32bd8a.bold',
|
|
210
|
+
});
|
|
211
|
+
logger.logCommandText('foo', cmd);
|
|
212
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.bgHex('#32bd8a').bold('[1]')} `, 'foo', cmd);
|
|
213
|
+
});
|
|
214
|
+
it('handles 3-digit hex codes for bg hex (short form)', () => {
|
|
215
|
+
const { logger } = createLogger({});
|
|
216
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
217
|
+
prefixColor: 'bg#f00',
|
|
218
|
+
});
|
|
219
|
+
logger.logCommandText('foo', cmd);
|
|
220
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.bgHex('#f00')('[1]')} `, 'foo', cmd);
|
|
221
|
+
});
|
|
222
|
+
it('logs prefix using prefixColor from command if prefixColor is a bgHex() value (explicit form)', () => {
|
|
223
|
+
const { logger } = createLogger({});
|
|
224
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
225
|
+
prefixColor: 'bgHex(#ff5500)',
|
|
226
|
+
});
|
|
227
|
+
logger.logCommandText('foo', cmd);
|
|
228
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.bgHex('#ff5500')('[1]')} `, 'foo', cmd);
|
|
229
|
+
});
|
|
230
|
+
it('logs prefix using prefixColor from command if prefixColor is a bgHex() value with modifiers (explicit form)', () => {
|
|
231
|
+
const { logger } = createLogger({});
|
|
232
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
233
|
+
prefixColor: 'bgHex(#ff5500).dim',
|
|
234
|
+
});
|
|
235
|
+
logger.logCommandText('foo', cmd);
|
|
236
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.bgHex('#ff5500').dim('[1]')} `, 'foo', cmd);
|
|
237
|
+
});
|
|
238
|
+
it('handles 3-digit hex codes for bgHex() (explicit form)', () => {
|
|
239
|
+
const { logger } = createLogger({});
|
|
240
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
241
|
+
prefixColor: 'bgHex(#0f0)',
|
|
242
|
+
});
|
|
243
|
+
logger.logCommandText('foo', cmd);
|
|
244
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.bgHex('#0f0')('[1]')} `, 'foo', cmd);
|
|
245
|
+
});
|
|
246
|
+
it('falls back to default color for malformed bgHex() syntax', () => {
|
|
247
|
+
const { logger } = createLogger({});
|
|
248
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
249
|
+
prefixColor: 'bgHex(invalid)',
|
|
250
|
+
});
|
|
251
|
+
logger.logCommandText('foo', cmd);
|
|
252
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[1]')} `, 'foo', cmd);
|
|
253
|
+
});
|
|
254
|
+
it('logs prefix with chained fgColor.bgHex().modifier pattern', () => {
|
|
255
|
+
const { logger } = createLogger({});
|
|
256
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
257
|
+
prefixColor: 'black.bgHex(#533AFD).dim',
|
|
258
|
+
});
|
|
259
|
+
logger.logCommandText('foo', cmd);
|
|
260
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.black.bgHex('#533AFD').dim('[1]')} `, 'foo', cmd);
|
|
261
|
+
});
|
|
262
|
+
it('logs prefix with chained fgColor.bg#HEXCODE.modifier pattern', () => {
|
|
263
|
+
const { logger } = createLogger({});
|
|
264
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
265
|
+
prefixColor: 'black.bg#FF0000.bold',
|
|
266
|
+
});
|
|
267
|
+
logger.logCommandText('foo', cmd);
|
|
268
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.black.bgHex('#FF0000').bold('[1]')} `, 'foo', cmd);
|
|
269
|
+
});
|
|
270
|
+
it('logs prefix with chained #HEXCODE.bgNamed.modifier pattern', () => {
|
|
271
|
+
const { logger } = createLogger({});
|
|
272
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
273
|
+
prefixColor: '#FF0000.bgBlue.dim',
|
|
274
|
+
});
|
|
275
|
+
logger.logCommandText('foo', cmd);
|
|
276
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.hex('#FF0000').bgBlue.dim('[1]')} `, 'foo', cmd);
|
|
277
|
+
});
|
|
278
|
+
it('logs prefix using rgb() color function', () => {
|
|
279
|
+
const { logger } = createLogger({});
|
|
280
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
281
|
+
prefixColor: 'rgb(255,136,0).bold',
|
|
282
|
+
});
|
|
283
|
+
logger.logCommandText('foo', cmd);
|
|
284
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.rgb(255, 136, 0).bold('[1]')} `, 'foo', cmd);
|
|
285
|
+
});
|
|
286
|
+
it('logs prefix using bgRgb() color function', () => {
|
|
287
|
+
const { logger } = createLogger({});
|
|
288
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
289
|
+
prefixColor: 'black.bgRgb(100,100,255)',
|
|
290
|
+
});
|
|
291
|
+
logger.logCommandText('foo', cmd);
|
|
292
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.black.bgRgb(100, 100, 255)('[1]')} `, 'foo', cmd);
|
|
293
|
+
});
|
|
294
|
+
it('logs prefix using ansi256() color function', () => {
|
|
295
|
+
const { logger } = createLogger({});
|
|
296
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
297
|
+
prefixColor: 'ansi256(199)',
|
|
298
|
+
});
|
|
299
|
+
logger.logCommandText('foo', cmd);
|
|
300
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.ansi256(199)('[1]')} `, 'foo', cmd);
|
|
301
|
+
});
|
|
302
|
+
it('logs prefix using bgAnsi256() color function', () => {
|
|
303
|
+
const { logger } = createLogger({});
|
|
304
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
305
|
+
prefixColor: 'ansi256(199).bgAnsi256(50)',
|
|
306
|
+
});
|
|
307
|
+
logger.logCommandText('foo', cmd);
|
|
308
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.ansi256(199).bgAnsi256(50)('[1]')} `, 'foo', cmd);
|
|
309
|
+
});
|
|
310
|
+
it('logs prefix using hex() explicit function', () => {
|
|
311
|
+
const { logger } = createLogger({});
|
|
312
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
313
|
+
prefixColor: 'hex(#ff5500)',
|
|
314
|
+
});
|
|
315
|
+
logger.logCommandText('foo', cmd);
|
|
316
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.hex('#ff5500')('[1]')} `, 'foo', cmd);
|
|
317
|
+
});
|
|
318
|
+
it('falls back to default color for malformed hex() syntax', () => {
|
|
319
|
+
const { logger } = createLogger({});
|
|
320
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
321
|
+
prefixColor: 'hex(invalid)',
|
|
322
|
+
});
|
|
323
|
+
logger.logCommandText('foo', cmd);
|
|
324
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[1]')} `, 'foo', cmd);
|
|
325
|
+
});
|
|
326
|
+
it('falls back to default color for unknown function name', () => {
|
|
327
|
+
const { logger } = createLogger({});
|
|
328
|
+
const cmd = new FakeCommand('', undefined, 1, {
|
|
329
|
+
prefixColor: 'unknownFunc(123)',
|
|
330
|
+
});
|
|
331
|
+
logger.logCommandText('foo', cmd);
|
|
332
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[1]')} `, 'foo', cmd);
|
|
333
|
+
});
|
|
334
|
+
it('does nothing if command is hidden by name', () => {
|
|
335
|
+
const { logger } = createLogger({ hide: ['abc'] });
|
|
336
|
+
const cmd = new FakeCommand('abc');
|
|
337
|
+
logger.logCommandText('foo', cmd);
|
|
338
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
339
|
+
});
|
|
340
|
+
it('does nothing if command is hidden by index', () => {
|
|
341
|
+
const { logger } = createLogger({ hide: [3] });
|
|
342
|
+
const cmd = new FakeCommand('', undefined, 3);
|
|
343
|
+
logger.logCommandText('foo', cmd);
|
|
344
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
describe('#logCommandText() with color markers', () => {
|
|
348
|
+
it('colors only the text inside {color}...{/color} within a template prefix', () => {
|
|
349
|
+
const { logger } = createLogger({ prefixFormat: '[{color}{name}{/color}]' });
|
|
350
|
+
const cmd = new FakeCommand('bar', undefined, 1, { prefixColor: 'blue' });
|
|
351
|
+
logger.logCommandText('foo', cmd);
|
|
352
|
+
expect(logger.log).toHaveBeenCalledWith(`[${chalk.blue('bar')}] `, 'foo', cmd);
|
|
353
|
+
});
|
|
354
|
+
it('supports multiple {color}...{/color} pairs in one template', () => {
|
|
355
|
+
const { logger } = createLogger({
|
|
356
|
+
prefixFormat: '{color}[{/color}{name}{color}]{/color}',
|
|
357
|
+
});
|
|
358
|
+
const cmd = new FakeCommand('bar', undefined, 1, { prefixColor: 'blue' });
|
|
359
|
+
logger.logCommandText('foo', cmd);
|
|
360
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.blue('[')}bar${chalk.blue(']')} `, 'foo', cmd);
|
|
361
|
+
});
|
|
362
|
+
it('auto-closes an unclosed {color} so the tail stays colored', () => {
|
|
363
|
+
const { logger } = createLogger({ prefixFormat: '[{color}{name}]' });
|
|
364
|
+
const cmd = new FakeCommand('bar', undefined, 1, { prefixColor: 'blue' });
|
|
365
|
+
logger.logCommandText('foo', cmd);
|
|
366
|
+
expect(logger.log).toHaveBeenCalledWith(`[${chalk.blue('bar]')} `, 'foo', cmd);
|
|
367
|
+
});
|
|
368
|
+
it('auto-opens a bare {/color} so the head stays colored', () => {
|
|
369
|
+
const { logger } = createLogger({ prefixFormat: '{name}{/color}]' });
|
|
370
|
+
const cmd = new FakeCommand('bar', undefined, 1, { prefixColor: 'blue' });
|
|
371
|
+
logger.logCommandText('foo', cmd);
|
|
372
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.blue('bar')}] `, 'foo', cmd);
|
|
373
|
+
});
|
|
374
|
+
it('templates without markers stay fully colored (backward compat)', () => {
|
|
375
|
+
const { logger } = createLogger({ prefixFormat: '{name}-{index}' });
|
|
376
|
+
const cmd = new FakeCommand('bar', undefined, 1, { prefixColor: 'blue' });
|
|
377
|
+
logger.logCommandText('foo', cmd);
|
|
378
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.blue('bar-1')} `, 'foo', cmd);
|
|
379
|
+
});
|
|
380
|
+
it('pads templated prefix based on visible length, ignoring marker tokens', () => {
|
|
381
|
+
const { logger } = createLogger({ prefixFormat: '{color}{name}{/color}' });
|
|
382
|
+
const cmd = new FakeCommand('foo', undefined, 0, { prefixColor: 'blue' });
|
|
383
|
+
logger.setPrefixLength(6);
|
|
384
|
+
logger.logCommandText('bar', cmd);
|
|
385
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.blue('foo')} `, 'bar', cmd);
|
|
386
|
+
});
|
|
387
|
+
it('strips markers and emits no ANSI escapes when colors are globally off', () => {
|
|
388
|
+
const { logger } = createLogger({ prefixFormat: '[{color}{name}{/color}]' });
|
|
389
|
+
logger.toggleColors(false);
|
|
390
|
+
const cmd = new FakeCommand('bar', undefined, 1, { prefixColor: 'blue' });
|
|
391
|
+
logger.logCommandText('foo', cmd);
|
|
392
|
+
expect(logger.log).toHaveBeenCalledWith('[bar] ', 'foo', cmd);
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
describe('#logCommandEvent()', () => {
|
|
396
|
+
it('does nothing if in raw mode', () => {
|
|
397
|
+
const { logger } = createLogger({ raw: true });
|
|
398
|
+
logger.logCommandEvent('foo', new FakeCommand());
|
|
399
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
400
|
+
});
|
|
401
|
+
it('does nothing if command is hidden by name', () => {
|
|
402
|
+
const { logger } = createLogger({ hide: ['abc'] });
|
|
403
|
+
const cmd = new FakeCommand('abc');
|
|
404
|
+
logger.logCommandEvent('foo', cmd);
|
|
405
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
406
|
+
});
|
|
407
|
+
it('does nothing if command is hidden by index', () => {
|
|
408
|
+
const { logger } = createLogger({ hide: [3] });
|
|
409
|
+
const cmd = new FakeCommand('', undefined, 3);
|
|
410
|
+
logger.logCommandEvent('foo', cmd);
|
|
411
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
412
|
+
});
|
|
413
|
+
it('logs text in gray dim', () => {
|
|
414
|
+
const { logger } = createLogger({});
|
|
415
|
+
const cmd = new FakeCommand('', undefined, 1);
|
|
416
|
+
logger.logCommandEvent('foo', cmd);
|
|
417
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[1]')} `, `${chalk.reset('foo')}\n`, cmd);
|
|
418
|
+
});
|
|
419
|
+
it('prepends a LF if previous command write did not end with a LF', () => {
|
|
420
|
+
const { logger } = createLogger({});
|
|
421
|
+
const cmd = new FakeCommand('', undefined, 1);
|
|
422
|
+
logger.logCommandText('text', cmd);
|
|
423
|
+
logger.logCommandEvent('event', cmd);
|
|
424
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('[1]')} `, `\n${chalk.reset('event')}\n`, cmd);
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
describe('#logTable()', () => {
|
|
428
|
+
it('does not log anything in raw mode', () => {
|
|
429
|
+
const { logger } = createLogger({ raw: true });
|
|
430
|
+
logger.logTable([{ foo: 1, bar: 2 }]);
|
|
431
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
432
|
+
});
|
|
433
|
+
it('does not log anything if value is not an array', () => {
|
|
434
|
+
const { logger } = createLogger({});
|
|
435
|
+
logger.logTable({});
|
|
436
|
+
logger.logTable(null);
|
|
437
|
+
logger.logTable(0);
|
|
438
|
+
logger.logTable('');
|
|
439
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
440
|
+
});
|
|
441
|
+
it('does not log anything if array is empty', () => {
|
|
442
|
+
const { logger } = createLogger({});
|
|
443
|
+
logger.logTable([]);
|
|
444
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
445
|
+
});
|
|
446
|
+
it('does not log anything if array items have no properties', () => {
|
|
447
|
+
const { logger } = createLogger({});
|
|
448
|
+
logger.logTable([{}]);
|
|
449
|
+
expect(logger.log).not.toHaveBeenCalled();
|
|
450
|
+
});
|
|
451
|
+
it("logs a header for each item's properties", () => {
|
|
452
|
+
const { logger } = createLogger({});
|
|
453
|
+
logger.logTable([{ foo: 1, bar: 2 }]);
|
|
454
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ foo │ bar │')}\n`);
|
|
455
|
+
});
|
|
456
|
+
it("logs padded headers according to longest column's value", () => {
|
|
457
|
+
const { logger } = createLogger({});
|
|
458
|
+
logger.logTable([{ a: 'foo', b: 'barbaz' }]);
|
|
459
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ a │ b │')}\n`);
|
|
460
|
+
});
|
|
461
|
+
it("logs each items's values", () => {
|
|
462
|
+
const { logger } = createLogger({});
|
|
463
|
+
logger.logTable([{ foo: 123 }, { foo: 456 }]);
|
|
464
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ 123 │')}\n`);
|
|
465
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ 456 │')}\n`);
|
|
466
|
+
});
|
|
467
|
+
it("logs each items's values with empty column", () => {
|
|
468
|
+
const { logger } = createLogger({});
|
|
469
|
+
logger.logTable([{ foo: 123 }, { foo: null }]);
|
|
470
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ 123 │')}\n`);
|
|
471
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ │')}\n`);
|
|
472
|
+
});
|
|
473
|
+
it("logs each items's values padded according to longest column's value", () => {
|
|
474
|
+
const { logger } = createLogger({});
|
|
475
|
+
logger.logTable([{ foo: 1 }, { foo: 123 }]);
|
|
476
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ 1 │')}\n`);
|
|
477
|
+
});
|
|
478
|
+
it('logs items with different properties in each', () => {
|
|
479
|
+
const { logger } = createLogger({});
|
|
480
|
+
logger.logTable([{ foo: 1 }, { bar: 2 }]);
|
|
481
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ foo │ bar │')}\n`);
|
|
482
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ 1 │ │')}\n`);
|
|
483
|
+
expect(logger.log).toHaveBeenCalledWith(`${chalk.reset('-->')} `, `${chalk.reset('│ │ 2 │')}\n`);
|
|
484
|
+
});
|
|
485
|
+
});
|
|
486
|
+
describe('#toggleColors()', () => {
|
|
487
|
+
it('uses supported color level when on', () => {
|
|
488
|
+
const { logger, spy } = createLogger({});
|
|
489
|
+
logger.toggleColors(true);
|
|
490
|
+
const command1 = new FakeCommand('foo', 'command', 0, { prefixColor: 'red' });
|
|
491
|
+
logger.logCommandText('bar', command1);
|
|
492
|
+
logger.logGlobalEvent('baz');
|
|
493
|
+
const texts = spy.getValues().map((value) => value.text);
|
|
494
|
+
expect(texts).toContain(`${chalk.red('[foo]')} `);
|
|
495
|
+
expect(texts).toContain(`${chalk.reset('-->')} `);
|
|
496
|
+
});
|
|
497
|
+
it('uses no colors when off', () => {
|
|
498
|
+
const { logger, spy } = createLogger({});
|
|
499
|
+
logger.toggleColors(false);
|
|
500
|
+
const command1 = new FakeCommand('foo', 'command', 0, { prefixColor: 'red' });
|
|
501
|
+
logger.logCommandText('bar', command1);
|
|
502
|
+
logger.logGlobalEvent('baz');
|
|
503
|
+
const texts = spy.getValues().map((value) => value.text);
|
|
504
|
+
expect(texts).toContain('[foo] ');
|
|
505
|
+
expect(texts).toContain('--> ');
|
|
506
|
+
});
|
|
507
|
+
});
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.fromSharedEvent = void 0;
|
|
4
|
-
const rxjs_1 = require("rxjs");
|
|
1
|
+
import { fromEvent, share } from 'rxjs';
|
|
5
2
|
const sharedEvents = new WeakMap();
|
|
6
3
|
/**
|
|
7
4
|
* Creates an observable for a specific event of an `EventEmitter` instance.
|
|
8
5
|
*
|
|
9
6
|
* The underlying event listener is set up only once across the application for that event emitter/name pair.
|
|
10
7
|
*/
|
|
11
|
-
function fromSharedEvent(emitter, event) {
|
|
8
|
+
export function fromSharedEvent(emitter, event) {
|
|
12
9
|
let emitterEvents = sharedEvents.get(emitter);
|
|
13
10
|
if (!emitterEvents) {
|
|
14
11
|
emitterEvents = new Map();
|
|
@@ -16,9 +13,8 @@ function fromSharedEvent(emitter, event) {
|
|
|
16
13
|
}
|
|
17
14
|
let observable = emitterEvents.get(event);
|
|
18
15
|
if (!observable) {
|
|
19
|
-
observable =
|
|
16
|
+
observable = fromEvent(emitter, event).pipe(share());
|
|
20
17
|
emitterEvents.set(event, observable);
|
|
21
18
|
}
|
|
22
19
|
return observable;
|
|
23
20
|
}
|
|
24
|
-
exports.fromSharedEvent = fromSharedEvent;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { fromSharedEvent } from './observables.js';
|
|
4
|
+
describe('fromSharedEvent()', () => {
|
|
5
|
+
it('returns same observable for event emitter/name pair', () => {
|
|
6
|
+
const emitter = new EventEmitter();
|
|
7
|
+
const obs1 = fromSharedEvent(emitter, 'foo');
|
|
8
|
+
const obs2 = fromSharedEvent(emitter, 'foo');
|
|
9
|
+
expect(obs1).toBe(obs2);
|
|
10
|
+
});
|
|
11
|
+
it('returns different observables for different event emitter/name pairs', () => {
|
|
12
|
+
const emitter = new EventEmitter();
|
|
13
|
+
const obs1 = fromSharedEvent(emitter, 'foo');
|
|
14
|
+
const obs2 = fromSharedEvent(emitter, 'bar');
|
|
15
|
+
expect(obs1).not.toBe(obs2);
|
|
16
|
+
const emitter2 = new EventEmitter();
|
|
17
|
+
const obs3 = fromSharedEvent(emitter2, 'foo');
|
|
18
|
+
const obs4 = fromSharedEvent(emitter2, 'bar');
|
|
19
|
+
expect(obs1).not.toBe(obs3);
|
|
20
|
+
expect(obs2).not.toBe(obs4);
|
|
21
|
+
});
|
|
22
|
+
it('sets up listener only once per event emitter/name pair', () => {
|
|
23
|
+
const emitter = new EventEmitter();
|
|
24
|
+
const observable = fromSharedEvent(emitter, 'foo');
|
|
25
|
+
observable.subscribe();
|
|
26
|
+
observable.subscribe();
|
|
27
|
+
expect(emitter.listenerCount('foo')).toBe(1);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import { Command } from './command';
|
|
1
|
+
import { Writable } from 'node:stream';
|
|
2
|
+
import Rx from 'rxjs';
|
|
3
|
+
import { Command } from './command.js';
|
|
5
4
|
/**
|
|
6
5
|
* Class responsible for actually writing output onto a writable stream.
|
|
7
6
|
*/
|
|
@@ -1,35 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.OutputWriter = void 0;
|
|
27
|
-
const Rx = __importStar(require("rxjs"));
|
|
28
|
-
const observables_1 = require("./observables");
|
|
1
|
+
import Rx from 'rxjs';
|
|
2
|
+
import { fromSharedEvent } from './observables.js';
|
|
29
3
|
/**
|
|
30
4
|
* Class responsible for actually writing output onto a writable stream.
|
|
31
5
|
*/
|
|
32
|
-
class OutputWriter {
|
|
6
|
+
export class OutputWriter {
|
|
33
7
|
outputStream;
|
|
34
8
|
group;
|
|
35
9
|
buffers;
|
|
@@ -41,7 +15,7 @@ class OutputWriter {
|
|
|
41
15
|
constructor({ outputStream, group, commands, }) {
|
|
42
16
|
this.outputStream = outputStream;
|
|
43
17
|
this.ensureWritable();
|
|
44
|
-
this.error =
|
|
18
|
+
this.error = fromSharedEvent(this.outputStream, 'error');
|
|
45
19
|
this.group = group;
|
|
46
20
|
this.buffers = commands.map(() => []);
|
|
47
21
|
if (this.group) {
|
|
@@ -87,4 +61,3 @@ class OutputWriter {
|
|
|
87
61
|
this.buffers[index] = [];
|
|
88
62
|
}
|
|
89
63
|
}
|
|
90
|
-
exports.OutputWriter = OutputWriter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|