Skip to content

Commit de88029

Browse files
authored
chore: make "watch" script work on all platforms (#991)
Use `chokidar` to track file system changes as soon it will throw an error if the platform does not support `{ recursive: true }`. Fix also an error where the built file was not being deleted when the source was removed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fix #989 Ref: nodejs/node#29947
1 parent f0e9661 commit de88029

File tree

3 files changed

+120
-32
lines changed

3 files changed

+120
-32
lines changed

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
},
5151
"devDependencies": {
5252
"@babel/plugin-proposal-class-properties": "^7.5.5",
53-
"@babel/plugin-transform-runtime": "^7.6.2"
53+
"@babel/plugin-transform-runtime": "^7.6.2",
54+
"chokidar": "^3.3.1"
5455
}
5556
}

scripts/watch.js

+37-28
Original file line numberDiff line numberDiff line change
@@ -13,47 +13,56 @@ const fs = require('fs');
1313
const {execSync} = require('child_process');
1414
const path = require('path');
1515
const chalk = require('chalk');
16+
const chokidar = require('chokidar');
1617
const {getPackages} = require('./helpers');
1718

1819
const BUILD_CMD = `node ${path.resolve(__dirname, './build.js')}`;
1920

2021
let filesToBuild = new Map();
2122

22-
const exists = filename => {
23-
try {
24-
return fs.statSync(filename).isFile();
25-
} catch (e) {
26-
// omit
27-
}
28-
return false;
29-
};
3023
const rebuild = filename => filesToBuild.set(filename, true);
3124

