package.json types/main/module take precedence over conditional exports

Author: webketjeCreated Oct 15, 2025Updated Oct 15, 2025

Possibly somewhat related to #1085.

Given a package.json:

json
{
  "main": "./lib/index.cjs",
  "module": "./lib/index.js",
  "type": "module",
  "dependencies": {
    "some-client-with-matching-esm-and-tsconfig": "^x.x.x"
  },
  "exports": {
    ".": {
      "require": {
        "types": "./lib/index.d.ts",
        "default": "./lib/index.cjs"
      },
      "import": {
        "types": "./lib/index.d.ts",
        "default": "./lib/index.js"
      }
    },
    "./package.json": "./package.json"
  },

_without root types property, running:

bash
microbundle --target node -f esm --generateTypes=true

results in error:

(rpt2 plugin) Error: /Users/xxxx/dev/project/dependingclient.ts(197,32): semantic error TS2339: Property 'request' does not exist on type 'DependingClient.ts'. at RollupContext.error (/Users/xxxx/dev/project/node_modules/rollup-plugin-typescript2/dist/rollup-plugin-typescript2.cjs.js:20259:3

Indicating it cannot find the types specified in the conditional exports.

Working solution: Specify "types": "./lib/index.d.ts" at root-level.
Also works: Remove the "main" and module property

It seems to me package.json conditional exports are not taking precedence over main/module/types

Not sure if related but when in tsconfig.json resolvePackageJsonExports is explicitly set to true (even weirder is that it would be true by default in node16 moduleresolution) , regardless of whether moduleResolution is set to node16, it throws

rpt2: options error TS5098: Option 'resolvePackageJsonExports' can only be used when 'moduleResolution' is set to 'node16', 'nodenext', or 'bundler'. Whereas running the build simple with tsc causes no issues.