Unable to detect exports from bundled webpack output
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?
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.
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.
https://github.com/webpack/webpack/issues/13098 https://github.com/rollup/rollup/pull/4826
Unfortunately webpack doesn't support this, although rollup does.
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))
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
Amazing!