@graphql-eslint/eslint-plugin 3.14.0-alpha-20221220004017-f1f0904 → 3.14.0-alpha-20221220160018-ba4832c

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. package/configs/operations-all.json +1 -0
  2. package/index.js +596 -467
  3. package/index.mjs +597 -468
  4. package/package.json +1 -1
  5. package/rules/alphabetize.d.ts +65 -14
  6. package/rules/description-style.d.ts +18 -4
  7. package/rules/index.d.ts +76 -18
  8. package/rules/input-name.d.ts +33 -7
  9. package/rules/lone-executable-definition.d.ts +26 -0
  10. package/rules/match-document-filename.d.ts +65 -13
  11. package/rules/naming-convention.d.ts +80 -34
  12. package/rules/no-anonymous-operations.d.ts +1 -2
  13. package/rules/no-case-insensitive-enum-values-duplicates.d.ts +1 -2
  14. package/rules/no-deprecated.d.ts +1 -2
  15. package/rules/no-duplicate-fields.d.ts +1 -2
  16. package/rules/no-hashtag-description.d.ts +1 -2
  17. package/rules/no-root-type.d.ts +23 -5
  18. package/rules/no-scalar-result-type-on-mutation.d.ts +1 -2
  19. package/rules/no-typename-prefix.d.ts +1 -2
  20. package/rules/no-unreachable-types.d.ts +1 -2
  21. package/rules/no-unused-fields.d.ts +1 -2
  22. package/rules/relay-arguments.d.ts +19 -4
  23. package/rules/relay-connection-types.d.ts +1 -2
  24. package/rules/relay-edge-types.d.ts +29 -6
  25. package/rules/relay-page-info.d.ts +1 -2
  26. package/rules/require-deprecation-date.d.ts +17 -4
  27. package/rules/require-deprecation-reason.d.ts +1 -2
  28. package/rules/require-description.d.ts +10 -7
  29. package/rules/require-field-of-type-query-in-mutation-result.d.ts +1 -2
  30. package/rules/require-id-when-available.d.ts +34 -4
  31. package/rules/selection-set-depth.d.ts +26 -5
  32. package/rules/strict-id-in-types.d.ts +54 -8
  33. package/rules/unique-fragment-name.d.ts +1 -2
  34. package/rules/unique-operation-name.d.ts +1 -2
  35. package/testkit.d.ts +1 -1
  36. package/types.d.ts +3 -1
  37. package/utils.d.ts +1 -0
