plugins icon indicating copy to clipboard operation
plugins copied to clipboard

(upstream TypeScript bug) Builds hang with typescript 4.4.2

Open RebeccaStevens opened this issue 2 years ago • 16 comments

  • Rollup Plugin Name: @rollup/plugin-typescript
  • Rollup Plugin Version: 8.2.5
  • Rollup Version: 2.56.3
  • Operating System (or Browser): Ubuntu 20.04.2 LTS (via WSL on Windows 10)
  • Node Version: 16.4.0
  • Link to reproduction:

Expected Behavior

The build should complete.

Actual Behavior

The build hangs. (The cli command never completes.)

RebeccaStevens avatar Aug 25 '21 00:08 RebeccaStevens

I'd recommend using a stable version of TS. We won't test the plugin against it until they release a stable. You might also want to try that locally to see if it's reproducible.

shellscape avatar Aug 25 '21 00:08 shellscape

Yes, it reproducible locally.

RebeccaStevens avatar Aug 25 '21 00:08 RebeccaStevens

I am also able to reproduce this issue. 4.4-beta works but 4.4-rc (and the nightly 4.5.0-dev.20210824) hangs indefinitely.

johndiiorio avatar Aug 25 '21 00:08 johndiiorio

Good info. We'll welcome triage on this, but until a stable release is cut from the TypeScript folks, the core team here likely won't troubleshoot this. We'll have to wait for a stable release to merge any fixes as well.

shellscape avatar Aug 25 '21 00:08 shellscape

Thanks, I understand. Just wanted to give a heads up that this issue is reproducible on the stable TypeScript 4.4.2 that was just released.

johndiiorio avatar Aug 27 '21 00:08 johndiiorio

Can confirm this is an issue with stable TypeScript 4.4.2. If a developer was to create a new rollup + typescript project today it would hang on compilation.

alshdavid avatar Aug 27 '21 01:08 alshdavid

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',
}

Does this look like a @rollup/plugin-typescript or a TypeScript bug?

michael42 avatar Aug 27 '21 17:08 michael42

@michael42 It might be worth opening an issue on typescript's repo with your findings.

RebeccaStevens avatar Aug 28 '21 01:08 RebeccaStevens

Same issue for me on 4.4.2

test.ts: export const name = "test"

rollup.config.js:

export default {
  input: 'src/test.ts',
  output: {
    sourcemap: true,
    format: 'iife',
    name: 'test',
    file: 'public/dist/test.js'
  },
  plugins: [
    typescript()
  ]
}

Note: tsc src/test.ts works fine

Update: Downgrading typescript to 4.1.6 fixes the issue. Will wait for 4.4.3

thobson avatar Sep 01 '21 16:09 thobson

It'll be fixed with TypeScript 4.4.3. See microsoft/TypeScript#45633.

MartinJohns avatar Sep 01 '21 17:09 MartinJohns

@RebeccaStevens since this is a confirmed issue with TypeScript itself I believe this issue can be closed.

jonkoops avatar Sep 01 '21 17:09 jonkoops

Closing due to this being an upstream bug.

RebeccaStevens avatar Sep 02 '21 04:09 RebeccaStevens

Same error, downgrade to [email protected] also work.

loynoir avatar Sep 04 '21 21:09 loynoir

Reopening this since we've got a number of people struggling to search issues and we're seeing an increase in duplicates on this one.

Note: To anyone viewing this issue, this is an upstream issue with TypeScript and not something we can control as noted in this comment https://github.com/rollup/plugins/issues/983#issuecomment-910474824

Please do not add "same here," "me too", "+1" replies to this issue.

shellscape avatar Sep 10 '21 14:09 shellscape

@andrewbranch Any chance that path version is going to be released soon? It seems this issue is gathering some massive attention.

jonkoops avatar Sep 10 '21 16:09 jonkoops

Please do your homework before pinging maintainers (those folks are stupid busy). He already addressed that here: https://github.com/microsoft/TypeScript/pull/45642#issuecomment-912694339

Please ask TypeScript maintainers questions in associated TypeScript project PRs or Issues.

shellscape avatar Sep 10 '21 16:09 shellscape