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

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 (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