-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy patheslint-core.ts
92 lines (84 loc) · 2.29 KB
/
eslint-core.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* eslint @typescript-eslint/no-explicit-any: off -- util */
import type { RuleListener, RuleContext, RuleModule } from '../types';
import type { TSESTree } from '@typescript-eslint/types';
import type { AST as SvAST } from 'svelte-eslint-parser';
import { Linter } from 'eslint';
/**
* Define the wrapped core rule.
*/
export function defineWrapperListener(
coreRule: RuleModule,
context: RuleContext,
proxyOptions: {
createListenerProxy?: (listener: RuleListener) => RuleListener;
}
): RuleListener {
const listener = coreRule.create(context as any);
const svelteListener = proxyOptions.createListenerProxy?.(listener) ?? listener;
return svelteListener;
}
/**
* Get the proxy node
*/
export function getProxyNode(node: { type: string }, properties: any): any {
const cache: any = {};
return new Proxy(node, {
get(_t, key) {
if (key in cache) {
return cache[key];
}
if (key in properties) {
return (cache[key] = properties[key]);
}
return (node as any)[key];
}
});
}
/**
* Build the proxy rule listener
*/
export function buildProxyListener(
base: RuleListener,
convertNode: (
node: SvAST.SvelteNode | (TSESTree.Node & { parent: SvAST.SvelteNode | TSESTree.Node | null })
) => any
): RuleListener {
const listeners: RuleListener = {};
for (const [key, listener] of Object.entries(base)) {
listeners[key] = function (...args: [any, any, any]) {
(listener! as any).call(
this,
...args.map((arg) => {
if (
typeof arg === 'object' &&
'type' in arg &&
typeof arg.type === 'string' &&
'range' in arg
) {
return convertNode(arg);
}
return arg;
})
);
};
}
return listeners;
}
let ruleMap: Map<string, RuleModule> | null = null;
/**
* Get the core rule implementation from the rule name
*/
export function getCoreRule(ruleName: string): RuleModule {
try {
const map: Map<string, RuleModule> = ruleMap
? ruleMap
: (ruleMap = (new Linter() as any).getRules());
return map.get(ruleName)!;
} catch {
// getRules() is no longer available in flat config.
}
// eslint-disable-next-line @typescript-eslint/no-require-imports , @typescript-eslint/no-var-requires -- Ignore
const { builtinRules } = require('eslint/use-at-your-own-risk');
ruleMap = builtinRules;
return builtinRules.get(ruleName) || null;
}