-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
/
parser.js
62 lines (54 loc) · 1.65 KB
/
parser.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
import { analyze } from '@typescript-eslint/scope-manager/dist/analyze';
import { visitorKeys } from '@typescript-eslint/visitor-keys/dist/visitor-keys';
import { astConverter } from '@typescript-eslint/typescript-estree/dist/ast-converter';
import { extra } from './config.js';
import { CompilerHost } from './CompilerHost';
import { createProgram } from 'typescript';
export function createASTProgram(code, isJsx, compilerOptions, libs) {
const fileName = isJsx ? '/demo.tsx' : '/demo.ts';
const compilerHost = new CompilerHost(libs, isJsx);
compilerHost.files[fileName] = code;
const program = createProgram(
Object.keys(compilerHost.files),
compilerOptions,
compilerHost,
);
const ast = program.getSourceFile(fileName);
return {
ast,
program,
};
}
export function parseForESLint(code, eslintOptions, compilerOptions, libs) {
const isJsx = eslintOptions.ecmaFeatures?.jsx ?? false;
const { ast: tsAst, program } = createASTProgram(
code,
isJsx,
compilerOptions,
libs,
);
const { estree: ast, astMaps } = astConverter(
tsAst,
{ ...extra, code, jsx: isJsx },
true,
);
const services = {
hasFullTypeInformation: true,
program,
esTreeNodeToTSNodeMap: astMaps.esTreeNodeToTSNodeMap,
tsNodeToESTreeNodeMap: astMaps.tsNodeToESTreeNodeMap,
};
const scopeManager = analyze(ast, {
ecmaVersion:
eslintOptions.ecmaVersion === 'latest' ? 1e8 : eslintOptions.ecmaVersion,
globalReturn: eslintOptions.ecmaFeatures?.globalReturn ?? false,
sourceType: eslintOptions.sourceType ?? 'script',
});
return {
ast,
tsAst,
services,
scopeManager,
visitorKeys,
};
}