fix: main field in package.json should correspond to cjs artifacts#5756
fix: main field in package.json should correspond to cjs artifacts#5756jasonsaayman merged 4 commits intoaxios:v1.xfrom
Conversation
When axios#4787 was implemented, the project was switched to `"type": "module"` and "./index.js" became an esm file instead of commonjs, however, the "main" entry in package.json still points to "index.js". As a result, consumers using this field may get unexpected behavior since the main field is supposed to be commonjs if the entry is provided. Many consumers won't run into this as a practical problem (for example when just doing `const axios = require('axios').default` from inside of a cjs file in node) because the "exports" map takes precedence over the main/module fields, but tools that don't parse the object map when resolving still run into problems here. The fix for this is to just point the "main" entry-point to the commonjs artifacts located at "./dist/node/index.cjs". I also added a module entrypoint to improve compatability for the cases where the export map is not used (webpack 4 for example) since that would likely be reading the cjs "main" entrypoint now that main has switched back to cjs.
|
This PR has been sitting for a few months but the underlying issue has been causing me all sorts of headaches as we need to keep adding the following to our jest.config.js to work around these issues which has been confusing for our end users (since they aren't importing axios directly and its a transitive dependency): moduleNameMapper: {
'^axios$': require.resolve('axios'),
},@DigitalBrainJS I don't know who the current project owners are, but is this something you are able to review and release? |
Why do you think this should not be so? Axios is ESM module and according to the documentation, the main field must point to an ESM module if the package has "type: module". "Module" field is not in npm spec and it is just a proprietary field for some bundlers. According to the npm documentation, backward compatibility with commonjs for an ESM package should be handled by conditional export. |
I haven't found that in the node documentation specifically that implies the main field must be the es-module the package type is module. I could only find documentation that suggested that it could point to cjs or esm (in which case the package would not be consumable from a For example, there is the following quote:
While that says the can point to the same module, their example doesn't use conditional exports or specify https://nodejs.org/api/packages.html
So I tested this in node 12.0 and as you say, the conditional export isn't used and so the following code fails to work in older versions of node where the main field is used instead of the export map: const {default: axios} = require('axios');
axios.get('http://www.google.com').then(result => console.log(result.data));Fails with: But node versions 12.0-7 were never LTS versions, and they are certainly out of date, so maybe we don't need the main field at all if your intention is to not support special cases as a result of obsolescence. I guess my question is, if we are relying on the exports map for this functionality to work correctly in node, what is the intended use-case for setting the "main" entrypoint to point to the esm version of the package? The field will never be used in current versions of node and breaks in old versions, so maybe it is because that is what would be used by bundlers that don't support the exports map? If that's the case, those same bundlers support the proprietary "module" and "browsers" entry-points. There's also a ton of other entries already in this I can maybe see the case for using: "browser": {
".": "./index.js",instead of |
|
@DigitalBrainJS I have worked around this issue on my end by removing my dependency on |
There was a problem hiding this comment.
Pull request overview
This PR fixes a packaging issue where the main field in package.json was pointing to an ESM file (index.js) instead of the CommonJS artifact after the project switched to "type": "module". This caused compatibility issues for tools that don't parse the exports map and rely solely on the main field.
Key changes:
- Changed
mainfield from"index.js"to"./dist/node/axios.cjs"to point to the CommonJS build - Added
modulefield pointing to"./index.js"for better compatibility with bundlers that don't support exports maps (e.g., webpack 4)
Browserify and React Native projects (that aren't using `unstable_enablePackageExports`) use the `main` field as the package entrypoint. A recent PR (axios#5756) updated `main` to use a CommonJS bundle for Node.js, which caused Browserify and React Native projects to use the Node.js bundle. This led to many reports of broken React Native builds. This has been fixed by adding an entry to `browser` and `react-native` to re-map the Node.js CommonJS bundle to the browser CommonJS bundle.
Browserify and React Native projects (that aren't using `unstable_enablePackageExports`) use the `main` field as the package entrypoint. A recent PR (#5756) updated `main` to use a CommonJS bundle for Node.js, which caused Browserify and React Native projects to use the Node.js bundle. This led to many reports of broken React Native builds. This has been fixed by adding an entry to `browser` and `react-native` to re-map the Node.js CommonJS bundle to the browser CommonJS bundle.
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [axios](https://axios-http.com) ([source](https://github.com/axios/axios)) | dependencies | patch | [`1.13.2` → `1.13.4`](https://renovatebot.com/diffs/npm/axios/1.13.2/1.13.4) | --- ### Release Notes <details> <summary>axios/axios (axios)</summary> ### [`v1.13.4`](https://github.com/axios/axios/releases/tag/v1.13.4) [Compare Source](axios/axios@v1.13.3...v1.13.4) #### Overview The release addresses issues discovered in v1.13.3 and includes significant CI/CD improvements. **Full Changelog**: [v1.13.3...v1.13.4](axios/axios@v1.13.3...v1.13.4) #### What's New in v1.13.4 ##### Bug Fixes - **fix: issues with version 1.13.3** ([#​7352](axios/axios#7352)) ([ee90dfc](axios/axios@ee90dfc)) - Fixed issues discovered in v1.13.3 release - Cleaned up interceptor test files - Improved workflow configurations ##### Infrastructure & CI/CD - **refactor: ci and build** ([#​7340](axios/axios#7340)) ([8ff6c19](axios/axios@8ff6c19)) - Major refactoring of CI/CD workflows - Consolidated workflow files for better maintainability - Added mise configuration for the development environment - Improved sponsor block update automation - Enhanced issue and PR templates - Added automatic release notes generation - Implemented workflow cancellation for concurrent runs - **chore: codegen and some updates to workflows** ([76cf77b](axios/axios@76cf77b)) - Code generation improvements - Workflow optimisations #### Migration Notes ##### Breaking Changes None in this release. ##### Deprecations None in this release. #### Contributors Thank you to all contributors who made this release possible! Special thanks to: - [jasonsaayman](https://github.com/jasonsaayman) - Release management and CI/CD improvements ### [`v1.13.3`](https://github.com/axios/axios/blob/HEAD/CHANGELOG.md#1133-2026-01-20) [Compare Source](axios/axios@v1.13.2...v1.13.3) ##### Bug Fixes - **http2:** Use port 443 for HTTPS connections by default. ([#​7256](axios/axios#7256)) ([d7e6065](axios/axios@d7e6065)) - **interceptor:** handle the error in the same interceptor ([#​6269](axios/axios#6269)) ([5945e40](axios/axios@5945e40)) - main field in package.json should correspond to cjs artifacts ([#​5756](axios/axios#5756)) ([7373fbf](axios/axios@7373fbf)) - **package.json:** add 'bun' package.json 'exports' condition. Load the Node.js build in Bun instead of the browser build ([#​5754](axios/axios#5754)) ([b89217e](axios/axios@b89217e)) - silentJSONParsing=false should throw on invalid JSON ([#​7253](axios/axios#7253)) ([#​7257](axios/axios#7257)) ([7d19335](axios/axios@7d19335)) - turn AxiosError into a native error ([#​5394](axios/axios#5394)) ([#​5558](axios/axios#5558)) ([1c6a86d](axios/axios@1c6a86d)) - **types:** add handlers to AxiosInterceptorManager interface ([#​5551](axios/axios#5551)) ([8d1271b](axios/axios@8d1271b)) - **types:** restore AxiosError.cause type from unknown to Error ([#​7327](axios/axios#7327)) ([d8233d9](axios/axios@d8233d9)) - unclear error message is thrown when specifying an empty proxy authorization ([#​6314](axios/axios#6314)) ([6ef867e](axios/axios@6ef867e)) ##### Features - add `undefined` as a value in AxiosRequestConfig ([#​5560](axios/axios#5560)) ([095033c](axios/axios@095033c)) - add automatic minor and patch upgrades to dependabot ([#​6053](axios/axios#6053)) ([65a7584](axios/axios@65a7584)) - add Node.js coverage script using c8 (closes [#​7289](axios/axios#7289)) ([#​7294](axios/axios#7294)) ([ec9d94e](axios/axios@ec9d94e)) - added copilot instructions ([3f83143](axios/axios@3f83143)) - compatibility with frozen prototypes ([#​6265](axios/axios#6265)) ([860e033](axios/axios@860e033)) - enhance pipeFileToResponse with error handling ([#​7169](axios/axios#7169)) ([88d7884](axios/axios@88d7884)) - **types:** Intellisense for string literals in a widened union ([#​6134](axios/axios#6134)) ([f73474d](axios/axios@f73474d)), closes [/github.com/microsoft/TypeScript/issues/33471#issuecomment-1376364329](https://github.com//github.com/microsoft/TypeScript/issues/33471/issues/issuecomment-1376364329) ##### Reverts - Revert "fix: silentJSONParsing=false should throw on invalid JSON ([#​7253](axios/axios#7253)) ([#​7](https://github.com/axios/axios/issues/7)…" ([#​7298](axios/axios#7298)) ([a4230f5](axios/axios@a4230f5)), closes [#​7253](axios/axios#7253) [#​7](axios/axios#7) [#​7298](axios/axios#7298) - **deps:** bump peter-evans/create-pull-request from 7 to 8 in the github-actions group ([#​7334](axios/axios#7334)) ([2d6ad5e](axios/axios@2d6ad5e)) ##### Contributors to this release - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/175160345?v=4&s=18" alt="avatar" width="18"/> [Ashvin Tiwari](https://github.com/ashvin2005 "+1752/-4 (#​7218 #​7218 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/71729144?v=4&s=18" alt="avatar" width="18"/> [Nikunj Mochi](https://github.com/mochinikunj "+940/-12 (#​7294 #​7294 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/128113546?v=4&s=18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh "+544/-102 (#​7169 #​7185 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [jasonsaayman](https://github.com/jasonsaayman "+317/-73 (#​7334 #​7298 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/377911?v=4&s=18" alt="avatar" width="18"/> [Julian Dax](https://github.com/brodo "+99/-120 (#​5558 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/184285082?v=4&s=18" alt="avatar" width="18"/> [Akash Dhar Dubey](https://github.com/AKASHDHARDUBEY "+167/-0 (#​7287 #​7288 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/145687605?v=4&s=18" alt="avatar" width="18"/> [Madhumita](https://github.com/madhumitaaa "+20/-68 (#​7198 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/24915252?v=4&s=18" alt="avatar" width="18"/> [Tackoil](https://github.com/Tackoil "+80/-2 (#​6269 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/145078271?v=4&s=18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon "+41/-41 (#​6324 #​6315 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/184138832?v=4&s=18" alt="avatar" width="18"/> [Rudransh](https://github.com/Rudrxxx "+71/-2 (#​7257 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/146366930?v=4&s=18" alt="avatar" width="18"/> [WuMingDao](https://github.com/WuMingDao "+36/-36 (#​7215 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/46827243?v=4&s=18" alt="avatar" width="18"/> [codenomnom](https://github.com/codenomnom "+70/-0 (#​7201 #​7201 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/189698992?v=4&s=18" alt="avatar" width="18"/> [Nandan Acharya](https://github.com/Nandann018-ux "+60/-10 (#​7272 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/7225168?v=4&s=18" alt="avatar" width="18"/> [Eric Dubé](https://github.com/KernelDeimos "+22/-40 (#​7042 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/915045?v=4&s=18" alt="avatar" width="18"/> [Tibor Pilz](https://github.com/tiborpilz "+40/-4 (#​5551 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/23138717?v=4&s=18" alt="avatar" width="18"/> [Gabriel Quaresma](https://github.com/joaoGabriel55 "+31/-4 (#​6314 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/21505?v=4&s=18" alt="avatar" width="18"/> [Turadg Aleahmad](https://github.com/turadg "+23/-6 (#​6265 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/4273631?v=4&s=18" alt="avatar" width="18"/> [JohnTitor](https://github.com/kiritosan "+14/-14 (#​6155 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/39668736?v=4&s=18" alt="avatar" width="18"/> [rohit miryala](https://github.com/rohitmiryala "+22/-0 (#​7250 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/30316250?v=4&s=18" alt="avatar" width="18"/> [Wilson Mun](https://github.com/wmundev "+20/-0 (#​6053 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/184506226?v=4&s=18" alt="avatar" width="18"/> [techcodie](https://github.com/techcodie "+7/-7 (#​7236 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/187598667?v=4&s=18" alt="avatar" width="18"/> [Ved Vadnere](https://github.com/Archis009 "+5/-6 (#​7283 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/115612815?v=4&s=18" alt="avatar" width="18"/> [svihpinc](https://github.com/svihpinc "+5/-3 (#​6134 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/123884782?v=4&s=18" alt="avatar" width="18"/> [SANDESH LENDVE](https://github.com/mrsandy1965 "+3/-3 (#​7246 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/12529395?v=4&s=18" alt="avatar" width="18"/> [Lubos](https://github.com/mrlubos "+5/-1 (#​7312 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/709451?v=4&s=18" alt="avatar" width="18"/> [Jarred Sumner](https://github.com/Jarred-Sumner "+5/-1 (#​5754 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/17907922?v=4&s=18" alt="avatar" width="18"/> [Adam Hines](https://github.com/thebanjomatic "+2/-1 (#​5756 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/177472603?v=4&s=18" alt="avatar" width="18"/> [Subhan Kumar Rai](https://github.com/Subhan030 "+2/-1 (#​7256 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/6473925?v=4&s=18" alt="avatar" width="18"/> [Joseph Frazier](https://github.com/josephfrazier "+1/-1 (#​7311 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/184906930?v=4&s=18" alt="avatar" width="18"/> [KT0803](https://github.com/KT0803 "+0/-2 (#​7229 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/6703955?v=4&s=18" alt="avatar" width="18"/> [Albie](https://github.com/AlbertoSadoc "+1/-1 (#​5560 )") - <img src="proxy.php?url=https://avatars.githubusercontent.com/u/9452325?v=4&s=18" alt="avatar" width="18"/> [Jake Hayes](https://github.com/thejayhaykid "+1/-0 (#​5999 )") </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Co-authored-by: Renovate Bot <[email protected]> Co-authored-by: ChubbChubbs <[email protected]> Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/18 Co-authored-by: boring-bot <[email protected]> Co-committed-by: boring-bot <[email protected]>
When #4787 was implemented, the project was switched to
"type": "module"and "./index.js" became an esm file instead of commonjs, however, the "main" entry in package.json still points to "index.js". As a result, consumers using this field may get unexpected behavior since the main field is supposed to be commonjs if the entry is provided.Many consumers won't run into this as a practical problem (for example when just doing
const axios = require('axios').defaultfrom inside of a cjs file in node) because the "exports" map takes precedence over the main/module fields, but tools that don't parse the exports map when resolving still run into problems here. As an example, I encountered this problem when using the resolve package as part of a workflow for a jest config.The fix for this is to just point the "main" entry-point to the commonjs artifacts located at "./dist/node/axios.cjs".
I also added a module entrypoint to improve compatibility for the cases where the export map is not used (webpack 4 for example) since that would likely be reading the cjs "main" entrypoint now that main has switched back to cjs.