-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathrequire-event-dispatcher-types.ts
52 lines (51 loc) · 1.41 KB
/
require-event-dispatcher-types.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
import { ReferenceTracker } from '@eslint-community/eslint-utils';
import { createRule } from '../utils';
import { getLangValue } from '../utils/ast-utils';
import type { TSESTree } from '@typescript-eslint/types';
import { getSourceCode } from '../utils/compat';
export default createRule('require-event-dispatcher-types', {
meta: {
docs: {
description: 'require type parameters for `createEventDispatcher`',
category: 'Best Practices',
recommended: false
},
schema: [],
messages: {
missingTypeParameter: `Type parameters missing for the \`createEventDispatcher\` function call.`
},
type: 'suggestion'
},
create(context) {
let isTs = false;
return {
SvelteScriptElement(node) {
const lang = getLangValue(node)?.toLowerCase();
if (lang === 'ts' || lang === 'typescript') {
isTs = true;
}
},
'Program:exit'() {
if (!isTs) {
return;
}
const referenceTracker = new ReferenceTracker(
getSourceCode(context).scopeManager.globalScope!
);
for (const { node: n } of referenceTracker.iterateEsmReferences({
svelte: {
[ReferenceTracker.ESM]: true,
createEventDispatcher: {
[ReferenceTracker.CALL]: true
}
}
})) {
const node = n as TSESTree.CallExpression;
if ((node.typeArguments ?? node.typeParameters) === undefined) {
context.report({ node, messageId: 'missingTypeParameter' });
}
}
}
};
}
});