62

I try to use typescript 3.7 features like Optional Chaining, Nullish Coalescing. But webpack gives me an error while transpaling.

app: Module parse failed: Unexpected token (50:40)
app: File was processed with these loaders:
app:  * ../../../node_modules/ts-loader/index.js
app: You may need an additional loader to handle the result of these loaders.
app: | export const Layout = (props) => {
app: |     const regionsResults = useQuery(regionsQuery, { fetchPolicy: 'cache-first' });
app: >     const regions = regionsResults.data?.regions ?? [];
app: |     const userItem = useQuery(usersProfileQuery, { fetchPolicy: 'cache-first' });
app: |     const handleOnClick = (selected) => props.history.push(selected.key);
``

Edgaras Karka
  • 7,400
  • 15
  • 61
  • 115

4 Answers4

73

I changed target: esnext to es2018 in tsconfig.json file. Now it works.

Webpack issue for reference : https://github.com/webpack/webpack/issues/10227

bmtheo
  • 974
  • 1
  • 7
  • 16
Edgaras Karka
  • 7,400
  • 15
  • 61
  • 115
34

Depending on which loader you're using to transiple the code, there are several options available

For ts-loader, you need to make sure the output from typescript is understandable by Webpack. This can be achieved by setting target to ES2018 in tsconfig.json.

For babel-loader, you'll need to make sure babel loads the

  • @babel/plugin-proposal-nullish-coalescing-operator
  • @babel/plugin-proposal-optional-chaining

plugins. Note that if you're using preset-env, it may or may not load these plugins depending on your targets or browserlist (ie, won't be loaded if the target env has support for these language features), in which case the only way to guarantee their inclusion is by manually specifying them in the plugins array in babel.config.js,

  plugins: [
    '@babel/plugin-proposal-nullish-coalescing-operator',
    '@babel/plugin-proposal-optional-chaining',
  ],
aryzing
  • 4,982
  • 7
  • 39
  • 42
  • Is there a reference that says which versions of ECMAScript Webpack can parse? I.e. where does it say Webpack can parse ES2018 but not ES2020? – Timmmm Jan 11 '21 at 13:34
  • 3
    Webpack uses [acorn](https://github.com/acornjs/acorn) as its parser ([package.json](https://github.com/webpack/webpack/blob/a694cdfb82b5fd0a5c52102083a267a36446e03e/package.json#L13)), which determines the language features that are understood – aryzing Jan 12 '21 at 07:55
  • I'm using babel-loader. And I correctly put the 2 plugins in the file because these syntax are working for my own files. But for node_modules files it's failing. – addlistener Sep 05 '22 at 15:31
0

I had the same issue in an old Vue.js 2 web app.

I had to do the following:

npm install --save-dev @babel/plugin-transform-nullish-coalescing-operator
npm install --save-dev @babel/plugin-transform-optional-chaining

And modify my babel.config.js:

module.exports = {
    presets: ["@vue/app"],
    plugins: ["@babel/plugin-transform-nullish-coalescing-operator", "@babel/plugin-transform-optional-chaining"],
};

See:

matteogll
  • 803
  • 8
  • 16
-5

If you're using vs code, probably you should change the local typescript version vs code use.

What TypeScript version is Visual Studio Code using? How to update it?