Skip to content

breaks when no `exports` defined

a lot of typescript libs, e.g. almost all of @libp2p/*, seem to only contain exports like those:

  "exports": {
    ".": {
      "types": "./src/index.d.ts",
      "import": "./dist/src/index.js"
    },
  }

which breaks with the following example error from my project:

@parcel/core: Failed to resolve 'libp2p' from './src/index.js'

  > 1 | import { createLibp2p } from 'libp2p';
      |                              ^^^^^^^^

parcel-resolver-esm-exports: No "exports" main defined in [...]/libp2p/package.json

  Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No "exports" main defined in [...]/node_modules/libp2p/package.json
      at new NodeError (node:internal/errors:372:5)
      at throwExportsNotFound (node:internal/modules/esm/resolve:472:9)
      at packageExportsResolve (node:internal/modules/esm/resolve:693:7)
      at resolveExports (node:internal/modules/cjs/loader:482:36)
      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_modules/v8-compile-cache/v8-compile-cache.js:164:23)
      at Object.resolve ([...]/node_modules/parcel-resolver-esm-exports/lib/main.js:54:32)
      at async ResolverRunner.resolve ([...]/node_modules/@parcel/core/lib/requests/PathRequest.js:214:22)
      at async Object.run ([...]/node_modules/@parcel/core/lib/requests/PathRequest.js:104:16)

as you can see, i'm trying to actually do an ESM import, but require.resolve seems to either hard-depend on an actual CJS require entry there, which the lib doesn't support, or is too stupid to realize that yes, . is in fact "main"