goto-bus-stop/rollup-plugin-es-module-interop(opens in a new tab)
Language: JavaScript
change the rollup commonjs output for external imports to check `module.__esModule`
- stars
- 4
- watchers
- 1
- forks
- 0
- open issues
- 0
- Last updated
- 05/15/2020
Language: JavaScript
change the rollup commonjs output for external imports to check `module.__esModule`
change the rollup commonjs output for external imports to check module.__esModule
By default, when rollup is configured to output format: 'cjs' code, its require calls look like this:
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var external = _interopDefault(require('external'));
That is, if the imported CommonJS module has a .default property, external will be equal to require('external').default. Else, it will be equal to require('external').
This makes ES modules that were compiled to CommonJS and then published to npm work transparently, because they put their default exports on a .default property.
But some CommonJS modules also use the .default property as an actual exported value, and not as a "default export". joi is one example.
Babel uses a different check than Rollup does; it checks for the __esModule property, and if it exists, uses require('external').default. Else, it will use require('external'). The __esModule property is added by every compiler that I know of, and CommonJS modules that have a .default property will not be falsely detected as compiled ES modules.
This plugin swaps the Rollup version of _interopDefault for Babel's version.
So, with this plugin you can import joi from 'joi' and it'll work!
npm install rollup-plugin-es-module-interop
// rollup.config.js import esModuleInterop from 'rollup-plugin-es-module-interop' export default { plugins: [ esModuleInterop() ] }
There are no options. rollup-plugin-es-module-interop will replace the _interopDefault implementation in all format: 'cjs' outputs.