lukeed/clsxPublic

A tiny (239B) utility for constructing `className` strings conditionally.

Can't bundle clsx with rollup: clsx_1.default is not a function

SN

I think it might be similar to this issue I found: https://github.com/jedmao/tsx-react-postcss-webpack/issues/1

rollup 2.26.11 @rollup/plugin-node-resolve@9.0.0 @rollup/plugin-commonjs 15.0.0

Right before posting this I found a workaround, adding `requireReturnsDefault` to commonjs plugin ``` // in rollup.config.js import { commonjs } from '@rollup/plugin-commonjs';

plugins: [ commonjs({ requireReturnsDefault: 'auto' }) ] ```

  1. TR

    clsx provides es modules which should just work for rollup without commonjs plugin. Could you provide full config? https://github.com/lukeed/clsx/blob/master/package.json#L6

  2. SN
    Author

    I think it's because I have a dependency that is commonjs and it's using clsx. It may be that rollup is just not smart enough to handle this situation without that setting. I thought it may be useful to someone else since clsx is a very commonly used library. Here is where they talk about that setting, which is actually fairly new in rollup: https://www.npmjs.com/package/@rollup/plugin-commonjs#requirereturnsdefault

    If you remove that setting it will fail at runtime because it can't find the default export from clsx.

    Here is my rollup config: ``` import path from 'path'; import ttypescript from 'ttypescript'; // 1.5.8 import babel from '@rollup/plugin-babel'; // 5.0.4 import commonjs from '@rollup/plugin-commonjs'; // 15.0.0 import nodeGlobals from 'rollup-plugin-node-globals'; // 1.4.0 import resolve from '@rollup/plugin-node-resolve'; // 9.0.0 import replace from 'rollup-plugin-replace'; // 2.2.0 import internal from 'rollup-plugin-internal'; // 1.0.4 import { terser } from 'rollup-plugin-terser'; // 5.1.1 import typescript from '@rollup/plugin-typescript'; // 2.0.1 import pkg from './package.json';

    const isProduction = process.env.NODE_ENV === 'production' ? true : false;

    const tsConfigPath = isProduction ? './tsconfig.prod.json' : './tsconfig.json';

    const outputPath = './public';

    const plugins = [ babel({ exclude: ['node_modules/**', 'src/**/*.ts', 'src/**/*.tsx'], babelHelpers: 'bundled' }), resolve({ mainFields: ['module', 'main', 'browser'], preferBuiltins: false, jail: __dirname + '/node_modules', dedupe: ['react', 'react-dom'] }), replace({ PRODUCTION: JSON.stringify(isProduction) }), commonjs({ sourceMap: isProduction ? false : 'inline', requireReturnsDefault: 'auto', include: [ 'node_modules/**', ], }), nodeGlobals({ global: false, buffer: false, dirname: false, filename: false, baseDir: false }), (isProduction ? terser() : null), internal(['styled-components']), typescript({ typescript: ttypescript, tsconfig: tsConfigPath, exclude: ['*.js', 'node_modules/**'] }) ];

    const productionPath = process.env.BUILD === 'production' ? true : false;

    export default [{ input: 'src/index.tsx', output: [ { dir: outputPath, entryFileNames: `${pkg.name}-[hash].es.js`, format: 'es', sourcemap: isProduction ? false : 'inline' }, ], treeshake: true, watch: { exclude: ['node_modules/**'], chokidar: true, clearScreen: false }, plugins: plugins }]; ```

  3. TR

    Try `requireReturnsDefault: 'preferred'`

  4. LU

    Yeah, this looks new from `@rollup/plugin-commonjs@15.0` and is unintentionally a breaking change.

    For clsx, and presumably any package that uses `module.exports = ...`, you have to use a non-default value for that new `requireReturnsDefault` option.

    clsx can't migrate away from default exports because it's meant to be a drop-in replacement for classnames. Modifying exports would lose the ability for aliasing at the build _and_ install levels.

    Closing this as there's unfortunately nothing we can do on our end. It'd be a README call-out, at best.

    Thank you @TrySound for helping out!

  5. lukeedclosed6 years ago on GitHub

  6. TrySoundmentioned6 years ago on GitHub

  7. TrySoundsubscribed6 years ago on GitHub

  8. remcohaszingreferenced this in fix: fix esm support and types #574 years ago on GitHub