concurrently 6.5.0 → 7.1.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.
Files changed (82) hide show
  1. package/README.md +82 -22
  2. package/dist/bin/concurrently.d.ts +2 -0
  3. package/dist/bin/concurrently.js +193 -0
  4. package/dist/bin/epilogue.d.ts +1 -0
  5. package/dist/bin/epilogue.js +69 -0
  6. package/dist/src/command-parser/command-parser.d.ts +19 -0
  7. package/dist/src/command-parser/command-parser.js +2 -0
  8. package/dist/src/command-parser/expand-npm-shortcut.d.ts +8 -0
  9. package/{src → dist/src}/command-parser/expand-npm-shortcut.js +10 -3
  10. package/dist/src/command-parser/expand-npm-wildcard.d.ts +13 -0
  11. package/dist/src/command-parser/expand-npm-wildcard.js +82 -0
  12. package/dist/src/command-parser/strip-quotes.d.ts +10 -0
  13. package/{src → dist/src}/command-parser/strip-quotes.js +10 -4
  14. package/dist/src/command.d.ts +101 -0
  15. package/{src → dist/src}/command.js +53 -29
  16. package/dist/src/completion-listener.d.ts +37 -0
  17. package/dist/src/completion-listener.js +60 -0
  18. package/dist/src/concurrently.d.ts +77 -0
  19. package/dist/src/concurrently.js +120 -0
  20. package/dist/src/defaults.d.ts +52 -0
  21. package/dist/src/defaults.js +58 -0
  22. package/dist/src/flow-control/flow-controller.d.ts +13 -0
  23. package/dist/src/flow-control/flow-controller.js +2 -0
  24. package/dist/src/flow-control/input-handler.d.ts +33 -0
  25. package/dist/src/flow-control/input-handler.js +73 -0
  26. package/dist/src/flow-control/kill-on-signal.d.ts +17 -0
  27. package/{src → dist/src}/flow-control/kill-on-signal.js +13 -11
  28. package/dist/src/flow-control/kill-others.d.ts +18 -0
  29. package/dist/src/flow-control/kill-others.js +35 -0
  30. package/dist/src/flow-control/log-error.d.ts +15 -0
  31. package/dist/src/flow-control/log-error.js +21 -0
  32. package/dist/src/flow-control/log-exit.d.ts +15 -0
  33. package/dist/src/flow-control/log-exit.js +19 -0
  34. package/dist/src/flow-control/log-output.d.ts +15 -0
  35. package/{src → dist/src}/flow-control/log-output.js +13 -5
  36. package/dist/src/flow-control/log-timings.d.ts +27 -0
  37. package/dist/src/flow-control/log-timings.js +88 -0
  38. package/dist/src/flow-control/restart-process.d.ts +22 -0
  39. package/dist/src/flow-control/restart-process.js +71 -0
  40. package/dist/src/get-spawn-opts.d.ts +30 -0
  41. package/dist/src/get-spawn-opts.js +11 -0
  42. package/dist/src/index.d.ts +69 -0
  43. package/dist/src/index.js +69 -0
  44. package/dist/src/logger.d.ts +72 -0
  45. package/{src → dist/src}/logger.js +77 -58
  46. package/dist/src/output-writer.d.ts +19 -0
  47. package/dist/src/output-writer.js +69 -0
  48. package/index.js +6 -68
  49. package/index.mjs +9 -0
  50. package/package.json +38 -11
  51. package/bin/concurrently.js +0 -186
  52. package/bin/concurrently.spec.js +0 -428
  53. package/bin/epilogue.txt +0 -46
  54. package/src/command-parser/expand-npm-shortcut.spec.js +0 -36
  55. package/src/command-parser/expand-npm-wildcard.js +0 -43
  56. package/src/command-parser/expand-npm-wildcard.spec.js +0 -87
  57. package/src/command-parser/strip-quotes.spec.js +0 -20
  58. package/src/command.spec.js +0 -275
  59. package/src/completion-listener.js +0 -39
  60. package/src/completion-listener.spec.js +0 -89
  61. package/src/concurrently.js +0 -116
  62. package/src/concurrently.spec.js +0 -199
  63. package/src/defaults.js +0 -35
  64. package/src/flow-control/base-handler.js +0 -16
  65. package/src/flow-control/base-handler.spec.js +0 -22
  66. package/src/flow-control/input-handler.js +0 -50
  67. package/src/flow-control/input-handler.spec.js +0 -113
  68. package/src/flow-control/kill-on-signal.spec.js +0 -79
  69. package/src/flow-control/kill-others.js +0 -38
  70. package/src/flow-control/kill-others.spec.js +0 -66
  71. package/src/flow-control/log-error.js +0 -18
  72. package/src/flow-control/log-error.spec.js +0 -40
  73. package/src/flow-control/log-exit.js +0 -11
  74. package/src/flow-control/log-exit.spec.js +0 -36
  75. package/src/flow-control/log-output.spec.js +0 -41
  76. package/src/flow-control/log-timings.js +0 -64
  77. package/src/flow-control/log-timings.spec.js +0 -137
  78. package/src/flow-control/restart-process.js +0 -56
  79. package/src/flow-control/restart-process.spec.js +0 -139
  80. package/src/get-spawn-opts.js +0 -16
  81. package/src/get-spawn-opts.spec.js +0 -30
  82. package/src/logger.spec.js +0 -318
