@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 CHANGED
@@ -1,11 +1,9 @@
1
- # @putout/engine-runner [![NPM version][NPMIMGURL]][NPMURL] [![Dependency Status][DependencyStatusIMGURL]][DependencyStatusURL]
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
- #### listStore
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 = ({push, listStore}) => ({
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', 'x'];
199
+ ['x', 'x'];
191
200
  // for code
192
- 'debugger; 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
@@ -41,6 +41,8 @@ module.exports.runPlugins = ({ast, shebang, fix, fixCount, plugins, template = r
41
41
 
42
42
  if (!fix || !places.length)
43
43
  return places;
44
+
45
+ replace.clearWatermark(ast);
44
46
  }
45
47
 
46
48
  return places;
@@ -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 {listStore, mapStore} = require('./store');
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
 
@@ -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(a))} ${stringify(keys(b))}`);
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) => {
@@ -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 = (map = {}) => {
31
- const fn = (...args) => {
32
- if (!args.length)
33
- return values(map);
34
-
35
- const [name, data] = args;
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
- if (args.length === 1)
38
- return map[name];
56
+ fn.clear = () => {
57
+ map = {};
58
+ };
39
59
 
40
- if (isObject(data)) {
41
- map[name] = map[name] || {};
42
- assign(map[name], data);
43
- return;
44
- }
60
+ fn.entries = () => {
61
+ return entries(map);
62
+ };
45
63
 
46
- map[name] = data;
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
 
@@ -24,7 +24,7 @@ const {stringify} = JSON;
24
24
  module.exports._log = log;
25
25
 
26
26
  const exclude = ({rule, tmpl, fn, nodesExclude}) => {
27
- if (!nodesExclude.length)
27
+ if (!isFn(fn) || !nodesExclude.length)
28
28
  return {
29
29
  [tmpl]: fn,
30
30
  };
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@putout/engine-runner",
3
- "version": "11.4.1",
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": "http://github.com/coderaiser/putout",
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.0-beta.0",
47
+ "eslint": "^8.0.1",
47
48
  "eslint-plugin-node": "^11.0.0",
48
- "eslint-plugin-putout": "^10.0.0",
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": "*",