@putout/engine-runner 11.6.0 → 12.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/README.md CHANGED
@@ -193,7 +193,7 @@ module.exports.traverse = ({push, listStore}) => ({
193
193
  });
194
194
  ```
195
195
 
196
- `store` is preferred way of keeping array elements, because of caching of `putout`, `traverse` init function called only once, and any other way
196
+ `store` is preferred way of keeping data, because of caching 🐊`putout`, `traverse` init function called only once, and any other way
197
197
  of handling variables will most likely will lead to bugs.
198
198
 
199
199
  #### Store
@@ -225,6 +225,61 @@ module.exports.traverse = ({push, store}) => ({
225
225
  });
226
226
  ```
227
227
 
228
+ #### Upstore
229
+
230
+ When you need to update already saved values, use `upstore`
231
+
232
+ ```js
233
+ module.exports.traverse = ({push, store}) => ({
234
+ TSTypeAliasDeclaration(path) {
235
+ if (path.parentPath.isExportNamedDeclaration())
236
+ return;
237
+
238
+ store(path.node.id.name, {
239
+ path,
240
+ });
241
+ },
242
+
243
+ ObjectProperty(path) {
244
+ const {value} = path.node;
245
+ const {name} = value;
246
+
247
+ store(name, {
248
+ used: true,
249
+ });
250
+ },
251
+
252
+ Program: {
253
+ exit() {
254
+ for (const {path, used} of store()) {
255
+ if (used)
256
+ continue;
257
+
258
+ push(path);
259
+ }
260
+ },
261
+ },
262
+ });
263
+ ```
264
+
265
+ #### ListStore
266
+
267
+ When you need to track list of elements, use `listStore`:
268
+
269
+ ```
270
+ module.exports.traverse = ({push, listStore}) => ({
271
+ ImportDeclaration(path) {
272
+ listStore(path);
273
+ },
274
+
275
+ Program: {
276
+ exit: () => {
277
+ processImports(push, listStore());
278
+ },
279
+ },
280
+ });
281
+ ```
282
+
228
283
  ### Finder
229
284
 
230
285
  `Find plugins` gives you all the control over traversing, but it's the slowest format.
@@ -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,6 +37,7 @@ 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,
@@ -48,6 +53,7 @@ module.exports = (pluginsToMerge, {fix, shebang, template}) => {
48
53
  push,
49
54
  store,
50
55
  listStore,
56
+ upstore,
51
57
  generate,
52
58
  options,
53
59
  });
@@ -82,6 +88,7 @@ module.exports = (pluginsToMerge, {fix, shebang, template}) => {
82
88
  function getStore(plugin, {fix, rule, shebang, msg, options}) {
83
89
  const store = mapStore();
84
90
  const list = listStore();
91
+ const upstore = upStore();
85
92
  const placesStore = listStore();
86
93
 
87
94
  const push = (path) => {
@@ -104,6 +111,7 @@ function getStore(plugin, {fix, rule, shebang, msg, options}) {
104
111
  const pull = () => {
105
112
  store.clear();
106
113
  list.clear();
114
+ upstore.clear();
107
115
  return placesStore.clear();
108
116
  };
109
117
 
@@ -112,6 +120,7 @@ function getStore(plugin, {fix, rule, shebang, msg, options}) {
112
120
  pull,
113
121
  store,
114
122
  listStore: list,
123
+ upstore,
115
124
  };
116
125
  }
117
126
 
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,9 @@
1
1
  {
2
2
  "name": "@putout/engine-runner",
3
- "version": "11.6.0",
3
+ "version": "12.0.0",
4
4
  "author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
5
5
  "description": "run putout plugins",
6
- "homepage": "https://github.com/coderaiser/putout/tree/master/packages/engine-runner",
6
+ "homepage": "https://github.com/coderaiser/putout/tree/master/packages/engine-runner#readme",
7
7
  "main": "lib/index.js",
8
8
  "release": false,
9
9
  "tag": false,
@@ -49,6 +49,7 @@
49
49
  "just-camel-case": "^4.0.2",
50
50
  "lerna": "^4.0.0",
51
51
  "madrun": "^8.0.1",
52
+ "mock-require": "^3.0.3",
52
53
  "montag": "^1.0.0",
53
54
  "nodemon": "^2.0.1",
54
55
  "putout": "*",