Skip to content

Commit a926e72

Browse files
marcopiracciniaduh95
authored andcommitted
watch: print name of changed file that triggers restart
Signed-off-by: marcopiraccini <marco.piraccini@gmail.com> PR-URL: #63781 Fixes: #63767 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Paolo Insogna <paolo@cowtech.it> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent e068299 commit a926e72

5 files changed

Lines changed: 57 additions & 5 deletions

File tree

lib/internal/main/watch_mode.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const {
2020
const { getOptionValue } = require('internal/options');
2121
const { FilesWatcher } = require('internal/watch_mode/files_watcher');
2222
const { green, blue, red, white, clear } = require('internal/util/colors');
23-
const { convertToValidSignal } = require('internal/util');
23+
const { convertToValidSignal, kEmptyObject } = require('internal/util');
2424

2525
const { spawn } = require('child_process');
2626
const { inspect } = require('util');
@@ -169,11 +169,14 @@ async function stop(child) {
169169

170170
let restarting = false;
171171

172-
async function restart(child) {
172+
async function restart(child, trigger) {
173173
if (restarting) return;
174174
restarting = true;
175175
try {
176176
if (!kPreserveOutput) process.stdout.write(clear);
177+
if (trigger) {
178+
process.stdout.write(`${blue}Change detected in ${inspect(trigger)}${white}\n`);
179+
}
177180
process.stdout.write(`${green}Restarting ${kCommandStr}${white}\n`);
178181
await stop(child);
179182
return start();
@@ -184,8 +187,8 @@ async function restart(child) {
184187

185188
async function init() {
186189
let child = start();
187-
const restartChild = async () => {
188-
child = await restart(child);
190+
const restartChild = async ({ trigger } = kEmptyObject) => {
191+
child = await restart(child, trigger);
189192
};
190193
watcher
191194
.on('changed', restartChild)

lib/internal/watch_mode/files_watcher.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class FilesWatcher extends EventEmitter {
3939
#ownerDependencies = new SafeMap();
4040
#debounceOwners = new SafeSet();
4141
#debounceTimer;
42+
#debounceTrigger;
4243
#debounce;
4344
#mode;
4445
#signal;
@@ -98,11 +99,13 @@ class FilesWatcher extends EventEmitter {
9899
this.#debounceOwners.add(owner);
99100
}
100101
}
102+
this.#debounceTrigger = trigger;
101103
clearTimeout(this.#debounceTimer);
102104
this.#debounceTimer = setTimeout(() => {
103105
this.#debounceTimer = null;
104-
this.emit('changed', { owners: this.#debounceOwners, eventType });
106+
this.emit('changed', { owners: this.#debounceOwners, eventType, trigger: this.#debounceTrigger });
105107
this.#debounceOwners.clear();
108+
this.#debounceTrigger = undefined;
106109
}, this.#debounce).unref();
107110
}
108111

@@ -207,6 +210,7 @@ class FilesWatcher extends EventEmitter {
207210
clearTimeout(this.#debounceTimer);
208211
this.#debounceTimer = null;
209212
this.#debounceOwners.clear();
213+
this.#debounceTrigger = undefined;
210214
this.#watchers.forEach(this.#unwatch);
211215
this.#watchers.clear();
212216
this.#filteredFiles.clear();

test/sequential/test-watch-mode-restart-esm-loading-error.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ try {
120120
const { stderr: stderr2, stdout: stdout2 } = await failedRestart;
121121
assert.match(stderr2, /SyntaxError: Invalid or unexpected token/);
122122
assert.deepStrictEqual(stdout2, [
123+
`Change detected in ${inspect(file)}`,
123124
`Restarting ${inspect(file)}`,
124125
`Failed running ${inspect(file)}. Waiting for file changes before restarting...`,
125126
]);
@@ -132,6 +133,7 @@ try {
132133
// Verify it recovered and ran successfully
133134
assert.strictEqual(stderr3, '');
134135
assert.deepStrictEqual(stdout3, [
136+
`Change detected in ${inspect(file)}`,
135137
`Restarting ${inspect(file)}`,
136138
'hello again, world',
137139
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,

test/sequential/test-watch-mode-worker.mjs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ function restart(file) {
1919
return () => clearInterval(timer);
2020
}
2121

22+
function changeDetected(file) {
23+
return `Change detected in ${inspect(file)}`;
24+
}
25+
2226
let tmpFiles = 0;
2327
function createTmpFile(content = 'console.log(\'running\');', ext = '.js', basename = tmpdir.path) {
2428
const file = path.join(basename, `${tmpFiles++}${ext}`);
@@ -108,6 +112,7 @@ const w = new Worker(${JSON.stringify(worker)});
108112
assert.deepStrictEqual(stdout, [
109113
'worker running',
110114
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
115+
changeDetected(worker),
111116
`Restarting ${inspect(file)}`,
112117
'worker running',
113118
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -142,6 +147,7 @@ const w = new Worker(${JSON.stringify(worker)});
142147
assert.deepStrictEqual(stdout, [
143148
'dep v1',
144149
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
150+
changeDetected(dep),
145151
`Restarting ${inspect(file)}`,
146152
'dep v1',
147153
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -182,6 +188,7 @@ const w = new Worker(${JSON.stringify(worker)});
182188
assert.deepStrictEqual(stdout, [
183189
'sub-dep v1',
184190
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
191+
changeDetected(subDep),
185192
`Restarting ${inspect(file)}`,
186193
'sub-dep v1',
187194
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -210,6 +217,7 @@ new Worker(new URL(${JSON.stringify(pathToFileURL(worker))}));
210217
assert.deepStrictEqual(stdout, [
211218
'worker running',
212219
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
220+
changeDetected(worker),
213221
`Restarting ${inspect(file)}`,
214222
'worker running',
215223
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -244,6 +252,7 @@ new Worker(new URL(${JSON.stringify(pathToFileURL(worker))}));
244252
assert.deepStrictEqual(stdout, [
245253
'dep v1',
246254
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
255+
changeDetected(dep),
247256
`Restarting ${inspect(file)}`,
248257
'dep v1',
249258
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -284,6 +293,7 @@ new Worker(new URL(${JSON.stringify(pathToFileURL(worker))}));
284293
assert.deepStrictEqual(stdout, [
285294
'sub-dep v1',
286295
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
296+
changeDetected(subDep),
287297
`Restarting ${inspect(file)}`,
288298
'sub-dep v1',
289299
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,

test/sequential/test-watch-mode.mjs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ function restart(file, content = readFileSync(file)) {
2323
return () => clearInterval(timer);
2424
}
2525

26+
function changeDetected(file) {
27+
return `Change detected in ${inspect(file)}`;
28+
}
29+
2630
let tmpFiles = 0;
2731
function createTmpFile(content = 'console.log("running");', ext = '.js', basename = tmpdir.path) {
2832
const file = path.join(basename, `${tmpFiles++}${ext}`);
@@ -198,6 +202,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
198202
assert.deepStrictEqual(stdout, [
199203
'running',
200204
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
205+
changeDetected(file),
201206
`Restarting ${inspect(file)}`,
202207
'running',
203208
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -212,6 +217,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
212217
assert.deepStrictEqual(stdout, [
213218
'running',
214219
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
220+
changeDetected(file),
215221
`Restarting ${inspect(file)}`,
216222
'running',
217223
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -233,6 +239,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
233239

234240
assert.strictEqual(stderr, '');
235241
assert.deepStrictEqual(stdout, [
242+
changeDetected(envFile),
236243
`Restarting ${inspect(jsFile)}`,
237244
'ENV: value2',
238245
`Completed running ${inspect(jsFile)}. Waiting for file changes before restarting...`,
@@ -258,6 +265,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
258265

259266
assert.strictEqual(stderr, '');
260267
assert.deepStrictEqual(stdout, [
268+
changeDetected(envFile),
261269
`Restarting ${inspect(jsFile)}`,
262270
'ENV: value1',
263271
'ENV2: newValue',
@@ -284,6 +292,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
284292

285293
assert.strictEqual(stderr, '');
286294
assert.deepStrictEqual(stdout, [
295+
changeDetected(envFile),
287296
`Restarting ${inspect(jsFile)}`,
288297
'ENV: value1',
289298
'ENV2: newValue',
@@ -327,6 +336,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
327336
assert.match(stderr, /Error: fails\r?\n/);
328337
assert.deepStrictEqual(stdout, [
329338
`Failed running ${inspect(file)}. Waiting for file changes before restarting...`,
339+
changeDetected(file),
330340
`Restarting ${inspect(file)}`,
331341
`Failed running ${inspect(file)}. Waiting for file changes before restarting...`,
332342
]);
@@ -346,6 +356,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
346356
assert.deepStrictEqual(stdout, [
347357
'running',
348358
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
359+
changeDetected(watchedFile),
349360
`Restarting ${inspect(file)}`,
350361
'running',
351362
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -372,6 +383,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
372383
assert.match(stderr, /Error: Cannot find module/g);
373384
assert.deepStrictEqual(stdout, [
374385
`Failed running ${inspect(file)}. Waiting for file changes before restarting...`,
386+
changeDetected(watchedFile),
375387
`Restarting ${inspect(file)}`,
376388
`Failed running ${inspect(file)}. Waiting for file changes before restarting...`,
377389
]);
@@ -396,6 +408,7 @@ describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_00
396408
assert.match(stderr, /Error: Cannot find module/g);
397409
assert.deepStrictEqual(stdout, [
398410
`Failed running ${inspect(file)}. Waiting for file changes before restarting...`,
411+
changeDetected(watchedFile),
399412
`Restarting ${inspect(file)}`,
400413
`Failed running ${inspect(file)}. Waiting for file changes before restarting...`,
401414
]);
@@ -411,6 +424,7 @@ console.log("don't show me");`);
411424
assert.strictEqual(stderr, '');
412425
assert.deepStrictEqual(stdout, [
413426
'running',
427+
changeDetected(file),
414428
`Restarting ${inspect(file)}`,
415429
'running',
416430
]);
@@ -428,6 +442,7 @@ console.log(dependency);
428442
assert.deepStrictEqual(stdout, [
429443
'{}',
430444
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
445+
changeDetected(dependency),
431446
`Restarting ${inspect(file)}`,
432447
'{}',
433448
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -446,6 +461,7 @@ console.log(dependency);
446461
assert.deepStrictEqual(stdout, [
447462
'{}',
448463
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
464+
changeDetected(dependency),
449465
`Restarting ${inspect(file)}`,
450466
'{}',
451467
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -460,9 +476,11 @@ console.log(dependency);
460476
assert.deepStrictEqual(stdout, [
461477
'running',
462478
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
479+
changeDetected(file),
463480
`Restarting ${inspect(file)}`,
464481
'running',
465482
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
483+
changeDetected(file),
466484
`Restarting ${inspect(file)}`,
467485
'running',
468486
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -483,6 +501,7 @@ console.log(values.random);
483501
assert.deepStrictEqual(stdout, [
484502
random,
485503
`Completed running ${inspect(`${file} --random ${random}`)}. Waiting for file changes before restarting...`,
504+
changeDetected(file),
486505
`Restarting ${inspect(`${file} --random ${random}`)}`,
487506
random,
488507
`Completed running ${inspect(`${file} --random ${random}`)}. Waiting for file changes before restarting...`,
@@ -500,6 +519,7 @@ console.log(values.random);
500519
assert.deepStrictEqual(stdout, [
501520
'running',
502521
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
522+
changeDetected(file),
503523
`Restarting ${inspect(file)}`,
504524
'running',
505525
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -520,6 +540,7 @@ console.log(values.random);
520540
assert.deepStrictEqual(stdout, [
521541
'running',
522542
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
543+
changeDetected(file),
523544
`Restarting ${inspect(file)}`,
524545
'running',
525546
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -569,6 +590,7 @@ console.log(values.random);
569590
assert.deepStrictEqual(stdout, [
570591
'running',
571592
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
593+
changeDetected(file),
572594
`Restarting ${inspect(file)}`,
573595
'running',
574596
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -584,6 +606,7 @@ console.log(values.random);
584606
assert.deepStrictEqual(stdout, [
585607
'running',
586608
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
609+
changeDetected(file),
587610
`Restarting ${inspect(file)}`,
588611
'running',
589612
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -615,6 +638,7 @@ console.log(values.random);
615638
'hello',
616639
'running',
617640
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
641+
changeDetected(watchedFile),
618642
`Restarting ${inspect(file)}`,
619643
'hello',
620644
'running',
@@ -647,6 +671,7 @@ console.log(values.random);
647671
'hello',
648672
'running',
649673
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
674+
changeDetected(watchedFile),
650675
`Restarting ${inspect(file)}`,
651676
'hello',
652677
'running',
@@ -679,6 +704,7 @@ console.log(values.random);
679704
'hello',
680705
'running',
681706
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
707+
changeDetected(watchedFile),
682708
`Restarting ${inspect(file)}`,
683709
'hello',
684710
'running',
@@ -711,6 +737,7 @@ console.log(values.random);
711737
'hello',
712738
'running',
713739
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
740+
changeDetected(watchedFile),
714741
`Restarting ${inspect(file)}`,
715742
'hello',
716743
'running',
@@ -727,6 +754,7 @@ console.log(values.random);
727754
assert.deepStrictEqual(stdout, [
728755
'running',
729756
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
757+
changeDetected(file),
730758
`Restarting ${inspect(file)}`,
731759
'running',
732760
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -752,6 +780,7 @@ console.log(values.random);
752780
'hello',
753781
'running',
754782
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
783+
changeDetected(file),
755784
`Restarting ${inspect(file)}`,
756785
'hello',
757786
'running',
@@ -832,6 +861,7 @@ process.on('message', (message) => {
832861
assert.deepStrictEqual(lines, [
833862
'running',
834863
'Received: first message',
864+
changeDetected(file),
835865
`Restarting ${inspect(file)}`,
836866
'running',
837867
'Received: second message',
@@ -852,6 +882,7 @@ process.on('message', (message) => {
852882
assert.deepStrictEqual(stdout, [
853883
'running',
854884
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
885+
changeDetected(file),
855886
`Restarting ${inspect(file)}`,
856887
'running',
857888
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -874,6 +905,7 @@ process.on('message', (message) => {
874905
assert.deepStrictEqual(stdout, [
875906
'running',
876907
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
908+
changeDetected(watchedFile),
877909
`Restarting ${inspect(file)}`,
878910
'running',
879911
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
@@ -902,6 +934,7 @@ process.on('message', (message) => {
902934
assert.deepStrictEqual(stdout, [
903935
'running',
904936
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,
937+
changeDetected(file),
905938
`Restarting ${inspect(file)}`,
906939
'running',
907940
`Completed running ${inspect(file)}. Waiting for file changes before restarting...`,

0 commit comments

Comments
 (0)