@putout/engine-runner 11.4.1 → 12.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/README.md +57 -16
- package/lib/index.js +2 -0
- package/lib/merge-visitors.js +15 -4
- package/lib/replace/index.js +5 -1
- package/lib/replace/watermark.js +3 -0
- package/lib/run-fix.js +4 -3
- package/lib/store.js +34 -26
- package/lib/template/index.js +1 -1
- package/package.json +6 -4
package/README.md
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
# @putout/engine-runner [![NPM version][NPMIMGURL]][NPMURL]
|
|
1
|
+
# @putout/engine-runner [![NPM version][NPMIMGURL]][NPMURL]
|
|
2
2
|
|
|
3
3
|
[NPMIMGURL]: https://img.shields.io/npm/v/@putout/engine-runner.svg?style=flat&longCache=true
|
|
4
4
|
[NPMURL]: https://npmjs.org/package/@putout/engine-runner"npm"
|
|
5
|
-
[DependencyStatusURL]: https://david-dm.org/coderaiser/putout?path=packages/engine-runner
|
|
6
|
-
[DependencyStatusIMGURL]: https://david-dm.org/coderaiser/putout.svg?path=packages/engine-runner
|
|
7
5
|
|
|
8
|
-
Run putout plugins.
|
|
6
|
+
Run 🐊[`Putout`](https://github.com/coderaiser/putout) plugins.
|
|
9
7
|
|
|
10
8
|
## Install
|
|
11
9
|
|
|
@@ -161,7 +159,7 @@ Where `__` can be any node. All this possible with help of [@putout/compare](htt
|
|
|
161
159
|
```js
|
|
162
160
|
module.exports.report = () => 'debugger statement should not be used';
|
|
163
161
|
|
|
164
|
-
module.exports.fix = (path) => {
|
|
162
|
+
module.exports.fix = (path, {options}) => {
|
|
165
163
|
path.remove();
|
|
166
164
|
};
|
|
167
165
|
|
|
@@ -172,34 +170,40 @@ module.exports.traverse = ({push}) => ({
|
|
|
172
170
|
});
|
|
173
171
|
```
|
|
174
172
|
|
|
175
|
-
####
|
|
173
|
+
#### Storages
|
|
174
|
+
|
|
175
|
+
Storages is preferred way of keeping data 🐊`Putout`, `traverse` init function called only once, and any other way
|
|
176
|
+
of handling variables will most likely will lead to bugs.
|
|
177
|
+
|
|
178
|
+
##### listStore
|
|
176
179
|
|
|
177
|
-
To keep things during traverse in a safe way `listStore` can be used
|
|
180
|
+
To keep things and save them as a list during traverse in a safe way `listStore` can be used for code:
|
|
181
|
+
|
|
182
|
+
```js
|
|
183
|
+
debugger;
|
|
184
|
+
const hello = '';
|
|
185
|
+
debugger;
|
|
186
|
+
const world = '';
|
|
187
|
+
```
|
|
178
188
|
|
|
179
189
|
```js
|
|
180
|
-
module.exports.traverse = ({
|
|
190
|
+
module.exports.traverse = ({listStore}) => ({
|
|
181
191
|
'debugger'(path) {
|
|
182
192
|
listStore('x');
|
|
183
|
-
push(path);
|
|
184
193
|
},
|
|
185
194
|
|
|
186
195
|
Program: {
|
|
187
196
|
exit() {
|
|
188
197
|
console.log(listStore());
|
|
189
198
|
// returns
|
|
190
|
-
['x', 'x'
|
|
199
|
+
['x', 'x'];
|
|
191
200
|
// for code
|
|
192
|
-
'debugger; debugger
|
|
201
|
+
'debugger; debugger';
|
|
193
202
|
},
|
|
194
203
|
},
|
|
195
204
|
});
|
|
196
205
|
```
|
|
197
206
|
|
|
198
|
-
`store` is preferred way of keeping array elements, because of caching of `putout`, `traverse` init function called only once, and any other way
|
|
199
|
-
of handling variables will most likely will lead to bugs.
|
|
200
|
-
|
|
201
|
-
#### Store
|
|
202
|
-
|
|
203
207
|
When you need `key-value` storage `store` can be used.
|
|
204
208
|
|
|
205
209
|
```js
|
|
@@ -227,6 +231,43 @@ module.exports.traverse = ({push, store}) => ({
|
|
|
227
231
|
});
|
|
228
232
|
```
|
|
229
233
|
|
|
234
|
+
#### Upstore
|
|
235
|
+
|
|
236
|
+
When you need to update already saved values, use `upstore`
|
|
237
|
+
|
|
238
|
+
```js
|
|
239
|
+
module.exports.traverse = ({push, store}) => ({
|
|
240
|
+
TSTypeAliasDeclaration(path) {
|
|
241
|
+
if (path.parentPath.isExportNamedDeclaration())
|
|
242
|
+
return;
|
|
243
|
+
|
|
244
|
+
store(path.node.id.name, {
|
|
245
|
+
path,
|
|
246
|
+
});
|
|
247
|
+
},
|
|
248
|
+
|
|
249
|
+
ObjectProperty(path) {
|
|
250
|
+
const {value} = path.node;
|
|
251
|
+
const {name} = value;
|
|
252
|
+
|
|
253
|
+
store(name, {
|
|
254
|
+
used: true,
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
|
|
258
|
+
Program: {
|
|
259
|
+
exit() {
|
|
260
|
+
for (const {path, used} of store()) {
|
|
261
|
+
if (used)
|
|
262
|
+
continue;
|
|
263
|
+
|
|
264
|
+
push(path);
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
```
|
|
270
|
+
|
|
230
271
|
### Finder
|
|
231
272
|
|
|
232
273
|
`Find plugins` gives you all the control over traversing, but it's the slowest format.
|
package/lib/index.js
CHANGED
package/lib/merge-visitors.js
CHANGED
|
@@ -6,7 +6,11 @@ const {generate} = require('@putout/engine-parser');
|
|
|
6
6
|
const runFix = require('./run-fix');
|
|
7
7
|
const {getPosition} = require('./get-position');
|
|
8
8
|
const maybeArray = require('./maybe-array');
|
|
9
|
-
const {
|
|
9
|
+
const {
|
|
10
|
+
listStore,
|
|
11
|
+
mapStore,
|
|
12
|
+
upStore,
|
|
13
|
+
} = require('./store');
|
|
10
14
|
|
|
11
15
|
const shouldSkip = (a) => !a.parent;
|
|
12
16
|
const {merge} = traverse.visitors;
|
|
@@ -16,7 +20,7 @@ const parse = (name, plugin, options) => {
|
|
|
16
20
|
const list = [];
|
|
17
21
|
|
|
18
22
|
if (plugin[name])
|
|
19
|
-
list.push(...plugin[name]());
|
|
23
|
+
list.push(...maybeArray(plugin[name]()));
|
|
20
24
|
|
|
21
25
|
if (options[name])
|
|
22
26
|
list.push(...maybeArray(options[name]));
|
|
@@ -33,12 +37,14 @@ module.exports = (pluginsToMerge, {fix, shebang, template}) => {
|
|
|
33
37
|
push,
|
|
34
38
|
pull,
|
|
35
39
|
store,
|
|
40
|
+
upstore,
|
|
36
41
|
listStore,
|
|
37
42
|
} = getStore(plugin, {
|
|
38
43
|
fix,
|
|
39
44
|
rule,
|
|
40
45
|
shebang,
|
|
41
46
|
msg,
|
|
47
|
+
options,
|
|
42
48
|
});
|
|
43
49
|
|
|
44
50
|
pushed[rule] = pull;
|
|
@@ -47,6 +53,7 @@ module.exports = (pluginsToMerge, {fix, shebang, template}) => {
|
|
|
47
53
|
push,
|
|
48
54
|
store,
|
|
49
55
|
listStore,
|
|
56
|
+
upstore,
|
|
50
57
|
generate,
|
|
51
58
|
options,
|
|
52
59
|
});
|
|
@@ -78,16 +85,17 @@ module.exports = (pluginsToMerge, {fix, shebang, template}) => {
|
|
|
78
85
|
};
|
|
79
86
|
};
|
|
80
87
|
|
|
81
|
-
function getStore(plugin, {fix, rule, shebang, msg}) {
|
|
88
|
+
function getStore(plugin, {fix, rule, shebang, msg, options}) {
|
|
82
89
|
const store = mapStore();
|
|
83
90
|
const list = listStore();
|
|
91
|
+
const upstore = upStore();
|
|
84
92
|
const placesStore = listStore();
|
|
85
93
|
|
|
86
94
|
const push = (path) => {
|
|
87
95
|
const position = getPosition(path, shebang);
|
|
88
96
|
const message = msg || plugin.report(path);
|
|
89
97
|
|
|
90
|
-
placesStore
|
|
98
|
+
placesStore({
|
|
91
99
|
message,
|
|
92
100
|
position,
|
|
93
101
|
});
|
|
@@ -96,12 +104,14 @@ function getStore(plugin, {fix, rule, shebang, msg}) {
|
|
|
96
104
|
path,
|
|
97
105
|
rule,
|
|
98
106
|
position,
|
|
107
|
+
options,
|
|
99
108
|
});
|
|
100
109
|
};
|
|
101
110
|
|
|
102
111
|
const pull = () => {
|
|
103
112
|
store.clear();
|
|
104
113
|
list.clear();
|
|
114
|
+
upstore.clear();
|
|
105
115
|
return placesStore.clear();
|
|
106
116
|
};
|
|
107
117
|
|
|
@@ -110,6 +120,7 @@ function getStore(plugin, {fix, rule, shebang, msg}) {
|
|
|
110
120
|
pull,
|
|
111
121
|
store,
|
|
112
122
|
listStore: list,
|
|
123
|
+
upstore,
|
|
113
124
|
};
|
|
114
125
|
}
|
|
115
126
|
|
package/lib/replace/index.js
CHANGED
|
@@ -26,7 +26,7 @@ const isObj = (a) => typeof a === 'object';
|
|
|
26
26
|
const validateTemplateValues = (a, b) => {
|
|
27
27
|
for (const key of keys(a)) {
|
|
28
28
|
if (!b[key])
|
|
29
|
-
throw Error(`☝️ Looks like template values not linked: ${stringify(keys(
|
|
29
|
+
throw Error(`☝️ Looks like template values not linked: ${stringify(keys(b))} -> ${stringify(keys(a))}`);
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
32
|
|
|
@@ -61,6 +61,10 @@ module.exports = ({rule, plugin, msg, options}) => {
|
|
|
61
61
|
};
|
|
62
62
|
};
|
|
63
63
|
|
|
64
|
+
module.exports.clearWatermark = (ast) => {
|
|
65
|
+
delete ast.program[watermark.REPLACE_WATERMARK];
|
|
66
|
+
};
|
|
67
|
+
|
|
64
68
|
const isFn = (a) => typeof a === 'function';
|
|
65
69
|
|
|
66
70
|
const fix = (from, to, path) => {
|
package/lib/replace/watermark.js
CHANGED
|
@@ -30,6 +30,8 @@ module.exports = (from, to, path) => {
|
|
|
30
30
|
};
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
module.exports.REPLACE_WATERMARK = name;
|
|
34
|
+
|
|
33
35
|
module.exports.create = create;
|
|
34
36
|
function create(from, to, path) {
|
|
35
37
|
const watermark = `${from} -> ${to}`;
|
|
@@ -52,6 +54,7 @@ function init({path, program}) {
|
|
|
52
54
|
module.exports.add = add;
|
|
53
55
|
function add({path, program, watermark, highWatermark}) {
|
|
54
56
|
init({path, program});
|
|
57
|
+
|
|
55
58
|
path.node[name].add(watermark);
|
|
56
59
|
program.node[name].add(highWatermark);
|
|
57
60
|
}
|
package/lib/run-fix.js
CHANGED
|
@@ -4,8 +4,8 @@ const tryCatch = require('try-catch');
|
|
|
4
4
|
const debug = require('debug')('putout:runner:fix');
|
|
5
5
|
const {enabled} = debug;
|
|
6
6
|
|
|
7
|
-
const tryToFix = (fix, {path, position}) => {
|
|
8
|
-
const [e] = tryCatch(fix, path);
|
|
7
|
+
const tryToFix = (fix, {path, position, options}) => {
|
|
8
|
+
const [e] = tryCatch(fix, path, {options});
|
|
9
9
|
|
|
10
10
|
if (!e)
|
|
11
11
|
return;
|
|
@@ -15,7 +15,7 @@ const tryToFix = (fix, {path, position}) => {
|
|
|
15
15
|
throw e;
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
-
module.exports = (is, fix, {path, rule, position}) => {
|
|
18
|
+
module.exports = (is, fix, {path, rule, position, options}) => {
|
|
19
19
|
if (!is)
|
|
20
20
|
return;
|
|
21
21
|
|
|
@@ -24,6 +24,7 @@ module.exports = (is, fix, {path, rule, position}) => {
|
|
|
24
24
|
tryToFix(fix, {
|
|
25
25
|
path,
|
|
26
26
|
position,
|
|
27
|
+
options,
|
|
27
28
|
});
|
|
28
29
|
};
|
|
29
30
|
|
package/lib/store.js
CHANGED
|
@@ -5,7 +5,6 @@ const {
|
|
|
5
5
|
entries,
|
|
6
6
|
assign,
|
|
7
7
|
} = Object;
|
|
8
|
-
const isObject = (a) => typeof a === 'object';
|
|
9
8
|
|
|
10
9
|
module.exports.listStore = (list = []) => {
|
|
11
10
|
const fn = (...args) => {
|
|
@@ -27,33 +26,42 @@ module.exports.listStore = (list = []) => {
|
|
|
27
26
|
return fn;
|
|
28
27
|
};
|
|
29
28
|
|
|
30
|
-
module.exports.mapStore = (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
module.exports.mapStore = createStore({
|
|
30
|
+
set(map, name, data) {
|
|
31
|
+
map[name] = data;
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
module.exports.upStore = createStore({
|
|
36
|
+
set(map, name, data) {
|
|
37
|
+
map[name] = map[name] || {};
|
|
38
|
+
assign(map[name], data);
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
function createStore({set}) {
|
|
43
|
+
return (map = {}) => {
|
|
44
|
+
const fn = (...args) => {
|
|
45
|
+
if (!args.length)
|
|
46
|
+
return values(map);
|
|
47
|
+
|
|
48
|
+
const [name, data] = args;
|
|
49
|
+
|
|
50
|
+
if (args.length === 1)
|
|
51
|
+
return map[name];
|
|
52
|
+
|
|
53
|
+
set(map, name, data);
|
|
54
|
+
};
|
|
36
55
|
|
|
37
|
-
|
|
38
|
-
|
|
56
|
+
fn.clear = () => {
|
|
57
|
+
map = {};
|
|
58
|
+
};
|
|
39
59
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
60
|
+
fn.entries = () => {
|
|
61
|
+
return entries(map);
|
|
62
|
+
};
|
|
45
63
|
|
|
46
|
-
|
|
64
|
+
return fn;
|
|
47
65
|
};
|
|
48
|
-
|
|
49
|
-
fn.clear = () => {
|
|
50
|
-
map = {};
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
fn.entries = () => {
|
|
54
|
-
return entries(map);
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
return fn;
|
|
58
|
-
};
|
|
66
|
+
}
|
|
59
67
|
|
package/lib/template/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@putout/engine-runner",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "12.1.0",
|
|
4
|
+
"type": "commonjs",
|
|
4
5
|
"author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
|
|
5
6
|
"description": "run putout plugins",
|
|
6
|
-
"homepage": "
|
|
7
|
+
"homepage": "https://github.com/coderaiser/putout/tree/master/packages/engine-runner#readme",
|
|
7
8
|
"main": "lib/index.js",
|
|
8
9
|
"release": false,
|
|
9
10
|
"tag": false,
|
|
@@ -43,12 +44,13 @@
|
|
|
43
44
|
"@babel/plugin-codemod-optional-catch-binding": "^7.7.4",
|
|
44
45
|
"@cloudcmd/stub": "^3.0.0",
|
|
45
46
|
"c8": "^7.5.0",
|
|
46
|
-
"eslint": "^8.0.
|
|
47
|
+
"eslint": "^8.0.1",
|
|
47
48
|
"eslint-plugin-node": "^11.0.0",
|
|
48
|
-
"eslint-plugin-putout": "^
|
|
49
|
+
"eslint-plugin-putout": "^12.0.0",
|
|
49
50
|
"just-camel-case": "^4.0.2",
|
|
50
51
|
"lerna": "^4.0.0",
|
|
51
52
|
"madrun": "^8.0.1",
|
|
53
|
+
"mock-require": "^3.0.3",
|
|
52
54
|
"montag": "^1.0.0",
|
|
53
55
|
"nodemon": "^2.0.1",
|
|
54
56
|
"putout": "*",
|