Skip to content
This repository was archived by the owner on Sep 2, 2023. It is now read-only.
This repository was archived by the owner on Sep 2, 2023. It is now read-only.

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

@trusktr

Description

@trusktr

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    duplicateThis issue or pull request already exists

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions