@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.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { gqlPluckFromCodeStringSync } from '@graphql-tools/graphql-tag-pluck';
2
- import { asArray, getDocumentNodeFromSchema, parseGraphQLSDL } from '@graphql-tools/utils';
2
+ import { asArray, getDocumentNodeFromSchema, getRootTypeNames, parseGraphQLSDL } from '@graphql-tools/utils';
3
3
  import { dirname, extname, basename, relative, resolve } from 'path';
4
4
  import debugFactory from 'debug';
5
5
  import { loadConfigSync, GraphQLConfig } from 'graphql-config';
@@ -328,7 +328,7 @@ const validationToRule = ({ ruleId, ruleName, getDocumentNode, schema = [], hasD
328
328
  ...docs,
329
329
  graphQLJSRuleName: ruleName,
330
330
  url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${ruleId}.md`,
331
- description: `${docs.description}\n\n> This rule is a wrapper around a \`graphql-js\` validation function.`,
331
+ description: `${docs.description}\n> This rule is a wrapper around a \`graphql-js\` validation function.`,
332
332
  },
333
333
  schema,
334
334
  hasSuggestions: hasDidYouMeanSuggestions,
@@ -503,7 +503,7 @@ const GRAPHQL_JS_VALIDATIONS = Object.assign({}, validationToRule({
503
503
  ruleName: 'LoneAnonymousOperation',
504
504
  }, {
505
505
  category: 'Operations',
506
- 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.',
506
+ description: 'A GraphQL document that contains an anonymous operation (the `query` short-hand) is only valid if it contains only that one operation definition.',
507
507
  requiresSchema: true,
508
508
  }), validationToRule({
509
509
  ruleId: 'lone-schema-definition',
@@ -727,6 +727,58 @@ const argumentsEnum = [
727
727
  Kind.DIRECTIVE_DEFINITION,
728
728
  Kind.DIRECTIVE,
729
729
  ];
730
+ const schema = {
731
+ type: 'array',
732
+ minItems: 1,
733
+ maxItems: 1,
734
+ items: {
735
+ type: 'object',
736
+ additionalProperties: false,
737
+ minProperties: 1,
738
+ properties: {
739
+ fields: {
740
+ ...ARRAY_DEFAULT_OPTIONS,
741
+ items: {
742
+ enum: fieldsEnum,
743
+ },
744
+ description: 'Fields of `type`, `interface`, and `input`.',
745
+ },
746
+ values: {
747
+ ...ARRAY_DEFAULT_OPTIONS,
748
+ items: {
749
+ enum: valuesEnum,
750
+ },
751
+ description: 'Values of `enum`.',
752
+ },
753
+ selections: {
754
+ ...ARRAY_DEFAULT_OPTIONS,
755
+ items: {
756
+ enum: selectionsEnum,
757
+ },
758
+ description: 'Selections of `fragment` and operations `query`, `mutation` and `subscription`.',
759
+ },
760
+ variables: {
761
+ ...ARRAY_DEFAULT_OPTIONS,
762
+ items: {
763
+ enum: variablesEnum,
764
+ },
765
+ description: 'Variables of operations `query`, `mutation` and `subscription`.',
766
+ },
767
+ arguments: {
768
+ ...ARRAY_DEFAULT_OPTIONS,
769
+ items: {
770
+ enum: argumentsEnum,
771
+ },
772
+ description: 'Arguments of fields and directives.',
773
+ },
774
+ definitions: {
775
+ type: 'boolean',
776
+ description: 'Definitions – `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.',
777
+ default: false,
778
+ },
779
+ },
780
+ },
781
+ };
730
782
  const rule = {
731
783
  meta: {
732
784
  type: 'suggestion',
@@ -833,58 +885,7 @@ const rule = {
833
885
  messages: {
834
886
  [RULE_ID]: '`{{ currName }}` should be before {{ prevName }}.',
835
887
  },
836
- schema: {
837
- type: 'array',
838
- minItems: 1,
839
- maxItems: 1,
840
- items: {
841
- type: 'object',
842
- additionalProperties: false,
843
- minProperties: 1,
844
- properties: {
845
- fields: {
846
- ...ARRAY_DEFAULT_OPTIONS,
847
- items: {
848
- enum: fieldsEnum,
849
- },
850
- description: 'Fields of `type`, `interface`, and `input`.',
851
- },
852
- values: {
853
- ...ARRAY_DEFAULT_OPTIONS,
854
- items: {
855
- enum: valuesEnum,
856
- },
857
- description: 'Values of `enum`.',
858
- },
859
- selections: {
860
- ...ARRAY_DEFAULT_OPTIONS,
861
- items: {
862
- enum: selectionsEnum,
863
- },
864
- description: 'Selections of `fragment` and operations `query`, `mutation` and `subscription`.',
865
- },
866
- variables: {
867
- ...ARRAY_DEFAULT_OPTIONS,
868
- items: {
869
- enum: variablesEnum,
870
- },
871
- description: 'Variables of operations `query`, `mutation` and `subscription`.',
872
- },
873
- arguments: {
874
- ...ARRAY_DEFAULT_OPTIONS,
875
- items: {
876
- enum: argumentsEnum,
877
- },
878
- description: 'Arguments of fields and directives.',
879
- },
880
- definitions: {
881
- type: 'boolean',
882
- description: 'Definitions – `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.',
883
- default: false,
884
- },
885
- },
886
- },
887
- },
888
+ schema,
888
889
  },
889
890
  create(context) {
890
891
  var _a, _b, _c, _d, _e;
@@ -1027,6 +1028,21 @@ const rule = {
1027
1028
  },
1028
1029
  };
1029
1030
 
1031
+ const schema$1 = {
1032
+ type: 'array',
1033
+ maxItems: 1,
1034
+ items: {
1035
+ type: 'object',
1036
+ additionalProperties: false,
1037
+ minProperties: 1,
1038
+ properties: {
1039
+ style: {
1040
+ enum: ['block', 'inline'],
1041
+ default: 'block',
1042
+ },
1043
+ },
1044
+ },
1045
+ };
1030
1046
  const rule$1 = {
1031
1047
  meta: {
1032
1048
  type: 'suggestion',
@@ -1059,18 +1075,7 @@ const rule$1 = {
1059
1075
  url: 'https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/description-style.md',
1060
1076
  recommended: true,
1061
1077
  },
1062
- schema: [
1063
- {
1064
- type: 'object',
1065
- additionalProperties: false,
1066
- properties: {
1067
- style: {
1068
- enum: ['block', 'inline'],
1069
- default: 'block',
1070
- },
1071
- },
1072
- },
1073
- ],
1078
+ schema: schema$1,
1074
1079
  },
1075
1080
  create(context) {
1076
1081
  const { style = 'block' } = context.options[0] || {};
@@ -1099,6 +1104,36 @@ const rule$1 = {
1099
1104
  },
1100
1105
  };
1101
1106
 
1107
+ const schema$2 = {
1108
+ type: 'array',
1109
+ maxItems: 1,
1110
+ items: {
1111
+ type: 'object',
1112
+ additionalProperties: false,
1113
+ properties: {
1114
+ checkInputType: {
1115
+ type: 'boolean',
1116
+ default: false,
1117
+ description: 'Check that the input type name follows the convention <mutationName>Input',
1118
+ },
1119
+ caseSensitiveInputType: {
1120
+ type: 'boolean',
1121
+ default: true,
1122
+ description: 'Allow for case discrepancies in the input type name',
1123
+ },
1124
+ checkQueries: {
1125
+ type: 'boolean',
1126
+ default: false,
1127
+ description: 'Apply the rule to Queries',
1128
+ },
1129
+ checkMutations: {
1130
+ type: 'boolean',
1131
+ default: true,
1132
+ description: 'Apply the rule to Mutations',
1133
+ },
1134
+ },
1135
+ },
1136
+ };
1102
1137
  const isObjectType = (node) => [Kind.OBJECT_TYPE_DEFINITION, Kind.OBJECT_TYPE_EXTENSION].includes(node.type);
1103
1138
  const isQueryType = (node) => isObjectType(node) && node.name.value === 'Query';
1104
1139
  const isMutationType = (node) => isObjectType(node) && node.name.value === 'Mutation';
@@ -1140,34 +1175,7 @@ const rule$2 = {
1140
1175
  },
1141
1176
  ],
1142
1177
  },
1143
- schema: [
1144
- {
1145
- type: 'object',
1146
- additionalProperties: false,
1147
- properties: {
1148
- checkInputType: {
1149
- type: 'boolean',
1150
- default: false,
1151
- description: 'Check that the input type name follows the convention <mutationName>Input',
1152
- },
1153
- caseSensitiveInputType: {
1154
- type: 'boolean',
1155
- default: true,
1156
- description: 'Allow for case discrepancies in the input type name',
1157
- },
1158
- checkQueries: {
1159
- type: 'boolean',
1160
- default: false,
1161
- description: 'Apply the rule to Queries',
1162
- },
1163
- checkMutations: {
1164
- type: 'boolean',
1165
- default: true,
1166
- description: 'Apply the rule to Mutations',
1167
- },
1168
- },
1169
- },
1170
- ],
1178
+ schema: schema$2,
1171
1179
  },
1172
1180
  create(context) {
1173
1181
  const options = {
@@ -1229,9 +1237,92 @@ const rule$2 = {
1229
1237
  },
1230
1238
  };
1231
1239
 
1240
+ const RULE_ID$1 = 'lone-executable-definition';
1241
+ const schema$3 = {
1242
+ type: 'array',
1243
+ maxItems: 1,
1244
+ items: {
1245
+ type: 'object',
1246
+ minProperties: 1,
1247
+ additionalProperties: false,
1248
+ properties: {
1249
+ ignore: {
1250
+ ...ARRAY_DEFAULT_OPTIONS,
1251
+ maxItems: 3,
1252
+ items: {
1253
+ enum: ['fragment', 'query', 'mutation', 'subscription'],
1254
+ },
1255
+ description: 'Allow certain definitions to be placed alongside others.',
1256
+ },
1257
+ },
1258
+ },
1259
+ };
1260
+ const rule$3 = {
1261
+ meta: {
1262
+ type: 'suggestion',
1263
+ docs: {
1264
+ category: 'Operations',
1265
+ description: 'Require all queries, mutations, subscriptions and fragments to be located in separate files.',
1266
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$1}.md`,
1267
+ examples: [
1268
+ {
1269
+ title: 'Incorrect',
1270
+ code: /* GraphQL */ `
1271
+ query Foo {
1272
+ id
1273
+ }
1274
+ fragment Bar on Baz {
1275
+ id
1276
+ }
1277
+ `,
1278
+ },
1279
+ {
1280
+ title: 'Correct',
1281
+ code: /* GraphQL */ `
1282
+ query Foo {
1283
+ id
1284
+ }
1285
+ `,
1286
+ },
1287
+ ],
1288
+ },
1289
+ messages: {
1290
+ [RULE_ID$1]: '{{name}} should be in a separate file.',
1291
+ },
1292
+ schema: schema$3,
1293
+ },
1294
+ create(context) {
1295
+ var _a;
1296
+ const ignore = new Set(((_a = context.options[0]) === null || _a === void 0 ? void 0 : _a.ignore) || []);
1297
+ const definitions = [];
1298
+ return {
1299
+ ':matches(OperationDefinition, FragmentDefinition)'(node) {
1300
+ const type = 'operation' in node ? node.operation : 'fragment';
1301
+ if (!ignore.has(type)) {
1302
+ definitions.push({ type, node });
1303
+ }
1304
+ },
1305
+ 'Program:exit'() {
1306
+ var _a, _b;
1307
+ for (const { node, type } of definitions.slice(1) /* ignore first definition */) {
1308
+ let name = pascalCase(type);
1309
+ const definitionName = (_a = node.name) === null || _a === void 0 ? void 0 : _a.value;
1310
+ if (definitionName) {
1311
+ name += ` "${definitionName}"`;
1312
+ }
1313
+ context.report({
1314
+ loc: ((_b = node.name) === null || _b === void 0 ? void 0 : _b.loc) || getLocation(node.loc.start, type),
1315
+ messageId: RULE_ID$1,
1316
+ data: { name },
1317
+ });
1318
+ }
1319
+ },
1320
+ };
1321
+ },
1322
+ };
1323
+
1232
1324
  const MATCH_EXTENSION = 'MATCH_EXTENSION';
1233
1325
  const MATCH_STYLE = 'MATCH_STYLE';
1234
- const ACCEPTED_EXTENSIONS = ['.gql', '.graphql'];
1235
1326
  const CASE_STYLES = [
1236
1327
  'camelCase',
1237
1328
  'PascalCase',
@@ -1243,7 +1334,39 @@ const CASE_STYLES = [
1243
1334
  const schemaOption = {
1244
1335
  oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asObject' }],
1245
1336
  };
1246
- const rule$3 = {
1337
+ const schema$4 = {
1338
+ definitions: {
1339
+ asString: {
1340
+ enum: CASE_STYLES,
1341
+ description: `One of: ${CASE_STYLES.map(t => `\`${t}\``).join(', ')}`,
1342
+ },
1343
+ asObject: {
1344
+ type: 'object',
1345
+ additionalProperties: false,
1346
+ minProperties: 1,
1347
+ properties: {
1348
+ style: { enum: CASE_STYLES },
1349
+ suffix: { type: 'string' },
1350
+ },
1351
+ },
1352
+ },
1353
+ type: 'array',
1354
+ minItems: 1,
1355
+ maxItems: 1,
1356
+ items: {
1357
+ type: 'object',
1358
+ additionalProperties: false,
1359
+ minProperties: 1,
1360
+ properties: {
1361
+ fileExtension: { enum: ['.gql', '.graphql'] },
1362
+ query: schemaOption,
1363
+ mutation: schemaOption,
1364
+ subscription: schemaOption,
1365
+ fragment: schemaOption,
1366
+ },
1367
+ },
1368
+ };
1369
+ const rule$4 = {
1247
1370
  meta: {
1248
1371
  type: 'suggestion',
1249
1372
  docs: {
@@ -1334,38 +1457,7 @@ const rule$3 = {
1334
1457
  [MATCH_EXTENSION]: 'File extension "{{ fileExtension }}" don\'t match extension "{{ expectedFileExtension }}"',
1335
1458
  [MATCH_STYLE]: 'Unexpected filename "{{ filename }}". Rename it to "{{ expectedFilename }}"',
1336
1459
  },
1337
- schema: {
1338
- definitions: {
1339
- asString: {
1340
- enum: CASE_STYLES,
1341
- description: `One of: ${CASE_STYLES.map(t => `\`${t}\``).join(', ')}`,
1342
- },
1343
- asObject: {
1344
- type: 'object',
1345
- additionalProperties: false,
1346
- minProperties: 1,
1347
- properties: {
1348
- style: { enum: CASE_STYLES },
1349
- suffix: { type: 'string' },
1350
- },
1351
- },
1352
- },
1353
- type: 'array',
1354
- minItems: 1,
1355
- maxItems: 1,
1356
- items: {
1357
- type: 'object',
1358
- additionalProperties: false,
1359
- minProperties: 1,
1360
- properties: {
1361
- fileExtension: { enum: ACCEPTED_EXTENSIONS },
1362
- query: schemaOption,
1363
- mutation: schemaOption,
1364
- subscription: schemaOption,
1365
- fragment: schemaOption,
1366
- },
1367
- },
1368
- },
1460
+ schema: schema$4,
1369
1461
  },
1370
1462
  create(context) {
1371
1463
  const options = context.options[0] || {
@@ -1467,7 +1559,67 @@ const ALLOWED_STYLES = Object.keys(StyleToRegex);
1467
1559
  const schemaOption$1 = {
1468
1560
  oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asObject' }],
1469
1561
  };
1470
- const rule$4 = {
1562
+ const schema$5 = {
1563
+ definitions: {
1564
+ asString: {
1565
+ enum: ALLOWED_STYLES,
1566
+ description: `One of: ${ALLOWED_STYLES.map(t => `\`${t}\``).join(', ')}`,
1567
+ },
1568
+ asObject: {
1569
+ type: 'object',
1570
+ additionalProperties: false,
1571
+ properties: {
1572
+ style: { enum: ALLOWED_STYLES },
1573
+ prefix: { type: 'string' },
1574
+ suffix: { type: 'string' },
1575
+ forbiddenPrefixes: ARRAY_DEFAULT_OPTIONS,
1576
+ forbiddenSuffixes: ARRAY_DEFAULT_OPTIONS,
1577
+ ignorePattern: {
1578
+ type: 'string',
1579
+ description: 'Option to skip validation of some words, e.g. acronyms',
1580
+ },
1581
+ },
1582
+ },
1583
+ },
1584
+ type: 'array',
1585
+ maxItems: 1,
1586
+ items: {
1587
+ type: 'object',
1588
+ additionalProperties: false,
1589
+ properties: {
1590
+ types: {
1591
+ ...schemaOption$1,
1592
+ description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1593
+ },
1594
+ ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1595
+ kind,
1596
+ {
1597
+ ...schemaOption$1,
1598
+ description: `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`,
1599
+ },
1600
+ ])),
1601
+ allowLeadingUnderscore: {
1602
+ type: 'boolean',
1603
+ default: false,
1604
+ },
1605
+ allowTrailingUnderscore: {
1606
+ type: 'boolean',
1607
+ default: false,
1608
+ },
1609
+ },
1610
+ patternProperties: {
1611
+ [`^(${ALLOWED_KINDS.join('|')})(.+)?$`]: schemaOption$1,
1612
+ },
1613
+ description: [
1614
+ "> It's possible to use a [`selector`](https://eslint.org/docs/developer-guide/selectors) that starts with allowed `ASTNode` names which are described below.",
1615
+ '>',
1616
+ '> Paste or drop code into the editor in [ASTExplorer](https://astexplorer.net) and inspect the generated AST to compose your selector.',
1617
+ '>',
1618
+ '> Example: pattern property `FieldDefinition[parent.name.value=Query]` will match only fields for type `Query`.',
1619
+ ].join('\n'),
1620
+ },
1621
+ };
1622
+ const rule$5 = {
1471
1623
  meta: {
1472
1624
  type: 'suggestion',
1473
1625
  docs: {
@@ -1583,66 +1735,7 @@ const rule$4 = {
1583
1735
  },
1584
1736
  },
1585
1737
  hasSuggestions: true,
1586
- schema: {
1587
- definitions: {
1588
- asString: {
1589
- enum: ALLOWED_STYLES,
1590
- description: `One of: ${ALLOWED_STYLES.map(t => `\`${t}\``).join(', ')}`,
1591
- },
1592
- asObject: {
1593
- type: 'object',
1594
- additionalProperties: false,
1595
- properties: {
1596
- style: { enum: ALLOWED_STYLES },
1597
- prefix: { type: 'string' },
1598
- suffix: { type: 'string' },
1599
- forbiddenPrefixes: ARRAY_DEFAULT_OPTIONS,
1600
- forbiddenSuffixes: ARRAY_DEFAULT_OPTIONS,
1601
- ignorePattern: {
1602
- type: 'string',
1603
- description: 'Option to skip validation of some words, e.g. acronyms',
1604
- },
1605
- },
1606
- },
1607
- },
1608
- type: 'array',
1609
- maxItems: 1,
1610
- items: {
1611
- type: 'object',
1612
- additionalProperties: false,
1613
- properties: {
1614
- types: {
1615
- ...schemaOption$1,
1616
- description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1617
- },
1618
- ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1619
- kind,
1620
- {
1621
- ...schemaOption$1,
1622
- description: `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`,
1623
- },
1624
- ])),
1625
- allowLeadingUnderscore: {
1626
- type: 'boolean',
1627
- default: false,
1628
- },
1629
- allowTrailingUnderscore: {
1630
- type: 'boolean',
1631
- default: false,
1632
- },
1633
- },
1634
- patternProperties: {
1635
- [`^(${ALLOWED_KINDS.join('|')})(.+)?$`]: schemaOption$1,
1636
- },
1637
- description: [
1638
- "> It's possible to use a [`selector`](https://eslint.org/docs/developer-guide/selectors) that starts with allowed `ASTNode` names which are described below.",
1639
- '>',
1640
- '> Paste or drop code into the editor in [ASTExplorer](https://astexplorer.net) and inspect the generated AST to compose your selector.',
1641
- '>',
1642
- '> Example: pattern property `FieldDefinition[parent.name.value=Query]` will match only fields for type `Query`.',
1643
- ].join('\n'),
1644
- },
1645
- },
1738
+ schema: schema$5,
1646
1739
  },
1647
1740
  create(context) {
1648
1741
  const options = context.options[0] || {};
@@ -1742,8 +1835,8 @@ const rule$4 = {
1742
1835
  },
1743
1836
  };
1744
1837
 
1745
- const RULE_ID$1 = 'no-anonymous-operations';
1746
- const rule$5 = {
1838
+ const RULE_ID$2 = 'no-anonymous-operations';
1839
+ const rule$6 = {
1747
1840
  meta: {
1748
1841
  type: 'suggestion',
1749
1842
  hasSuggestions: true,
@@ -1751,7 +1844,7 @@ const rule$5 = {
1751
1844
  category: 'Operations',
1752
1845
  description: 'Require name for your GraphQL operations. This is useful since most GraphQL client libraries are using the operation name for caching purposes.',
1753
1846
  recommended: true,
1754
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$1}.md`,
1847
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$2}.md`,
1755
1848
  examples: [
1756
1849
  {
1757
1850
  title: 'Incorrect',
@@ -1772,7 +1865,7 @@ const rule$5 = {
1772
1865
  ],
1773
1866
  },
1774
1867
  messages: {
1775
- [RULE_ID$1]: 'Anonymous GraphQL operations are forbidden. Make sure to name your {{ operation }}!',
1868
+ [RULE_ID$2]: 'Anonymous GraphQL operations are forbidden. Make sure to name your {{ operation }}!',
1776
1869
  },
1777
1870
  schema: [],
1778
1871
  },
@@ -1785,7 +1878,7 @@ const rule$5 = {
1785
1878
  : node.operation;
1786
1879
  context.report({
1787
1880
  loc: getLocation(node.loc.start, node.operation),
1788
- messageId: RULE_ID$1,
1881
+ messageId: RULE_ID$2,
1789
1882
  data: {
1790
1883
  operation: node.operation,
1791
1884
  },
@@ -1805,7 +1898,7 @@ const rule$5 = {
1805
1898
  },
1806
1899
  };
1807
1900
 
1808
- const rule$6 = {
1901
+ const rule$7 = {
1809
1902
  meta: {
1810
1903
  type: 'suggestion',
1811
1904
  hasSuggestions: true,
@@ -1863,15 +1956,15 @@ const rule$6 = {
1863
1956
  },
1864
1957
  };
1865
1958
 
1866
- const RULE_ID$2 = 'no-deprecated';
1867
- const rule$7 = {
1959
+ const RULE_ID$3 = 'no-deprecated';
1960
+ const rule$8 = {
1868
1961
  meta: {
1869
1962
  type: 'suggestion',
1870
1963
  hasSuggestions: true,
1871
1964
  docs: {
1872
1965
  category: 'Operations',
1873
1966
  description: 'Enforce that deprecated fields or enum values are not in use by operations.',
1874
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$2}.md`,
1967
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$3}.md`,
1875
1968
  requiresSchema: true,
1876
1969
  examples: [
1877
1970
  {
@@ -1938,18 +2031,18 @@ const rule$7 = {
1938
2031
  recommended: true,
1939
2032
  },
1940
2033
  messages: {
1941
- [RULE_ID$2]: 'This {{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})',
2034
+ [RULE_ID$3]: 'This {{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})',
1942
2035
  },
1943
2036
  schema: [],
1944
2037
  },
1945
2038
  create(context) {
1946
- requireGraphQLSchemaFromContext(RULE_ID$2, context);
2039
+ requireGraphQLSchemaFromContext(RULE_ID$3, context);
1947
2040
  function report(node, reason) {
1948
2041
  const nodeName = node.kind === Kind.ENUM ? node.value : node.name.value;
1949
2042
  const nodeType = node.kind === Kind.ENUM ? 'enum value' : 'field';
1950
2043
  context.report({
1951
2044
  node,
1952
- messageId: RULE_ID$2,
2045
+ messageId: RULE_ID$3,
1953
2046
  data: {
1954
2047
  type: nodeType,
1955
2048
  reason,
@@ -1983,15 +2076,15 @@ const rule$7 = {
1983
2076
  },
1984
2077
  };
1985
2078
 
1986
- const RULE_ID$3 = 'no-duplicate-fields';
1987
- const rule$8 = {
2079
+ const RULE_ID$4 = 'no-duplicate-fields';
2080
+ const rule$9 = {
1988
2081
  meta: {
1989
2082
  type: 'suggestion',
1990
2083
  hasSuggestions: true,
1991
2084
  docs: {
1992
2085
  description: 'Checks for duplicate fields in selection set, variables in operation definition, or in arguments set of a field.',
1993
2086
  category: 'Operations',
1994
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$3}.md`,
2087
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$4}.md`,
1995
2088
  recommended: true,
1996
2089
  examples: [
1997
2090
  {
@@ -2037,7 +2130,7 @@ const rule$8 = {
2037
2130
  ],
2038
2131
  },
2039
2132
  messages: {
2040
- [RULE_ID$3]: '{{ type }} `{{ fieldName }}` defined multiple times.',
2133
+ [RULE_ID$4]: '{{ type }} `{{ fieldName }}` defined multiple times.',
2041
2134
  },
2042
2135
  schema: [],
2043
2136
  },
@@ -2048,7 +2141,7 @@ const rule$8 = {
2048
2141
  const { parent } = node;
2049
2142
  context.report({
2050
2143
  node,
2051
- messageId: RULE_ID$3,
2144
+ messageId: RULE_ID$4,
2052
2145
  data: {
2053
2146
  type: parent.type,
2054
2147
  fieldName,
@@ -2093,7 +2186,7 @@ const rule$8 = {
2093
2186
  };
2094
2187
 
2095
2188
  const HASHTAG_COMMENT = 'HASHTAG_COMMENT';
2096
- const rule$9 = {
2189
+ const rule$a = {
2097
2190
  meta: {
2098
2191
  type: 'suggestion',
2099
2192
  hasSuggestions: true,
@@ -2178,8 +2271,25 @@ const rule$9 = {
2178
2271
  },
2179
2272
  };
2180
2273
 
2181
- const ROOT_TYPES = ['mutation', 'subscription'];
2182
- const rule$a = {
2274
+ const schema$6 = {
2275
+ type: 'array',
2276
+ minItems: 1,
2277
+ maxItems: 1,
2278
+ items: {
2279
+ type: 'object',
2280
+ additionalProperties: false,
2281
+ required: ['disallow'],
2282
+ properties: {
2283
+ disallow: {
2284
+ ...ARRAY_DEFAULT_OPTIONS,
2285
+ items: {
2286
+ enum: ['mutation', 'subscription'],
2287
+ },
2288
+ },
2289
+ },
2290
+ },
2291
+ };
2292
+ const rule$b = {
2183
2293
  meta: {
2184
2294
  type: 'suggestion',
2185
2295
  hasSuggestions: true,
@@ -2210,24 +2320,7 @@ const rule$a = {
2210
2320
  },
2211
2321
  ],
2212
2322
  },
2213
- schema: {
2214
- type: 'array',
2215
- minItems: 1,
2216
- maxItems: 1,
2217
- items: {
2218
- type: 'object',
2219
- additionalProperties: false,
2220
- required: ['disallow'],
2221
- properties: {
2222
- disallow: {
2223
- ...ARRAY_DEFAULT_OPTIONS,
2224
- items: {
2225
- enum: ROOT_TYPES,
2226
- },
2227
- },
2228
- },
2229
- },
2230
- },
2323
+ schema: schema$6,
2231
2324
  },
2232
2325
  create(context) {
2233
2326
  const schema = requireGraphQLSchemaFromContext('no-root-type', context);
@@ -2261,15 +2354,15 @@ const rule$a = {
2261
2354
  },
2262
2355
  };
2263
2356
 
2264
- const RULE_ID$4 = 'no-scalar-result-type-on-mutation';
2265
- const rule$b = {
2357
+ const RULE_ID$5 = 'no-scalar-result-type-on-mutation';
2358
+ const rule$c = {
2266
2359
  meta: {
2267
2360
  type: 'suggestion',
2268
2361
  hasSuggestions: true,
2269
2362
  docs: {
2270
2363
  category: 'Schema',
2271
2364
  description: 'Avoid scalar result type on mutation type to make sure to return a valid state.',
2272
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$4}.md`,
2365
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$5}.md`,
2273
2366
  requiresSchema: true,
2274
2367
  examples: [
2275
2368
  {
@@ -2293,7 +2386,7 @@ const rule$b = {
2293
2386
  schema: [],
2294
2387
  },
2295
2388
  create(context) {
2296
- const schema = requireGraphQLSchemaFromContext(RULE_ID$4, context);
2389
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$5, context);
2297
2390
  const mutationType = schema.getMutationType();
2298
2391
  if (!mutationType) {
2299
2392
  return {};
@@ -2324,7 +2417,7 @@ const rule$b = {
2324
2417
  };
2325
2418
 
2326
2419
  const NO_TYPENAME_PREFIX = 'NO_TYPENAME_PREFIX';
2327
- const rule$c = {
2420
+ const rule$d = {
2328
2421
  meta: {
2329
2422
  type: 'suggestion',
2330
2423
  hasSuggestions: true,
@@ -2386,7 +2479,7 @@ const rule$c = {
2386
2479
  },
2387
2480
  };
2388
2481
 
2389
- const RULE_ID$5 = 'no-unreachable-types';
2482
+ const RULE_ID$6 = 'no-unreachable-types';
2390
2483
  const KINDS = [
2391
2484
  Kind.DIRECTIVE_DEFINITION,
2392
2485
  Kind.OBJECT_TYPE_DEFINITION,
@@ -2466,15 +2559,15 @@ function getReachableTypes(schema) {
2466
2559
  reachableTypesCache = reachableTypes;
2467
2560
  return reachableTypesCache;
2468
2561
  }
2469
- const rule$d = {
2562
+ const rule$e = {
2470
2563
  meta: {
2471
2564
  messages: {
2472
- [RULE_ID$5]: '{{ type }} `{{ typeName }}` is unreachable.',
2565
+ [RULE_ID$6]: '{{ type }} `{{ typeName }}` is unreachable.',
2473
2566
  },
2474
2567
  docs: {
2475
2568
  description: 'Requires all types to be reachable at some level by root level fields.',
2476
2569
  category: 'Schema',
2477
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$5}.md`,
2570
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$6}.md`,
2478
2571
  requiresSchema: true,
2479
2572
  examples: [
2480
2573
  {
@@ -2511,7 +2604,7 @@ const rule$d = {
2511
2604
  hasSuggestions: true,
2512
2605
  },
2513
2606
  create(context) {
2514
- const schema = requireGraphQLSchemaFromContext(RULE_ID$5, context);
2607
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$6, context);
2515
2608
  const reachableTypes = getReachableTypes(schema);
2516
2609
  return {
2517
2610
  [`:matches(${KINDS}) > .name`](node) {
@@ -2520,7 +2613,7 @@ const rule$d = {
2520
2613
  const type = lowerCase(node.parent.kind.replace(/(Extension|Definition)$/, ''));
2521
2614
  context.report({
2522
2615
  node,
2523
- messageId: RULE_ID$5,
2616
+ messageId: RULE_ID$6,
2524
2617
  data: {
2525
2618
  type: type[0].toUpperCase() + type.slice(1),
2526
2619
  typeName,
@@ -2538,7 +2631,7 @@ const rule$d = {
2538
2631
  },
2539
2632
  };
2540
2633
 
2541
- const RULE_ID$6 = 'no-unused-fields';
2634
+ const RULE_ID$7 = 'no-unused-fields';
2542
2635
  let usedFieldsCache;
2543
2636
  function getUsedFields(schema, operations) {
2544
2637
  // We don't want cache usedFields on test environment
@@ -2569,15 +2662,15 @@ function getUsedFields(schema, operations) {
2569
2662
  usedFieldsCache = usedFields;
2570
2663
  return usedFieldsCache;
2571
2664
  }
2572
- const rule$e = {
2665
+ const rule$f = {
2573
2666
  meta: {
2574
2667
  messages: {
2575
- [RULE_ID$6]: 'Field "{{fieldName}}" is unused',
2668
+ [RULE_ID$7]: 'Field "{{fieldName}}" is unused',
2576
2669
  },
2577
2670
  docs: {
2578
2671
  description: 'Requires all fields to be used at some level by siblings operations.',
2579
2672
  category: 'Schema',
2580
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$6}.md`,
2673
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$7}.md`,
2581
2674
  requiresSiblings: true,
2582
2675
  requiresSchema: true,
2583
2676
  isDisabledForAllConfig: true,
@@ -2630,8 +2723,8 @@ const rule$e = {
2630
2723
  hasSuggestions: true,
2631
2724
  },
2632
2725
  create(context) {
2633
- const schema = requireGraphQLSchemaFromContext(RULE_ID$6, context);
2634
- const siblingsOperations = requireSiblingsOperations(RULE_ID$6, context);
2726
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$7, context);
2727
+ const siblingsOperations = requireSiblingsOperations(RULE_ID$7, context);
2635
2728
  const usedFields = getUsedFields(schema, siblingsOperations);
2636
2729
  return {
2637
2730
  FieldDefinition(node) {
@@ -2644,7 +2737,7 @@ const rule$e = {
2644
2737
  }
2645
2738
  context.report({
2646
2739
  node: node.name,
2647
- messageId: RULE_ID$6,
2740
+ messageId: RULE_ID$7,
2648
2741
  data: { fieldName },
2649
2742
  suggest: [
2650
2743
  {
@@ -2664,9 +2757,25 @@ const rule$e = {
2664
2757
  },
2665
2758
  };
2666
2759
 
2667
- const RULE_ID$7 = 'relay-arguments';
2760
+ const RULE_ID$8 = 'relay-arguments';
2668
2761
  const MISSING_ARGUMENTS = 'MISSING_ARGUMENTS';
2669
- const rule$f = {
2762
+ const schema$7 = {
2763
+ type: 'array',
2764
+ maxItems: 1,
2765
+ items: {
2766
+ type: 'object',
2767
+ additionalProperties: false,
2768
+ minProperties: 1,
2769
+ properties: {
2770
+ includeBoth: {
2771
+ type: 'boolean',
2772
+ default: true,
2773
+ description: 'Enforce including both forward and backward pagination arguments',
2774
+ },
2775
+ },
2776
+ },
2777
+ };
2778
+ const rule$g = {
2670
2779
  meta: {
2671
2780
  type: 'problem',
2672
2781
  docs: {
@@ -2686,7 +2795,7 @@ const rule$f = {
2686
2795
  '- `last` takes a non-negative integer',
2687
2796
  '- `before` takes the Cursor type',
2688
2797
  ].join('\n'),
2689
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$7}.md`,
2798
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$8}.md`,
2690
2799
  examples: [
2691
2800
  {
2692
2801
  title: 'Incorrect',
@@ -2710,25 +2819,10 @@ const rule$f = {
2710
2819
  messages: {
2711
2820
  [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.',
2712
2821
  },
2713
- schema: {
2714
- type: 'array',
2715
- maxItems: 1,
2716
- items: {
2717
- type: 'object',
2718
- additionalProperties: false,
2719
- minProperties: 1,
2720
- properties: {
2721
- includeBoth: {
2722
- type: 'boolean',
2723
- default: true,
2724
- description: 'Enforce including both forward and backward pagination arguments',
2725
- },
2726
- },
2727
- },
2728
- },
2822
+ schema: schema$7,
2729
2823
  },
2730
2824
  create(context) {
2731
- const schema = requireGraphQLSchemaFromContext(RULE_ID$7, context);
2825
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$8, context);
2732
2826
  const { includeBoth = true } = context.options[0] || {};
2733
2827
  return {
2734
2828
  'FieldDefinition > .gqlType Name[value=/Connection$/]'(node) {
@@ -2800,7 +2894,7 @@ const NON_OBJECT_TYPES = [
2800
2894
  const notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`;
2801
2895
  const hasEdgesField = (node) => node.fields.some(field => field.name.value === 'edges');
2802
2896
  const hasPageInfoField = (node) => node.fields.some(field => field.name.value === 'pageInfo');
2803
- const rule$g = {
2897
+ const rule$h = {
2804
2898
  meta: {
2805
2899
  type: 'problem',
2806
2900
  docs: {
@@ -2884,7 +2978,7 @@ const rule$g = {
2884
2978
  },
2885
2979
  };
2886
2980
 
2887
- const RULE_ID$8 = 'relay-edge-types';
2981
+ const RULE_ID$9 = 'relay-edge-types';
2888
2982
  const MESSAGE_MUST_BE_OBJECT_TYPE = 'MESSAGE_MUST_BE_OBJECT_TYPE';
2889
2983
  const MESSAGE_MISSING_EDGE_SUFFIX = 'MESSAGE_MISSING_EDGE_SUFFIX';
2890
2984
  const MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = 'MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE';
@@ -2919,7 +3013,33 @@ function getEdgeTypes(schema) {
2919
3013
  edgeTypesCache = edgeTypes;
2920
3014
  return edgeTypesCache;
2921
3015
  }
2922
- const rule$h = {
3016
+ const schema$8 = {
3017
+ type: 'array',
3018
+ maxItems: 1,
3019
+ items: {
3020
+ type: 'object',
3021
+ additionalProperties: false,
3022
+ minProperties: 1,
3023
+ properties: {
3024
+ withEdgeSuffix: {
3025
+ type: 'boolean',
3026
+ default: true,
3027
+ description: 'Edge type name must end in "Edge".',
3028
+ },
3029
+ shouldImplementNode: {
3030
+ type: 'boolean',
3031
+ default: true,
3032
+ description: "Edge type's field `node` must implement `Node` interface.",
3033
+ },
3034
+ listTypeCanWrapOnlyEdgeType: {
3035
+ type: 'boolean',
3036
+ default: true,
3037
+ description: 'A list type should only wrap an edge type.',
3038
+ },
3039
+ },
3040
+ },
3041
+ };
3042
+ const rule$i = {
2923
3043
  meta: {
2924
3044
  type: 'problem',
2925
3045
  docs: {
@@ -2935,7 +3055,7 @@ const rule$h = {
2935
3055
  "- Edge type's field `node` must implement `Node` interface _(optional)_",
2936
3056
  '- A list type should only wrap an edge type _(optional)_',
2937
3057
  ].join('\n'),
2938
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$8}.md`,
3058
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$9}.md`,
2939
3059
  isDisabledForAllConfig: true,
2940
3060
  requiresSchema: true,
2941
3061
  examples: [
@@ -2956,35 +3076,10 @@ const rule$h = {
2956
3076
  [MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE]: 'A list type should only wrap an edge type.',
2957
3077
  [MESSAGE_SHOULD_IMPLEMENTS_NODE]: "Edge type's field `node` must implement `Node` interface.",
2958
3078
  },
2959
- schema: {
2960
- type: 'array',
2961
- maxItems: 1,
2962
- items: {
2963
- type: 'object',
2964
- additionalProperties: false,
2965
- minProperties: 1,
2966
- properties: {
2967
- withEdgeSuffix: {
2968
- type: 'boolean',
2969
- default: true,
2970
- description: 'Edge type name must end in "Edge".',
2971
- },
2972
- shouldImplementNode: {
2973
- type: 'boolean',
2974
- default: true,
2975
- description: "Edge type's field `node` must implement `Node` interface.",
2976
- },
2977
- listTypeCanWrapOnlyEdgeType: {
2978
- type: 'boolean',
2979
- default: true,
2980
- description: 'A list type should only wrap an edge type.',
2981
- },
2982
- },
2983
- },
2984
- },
3079
+ schema: schema$8,
2985
3080
  },
2986
3081
  create(context) {
2987
- const schema = requireGraphQLSchemaFromContext(RULE_ID$8, context);
3082
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$9, context);
2988
3083
  const edgeTypes = getEdgeTypes(schema);
2989
3084
  const options = {
2990
3085
  withEdgeSuffix: true,
@@ -3067,12 +3162,12 @@ const rule$h = {
3067
3162
  },
3068
3163
  };
3069
3164
 
3070
- const RULE_ID$9 = 'relay-page-info';
3165
+ const RULE_ID$a = 'relay-page-info';
3071
3166
  const MESSAGE_MUST_EXIST = 'MESSAGE_MUST_EXIST';
3072
3167
  const MESSAGE_MUST_BE_OBJECT_TYPE$1 = 'MESSAGE_MUST_BE_OBJECT_TYPE';
3073
3168
  const notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
3074
3169
  let hasPageInfoChecked = false;
3075
- const rule$i = {
3170
+ const rule$j = {
3076
3171
  meta: {
3077
3172
  type: 'problem',
3078
3173
  docs: {
@@ -3084,7 +3179,7 @@ const rule$i = {
3084
3179
  '- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean',
3085
3180
  '- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results',
3086
3181
  ].join('\n'),
3087
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$9}.md`,
3182
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$a}.md`,
3088
3183
  examples: [
3089
3184
  {
3090
3185
  title: 'Correct',
@@ -3108,7 +3203,7 @@ const rule$i = {
3108
3203
  schema: [],
3109
3204
  },
3110
3205
  create(context) {
3111
- const schema = requireGraphQLSchemaFromContext(RULE_ID$9, context);
3206
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$a, context);
3112
3207
  if (process.env.NODE_ENV === 'test' || !hasPageInfoChecked) {
3113
3208
  const pageInfoType = schema.getType('PageInfo');
3114
3209
  if (!pageInfoType) {
@@ -3324,7 +3419,20 @@ const MESSAGE_REQUIRE_DATE = 'MESSAGE_REQUIRE_DATE';
3324
3419
  const MESSAGE_INVALID_FORMAT = 'MESSAGE_INVALID_FORMAT';
3325
3420
  const MESSAGE_INVALID_DATE = 'MESSAGE_INVALID_DATE';
3326
3421
  const MESSAGE_CAN_BE_REMOVED = 'MESSAGE_CAN_BE_REMOVED';
3327
- const rule$j = {
3422
+ const schema$9 = {
3423
+ type: 'array',
3424
+ maxItems: 1,
3425
+ items: {
3426
+ type: 'object',
3427
+ additionalProperties: false,
3428
+ properties: {
3429
+ argumentName: {
3430
+ type: 'string',
3431
+ },
3432
+ },
3433
+ },
3434
+ };
3435
+ const rule$k = {
3328
3436
  meta: {
3329
3437
  type: 'suggestion',
3330
3438
  hasSuggestions: true,
@@ -3369,17 +3477,7 @@ const rule$j = {
3369
3477
  [MESSAGE_INVALID_DATE]: 'Invalid "{{ deletionDate }}" deletion date',
3370
3478
  [MESSAGE_CAN_BE_REMOVED]: '"{{ nodeName }}" сan be removed',
3371
3479
  },
3372
- schema: [
3373
- {
3374
- type: 'object',
3375
- additionalProperties: false,
3376
- properties: {
3377
- argumentName: {
3378
- type: 'string',
3379
- },
3380
- },
3381
- },
3382
- ],
3480
+ schema: schema$9,
3383
3481
  },
3384
3482
  create(context) {
3385
3483
  return {
@@ -3435,7 +3533,7 @@ const rule$j = {
3435
3533
  },
3436
3534
  };
3437
3535
 
3438
- const rule$k = {
3536
+ const rule$l = {
3439
3537
  meta: {
3440
3538
  docs: {
3441
3539
  description: 'Require all deprecation directives to specify a reason.',
@@ -3488,7 +3586,7 @@ const rule$k = {
3488
3586
  },
3489
3587
  };
3490
3588
 
3491
- const RULE_ID$a = 'require-description';
3589
+ const RULE_ID$b = 'require-description';
3492
3590
  const ALLOWED_KINDS$1 = [
3493
3591
  ...TYPES_KINDS,
3494
3592
  Kind.DIRECTIVE_DEFINITION,
@@ -3525,12 +3623,40 @@ function getNodeName(node) {
3525
3623
  return node.name ? `${node.operation} ${node.name.value}` : node.operation;
3526
3624
  }
3527
3625
  }
3528
- const rule$l = {
3626
+ const schema$a = {
3627
+ type: 'array',
3628
+ minItems: 1,
3629
+ maxItems: 1,
3630
+ items: {
3631
+ type: 'object',
3632
+ additionalProperties: false,
3633
+ minProperties: 1,
3634
+ properties: {
3635
+ types: {
3636
+ type: 'boolean',
3637
+ description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
3638
+ },
3639
+ rootField: {
3640
+ type: 'boolean',
3641
+ description: 'Definitions within `Query`, `Mutation`, and `Subscription` root types.',
3642
+ },
3643
+ ...Object.fromEntries([...ALLOWED_KINDS$1].sort().map(kind => {
3644
+ let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
3645
+ if (kind === Kind.OPERATION_DEFINITION) {
3646
+ description +=
3647
+ '\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.';
3648
+ }
3649
+ return [kind, { type: 'boolean', description }];
3650
+ })),
3651
+ },
3652
+ },
3653
+ };
3654
+ const rule$m = {
3529
3655
  meta: {
3530
3656
  docs: {
3531
3657
  category: 'Schema',
3532
3658
  description: 'Enforce descriptions in type definitions and operations.',
3533
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$a}.md`,
3659
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$b}.md`,
3534
3660
  examples: [
3535
3661
  {
3536
3662
  title: 'Incorrect',
@@ -3564,6 +3690,20 @@ const rule$l = {
3564
3690
  mutation createUser {
3565
3691
  # ...
3566
3692
  }
3693
+ `,
3694
+ },
3695
+ {
3696
+ title: 'Correct',
3697
+ usage: [{ rootField: true }],
3698
+ code: /* GraphQL */ `
3699
+ type Mutation {
3700
+ "Create a new user"
3701
+ createUser: User
3702
+ }
3703
+
3704
+ type User {
3705
+ name: String
3706
+ }
3567
3707
  `,
3568
3708
  },
3569
3709
  ],
@@ -3571,41 +3711,19 @@ const rule$l = {
3571
3711
  {
3572
3712
  types: true,
3573
3713
  [Kind.DIRECTIVE_DEFINITION]: true,
3714
+ // rootField: true TODO enable in graphql-eslint v4
3574
3715
  },
3575
3716
  ],
3576
3717
  recommended: true,
3577
3718
  },
3578
3719
  type: 'suggestion',
3579
3720
  messages: {
3580
- [RULE_ID$a]: 'Description is required for `{{ nodeName }}`.',
3581
- },
3582
- schema: {
3583
- type: 'array',
3584
- minItems: 1,
3585
- maxItems: 1,
3586
- items: {
3587
- type: 'object',
3588
- additionalProperties: false,
3589
- minProperties: 1,
3590
- properties: {
3591
- types: {
3592
- type: 'boolean',
3593
- description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
3594
- },
3595
- ...Object.fromEntries([...ALLOWED_KINDS$1].sort().map(kind => {
3596
- let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
3597
- if (kind === Kind.OPERATION_DEFINITION) {
3598
- description +=
3599
- '\n\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.';
3600
- }
3601
- return [kind, { type: 'boolean', description }];
3602
- })),
3603
- },
3604
- },
3721
+ [RULE_ID$b]: 'Description is required for `{{ nodeName }}`.',
3605
3722
  },
3723
+ schema: schema$a,
3606
3724
  },
3607
3725
  create(context) {
3608
- const { types, ...restOptions } = context.options[0] || {};
3726
+ const { types, rootField, ...restOptions } = context.options[0] || {};
3609
3727
  const kinds = new Set(types ? TYPES_KINDS : []);
3610
3728
  for (const [kind, isEnabled] of Object.entries(restOptions)) {
3611
3729
  if (isEnabled) {
@@ -3615,6 +3733,13 @@ const rule$l = {
3615
3733
  kinds.delete(kind);
3616
3734
  }
3617
3735
  }
3736
+ if (rootField) {
3737
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$b, context);
3738
+ const rootTypeNames = getRootTypeNames(schema);
3739
+ kinds.add(`:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
3740
+ ...rootTypeNames,
3741
+ ].join(',')})$/] > FieldDefinition`);
3742
+ }
3618
3743
  const selector = [...kinds].join(',');
3619
3744
  return {
3620
3745
  [selector](node) {
@@ -3638,7 +3763,7 @@ const rule$l = {
3638
3763
  if (description.length === 0) {
3639
3764
  context.report({
3640
3765
  loc: isOperation ? getLocation(node.loc.start, node.operation) : node.name.loc,
3641
- messageId: RULE_ID$a,
3766
+ messageId: RULE_ID$b,
3642
3767
  data: {
3643
3768
  nodeName: getNodeName(node),
3644
3769
  },
@@ -3649,14 +3774,14 @@ const rule$l = {
3649
3774
  },
3650
3775
  };
3651
3776
 
3652
- const RULE_ID$b = 'require-field-of-type-query-in-mutation-result';
3653
- const rule$m = {
3777
+ const RULE_ID$c = 'require-field-of-type-query-in-mutation-result';
3778
+ const rule$n = {
3654
3779
  meta: {
3655
3780
  type: 'suggestion',
3656
3781
  docs: {
3657
3782
  category: 'Schema',
3658
3783
  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`.',
3659
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$b}.md`,
3784
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$c}.md`,
3660
3785
  requiresSchema: true,
3661
3786
  examples: [
3662
3787
  {
@@ -3691,7 +3816,7 @@ const rule$m = {
3691
3816
  schema: [],
3692
3817
  },
3693
3818
  create(context) {
3694
- const schema = requireGraphQLSchemaFromContext(RULE_ID$b, context);
3819
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$c, context);
3695
3820
  const mutationType = schema.getMutationType();
3696
3821
  const queryType = schema.getQueryType();
3697
3822
  if (!mutationType || !queryType) {
@@ -3717,17 +3842,36 @@ const rule$m = {
3717
3842
  },
3718
3843
  };
3719
3844
 
3720
- const RULE_ID$c = 'require-id-when-available';
3845
+ const RULE_ID$d = 'require-id-when-available';
3721
3846
  const DEFAULT_ID_FIELD_NAME = 'id';
3722
- const rule$n = {
3847
+ const schema$b = {
3848
+ definitions: {
3849
+ asString: {
3850
+ type: 'string',
3851
+ },
3852
+ asArray: ARRAY_DEFAULT_OPTIONS,
3853
+ },
3854
+ type: 'array',
3855
+ maxItems: 1,
3856
+ items: {
3857
+ type: 'object',
3858
+ additionalProperties: false,
3859
+ properties: {
3860
+ fieldName: {
3861
+ oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asArray' }],
3862
+ default: DEFAULT_ID_FIELD_NAME,
3863
+ },
3864
+ },
3865
+ },
3866
+ };
3867
+ const rule$o = {
3723
3868
  meta: {
3724
3869
  type: 'suggestion',
3725
- // eslint-disable-next-line eslint-plugin/require-meta-has-suggestions
3726
3870
  hasSuggestions: true,
3727
3871
  docs: {
3728
3872
  category: 'Operations',
3729
3873
  description: 'Enforce selecting specific fields when they are available on the GraphQL type.',
3730
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$c}.md`,
3874
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$d}.md`,
3731
3875
  requiresSchema: true,
3732
3876
  requiresSiblings: true,
3733
3877
  examples: [
@@ -3777,32 +3921,13 @@ const rule$n = {
3777
3921
  recommended: true,
3778
3922
  },
3779
3923
  messages: {
3780
- [RULE_ID$c]: "Field{{ pluralSuffix }} {{ fieldName }} must be selected when it's available on a type.\nInclude it in your selection set{{ addition }}.",
3781
- },
3782
- schema: {
3783
- definitions: {
3784
- asString: {
3785
- type: 'string',
3786
- },
3787
- asArray: ARRAY_DEFAULT_OPTIONS,
3788
- },
3789
- type: 'array',
3790
- maxItems: 1,
3791
- items: {
3792
- type: 'object',
3793
- additionalProperties: false,
3794
- properties: {
3795
- fieldName: {
3796
- oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asArray' }],
3797
- default: DEFAULT_ID_FIELD_NAME,
3798
- },
3799
- },
3800
- },
3924
+ [RULE_ID$d]: "Field{{ pluralSuffix }} {{ fieldName }} must be selected when it's available on a type.\nInclude it in your selection set{{ addition }}.",
3801
3925
  },
3926
+ schema: schema$b,
3802
3927
  },
3803
3928
  create(context) {
3804
- const schema = requireGraphQLSchemaFromContext(RULE_ID$c, context);
3805
- const siblings = requireSiblingsOperations(RULE_ID$c, context);
3929
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$d, context);
3930
+ const siblings = requireSiblingsOperations(RULE_ID$d, context);
3806
3931
  const { fieldName = DEFAULT_ID_FIELD_NAME } = context.options[0] || {};
3807
3932
  const idNames = asArray(fieldName);
3808
3933
  // Check selections only in OperationDefinition,
@@ -3883,7 +4008,7 @@ const rule$n = {
3883
4008
  : ` or add to used fragment${checkedFragmentSpreads.size > 1 ? 's' : ''} ${englishJoinWords([...checkedFragmentSpreads].map(name => `\`${name}\``))}`;
3884
4009
  const problem = {
3885
4010
  loc,
3886
- messageId: RULE_ID$c,
4011
+ messageId: RULE_ID$d,
3887
4012
  data: {
3888
4013
  pluralSuffix,
3889
4014
  fieldName,
@@ -3910,15 +4035,31 @@ const rule$n = {
3910
4035
  },
3911
4036
  };
3912
4037
 
3913
- const RULE_ID$d = 'selection-set-depth';
3914
- const rule$o = {
4038
+ const RULE_ID$e = 'selection-set-depth';
4039
+ const schema$c = {
4040
+ type: 'array',
4041
+ minItems: 1,
4042
+ maxItems: 1,
4043
+ items: {
4044
+ type: 'object',
4045
+ additionalProperties: false,
4046
+ required: ['maxDepth'],
4047
+ properties: {
4048
+ maxDepth: {
4049
+ type: 'number',
4050
+ },
4051
+ ignore: ARRAY_DEFAULT_OPTIONS,
4052
+ },
4053
+ },
4054
+ };
4055
+ const rule$p = {
3915
4056
  meta: {
3916
4057
  type: 'suggestion',
3917
4058
  hasSuggestions: true,
3918
4059
  docs: {
3919
4060
  category: 'Operations',
3920
4061
  description: 'Limit the complexity of the GraphQL operations solely by their depth. Based on [graphql-depth-limit](https://npmjs.com/package/graphql-depth-limit).',
3921
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$d}.md`,
4062
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$e}.md`,
3922
4063
  requiresSiblings: true,
3923
4064
  examples: [
3924
4065
  {
@@ -3964,30 +4105,15 @@ const rule$o = {
3964
4105
  recommended: true,
3965
4106
  configOptions: [{ maxDepth: 7 }],
3966
4107
  },
3967
- schema: {
3968
- type: 'array',
3969
- minItems: 1,
3970
- maxItems: 1,
3971
- items: {
3972
- type: 'object',
3973
- additionalProperties: false,
3974
- required: ['maxDepth'],
3975
- properties: {
3976
- maxDepth: {
3977
- type: 'number',
3978
- },
3979
- ignore: ARRAY_DEFAULT_OPTIONS,
3980
- },
3981
- },
3982
- },
4108
+ schema: schema$c,
3983
4109
  },
3984
4110
  create(context) {
3985
4111
  let siblings = null;
3986
4112
  try {
3987
- siblings = requireSiblingsOperations(RULE_ID$d, context);
4113
+ siblings = requireSiblingsOperations(RULE_ID$e, context);
3988
4114
  }
3989
4115
  catch (_a) {
3990
- logger.warn(`Rule "${RULE_ID$d}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
4116
+ logger.warn(`Rule "${RULE_ID$e}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
3991
4117
  }
3992
4118
  const { maxDepth, ignore = [] } = context.options[0];
3993
4119
  const checkFn = depthLimit(maxDepth, { ignore });
@@ -4031,22 +4157,54 @@ const rule$o = {
4031
4157
  });
4032
4158
  }
4033
4159
  catch (e) {
4034
- logger.warn(`Rule "${RULE_ID$d}" check failed due to a missing siblings operations. For more info: https://bit.ly/graphql-eslint-operations`, e);
4160
+ logger.warn(`Rule "${RULE_ID$e}" check failed due to a missing siblings operations. For more info: https://bit.ly/graphql-eslint-operations`, e);
4035
4161
  }
4036
4162
  },
4037
4163
  };
4038
4164
  },
4039
4165
  };
4040
4166
 
4041
- const RULE_ID$e = 'strict-id-in-types';
4042
- const rule$p = {
4167
+ const RULE_ID$f = 'strict-id-in-types';
4168
+ const schema$d = {
4169
+ type: 'array',
4170
+ maxItems: 1,
4171
+ items: {
4172
+ type: 'object',
4173
+ additionalProperties: false,
4174
+ properties: {
4175
+ acceptedIdNames: {
4176
+ ...ARRAY_DEFAULT_OPTIONS,
4177
+ default: ['id'],
4178
+ },
4179
+ acceptedIdTypes: {
4180
+ ...ARRAY_DEFAULT_OPTIONS,
4181
+ default: ['ID'],
4182
+ },
4183
+ exceptions: {
4184
+ type: 'object',
4185
+ additionalProperties: false,
4186
+ properties: {
4187
+ types: {
4188
+ ...ARRAY_DEFAULT_OPTIONS,
4189
+ description: 'This is used to exclude types with names that match one of the specified values.',
4190
+ },
4191
+ suffixes: {
4192
+ ...ARRAY_DEFAULT_OPTIONS,
4193
+ description: 'This is used to exclude types with names with suffixes that match one of the specified values.',
4194
+ },
4195
+ },
4196
+ },
4197
+ },
4198
+ },
4199
+ };
4200
+ const rule$q = {
4043
4201
  meta: {
4044
4202
  type: 'suggestion',
4045
4203
  docs: {
4046
4204
  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.',
4047
4205
  category: 'Schema',
4048
4206
  recommended: true,
4049
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$e}.md`,
4207
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$f}.md`,
4050
4208
  requiresSchema: true,
4051
4209
  examples: [
4052
4210
  {
@@ -4110,37 +4268,7 @@ const rule$p = {
4110
4268
  },
4111
4269
  ],
4112
4270
  },
4113
- schema: {
4114
- type: 'array',
4115
- maxItems: 1,
4116
- items: {
4117
- type: 'object',
4118
- additionalProperties: false,
4119
- properties: {
4120
- acceptedIdNames: {
4121
- ...ARRAY_DEFAULT_OPTIONS,
4122
- default: ['id'],
4123
- },
4124
- acceptedIdTypes: {
4125
- ...ARRAY_DEFAULT_OPTIONS,
4126
- default: ['ID'],
4127
- },
4128
- exceptions: {
4129
- type: 'object',
4130
- properties: {
4131
- types: {
4132
- ...ARRAY_DEFAULT_OPTIONS,
4133
- description: 'This is used to exclude types with names that match one of the specified values.',
4134
- },
4135
- suffixes: {
4136
- ...ARRAY_DEFAULT_OPTIONS,
4137
- description: 'This is used to exclude types with names with suffixes that match one of the specified values.',
4138
- },
4139
- },
4140
- },
4141
- },
4142
- },
4143
- },
4271
+ schema: schema$d,
4144
4272
  },
4145
4273
  create(context) {
4146
4274
  const options = {
@@ -4149,7 +4277,7 @@ const rule$p = {
4149
4277
  exceptions: {},
4150
4278
  ...context.options[0],
4151
4279
  };
4152
- const schema = requireGraphQLSchemaFromContext(RULE_ID$e, context);
4280
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$f, context);
4153
4281
  const rootTypeNames = [
4154
4282
  schema.getQueryType(),
4155
4283
  schema.getMutationType(),
@@ -4194,7 +4322,7 @@ const rule$p = {
4194
4322
  },
4195
4323
  };
4196
4324
 
4197
- const RULE_ID$f = 'unique-fragment-name';
4325
+ const RULE_ID$g = 'unique-fragment-name';
4198
4326
  const checkNode = (context, node, ruleId) => {
4199
4327
  const documentName = node.name.value;
4200
4328
  const siblings = requireSiblingsOperations(ruleId, context);
@@ -4221,13 +4349,13 @@ const checkNode = (context, node, ruleId) => {
4221
4349
  });
4222
4350
  }
4223
4351
  };
4224
- const rule$q = {
4352
+ const rule$r = {
4225
4353
  meta: {
4226
4354
  type: 'suggestion',
4227
4355
  docs: {
4228
4356
  category: 'Operations',
4229
4357
  description: 'Enforce unique fragment names across your project.',
4230
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$f}.md`,
4358
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$g}.md`,
4231
4359
  requiresSiblings: true,
4232
4360
  examples: [
4233
4361
  {
@@ -4265,27 +4393,27 @@ const rule$q = {
4265
4393
  ],
4266
4394
  },
4267
4395
  messages: {
4268
- [RULE_ID$f]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}',
4396
+ [RULE_ID$g]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}',
4269
4397
  },
4270
4398
  schema: [],
4271
4399
  },
4272
4400
  create(context) {
4273
4401
  return {
4274
4402
  FragmentDefinition(node) {
4275
- checkNode(context, node, RULE_ID$f);
4403
+ checkNode(context, node, RULE_ID$g);
4276
4404
  },
4277
4405
  };
4278
4406
  },
4279
4407
  };
4280
4408
 
4281
- const RULE_ID$g = 'unique-operation-name';
4282
- const rule$r = {
4409
+ const RULE_ID$h = 'unique-operation-name';
4410
+ const rule$s = {
4283
4411
  meta: {
4284
4412
  type: 'suggestion',
4285
4413
  docs: {
4286
4414
  category: 'Operations',
4287
4415
  description: 'Enforce unique operation names across your project.',
4288
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$g}.md`,
4416
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$h}.md`,
4289
4417
  requiresSiblings: true,
4290
4418
  examples: [
4291
4419
  {
@@ -4327,14 +4455,14 @@ const rule$r = {
4327
4455
  ],
4328
4456
  },
4329
4457
  messages: {
4330
- [RULE_ID$g]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}',
4458
+ [RULE_ID$h]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}',
4331
4459
  },
4332
4460
  schema: [],
4333
4461
  },
4334
4462
  create(context) {
4335
4463
  return {
4336
4464
  'OperationDefinition[name!=undefined]'(node) {
4337
- checkNode(context, node, RULE_ID$g);
4465
+ checkNode(context, node, RULE_ID$h);
4338
4466
  },
4339
4467
  };
4340
4468
  },
@@ -4348,31 +4476,32 @@ const rules = {
4348
4476
  alphabetize: rule,
4349
4477
  'description-style': rule$1,
4350
4478
  'input-name': rule$2,
4351
- 'match-document-filename': rule$3,
4352
- 'naming-convention': rule$4,
4353
- 'no-anonymous-operations': rule$5,
4354
- 'no-case-insensitive-enum-values-duplicates': rule$6,
4355
- 'no-deprecated': rule$7,
4356
- 'no-duplicate-fields': rule$8,
4357
- 'no-hashtag-description': rule$9,
4358
- 'no-root-type': rule$a,
4359
- 'no-scalar-result-type-on-mutation': rule$b,
4360
- 'no-typename-prefix': rule$c,
4361
- 'no-unreachable-types': rule$d,
4362
- 'no-unused-fields': rule$e,
4363
- 'relay-arguments': rule$f,
4364
- 'relay-connection-types': rule$g,
4365
- 'relay-edge-types': rule$h,
4366
- 'relay-page-info': rule$i,
4367
- 'require-deprecation-date': rule$j,
4368
- 'require-deprecation-reason': rule$k,
4369
- 'require-description': rule$l,
4370
- 'require-field-of-type-query-in-mutation-result': rule$m,
4371
- 'require-id-when-available': rule$n,
4372
- 'selection-set-depth': rule$o,
4373
- 'strict-id-in-types': rule$p,
4374
- 'unique-fragment-name': rule$q,
4375
- 'unique-operation-name': rule$r,
4479
+ 'lone-executable-definition': rule$3,
4480
+ 'match-document-filename': rule$4,
4481
+ 'naming-convention': rule$5,
4482
+ 'no-anonymous-operations': rule$6,
4483
+ 'no-case-insensitive-enum-values-duplicates': rule$7,
4484
+ 'no-deprecated': rule$8,
4485
+ 'no-duplicate-fields': rule$9,
4486
+ 'no-hashtag-description': rule$a,
4487
+ 'no-root-type': rule$b,
4488
+ 'no-scalar-result-type-on-mutation': rule$c,
4489
+ 'no-typename-prefix': rule$d,
4490
+ 'no-unreachable-types': rule$e,
4491
+ 'no-unused-fields': rule$f,
4492
+ 'relay-arguments': rule$g,
4493
+ 'relay-connection-types': rule$h,
4494
+ 'relay-edge-types': rule$i,
4495
+ 'relay-page-info': rule$j,
4496
+ 'require-deprecation-date': rule$k,
4497
+ 'require-deprecation-reason': rule$l,
4498
+ 'require-description': rule$m,
4499
+ 'require-field-of-type-query-in-mutation-result': rule$n,
4500
+ 'require-id-when-available': rule$o,
4501
+ 'selection-set-depth': rule$p,
4502
+ 'strict-id-in-types': rule$q,
4503
+ 'unique-fragment-name': rule$r,
4504
+ 'unique-operation-name': rule$s,
4376
4505
  };
4377
4506
 
4378
4507
  // Based on the `eslint-plugin-import`'s cache