Skip to content
This repository was archived by the owner on Jul 11, 2024. It is now read-only.

feat: add fixer for no-typed-store rule #71

Merged
merged 1 commit into from
Feb 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions src/rules/no-typed-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import { typedStore, docsUrl } from '../utils'
export const ruleName = 'no-typed-store'

export const messageId = 'noTypedStore'
export type MessageIds = typeof messageId
export const noTypedStoreSuggest = 'noTypedStoreSuggest'
export type MessageIds = typeof messageId | typeof noTypedStoreSuggest

type Options = []

Expand All @@ -18,18 +19,31 @@ export default ESLintUtils.RuleCreator(docsUrl)<Options, MessageIds>({
description: 'Store should not be typed',
recommended: 'error',
},
fixable: 'code',
schema: [],
messages: {
[messageId]:
'Store should not be typed, use `Store` (without generic) instead.',
[noTypedStoreSuggest]: 'Remove generic from `Store`.',
},
},
defaultOptions: [],
create: (context) => {
return {
[typedStore](node: TSESTree.TSTypeReference) {
[typedStore]({
typeParameters,
}: TSESTree.TSTypeReference & {
typeParameters: TSESTree.TSTypeParameterInstantiation
}) {
context.report({
node,
// TODO: Turn it into a fix once https://github.com/ngrx/platform/issues/2780 is fixed.
suggest: [
{
fix: (fixer) => fixer.remove(typeParameters),
messageId: noTypedStoreSuggest,
},
],
node: typeParameters,
messageId,
})
},
Expand Down
149 changes: 116 additions & 33 deletions tests/rules/no-typed-store.test.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,133 @@
import { stripIndent } from 'common-tags'
import { fromFixture } from 'eslint-etc'
import rule, { ruleName, messageId } from '../../src/rules/no-typed-store'
import rule, {
messageId,
noTypedStoreSuggest,
ruleName,
} from '../../src/rules/no-typed-store'
import { ruleTester } from '../utils'

ruleTester().run(ruleName, rule, {
valid: [
stripIndent`
export class Ok {
constructor(store: Store)
constructor(store: Store) {}
}`,
],
invalid: [
fromFixture(
stripIndent`
export class NotOk {
constructor(store: Store<PersonsState>){}
~~~~~~~~~~~~~~~~~~~ [${messageId}]
}`,
),
fromFixture(
stripIndent`
export class NotOk2 {
constructor(cdr: ChangeDetectionRef, private store: Store<CustomersState>){}
~~~~~~~~~~~~~~~~~~~~~ [${messageId}]
}`,
),
fromFixture(
stripIndent`
{
code: stripIndent`
export class NotOk1 {
constructor(store: Store<PersonsState>) {}
}`,
errors: [
{
column: 27,
endColumn: 41,
line: 2,
messageId,
suggestions: [
{
messageId: noTypedStoreSuggest,
output: stripIndent`
export class NotOk1 {
constructor(store: Store) {}
}`,
},
],
},
],
},
{
code: stripIndent`
export class NotOk2 {
constructor(cdr: ChangeDetectionRef, private store: Store<CustomersState>) {}
}`,
errors: [
{
column: 60,
endColumn: 76,
line: 2,
messageId,
suggestions: [
{
messageId: noTypedStoreSuggest,
output: stripIndent`
export class NotOk2 {
constructor(cdr: ChangeDetectionRef, private store: Store) {}
}`,
},
],
},
],
},
{
code: stripIndent`
export class NotOk3 {
constructor(private store: Store<any>, private personsService: PersonsService){}
~~~~~~~~~~ [${messageId}]
constructor(private store: Store<any>, private personsService: PersonsService) {}
}`,
),
fromFixture(
stripIndent`
errors: [
{
column: 35,
endColumn: 40,
line: 2,
messageId,
suggestions: [
{
messageId: noTypedStoreSuggest,
output: stripIndent`
export class NotOk3 {
constructor(private store: Store, private personsService: PersonsService) {}
}`,
},
],
},
],
},
{
code: stripIndent`
export class NotOk4 {
constructor(store: Store<{}>)
~~~~~~~~~ [${messageId}]
constructor(store: Store<{}>) {}
}`,
),
fromFixture(
stripIndent`
errors: [
{
column: 27,
endColumn: 31,
line: 2,
messageId,
suggestions: [
{
messageId: noTypedStoreSuggest,
output: stripIndent`
export class NotOk4 {
constructor(store: Store) {}
}`,
},
],
},
],
},
{
code: stripIndent`
export class NotOk5 {
constructor(store: Store<object>)
~~~~~~~~~~~~~ [${messageId}]
}`,
),
constructor(store: Store<object>) {}
}`,
errors: [
{
column: 27,
endColumn: 35,
line: 2,
messageId,
suggestions: [
{
messageId: noTypedStoreSuggest,
output: stripIndent`
export class NotOk5 {
constructor(store: Store) {}
}`,
},
],
},
],
},
],
})