@graphql-eslint/eslint-plugin 3.13.1-alpha-20221105230632-80b7067 → 3.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +266 -0
  2. package/docs/README.md +76 -0
  3. package/docs/custom-rules.md +148 -0
  4. package/docs/deprecated-rules.md +21 -0
  5. package/docs/parser-options.md +85 -0
  6. package/docs/parser.md +49 -0
  7. package/docs/rules/alphabetize.md +178 -0
  8. package/docs/rules/description-style.md +54 -0
  9. package/docs/rules/executable-definitions.md +17 -0
  10. package/docs/rules/fields-on-correct-type.md +17 -0
  11. package/docs/rules/fragments-on-composite-type.md +17 -0
  12. package/docs/rules/input-name.md +76 -0
  13. package/docs/rules/known-argument-names.md +17 -0
  14. package/docs/rules/known-directives.md +44 -0
  15. package/docs/rules/known-fragment-names.md +69 -0
  16. package/docs/rules/known-type-names.md +17 -0
  17. package/docs/rules/lone-anonymous-operation.md +17 -0
  18. package/docs/rules/lone-schema-definition.md +17 -0
  19. package/docs/rules/match-document-filename.md +156 -0
  20. package/docs/rules/naming-convention.md +300 -0
  21. package/docs/rules/no-anonymous-operations.md +39 -0
  22. package/docs/rules/no-case-insensitive-enum-values-duplicates.md +43 -0
  23. package/docs/rules/no-deprecated.md +85 -0
  24. package/docs/rules/no-duplicate-fields.md +65 -0
  25. package/docs/rules/no-fragment-cycles.md +17 -0
  26. package/docs/rules/no-hashtag-description.md +59 -0
  27. package/docs/rules/no-root-type.md +53 -0
  28. package/docs/rules/no-scalar-result-type-on-mutation.md +37 -0
  29. package/docs/rules/no-typename-prefix.md +39 -0
  30. package/docs/rules/no-undefined-variables.md +17 -0
  31. package/docs/rules/no-unreachable-types.md +49 -0
  32. package/docs/rules/no-unused-fields.md +62 -0
  33. package/docs/rules/no-unused-fragments.md +17 -0
  34. package/docs/rules/no-unused-variables.md +17 -0
  35. package/docs/rules/one-field-subscriptions.md +17 -0
  36. package/docs/rules/overlapping-fields-can-be-merged.md +17 -0
  37. package/docs/rules/possible-fragment-spread.md +17 -0
  38. package/docs/rules/possible-type-extension.md +15 -0
  39. package/docs/rules/provided-required-arguments.md +17 -0
  40. package/docs/rules/relay-arguments.md +57 -0
  41. package/docs/rules/relay-connection-types.md +42 -0
  42. package/docs/rules/relay-edge-types.md +56 -0
  43. package/docs/rules/relay-page-info.md +32 -0
  44. package/docs/rules/require-deprecation-date.md +57 -0
  45. package/docs/rules/require-deprecation-reason.md +47 -0
  46. package/docs/rules/require-description.md +115 -0
  47. package/docs/rules/require-field-of-type-query-in-mutation-result.md +47 -0
  48. package/docs/rules/require-id-when-available.md +88 -0
  49. package/docs/rules/scalar-leafs.md +17 -0
  50. package/docs/rules/selection-set-depth.md +76 -0
  51. package/docs/rules/strict-id-in-types.md +130 -0
  52. package/docs/rules/unique-argument-names.md +17 -0
  53. package/docs/rules/unique-directive-names-per-location.md +17 -0
  54. package/docs/rules/unique-directive-names.md +17 -0
  55. package/docs/rules/unique-enum-value-names.md +15 -0
  56. package/docs/rules/unique-field-definition-names.md +17 -0
  57. package/docs/rules/unique-fragment-name.md +51 -0
  58. package/docs/rules/unique-input-field-names.md +17 -0
  59. package/docs/rules/unique-operation-name.md +55 -0
  60. package/docs/rules/unique-operation-types.md +17 -0
  61. package/docs/rules/unique-type-names.md +17 -0
  62. package/docs/rules/unique-variable-names.md +17 -0
  63. package/docs/rules/value-literals-of-correct-type.md +17 -0
  64. package/docs/rules/variables-are-input-types.md +17 -0
  65. package/docs/rules/variables-in-allowed-position.md +17 -0
  66. package/package.json +1 -1
