@putout/engine-loader
Version:
load plugins and prepare them to run
221 lines (159 loc) ⢠4.11 kB
Markdown
//img.shields.io/npm/v/@putout/engine-loader.svg?style=flat&longCache=true
[ ]: https://npmjs.org/package/@putout/engine-loader"npm"
š[**Putout**](https://github.com/coderaiser/putout) loader for `plugins` and `processors`.
```
npm i @putout/engine-loader
```
Loader supports two kinds of plugins:
- āļø [**Simple**](
- āļø [**Nested**](
Simplest type of plugin support by [`@putout/engine-runner`](https://github.com/coderaiser/putout/tree/master/packages/engine-runner#supported-plugin-types), contains one rule.
Nested contains one or more rules:
```js
module.exports.rules = {
'remove-unused-variables': require('@putout/plugin-remove-unused-variables'),
};
```
When you want to make it disabled by default, use:
```js
module.exports.rules = {
'remove-unused-variables': ['off', require('@putout/plugin-remove-unused-variables')],
};
```
So when someone using your plugin, he needs to enable it:
```json
{
"rules": {
"nested/remove-unused-variables": "on"
},
"plugins": ["nested"]
}
```
When you need to get things working with Yarn OnP, and using custom `plugins` `formatters` or `processors`, add env variable
`PUTOUT_YARN_PNP` with name of a package that contains dependencies you need.
If you want to load from custom directory (for Visual Studio Code Extension, for example) use `PUTOUT_LOAD_DIR`.
## API
### loadPlugins
```js
const {loadPlugins} = require('@putout/engine-loader');
const pluginNames = [
'remove-unusede-variables',
];
const rules = {
'remove-unused-variables': 'on',
};
const plugins = loadPlugins({
pluginNames,
rules,
});
```
You can also use schema like this one:
```
import:escover/plugin
```
```js
const plugins = loadPlugins({
pluginNames: [
'import:commonjs-putout-plugin',
],
});
```
Load **ESM** plugins:
```js
const {loadPluginsAsync} = require('@putout/engine-loader');
const pluginNames = [
'remove-unusede-variables',
];
const rules = {
'remove-unused-variables': 'on',
};
const plugins = await loadPluginsAsync({
pluginNames,
rules,
});
```
You can also use schema like this one:
```
import:escover/plugin
```
```js
const plugins = await loadPluginsAsync({
pluginNames: [
'import:escover/plugin',
],
});
```
Or when used `putoutAsync`:
```js
import {putoutAsync} from 'putout';
await putoutAsync(`module.exports.hello = 'world'`, {
plugins: [
'import:escover/plugin',
],
});
```
Which is the same as:
```js
import {putoutAsync} from 'putout';
import * as plugin from 'escover/plugin';
await putoutAsync(`module.exports.hello = 'world'`, {
plugins: [
['escover/plugin', plugin],
],
});
```
Or used inside `.putout.json`:
```json
{
"plugins": [
"import:escover/plugin"
]
}
```
```js
const {loadProcessors} = require('@putout/engine-loader');
const optionalLoad = async (a) => await import(a);
const plugins = await loadProcessorsAsync({
processors: [
['javascript', 'on'],
['markdown', 'off'],
],
}, optionalLoad);
```
Gives ability to create loader for `processor` or `formatter`.
```js
const {createAsyncLoader} = require('@putout/engine-loader');
const {loadProcessor} = createAsyncLoader('processor');
// load @putout/processor-markdown
await loadProcessors('markdown');
// load @putout/processor-json using custom loader
await loadProcess('json', () => {
return Promise.resolve(`will be called instead of 'import'`);
});
```
```js
const {validateRules} = require('@putout/engine-loader');
const pluginNames = [];
const rules = {
'remove-unused-variables': 'on',
};
validateRules({
pluginNames,
rules,
});
// throws since there is no plugin name passed that matches rule 'remove-unused-variables'
```
MIT
[ ]: https: