Skip to content

Commit c6d5bb7

Browse files
tshedorVictorrentdimaMachina
authored
extend require-description lint with operation field definitions (#1303)
* require description for operation field definitions * Update packages/plugin/tests/require-description.spec.ts Co-authored-by: Victor Rojas <[email protected]> * narrow query * pr feedback * format * [require-description] add `rootField` option for only field definitions within `Query`, `Mutation`, and `Subscription` root types Co-authored-by: Victor Rojas <[email protected]> Co-authored-by: Dimitri POSTOLOV <[email protected]>
1 parent 4cb913b commit c6d5bb7

File tree

68 files changed

+292
-178
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+292
-178
lines changed

.changeset/good-baboons-bathe.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@graphql-eslint/eslint-plugin': minor
3+
---
4+
5+
[require-description] add `rootField` option for only field definitions within `Query`, `Mutation`, and `Subscription` root types

docs/rules/require-description.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ mutation createUser {
5050
}
5151
```
5252

53+
### Correct
54+
55+
```graphql
56+
# eslint @graphql-eslint/require-description: ['error', { rootField: true }]
57+
58+
type Mutation {
59+
"Create a new user"
60+
createUser: User
61+
}
62+
63+
type User {
64+
name: String
65+
}
66+
```
67+
5368
## Config Schema
5469

5570
The schema defines the following properties:
@@ -65,6 +80,10 @@ Includes:
6580
- `InputObjectTypeDefinition`
6681
- `UnionTypeDefinition`
6782

83+
### `rootField` (boolean)
84+
85+
Definitions within `Query`, `Mutation`, and `Subscription` root types
86+
6887
### `DirectiveDefinition` (boolean)
6988

7089
Read more about this kind on

packages/plugin/src/rules/alphabetize.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export type AlphabetizeConfig = {
5757
definitions?: boolean;
5858
};
5959

60-
const rule: GraphQLESLintRule<[AlphabetizeConfig]> = {
60+
export const rule: GraphQLESLintRule<[AlphabetizeConfig]> = {
6161
meta: {
6262
type: 'suggestion',
6363
fixable: 'code',
@@ -402,5 +402,3 @@ const rule: GraphQLESLintRule<[AlphabetizeConfig]> = {
402402
return listeners;
403403
},
404404
};
405-
406-
export default rule;

packages/plugin/src/rules/description-style.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { GraphQLESTreeNode } from '../estree-converter';
44

55
type DescriptionStyleRuleConfig = { style: 'inline' | 'block' };
66

7-
const rule: GraphQLESLintRule<[DescriptionStyleRuleConfig]> = {
7+
export const rule: GraphQLESLintRule<[DescriptionStyleRuleConfig]> = {
88
meta: {
99
type: 'suggestion',
1010
hasSuggestions: true,
@@ -77,5 +77,3 @@ const rule: GraphQLESLintRule<[DescriptionStyleRuleConfig]> = {
7777
};
7878
},
7979
};
80-
81-
export default rule;

packages/plugin/src/rules/graphql-js-validation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ const validationToRule = (
186186
...docs,
187187
graphQLJSRuleName: ruleName,
188188
url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${ruleId}.md`,
189-
description: `${docs.description}\n\n> This rule is a wrapper around a \`graphql-js\` validation function.`,
189+
description: `${docs.description}\n> This rule is a wrapper around a \`graphql-js\` validation function.`,
190190
},
191191
schema,
192192
hasSuggestions: hasDidYouMeanSuggestions,

packages/plugin/src/rules/index.ts

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,34 @@
33
*/
44

55
import { GRAPHQL_JS_VALIDATIONS } from './graphql-js-validation';
6-
import alphabetize from './alphabetize';
7-
import descriptionStyle from './description-style';
8-
import inputName from './input-name';
9-
import matchDocumentFilename from './match-document-filename';
10-
import namingConvention from './naming-convention';
11-
import noAnonymousOperations from './no-anonymous-operations';
12-
import noCaseInsensitiveEnumValuesDuplicates from './no-case-insensitive-enum-values-duplicates';
13-
import noDeprecated from './no-deprecated';
14-
import noDuplicateFields from './no-duplicate-fields';
15-
import noHashtagDescription from './no-hashtag-description';
16-
import noRootType from './no-root-type';
17-
import noScalarResultTypeOnMutation from './no-scalar-result-type-on-mutation';
18-
import noTypenamePrefix from './no-typename-prefix';
19-
import noUnreachableTypes from './no-unreachable-types';
20-
import noUnusedFields from './no-unused-fields';
21-
import relayArguments from './relay-arguments';
22-
import relayConnectionTypes from './relay-connection-types';
23-
import relayEdgeTypes from './relay-edge-types';
24-
import relayPageInfo from './relay-page-info';
25-
import requireDeprecationDate from './require-deprecation-date';
26-
import requireDeprecationReason from './require-deprecation-reason';
27-
import requireDescription from './require-description';
28-
import requireFieldOfTypeQueryInMutationResult from './require-field-of-type-query-in-mutation-result';
29-
import requireIdWhenAvailable from './require-id-when-available';
30-
import selectionSetDepth from './selection-set-depth';
31-
import strictIdInTypes from './strict-id-in-types';
32-
import uniqueFragmentName from './unique-fragment-name';
33-
import uniqueOperationName from './unique-operation-name';
6+
import { rule as alphabetize } from './alphabetize';
7+
import { rule as descriptionStyle } from './description-style';
8+
import { rule as inputName } from './input-name';
9+
import { rule as matchDocumentFilename } from './match-document-filename';
10+
import { rule as namingConvention } from './naming-convention';
11+
import { rule as noAnonymousOperations } from './no-anonymous-operations';
12+
import { rule as noCaseInsensitiveEnumValuesDuplicates } from './no-case-insensitive-enum-values-duplicates';
13+
import { rule as noDeprecated } from './no-deprecated';
14+
import { rule as noDuplicateFields } from './no-duplicate-fields';
15+
import { rule as noHashtagDescription } from './no-hashtag-description';
16+
import { rule as noRootType } from './no-root-type';
17+
import { rule as noScalarResultTypeOnMutation } from './no-scalar-result-type-on-mutation';
18+
import { rule as noTypenamePrefix } from './no-typename-prefix';
19+
import { rule as noUnreachableTypes } from './no-unreachable-types';
20+
import { rule as noUnusedFields } from './no-unused-fields';
21+
import { rule as relayArguments } from './relay-arguments';
22+
import { rule as relayConnectionTypes } from './relay-connection-types';
23+
import { rule as relayEdgeTypes } from './relay-edge-types';
24+
import { rule as relayPageInfo } from './relay-page-info';
25+
import { rule as requireDeprecationDate } from './require-deprecation-date';
26+
import { rule as requireDeprecationReason } from './require-deprecation-reason';
27+
import { rule as requireDescription } from './require-description';
28+
import { rule as requireFieldOfTypeQueryInMutationResult } from './require-field-of-type-query-in-mutation-result';
29+
import { rule as requireIdWhenAvailable } from './require-id-when-available';
30+
import { rule as selectionSetDepth } from './selection-set-depth';
31+
import { rule as strictIdInTypes } from './strict-id-in-types';
32+
import { rule as uniqueFragmentName } from './unique-fragment-name';
33+
import { rule as uniqueOperationName } from './unique-operation-name';
3434

3535
export const rules = {
3636
...GRAPHQL_JS_VALIDATIONS,

packages/plugin/src/rules/input-name.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const isQueryType = (node: ObjectTypeNode): boolean =>
2525
const isMutationType = (node: ObjectTypeNode): boolean =>
2626
isObjectType(node) && node.name.value === 'Mutation';
2727

28-
const rule: GraphQLESLintRule<[InputNameRuleConfig]> = {
28+
export const rule: GraphQLESLintRule<[InputNameRuleConfig]> = {
2929
meta: {
3030
type: 'suggestion',
3131
hasSuggestions: true,
@@ -164,5 +164,3 @@ const rule: GraphQLESLintRule<[InputNameRuleConfig]> = {
164164
return listeners;
165165
},
166166
};
167-
168-
export default rule;

packages/plugin/src/rules/match-document-filename.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const schemaOption = {
3737
oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asObject' }],
3838
};
3939

40-
const rule: GraphQLESLintRule<[MatchDocumentFilenameRuleConfig]> = {
40+
export const rule: GraphQLESLintRule<[MatchDocumentFilenameRuleConfig]> = {
4141
meta: {
4242
type: 'suggestion',
4343
docs: {
@@ -244,5 +244,3 @@ const rule: GraphQLESLintRule<[MatchDocumentFilenameRuleConfig]> = {
244244
};
245245
},
246246
};
247-
248-
export default rule;

packages/plugin/src/rules/naming-convention.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export type NamingConventionRuleConfig = {
6262

6363
type AllowedKindToNode = Pick<ASTKindToNode, AllowedKind>;
6464

65-
const rule: GraphQLESLintRule<[NamingConventionRuleConfig]> = {
65+
export const rule: GraphQLESLintRule<[NamingConventionRuleConfig]> = {
6666
meta: {
6767
type: 'suggestion',
6868
docs: {
@@ -208,7 +208,7 @@ const rule: GraphQLESLintRule<[NamingConventionRuleConfig]> = {
208208
properties: {
209209
types: {
210210
...schemaOption,
211-
description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
211+
description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
212212
},
213213
...Object.fromEntries(
214214
ALLOWED_KINDS.map(kind => [
@@ -365,5 +365,3 @@ const rule: GraphQLESLintRule<[NamingConventionRuleConfig]> = {
365365
return listeners;
366366
},
367367
};
368-
369-
export default rule;

packages/plugin/src/rules/no-anonymous-operations.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { GraphQLESTreeNode } from '../estree-converter';
55

66
const RULE_ID = 'no-anonymous-operations';
77

8-
const rule: GraphQLESLintRule = {
8+
export const rule: GraphQLESLintRule = {
99
meta: {
1010
type: 'suggestion',
1111
hasSuggestions: true,
@@ -75,5 +75,3 @@ const rule: GraphQLESLintRule = {
7575
};
7676
},
7777
};
78-
79-
export default rule;

0 commit comments

Comments
 (0)