
Product
Introducing Socket Firewall Enterprise: Flexible, Configurable Protection for Modern Package Ecosystems
Socket Firewall Enterprise is now available with flexible deployment, configurable policies, and expanded language support.
magic-require
Advanced tools
Usually module availability could be checked using native `require` method.
Usually module availability could be checked using native require method.
const isExists = false;
try {
require.resolve('angular')
isExists = true;
} catch (e) {
}
But here is problem: I don't want to write try catch statements :)
OK. The real problem appears when developing component with auto requiring modules.
require and require.resolve will work correctly until component is in local node_modules.
After npm link (that is very useful while developing npm packages) or if components
is installed as global package - require and require.resolve will work from global context (at *nix systems
/usr/local/lib/node_modules).
For example:
I am developing build / server like webpack. And there are loaders (babel-loader, html-loader, json-loader etc).
And I want my builder to require loader automatically when it is needed. So my node_modules should be as below:
/my-work-directory/node_modules
|-builder/
|-babel-loader/
|-html-loader/
|-json-loader/
In this case if I run require('babe-loader') at builder component - it will work.
But If I npm link my build (for better developing process) or make in global - my node_modules will be as below:
/usr/local/lib/node_modules
|-builder/
/my-work-directory/node_modules
|-(linked directory) builder/
|-babel-loader/
|-html-loader/
|-json-loader/
And in this case if I run require('babe-loader') at builder - will be exception Error: Cannot find module 'babel-loader'.
This happens because require depends on __dirname that equals /usr/local/lib/node_modules/builder at builder component.
Here is documentation how modules are loading from node_modules folder
npm install --save magic-require
First resolve modules according to caller module __dirname and if not resolved - try to resolve according to current process.cwd().
100% supports package.json if loads module as directory.
Examples
import magic from 'magic-require';
magic.isExists('babel-loader'); // true
magic.isExists('expose-loader'); // false
magic.resolve('babel-loader'); // ../../../.. /my-work-directory/node_modules/babe-loader/index.js
const BabelLoader = magic('babel-laoder');
Available methods
isExists(module) - returns true if module exists and false - if not.resolve(module) - returns relative path to requested module from current executing module's __dirname or null.You are always welcome for ideas and pull requests :)
FAQs
Usually module availability could be checked using native `require` method.
We found that magic-require demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket Firewall Enterprise is now available with flexible deployment, configurable policies, and expanded language support.

Security News
Open source dashboard CNAPulse tracks CVE Numbering Authorities’ publishing activity, highlighting trends and transparency across the CVE ecosystem.

Product
Detect malware, unsafe data flows, and license issues in GitHub Actions with Socket’s new workflow scanning support.