@@ -0,0 +1,59 @@
1
+ # `no-hashtag-description`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/schema-recommended"` property in a configuration file enables this rule.
4
+
5
+ 💡 This rule provides [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
6
+
7
+ - Category: `Schema`
8
+ - Rule name: `@graphql-eslint/no-hashtag-description`
9
+ - Requires GraphQL Schema: `false` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
10
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
11
+
12
+ Requires to use `"""` or `"` for adding a GraphQL description instead of `#`.
13
+ Allows to use hashtag for comments, as long as it's not attached to an AST definition.
14
+
15
+ ## Usage Examples
16
+
17
+ ### Incorrect
18
+
19
+ ```graphql
20
+ # eslint @graphql-eslint/no-hashtag-description: 'error'
21
+
22
+ # Represents a user
23
+ type User {
24
+ id: ID!
25
+ name: String
26
+ }
27
+ ```
28
+
29
+ ### Correct
30
+
31
+ ```graphql
32
+ # eslint @graphql-eslint/no-hashtag-description: 'error'
33
+
34
+ " Represents a user "
35
+ type User {
36
+ id: ID!
37
+ name: String
38
+ }
39
+ ```
40
+
41
+ ### Correct
42
+
43
+ ```graphql
44
+ # eslint @graphql-eslint/no-hashtag-description: 'error'
45
+
46
+ # This file defines the basic User type.
47
+ # This comment is valid because it's not attached specifically to an AST object.
48
+
49
+ " Represents a user "
50
+ type User {
51
+ id: ID! # This one is also valid, since it comes after the AST object
52
+ name: String
53
+ }
54
+ ```
55
+
56
+ ## Resources
57
+
58
+ - [Rule source](../../packages/plugin/src/rules/no-hashtag-description.ts)
59
+ - [Test source](../../packages/plugin/tests/no-hashtag-description.spec.ts)
@@ -0,0 +1,53 @@
1
+ # `no-root-type`
2
+
3
+ 💡 This rule provides [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
4
+
5
+ - Category: `Schema`
6
+ - Rule name: `@graphql-eslint/no-root-type`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ Disallow using root types `mutation` and/or `subscription`.
11
+
12
+ ## Usage Examples
13
+
14
+ ### Incorrect
15
+
16
+ ```graphql
17
+ # eslint @graphql-eslint/no-root-type: ['error', { disallow: ['mutation', 'subscription'] }]
18
+
19
+ type Mutation {
20
+ createUser(input: CreateUserInput!): User!
21
+ }
22
+ ```
23
+
24
+ ### Correct
25
+
26
+ ```graphql
27
+ # eslint @graphql-eslint/no-root-type: ['error', { disallow: ['mutation', 'subscription'] }]
28
+
29
+ type Query {
30
+ users: [User!]!
31
+ }
32
+ ```
33
+
34
+ ## Config Schema
35
+
36
+ The schema defines the following properties:
37
+
38
+ ### `disallow` (array, required)
39
+
40
+ The elements of the array can contain the following enum values:
41
+
42
+ - `mutation`
43
+ - `subscription`
44
+
45
+ Additional restrictions:
46
+
47
+ * Minimum items: `1`
48
+ * Unique items: `true`
49
+
50
+ ## Resources
51
+
52
+ - [Rule source](../../packages/plugin/src/rules/no-root-type.ts)
53
+ - [Test source](../../packages/plugin/tests/no-root-type.spec.ts)
@@ -0,0 +1,37 @@
1
+ # `no-scalar-result-type-on-mutation`
2
+
3
+ 💡 This rule provides [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
4
+
5
+ - Category: `Schema`
6
+ - Rule name: `@graphql-eslint/no-scalar-result-type-on-mutation`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ Avoid scalar result type on mutation type to make sure to return a valid state.
11
+
12
+ ## Usage Examples
13
+
14
+ ### Incorrect
15
+
16
+ ```graphql
17
+ # eslint @graphql-eslint/no-scalar-result-type-on-mutation: 'error'
18
+
19
+ type Mutation {
20
+ createUser: Boolean
21
+ }
22
+ ```
23
+
24
+ ### Correct
25
+
26
+ ```graphql
27
+ # eslint @graphql-eslint/no-scalar-result-type-on-mutation: 'error'
28
+
29
+ type Mutation {
30
+ createUser: User!
31
+ }
32
+ ```
33
+
34
+ ## Resources
35
+
36
+ - [Rule source](../../packages/plugin/src/rules/no-scalar-result-type-on-mutation.ts)
37
+ - [Test source](../../packages/plugin/tests/no-scalar-result-type-on-mutation.spec.ts)
@@ -0,0 +1,39 @@
1
+ # `no-typename-prefix`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/schema-recommended"` property in a configuration file enables this rule.
4
+
5
+ 💡 This rule provides [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
6
+
7
+ - Category: `Schema`
8
+ - Rule name: `@graphql-eslint/no-typename-prefix`
9
+ - Requires GraphQL Schema: `false` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
10
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
11
+
12
+ Enforces users to avoid using the type name in a field name while defining your schema.
13
+
14
+ ## Usage Examples
15
+
16
+ ### Incorrect
17
+
18
+ ```graphql
19
+ # eslint @graphql-eslint/no-typename-prefix: 'error'
20
+
21
+ type User {
22
+ userId: ID!
23
+ }
24
+ ```
25
+
26
+ ### Correct
27
+
28
+ ```graphql
29
+ # eslint @graphql-eslint/no-typename-prefix: 'error'
30
+
31
+ type User {
32
+ id: ID!
33
+ }
34
+ ```
35
+
36
+ ## Resources
37
+
38
+ - [Rule source](../../packages/plugin/src/rules/no-typename-prefix.ts)
39
+ - [Test source](../../packages/plugin/tests/no-typename-prefix.spec.ts)
@@ -0,0 +1,17 @@
1
+ # `no-undefined-variables`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/operations-recommended"` property in a configuration file enables this rule.
4
+
5
+ - Category: `Operations`
6
+ - Rule name: `@graphql-eslint/no-undefined-variables`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `true` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ A GraphQL operation is only valid if all variables encountered, both directly and via fragment spreads, are defined by that operation.
11
+
12
+ > This rule is a wrapper around a `graphql-js` validation function.
13
+
14
+ ## Resources
15
+
16
+ - [Rule source](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/NoUndefinedVariablesRule.ts)
17
+ - [Test source](https://github.com/graphql/graphql-js/tree/main/src/validation/__tests__/NoUndefinedVariablesRule-test.ts)
@@ -0,0 +1,49 @@
1
+ # `no-unreachable-types`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/schema-recommended"` property in a configuration file enables this rule.
4
+
5
+ 💡 This rule provides [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
6
+
7
+ - Category: `Schema`
8
+ - Rule name: `@graphql-eslint/no-unreachable-types`
9
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
10
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
11
+
12
+ Requires all types to be reachable at some level by root level fields.
13
+
14
+ ## Usage Examples
15
+
16
+ ### Incorrect
17
+
18
+ ```graphql
19
+ # eslint @graphql-eslint/no-unreachable-types: 'error'
20
+
21
+ type User {
22
+ id: ID!
23
+ name: String
24
+ }
25
+
26
+ type Query {
27
+ me: String
28
+ }
29
+ ```
30
+
31
+ ### Correct
32
+
33
+ ```graphql
34
+ # eslint @graphql-eslint/no-unreachable-types: 'error'
35
+
36
+ type User {
37
+ id: ID!
38
+ name: String
39
+ }
40
+
41
+ type Query {
42
+ me: User
43
+ }
44
+ ```
45
+
46
+ ## Resources
47
+
48
+ - [Rule source](../../packages/plugin/src/rules/no-unreachable-types.ts)
49
+ - [Test source](../../packages/plugin/tests/no-unreachable-types.spec.ts)
@@ -0,0 +1,62 @@
1
+ # `no-unused-fields`
2
+
3
+ 💡 This rule provides [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
4
+
5
+ - Category: `Schema`
6
+ - Rule name: `@graphql-eslint/no-unused-fields`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `true` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ Requires all fields to be used at some level by siblings operations.
11
+
12
+ ## Usage Examples
13
+
14
+ ### Incorrect
15
+
16
+ ```graphql
17
+ # eslint @graphql-eslint/no-unused-fields: 'error'
18
+
19
+ type User {
20
+ id: ID!
21
+ name: String
22
+ someUnusedField: String
23
+ }
24
+
25
+ type Query {
26
+ me: User
27
+ }
28
+
29
+ query {
30
+ me {
31
+ id
32
+ name
33
+ }
34
+ }
35
+ ```
36
+
37
+ ### Correct
38
+
39
+ ```graphql
40
+ # eslint @graphql-eslint/no-unused-fields: 'error'
41
+
42
+ type User {
43
+ id: ID!
44
+ name: String
45
+ }
46
+
47
+ type Query {
48
+ me: User
49
+ }
50
+
51
+ query {
52
+ me {
53
+ id
54
+ name
55
+ }
56
+ }
57
+ ```
58
+
59
+ ## Resources
60
+
61
+ - [Rule source](../../packages/plugin/src/rules/no-unused-fields.ts)
62
+ - [Test source](../../packages/plugin/tests/no-unused-fields.spec.ts)
@@ -0,0 +1,17 @@
1
+ # `no-unused-fragments`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/operations-recommended"` property in a configuration file enables this rule.
4
+
5
+ - Category: `Operations`
6
+ - Rule name: `@graphql-eslint/no-unused-fragments`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `true` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ A GraphQL document is only valid if all fragment definitions are spread within operations, or spread within other fragments spread within operations.
11
+
12
+ > This rule is a wrapper around a `graphql-js` validation function.
13
+
14
+ ## Resources
15
+
16
+ - [Rule source](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/NoUnusedFragmentsRule.ts)
17
+ - [Test source](https://github.com/graphql/graphql-js/tree/main/src/validation/__tests__/NoUnusedFragmentsRule-test.ts)
@@ -0,0 +1,17 @@
1
+ # `no-unused-variables`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/operations-recommended"` property in a configuration file enables this rule.
4
+
5
+ - Category: `Operations`
6
+ - Rule name: `@graphql-eslint/no-unused-variables`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `true` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ A GraphQL operation is only valid if all variables defined by an operation are used, either directly or within a spread fragment.
11
+
12
+ > This rule is a wrapper around a `graphql-js` validation function.
13
+
14
+ ## Resources
15
+
16
+ - [Rule source](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/NoUnusedVariablesRule.ts)
17
+ - [Test source](https://github.com/graphql/graphql-js/tree/main/src/validation/__tests__/NoUnusedVariablesRule-test.ts)
@@ -0,0 +1,17 @@
1
+ # `one-field-subscriptions`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/operations-recommended"` property in a configuration file enables this rule.
4
+
5
+ - Category: `Operations`
6
+ - Rule name: `@graphql-eslint/one-field-subscriptions`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ A GraphQL subscription is valid only if it contains a single root field.
11
+
12
+ > This rule is a wrapper around a `graphql-js` validation function.
13
+
14
+ ## Resources
15
+
16
+ - [Rule source](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/SingleFieldSubscriptionsRule.ts)
17
+ - [Test source](https://github.com/graphql/graphql-js/tree/main/src/validation/__tests__/SingleFieldSubscriptionsRule-test.ts)
@@ -0,0 +1,17 @@
1
+ # `overlapping-fields-can-be-merged`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/operations-recommended"` property in a configuration file enables this rule.
4
+
5
+ - Category: `Operations`
6
+ - Rule name: `@graphql-eslint/overlapping-fields-can-be-merged`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ A selection set is only valid if all fields (including spreading any fragments) either correspond to distinct response names or can be merged without ambiguity.
11
+
12
+ > This rule is a wrapper around a `graphql-js` validation function.
13
+
14
+ ## Resources
15
+
16
+ - [Rule source](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts)
17
+ - [Test source](https://github.com/graphql/graphql-js/tree/main/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts)
@@ -0,0 +1,17 @@
1
+ # `possible-fragment-spread`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/operations-recommended"` property in a configuration file enables this rule.
4
+
5
+ - Category: `Operations`
6
+ - Rule name: `@graphql-eslint/possible-fragment-spread`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ A fragment spread is only valid if the type condition could ever possibly be true: if there is a non-empty intersection of the possible parent types, and possible types which pass the type condition.
11
+
12
+ > This rule is a wrapper around a `graphql-js` validation function.
13
+
14
+ ## Resources
15
+
16
+ - [Rule source](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/PossibleFragmentSpreadsRule.ts)
17
+ - [Test source](https://github.com/graphql/graphql-js/tree/main/src/validation/__tests__/PossibleFragmentSpreadsRule-test.ts)
@@ -0,0 +1,15 @@
1
+ # `possible-type-extension`
2
+
3
+ - Category: `Schema`
4
+ - Rule name: `@graphql-eslint/possible-type-extension`
5
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
6
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
7
+
8
+ A type extension is only valid if the type is defined and has the same kind.
9
+
10
+ > This rule is a wrapper around a `graphql-js` validation function.
11
+
12
+ ## Resources
13
+
14
+ - [Rule source](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/PossibleTypeExtensionsRule.ts)
15
+ - [Test source](https://github.com/graphql/graphql-js/tree/main/src/validation/__tests__/PossibleTypeExtensionsRule-test.ts)
@@ -0,0 +1,17 @@
1
+ # `provided-required-arguments`
2
+
3
+ ✅ The `"extends": "plugin:@graphql-eslint/schema-recommended"` and `"plugin:@graphql-eslint/operations-recommended"` property in a configuration file enables this rule.
4
+
5
+ - Category: `Schema & Operations`
6
+ - Rule name: `@graphql-eslint/provided-required-arguments`
7
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
8
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
9
+
10
+ A field or directive is only valid if all required (non-null without a default value) field arguments have been provided.
11
+
12
+ > This rule is a wrapper around a `graphql-js` validation function.
13
+
14
+ ## Resources
15
+
16
+ - [Rule source](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/ProvidedRequiredArgumentsRule.ts)
17
+ - [Test source](https://github.com/graphql/graphql-js/tree/main/src/validation/__tests__/ProvidedRequiredArgumentsRule-test.ts)
@@ -0,0 +1,57 @@
1
+ # `relay-arguments`
2
+
3
+ - Category: `Schema`
4
+ - Rule name: `@graphql-eslint/relay-arguments`
5
+ - Requires GraphQL Schema: `false` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
6
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
7
+
8
+ Set of rules to follow Relay specification for Arguments.
9
+
10
+ - A field that returns a Connection type must include forward pagination arguments (`first` and `after`), backward pagination arguments (`last` and `before`), or both
11
+
12
+ Forward pagination arguments
13
+
14
+ - `first` takes a non-negative integer
15
+ - `after` takes the Cursor type
16
+
17
+ Backward pagination arguments
18
+
19
+ - `last` takes a non-negative integer
20
+ - `before` takes the Cursor type
21
+
22
+ ## Usage Examples
23
+
24
+ ### Incorrect
25
+
26
+ ```graphql
27
+ # eslint @graphql-eslint/relay-arguments: 'error'
28
+
29
+ type User {
30
+ posts: PostConnection
31
+ }
32
+ ```
33
+
34
+ ### Correct
35
+
36
+ ```graphql
37
+ # eslint @graphql-eslint/relay-arguments: 'error'
38
+
39
+ type User {
40
+ posts(after: String, first: Int, before: String, last: Int): PostConnection
41
+ }
42
+ ```
43
+
44
+ ## Config Schema
45
+
46
+ The schema defines the following properties:
47
+
48
+ ### `includeBoth` (boolean)
49
+
50
+ Enforce including both forward and backward pagination arguments
51
+
52
+ Default: `true`
53
+
54
+ ## Resources
55
+
56
+ - [Rule source](../../packages/plugin/src/rules/relay-arguments.ts)
57
+ - [Test source](../../packages/plugin/tests/relay-arguments.spec.ts)
@@ -0,0 +1,42 @@
1
+ # `relay-connection-types`
2
+
3
+ - Category: `Schema`
4
+ - Rule name: `@graphql-eslint/relay-connection-types`
5
+ - Requires GraphQL Schema: `false` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
6
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
7
+
8
+ Set of rules to follow Relay specification for Connection types.
9
+
10
+ - Any type whose name ends in "Connection" is considered by spec to be a `Connection type`
11
+ - Connection type must be an Object type
12
+ - Connection type must contain a field `edges` that return a list type that wraps an edge type
13
+ - Connection type must contain a field `pageInfo` that return a non-null `PageInfo` Object type
14
+
15
+ ## Usage Examples
16
+
17
+ ### Incorrect
18
+
19
+ ```graphql
20
+ # eslint @graphql-eslint/relay-connection-types: 'error'
21
+
22
+ type UserPayload { # should be an Object type with `Connection` suffix
23
+ edges: UserEdge! # should return a list type
24
+ pageInfo: PageInfo # should return a non-null `PageInfo` Object type
25
+ }
26
+ ```
27
+
28
+ ### Correct
29
+
30
+ ```graphql
31
+ # eslint @graphql-eslint/relay-connection-types: 'error'
32
+
33
+ type UserConnection {
34
+ edges: [UserEdge]
35
+ pageInfo: PageInfo!
36
+ }
37
+ ```
38
+
39
+ ## Resources
40
+
41
+ - [Rule source](../../packages/plugin/src/rules/relay-connection-types.ts)
42
+ - [Test source](../../packages/plugin/tests/relay-connection-types.spec.ts)
@@ -0,0 +1,56 @@
1
+ # `relay-edge-types`
2
+
3
+ - Category: `Schema`
4
+ - Rule name: `@graphql-eslint/relay-edge-types`
5
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
6
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
7
+
8
+ Set of rules to follow Relay specification for Edge types.
9
+
10
+ - A type that is returned in list form by a connection type's `edges` field is considered by this spec to be an Edge type
11
+ - Edge type must be an Object type
12
+ - Edge type must contain a field `node` that return either Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types. Notably, this field cannot return a list
13
+ - Edge type must contain a field `cursor` that return either String, Scalar, or a non-null wrapper around one of those types
14
+ - Edge type name must end in "Edge" _(optional)_
15
+ - Edge type's field `node` must implement `Node` interface _(optional)_
16
+ - A list type should only wrap an edge type _(optional)_
17
+
18
+ ## Usage Examples
19
+
20
+ ### Correct
21
+
22
+ ```graphql
23
+ # eslint @graphql-eslint/relay-edge-types: 'error'
24
+
25
+ type UserConnection {
26
+ edges: [UserEdge]
27
+ pageInfo: PageInfo!
28
+ }
29
+ ```
30
+
31
+ ## Config Schema
32
+
33
+ The schema defines the following properties:
34
+
35
+ ### `withEdgeSuffix` (boolean)
36
+
37
+ Edge type name must end in "Edge".
38
+
39
+ Default: `true`
40
+
41
+ ### `shouldImplementNode` (boolean)
42
+
43
+ Edge type's field `node` must implement `Node` interface.
44
+
45
+ Default: `true`
46
+
47
+ ### `listTypeCanWrapOnlyEdgeType` (boolean)
48
+
49
+ A list type should only wrap an edge type.
50
+
51
+ Default: `true`
52
+
53
+ ## Resources
54
+
55
+ - [Rule source](../../packages/plugin/src/rules/relay-edge-types.ts)
56
+ - [Test source](../../packages/plugin/tests/relay-edge-types.spec.ts)
@@ -0,0 +1,32 @@
1
+ # `relay-page-info`
2
+
3
+ - Category: `Schema`
4
+ - Rule name: `@graphql-eslint/relay-page-info`
5
+ - Requires GraphQL Schema: `true` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
6
+ - Requires GraphQL Operations: `false` [ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
7
+
8
+ Set of rules to follow Relay specification for `PageInfo` object.
9
+
10
+ - `PageInfo` must be an Object type
11
+ - `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean
12
+ - `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results
13
+
14
+ ## Usage Examples
15
+
16
+ ### Correct
17
+
18
+ ```graphql
19
+ # eslint @graphql-eslint/relay-page-info: 'error'
20
+
21
+ type PageInfo {
22
+ hasPreviousPage: Boolean!
23
+ hasNextPage: Boolean!
24
+ startCursor: String
25
+ endCursor: String
26
+ }
27
+ ```
28
+
29
+ ## Resources
30
+
31
+ - [Rule source](../../packages/plugin/src/rules/relay-page-info.ts)
32
+ - [Test source](../../packages/plugin/tests/relay-page-info.spec.ts)