Search code examples
typescriptwebpackelectron

Webpack not compiling package in Electron


I'm trying to import and use a package:

import { Shortcuts } from 'shortcuts';

export function bindKeys(): void {
  try {
    Shortcuts.record((sequence: string[]) => console.log('pressed:', sequence));
  } catch (err) {
    console.error(err);
  }
}

and webpack is complaining:

TypeError: shortcuts__WEBPACK_IMPORTED_MODULE_0__.Shortcuts.record is not a function

I'm sure the package is fine, I'm installing and using the package as documented: see here -- if I check the class in the package the record() function is declared:

declare class Shortcuts {
    /**/
    record: (handler: RecordHandler) => Disposer;
    /**/
}

I'm using ts-loader to compile my TS. Here's my webpack config:

const common: Configuration = {
  mode: isDev ? 'development' : 'production',
  resolve: {
    extensions: ['.js', '.ts', '.jsx', '.tsx', '.json'],
  },
  externals: ['fsevents'],
  output: {
    publicPath: './',
    filename: '[name].js',
    assetModuleFilename: 'images/[name][ext]',
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        loader: 'ts-loader',
      },
      {
        test: /\.s?css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
      },
      {
        test: /\.png$/,
        type: 'asset/resource',
      },
    ],
  },
  stats: 'errors-only',
  watch: isDev,
  devtool: isDev ? 'source-map' : undefined,
};

And here's my tsconfig:

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "esModuleInterop": true,
    "moduleResolution": "Node",
    "lib": ["DOM", "ESNext"],
    "resolveJsonModule": true,
    "jsx": "react-jsx",
    "strict": true,
    "allowSyntheticDefaultImports": true,
    "isolatedModules": true,
    "typeRoots": [
      "./node_modules/@types",
      "./src/types"
    ],
  },
  "include": ["src/**/*"],
  "ts-node": {
    "compilerOptions": {
      "module": "CommonJS"
    }
  }
}

Solution

  • { Shortcuts } is a class and needed to be instantiated. Somehow I missed that in the docs.

    import { Shortcuts } from 'shortcuts';
    const shortcuts = new Shortcuts();
    
    shortcuts.add([
      {
        shortcut: '4',
        handler: (event) => {
          console.log(event);
        },
      },
    ]);