@@ -1,318 +0,0 @@
1
- const { Writable } = require('stream');
2
- const chalk = require('chalk');
3
- const { createMockInstance } = require('jest-create-mock-instance');
4
- const Logger = require('./logger');
5
-
6
- let outputStream;
7
- beforeEach(() => {
8
- outputStream = createMockInstance(Writable);
9
- // Force chalk to use colours, otherwise tests may pass when they were supposed to be failing.
10
- chalk.level = 3;
11
- });
12
-
13
- const createLogger = options => {
14
- const logger = new Logger(Object.assign({ outputStream }, options));
15
- jest.spyOn(logger, 'log');
16
- return logger;
17
- };
18
-
19
- describe('#log()', () => {
20
- it('writes prefix + text to the output stream', () => {
21
- const logger = new Logger({ outputStream });
22
- logger.log('foo', 'bar');
23
-
24
- expect(outputStream.write).toHaveBeenCalledTimes(2);
25
- expect(outputStream.write).toHaveBeenCalledWith('foo');
26
- expect(outputStream.write).toHaveBeenCalledWith('bar');
27
- });
28
-
29
- it('writes multiple lines of text with prefix on each', () => {
30
- const logger = new Logger({ outputStream });
31
- logger.log('foo', 'bar\nbaz\n');
32
-
33
- expect(outputStream.write).toHaveBeenCalledTimes(2);
34
- expect(outputStream.write).toHaveBeenCalledWith('foo');
35
- expect(outputStream.write).toHaveBeenCalledWith('bar\nfoobaz\n');
36
- });
37
-
38
- it('does not prepend prefix if last call did not finish with a LF', () => {
39
- const logger = new Logger({ outputStream });
40
- logger.log('foo', 'bar');
41
- outputStream.write.mockClear();
42
- logger.log('foo', 'baz');
43
-
44
- expect(outputStream.write).toHaveBeenCalledTimes(1);
45
- expect(outputStream.write).toHaveBeenCalledWith('baz');
46
- });
47
-
48
- it('does not prepend prefix or handle text if logger is in raw mode', () => {
49
- const logger = new Logger({ outputStream, raw: true });
50
- logger.log('foo', 'bar\nbaz\n');
51
-
52
- expect(outputStream.write).toHaveBeenCalledTimes(1);
53
- expect(outputStream.write).toHaveBeenCalledWith('bar\nbaz\n');
54
- });
55
- });
56
-
57
- describe('#logGlobalEvent()', () => {
58
- it('does nothing if in raw mode', () => {
59
- const logger = createLogger({ raw: true });
60
- logger.logGlobalEvent('foo');
61
-
62
- expect(logger.log).not.toHaveBeenCalled();
63
- });
64
-
65
- it('logs in gray dim style with arrow prefix', () => {
66
- const logger = createLogger();
67
- logger.logGlobalEvent('foo');
68
-
69
- expect(logger.log).toHaveBeenCalledWith(
70
- chalk.reset('-->') + ' ',
71
- chalk.reset('foo') + '\n'
72
- );
73
- });
74
- });
75
-
76
- describe('#logCommandText()', () => {
77
- it('logs with name if no prefixFormat is set', () => {
78
- const logger = createLogger();
79
- logger.logCommandText('foo', { name: 'bla' });
80
-
81
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[bla]') + ' ', 'foo');
82
- });
83
-
84
- it('logs with index if no prefixFormat is set, and command has no name', () => {
85
- const logger = createLogger();
86
- logger.logCommandText('foo', { index: 2 });
87
-
88
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[2]') + ' ', 'foo');
89
- });
90
-
91
- it('logs with prefixFormat set to pid', () => {
92
- const logger = createLogger({ prefixFormat: 'pid' });
93
- logger.logCommandText('foo', {
94
- pid: 123,
95
- info: {}
96
- });
97
-
98
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[123]') + ' ', 'foo');
99
- });
100
-
101
- it('logs with prefixFormat set to name', () => {
102
- const logger = createLogger({ prefixFormat: 'name' });
103
- logger.logCommandText('foo', { name: 'bar' });
104
-
105
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[bar]') + ' ', 'foo');
106
- });
107
-
108
- it('logs with prefixFormat set to index', () => {
109
- const logger = createLogger({ prefixFormat: 'index' });
110
- logger.logCommandText('foo', { index: 3 });
111
-
112
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[3]') + ' ', 'foo');
113
- });
114
-
115
- it('logs with prefixFormat set to time (with timestampFormat)', () => {
116
- const logger = createLogger({ prefixFormat: 'time', timestampFormat: 'yyyy' });
117
- logger.logCommandText('foo', {});
118
-
119
- const year = new Date().getFullYear();
120
- expect(logger.log).toHaveBeenCalledWith(chalk.reset(`[${year}]`) + ' ', 'foo');
121
- });
122
-
123
- it('logs with templated prefixFormat', () => {
124
- const logger = createLogger({ prefixFormat: '{index}-{name}' });
125
- logger.logCommandText('foo', { index: 0, name: 'bar' });
126
-
127
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('0-bar') + ' ', 'foo');
128
- });
129
-
130
- it('does not strip spaces from beginning or end of prefixFormat', () => {
131
- const logger = createLogger({ prefixFormat: ' {index}-{name} ' });
132
- logger.logCommandText('foo', { index: 0, name: 'bar' });
133
-
134
- expect(logger.log).toHaveBeenCalledWith(chalk.reset(' 0-bar ') + ' ', 'foo');
135
- });
136
-
137
- it('logs with no prefix', () => {
138
- const logger = createLogger({ prefixFormat: 'none' });
139
- logger.logCommandText('foo', { command: 'echo foo' });
140
-
141
- expect(logger.log).toHaveBeenCalledWith(chalk.reset(''), 'foo');
142
- });
143
-
144
- it('logs prefix using command line itself', () => {
145
- const logger = createLogger({ prefixFormat: 'command' });
146
- logger.logCommandText('foo', { command: 'echo foo' });
147
-
148
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[echo foo]') + ' ', 'foo');
149
- });
150
-
151
- it('logs prefix using command line itself, capped at prefixLength bytes', () => {
152
- const logger = createLogger({ prefixFormat: 'command', prefixLength: 6 });
153
- logger.logCommandText('foo', { command: 'echo foo' });
154
-
155
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[ec..oo]') + ' ', 'foo');
156
- });
157
-
158
- it('logs prefix using prefixColor from command', () => {
159
- const logger = createLogger();
160
- logger.logCommandText('foo', { prefixColor: 'blue', index: 1 });
161
-
162
- expect(logger.log).toHaveBeenCalledWith(chalk.blue('[1]') + ' ', 'foo');
163
- });
164
-
165
- it('logs prefix in gray dim if prefixColor from command does not exist', () => {
166
- const logger = createLogger();
167
- logger.logCommandText('foo', { prefixColor: 'blue.fake', index: 1 });
168
-
169
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[1]') + ' ', 'foo');
170
- });
171
-
172
- it('logs prefix using prefixColor from command if prefixColor is a hex value', () => {
173
- const logger = createLogger();
174
- const prefixColor = '#32bd8a';
175
- logger.logCommandText('foo', {prefixColor, index: 1});
176
-
177
- expect(logger.log).toHaveBeenCalledWith(chalk.hex(prefixColor)('[1]') + ' ', 'foo');
178
- });
179
-
180
- it('does nothing if command is hidden by name', () => {
181
- const logger = createLogger({ hide: ['abc'] });
182
- logger.logCommandText('foo', { name: 'abc' });
183
-
184
- expect(logger.log).not.toHaveBeenCalled();
185
- });
186
-
187
- it('does nothing if command is hidden by index', () => {
188
- const logger = createLogger({ hide: [3] });
189
- logger.logCommandText('foo', { index: 3 });
190
-
191
- expect(logger.log).not.toHaveBeenCalled();
192
- });
193
- });
194
-
195
- describe('#logCommandEvent()', () => {
196
- it('does nothing if in raw mode', () => {
197
- const logger = createLogger({ raw: true });
198
- logger.logCommandEvent('foo');
199
-
200
- expect(logger.log).not.toHaveBeenCalled();
201
- });
202
-
203
- it('does nothing if command is hidden by name', () => {
204
- const logger = createLogger({ hide: ['abc'] });
205
- logger.logCommandEvent('foo', { name: 'abc' });
206
-
207
- expect(logger.log).not.toHaveBeenCalled();
208
- });
209
-
210
- it('does nothing if command is hidden by index', () => {
211
- const logger = createLogger({ hide: [3] });
212
- logger.logCommandEvent('foo', { index: 3 });
213
-
214
- expect(logger.log).not.toHaveBeenCalled();
215
- });
216
-
217
- it('logs text in gray dim', () => {
218
- const logger = createLogger();
219
- logger.logCommandEvent('foo', { index: 1 });
220
-
221
- expect(logger.log).toHaveBeenCalledWith(chalk.reset('[1]') + ' ', chalk.reset('foo') + '\n');
222
- });
223
- });
224
-
225
- describe('#logTable()', () => {
226
- it('does not log anything in raw mode', () => {
227
- const logger = createLogger({ raw: true });
228
- logger.logTable([{ foo: 1, bar: 2 }]);
229
-
230
- expect(logger.log).not.toHaveBeenCalled();
231
- });
232
-
233
- it('does not log anything if value is not an array', () => {
234
- const logger = createLogger();
235
- logger.logTable({});
236
- logger.logTable(null);
237
- logger.logTable(0);
238
- logger.logTable('');
239
-
240
- expect(logger.log).not.toHaveBeenCalled();
241
- });
242
-
243
- it('does not log anything if array is empy', () => {
244
- const logger = createLogger();
245
- logger.logTable([]);
246
-
247
- expect(logger.log).not.toHaveBeenCalled();
248
- });
249
-
250
- it('does not log anything if array items have no properties', () => {
251
- const logger = createLogger();
252
- logger.logTable([{}]);
253
-
254
- expect(logger.log).not.toHaveBeenCalled();
255
- });
256
-
257
- it('logs a header for each item\'s properties', () => {
258
- const logger = createLogger();
259
- logger.logTable([{ foo: 1, bar: 2 }]);
260
-
261
- expect(logger.log).toHaveBeenCalledWith(
262
- chalk.reset('-->') + ' ',
263
- chalk.reset('│ foo │ bar │') + '\n',
264
- );
265
- });
266
-
267
- it('logs padded headers according to longest column\'s value', () => {
268
- const logger = createLogger();
269
- logger.logTable([{ a: 'foo', b: 'barbaz' }]);
270
-
271
- expect(logger.log).toHaveBeenCalledWith(
272
- chalk.reset('-->') + ' ',
273
- chalk.reset('│ a │ b │') + '\n',
274
- );
275
- });
276
-
277
- it('logs each items\'s values', () => {
278
- const logger = createLogger();
279
- logger.logTable([{ foo: 123 }, { foo: 456 }]);
280
-
281
- expect(logger.log).toHaveBeenCalledWith(
282
- chalk.reset('-->') + ' ',
283
- chalk.reset('│ 123 │') + '\n',
284
- );
285
- expect(logger.log).toHaveBeenCalledWith(
286
- chalk.reset('-->') + ' ',
287
- chalk.reset('│ 456 │') + '\n',
288
- );
289
- });
290
-
291
- it('logs each items\'s values padded according to longest column\'s value', () => {
292
- const logger = createLogger();
293
- logger.logTable([{ foo: 1 }, { foo: 123 }]);
294
-
295
- expect(logger.log).toHaveBeenCalledWith(
296
- chalk.reset('-->') + ' ',
297
- chalk.reset('│ 1 │') + '\n',
298
- );
299
- });
300
-
301
- it('logs items with different properties in each', () => {
302
- const logger = createLogger();
303
- logger.logTable([{ foo: 1 }, { bar: 2 }]);
304
-
305
- expect(logger.log).toHaveBeenCalledWith(
306
- chalk.reset('-->') + ' ',
307
- chalk.reset('│ foo │ bar │') + '\n',
308
- );
309
- expect(logger.log).toHaveBeenCalledWith(
310
- chalk.reset('-->') + ' ',
311
- chalk.reset('│ 1 │ │') + '\n',
312
- );
313
- expect(logger.log).toHaveBeenCalledWith(
314
- chalk.reset('-->') + ' ',
315
- chalk.reset('│ │ 2 │') + '\n',
316
- );
317
- });
318
- });