tschaub/es-main

Test if an ES module is run directly (require.main replacement)

JavaScript

95

221 commits

updated Dec 22, 2025

See the code

README

es-main

Test if an ES module is run directly with Node.js. Acts as a replacement for require.main.

[!NOTE] If you are using Node.js versions newer than 22.18.0 or 24.2.0, you should use the built-in import.meta.main instead of this module.

use

import esMain from 'es-main';

if (esMain(import.meta)) {
  // Module run directly.
}

why?

It can be useful to have a module that is both imported from other modules and run directly. With CommonJS, it is possible to have a top-level condition that checks if a script run directly like this:

if (require.main === module) {
  // Do something special.
}

With ES modules in Node.js, require.main is not available. Other alternatives like process.mainModule and module.parent are also not defined for ES modules. In the future, there may be an alternative way to do this check (e.g. import.meta.main or a special main export). Until then, this package provides a workaround.

Contributors

tschaub

132 commits

dependabot[bot]

87 commits

Greenheart

1 commits

xamgore

1 commits

Languages

JavaScript

100.0%

tschaub/es-main

Test if an ES module is run directly (require.main replacement)

JavaScript

95

221 commits

updated Dec 22, 2025

See the code

README

es-main

Test if an ES module is run directly with Node.js. Acts as a replacement for require.main.

[!NOTE] If you are using Node.js versions newer than 22.18.0 or 24.2.0, you should use the built-in import.meta.main instead of this module.

use

import esMain from 'es-main';

if (esMain(import.meta)) {
  // Module run directly.
}

why?

It can be useful to have a module that is both imported from other modules and run directly. With CommonJS, it is possible to have a top-level condition that checks if a script run directly like this:

if (require.main === module) {
  // Do something special.
}

With ES modules in Node.js, require.main is not available. Other alternatives like process.mainModule and module.parent are also not defined for ES modules. In the future, there may be an alternative way to do this check (e.g. import.meta.main or a special main export). Until then, this package provides a workaround.

Contributors

tschaub

132 commits

dependabot[bot]

87 commits

Greenheart

1 commits

xamgore

1 commits

Languages

JavaScript

100.0%