From c97a85c2b2588ea599d53e236f317f36b0a4351d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 1 Feb 2023 21:52:02 +0100 Subject: [PATCH 1/9] test(require-event-dispatcher-types): Added tests --- .../invalid/no-types01-input.svelte | 6 ++++++ .../valid/has-types01-input.svelte | 8 ++++++++ .../valid/non-svelte-dispatcher01-input.svelte | 5 +++++ .../src/rules/require-event-dispatcher-types.ts | 16 ++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-input.svelte create mode 100644 tests/fixtures/rules/require-event-dispatcher-types/valid/has-types01-input.svelte create mode 100644 tests/fixtures/rules/require-event-dispatcher-types/valid/non-svelte-dispatcher01-input.svelte create mode 100644 tests/src/rules/require-event-dispatcher-types.ts diff --git a/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-input.svelte b/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-input.svelte new file mode 100644 index 000000000..0809f5c1e --- /dev/null +++ b/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/tests/fixtures/rules/require-event-dispatcher-types/valid/has-types01-input.svelte b/tests/fixtures/rules/require-event-dispatcher-types/valid/has-types01-input.svelte new file mode 100644 index 000000000..754261a91 --- /dev/null +++ b/tests/fixtures/rules/require-event-dispatcher-types/valid/has-types01-input.svelte @@ -0,0 +1,8 @@ + diff --git a/tests/fixtures/rules/require-event-dispatcher-types/valid/non-svelte-dispatcher01-input.svelte b/tests/fixtures/rules/require-event-dispatcher-types/valid/non-svelte-dispatcher01-input.svelte new file mode 100644 index 000000000..cec23a188 --- /dev/null +++ b/tests/fixtures/rules/require-event-dispatcher-types/valid/non-svelte-dispatcher01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/tests/src/rules/require-event-dispatcher-types.ts b/tests/src/rules/require-event-dispatcher-types.ts new file mode 100644 index 000000000..a9ea97e41 --- /dev/null +++ b/tests/src/rules/require-event-dispatcher-types.ts @@ -0,0 +1,16 @@ +import { RuleTester } from "eslint" +import rule from "../../../src/rules/require-event-dispatcher-types" +import { loadTestCases } from "../../utils/utils" + +const tester = new RuleTester({ + parserOptions: { + ecmaVersion: 2020, + sourceType: "module", + }, +}) + +tester.run( + "require-event-dispatcher-types", + rule as any, + loadTestCases("require-event-dispatcher-types"), +) From 57c4b9cc915918a77a4d90987be5f2b2d764ddc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 1 Feb 2023 22:17:07 +0100 Subject: [PATCH 2/9] feat(require-event-dispatcher-types): Added the rule skeleton --- src/rules/require-event-dispatcher-types.ts | 22 +++++++++++++++++++++ src/utils/rules.ts | 2 ++ 2 files changed, 24 insertions(+) create mode 100644 src/rules/require-event-dispatcher-types.ts diff --git a/src/rules/require-event-dispatcher-types.ts b/src/rules/require-event-dispatcher-types.ts new file mode 100644 index 000000000..aaab719aa --- /dev/null +++ b/src/rules/require-event-dispatcher-types.ts @@ -0,0 +1,22 @@ +import { createRule } from "../utils" + +export default createRule("require-event-dispatcher-types", { + meta: { + docs: { + description: "require typed event dispatcher", + category: "Best Practices", + recommended: false, + }, + schema: [], + messages: { + storeDefaultValue: `Always add type arguments when calling the createEventDispatcher function.`, + }, + type: "suggestion", + }, + create() { + return { + Program() { + }, + } + }, +}) diff --git a/src/utils/rules.ts b/src/utils/rules.ts index 5a9a8224e..ceba1f76b 100644 --- a/src/utils/rules.ts +++ b/src/utils/rules.ts @@ -36,6 +36,7 @@ import noUselessMustaches from "../rules/no-useless-mustaches" import preferClassDirective from "../rules/prefer-class-directive" import preferDestructuredStoreProps from "../rules/prefer-destructured-store-props" import preferStyleDirective from "../rules/prefer-style-directive" +import requireEventDispatcherTypes from "../rules/require-event-dispatcher-types" import requireOptimizedStyleAttribute from "../rules/require-optimized-style-attribute" import requireStoreCallbacksUseSetParam from "../rules/require-store-callbacks-use-set-param" import requireStoreReactiveAccess from "../rules/require-store-reactive-access" @@ -86,6 +87,7 @@ export const rules = [ preferClassDirective, preferDestructuredStoreProps, preferStyleDirective, + requireEventDispatcherTypes, requireOptimizedStyleAttribute, requireStoreCallbacksUseSetParam, requireStoreReactiveAccess, From 058d0aa66a8f1507f6bc86289fe1795dffd1f066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Thu, 2 Feb 2023 00:02:47 +0100 Subject: [PATCH 3/9] feat(require-event-dispatcher-types): added the rule implementation --- .../svelte-createEventDispatcher.ts | 20 +++++++++++++++++++ src/rules/require-event-dispatcher-types.ts | 10 ++++++++-- .../invalid/no-types01-errors.yaml | 5 +++++ .../invalid/no-types01-input.svelte | 3 +-- .../valid/has-types01-input.svelte | 2 +- 5 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 src/rules/reference-helpers/svelte-createEventDispatcher.ts create mode 100644 tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-errors.yaml diff --git a/src/rules/reference-helpers/svelte-createEventDispatcher.ts b/src/rules/reference-helpers/svelte-createEventDispatcher.ts new file mode 100644 index 000000000..523f64e10 --- /dev/null +++ b/src/rules/reference-helpers/svelte-createEventDispatcher.ts @@ -0,0 +1,20 @@ +import type { TSESTree } from "@typescript-eslint/types" +import { ReferenceTracker } from "eslint-utils" +import type { RuleContext } from "../../types" + +/** Extract 'svelte createEventDispatcher' references */ +export function* extractCreateEventDispatcherReferences( + context: RuleContext, +): Generator { + const referenceTracker = new ReferenceTracker(context.getScope()) + for (const { node } of referenceTracker.iterateEsmReferences({ + svelte: { + [ReferenceTracker.ESM]: true, + createEventDispatcher: { + [ReferenceTracker.CALL]: true, + }, + }, + })) { + yield node as TSESTree.CallExpression + } +} diff --git a/src/rules/require-event-dispatcher-types.ts b/src/rules/require-event-dispatcher-types.ts index aaab719aa..89c0dd6e9 100644 --- a/src/rules/require-event-dispatcher-types.ts +++ b/src/rules/require-event-dispatcher-types.ts @@ -1,4 +1,5 @@ import { createRule } from "../utils" +import { extractCreateEventDispatcherReferences } from "./reference-helpers/svelte-createEventDispatcher" export default createRule("require-event-dispatcher-types", { meta: { @@ -9,13 +10,18 @@ export default createRule("require-event-dispatcher-types", { }, schema: [], messages: { - storeDefaultValue: `Always add type arguments when calling the createEventDispatcher function.`, + missingTypeParameter: `Always specify type parameters when calling the createEventDispatcher function.`, }, type: "suggestion", }, - create() { + create(context) { return { Program() { + for (const node of extractCreateEventDispatcherReferences(context)) { + if (node.typeParameters === undefined) { + context.report({ node, messageId: "missingTypeParameter" }) + } + } }, } }, diff --git a/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-errors.yaml b/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-errors.yaml new file mode 100644 index 000000000..986eb46db --- /dev/null +++ b/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-errors.yaml @@ -0,0 +1,5 @@ +- message: Always specify type parameters when calling the createEventDispatcher + function. + line: 4 + column: 20 + suggestions: null diff --git a/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-input.svelte b/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-input.svelte index 0809f5c1e..64c45eb98 100644 --- a/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-input.svelte +++ b/tests/fixtures/rules/require-event-dispatcher-types/invalid/no-types01-input.svelte @@ -1,6 +1,5 @@ diff --git a/tests/fixtures/rules/require-event-dispatcher-types/valid/has-types01-input.svelte b/tests/fixtures/rules/require-event-dispatcher-types/valid/has-types01-input.svelte index 754261a91..167bfde74 100644 --- a/tests/fixtures/rules/require-event-dispatcher-types/valid/has-types01-input.svelte +++ b/tests/fixtures/rules/require-event-dispatcher-types/valid/has-types01-input.svelte @@ -1,7 +1,7 @@ +``` + + + +## :wrench: Options + +Nothing. + +## :rocket: Version + +This rule was introduced in eslint-plugin-svelte v2.16.0 + +## :mag: Implementation + +- [Rule source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/src/rules/require-event-dispatcher-types.ts) +- [Test source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/tests/src/rules/require-event-dispatcher-types.ts) diff --git a/src/rules/require-event-dispatcher-types.ts b/src/rules/require-event-dispatcher-types.ts index 89c0dd6e9..9150ad453 100644 --- a/src/rules/require-event-dispatcher-types.ts +++ b/src/rules/require-event-dispatcher-types.ts @@ -4,13 +4,13 @@ import { extractCreateEventDispatcherReferences } from "./reference-helpers/svel export default createRule("require-event-dispatcher-types", { meta: { docs: { - description: "require typed event dispatcher", + description: "require type parameters for createEventDispatcher", category: "Best Practices", recommended: false, }, schema: [], messages: { - missingTypeParameter: `Always specify type parameters when calling the createEventDispatcher function.`, + missingTypeParameter: `Type parameters missing for the createEventDispatcher function call.`, }, type: "suggestion", }, diff --git a/tests/fixtures/rules/require-event-dispatcher-types/valid/non-svelte-dispatcher01-input.svelte b/tests/fixtures/rules/require-event-dispatcher-types/valid/non-svelte-dispatcher01-input.svelte index cec23a188..e025c70a4 100644 --- a/tests/fixtures/rules/require-event-dispatcher-types/valid/non-svelte-dispatcher01-input.svelte +++ b/tests/fixtures/rules/require-event-dispatcher-types/valid/non-svelte-dispatcher01-input.svelte @@ -1,4 +1,4 @@ - From 6f65dceff515208bd54524bf3bf748254a7f4f91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Fri, 3 Feb 2023 18:34:14 +0100 Subject: [PATCH 9/9] test(require-event-dispatcher-types): added a test with import alias --- .../invalid/import-alias01-errors.yaml | 4 ++++ .../invalid/import-alias01-input.svelte | 5 +++++ 2 files changed, 9 insertions(+) create mode 100644 tests/fixtures/rules/require-event-dispatcher-types/invalid/import-alias01-errors.yaml create mode 100644 tests/fixtures/rules/require-event-dispatcher-types/invalid/import-alias01-input.svelte diff --git a/tests/fixtures/rules/require-event-dispatcher-types/invalid/import-alias01-errors.yaml b/tests/fixtures/rules/require-event-dispatcher-types/invalid/import-alias01-errors.yaml new file mode 100644 index 000000000..50e84479d --- /dev/null +++ b/tests/fixtures/rules/require-event-dispatcher-types/invalid/import-alias01-errors.yaml @@ -0,0 +1,4 @@ +- message: Type parameters missing for the createEventDispatcher function call. + line: 4 + column: 20 + suggestions: null diff --git a/tests/fixtures/rules/require-event-dispatcher-types/invalid/import-alias01-input.svelte b/tests/fixtures/rules/require-event-dispatcher-types/invalid/import-alias01-input.svelte new file mode 100644 index 000000000..6c57eeba5 --- /dev/null +++ b/tests/fixtures/rules/require-event-dispatcher-types/invalid/import-alias01-input.svelte @@ -0,0 +1,5 @@ +