require-control
Version:
Get the full control over the nodejs module system.
112 lines (85 loc) • 3.97 kB
Markdown
This is a module-in-the-middle, require hack, path control, this is just a toolbox to master nodejs modules.
- Fast relief againts the imports inside your node_modules.
- A cure from "something.`default` is not a thing".
- A way to tame module name resolution.
- All commands returns a function to cancel side effects.
- All commands could be run as many times as you wish, but only name resolution will make sense.
```js
import 'require-control/register';
```
And then all `imports` inside node_modules will work
```js
import 'require-control/interop-require';
```
And then default will _always_ exists.
```js
import {mirrorModuleCache} from 'require-control';
mirrorModuleCache((requireName, absoluteFilePath) => boolean);
```
And that will change how cache works for the selected files.
```js
import {nameResolution} from 'require-control';
nameResolution((requireName, parent) => newFileName);
import {setAliases} from 'require-control';
setAliases({
'from': 'to'
});
```
And then all module aliases (webpack resolve, ts paths, aliases, anything)
PS: You can use setAliases to achieve 10-100 speedup against tsconfig-paths, if you are not using "complex" typescript paths.
PPS: `setAlias` is doing the same [module-alias](https://github.com/ilearnio/module-alias) does - changes how `Module._resolveFilename` works. If you want to migrate to `aliases` from `relative` imports you might use [relative-to-alias](https://github.com/s-yadav/relative-to-alias) or [restructor](https://github.com/theKashey/restructor).
### 4.5 To control module resolution order
```js
import {hoistExtensions} from 'require-control';
// make tsx, ts and jsx be picked first
hoistExtensions(['.tsx', '.ts', '.jsx']);
```
That could be quite usefull, if you have `Component.less` and `Component.jsx` or `Component.tsx`, as long as
`require('./Component')` would load `.less` file - it goes before any other "non-native" extension.
PS: This command just moves listed extensions prior non-listed.
`babelIt(pick, babelSettings)`, where pick could return true, false, or code to pipe into babel.
```js
import {babelIt} from 'require-control';
babelIt( fileName => fileName.includes('my-folder'), {
babelrc: false,
plugin: ['power-converter']
})
```
```js
require('ts-node/register'); // support TS
require('babel-register'); // support ES
const { esm_modules, interopRequire, setAliases, resolutions } = require('require-control');
esm_modules(); // support ES in node_modules
interopRequire(); // "webpack" default imports everywhere in js,jsx,less,scss
interopRequire(['.less']); // "webpack" default imports for .less files
setAliases({ // why not!
'common': path.join(root, 'src/common'),
'components': path.join(root, 'src/components'),
});
resolutions(request => { // custom resolution
if (request === 'react') {
return 'preact';
}
});
```
```js
const {setAliases } = require('require-control');
setAliases({
'common': path.join(root, 'src/common'),
'components': path.join(root, 'src/components'),
});
```
This project would not be ever created without my work on [rewiremock](https://github.com/theKashey/rewiremock).
MIT