package/index.js CHANGED
@@ -334,7 +334,7 @@ const validationToRule = ({ ruleId, ruleName, getDocumentNode, schema = [], hasD
334
334
  ...docs,
335
335
  graphQLJSRuleName: ruleName,
336
336
  url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${ruleId}.md`,
337
- description: `${docs.description}\n\n> This rule is a wrapper around a \`graphql-js\` validation function.`,
337
+ description: `${docs.description}\n> This rule is a wrapper around a \`graphql-js\` validation function.`,
338
338
  },
339
339
  schema,
340
340
  hasSuggestions: hasDidYouMeanSuggestions,
@@ -509,7 +509,7 @@ const GRAPHQL_JS_VALIDATIONS = Object.assign({}, validationToRule({
509
509
  ruleName: 'LoneAnonymousOperation',
510
510
  }, {
511
511
  category: 'Operations',
512
- description: 'A GraphQL document is only valid if when it contains an anonymous operation (the query short-hand) that it contains only that one operation definition.',
512
+ description: 'A GraphQL document that contains an anonymous operation (the `query` short-hand) is only valid if it contains only that one operation definition.',
513
513
  requiresSchema: true,
514
514
  }), validationToRule({
515
515
  ruleId: 'lone-schema-definition',
@@ -733,6 +733,58 @@ const argumentsEnum = [
733
733
  graphql.Kind.DIRECTIVE_DEFINITION,
734
734
  graphql.Kind.DIRECTIVE,
735
735
  ];
736
+ const schema = {
737
+ type: 'array',
738
+ minItems: 1,
739
+ maxItems: 1,
740
+ items: {
741
+ type: 'object',
742
+ additionalProperties: false,
743
+ minProperties: 1,
744
+ properties: {
745
+ fields: {
746
+ ...ARRAY_DEFAULT_OPTIONS,
747
+ items: {
748
+ enum: fieldsEnum,
749
+ },
750
+ description: 'Fields of `type`, `interface`, and `input`.',
751
+ },
752
+ values: {
753
+ ...ARRAY_DEFAULT_OPTIONS,
754
+ items: {
755
+ enum: valuesEnum,
756
+ },
757
+ description: 'Values of `enum`.',
758
+ },
759
+ selections: {
760
+ ...ARRAY_DEFAULT_OPTIONS,
761
+ items: {
762
+ enum: selectionsEnum,
763
+ },
764
+ description: 'Selections of `fragment` and operations `query`, `mutation` and `subscription`.',
765
+ },
766
+ variables: {
767
+ ...ARRAY_DEFAULT_OPTIONS,
768
+ items: {
769
+ enum: variablesEnum,
770
+ },
771
+ description: 'Variables of operations `query`, `mutation` and `subscription`.',
772
+ },
773
+ arguments: {
774
+ ...ARRAY_DEFAULT_OPTIONS,
775
+ items: {
776
+ enum: argumentsEnum,
777
+ },
778
+ description: 'Arguments of fields and directives.',
779
+ },
780
+ definitions: {
781
+ type: 'boolean',
782
+ description: 'Definitions – `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.',
783
+ default: false,
784
+ },
785
+ },
786
+ },
787
+ };
736
788
  const rule = {
737
789
  meta: {
738
790
  type: 'suggestion',
@@ -839,58 +891,7 @@ const rule = {
839
891
  messages: {
840
892
  [RULE_ID]: '`{{ currName }}` should be before {{ prevName }}.',
841
893
  },
842
- schema: {
843
- type: 'array',
844
- minItems: 1,
845
- maxItems: 1,
846
- items: {
847
- type: 'object',
848
- additionalProperties: false,
849
- minProperties: 1,
850
- properties: {
851
- fields: {
852
- ...ARRAY_DEFAULT_OPTIONS,
853
- items: {
854
- enum: fieldsEnum,
855
- },
856
- description: 'Fields of `type`, `interface`, and `input`.',
857
- },
858
- values: {
859
- ...ARRAY_DEFAULT_OPTIONS,
860
- items: {
861
- enum: valuesEnum,
862
- },
863
- description: 'Values of `enum`.',
864
- },
865
- selections: {
866
- ...ARRAY_DEFAULT_OPTIONS,
867
- items: {
868
- enum: selectionsEnum,
869
- },
870
- description: 'Selections of `fragment` and operations `query`, `mutation` and `subscription`.',
871
- },
872
- variables: {
873
- ...ARRAY_DEFAULT_OPTIONS,
874
- items: {
875
- enum: variablesEnum,
876
- },
877
- description: 'Variables of operations `query`, `mutation` and `subscription`.',
878
- },
879
- arguments: {
880
- ...ARRAY_DEFAULT_OPTIONS,
881
- items: {
882
- enum: argumentsEnum,
883
- },
884
- description: 'Arguments of fields and directives.',
885
- },
886
- definitions: {
887
- type: 'boolean',
888
- description: 'Definitions – `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.',
889
- default: false,
890
- },
891
- },
892
- },
893
- },
894
+ schema,
894
895
  },
895
896
  create(context) {
896
897
  var _a, _b, _c, _d, _e;
@@ -1033,6 +1034,21 @@ const rule = {
1033
1034
  },
1034
1035
  };
1035
1036
 
1037
+ const schema$1 = {
1038
+ type: 'array',
1039
+ maxItems: 1,
1040
+ items: {
1041
+ type: 'object',
1042
+ additionalProperties: false,
1043
+ minProperties: 1,
1044
+ properties: {
1045
+ style: {
1046
+ enum: ['block', 'inline'],
1047
+ default: 'block',
1048
+ },
1049
+ },
1050
+ },
1051
+ };
1036
1052
  const rule$1 = {
1037
1053
  meta: {
1038
1054
  type: 'suggestion',
@@ -1065,18 +1081,7 @@ const rule$1 = {
1065
1081
  url: 'https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/description-style.md',
1066
1082
  recommended: true,
1067
1083
  },
1068
- schema: [
1069
- {
1070
- type: 'object',
1071
- additionalProperties: false,
1072
- properties: {
1073
- style: {
1074
- enum: ['block', 'inline'],
1075
- default: 'block',
1076
- },
1077
- },
1078
- },
1079
- ],
1084
+ schema: schema$1,
1080
1085
  },
1081
1086
  create(context) {
1082
1087
  const { style = 'block' } = context.options[0] || {};
@@ -1105,6 +1110,36 @@ const rule$1 = {
1105
1110
  },
1106
1111
  };
1107
1112
 
1113
+ const schema$2 = {
1114
+ type: 'array',
1115
+ maxItems: 1,
1116
+ items: {
1117
+ type: 'object',
1118
+ additionalProperties: false,
1119
+ properties: {
1120
+ checkInputType: {
1121
+ type: 'boolean',
1122
+ default: false,
1123
+ description: 'Check that the input type name follows the convention <mutationName>Input',
1124
+ },
1125
+ caseSensitiveInputType: {
1126
+ type: 'boolean',
1127
+ default: true,
1128
+ description: 'Allow for case discrepancies in the input type name',
1129
+ },
1130
+ checkQueries: {
1131
+ type: 'boolean',
1132
+ default: false,
1133
+ description: 'Apply the rule to Queries',
1134
+ },
1135
+ checkMutations: {
1136
+ type: 'boolean',
1137
+ default: true,
1138
+ description: 'Apply the rule to Mutations',
1139
+ },
1140
+ },
1141
+ },
1142
+ };
1108
1143
  const isObjectType = (node) => [graphql.Kind.OBJECT_TYPE_DEFINITION, graphql.Kind.OBJECT_TYPE_EXTENSION].includes(node.type);
1109
1144
  const isQueryType = (node) => isObjectType(node) && node.name.value === 'Query';
1110
1145
  const isMutationType = (node) => isObjectType(node) && node.name.value === 'Mutation';
@@ -1146,34 +1181,7 @@ const rule$2 = {
1146
1181
  },
1147
1182
  ],
1148
1183
  },
1149
- schema: [
1150
- {
1151
- type: 'object',
1152
- additionalProperties: false,
1153
- properties: {
1154
- checkInputType: {
1155
- type: 'boolean',
1156
- default: false,
1157
- description: 'Check that the input type name follows the convention <mutationName>Input',
1158
- },
1159
- caseSensitiveInputType: {
1160
- type: 'boolean',
1161
- default: true,
1162
- description: 'Allow for case discrepancies in the input type name',
1163
- },
1164
- checkQueries: {
1165
- type: 'boolean',
1166
- default: false,
1167
- description: 'Apply the rule to Queries',
1168
- },
1169
- checkMutations: {
1170
- type: 'boolean',
1171
- default: true,
1172
- description: 'Apply the rule to Mutations',
1173
- },
1174
- },
1175
- },
1176
- ],
1184
+ schema: schema$2,
1177
1185
  },
1178
1186
  create(context) {
1179
1187
  const options = {
@@ -1235,9 +1243,92 @@ const rule$2 = {
1235
1243
  },
1236
1244
  };
1237
1245
 
1246
+ const RULE_ID$1 = 'lone-executable-definition';
1247
+ const schema$3 = {
1248
+ type: 'array',
1249
+ maxItems: 1,
1250
+ items: {
1251
+ type: 'object',
1252
+ minProperties: 1,
1253
+ additionalProperties: false,
1254
+ properties: {
1255
+ ignore: {
1256
+ ...ARRAY_DEFAULT_OPTIONS,
1257
+ maxItems: 3,
1258
+ items: {
1259
+ enum: ['fragment', 'query', 'mutation', 'subscription'],
1260
+ },
1261
+ description: 'Allow certain definitions to be placed alongside others.',
1262
+ },
1263
+ },
1264
+ },
1265
+ };
1266
+ const rule$3 = {
1267
+ meta: {
1268
+ type: 'suggestion',
1269
+ docs: {
1270
+ category: 'Operations',
1271
+ description: 'Require all queries, mutations, subscriptions and fragments to be located in separate files.',
1272
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$1}.md`,
1273
+ examples: [
1274
+ {
1275
+ title: 'Incorrect',
1276
+ code: /* GraphQL */ `
1277
+ query Foo {
1278
+ id
1279
+ }
1280
+ fragment Bar on Baz {
1281
+ id
1282
+ }
1283
+ `,
1284
+ },
1285
+ {
1286
+ title: 'Correct',
1287
+ code: /* GraphQL */ `
1288
+ query Foo {
1289
+ id
1290
+ }
1291
+ `,
1292
+ },
1293
+ ],
1294
+ },
1295
+ messages: {
1296
+ [RULE_ID$1]: '{{name}} should be in a separate file.',
1297
+ },
1298
+ schema: schema$3,
1299
+ },
1300
+ create(context) {
1301
+ var _a;
1302
+ const ignore = new Set(((_a = context.options[0]) === null || _a === void 0 ? void 0 : _a.ignore) || []);
1303
+ const definitions = [];
1304
+ return {
1305
+ ':matches(OperationDefinition, FragmentDefinition)'(node) {
1306
+ const type = 'operation' in node ? node.operation : 'fragment';
1307
+ if (!ignore.has(type)) {
1308
+ definitions.push({ type, node });
1309
+ }
1310
+ },
1311
+ 'Program:exit'() {
1312
+ var _a, _b;
1313
+ for (const { node, type } of definitions.slice(1) /* ignore first definition */) {
1314
+ let name = pascalCase(type);
1315
+ const definitionName = (_a = node.name) === null || _a === void 0 ? void 0 : _a.value;
1316
+ if (definitionName) {
1317
+ name += ` "${definitionName}"`;
1318
+ }
1319
+ context.report({
1320
+ loc: ((_b = node.name) === null || _b === void 0 ? void 0 : _b.loc) || getLocation(node.loc.start, type),
1321
+ messageId: RULE_ID$1,
1322
+ data: { name },
1323
+ });
1324
+ }
1325
+ },
1326
+ };
1327
+ },
1328
+ };
1329
+
1238
1330
  const MATCH_EXTENSION = 'MATCH_EXTENSION';
1239
1331
  const MATCH_STYLE = 'MATCH_STYLE';
1240
- const ACCEPTED_EXTENSIONS = ['.gql', '.graphql'];
1241
1332
  const CASE_STYLES = [
1242
1333
  'camelCase',
1243
1334
  'PascalCase',
@@ -1249,7 +1340,39 @@ const CASE_STYLES = [
1249
1340
  const schemaOption = {
1250
1341
  oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asObject' }],
1251
1342
  };
1252
- const rule$3 = {
1343
+ const schema$4 = {
1344
+ definitions: {
1345
+ asString: {
1346
+ enum: CASE_STYLES,
1347
+ description: `One of: ${CASE_STYLES.map(t => `\`${t}\``).join(', ')}`,
1348
+ },
1349
+ asObject: {
1350
+ type: 'object',
1351
+ additionalProperties: false,
1352
+ minProperties: 1,
1353
+ properties: {
1354
+ style: { enum: CASE_STYLES },
1355
+ suffix: { type: 'string' },
1356
+ },
1357
+ },
1358
+ },
1359
+ type: 'array',
1360
+ minItems: 1,
1361
+ maxItems: 1,
1362
+ items: {
1363
+ type: 'object',
1364
+ additionalProperties: false,
1365
+ minProperties: 1,
1366
+ properties: {
1367
+ fileExtension: { enum: ['.gql', '.graphql'] },
1368
+ query: schemaOption,
1369
+ mutation: schemaOption,
1370
+ subscription: schemaOption,
1371
+ fragment: schemaOption,
1372
+ },
1373
+ },
1374
+ };
1375
+ const rule$4 = {
1253
1376
  meta: {
1254
1377
  type: 'suggestion',
1255
1378
  docs: {
@@ -1340,38 +1463,7 @@ const rule$3 = {
1340
1463
  [MATCH_EXTENSION]: 'File extension "{{ fileExtension }}" don\'t match extension "{{ expectedFileExtension }}"',
1341
1464
  [MATCH_STYLE]: 'Unexpected filename "{{ filename }}". Rename it to "{{ expectedFilename }}"',
1342
1465
  },
1343
- schema: {
1344
- definitions: {
1345
- asString: {
1346
- enum: CASE_STYLES,
1347
- description: `One of: ${CASE_STYLES.map(t => `\`${t}\``).join(', ')}`,
1348
- },
1349
- asObject: {
1350
- type: 'object',
1351
- additionalProperties: false,
1352
- minProperties: 1,
1353
- properties: {
1354
- style: { enum: CASE_STYLES },
1355
- suffix: { type: 'string' },
1356
- },
1357
- },
1358
- },
1359
- type: 'array',
1360
- minItems: 1,
1361
- maxItems: 1,
1362
- items: {
1363
- type: 'object',
1364
- additionalProperties: false,
1365
- minProperties: 1,
1366
- properties: {
1367
- fileExtension: { enum: ACCEPTED_EXTENSIONS },
1368
- query: schemaOption,
1369
- mutation: schemaOption,
1370
- subscription: schemaOption,
1371
- fragment: schemaOption,
1372
- },
1373
- },
1374
- },
1466
+ schema: schema$4,
1375
1467
  },
1376
1468
  create(context) {
1377
1469
  const options = context.options[0] || {
@@ -1473,7 +1565,67 @@ const ALLOWED_STYLES = Object.keys(StyleToRegex);
1473
1565
  const schemaOption$1 = {
1474
1566
  oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asObject' }],
1475
1567
  };
1476
- const rule$4 = {
1568
+ const schema$5 = {
1569
+ definitions: {
1570
+ asString: {
1571
+ enum: ALLOWED_STYLES,
1572
+ description: `One of: ${ALLOWED_STYLES.map(t => `\`${t}\``).join(', ')}`,
1573
+ },
1574
+ asObject: {
1575
+ type: 'object',
1576
+ additionalProperties: false,
1577
+ properties: {
1578
+ style: { enum: ALLOWED_STYLES },
1579
+ prefix: { type: 'string' },
1580
+ suffix: { type: 'string' },
1581
+ forbiddenPrefixes: ARRAY_DEFAULT_OPTIONS,
1582
+ forbiddenSuffixes: ARRAY_DEFAULT_OPTIONS,
1583
+ ignorePattern: {
1584
+ type: 'string',
1585
+ description: 'Option to skip validation of some words, e.g. acronyms',
1586
+ },
1587
+ },
1588
+ },
1589
+ },
1590
+ type: 'array',
1591
+ maxItems: 1,
1592
+ items: {
1593
+ type: 'object',
1594
+ additionalProperties: false,
1595
+ properties: {
1596
+ types: {
1597
+ ...schemaOption$1,
1598
+ description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1599
+ },
1600
+ ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1601
+ kind,
1602
+ {
1603
+ ...schemaOption$1,
1604
+ description: `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`,
1605
+ },
1606
+ ])),
1607
+ allowLeadingUnderscore: {
1608
+ type: 'boolean',
1609
+ default: false,
1610
+ },
1611
+ allowTrailingUnderscore: {
1612
+ type: 'boolean',
1613
+ default: false,
1614
+ },
1615
+ },
1616
+ patternProperties: {
1617
+ [`^(${ALLOWED_KINDS.join('|')})(.+)?$`]: schemaOption$1,
1618
+ },
1619
+ description: [
1620
+ "> It's possible to use a [`selector`](https://eslint.org/docs/developer-guide/selectors) that starts with allowed `ASTNode` names which are described below.",
1621
+ '>',
1622
+ '> Paste or drop code into the editor in [ASTExplorer](https://astexplorer.net) and inspect the generated AST to compose your selector.',
1623
+ '>',
1624
+ '> Example: pattern property `FieldDefinition[parent.name.value=Query]` will match only fields for type `Query`.',
1625
+ ].join('\n'),
1626
+ },
1627
+ };
1628
+ const rule$5 = {
1477
1629
  meta: {
1478
1630
  type: 'suggestion',
1479
1631
  docs: {
@@ -1589,66 +1741,7 @@ const rule$4 = {
1589
1741
  },
1590
1742
  },
1591
1743
  hasSuggestions: true,
1592
- schema: {
1593
- definitions: {
1594
- asString: {
1595
- enum: ALLOWED_STYLES,
1596
- description: `One of: ${ALLOWED_STYLES.map(t => `\`${t}\``).join(', ')}`,
1597
- },
1598
- asObject: {
1599
- type: 'object',
1600
- additionalProperties: false,
1601
- properties: {
1602
- style: { enum: ALLOWED_STYLES },
1603
- prefix: { type: 'string' },
1604
- suffix: { type: 'string' },
1605
- forbiddenPrefixes: ARRAY_DEFAULT_OPTIONS,
1606
- forbiddenSuffixes: ARRAY_DEFAULT_OPTIONS,
1607
- ignorePattern: {
1608
- type: 'string',
1609
- description: 'Option to skip validation of some words, e.g. acronyms',
1610
- },
1611
- },
1612
- },
1613
- },
1614
- type: 'array',
1615
- maxItems: 1,
1616
- items: {
1617
- type: 'object',
1618
- additionalProperties: false,
1619
- properties: {
1620
- types: {
1621
- ...schemaOption$1,
1622
- description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1623
- },
1624
- ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1625
- kind,
1626
- {
1627
- ...schemaOption$1,
1628
- description: `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`,
1629
- },
1630
- ])),
1631
- allowLeadingUnderscore: {
1632
- type: 'boolean',
1633
- default: false,
1634
- },
1635
- allowTrailingUnderscore: {
1636
- type: 'boolean',
1637
- default: false,
1638
- },
1639
- },
1640
- patternProperties: {
1641
- [`^(${ALLOWED_KINDS.join('|')})(.+)?$`]: schemaOption$1,
1642
- },
1643
- description: [
1644
- "> It's possible to use a [`selector`](https://eslint.org/docs/developer-guide/selectors) that starts with allowed `ASTNode` names which are described below.",
1645
- '>',
1646
- '> Paste or drop code into the editor in [ASTExplorer](https://astexplorer.net) and inspect the generated AST to compose your selector.',
1647
- '>',
1648
- '> Example: pattern property `FieldDefinition[parent.name.value=Query]` will match only fields for type `Query`.',
1649
- ].join('\n'),
1650
- },
1651
- },
1744
+ schema: schema$5,
1652
1745
  },
1653
1746
  create(context) {
1654
1747
  const options = context.options[0] || {};
@@ -1748,8 +1841,8 @@ const rule$4 = {
1748
1841
  },
1749
1842
  };
1750
1843
 
1751
- const RULE_ID$1 = 'no-anonymous-operations';
1752
- const rule$5 = {
1844
+ const RULE_ID$2 = 'no-anonymous-operations';
1845
+ const rule$6 = {
1753
1846
  meta: {
1754
1847
  type: 'suggestion',
1755
1848
  hasSuggestions: true,
@@ -1757,7 +1850,7 @@ const rule$5 = {
1757
1850
  category: 'Operations',
1758
1851
  description: 'Require name for your GraphQL operations. This is useful since most GraphQL client libraries are using the operation name for caching purposes.',
1759
1852
  recommended: true,
1760
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$1}.md`,
1853
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$2}.md`,
1761
1854
  examples: [
1762
1855
  {
1763
1856
  title: 'Incorrect',
@@ -1778,7 +1871,7 @@ const rule$5 = {
1778
1871
  ],
1779
1872
  },
1780
1873
  messages: {
1781
- [RULE_ID$1]: 'Anonymous GraphQL operations are forbidden. Make sure to name your {{ operation }}!',
1874
+ [RULE_ID$2]: 'Anonymous GraphQL operations are forbidden. Make sure to name your {{ operation }}!',
1782
1875
  },
1783
1876
  schema: [],
1784
1877
  },
@@ -1791,7 +1884,7 @@ const rule$5 = {
1791
1884
  : node.operation;
1792
1885
  context.report({
1793
1886
  loc: getLocation(node.loc.start, node.operation),
1794
- messageId: RULE_ID$1,
1887
+ messageId: RULE_ID$2,
1795
1888
  data: {
1796
1889
  operation: node.operation,
1797
1890
  },
@@ -1811,7 +1904,7 @@ const rule$5 = {
1811
1904
  },
1812
1905
  };
1813
1906
 
1814
- const rule$6 = {
1907
+ const rule$7 = {
1815
1908
  meta: {
1816
1909
  type: 'suggestion',
1817
1910
  hasSuggestions: true,
@@ -1869,15 +1962,15 @@ const rule$6 = {
1869
1962
  },
1870
1963
  };
1871
1964
 
1872
- const RULE_ID$2 = 'no-deprecated';
1873
- const rule$7 = {
1965
+ const RULE_ID$3 = 'no-deprecated';
1966
+ const rule$8 = {
1874
1967
  meta: {
1875
1968
  type: 'suggestion',
1876
1969
  hasSuggestions: true,
1877
1970
  docs: {
1878
1971
  category: 'Operations',
1879
1972
  description: 'Enforce that deprecated fields or enum values are not in use by operations.',
1880
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$2}.md`,
1973
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$3}.md`,
1881
1974
  requiresSchema: true,
1882
1975
  examples: [
1883
1976
  {
@@ -1944,18 +2037,18 @@ const rule$7 = {
1944
2037
  recommended: true,
1945
2038
  },
1946
2039
  messages: {
1947
- [RULE_ID$2]: 'This {{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})',
2040
+ [RULE_ID$3]: 'This {{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})',
1948
2041
  },
1949
2042
  schema: [],
1950
2043
  },
1951
2044
  create(context) {
1952
- requireGraphQLSchemaFromContext(RULE_ID$2, context);
2045
+ requireGraphQLSchemaFromContext(RULE_ID$3, context);
1953
2046
  function report(node, reason) {
1954
2047
  const nodeName = node.kind === graphql.Kind.ENUM ? node.value : node.name.value;
1955
2048
  const nodeType = node.kind === graphql.Kind.ENUM ? 'enum value' : 'field';
1956
2049
  context.report({
1957
2050
  node,
1958
- messageId: RULE_ID$2,
2051
+ messageId: RULE_ID$3,
1959
2052
  data: {
1960
2053
  type: nodeType,
1961
2054
  reason,
@@ -1989,15 +2082,15 @@ const rule$7 = {
1989
2082
  },
1990
2083
  };
1991
2084
 
1992
- const RULE_ID$3 = 'no-duplicate-fields';
1993
- const rule$8 = {
2085
+ const RULE_ID$4 = 'no-duplicate-fields';
2086
+ const rule$9 = {
1994
2087
  meta: {
1995
2088
  type: 'suggestion',
1996
2089
  hasSuggestions: true,
1997
2090
  docs: {
1998
2091
  description: 'Checks for duplicate fields in selection set, variables in operation definition, or in arguments set of a field.',
1999
2092
  category: 'Operations',
2000
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$3}.md`,
2093
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$4}.md`,
2001
2094
  recommended: true,
2002
2095
  examples: [
2003
2096
  {
@@ -2043,7 +2136,7 @@ const rule$8 = {
2043
2136
  ],
2044
2137
  },
2045
2138
  messages: {
2046
- [RULE_ID$3]: '{{ type }} `{{ fieldName }}` defined multiple times.',
2139
+ [RULE_ID$4]: '{{ type }} `{{ fieldName }}` defined multiple times.',
2047
2140
  },
2048
2141
  schema: [],
2049
2142
  },
@@ -2054,7 +2147,7 @@ const rule$8 = {
2054
2147
  const { parent } = node;
2055
2148
  context.report({
2056
2149
  node,
2057
- messageId: RULE_ID$3,
2150
+ messageId: RULE_ID$4,
2058
2151
  data: {
2059
2152
  type: parent.type,
2060
2153
  fieldName,
@@ -2099,7 +2192,7 @@ const rule$8 = {
2099
2192
  };
2100
2193
 
2101
2194
  const HASHTAG_COMMENT = 'HASHTAG_COMMENT';
2102
- const rule$9 = {
2195
+ const rule$a = {
2103
2196
  meta: {
2104
2197
  type: 'suggestion',
2105
2198
  hasSuggestions: true,
@@ -2184,8 +2277,25 @@ const rule$9 = {
2184
2277
  },
2185
2278
  };
2186
2279
 
2187
- const ROOT_TYPES = ['mutation', 'subscription'];
2188
- const rule$a = {
2280
+ const schema$6 = {
2281
+ type: 'array',
2282
+ minItems: 1,
2283
+ maxItems: 1,
2284
+ items: {
2285
+ type: 'object',
2286
+ additionalProperties: false,
2287
+ required: ['disallow'],
2288
+ properties: {
2289
+ disallow: {
2290
+ ...ARRAY_DEFAULT_OPTIONS,
2291
+ items: {
2292
+ enum: ['mutation', 'subscription'],
2293
+ },
2294
+ },
2295
+ },
2296
+ },
2297
+ };
2298
+ const rule$b = {
2189
2299
  meta: {
2190
2300
  type: 'suggestion',
2191
2301
  hasSuggestions: true,
@@ -2216,24 +2326,7 @@ const rule$a = {
2216
2326
  },
2217
2327
  ],
2218
2328
  },
2219
- schema: {
2220
- type: 'array',
2221
- minItems: 1,
2222
- maxItems: 1,
2223
- items: {
2224
- type: 'object',
2225
- additionalProperties: false,
2226
- required: ['disallow'],
2227
- properties: {
2228
- disallow: {
2229
- ...ARRAY_DEFAULT_OPTIONS,
2230
- items: {
2231
- enum: ROOT_TYPES,
2232
- },
2233
- },
2234
- },
2235
- },
2236
- },
2329
+ schema: schema$6,
2237
2330
  },
2238
2331
  create(context) {
2239
2332
  const schema = requireGraphQLSchemaFromContext('no-root-type', context);
@@ -2267,15 +2360,15 @@ const rule$a = {
2267
2360
  },
2268
2361
  };
2269
2362
 
2270
- const RULE_ID$4 = 'no-scalar-result-type-on-mutation';
2271
- const rule$b = {
2363
+ const RULE_ID$5 = 'no-scalar-result-type-on-mutation';
2364
+ const rule$c = {
2272
2365
  meta: {
2273
2366
  type: 'suggestion',
2274
2367
  hasSuggestions: true,
2275
2368
  docs: {
2276
2369
  category: 'Schema',
2277
2370
  description: 'Avoid scalar result type on mutation type to make sure to return a valid state.',
2278
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$4}.md`,
2371
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$5}.md`,
2279
2372
  requiresSchema: true,
2280
2373
  examples: [
2281
2374
  {
@@ -2299,7 +2392,7 @@ const rule$b = {
2299
2392
  schema: [],
2300
2393
  },
2301
2394
  create(context) {
2302
- const schema = requireGraphQLSchemaFromContext(RULE_ID$4, context);
2395
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$5, context);
2303
2396
  const mutationType = schema.getMutationType();
2304
2397
  if (!mutationType) {
2305
2398
  return {};
@@ -2330,7 +2423,7 @@ const rule$b = {
2330
2423
  };
2331
2424
 
2332
2425
  const NO_TYPENAME_PREFIX = 'NO_TYPENAME_PREFIX';
2333
- const rule$c = {
2426
+ const rule$d = {
2334
2427
  meta: {
2335
2428
  type: 'suggestion',
2336
2429
  hasSuggestions: true,
@@ -2392,7 +2485,7 @@ const rule$c = {
2392
2485
  },
2393
2486
  };
2394
2487
 
2395
- const RULE_ID$5 = 'no-unreachable-types';
2488
+ const RULE_ID$6 = 'no-unreachable-types';
2396
2489
  const KINDS = [
2397
2490
  graphql.Kind.DIRECTIVE_DEFINITION,
2398
2491
  graphql.Kind.OBJECT_TYPE_DEFINITION,
@@ -2472,15 +2565,15 @@ function getReachableTypes(schema) {
2472
2565
  reachableTypesCache = reachableTypes;
2473
2566
  return reachableTypesCache;
2474
2567
  }
2475
- const rule$d = {
2568
+ const rule$e = {
2476
2569
  meta: {
2477
2570
  messages: {
2478
- [RULE_ID$5]: '{{ type }} `{{ typeName }}` is unreachable.',
2571
+ [RULE_ID$6]: '{{ type }} `{{ typeName }}` is unreachable.',
2479
2572
  },
2480
2573
  docs: {
2481
2574
  description: 'Requires all types to be reachable at some level by root level fields.',
2482
2575
  category: 'Schema',
2483
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$5}.md`,
2576
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$6}.md`,
2484
2577
  requiresSchema: true,
2485
2578
  examples: [
2486
2579
  {
@@ -2517,7 +2610,7 @@ const rule$d = {
2517
2610
  hasSuggestions: true,
2518
2611
  },
2519
2612
  create(context) {
2520
- const schema = requireGraphQLSchemaFromContext(RULE_ID$5, context);
2613
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$6, context);
2521
2614
  const reachableTypes = getReachableTypes(schema);
2522
2615
  return {
2523
2616
  [`:matches(${KINDS}) > .name`](node) {
@@ -2526,7 +2619,7 @@ const rule$d = {
2526
2619
  const type = lowerCase(node.parent.kind.replace(/(Extension|Definition)$/, ''));
2527
2620
  context.report({
2528
2621
  node,
2529
- messageId: RULE_ID$5,
2622
+ messageId: RULE_ID$6,
2530
2623
  data: {
2531
2624
  type: type[0].toUpperCase() + type.slice(1),
2532
2625
  typeName,
@@ -2544,7 +2637,7 @@ const rule$d = {
2544
2637
  },
2545
2638
  };
2546
2639
 
2547
- const RULE_ID$6 = 'no-unused-fields';
2640
+ const RULE_ID$7 = 'no-unused-fields';
2548
2641
  let usedFieldsCache;
2549
2642
  function getUsedFields(schema, operations) {
2550
2643
  // We don't want cache usedFields on test environment
@@ -2575,15 +2668,15 @@ function getUsedFields(schema, operations) {
2575
2668
  usedFieldsCache = usedFields;
2576
2669
  return usedFieldsCache;
2577
2670
  }
2578
- const rule$e = {
2671
+ const rule$f = {
2579
2672
  meta: {
2580
2673
  messages: {
2581
- [RULE_ID$6]: 'Field "{{fieldName}}" is unused',
2674
+ [RULE_ID$7]: 'Field "{{fieldName}}" is unused',
2582
2675
  },
2583
2676
  docs: {
2584
2677
  description: 'Requires all fields to be used at some level by siblings operations.',
2585
2678
  category: 'Schema',
2586
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$6}.md`,
2679
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$7}.md`,
2587
2680
  requiresSiblings: true,
2588
2681
  requiresSchema: true,
2589
2682
  isDisabledForAllConfig: true,
@@ -2636,8 +2729,8 @@ const rule$e = {
2636
2729
  hasSuggestions: true,
2637
2730
  },
2638
2731
  create(context) {
2639
- const schema = requireGraphQLSchemaFromContext(RULE_ID$6, context);
2640
- const siblingsOperations = requireSiblingsOperations(RULE_ID$6, context);
2732
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$7, context);
2733
+ const siblingsOperations = requireSiblingsOperations(RULE_ID$7, context);
2641
2734
  const usedFields = getUsedFields(schema, siblingsOperations);
2642
2735
  return {
2643
2736
  FieldDefinition(node) {
@@ -2650,7 +2743,7 @@ const rule$e = {
2650
2743
  }
2651
2744
  context.report({
2652
2745
  node: node.name,
2653
- messageId: RULE_ID$6,
2746
+ messageId: RULE_ID$7,
2654
2747
  data: { fieldName },
2655
2748
  suggest: [
2656
2749
  {
@@ -2670,9 +2763,25 @@ const rule$e = {
2670
2763
  },
2671
2764
  };
2672
2765
 
2673
- const RULE_ID$7 = 'relay-arguments';
2766
+ const RULE_ID$8 = 'relay-arguments';
2674
2767
  const MISSING_ARGUMENTS = 'MISSING_ARGUMENTS';
2675
- const rule$f = {
2768
+ const schema$7 = {
2769
+ type: 'array',
2770
+ maxItems: 1,
2771
+ items: {
2772
+ type: 'object',
2773
+ additionalProperties: false,
2774
+ minProperties: 1,
2775
+ properties: {
2776
+ includeBoth: {
2777
+ type: 'boolean',
2778
+ default: true,
2779
+ description: 'Enforce including both forward and backward pagination arguments',
2780
+ },
2781
+ },
2782
+ },
2783
+ };
2784
+ const rule$g = {
2676
2785
  meta: {
2677
2786
  type: 'problem',
2678
2787
  docs: {
@@ -2692,7 +2801,7 @@ const rule$f = {
2692
2801
  '- `last` takes a non-negative integer',
2693
2802
  '- `before` takes the Cursor type',
2694
2803
  ].join('\n'),
2695
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$7}.md`,
2804
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$8}.md`,
2696
2805
  examples: [
2697
2806
  {
2698
2807
  title: 'Incorrect',
@@ -2716,25 +2825,10 @@ const rule$f = {
2716
2825
  messages: {
2717
2826
  [MISSING_ARGUMENTS]: 'A field that returns a Connection type must include forward pagination arguments (`first` and `after`), backward pagination arguments (`last` and `before`), or both.',
2718
2827
  },
2719
- schema: {
2720
- type: 'array',
2721
- maxItems: 1,
2722
- items: {
2723
- type: 'object',
2724
- additionalProperties: false,
2725
- minProperties: 1,
2726
- properties: {
2727
- includeBoth: {
2728
- type: 'boolean',
2729
- default: true,
2730
- description: 'Enforce including both forward and backward pagination arguments',
2731
- },
2732
- },
2733
- },
2734
- },
2828
+ schema: schema$7,
2735
2829
  },
2736
2830
  create(context) {
2737
- const schema = requireGraphQLSchemaFromContext(RULE_ID$7, context);
2831
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$8, context);
2738
2832
  const { includeBoth = true } = context.options[0] || {};
2739
2833
  return {
2740
2834
  'FieldDefinition > .gqlType Name[value=/Connection$/]'(node) {
@@ -2806,7 +2900,7 @@ const NON_OBJECT_TYPES = [
2806
2900
  const notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`;
