cjs-module-lexer icon indicating copy to clipboard operation
cjs-module-lexer copied to clipboard

Unable to detect exports from bundled webpack output

Open SimenB opened this issue 2 years ago • 6 comments

Title is probably inaccurate 😅

I recently added bundling to Jest, and it seems the output makes the lexer not detect exports correctly.

Specifically, it picks up the exports. stuff that is not exported, but not the exports within Object.definedProperty which actually are.

Quickest reproduction I have is to clone Jest, run yarn && yarn build:js then this:

const fs = require('fs');
const {parse} = require('cjs-module-lexer');

const source = fs.readFileSync(require.resolve('jest-watcher'), 'utf8');

console.log(parse(source));

This prints

{
  exports: [
    'default',
    'KEYS',
    'printPatternCaret',
    'printRestoredPatternCaret'
  ],
  reexports: []
}

Running the parser on the published version (29.7.0) gives this:

{
  exports: [
    '__esModule',
    'BaseWatchPlugin',
    'JestHook',
    'PatternPrompt',
    'Prompt',
    'TestWatcher'
  ],
  reexports: [ './constants', './lib/patternModeHelpers' ]
}

The reexports are of course gone as it's bundled, but we're also seeing that the lexer has detected only the resolved re-exports?

SimenB avatar Oct 09 '23 08:10 SimenB

https://github.com/nodejs/cjs-module-lexer#project-status This project has been frozen, I suspect webpack may have relevant options that will follow this.

liuxingbaoyu avatar Oct 09 '23 08:10 liuxingbaoyu

Yeah, I noticed that.

Would be cool if we can configure webpack to output compatible code, yeah. Might have to create a manual re-export facade thing if not.

Or just accept interop is not the best and have people use default export.

SimenB avatar Oct 09 '23 09:10 SimenB

https://github.com/webpack/webpack/issues/13098 https://github.com/rollup/rollup/pull/4826

Unfortunately webpack doesn't support this, although rollup does.

liuxingbaoyu avatar Oct 09 '23 10:10 liuxingbaoyu

Happy to switch to rollup (vite probably?) instead - I'm not particularly married to using webpack (it's just the one I got working (and the one I have by far the most experience with))

SimenB avatar Oct 09 '23 10:10 SimenB

FWIW, I think I'll just be checking the exports manually at build time and include an mjs file, which should skip the lexer entirely: https://github.com/jestjs/jest/pull/14661

SimenB avatar Oct 30 '23 08:10 SimenB

Amazing!

liuxingbaoyu avatar Oct 31 '23 02:10 liuxingbaoyu