Description
Bug Report
π Search Terms
- leak
- watcher
π Version & Regression Information
4.4
- This changed between versions 4.3.5 and 4.4.2
- This is still the behavior in next version 4.5.0-dev.20210830
β― Playground Link
https://github.com/sveltejs/template
π Actual behavior
Builds hang indefinitely
π Expected behavior
Build should complete within a timely manner.
This is a bug to relay the information @michael42 found in the rollup bug rollup/plugins#983
Running my (hanging) build (with an empty file to bundle) using why-is-node-running produces this output:
There are 13 handle(s) keeping the process running
# Timeout
node:internal/async_hooks:205
node:internal/async_hooks:495
node:internal/timers:162
node:internal/timers:196
/project/rollup.config.js:16 - dir: "build",
node:internal/modules/cjs/loader:1101
/project/node_modules/rollup/dist/shared/loadConfigFile.js:540 - module._compile(bundledCode, requiredFileName);
node:internal/modules/cjs/loader:981
# TTYWRAP
node:internal/async_hooks:205
node:internal/bootstrap/switches/is_main_thread:47
node:internal/bootstrap/switches/is_main_thread:135
node:internal/console/constructor:216
node:internal/console/constructor:333
node:internal/console/constructor:368
/project/node_modules/rollup/dist/bin/rollup:1506 - loadConfigFile_js.stderr(loadConfigFile_js.cyan(`\n${loadConfigFile_js.bold(inputFiles)} β ${loadConfigFile_js.bold(files.join(', '))}...`));
/project/node_modules/rollup/dist/bin/rollup:1692 - await build(inputOptions, warnings, command.silent);
# STATWATCHER
node:internal/async_hooks:205
node:internal/fs/watchers:105
/project/node_modules/typescript/lib/typescript.js:7670 - _fs.watchFile(fileName, { persistent: true, interval: pollingInterval }, fileChanged);
/project/node_modules/typescript/lib/typescript.js:6924 - watcher: watchFile(fileName, function (fileName, eventKind) { return ts.forEach(callbacksCache.get(path), function (cb) { return cb(fileName, eventKind); }); }, pollingInterval, options),
/project/node_modules/typescript/lib/typescript.js:7247 - return pollingWatchFile(fileName, callback, PollingInterval.Low, /*options*/ undefined);
/project/node_modules/typescript/lib/typescript.js:110912 - watchFile: function (file, callback, pollingInterval, options) { return host.watchFile(file, callback, pollingInterval, options); },
/project/node_modules/typescript/lib/typescript.js:110938 - factory[key].call(/*thisArgs*/ undefined, file, cb, flags, options, detailInfo1, detailInfo2) :
/project/node_modules/typescript/lib/typescript.js:118559 - return watchFile(file, function (fileName, eventKind) { return callback(fileName, eventKind, path); }, pollingInterval, options, watchType);
# STATWATCHER
node:internal/async_hooks:205
node:internal/fs/watchers:105
/project/node_modules/typescript/lib/typescript.js:7670 - _fs.watchFile(fileName, { persistent: true, interval: pollingInterval }, fileChanged);
/project/node_modules/typescript/lib/typescript.js:6924 - watcher: watchFile(fileName, function (fileName, eventKind) { return ts.forEach(callbacksCache.get(path), function (cb) { return cb(fileName, eventKind); }); }, pollingInterval, options),
/project/node_modules/typescript/lib/typescript.js:7247 - return pollingWatchFile(fileName, callback, PollingInterval.Low, /*options*/ undefined);
/project/node_modules/typescript/lib/typescript.js:110912 - watchFile: function (file, callback, pollingInterval, options) { return host.watchFile(file, callback, pollingInterval, options); },
/project/node_modules/typescript/lib/typescript.js:110938 - factory[key].call(/*thisArgs*/ undefined, file, cb, flags, options, detailInfo1, detailInfo2) :
/project/node_modules/typescript/lib/typescript.js:118559 - return watchFile(file, function (fileName, eventKind) { return callback(fileName, eventKind, path); }, pollingInterval, options, watchType);
[... 9 more # STATWATCHER]
It seems to me that TypeScript is keeping open a few watchers... I added a few console.log at typescript.js:7670 and it seems that Typescript creates a lot of watchers and does not unregister all of them (383/394 in my case, which is consistent with the 11 STATWATCHER in the output). Analyzing the output, it seems that the watchers for the package.jsons of the @types packages are not properly closed (package.jsons are only loaded from @types packages in my output and all 11 of them are not closed):
Set(11) {
'/project/common/node_modules/@types/pouchdb-core/package.json',
'/project/common/node_modules/@types/pouchdb-find/package.json',
'/project/node_modules/@types/pouchdb-core/package.json',
'/project/node_modules/@types/pouchdb-find/package.json',
'/project/server/node_modules/@types/benchmark/package.json',
'/project/server/node_modules/@types/debug/package.json',
'/project/server/node_modules/@types/express-serve-static-core/package.json',
'/project/server/node_modules/@types/node/package.json',
'/project/server/node_modules/@types/pouchdb-core/package.json',
'/project/server/node_modules/@types/pouchdb-find/package.json',
'/project/server/node_modules/@types/serve-static/package.json',
}