2807
2901
  const hasEdgesField = (node) => node.fields.some(field => field.name.value === 'edges');
2808
2902
  const hasPageInfoField = (node) => node.fields.some(field => field.name.value === 'pageInfo');
2809
- const rule$g = {
2903
+ const rule$h = {
2810
2904
  meta: {
2811
2905
  type: 'problem',
2812
2906
  docs: {
@@ -2890,7 +2984,7 @@ const rule$g = {
2890
2984
  },
2891
2985
  };
2892
2986
 
2893
- const RULE_ID$8 = 'relay-edge-types';
2987
+ const RULE_ID$9 = 'relay-edge-types';
2894
2988
  const MESSAGE_MUST_BE_OBJECT_TYPE = 'MESSAGE_MUST_BE_OBJECT_TYPE';
2895
2989
  const MESSAGE_MISSING_EDGE_SUFFIX = 'MESSAGE_MISSING_EDGE_SUFFIX';
2896
2990
  const MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = 'MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE';
@@ -2925,7 +3019,33 @@ function getEdgeTypes(schema) {
2925
3019
  edgeTypesCache = edgeTypes;
2926
3020
  return edgeTypesCache;
2927
3021
  }
2928
- const rule$h = {
3022
+ const schema$8 = {
3023
+ type: 'array',
3024
+ maxItems: 1,
3025
+ items: {
3026
+ type: 'object',
3027
+ additionalProperties: false,
3028
+ minProperties: 1,
3029
+ properties: {
3030
+ withEdgeSuffix: {
3031
+ type: 'boolean',
3032
+ default: true,
3033
+ description: 'Edge type name must end in "Edge".',
3034
+ },
3035
+ shouldImplementNode: {
3036
+ type: 'boolean',
3037
+ default: true,
3038
+ description: "Edge type's field `node` must implement `Node` interface.",
3039
+ },
3040
+ listTypeCanWrapOnlyEdgeType: {
3041
+ type: 'boolean',
3042
+ default: true,
3043
+ description: 'A list type should only wrap an edge type.',
3044
+ },
3045
+ },
3046
+ },
3047
+ };
3048
+ const rule$i = {
2929
3049
  meta: {
2930
3050
  type: 'problem',
2931
3051
  docs: {
@@ -2941,7 +3061,7 @@ const rule$h = {
2941
3061
  "- Edge type's field `node` must implement `Node` interface _(optional)_",
2942
3062
  '- A list type should only wrap an edge type _(optional)_',
2943
3063
  ].join('\n'),
2944
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$8}.md`,
3064
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$9}.md`,
2945
3065
  isDisabledForAllConfig: true,
2946
3066
  requiresSchema: true,
2947
3067
  examples: [
@@ -2962,35 +3082,10 @@ const rule$h = {
2962
3082
  [MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE]: 'A list type should only wrap an edge type.',
2963
3083
  [MESSAGE_SHOULD_IMPLEMENTS_NODE]: "Edge type's field `node` must implement `Node` interface.",
2964
3084
  },
2965
- schema: {
2966
- type: 'array',
2967
- maxItems: 1,
2968
- items: {
2969
- type: 'object',
2970
- additionalProperties: false,
2971
- minProperties: 1,
2972
- properties: {
2973
- withEdgeSuffix: {
2974
- type: 'boolean',
2975
- default: true,
2976
- description: 'Edge type name must end in "Edge".',
2977
- },
2978
- shouldImplementNode: {
2979
- type: 'boolean',
2980
- default: true,
2981
- description: "Edge type's field `node` must implement `Node` interface.",
2982
- },
2983
- listTypeCanWrapOnlyEdgeType: {
2984
- type: 'boolean',
2985
- default: true,
2986
- description: 'A list type should only wrap an edge type.',
2987
- },
2988
- },
2989
- },
2990
- },
3085
+ schema: schema$8,
2991
3086
  },
2992
3087
  create(context) {
2993
- const schema = requireGraphQLSchemaFromContext(RULE_ID$8, context);
3088
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$9, context);
2994
3089
  const edgeTypes = getEdgeTypes(schema);
2995
3090
  const options = {
2996
3091
  withEdgeSuffix: true,
@@ -3073,12 +3168,12 @@ const rule$h = {
3073
3168
  },
3074
3169
  };
3075
3170
 
3076
- const RULE_ID$9 = 'relay-page-info';
3171
+ const RULE_ID$a = 'relay-page-info';
3077
3172
  const MESSAGE_MUST_EXIST = 'MESSAGE_MUST_EXIST';
3078
3173
  const MESSAGE_MUST_BE_OBJECT_TYPE$1 = 'MESSAGE_MUST_BE_OBJECT_TYPE';
3079
3174
  const notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
3080
3175
  let hasPageInfoChecked = false;
3081
- const rule$i = {
3176
+ const rule$j = {
3082
3177
  meta: {
3083
3178
  type: 'problem',
3084
3179
  docs: {
@@ -3090,7 +3185,7 @@ const rule$i = {
3090
3185
  '- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean',
3091
3186
  '- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results',
3092
3187
  ].join('\n'),
3093
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$9}.md`,
3188
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$a}.md`,
3094
3189
  examples: [
3095
3190
  {
3096
3191
  title: 'Correct',
@@ -3114,7 +3209,7 @@ const rule$i = {
3114
3209
  schema: [],
3115
3210
  },
3116
3211
  create(context) {
3117
- const schema = requireGraphQLSchemaFromContext(RULE_ID$9, context);
3212
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$a, context);
3118
3213
  if (process.env.NODE_ENV === 'test' || !hasPageInfoChecked) {
3119
3214
  const pageInfoType = schema.getType('PageInfo');
3120
3215
  if (!pageInfoType) {
@@ -3330,7 +3425,20 @@ const MESSAGE_REQUIRE_DATE = 'MESSAGE_REQUIRE_DATE';
3330
3425
  const MESSAGE_INVALID_FORMAT = 'MESSAGE_INVALID_FORMAT';
3331
3426
  const MESSAGE_INVALID_DATE = 'MESSAGE_INVALID_DATE';
3332
3427
  const MESSAGE_CAN_BE_REMOVED = 'MESSAGE_CAN_BE_REMOVED';
3333
- const rule$j = {
3428
+ const schema$9 = {
3429
+ type: 'array',
3430
+ maxItems: 1,
3431
+ items: {
3432
+ type: 'object',
3433
+ additionalProperties: false,
3434
+ properties: {
3435
+ argumentName: {
3436
+ type: 'string',
3437
+ },
3438
+ },
3439
+ },
3440
+ };
3441
+ const rule$k = {
3334
3442
  meta: {
3335
3443
  type: 'suggestion',
3336
3444
  hasSuggestions: true,
@@ -3375,17 +3483,7 @@ const rule$j = {
3375
3483
  [MESSAGE_INVALID_DATE]: 'Invalid "{{ deletionDate }}" deletion date',
3376
3484
  [MESSAGE_CAN_BE_REMOVED]: '"{{ nodeName }}" сan be removed',
3377
3485
  },
3378
- schema: [
3379
- {
3380
- type: 'object',
3381
- additionalProperties: false,
3382
- properties: {
3383
- argumentName: {
3384
- type: 'string',
3385
- },
3386
- },
3387
- },
3388
- ],
3486
+ schema: schema$9,
3389
3487
  },
3390
3488
  create(context) {
3391
3489
  return {
@@ -3441,7 +3539,7 @@ const rule$j = {
3441
3539
  },
3442
3540
  };
3443
3541
 
3444
- const rule$k = {
3542
+ const rule$l = {
3445
3543
  meta: {
3446
3544
  docs: {
3447
3545
  description: 'Require all deprecation directives to specify a reason.',
@@ -3494,7 +3592,7 @@ const rule$k = {
3494
3592
  },
3495
3593
  };
3496
3594
 
3497
- const RULE_ID$a = 'require-description';
3595
+ const RULE_ID$b = 'require-description';
3498
3596
  const ALLOWED_KINDS$1 = [
3499
3597
  ...TYPES_KINDS,
3500
3598
  graphql.Kind.DIRECTIVE_DEFINITION,
@@ -3531,12 +3629,40 @@ function getNodeName(node) {
3531
3629
  return node.name ? `${node.operation} ${node.name.value}` : node.operation;
3532
3630
  }
3533
3631
  }
3534
- const rule$l = {
3632
+ const schema$a = {
3633
+ type: 'array',
3634
+ minItems: 1,
3635
+ maxItems: 1,
3636
+ items: {
3637
+ type: 'object',
3638
+ additionalProperties: false,
3639
+ minProperties: 1,
3640
+ properties: {
3641
+ types: {
3642
+ type: 'boolean',
3643
+ description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
3644
+ },
3645
+ rootField: {
3646
+ type: 'boolean',
3647
+ description: 'Definitions within `Query`, `Mutation`, and `Subscription` root types.',
3648
+ },
3649
+ ...Object.fromEntries([...ALLOWED_KINDS$1].sort().map(kind => {
3650
+ let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
3651
+ if (kind === graphql.Kind.OPERATION_DEFINITION) {
3652
+ description +=
3653
+ '\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.';
3654
+ }
3655
+ return [kind, { type: 'boolean', description }];
3656
+ })),
3657
+ },
3658
+ },
3659
+ };
3660
+ const rule$m = {
3535
3661
  meta: {
3536
3662
  docs: {
3537
3663
  category: 'Schema',
3538
3664
  description: 'Enforce descriptions in type definitions and operations.',
3539
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$a}.md`,
3665
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$b}.md`,
3540
3666
  examples: [
3541
3667
  {
3542
3668
  title: 'Incorrect',
@@ -3570,6 +3696,20 @@ const rule$l = {
3570
3696
  mutation createUser {
3571
3697
  # ...
3572
3698
  }
3699
+ `,
3700
+ },
3701
+ {
3702
+ title: 'Correct',
3703
+ usage: [{ rootField: true }],
3704
+ code: /* GraphQL */ `
3705
+ type Mutation {
3706
+ "Create a new user"
3707
+ createUser: User
3708
+ }
3709
+
3710
+ type User {
3711
+ name: String
3712
+ }
3573
3713
  `,
3574
3714
  },
3575
3715
  ],
@@ -3577,41 +3717,19 @@ const rule$l = {
3577
3717
  {
3578
3718
  types: true,
3579
3719
  [graphql.Kind.DIRECTIVE_DEFINITION]: true,
3720
+ // rootField: true TODO enable in graphql-eslint v4
3580
3721
  },
3581
3722
  ],
3582
3723
  recommended: true,
3583
3724
  },
3584
3725
  type: 'suggestion',
3585
3726
  messages: {
3586
- [RULE_ID$a]: 'Description is required for `{{ nodeName }}`.',
3587
- },
3588
- schema: {
3589
- type: 'array',
3590
- minItems: 1,
3591
- maxItems: 1,
3592
- items: {
3593
- type: 'object',
3594
- additionalProperties: false,
3595
- minProperties: 1,
3596
- properties: {
3597
- types: {
3598
- type: 'boolean',
3599
- description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
3600
- },
3601
- ...Object.fromEntries([...ALLOWED_KINDS$1].sort().map(kind => {
3602
- let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
3603
- if (kind === graphql.Kind.OPERATION_DEFINITION) {
3604
- description +=
3605
- '\n\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.';
3606
- }
3607
- return [kind, { type: 'boolean', description }];
3608
- })),
3609
- },
3610
- },
3727
+ [RULE_ID$b]: 'Description is required for `{{ nodeName }}`.',
3611
3728
  },
3729
+ schema: schema$a,
3612
3730
  },
3613
3731
  create(context) {
3614
- const { types, ...restOptions } = context.options[0] || {};
3732
+ const { types, rootField, ...restOptions } = context.options[0] || {};
3615
3733
  const kinds = new Set(types ? TYPES_KINDS : []);
3616
3734
  for (const [kind, isEnabled] of Object.entries(restOptions)) {
3617
3735
  if (isEnabled) {
@@ -3621,6 +3739,13 @@ const rule$l = {
3621
3739
  kinds.delete(kind);
3622
3740
  }
3623
3741
  }
3742
+ if (rootField) {
3743
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$b, context);
3744
+ const rootTypeNames = utils.getRootTypeNames(schema);
3745
+ kinds.add(`:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
3746
+ ...rootTypeNames,
3747
+ ].join(',')})$/] > FieldDefinition`);
3748
+ }
3624
3749
  const selector = [...kinds].join(',');
3625
3750
  return {
3626
3751
  [selector](node) {
@@ -3644,7 +3769,7 @@ const rule$l = {
3644
3769
  if (description.length === 0) {
3645
3770
  context.report({
3646
3771
  loc: isOperation ? getLocation(node.loc.start, node.operation) : node.name.loc,
3647
- messageId: RULE_ID$a,
3772
+ messageId: RULE_ID$b,
3648
3773
  data: {
3649
3774
  nodeName: getNodeName(node),
3650
3775
  },
@@ -3655,14 +3780,14 @@ const rule$l = {
3655
3780
  },
3656
3781
  };
3657
3782
 
3658
- const RULE_ID$b = 'require-field-of-type-query-in-mutation-result';
3659
- const rule$m = {
3783
+ const RULE_ID$c = 'require-field-of-type-query-in-mutation-result';
3784
+ const rule$n = {
3660
3785
  meta: {
3661
3786
  type: 'suggestion',
3662
3787
  docs: {
3663
3788
  category: 'Schema',
3664
3789
  description: 'Allow the client in one round-trip not only to call mutation but also to get a wagon of data to update their application.\n> Currently, no errors are reported for result type `union`, `interface` and `scalar`.',
3665
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$b}.md`,
3790
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$c}.md`,
3666
3791
  requiresSchema: true,
3667
3792
  examples: [
3668
3793
  {
@@ -3697,7 +3822,7 @@ const rule$m = {
3697
3822
  schema: [],
3698
3823
  },
3699
3824
  create(context) {
3700
- const schema = requireGraphQLSchemaFromContext(RULE_ID$b, context);
3825
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$c, context);
3701
3826
  const mutationType = schema.getMutationType();
3702
3827
  const queryType = schema.getQueryType();
3703
3828
  if (!mutationType || !queryType) {
@@ -3723,17 +3848,36 @@ const rule$m = {
3723
3848
  },
3724
3849
  };
3725
3850
 
3726
- const RULE_ID$c = 'require-id-when-available';
3851
+ const RULE_ID$d = 'require-id-when-available';
3727
3852
  const DEFAULT_ID_FIELD_NAME = 'id';
3728
- const rule$n = {
3853
+ const schema$b = {
3854
+ definitions: {
3855
+ asString: {
3856
+ type: 'string',
3857
+ },
3858
+ asArray: ARRAY_DEFAULT_OPTIONS,
3859
+ },
3860
+ type: 'array',
3861
+ maxItems: 1,
3862
+ items: {
3863
+ type: 'object',
3864
+ additionalProperties: false,
3865
+ properties: {
3866
+ fieldName: {
3867
+ oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asArray' }],
3868
+ default: DEFAULT_ID_FIELD_NAME,
3869
+ },
3870
+ },
3871
+ },
3872
+ };
3873
+ const rule$o = {
3729
3874
  meta: {
3730
3875
  type: 'suggestion',
3731
- // eslint-disable-next-line eslint-plugin/require-meta-has-suggestions
3732
3876
  hasSuggestions: true,
3733
3877
  docs: {
3734
3878
  category: 'Operations',
3735
3879
  description: 'Enforce selecting specific fields when they are available on the GraphQL type.',
3736
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$c}.md`,
3880
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$d}.md`,
3737
3881
  requiresSchema: true,
3738
3882
  requiresSiblings: true,
3739
3883
  examples: [
@@ -3783,32 +3927,13 @@ const rule$n = {
3783
3927
  recommended: true,
3784
3928
  },
3785
3929
  messages: {
3786
- [RULE_ID$c]: "Field{{ pluralSuffix }} {{ fieldName }} must be selected when it's available on a type.\nInclude it in your selection set{{ addition }}.",
3787
- },
3788
- schema: {
3789
- definitions: {
3790
- asString: {
3791
- type: 'string',
3792
- },
3793
- asArray: ARRAY_DEFAULT_OPTIONS,
3794
- },
3795
- type: 'array',
3796
- maxItems: 1,
3797
- items: {
3798
- type: 'object',
3799
- additionalProperties: false,
3800
- properties: {
3801
- fieldName: {
3802
- oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asArray' }],
3803
- default: DEFAULT_ID_FIELD_NAME,
3804
- },
3805
- },
3806
- },
3930
+ [RULE_ID$d]: "Field{{ pluralSuffix }} {{ fieldName }} must be selected when it's available on a type.\nInclude it in your selection set{{ addition }}.",
3807
3931
  },
3932
+ schema: schema$b,
3808
3933
  },
3809
3934
  create(context) {
3810
- const schema = requireGraphQLSchemaFromContext(RULE_ID$c, context);
3811
- const siblings = requireSiblingsOperations(RULE_ID$c, context);
3935
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$d, context);
3936
+ const siblings = requireSiblingsOperations(RULE_ID$d, context);
3812
3937
  const { fieldName = DEFAULT_ID_FIELD_NAME } = context.options[0] || {};
3813
3938
  const idNames = utils.asArray(fieldName);
3814
3939
  // Check selections only in OperationDefinition,
@@ -3889,7 +4014,7 @@ const rule$n = {
3889
4014
  : ` or add to used fragment${checkedFragmentSpreads.size > 1 ? 's' : ''} ${englishJoinWords([...checkedFragmentSpreads].map(name => `\`${name}\``))}`;
3890
4015
  const problem = {
3891
4016
  loc,
3892
- messageId: RULE_ID$c,
4017
+ messageId: RULE_ID$d,
3893
4018
  data: {
3894
4019
  pluralSuffix,
3895
4020
  fieldName,
@@ -3916,15 +4041,31 @@ const rule$n = {
3916
4041
  },
3917
4042
  };
3918
4043
 
3919
- const RULE_ID$d = 'selection-set-depth';
3920
- const rule$o = {
4044
+ const RULE_ID$e = 'selection-set-depth';
4045
+ const schema$c = {
4046
+ type: 'array',
4047
+ minItems: 1,
4048
+ maxItems: 1,
4049
+ items: {
4050
+ type: 'object',
4051
+ additionalProperties: false,
4052
+ required: ['maxDepth'],
4053
+ properties: {
4054
+ maxDepth: {
4055
+ type: 'number',
4056
+ },
4057
+ ignore: ARRAY_DEFAULT_OPTIONS,
4058
+ },
4059
+ },
4060
+ };
4061
+ const rule$p = {
3921
4062
  meta: {
3922
4063
  type: 'suggestion',
3923
4064
  hasSuggestions: true,
3924
4065
  docs: {
3925
4066
  category: 'Operations',
3926
4067
  description: 'Limit the complexity of the GraphQL operations solely by their depth. Based on [graphql-depth-limit](https://npmjs.com/package/graphql-depth-limit).',
3927
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$d}.md`,
4068
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$e}.md`,
3928
4069
  requiresSiblings: true,
3929
4070
  examples: [
3930
4071
  {
@@ -3970,30 +4111,15 @@ const rule$o = {
3970
4111
  recommended: true,
3971
4112
  configOptions: [{ maxDepth: 7 }],
3972
4113
  },
3973
- schema: {
3974
- type: 'array',
3975
- minItems: 1,
3976
- maxItems: 1,
3977
- items: {
3978
- type: 'object',
3979
- additionalProperties: false,
3980
- required: ['maxDepth'],
3981
- properties: {
3982
- maxDepth: {
3983
- type: 'number',
3984
- },
3985
- ignore: ARRAY_DEFAULT_OPTIONS,
3986
- },
3987
- },
3988
- },
4114
+ schema: schema$c,
3989
4115
  },
3990
4116
  create(context) {
3991
4117
  let siblings = null;
3992
4118
  try {
3993
- siblings = requireSiblingsOperations(RULE_ID$d, context);
4119
+ siblings = requireSiblingsOperations(RULE_ID$e, context);
3994
4120
  }
3995
4121
  catch (_a) {
3996
- logger.warn(`Rule "${RULE_ID$d}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
4122
+ logger.warn(`Rule "${RULE_ID$e}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
3997
4123
  }
3998
4124
  const { maxDepth, ignore = [] } = context.options[0];
3999
4125
  const checkFn = depthLimit(maxDepth, { ignore });
@@ -4037,22 +4163,54 @@ const rule$o = {
4037
4163
  });
4038
4164
  }
4039
4165
  catch (e) {
4040
- logger.warn(`Rule "${RULE_ID$d}" check failed due to a missing siblings operations. For more info: https://bit.ly/graphql-eslint-operations`, e);
4166
+ logger.warn(`Rule "${RULE_ID$e}" check failed due to a missing siblings operations. For more info: https://bit.ly/graphql-eslint-operations`, e);
4041
4167
  }
4042
4168
  },
4043
4169
  };
4044
4170
  },
4045
4171
  };
4046
4172
 
4047
- const RULE_ID$e = 'strict-id-in-types';
4048
- const rule$p = {
4173
+ const RULE_ID$f = 'strict-id-in-types';
4174
+ const schema$d = {
4175
+ type: 'array',
4176
+ maxItems: 1,
4177
+ items: {
4178
+ type: 'object',
4179
+ additionalProperties: false,
4180
+ properties: {
4181
+ acceptedIdNames: {
4182
+ ...ARRAY_DEFAULT_OPTIONS,
4183
+ default: ['id'],
4184
+ },
4185
+ acceptedIdTypes: {
4186
+ ...ARRAY_DEFAULT_OPTIONS,
4187
+ default: ['ID'],
4188
+ },
4189
+ exceptions: {
4190
+ type: 'object',
4191
+ additionalProperties: false,
4192
+ properties: {
4193
+ types: {
4194
+ ...ARRAY_DEFAULT_OPTIONS,
4195
+ description: 'This is used to exclude types with names that match one of the specified values.',
4196
+ },
4197
+ suffixes: {
4198
+ ...ARRAY_DEFAULT_OPTIONS,
4199
+ description: 'This is used to exclude types with names with suffixes that match one of the specified values.',
4200
+ },
4201
+ },
4202
+ },
4203
+ },
4204
+ },
4205
+ };
4206
+ const rule$q = {
4049
4207
  meta: {
4050
4208
  type: 'suggestion',
4051
4209
  docs: {
4052
4210
  description: 'Requires output types to have one unique identifier unless they do not have a logical one. Exceptions can be used to ignore output types that do not have unique identifiers.',
4053
4211
  category: 'Schema',
4054
4212
  recommended: true,
4055
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$e}.md`,
4213
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$f}.md`,
4056
4214
  requiresSchema: true,
4057
4215
  examples: [
4058
4216
  {
@@ -4116,37 +4274,7 @@ const rule$p = {
4116
4274
  },
4117
4275
  ],
4118
4276
  },
4119
- schema: {
4120
- type: 'array',
4121
- maxItems: 1,
4122
- items: {
4123
- type: 'object',
4124
- additionalProperties: false,
4125
- properties: {
4126
- acceptedIdNames: {
4127
- ...ARRAY_DEFAULT_OPTIONS,
4128
- default: ['id'],
4129
- },
4130
- acceptedIdTypes: {
4131
- ...ARRAY_DEFAULT_OPTIONS,
4132
- default: ['ID'],
4133
- },
4134
- exceptions: {
4135
- type: 'object',
4136
- properties: {
4137
- types: {
4138
- ...ARRAY_DEFAULT_OPTIONS,
4139
- description: 'This is used to exclude types with names that match one of the specified values.',
4140
- },
4141
- suffixes: {
4142
- ...ARRAY_DEFAULT_OPTIONS,
4143
- description: 'This is used to exclude types with names with suffixes that match one of the specified values.',
4144
- },
4145
- },
4146
- },
4147
- },
4148
- },
4149
- },
4277
+ schema: schema$d,
4150
4278
  },
4151
4279
  create(context) {
4152
4280
  const options = {
@@ -4155,7 +4283,7 @@ const rule$p = {
4155
4283
  exceptions: {},
4156
4284
  ...context.options[0],
4157
4285
  };
4158
- const schema = requireGraphQLSchemaFromContext(RULE_ID$e, context);
4286
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$f, context);
4159
4287
  const rootTypeNames = [
4160
4288
  schema.getQueryType(),
4161
4289
  schema.getMutationType(),
@@ -4200,7 +4328,7 @@ const rule$p = {
4200
4328
  },
4201
4329
  };
4202
4330
 
4203
- const RULE_ID$f = 'unique-fragment-name';
4331
+ const RULE_ID$g = 'unique-fragment-name';
4204
4332
  const checkNode = (context, node, ruleId) => {
4205
4333
  const documentName = node.name.value;
4206
4334
  const siblings = requireSiblingsOperations(ruleId, context);
@@ -4227,13 +4355,13 @@ const checkNode = (context, node, ruleId) => {
4227
4355
  });
4228
4356
  }
4229
4357
  };
4230
- const rule$q = {
4358
+ const rule$r = {
4231
4359
  meta: {
4232
4360
  type: 'suggestion',
4233
4361
  docs: {
4234
4362
  category: 'Operations',
4235
4363
  description: 'Enforce unique fragment names across your project.',
4236
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$f}.md`,
4364
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$g}.md`,
4237
4365
  requiresSiblings: true,
4238
4366
  examples: [
4239
4367
  {
@@ -4271,27 +4399,27 @@ const rule$q = {
4271
4399
  ],
4272
4400
  },
4273
4401
  messages: {
4274
- [RULE_ID$f]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}',
4402
+ [RULE_ID$g]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}',
4275
4403
  },
4276
4404
  schema: [],
4277
4405
  },
4278
4406
  create(context) {
4279
4407
  return {
4280
4408
  FragmentDefinition(node) {
4281
- checkNode(context, node, RULE_ID$f);
4409
+ checkNode(context, node, RULE_ID$g);
4282
4410
  },
4283
4411
  };
4284
4412
  },
4285
4413
  };
4286
4414
 
4287
- const RULE_ID$g = 'unique-operation-name';
4288
- const rule$r = {
4415
+ const RULE_ID$h = 'unique-operation-name';
4416
+ const rule$s = {
4289
4417
  meta: {
4290
4418
  type: 'suggestion',
4291
4419
  docs: {
4292
4420
  category: 'Operations',
4293
4421
  description: 'Enforce unique operation names across your project.',
4294
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$g}.md`,
4422
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$h}.md`,
4295
4423
  requiresSiblings: true,
4296
4424
  examples: [
4297
4425
  {
@@ -4333,14 +4461,14 @@ const rule$r = {
4333
4461
  ],
4334
4462
  },
4335
4463
  messages: {
4336
- [RULE_ID$g]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}',
4464
+ [RULE_ID$h]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}',
4337
4465
  },
4338
4466
  schema: [],
4339
4467
  },
4340
4468
  create(context) {
4341
4469
  return {
4342
4470
  'OperationDefinition[name!=undefined]'(node) {
4343
- checkNode(context, node, RULE_ID$g);
4471
+ checkNode(context, node, RULE_ID$h);
4344
4472
  },
4345
4473
  };
4346
4474
  },
@@ -4354,31 +4482,32 @@ const rules = {
4354
4482
  alphabetize: rule,
4355
4483
  'description-style': rule$1,
4356
4484
  'input-name': rule$2,
4357
- 'match-document-filename': rule$3,
4358
- 'naming-convention': rule$4,
4359
- 'no-anonymous-operations': rule$5,
4360
- 'no-case-insensitive-enum-values-duplicates': rule$6,
4361
- 'no-deprecated': rule$7,
4362
- 'no-duplicate-fields': rule$8,
4363
- 'no-hashtag-description': rule$9,
4364
- 'no-root-type': rule$a,
4365
- 'no-scalar-result-type-on-mutation': rule$b,
4366
- 'no-typename-prefix': rule$c,
4367
- 'no-unreachable-types': rule$d,
4368
- 'no-unused-fields': rule$e,
4369
- 'relay-arguments': rule$f,
4370
- 'relay-connection-types': rule$g,
4371
- 'relay-edge-types': rule$h,
4372
- 'relay-page-info': rule$i,
4373
- 'require-deprecation-date': rule$j,
4374
- 'require-deprecation-reason': rule$k,
4375
- 'require-description': rule$l,
4376
- 'require-field-of-type-query-in-mutation-result': rule$m,
4377
- 'require-id-when-available': rule$n,
4378
- 'selection-set-depth': rule$o,
4379
- 'strict-id-in-types': rule$p,
4380
- 'unique-fragment-name': rule$q,
4381
- 'unique-operation-name': rule$r,
4485
+ 'lone-executable-definition': rule$3,
4486
+ 'match-document-filename': rule$4,
4487
+ 'naming-convention': rule$5,
4488
+ 'no-anonymous-operations': rule$6,
4489
+ 'no-case-insensitive-enum-values-duplicates': rule$7,
4490
+ 'no-deprecated': rule$8,
4491
+ 'no-duplicate-fields': rule$9,
4492
+ 'no-hashtag-description': rule$a,
4493
+ 'no-root-type': rule$b,
4494
+ 'no-scalar-result-type-on-mutation': rule$c,
4495
+ 'no-typename-prefix': rule$d,
4496
+ 'no-unreachable-types': rule$e,
4497
+ 'no-unused-fields': rule$f,
4498
+ 'relay-arguments': rule$g,
4499
+ 'relay-connection-types': rule$h,
4500
+ 'relay-edge-types': rule$i,
4501
+ 'relay-page-info': rule$j,
4502
+ 'require-deprecation-date': rule$k,
4503
+ 'require-deprecation-reason': rule$l,
4504
+ 'require-description': rule$m,
4505
+ 'require-field-of-type-query-in-mutation-result': rule$n,
4506
+ 'require-id-when-available': rule$o,
4507
+ 'selection-set-depth': rule$p,
4508
+ 'strict-id-in-types': rule$q,
4509
+ 'unique-fragment-name': rule$r,
4510
+ 'unique-operation-name': rule$s,
4382
4511
  };
4383
4512
 
4384
4513
  // Based on the `eslint-plugin-import`'s cache