@putout/engine-loader 15.4.1 → 16.1.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 -134
- 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/validate-rules.js +4 -2
- package/lib/validators/validate-rules-relations.js +17 -0
- package/package.json +7 -7
package/lib/index.js
CHANGED
|
@@ -1,141 +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 {
|
|
19
|
-
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');
|
|
20
9
|
|
|
10
|
+
module.exports.loadPlugins = loadPlugins;
|
|
21
11
|
module.exports.loadPluginsAsync = loadPluginsAsync;
|
|
22
|
-
module.exports.loadProcessorsAsync =
|
|
23
|
-
check(options);
|
|
24
|
-
|
|
25
|
-
const {processors = []} = options;
|
|
26
|
-
const parsedProcessors = parseProcessorNames(processors);
|
|
27
|
-
const loadProcessor = createAsyncLoader('processor');
|
|
28
|
-
|
|
29
|
-
const list = [];
|
|
30
|
-
|
|
31
|
-
for (const [name, fn] of parsedProcessors) {
|
|
32
|
-
if (fn) {
|
|
33
|
-
list.push(fn);
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
list.push(loadProcessor(name, load));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return await Promise.all(list);
|
|
41
|
-
};
|
|
42
|
-
|
|
12
|
+
module.exports.loadProcessorsAsync = loadProcessorsAsync;
|
|
43
13
|
module.exports.createAsyncLoader = createAsyncLoader;
|
|
44
|
-
|
|
45
|
-
module.exports.validateRules = (options) => {
|
|
46
|
-
check(options);
|
|
47
|
-
|
|
48
|
-
const {pluginNames = [], rules = {}} = options;
|
|
49
|
-
const items = parsePluginNames(pluginNames);
|
|
50
|
-
|
|
51
|
-
validateRules({
|
|
52
|
-
rules,
|
|
53
|
-
items,
|
|
54
|
-
});
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
module.exports.loadPlugins = (options) => {
|
|
58
|
-
check(options);
|
|
59
|
-
|
|
60
|
-
const {pluginNames = [], rules = {}} = options;
|
|
61
|
-
|
|
62
|
-
const enabledRules = enableNestedRules(rules);
|
|
63
|
-
const cookedEnabledRules = parseRules(enabledRules);
|
|
64
|
-
const loadedRules = getLoadedRules(cookedEnabledRules);
|
|
65
|
-
|
|
66
|
-
const items = parsePluginNames(pluginNames);
|
|
67
|
-
const plugins = loadPlugins({
|
|
68
|
-
items,
|
|
69
|
-
loadedRules,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
const cookedRules = parseRules(rules);
|
|
73
|
-
return filterEnabledPlugins({
|
|
74
|
-
plugins,
|
|
75
|
-
cookedRules,
|
|
76
|
-
});
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
const splitRule = (rule) => [rule, 'putout'];
|
|
80
|
-
|
|
81
|
-
const parseRule = (rule) => rule
|
|
82
|
-
.replace('import:@putout/plugin-', '')
|
|
83
|
-
.replace('@putout/plugin-', '');
|
|
84
|
-
|
|
85
|
-
const maybeFromTuple = (a) => isArray(a) ? a[1] : a;
|
|
86
|
-
|
|
87
|
-
function loadPlugins({items, loadedRules}) {
|
|
88
|
-
const plugins = [];
|
|
89
|
-
|
|
90
|
-
for (const [rule, itemPlugin] of items) {
|
|
91
|
-
if (!isEnabled(rule, loadedRules))
|
|
92
|
-
continue;
|
|
93
|
-
|
|
94
|
-
checkRule(rule);
|
|
95
|
-
const parsedRule = parseRule(rule);
|
|
96
|
-
|
|
97
|
-
const [name, namespace] = splitRule(rule);
|
|
98
|
-
const plugin = maybeFromTuple(itemPlugin) || loadPlugin({
|
|
99
|
-
name,
|
|
100
|
-
namespace,
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
validatePlugin({
|
|
104
|
-
plugin,
|
|
105
|
-
rule,
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
const {rules} = plugin;
|
|
109
|
-
|
|
110
|
-
if (rules) {
|
|
111
|
-
plugins.push(...extendRules(parsedRule, rules));
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
plugins.push([parsedRule, plugin]);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return plugins;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function extendRules(rule, plugin) {
|
|
122
|
-
const result = [];
|
|
123
|
-
const entries = Object.entries(plugin);
|
|
124
|
-
|
|
125
|
-
for (const [name, plugin] of entries) {
|
|
126
|
-
result.push([`${rule}/${name}`, plugin]);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return result;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// add support of esm.sh
|
|
133
|
-
// https://github.com/esm-dev/esm.sh/issues/1045
|
|
134
|
-
function loadPlugin({name, namespace}) {
|
|
135
|
-
const {loadPlugin} = require('./load/load');
|
|
136
|
-
|
|
137
|
-
return loadPlugin({
|
|
138
|
-
name,
|
|
139
|
-
namespace,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
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
|
+
};
|
|
@@ -21,21 +21,23 @@ module.exports.validateRules = ({items, rules}) => {
|
|
|
21
21
|
for (const rule of ruleItems) {
|
|
22
22
|
let isName = false;
|
|
23
23
|
let isWithSlash = false;
|
|
24
|
+
let isIncludes = false;
|
|
24
25
|
|
|
25
26
|
for (const [pluginName, plugin = {}] of items) {
|
|
26
27
|
const parsedPluginName = parsePluginName(pluginName);
|
|
27
28
|
|
|
28
29
|
isName = parsedPluginName === rule;
|
|
29
30
|
isWithSlash = parsedPluginName === parseSlashes(rule);
|
|
31
|
+
isIncludes = rule.includes(parsedPluginName);
|
|
30
32
|
|
|
31
33
|
if (isName && plugin.rules)
|
|
32
34
|
throw Error(`Rule '${rule}' cannot be applied to nested plugin '${pluginName}'`);
|
|
33
35
|
|
|
34
|
-
if (isName || isWithSlash)
|
|
36
|
+
if (isName || isWithSlash || isIncludes)
|
|
35
37
|
break;
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
if (!isName && !isWithSlash)
|
|
40
|
+
if (!isName && !isWithSlash && !isIncludes)
|
|
39
41
|
throw Error(`No plugin found for a rule: '${rule}'`);
|
|
40
42
|
}
|
|
41
43
|
};
|
|
@@ -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.1.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": "^28.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"
|