@putout/engine-runner 13.1.0 → 13.3.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
@@ -239,6 +239,7 @@ of handling variables will most likely will lead to bugs. There is 3 store types
239
239
  - ✅`listStore`;
240
240
  - ✅`store`;
241
241
  - ✅`upstore`;
242
+ - ✅`uplist`;
242
243
 
243
244
  Let's talk about each of them.
244
245
 
@@ -340,6 +341,43 @@ module.exports.traverse = ({push, store}) => ({
340
341
  });
341
342
  ```
342
343
 
344
+ ### `uplist`
345
+
346
+ When you need to update named arrays:
347
+
348
+ ```js
349
+ module.exports.traverse = ({uplist, push}) => ({
350
+ 'const __object = __a.__b': (fullPath) => {
351
+ const {__a, __b} = getTemplateValues(fullPath, 'const __object = __a.__b');
352
+ const path = fullPath.get('declarations.0.init');
353
+ const {uid} = path.scope;
354
+
355
+ if (isIdentifier(__a) || isCallExpression(__a)) {
356
+ const {code} = generate(__a);
357
+ const id = `${uid}-${code}`;
358
+
359
+ return uplist(id, path);
360
+ }
361
+ },
362
+ 'Program': {
363
+ exit: () => {
364
+ for (const items of uplist()) {
365
+ if (items.length < 2)
366
+ continue;
367
+
368
+ const index = items.length - 1;
369
+ const path = items[index];
370
+
371
+ push({
372
+ path,
373
+ items,
374
+ });
375
+ }
376
+ },
377
+ },
378
+ });
379
+ ```
380
+
343
381
  ## Logs
344
382
 
345
383
  To see logs, use:
@@ -4,7 +4,11 @@ const getPath = (item) => item.path || item;
4
4
 
5
5
  module.exports.getPath = getPath;
6
6
  module.exports.getPosition = (path, shebang) => {
7
- const {node} = getPath(path);
7
+ const parsedPath = getPath(path);
8
+
9
+ validatePath(parsedPath);
10
+
11
+ const {node} = parsedPath;
8
12
  const {loc} = node;
9
13
 
10
14
  if (!loc)
@@ -24,3 +28,7 @@ module.exports.getPosition = (path, shebang) => {
24
28
  };
25
29
  };
26
30
 
31
+ function validatePath(path) {
32
+ if (!path.node)
33
+ throw Error(`☝️ Looks like 'push' called without a 'path' argument.`);
34
+ }
@@ -10,6 +10,7 @@ const {
10
10
  listStore,
11
11
  mapStore,
12
12
  upStore,
13
+ upListStore,
13
14
  } = require('./store');
14
15
 
15
16
  const shouldSkip = (a) => !a.parent;
@@ -39,6 +40,7 @@ module.exports = (pluginsToMerge, {fix, shebang, template}) => {
39
40
  store,
40
41
  upstore,
41
42
  listStore,
43
+ uplist,
42
44
  } = getStore(plugin, {
43
45
  fix,
44
46
  rule,
@@ -54,6 +56,7 @@ module.exports = (pluginsToMerge, {fix, shebang, template}) => {
54
56
  store,
55
57
  listStore,
56
58
  upstore,
59
+ uplist,
57
60
  generate,
58
61
  options,
59
62
  });
@@ -90,6 +93,7 @@ function getStore(plugin, {fix, rule, shebang, msg, options}) {
90
93
  const list = listStore();
91
94
  const upstore = upStore();
92
95
  const placesStore = listStore();
96
+ const uplist = upListStore();
93
97
 
94
98
  const push = (path) => {
95
99
  const position = getPosition(path, shebang);
@@ -112,6 +116,7 @@ function getStore(plugin, {fix, rule, shebang, msg, options}) {
112
116
  store.clear();
113
117
  list.clear();
114
118
  upstore.clear();
119
+ uplist.clear();
115
120
  return placesStore.clear();
116
121
  };
117
122
 
@@ -121,6 +126,7 @@ function getStore(plugin, {fix, rule, shebang, msg, options}) {
121
126
  store,
122
127
  listStore: list,
123
128
  upstore,
129
+ uplist,
124
130
  };
125
131
  }
126
132
 
package/lib/store.js CHANGED
@@ -6,6 +6,8 @@ const {
6
6
  assign,
7
7
  } = Object;
8
8
 
9
+ const toArray = (a) => Array.from(a);
10
+
9
11
  module.exports.listStore = (list = []) => {
10
12
  const fn = (...args) => {
11
13
  if (!args.length)
@@ -27,23 +29,39 @@ module.exports.listStore = (list = []) => {
27
29
  };
28
30
 
29
31
  module.exports.mapStore = createStore({
32
+ get(map) {
33
+ return values(map);
34
+ },
30
35
  set(map, name, data) {
31
36
  map[name] = data;
32
37
  },
33
38
  });
34
39
 
35
40
  module.exports.upStore = createStore({
41
+ get(map) {
42
+ return values(map);
43
+ },
36
44
  set(map, name, data) {
37
45
  map[name] = map[name] || {};
38
46
  assign(map[name], data);
39
47
  },
40
48
  });
41
49
 
42
- function createStore({set}) {
50
+ module.exports.upListStore = createStore({
51
+ get(map) {
52
+ return values(map).map(toArray);
53
+ },
54
+ set(map, name, data) {
55
+ map[name] = map[name] || new Set();
56
+ map[name].add(data);
57
+ },
58
+ });
59
+
60
+ function createStore({set, get}) {
43
61
  return (map = {}) => {
44
62
  const fn = (...args) => {
45
63
  if (!args.length)
46
- return values(map);
64
+ return get(map);
47
65
 
48
66
  const [name, data] = args;
49
67
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@putout/engine-runner",
3
- "version": "13.1.0",
3
+ "version": "13.3.0",
4
4
  "type": "commonjs",
5
5
  "author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
6
6
  "description": "run putout plugins",