25+
const onChange = srcDir => {
26+
return filePath => {
27+
const filename = path.basename(filePath);
28+
29+
console.log(chalk.green('->'), `change: ${filename}`);
30+
rebuild(filePath);
31+
};
32+
};
33+
34+
const onUnlink = srcDir => {
35+
return filePath => {
36+
const buildFile = filePath
37+
.replace(`${path.sep}src${path.sep}`, `${path.sep}build${path.sep}`)
38+
.replace('.ts', '.js');
39+
40+
try {
41+
fs.unlinkSync(buildFile);
42+
process.stdout.write(
43+
`${chalk.red(' \u2022 ') +
44+
path.relative(
45+
path.resolve(srcDir, '..', '..'),
46+
buildFile,
47+
)} (deleted)\n`,
48+
);
49+
} catch (e) {
50+
// omit
51+
}
52+
};
53+
};
54+
3255
getPackages().forEach(p => {
3356
const srcDir = path.resolve(p, 'src');
57+
3458
try {
3559
fs.accessSync(srcDir, fs.F_OK);
36-
fs.watch(path.resolve(p, 'src'), {recursive: true}, (event, filename) => {
37-
const filePath = path.resolve(srcDir, filename);
60+
const watcher = chokidar.watch(srcDir);
3861

39-
if ((event === 'change' || event === 'rename') && exists(filePath)) {
40-
console.log(chalk.green('->'), `${event}: ${filename}`);
41-
rebuild(filePath);
42-
} else {
43-
const buildFile = path.resolve(srcDir, '..', 'build', filename);
44-
try {
45-
fs.unlinkSync(buildFile);
46-
process.stdout.write(
47-
`${chalk.red(' \u2022 ') +
48-
path.relative(
49-
path.resolve(srcDir, '..', '..'),
50-
buildFile,
51-
)} (deleted)\n`,
52-
);
53-
} catch (e) {
54-
// omit
55-
}
56-
}
62+
watcher.on('ready', () => {
63+
watcher.on('change', onChange(srcDir));
64+
watcher.on('add', onChange(srcDir));
65+
watcher.on('unlink', onUnlink(srcDir));
5766
});
5867
} catch (e) {
5968
// doesn't exist

yarn.lock

+81-3
Original file line numberDiff line numberDiff line change
@@ -3222,6 +3222,14 @@ anymatch@^2.0.0:
32223222
micromatch "^3.1.4"
32233223
normalize-path "^2.1.1"
32243224

3225+
anymatch@~3.1.1:
3226+
version "3.1.1"
3227+
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
3228+
integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
3229+
dependencies:
3230+
normalize-path "^3.0.0"
3231+
picomatch "^2.0.4"
3232+
32253233
append-transform@^1.0.0:
32263234
version "1.0.0"
32273235
resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab"
@@ -3605,6 +3613,11 @@ binary-extensions@^1.0.0:
36053613
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
36063614
integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
36073615

3616+
binary-extensions@^2.0.0:
3617+
version "2.0.0"
3618+
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
3619+
integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
3620+
36083621
bindings@~1.2.1:
36093622
version "1.2.1"
36103623
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
@@ -3666,6 +3679,13 @@ braces@^2.3.1, braces@^2.3.2:
36663679
split-string "^3.0.2"
36673680
to-regex "^3.0.1"
36683681

3682+
braces@~3.0.2:
3683+
version "3.0.2"
3684+
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
3685+
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
3686+
dependencies:
3687+
fill-range "^7.0.1"
3688+
36693689
brfs@^1.2.0:
36703690
version "1.6.1"
36713691
resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3"
@@ -4038,6 +4058,21 @@ chokidar@^2.1.5:
40384058
optionalDependencies:
40394059
fsevents "^1.2.7"
40404060

4061+
chokidar@^3.3.1:
4062+
version "3.3.1"
4063+
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
4064+
integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==
4065+
dependencies:
4066+
anymatch "~3.1.1"
4067+
braces "~3.0.2"
4068+
glob-parent "~5.1.0"
4069+
is-binary-path "~2.1.0"
4070+
is-glob "~4.0.1"
4071+
normalize-path "~3.0.0"
4072+
readdirp "~3.3.0"
4073+
optionalDependencies:
4074+
fsevents "~2.1.2"
4075+
40414076
chownr@^1.1.1:
40424077
version "1.1.1"
40434078
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
@@ -5816,6 +5851,13 @@ fill-range@^4.0.0:
58165851
repeat-string "^1.6.1"
58175852
to-regex-range "^2.1.0"
58185853

5854+
fill-range@^7.0.1:
5855+
version "7.0.1"
5856+
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
5857+
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
5858+
dependencies:
5859+
to-regex-range "^5.0.1"
5860+
58195861
58205862
version "1.1.0"
58215863
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
@@ -5988,6 +6030,11 @@ fsevents@^1.2.7:
59886030
nan "^2.9.2"
59896031
node-pre-gyp "^0.10.0"
59906032

6033+
fsevents@~2.1.2:
6034+
version "2.1.2"
6035+
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
6036+
integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
6037+
59916038
function-bind@^1.1.1:
59926039
version "1.1.1"
59936040
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
@@ -6139,7 +6186,7 @@ glob-parent@^3.1.0:
61396186
is-glob "^3.1.0"
61406187
path-dirname "^1.0.0"
61416188

6142-
glob-parent@^5.0.0:
6189+
glob-parent@^5.0.0, glob-parent@~5.1.0:
61436190
version "5.1.0"
61446191
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2"
61456192
integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==
@@ -6728,6 +6775,13 @@ is-binary-path@^1.0.0:
67286775
dependencies:
67296776
binary-extensions "^1.0.0"
67306777

6778+
is-binary-path@~2.1.0:
6779+
version "2.1.0"
6780+
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
6781+
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
6782+
dependencies:
6783+
binary-extensions "^2.0.0"
6784+
67316785
is-buffer@^1.1.5:
67326786
version "1.1.6"
67336787
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@@ -6859,7 +6913,7 @@ is-glob@^4.0.0:
68596913
dependencies:
68606914
is-extglob "^2.1.1"
68616915

6862-
is-glob@^4.0.1:
6916+
is-glob@^4.0.1, is-glob@~4.0.1:
68636917
version "4.0.1"
68646918
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
68656919
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
@@ -6880,6 +6934,11 @@ is-number@^3.0.0:
68806934
dependencies:
68816935
kind-of "^3.0.2"
68826936

6937+
is-number@^7.0.0:
6938+
version "7.0.0"
6939+
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
6940+
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
6941+
68836942
is-obj@^1.0.0:
68846943
version "1.0.1"
68856944
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
@@ -8771,7 +8830,7 @@ normalize-path@^2.1.1:
87718830
dependencies:
87728831
remove-trailing-separator "^1.0.1"
87738832

8774-
normalize-path@^3.0.0:
8833+
normalize-path@^3.0.0, normalize-path@~3.0.0:
87758834
version "3.0.0"
87768835
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
87778836
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
@@ -9442,6 +9501,11 @@ physical-cpu-count@^2.0.0:
94429501
resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660"
94439502
integrity sha1-GN4vl+S/epVRrXURlCtUlverpmA=
94449503

9504+
picomatch@^2.0.4, picomatch@^2.0.7:
9505+
version "2.2.1"
9506+
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a"
9507+
integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==
9508+
94459509
pify@^2.0.0, pify@^2.3.0:
94469510
version "2.3.0"
94479511
resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -10281,6 +10345,13 @@ readdirp@^2.2.1:
1028110345
micromatch "^3.1.10"
1028210346
readable-stream "^2.0.2"
1028310347

10348+
readdirp@~3.3.0:
10349+
version "3.3.0"
10350+
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17"
10351+
integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==
10352+
dependencies:
10353+
picomatch "^2.0.7"
10354+
1028410355
realpath-native@^1.1.0:
1028510356
version "1.1.0"
1028610357
resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
@@ -11642,6 +11713,13 @@ to-regex-range@^2.1.0:
1164211713
is-number "^3.0.0"
1164311714
repeat-string "^1.6.1"
1164411715

11716+
to-regex-range@^5.0.1:
11717+
version "5.0.1"
11718+
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
11719+
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
11720+
dependencies:
11721+
is-number "^7.0.0"
11722+
1164511723
to-regex@^3.0.1, to-regex@^3.0.2:
1164611724
version "3.0.2"
1164711725
resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"

0 commit comments

Comments
 (0)