@putout/engine-loader 15.4.0 → 16.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +7 -135
- package/lib/load/load.js +3 -1
- package/lib/plugins/load-plugins-async.js +11 -10
- package/lib/plugins/load-plugins.js +99 -0
- package/lib/plugins/prepare-rules.js +20 -0
- package/lib/processors/load-processors-async.js +28 -0
- package/lib/rules/parse-rules.js +3 -6
- package/lib/validators/validate-rules-relations.js +17 -0
- package/package.json +7 -7
package/lib/index.js
CHANGED
|
@@ -1,142 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const {createAsyncLoader} = require('./load/async-loader');
|
|
4
|
-
const {parsePluginNames} = require('./plugins/parse-plugin-names');
|
|
5
|
-
const parseProcessorNames = require('./processors/parse-processor-names');
|
|
6
|
-
const validatePlugin = require('./plugins/validate-plugin');
|
|
7
|
-
const {loadPluginsAsync} = require('./plugins/load-plugins-async');
|
|
8
|
-
|
|
9
|
-
const {
|
|
10
|
-
parseRules,
|
|
11
|
-
validateRules,
|
|
12
|
-
isEnabled,
|
|
13
|
-
getLoadedRules,
|
|
14
|
-
} = require('./rules');
|
|
15
4
|
|
|
16
|
-
const {
|
|
17
|
-
const {
|
|
18
|
-
const {
|
|
5
|
+
const {validateRulesRelations} = require('./validators/validate-rules-relations');
|
|
6
|
+
const {loadPluginsAsync} = require('./plugins/load-plugins-async');
|
|
7
|
+
const {loadPlugins} = require('./plugins/load-plugins');
|
|
8
|
+
const {loadProcessorsAsync} = require('./processors/load-processors-async');
|
|
19
9
|
|
|
10
|
+
module.exports.loadPlugins = loadPlugins;
|
|
20
11
|
module.exports.loadPluginsAsync = loadPluginsAsync;
|
|
21
|
-
module.exports.loadProcessorsAsync =
|
|
22
|
-
check(options);
|
|
23
|
-
|
|
24
|
-
const {processors = []} = options;
|
|
25
|
-
const parsedProcessors = parseProcessorNames(processors);
|
|
26
|
-
const loadProcessor = createAsyncLoader('processor');
|
|
27
|
-
|
|
28
|
-
const list = [];
|
|
29
|
-
|
|
30
|
-
for (const [name, fn] of parsedProcessors) {
|
|
31
|
-
if (fn) {
|
|
32
|
-
list.push(fn);
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
list.push(loadProcessor(name, load));
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return await Promise.all(list);
|
|
40
|
-
};
|
|
41
|
-
|
|
12
|
+
module.exports.loadProcessorsAsync = loadProcessorsAsync;
|
|
42
13
|
module.exports.createAsyncLoader = createAsyncLoader;
|
|
43
|
-
|
|
44
|
-
module.exports.validateRules = (options) => {
|
|
45
|
-
check(options);
|
|
46
|
-
|
|
47
|
-
const {pluginNames = [], rules = {}} = options;
|
|
48
|
-
const items = parsePluginNames(pluginNames);
|
|
49
|
-
|
|
50
|
-
validateRules({
|
|
51
|
-
rules,
|
|
52
|
-
items,
|
|
53
|
-
});
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
module.exports.loadPlugins = (options) => {
|
|
57
|
-
check(options);
|
|
58
|
-
|
|
59
|
-
const {pluginNames = [], rules = {}} = options;
|
|
60
|
-
|
|
61
|
-
const cookedRules = parseRules(rules);
|
|
62
|
-
const loadedRules = getLoadedRules(cookedRules);
|
|
63
|
-
|
|
64
|
-
const items = parsePluginNames(pluginNames);
|
|
65
|
-
const plugins = loadPlugins({
|
|
66
|
-
items,
|
|
67
|
-
loadedRules,
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
const cookedNotEnabled = parseRules(rules, {
|
|
71
|
-
enable: false,
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
return filterEnabledPlugins({
|
|
75
|
-
plugins,
|
|
76
|
-
cookedRules: cookedNotEnabled,
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const splitRule = (rule) => [rule, 'putout'];
|
|
81
|
-
|
|
82
|
-
const parseRule = (rule) => rule
|
|
83
|
-
.replace('import:@putout/plugin-', '')
|
|
84
|
-
.replace('@putout/plugin-', '');
|
|
85
|
-
|
|
86
|
-
const maybeFromTuple = (a) => isArray(a) ? a[1] : a;
|
|
87
|
-
|
|
88
|
-
function loadPlugins({items, loadedRules}) {
|
|
89
|
-
const plugins = [];
|
|
90
|
-
|
|
91
|
-
for (const [rule, itemPlugin] of items) {
|
|
92
|
-
if (!isEnabled(rule, loadedRules))
|
|
93
|
-
continue;
|
|
94
|
-
|
|
95
|
-
checkRule(rule);
|
|
96
|
-
const parsedRule = parseRule(rule);
|
|
97
|
-
|
|
98
|
-
const [name, namespace] = splitRule(rule);
|
|
99
|
-
const plugin = maybeFromTuple(itemPlugin) || loadPlugin({
|
|
100
|
-
name,
|
|
101
|
-
namespace,
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
validatePlugin({
|
|
105
|
-
plugin,
|
|
106
|
-
rule,
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
const {rules} = plugin;
|
|
110
|
-
|
|
111
|
-
if (rules) {
|
|
112
|
-
plugins.push(...extendRules(parsedRule, rules));
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
plugins.push([parsedRule, plugin]);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return plugins;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function extendRules(rule, plugin) {
|
|
123
|
-
const result = [];
|
|
124
|
-
const entries = Object.entries(plugin);
|
|
125
|
-
|
|
126
|
-
for (const [name, plugin] of entries) {
|
|
127
|
-
result.push([`${rule}/${name}`, plugin]);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return result;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// add support of esm.sh
|
|
134
|
-
// https://github.com/esm-dev/esm.sh/issues/1045
|
|
135
|
-
function loadPlugin({name, namespace}) {
|
|
136
|
-
const {loadPlugin} = require('./load/load');
|
|
137
|
-
|
|
138
|
-
return loadPlugin({
|
|
139
|
-
name,
|
|
140
|
-
namespace,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
14
|
+
module.exports.validateRulesRelations = validateRulesRelations;
|
package/lib/load/load.js
CHANGED
|
@@ -49,7 +49,9 @@ function getPath(namespace, type, name) {
|
|
|
49
49
|
return [path, customRequire];
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
const {
|
|
52
|
+
const {
|
|
53
|
+
PUTOUT_YARN_PNP = 'putout',
|
|
54
|
+
} = process.env;
|
|
53
55
|
|
|
54
56
|
const createCustomRequire = once(() => createRequire(require.resolve(PUTOUT_YARN_PNP)));
|
|
55
57
|
const createPutoutRequire = once(() => createRequire(require.resolve('putout')));
|
|
@@ -2,13 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
const {basename} = require('node:path');
|
|
4
4
|
|
|
5
|
-
const {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
getLoadedRules,
|
|
9
|
-
} = require('../rules');
|
|
5
|
+
const {isEnabled} = require('../rules');
|
|
6
|
+
|
|
7
|
+
const {prepareRules} = require('./prepare-rules');
|
|
10
8
|
|
|
11
|
-
const {parsePluginNames} = require('./parse-plugin-names');
|
|
12
9
|
const validatePlugin = require('./validate-plugin');
|
|
13
10
|
const {filterEnabledPlugins} = require('./filter-enabled-plugins');
|
|
14
11
|
|
|
@@ -21,10 +18,14 @@ module.exports.loadPluginsAsync = async (options) => {
|
|
|
21
18
|
check(options);
|
|
22
19
|
|
|
23
20
|
const {pluginNames = [], rules = {}} = options;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
const {
|
|
22
|
+
items,
|
|
23
|
+
loadedRules,
|
|
24
|
+
cookedRules,
|
|
25
|
+
} = prepareRules({
|
|
26
|
+
rules,
|
|
27
|
+
pluginNames,
|
|
28
|
+
});
|
|
28
29
|
|
|
29
30
|
const plugins = await loadPlugins({
|
|
30
31
|
items,
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const validatePlugin = require('./validate-plugin');
|
|
4
|
+
const {prepareRules} = require('./prepare-rules');
|
|
5
|
+
|
|
6
|
+
const {isEnabled} = require('../rules');
|
|
7
|
+
|
|
8
|
+
const {filterEnabledPlugins} = require('./filter-enabled-plugins');
|
|
9
|
+
const {check, checkRule} = require('../check');
|
|
10
|
+
|
|
11
|
+
const {isArray} = Array;
|
|
12
|
+
|
|
13
|
+
module.exports.loadPlugins = (options) => {
|
|
14
|
+
check(options);
|
|
15
|
+
|
|
16
|
+
const {pluginNames = [], rules = {}} = options;
|
|
17
|
+
const {
|
|
18
|
+
items,
|
|
19
|
+
loadedRules,
|
|
20
|
+
cookedRules,
|
|
21
|
+
} = prepareRules({
|
|
22
|
+
rules,
|
|
23
|
+
pluginNames,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const plugins = loadPlugins({
|
|
27
|
+
items,
|
|
28
|
+
loadedRules,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
return filterEnabledPlugins({
|
|
32
|
+
plugins,
|
|
33
|
+
cookedRules,
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const splitRule = (rule) => [rule, 'putout'];
|
|
38
|
+
|
|
39
|
+
const parseRule = (rule) => rule
|
|
40
|
+
.replace('import:@putout/plugin-', '')
|
|
41
|
+
.replace('@putout/plugin-', '');
|
|
42
|
+
|
|
43
|
+
const maybeFromTuple = (a) => isArray(a) ? a[1] : a;
|
|
44
|
+
|
|
45
|
+
function loadPlugins({items, loadedRules}) {
|
|
46
|
+
const plugins = [];
|
|
47
|
+
|
|
48
|
+
for (const [rule, itemPlugin] of items) {
|
|
49
|
+
if (!isEnabled(rule, loadedRules))
|
|
50
|
+
continue;
|
|
51
|
+
|
|
52
|
+
checkRule(rule);
|
|
53
|
+
const parsedRule = parseRule(rule);
|
|
54
|
+
|
|
55
|
+
const [name, namespace] = splitRule(rule);
|
|
56
|
+
const plugin = maybeFromTuple(itemPlugin) || loadPlugin({
|
|
57
|
+
name,
|
|
58
|
+
namespace,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
validatePlugin({
|
|
62
|
+
plugin,
|
|
63
|
+
rule,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const {rules} = plugin;
|
|
67
|
+
|
|
68
|
+
if (rules) {
|
|
69
|
+
plugins.push(...extendRules(parsedRule, rules));
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
plugins.push([parsedRule, plugin]);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return plugins;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function extendRules(rule, plugin) {
|
|
80
|
+
const result = [];
|
|
81
|
+
const entries = Object.entries(plugin);
|
|
82
|
+
|
|
83
|
+
for (const [name, plugin] of entries) {
|
|
84
|
+
result.push([`${rule}/${name}`, plugin]);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// add support of esm.sh
|
|
91
|
+
// https://github.com/esm-dev/esm.sh/issues/1045
|
|
92
|
+
function loadPlugin({name, namespace}) {
|
|
93
|
+
const {loadPlugin} = require('../load/load');
|
|
94
|
+
|
|
95
|
+
return loadPlugin({
|
|
96
|
+
name,
|
|
97
|
+
namespace,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const {parsePluginNames} = require('./parse-plugin-names');
|
|
4
|
+
const {enableNestedRules} = require('../rules/parse-rules');
|
|
5
|
+
|
|
6
|
+
const {parseRules, getLoadedRules} = require('../rules');
|
|
7
|
+
|
|
8
|
+
module.exports.prepareRules = ({rules, pluginNames}) => {
|
|
9
|
+
const enabledRules = enableNestedRules(rules);
|
|
10
|
+
const cookedEnabledRules = parseRules(enabledRules);
|
|
11
|
+
const loadedRules = getLoadedRules(cookedEnabledRules);
|
|
12
|
+
const items = parsePluginNames(pluginNames);
|
|
13
|
+
const cookedRules = parseRules(rules);
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
items,
|
|
17
|
+
loadedRules,
|
|
18
|
+
cookedRules,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const {createAsyncLoader} = require('../load/async-loader');
|
|
4
|
+
|
|
5
|
+
const parseProcessorNames = require('../processors/parse-processor-names');
|
|
6
|
+
|
|
7
|
+
const {check} = require('../check');
|
|
8
|
+
|
|
9
|
+
module.exports.loadProcessorsAsync = async (options, load) => {
|
|
10
|
+
check(options);
|
|
11
|
+
|
|
12
|
+
const {processors = []} = options;
|
|
13
|
+
const parsedProcessors = parseProcessorNames(processors);
|
|
14
|
+
const loadProcessor = createAsyncLoader('processor');
|
|
15
|
+
|
|
16
|
+
const list = [];
|
|
17
|
+
|
|
18
|
+
for (const [name, fn] of parsedProcessors) {
|
|
19
|
+
if (fn) {
|
|
20
|
+
list.push(fn);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
list.push(loadProcessor(name, load));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return await Promise.all(list);
|
|
28
|
+
};
|
package/lib/rules/parse-rules.js
CHANGED
|
@@ -24,10 +24,7 @@ const parseState = (rule, value) => {
|
|
|
24
24
|
return value;
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
-
module.exports.parseRules = (rules
|
|
28
|
-
if (enable)
|
|
29
|
-
rules = parseSubrules(rules);
|
|
30
|
-
|
|
27
|
+
module.exports.parseRules = (rules) => {
|
|
31
28
|
const result = [];
|
|
32
29
|
const plugin = null;
|
|
33
30
|
const msg = '';
|
|
@@ -119,7 +116,7 @@ function validateState(rule, value) {
|
|
|
119
116
|
|
|
120
117
|
const cut = (a) => a.split('/')[0];
|
|
121
118
|
|
|
122
|
-
|
|
119
|
+
module.exports.enableNestedRules = (rules) => {
|
|
123
120
|
const newRules = {};
|
|
124
121
|
|
|
125
122
|
for (const [rule, value] of entries(rules)) {
|
|
@@ -130,4 +127,4 @@ function parseSubrules(rules) {
|
|
|
130
127
|
}
|
|
131
128
|
|
|
132
129
|
return newRules;
|
|
133
|
-
}
|
|
130
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const {parsePluginNames} = require('../plugins/parse-plugin-names');
|
|
4
|
+
const {validateRules} = require('../rules');
|
|
5
|
+
const {check} = require('../check');
|
|
6
|
+
|
|
7
|
+
module.exports.validateRulesRelations = (options) => {
|
|
8
|
+
check(options);
|
|
9
|
+
|
|
10
|
+
const {pluginNames = [], rules = {}} = options;
|
|
11
|
+
const items = parsePluginNames(pluginNames);
|
|
12
|
+
|
|
13
|
+
validateRules({
|
|
14
|
+
rules,
|
|
15
|
+
items,
|
|
16
|
+
});
|
|
17
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@putout/engine-loader",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "16.0.0",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
|
|
6
6
|
"description": "load plugins and prepare them to run",
|
|
@@ -39,30 +39,30 @@
|
|
|
39
39
|
"putout": "*"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@putout/eslint-flat": "^
|
|
42
|
+
"@putout/eslint-flat": "^3.0.0",
|
|
43
43
|
"@putout/formatter-progress": "*",
|
|
44
44
|
"@putout/plugin-apply-nullish-coalescing": "*",
|
|
45
45
|
"@putout/plugin-convert-commonjs-to-esm": "*",
|
|
46
46
|
"@putout/plugin-nodejs": "*",
|
|
47
|
-
"@putout/plugin-remove-
|
|
47
|
+
"@putout/plugin-remove-debugger": "*",
|
|
48
48
|
"@putout/processor-javascript": "*",
|
|
49
49
|
"@putout/processor-markdown": "*",
|
|
50
50
|
"c8": "^10.0.0",
|
|
51
51
|
"eslint": "^9.0.0",
|
|
52
52
|
"eslint-plugin-n": "^17.0.0",
|
|
53
|
-
"eslint-plugin-putout": "^
|
|
53
|
+
"eslint-plugin-putout": "^27.0.0",
|
|
54
54
|
"estrace": "*",
|
|
55
55
|
"just-camel-case": "^6.2.0",
|
|
56
|
-
"madrun": "^
|
|
56
|
+
"madrun": "^11.0.0",
|
|
57
57
|
"mock-require": "^3.0.3",
|
|
58
58
|
"montag": "^1.0.0",
|
|
59
59
|
"nodemon": "^3.0.1",
|
|
60
60
|
"putout": "*",
|
|
61
|
-
"supertape": "^
|
|
61
|
+
"supertape": "^11.0.3"
|
|
62
62
|
},
|
|
63
63
|
"license": "MIT",
|
|
64
64
|
"engines": {
|
|
65
|
-
"node": ">=
|
|
65
|
+
"node": ">=20"
|
|
66
66
|
},
|
|
67
67
|
"publishConfig": {
|
|
68
68
|
"access": "public"
|