Modules: Unable to require.resolve a package location when the package is 'type:module' and 'exports' is defined without exposing `package.json`.

Created on 16 Aug 2020  路  3Comments  路  Source: nodejs/modules

First, see this popular question on StackOverflow, whose solution is now broken for some packages using Node ESM (with "type": "module" and an "exports" field that does not explicitly expose package.json).

The problem is that if a package has the following in package.json,

{
    "name": "@scope/package",
    ...
    "types": "dist/index.d.ts",
    "exports COMMENT:": "This removes 'dist' from import statements, as well as replaces the 'main' field. See https://github.com/nodejs/node/issues/14970#issuecomment-571887546",
    "exports": {
        ".": "./dist/index.js",
        "./": "./dist/"
    },
    ...
}

Then one can not use require() or require.resolve() to resolve package locations like the can with normal CommonJS packages.

For example, trying to run require.resolve('@scope/package/package.json') will fail with

Uncaught Error: Cannot find module '@scope/package/package.json'

In the repl you'll see a MODULE_NOT_FOUND message.

The package author would need to expose package.json for resolving to work:

{
    "name": "@scope/package",
    ...
    "types": "dist/index.d.ts",
    "exports": {
        "./package.json": "./package.json", // <---- here
        ".": "./dist/index.js",
        "./": "./dist/"
    },
    ...
}

I thought that exports was supposed to affect only import statements, but not require.

duplicate

Most helpful comment

This looks like a duplicate of https://github.com/nodejs/modules/issues/516.

All 3 comments

Ah, the ESM doc says

"exports" are not specific to ES modules or CommonJS

So apparently it is supposed to work this way.

Maybe we need a new API, like require.resolvePackageLocation(moduleName)?

In the meantime, the resolve-package-path package works great with any package regardless of what it has for exports.

This looks like a duplicate of https://github.com/nodejs/modules/issues/516.

Closing as a duplicate of #516, @trusktr please see that issue and its referenced @nodejs/node issue.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

MylesBorins picture MylesBorins  路  4Comments

MylesBorins picture MylesBorins  路  3Comments

GeoffreyBooth picture GeoffreyBooth  路  4Comments

MylesBorins picture MylesBorins  路  4Comments

Jamesernator picture Jamesernator  路  4Comments