TypeError: multi is not a function / default import from rollup-plugin-multi-input does not work from ESM package

Viewed 192

I found a plugin rollup-plugin-multi-input which fixes the problem of not being able to specifiy a glob to the test rollup config. For the unt tests, the entry point is not a single entity from which an import graph can be derived. It is just a collection of source files containing tests, which doesnt fit input requirement of rollup.

However, my attempt at trying to use it was fruitless:

  • rollup-config.tests.mjs:
import multi from 'rollup-plugin-multi-input';

const testConfig = {
  input: ['test/**/*.spec.ts'],
  external: ["chai", "mocha", "dirty-chai"],
  output: {
    format: "es",
    file: `dist/${name}-bundle.test.js`,
    plugins: [],
    sourcemap: true
  },
  plugins: [
    multi(),
    resolve(),
    commonjs(),
    typescript({
      tsconfig: "./tsconfig.test.json"
    })
  ],
}

just resulted in this error:

[!] TypeError: multi is not a function
TypeError: multi is not a function

Looking at the exported code from the plugin, I can see that the default export is a function:

var _default = function(param) {
}
exports.default = _default;

So I don't know why this doesnt work.

I since discovered that there is another plugin that does a similar thing: @rollup/plugin-multi-entry:

import entry from "rollup-plugin-multi-entry";

  plugins: [
    entry(),
    resolve(),
    commonjs(),
    typescript({
      tsconfig: "./tsconfig.test.json"
    })
  ],

so configured and invoked in exactly the same way, but now it works in the way that I wanted it to; the test bundle is created and mocha indeed sees all the tests and executes them successfully.

So let's take a look at that export and see if there is a difference in what is exported:

Well the first thing to notice is that its dist folder contains a .mjs file and a .js file. Since we're importing from an ESM package ("type": "module" in package.json), I guess we're using the default export from the .mjs file:

function multiEntry() {
...
}
export default multiEntry;

With rollup-plugin-multi-input, I even tried using the createRequire from "module":

import { createRequire } from "module";
const require = createRequire(import.meta.url);

const multi = require('rollup-plugin-multi-input');

but that failed for the same reason.

So whats the problem here? Why does default import from rollup-plugin-multi-input not work?

0 Answers
Related