rollup / plugins

🍣 The one-stop shop for official Rollup plugins
MIT License
3.63k stars 585 forks source link

(upstream TypeScript bug) Builds hang with typescript 4.4.2 #983

Open RebeccaStevens opened 3 years ago

RebeccaStevens commented 3 years ago

Expected Behavior

The build should complete.

Actual Behavior

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

shellscape commented 3 years ago

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.

RebeccaStevens commented 3 years ago

Yes, it reproducible locally.

johndiiorio commented 3 years ago

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.

shellscape commented 3 years ago

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.

johndiiorio commented 3 years ago

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.

alshdavid commented 3 years ago

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.

michael42 commented 3 years ago

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?

RebeccaStevens commented 3 years ago

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

thobson commented 3 years ago

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

MartinJohns commented 3 years ago

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

jonkoops commented 3 years ago

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

RebeccaStevens commented 3 years ago

Closing due to this being an upstream bug.

loynoir commented 3 years ago

Same error, downgrade to typescript@4.3.5 also work.

shellscape commented 3 years ago

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.

jonkoops commented 3 years ago

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

shellscape commented 3 years ago

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.