Skip to content

Typescript watcher cannot recover #255

@karolis-sh

Description

@karolis-sh
  • Rollup Plugin Name: @rollup/plugin-typescript
  • Rollup Plugin Version: 4.0.0
  • Rollup Version: 2.0.3
  • Operating System (or Browser): mac
  • Node Version: 10.15.0

How Do We Reproduce?

Running rollup in watch mode with typescript plugin if the typescript code is invalid the watcher breaks and exits with exit code 1. This make it impossible to re-build the code on code changes - you need to re-start the command every time.

  1. Start with a simple ts file:
export default (a: number, b: number): number => {
  return a + b;
};
  1. Start the watcher rollup -c --watch
  2. Comment out out some code (making it invalid syntax) and save the file:
export default (a: number, b: number): number => {
  return a + b;
// };
  1. The watcher breaks completely:
{ Error: @rollup/plugin-typescript TS1005: '}' expected.
    at error (/THE_REPRO/node_modules/rollup/dist/shared/rollup.js:10120:30)
    at throwPluginError (/THE_REPRO/node_modules/rollup/dist/shared/rollup.js:16242:12)
    at Object.error (/THE_REPRO/node_modules/rollup/dist/shared/rollup.js:17226:24)
    at emitDiagnostic (/THE_REPRO/node_modules/@rollup/plugin-typescript/dist/index.js:412:17)
    at reportDiagnostics (/THE_REPRO/node_modules/@rollup/plugin-typescript/dist/index.js:420:9)
    at Array.forEach (<anonymous>)
    at emitFilesAndReportErrors (/THE_REPRO/node_modules/typescript/lib/typescript.js:102879:21)
    at Object.result.afterProgramCreate (/THE_REPRO/node_modules/typescript/lib/typescript.js:103054:13)
    at Object.afterProgramCreate (/THE_REPRO/node_modules/@rollup/plugin-typescript/dist/index.js:441:29)
    at synchronizeProgram (/THE_REPRO/node_modules/typescript/lib/typescript.js:103300:22)
  pluginCode: 'TS1005',
  loc:
   { column: 1,
     line: 4,
     file:
      '/THE_REPRO/packages/app/src/test.ts' },
  frame:
   '\n\u001b[7m4\u001b[0m \n\u001b[7m \u001b[0m \u001b[91m\u001b[0m\n\n  \u001b[96msrc/test.ts\u001b[0m:\u001b[93m1\u001b[0m:\u001b[93m50\u001b[0m\n    \u001b[7m1\u001b[0m export default (a: number, b: number): number => {\n    \u001b[7m \u001b[0m \u001b[96m                                                 ~\u001b[0m\n    The parser expected to find a \'}\' to match the \'{\' token here.\n',
  code: 'PLUGIN_ERROR',
  plugin: 'typescript' }
error Command failed with exit code 1.

rollup.config.js:

import typescript from '@rollup/plugin-typescript';
import babel from 'rollup-plugin-babel';
import peerDepsExternal from 'rollup-plugin-peer-deps-external';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import postcss from 'rollup-plugin-postcss';
import { terser } from 'rollup-plugin-terser';
import autoprefixer from 'autoprefixer';
import cssnano from 'cssnano';
import reactSvg from 'rollup-plugin-react-svg';

import pkg from './package.json';

const isProd = process.env.NODE_ENV === 'production';

export default {
  input: 'src/index.js',
  output: { format: 'cjs', file: pkg.main, sourcemap: true },
  plugins: [
    typescript(),
    babel({ exclude: 'node_modules/**' }),
    resolve(),
    commonjs(),
    peerDepsExternal({ includeDependencies: true }),
    postcss({ plugins: isProd ? [autoprefixer, cssnano] : [] }),
    reactSvg({ svgo: { plugins: [{ removeViewBox: false }] } }),
    isProd && terser({ compress: true, mangle: true }),
  ].filter(Boolean),
};

Expected Behavior

The watcher shouldn't exit with exit code 1, it should wait for further code changes and try to recompile modified source.

Actual Behavior

Watcher breaks and exits with exit code 1.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions