Package subpath './package.json' is not defined by "exports"
ctavan opened this issue ยท 9 comments
Environment
System:
OS: macOS 10.15.4
CPU: (4) x64 Intel(R) Core(TM) i7-5557U CPU @ 3.10GHz
Memory: 94.37 MB / 16.00 GB
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 14.2.0 - /usr/local/bin/node
Yarn: 1.22.4 - /usr/local/bin/yarn
npm: 6.14.4 - /usr/local/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
Managers:
CocoaPods: 1.9.1 - /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms: iOS 13.4, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
Android SDK: Not Found
IDEs:
Android Studio: Not Found
Xcode: 11.4.1/11E503a - /usr/bin/xcodebuild
Languages:
Java: 1.8.0_121 - /usr/bin/javac
Python: 3.7.7 - /usr/local/opt/python/libexec/bin/python
npmPackages:
@react-native-community/cli: Not Found
react: 16.13.1 => 16.13.1
react-native: 0.62.2 => 0.62.2
npmGlobalPackages:
*react-native*: Not Found
Description
When running react-native
under Node.js 14.x on a project that uses npm modules which specify the new exports
field in package.json
, react-native
will print the following warning (in this example the uuid
package is used):
warn Package uuid has been ignored because it contains invalid configuration. Reason: Package subpath './package.json' is not defined by "exports" in /PATH_TO_CURRENT_PROJECT/node_modules/uuid/package.json
The same issue has been reported in other places:
i18next-http-backend
: facebook/react-native#28710 for (workaround: i18next/i18next-http-backend@1d8da79#diff-b9cfc7f2cdf78a7f4b91a753d10865a2R8)i18next-locize-backend
: https://github.com/locize/i18next-locize-backend/pull/326/filesnanoevents
: ai/nanoevents#44uuid
: uuidjs/uuid#444 (comment)
The reason is that, starting in Node.js 14.x, as soon as an npm module defines the exports
field in package.json
, only the files listed there are exported. If package.json
is not included in that list, it's no longer possible to do things like require.resolve('uuid/package.json');
.
The problematic piece of code is:
cli/packages/cli/src/tools/config/resolveNodeModuleDir.ts
Lines 11 to 13 in 5819a17
For a package like uuid
which does not contain react-native specific configuration in package.json
this is not a problem, but for modules that do contain such config in package.json
they will be forced to add package.json
to their exports
field.
An alternative would be to not rely on require.resolve
and instead use https://github.com/browserify/resolve
As far as I know this is how rollup.js solves this issue, see rollup/plugins#208 (comment)
What is the maintainers take on this? Do you think that every single module on npm that starts making use of the exports
field should include package.json
in the exports
? Or could this be fixed in react-native?
Reproducible Demo
- Use Node.js 14.x
npm i uuid@8.0.0
- Open
node
repl:
> require.resolve('uuid/package.json');
Uncaught:
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './package.json' is not defined by "exports" in /PROJECT/node_modules/uuid/package.json
at applyExports (internal/modules/cjs/loader.js:491:9)
at resolveExports (internal/modules/cjs/loader.js:507:23)
at Function.Module._findPath (internal/modules/cjs/loader.js:635:31)
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:1007:27)
at Function.resolve (internal/modules/cjs/helpers.js:78:19)
at repl:1:9
at Script.runInThisContext (vm.js:131:20)
at REPLServer.defaultEval (repl.js:436:29)
at bound (domain.js:429:14)
at REPLServer.runBound [as eval] (domain.js:442:12) {
code: 'ERR_PACKAGE_PATH_NOT_EXPORTED'
}
From nodejs docs:
Now only the defined subpath in "exports" can be imported by a consumer
So package.json
should be defined in exports
to be available for import. But i can guess many package authors will not include it in exports
because in most situations importing package.json
is not necessary. So it should be processed on react-native-cli side. One of possible solution is read and parse package.json
file instead importing it. This is better than adding extra browserify/resolve
package as you suggested.
Just to clarify: The problem in react-native cli is not the loading of the package.json
file itself, that happens through cosmiconfig
:
cli/packages/cli/src/tools/config/readConfigFromDisk.ts
Lines 19 to 25 in 5819a17
which uses fs.readFile()
under the hood: https://github.com/davidtheclark/cosmiconfig/blob/d94bd6cd776b839c375d10846f97913b3d4e5763/src/readFile.ts#L3-L8
The problem is about resolving the path to the module's package.json
file which happens here:
cli/packages/cli/src/tools/config/resolveNodeModuleDir.ts
Lines 6 to 15 in 5819a17
Is there a reasonable workaround without needing to make a PR to every project with this issue?
What's the consequence of the warning? Does it mean that the package in question will not be included in the bundle?
I am getting this error when running yarn install. My nodejs and npm are up to date.
[!] Error: Package subpath './package.json' is not defined by "exports" in /Users/eddyalvarado_1/Documents/GitHub/plasma-wallet-web3/js/avalanche-wallet-sdk/node_modules/rollup-plugin-typescript2/node_modules/tslib/package.json
What's the consequence of the warning? Does it mean that the package in question will not be included in the bundle?
Interested in knowing the answer to this as well
What's the consequence of the warning? Does it mean that the package in question will not be included in the bundle?
Interested in knowing the answer to this as well
I get this error after I run "yarn install" then if I try to do "yarn start" it does not work either.
Invalid `Podfile` file: 767: unexpected token at 'Error: Cannot find module 'xxxxx/node_modules/typeorm/package.json.js'
at createEsmNotFoundErr (node:internal/modules/cjs/loader:960:15)
at finalizeEsmResolution (node:internal/modules/cjs/loader:953:15)
at resolveExports (node:internal/modules/cjs/loader:482:14)
at Function.Module._findPath (node:internal/modules/cjs/loader:522:31)
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:919:27)
at Function.resolve (node:internal/modules/cjs/helpers:108:19)
at resolveNodeModuleDir (xxxxx/node_modules/@react-native-community/cli-tools/build/resolveNodeModuleDir.js:24:42)
at xxxxx/node_modules/@react-native-community/cli-config/build/loadConfig.js:93:76
at Array.reduce (<anonymous>)
at loadConfig (xxxxx/node_modules/@react-native-community/cli-config/build/loadConfig.js:91:134)
Please don't open issues/PRs on open source projects about this. It is not expected that packages export their package.json file. This is a problem React Native needs to fix, not every single package out there.