-
-
Notifications
You must be signed in to change notification settings - Fork 38
/
index.js
84 lines (67 loc) 路 2.08 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
'use strict';
const {transformFromAstSync} = require('@babel/core');
const print = require('../print');
const getPositions = require('../get-positions-by-diff');
const getMessage = (a) => a
.replace(/@babel\/plugin-|babel-plugin-/, '')
.replace(/-/g, ' ');
module.exports = ({fix, ast, babelPlugins}) => {
const places = [];
if (!babelPlugins.length)
return places;
let oldCode = print(ast);
for (const plugin of babelPlugins) {
transform(ast, '', plugin);
// that's right, transform changes AST
const newCode = print(ast);
if (!fix && newCode !== oldCode) {
const positions = getPositions(oldCode, newCode);
const rule = `babel/${plugin}`;
const message = getMessage(plugin);
oldCode = newCode;
for (const position of positions)
places.push({
rule,
message,
position,
});
}
}
return places;
};
// transformFromAstSync makes a deep copy of AST in a bad for recast way
// (recast makes broken source code from this AST-copy, because keeps source information
// in object prototypes).
//
// Anyways if we just could use a "deepCopy" flag code would look like this:
//
// const {ast} = babel.transformFromAstSync(parsedAst, sourceCode, {
// ast: true,
// deepCopy: false,
// });
// https://github.com/babel/babel/issues/10231
// https://babeljs.io/docs/en/next/babel-core.html#transformfromastsync
function transform(ast, code, name) {
transformFromAstSync(ast, code, {
ast: true,
code: false,
// remove setAST plugin, when deepCopy flag will be supported
// deepCopy: false,
plugins: [
name,
[setAst, {
ast,
}],
],
});
return ast;
}
function setAst(babel, {ast}) {
return {
visitor: {
Program(path) {
path.replaceWith(ast.program);
},
},
};
}