magic-require v0.1.2
The problem
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
Solution
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 ornull.
Community
You are always welcome for ideas and pull requests :)