forked from trivago/prettier-plugin-sort-imports
/
get-code-from-ast.ts
59 lines (52 loc) · 1.59 KB
/
get-code-from-ast.ts
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
import generate from '@babel/generator';
import { Directive, InterpreterDirective, Statement, file } from '@babel/types';
import { newLineCharacters } from '../constants';
import { getAllCommentsFromNodes } from './get-all-comments-from-nodes';
import { removeNodesFromOriginalCode } from './remove-nodes-from-original-code';
/**
* This function generate a code string from the passed nodes.
* @param nodes all imports
* @param originalCode
*/
export const getCodeFromAst = (
nodes: Statement[],
directives: Directive[],
originalCode: string,
interpreter?: InterpreterDirective | null,
) => {
const allCommentsFromImports = getAllCommentsFromNodes(nodes);
const nodesToRemoveFromCode = [
...directives,
...nodes,
...allCommentsFromImports,
...(interpreter ? [interpreter] : []),
];
const codeWithoutImportsAndInterpreter = removeNodesFromOriginalCode(
originalCode,
nodesToRemoveFromCode,
);
const newAST = file({
type: 'Program',
body: nodes,
directives,
sourceType: 'module',
interpreter: interpreter,
sourceFile: '',
leadingComments: [],
innerComments: [],
trailingComments: [],
start: 0,
end: 0,
loc: {
start: { line: 0, column: 0 },
end: { line: 0, column: 0 },
},
});
const { code } = generate(newAST);
return (
code.replace(
/"PRETTIER_PLUGIN_SORT_IMPORTS_NEW_LINE";/gi,
newLineCharacters,
) + codeWithoutImportsAndInterpreter.trim()
);
};