webpack-node-externals icon indicating copy to clipboard operation
webpack-node-externals copied to clipboard

Unsupported type in webpack 5

Open RomainGaillardLesEchos opened this issue 4 years ago • 1 comments

We are facing this issue (webpack 5):

export default function config(): Configuration {
  return {
    ...,
    externals: [
      nodeExternals({
        modulesDir: path.resolve(__dirname, 'node_modules'),
        allowlist: ['@services/shared'],
      }),
    ],
  };
}
Type 'ExternalsFunctionElement[]' is not assignable to type 'string | RegExp | (ExternalItemObjectKnown & ExternalItemObjectUnknown) | ExternalItem[] | ((data: ExternalItemFunctionData, callback: (err?: Error | undefined, result?: string | ... 3 more ... | undefined) => void) => void) | ((data: ExternalItemFunctionData) => Promise<...>) | undefined'.
  Type 'ExternalsFunctionElement[]' is not assignable to type 'ExternalItem[]'.
    Type 'ExternalsFunctionElement' is not assignable to type 'ExternalItem'.
      Type 'ExternalsFunctionElement' is not assignable to type '(data: ExternalItemFunctionData, callback: (err?: Error | undefined, result?: string | boolean | string[] | { [index: string]: any; } | undefined) => void) => void'.ts(2322)

types.d.ts(1977, 2): The expected type comes from property 'externals' which is declared here on type 'Configuration'

Type Configuration is provided by webpack version ^5.36.2 and webpack-node-externals version ^3.0.0

Any idea ?

RomainGaillardLesEchos avatar May 03 '21 15:05 RomainGaillardLesEchos

This is because @types/webpack-node-externals is targeting webpack@4 typings provided by DT, conflicting with webpack@5 which comes shipped with its own typings (see related issues #51712 and #49755).

There doesn't seem to be a easy solution within the context of DT since any solution would come with unwanted side-effects.

Easiest solution would be for webpack-node-externals to include typings itself so that it no longer depended on DT.

Workaround for now:

import type { Configuration } from 'webpack';

export default function config(): Configuration ({
  externals: [
    nodeExternals(),
  ] as Configuration['externals'],
});

apancutt avatar May 06 '21 06:05 apancutt