@graphql-eslint/eslint-plugin 3.14.0-alpha-20221220004723-85c2e50 → 3.14.0-alpha-20221220171818-aa4bda7

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 +619 -469
  3. package/index.mjs +620 -470
  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 +80 -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 +68 -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,
@@ -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,40 @@ 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
+ prefix: { type: 'string' },
1351
+ },
1352
+ },
1353
+ },
1354
+ type: 'array',
1355
+ minItems: 1,
1356
+ maxItems: 1,
1357
+ items: {
1358
+ type: 'object',
1359
+ additionalProperties: false,
1360
+ minProperties: 1,
1361
+ properties: {
1362
+ fileExtension: { enum: ['.gql', '.graphql'] },
1363
+ query: schemaOption,
1364
+ mutation: schemaOption,
1365
+ subscription: schemaOption,
1366
+ fragment: schemaOption,
1367
+ },
1368
+ },
1369
+ };
1370
+ const rule$4 = {
1247
1371
  meta: {
1248
1372
  type: 'suggestion',
1249
1373
  docs: {
@@ -1318,6 +1442,26 @@ const rule$3 = {
1318
1442
  fullName
1319
1443
  }
1320
1444
  }
1445
+ `,
1446
+ },
1447
+ {
1448
+ title: 'Correct',
1449
+ usage: [{ fragment: { style: 'kebab-case', prefix: 'mutation.' } }],
1450
+ code: /* GraphQL */ `
1451
+ # mutation.add-alert.graphql
1452
+ mutation addAlert {
1453
+ foo
1454
+ }
1455
+ `,
1456
+ },
1457
+ {
1458
+ title: 'Correct',
1459
+ usage: [{ fragment: { prefix: 'query.' } }],
1460
+ code: /* GraphQL */ `
1461
+ # query.me.graphql
1462
+ query me {
1463
+ foo
1464
+ }
1321
1465
  `,
1322
1466
  },
1323
1467
  ],
@@ -1334,38 +1478,7 @@ const rule$3 = {
1334
1478
  [MATCH_EXTENSION]: 'File extension "{{ fileExtension }}" don\'t match extension "{{ expectedFileExtension }}"',
1335
1479
  [MATCH_STYLE]: 'Unexpected filename "{{ filename }}". Rename it to "{{ expectedFilename }}"',
1336
1480
  },
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
- },
1481
+ schema: schema$4,
1369
1482
  },
1370
1483
  create(context) {
1371
1484
  const options = context.options[0] || {
@@ -1412,13 +1525,13 @@ const rule$3 = {
1412
1525
  option = { style: option };
1413
1526
  }
1414
1527
  const expectedExtension = options.fileExtension || fileExtension;
1415
- let expectedFilename;
1528
+ let expectedFilename = option.prefix || '';
1416
1529
  if (option.style) {
1417
- expectedFilename =
1530
+ expectedFilename +=
1418
1531
  option.style === 'matchDocumentStyle' ? docName : convertCase(option.style, docName);
1419
1532
  }
1420
1533
  else {
1421
- expectedFilename = filename;
1534
+ expectedFilename += filename;
1422
1535
  }
1423
1536
  expectedFilename += (option.suffix || '') + expectedExtension;
1424
1537
  const filenameWithExtension = filename + expectedExtension;
@@ -1467,7 +1580,67 @@ const ALLOWED_STYLES = Object.keys(StyleToRegex);
1467
1580
  const schemaOption$1 = {
1468
1581
  oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asObject' }],
1469
1582
  };
1470
- const rule$4 = {
1583
+ const schema$5 = {
1584
+ definitions: {
1585
+ asString: {
1586
+ enum: ALLOWED_STYLES,
1587
+ description: `One of: ${ALLOWED_STYLES.map(t => `\`${t}\``).join(', ')}`,
1588
+ },
1589
+ asObject: {
1590
+ type: 'object',
1591
+ additionalProperties: false,
1592
+ properties: {
1593
+ style: { enum: ALLOWED_STYLES },
1594
+ prefix: { type: 'string' },
1595
+ suffix: { type: 'string' },
1596
+ forbiddenPrefixes: ARRAY_DEFAULT_OPTIONS,
1597
+ forbiddenSuffixes: ARRAY_DEFAULT_OPTIONS,
1598
+ ignorePattern: {
1599
+ type: 'string',
1600
+ description: 'Option to skip validation of some words, e.g. acronyms',
1601
+ },
1602
+ },
1603
+ },
1604
+ },
1605
+ type: 'array',
1606
+ maxItems: 1,
1607
+ items: {
1608
+ type: 'object',
1609
+ additionalProperties: false,
1610
+ properties: {
1611
+ types: {
1612
+ ...schemaOption$1,
1613
+ description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1614
+ },
1615
+ ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1616
+ kind,
1617
+ {
1618
+ ...schemaOption$1,
1619
+ description: `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`,
1620
+ },
1621
+ ])),
1622
+ allowLeadingUnderscore: {
1623
+ type: 'boolean',
1624
+ default: false,
1625
+ },
1626
+ allowTrailingUnderscore: {
1627
+ type: 'boolean',
1628
+ default: false,
1629
+ },
1630
+ },
1631
+ patternProperties: {
1632
+ [`^(${ALLOWED_KINDS.join('|')})(.+)?$`]: schemaOption$1,
1633
+ },
1634
+ description: [
1635
+ "> It's possible to use a [`selector`](https://eslint.org/docs/developer-guide/selectors) that starts with allowed `ASTNode` names which are described below.",
1636
+ '>',
1637
+ '> Paste or drop code into the editor in [ASTExplorer](https://astexplorer.net) and inspect the generated AST to compose your selector.',
1638
+ '>',
1639
+ '> Example: pattern property `FieldDefinition[parent.name.value=Query]` will match only fields for type `Query`.',
1640
+ ].join('\n'),
1641
+ },
1642
+ };
1643
+ const rule$5 = {
1471
1644
  meta: {
1472
1645
  type: 'suggestion',
1473
1646
  docs: {
@@ -1583,66 +1756,7 @@ const rule$4 = {
1583
1756
  },
1584
1757
  },
1585
1758
  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
- },
1759
+ schema: schema$5,
1646
1760
  },
1647
1761
  create(context) {
1648
1762
  const options = context.options[0] || {};
@@ -1742,8 +1856,8 @@ const rule$4 = {
1742
1856
  },
1743
1857
  };
1744
1858
 
1745
- const RULE_ID$1 = 'no-anonymous-operations';
1746
- const rule$5 = {
1859
+ const RULE_ID$2 = 'no-anonymous-operations';
1860
+ const rule$6 = {
1747
1861
  meta: {
1748
1862
  type: 'suggestion',
1749
1863
  hasSuggestions: true,
@@ -1751,7 +1865,7 @@ const rule$5 = {
1751
1865
  category: 'Operations',
1752
1866
  description: 'Require name for your GraphQL operations. This is useful since most GraphQL client libraries are using the operation name for caching purposes.',
1753
1867
  recommended: true,
1754
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$1}.md`,
1868
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$2}.md`,
1755
1869
  examples: [
1756
1870
  {
1757
1871
  title: 'Incorrect',
@@ -1772,7 +1886,7 @@ const rule$5 = {
1772
1886
  ],
1773
1887
  },
1774
1888
  messages: {
1775
- [RULE_ID$1]: 'Anonymous GraphQL operations are forbidden. Make sure to name your {{ operation }}!',
1889
+ [RULE_ID$2]: 'Anonymous GraphQL operations are forbidden. Make sure to name your {{ operation }}!',
1776
1890
  },
1777
1891
  schema: [],
1778
1892
  },
@@ -1785,7 +1899,7 @@ const rule$5 = {
1785
1899
  : node.operation;
1786
1900
  context.report({
1787
1901
  loc: getLocation(node.loc.start, node.operation),
1788
- messageId: RULE_ID$1,
1902
+ messageId: RULE_ID$2,
1789
1903
  data: {
1790
1904
  operation: node.operation,
1791
1905
  },
@@ -1805,7 +1919,7 @@ const rule$5 = {
1805
1919
  },
1806
1920
  };
1807
1921
 
1808
- const rule$6 = {
1922
+ const rule$7 = {
1809
1923
  meta: {
1810
1924
  type: 'suggestion',
1811
1925
  hasSuggestions: true,
@@ -1863,15 +1977,15 @@ const rule$6 = {
1863
1977
  },
1864
1978
  };
1865
1979
 
1866
- const RULE_ID$2 = 'no-deprecated';
1867
- const rule$7 = {
1980
+ const RULE_ID$3 = 'no-deprecated';
1981
+ const rule$8 = {
1868
1982
  meta: {
1869
1983
  type: 'suggestion',
1870
1984
  hasSuggestions: true,
1871
1985
  docs: {
1872
1986
  category: 'Operations',
1873
1987
  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`,
1988
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$3}.md`,
1875
1989
  requiresSchema: true,
1876
1990
  examples: [
1877
1991
  {
@@ -1938,18 +2052,18 @@ const rule$7 = {
1938
2052
  recommended: true,
1939
2053
  },
1940
2054
  messages: {
1941
- [RULE_ID$2]: 'This {{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})',
2055
+ [RULE_ID$3]: 'This {{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})',
1942
2056
  },
1943
2057
  schema: [],
1944
2058
  },
1945
2059
  create(context) {
1946
- requireGraphQLSchemaFromContext(RULE_ID$2, context);
2060
+ requireGraphQLSchemaFromContext(RULE_ID$3, context);
1947
2061
  function report(node, reason) {
1948
2062
  const nodeName = node.kind === Kind.ENUM ? node.value : node.name.value;
1949
2063
  const nodeType = node.kind === Kind.ENUM ? 'enum value' : 'field';
1950
2064
  context.report({
1951
2065
  node,
1952
- messageId: RULE_ID$2,
2066
+ messageId: RULE_ID$3,
1953
2067
  data: {
1954
2068
  type: nodeType,
1955
2069
  reason,
@@ -1983,15 +2097,15 @@ const rule$7 = {
1983
2097
  },
1984
2098
  };
1985
2099
 
1986
- const RULE_ID$3 = 'no-duplicate-fields';
1987
- const rule$8 = {
2100
+ const RULE_ID$4 = 'no-duplicate-fields';
2101
+ const rule$9 = {
1988
2102
  meta: {
1989
2103
  type: 'suggestion',
1990
2104
  hasSuggestions: true,
1991
2105
  docs: {
1992
2106
  description: 'Checks for duplicate fields in selection set, variables in operation definition, or in arguments set of a field.',
1993
2107
  category: 'Operations',
1994
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$3}.md`,
2108
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$4}.md`,
1995
2109
  recommended: true,
1996
2110
  examples: [
1997
2111
  {
@@ -2037,7 +2151,7 @@ const rule$8 = {
2037
2151
  ],
2038
2152
  },
2039
2153
  messages: {
2040
- [RULE_ID$3]: '{{ type }} `{{ fieldName }}` defined multiple times.',
2154
+ [RULE_ID$4]: '{{ type }} `{{ fieldName }}` defined multiple times.',
2041
2155
  },
2042
2156
  schema: [],
2043
2157
  },
@@ -2048,7 +2162,7 @@ const rule$8 = {
2048
2162
  const { parent } = node;
2049
2163
  context.report({
2050
2164
  node,
2051
- messageId: RULE_ID$3,
2165
+ messageId: RULE_ID$4,
2052
2166
  data: {
2053
2167
  type: parent.type,
2054
2168
  fieldName,
@@ -2093,7 +2207,7 @@ const rule$8 = {
2093
2207
  };
2094
2208
 
2095
2209
  const HASHTAG_COMMENT = 'HASHTAG_COMMENT';
2096
- const rule$9 = {
2210
+ const rule$a = {
2097
2211
  meta: {
2098
2212
  type: 'suggestion',
2099
2213
  hasSuggestions: true,
@@ -2178,8 +2292,25 @@ const rule$9 = {
2178
2292
  },
2179
2293
  };
2180
2294
 
2181
- const ROOT_TYPES = ['mutation', 'subscription'];
2182
- const rule$a = {
2295
+ const schema$6 = {
2296
+ type: 'array',
2297
+ minItems: 1,
2298
+ maxItems: 1,
2299
+ items: {
2300
+ type: 'object',
2301
+ additionalProperties: false,
2302
+ required: ['disallow'],
2303
+ properties: {
2304
+ disallow: {
2305
+ ...ARRAY_DEFAULT_OPTIONS,
2306
+ items: {
2307
+ enum: ['mutation', 'subscription'],
2308
+ },
2309
+ },
2310
+ },
2311
+ },
2312
+ };
2313
+ const rule$b = {
2183
2314
  meta: {
2184
2315
  type: 'suggestion',
2185
2316
  hasSuggestions: true,
@@ -2210,24 +2341,7 @@ const rule$a = {
2210
2341
  },
2211
2342
  ],
2212
2343
  },
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
- },
2344
+ schema: schema$6,
2231
2345
  },
2232
2346
  create(context) {
2233
2347
  const schema = requireGraphQLSchemaFromContext('no-root-type', context);
@@ -2261,15 +2375,15 @@ const rule$a = {
2261
2375
  },
2262
2376
  };
2263
2377
 
2264
- const RULE_ID$4 = 'no-scalar-result-type-on-mutation';
2265
- const rule$b = {
2378
+ const RULE_ID$5 = 'no-scalar-result-type-on-mutation';
2379
+ const rule$c = {
2266
2380
  meta: {
2267
2381
  type: 'suggestion',
2268
2382
  hasSuggestions: true,
2269
2383
  docs: {
2270
2384
  category: 'Schema',
2271
2385
  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`,
2386
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$5}.md`,
2273
2387
  requiresSchema: true,
2274
2388
  examples: [
2275
2389
  {
@@ -2293,7 +2407,7 @@ const rule$b = {
2293
2407
  schema: [],
2294
2408
  },
2295
2409
  create(context) {
2296
- const schema = requireGraphQLSchemaFromContext(RULE_ID$4, context);
2410
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$5, context);
2297
2411
  const mutationType = schema.getMutationType();
2298
2412
  if (!mutationType) {
2299
2413
  return {};
@@ -2324,7 +2438,7 @@ const rule$b = {
2324
2438
  };
2325
2439
 
2326
2440
  const NO_TYPENAME_PREFIX = 'NO_TYPENAME_PREFIX';
2327
- const rule$c = {
2441
+ const rule$d = {
2328
2442
  meta: {
2329
2443
  type: 'suggestion',
2330
2444
  hasSuggestions: true,
@@ -2386,7 +2500,7 @@ const rule$c = {
2386
2500
  },
2387
2501
  };
2388
2502
 
2389
- const RULE_ID$5 = 'no-unreachable-types';
2503
+ const RULE_ID$6 = 'no-unreachable-types';
2390
2504
  const KINDS = [
2391
2505
  Kind.DIRECTIVE_DEFINITION,
2392
2506
  Kind.OBJECT_TYPE_DEFINITION,
@@ -2466,15 +2580,15 @@ function getReachableTypes(schema) {
2466
2580
  reachableTypesCache = reachableTypes;
2467
2581
  return reachableTypesCache;
2468
2582
  }
2469
- const rule$d = {
2583
+ const rule$e = {
2470
2584
  meta: {
2471
2585
  messages: {
2472
- [RULE_ID$5]: '{{ type }} `{{ typeName }}` is unreachable.',
2586
+ [RULE_ID$6]: '{{ type }} `{{ typeName }}` is unreachable.',
2473
2587
  },
2474
2588
  docs: {
2475
2589
  description: 'Requires all types to be reachable at some level by root level fields.',
2476
2590
  category: 'Schema',
2477
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$5}.md`,
2591
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$6}.md`,
2478
2592
  requiresSchema: true,
2479
2593
  examples: [
2480
2594
  {
@@ -2511,7 +2625,7 @@ const rule$d = {
2511
2625
  hasSuggestions: true,
2512
2626
  },
2513
2627
  create(context) {
2514
- const schema = requireGraphQLSchemaFromContext(RULE_ID$5, context);
2628
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$6, context);
2515
2629
  const reachableTypes = getReachableTypes(schema);
2516
2630
  return {
2517
2631
  [`:matches(${KINDS}) > .name`](node) {
@@ -2520,7 +2634,7 @@ const rule$d = {
2520
2634
  const type = lowerCase(node.parent.kind.replace(/(Extension|Definition)$/, ''));
2521
2635
  context.report({
2522
2636
  node,
2523
- messageId: RULE_ID$5,
2637
+ messageId: RULE_ID$6,
2524
2638
  data: {
2525
2639
  type: type[0].toUpperCase() + type.slice(1),
2526
2640
  typeName,
@@ -2538,7 +2652,7 @@ const rule$d = {
2538
2652
  },
2539
2653
  };
2540
2654
 
2541
- const RULE_ID$6 = 'no-unused-fields';
2655
+ const RULE_ID$7 = 'no-unused-fields';
2542
2656
  let usedFieldsCache;
2543
2657
  function getUsedFields(schema, operations) {
2544
2658
  // We don't want cache usedFields on test environment
@@ -2569,15 +2683,15 @@ function getUsedFields(schema, operations) {
2569
2683
  usedFieldsCache = usedFields;
2570
2684
  return usedFieldsCache;
2571
2685
  }
2572
- const rule$e = {
2686
+ const rule$f = {
2573
2687
  meta: {
2574
2688
  messages: {
2575
- [RULE_ID$6]: 'Field "{{fieldName}}" is unused',
2689
+ [RULE_ID$7]: 'Field "{{fieldName}}" is unused',
2576
2690
  },
2577
2691
  docs: {
2578
2692
  description: 'Requires all fields to be used at some level by siblings operations.',
2579
2693
  category: 'Schema',
2580
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$6}.md`,
2694
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$7}.md`,
2581
2695
  requiresSiblings: true,
2582
2696
  requiresSchema: true,
2583
2697
  isDisabledForAllConfig: true,
@@ -2630,8 +2744,8 @@ const rule$e = {
2630
2744
  hasSuggestions: true,
2631
2745
  },
2632
2746
  create(context) {
2633
- const schema = requireGraphQLSchemaFromContext(RULE_ID$6, context);
2634
- const siblingsOperations = requireSiblingsOperations(RULE_ID$6, context);
2747
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$7, context);
2748
+ const siblingsOperations = requireSiblingsOperations(RULE_ID$7, context);
2635
2749
  const usedFields = getUsedFields(schema, siblingsOperations);
2636
2750
  return {
2637
2751
  FieldDefinition(node) {
@@ -2644,7 +2758,7 @@ const rule$e = {
2644
2758
  }
2645
2759
  context.report({
2646
2760
  node: node.name,
2647
- messageId: RULE_ID$6,
2761
+ messageId: RULE_ID$7,
2648
2762
  data: { fieldName },
2649
2763
  suggest: [
2650
2764
  {
@@ -2664,9 +2778,25 @@ const rule$e = {
2664
2778
  },
2665
2779
  };
2666
2780
 
2667
- const RULE_ID$7 = 'relay-arguments';
2781
+ const RULE_ID$8 = 'relay-arguments';
2668
2782
  const MISSING_ARGUMENTS = 'MISSING_ARGUMENTS';
2669
- const rule$f = {
2783
+ const schema$7 = {
2784
+ type: 'array',
2785
+ maxItems: 1,
2786
+ items: {
2787
+ type: 'object',
2788
+ additionalProperties: false,
2789
+ minProperties: 1,
2790
+ properties: {
2791
+ includeBoth: {
2792
+ type: 'boolean',
2793
+ default: true,
2794
+ description: 'Enforce including both forward and backward pagination arguments',
2795
+ },
2796
+ },
2797
+ },
2798
+ };
2799
+ const rule$g = {
2670
2800
  meta: {
2671
2801
  type: 'problem',
2672
2802
  docs: {
@@ -2686,7 +2816,7 @@ const rule$f = {
2686
2816
  '- `last` takes a non-negative integer',
2687
2817
  '- `before` takes the Cursor type',
2688
2818
  ].join('\n'),
2689
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$7}.md`,
2819
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$8}.md`,
2690
2820
  examples: [
2691
2821
  {
2692
2822
  title: 'Incorrect',
@@ -2710,25 +2840,10 @@ const rule$f = {
2710
2840
  messages: {
2711
2841
  [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
2842
  },
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
- },
2843
+ schema: schema$7,
2729
2844
  },
2730
2845
  create(context) {
2731
- const schema = requireGraphQLSchemaFromContext(RULE_ID$7, context);
2846
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$8, context);
2732
2847
  const { includeBoth = true } = context.options[0] || {};
2733
2848
  return {
2734
2849
  'FieldDefinition > .gqlType Name[value=/Connection$/]'(node) {
@@ -2800,7 +2915,7 @@ const NON_OBJECT_TYPES = [
2800
2915
  const notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`;
2801
2916
  const hasEdgesField = (node) => node.fields.some(field => field.name.value === 'edges');
2802
2917
  const hasPageInfoField = (node) => node.fields.some(field => field.name.value === 'pageInfo');
2803
- const rule$g = {
2918
+ const rule$h = {
2804
2919
  meta: {
2805
2920
  type: 'problem',
2806
2921
  docs: {
@@ -2884,7 +2999,7 @@ const rule$g = {
2884
2999
  },
2885
3000
  };
2886
3001
 
2887
- const RULE_ID$8 = 'relay-edge-types';
3002
+ const RULE_ID$9 = 'relay-edge-types';
2888
3003
  const MESSAGE_MUST_BE_OBJECT_TYPE = 'MESSAGE_MUST_BE_OBJECT_TYPE';
2889
3004
  const MESSAGE_MISSING_EDGE_SUFFIX = 'MESSAGE_MISSING_EDGE_SUFFIX';
2890
3005
  const MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = 'MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE';
@@ -2919,7 +3034,33 @@ function getEdgeTypes(schema) {
2919
3034
  edgeTypesCache = edgeTypes;
2920
3035
  return edgeTypesCache;
2921
3036
  }
2922
- const rule$h = {
3037
+ const schema$8 = {
3038
+ type: 'array',
3039
+ maxItems: 1,
3040
+ items: {
3041
+ type: 'object',
3042
+ additionalProperties: false,
3043
+ minProperties: 1,
3044
+ properties: {
3045
+ withEdgeSuffix: {
3046
+ type: 'boolean',
3047
+ default: true,
3048
+ description: 'Edge type name must end in "Edge".',
3049
+ },
3050
+ shouldImplementNode: {
3051
+ type: 'boolean',
3052
+ default: true,
3053
+ description: "Edge type's field `node` must implement `Node` interface.",
3054
+ },
3055
+ listTypeCanWrapOnlyEdgeType: {
3056
+ type: 'boolean',
3057
+ default: true,
3058
+ description: 'A list type should only wrap an edge type.',
3059
+ },
3060
+ },
3061
+ },
3062
+ };
3063
+ const rule$i = {
2923
3064
  meta: {
2924
3065
  type: 'problem',
2925
3066
  docs: {
@@ -2935,7 +3076,7 @@ const rule$h = {
2935
3076
  "- Edge type's field `node` must implement `Node` interface _(optional)_",
2936
3077
  '- A list type should only wrap an edge type _(optional)_',
2937
3078
  ].join('\n'),
2938
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$8}.md`,
3079
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$9}.md`,
2939
3080
  isDisabledForAllConfig: true,
2940
3081
  requiresSchema: true,
2941
3082
  examples: [
@@ -2956,35 +3097,10 @@ const rule$h = {
2956
3097
  [MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE]: 'A list type should only wrap an edge type.',
2957
3098
  [MESSAGE_SHOULD_IMPLEMENTS_NODE]: "Edge type's field `node` must implement `Node` interface.",
2958
3099
  },
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
- },
3100
+ schema: schema$8,
2985
3101
  },
2986
3102
  create(context) {
2987
- const schema = requireGraphQLSchemaFromContext(RULE_ID$8, context);
3103
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$9, context);
2988
3104
  const edgeTypes = getEdgeTypes(schema);
2989
3105
  const options = {
2990
3106
  withEdgeSuffix: true,
@@ -3067,12 +3183,12 @@ const rule$h = {
3067
3183
  },
3068
3184
  };
3069
3185
 
3070
- const RULE_ID$9 = 'relay-page-info';
3186
+ const RULE_ID$a = 'relay-page-info';
3071
3187
  const MESSAGE_MUST_EXIST = 'MESSAGE_MUST_EXIST';
3072
3188
  const MESSAGE_MUST_BE_OBJECT_TYPE$1 = 'MESSAGE_MUST_BE_OBJECT_TYPE';
3073
3189
  const notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
3074
3190
  let hasPageInfoChecked = false;
3075
- const rule$i = {
3191
+ const rule$j = {
3076
3192
  meta: {
3077
3193
  type: 'problem',
3078
3194
  docs: {
@@ -3084,7 +3200,7 @@ const rule$i = {
3084
3200
  '- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean',
3085
3201
  '- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results',
3086
3202
  ].join('\n'),
3087
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$9}.md`,
3203
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$a}.md`,
3088
3204
  examples: [
3089
3205
  {
3090
3206
  title: 'Correct',
@@ -3108,7 +3224,7 @@ const rule$i = {
3108
3224
  schema: [],
3109
3225
  },
3110
3226
  create(context) {
3111
- const schema = requireGraphQLSchemaFromContext(RULE_ID$9, context);
3227
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$a, context);
3112
3228
  if (process.env.NODE_ENV === 'test' || !hasPageInfoChecked) {
3113
3229
  const pageInfoType = schema.getType('PageInfo');
3114
3230
  if (!pageInfoType) {
@@ -3324,7 +3440,20 @@ const MESSAGE_REQUIRE_DATE = 'MESSAGE_REQUIRE_DATE';
3324
3440
  const MESSAGE_INVALID_FORMAT = 'MESSAGE_INVALID_FORMAT';
3325
3441
  const MESSAGE_INVALID_DATE = 'MESSAGE_INVALID_DATE';
3326
3442
  const MESSAGE_CAN_BE_REMOVED = 'MESSAGE_CAN_BE_REMOVED';
3327
- const rule$j = {
3443
+ const schema$9 = {
3444
+ type: 'array',
3445
+ maxItems: 1,
3446
+ items: {
3447
+ type: 'object',
3448
+ additionalProperties: false,
3449
+ properties: {
3450
+ argumentName: {
3451
+ type: 'string',
3452
+ },
3453
+ },
3454
+ },
3455
+ };
3456
+ const rule$k = {
3328
3457
  meta: {
3329
3458
  type: 'suggestion',
3330
3459
  hasSuggestions: true,
@@ -3369,17 +3498,7 @@ const rule$j = {
3369
3498
  [MESSAGE_INVALID_DATE]: 'Invalid "{{ deletionDate }}" deletion date',
3370
3499
  [MESSAGE_CAN_BE_REMOVED]: '"{{ nodeName }}" сan be removed',
3371
3500
  },
3372
- schema: [
3373
- {
3374
- type: 'object',
3375
- additionalProperties: false,
3376
- properties: {
3377
- argumentName: {
3378
- type: 'string',
3379
- },
3380
- },
3381
- },
3382
- ],
3501
+ schema: schema$9,
3383
3502
  },
3384
3503
  create(context) {
3385
3504
  return {
@@ -3435,7 +3554,7 @@ const rule$j = {
3435
3554
  },
3436
3555
  };
3437
3556
 
3438
- const rule$k = {
3557
+ const rule$l = {
3439
3558
  meta: {
3440
3559
  docs: {
3441
3560
  description: 'Require all deprecation directives to specify a reason.',
@@ -3488,7 +3607,7 @@ const rule$k = {
3488
3607
  },
3489
3608
  };
3490
3609
 
3491
- const RULE_ID$a = 'require-description';
3610
+ const RULE_ID$b = 'require-description';
3492
3611
  const ALLOWED_KINDS$1 = [
3493
3612
  ...TYPES_KINDS,
3494
3613
  Kind.DIRECTIVE_DEFINITION,
@@ -3525,12 +3644,40 @@ function getNodeName(node) {
3525
3644
  return node.name ? `${node.operation} ${node.name.value}` : node.operation;
3526
3645
  }
3527
3646
  }
3528
- const rule$l = {
3647
+ const schema$a = {
3648
+ type: 'array',
3649
+ minItems: 1,
3650
+ maxItems: 1,
3651
+ items: {
3652
+ type: 'object',
3653
+ additionalProperties: false,
3654
+ minProperties: 1,
3655
+ properties: {
3656
+ types: {
3657
+ type: 'boolean',
3658
+ description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
3659
+ },
3660
+ rootField: {
3661
+ type: 'boolean',
3662
+ description: 'Definitions within `Query`, `Mutation`, and `Subscription` root types.',
3663
+ },
3664
+ ...Object.fromEntries([...ALLOWED_KINDS$1].sort().map(kind => {
3665
+ let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
3666
+ if (kind === Kind.OPERATION_DEFINITION) {
3667
+ description +=
3668
+ '\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.';
3669
+ }
3670
+ return [kind, { type: 'boolean', description }];
3671
+ })),
3672
+ },
3673
+ },
3674
+ };
3675
+ const rule$m = {
3529
3676
  meta: {
3530
3677
  docs: {
3531
3678
  category: 'Schema',
3532
3679
  description: 'Enforce descriptions in type definitions and operations.',
3533
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$a}.md`,
3680
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$b}.md`,
3534
3681
  examples: [
3535
3682
  {
3536
3683
  title: 'Incorrect',
@@ -3564,6 +3711,20 @@ const rule$l = {
3564
3711
  mutation createUser {
3565
3712
  # ...
3566
3713
  }
3714
+ `,
3715
+ },
3716
+ {
3717
+ title: 'Correct',
3718
+ usage: [{ rootField: true }],
3719
+ code: /* GraphQL */ `
3720
+ type Mutation {
3721
+ "Create a new user"
3722
+ createUser: User
3723
+ }
3724
+
3725
+ type User {
3726
+ name: String
3727
+ }
3567
3728
  `,
3568
3729
  },
3569
3730
  ],
@@ -3571,41 +3732,19 @@ const rule$l = {
3571
3732
  {
3572
3733
  types: true,
3573
3734
  [Kind.DIRECTIVE_DEFINITION]: true,
3735
+ // rootField: true TODO enable in graphql-eslint v4
3574
3736
  },
3575
3737
  ],
3576
3738
  recommended: true,
3577
3739
  },
3578
3740
  type: 'suggestion',
3579
3741
  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
- },
3742
+ [RULE_ID$b]: 'Description is required for `{{ nodeName }}`.',
3605
3743
  },
3744
+ schema: schema$a,
3606
3745
  },
3607
3746
  create(context) {
3608
- const { types, ...restOptions } = context.options[0] || {};
3747
+ const { types, rootField, ...restOptions } = context.options[0] || {};
3609
3748
  const kinds = new Set(types ? TYPES_KINDS : []);
3610
3749
  for (const [kind, isEnabled] of Object.entries(restOptions)) {
3611
3750
  if (isEnabled) {
@@ -3615,6 +3754,13 @@ const rule$l = {
3615
3754
  kinds.delete(kind);
3616
3755
  }
3617
3756
  }
3757
+ if (rootField) {
3758
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$b, context);
3759
+ const rootTypeNames = getRootTypeNames(schema);
3760
+ kinds.add(`:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
3761
+ ...rootTypeNames,
3762
+ ].join(',')})$/] > FieldDefinition`);
3763
+ }
3618
3764
  const selector = [...kinds].join(',');
3619
3765
  return {
3620
3766
  [selector](node) {
@@ -3638,7 +3784,7 @@ const rule$l = {
3638
3784
  if (description.length === 0) {
3639
3785
  context.report({
3640
3786
  loc: isOperation ? getLocation(node.loc.start, node.operation) : node.name.loc,
3641
- messageId: RULE_ID$a,
3787
+ messageId: RULE_ID$b,
3642
3788
  data: {
3643
3789
  nodeName: getNodeName(node),
3644
3790
  },
@@ -3649,14 +3795,14 @@ const rule$l = {
3649
3795
  },
3650
3796
  };
3651
3797
 
3652
- const RULE_ID$b = 'require-field-of-type-query-in-mutation-result';
3653
- const rule$m = {
3798
+ const RULE_ID$c = 'require-field-of-type-query-in-mutation-result';
3799
+ const rule$n = {
3654
3800
  meta: {
3655
3801
  type: 'suggestion',
3656
3802
  docs: {
3657
3803
  category: 'Schema',
3658
3804
  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`,
3805
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$c}.md`,
3660
3806
  requiresSchema: true,
3661
3807
  examples: [
3662
3808
  {
@@ -3691,7 +3837,7 @@ const rule$m = {
3691
3837
  schema: [],
3692
3838
  },
3693
3839
  create(context) {
3694
- const schema = requireGraphQLSchemaFromContext(RULE_ID$b, context);
3840
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$c, context);
3695
3841
  const mutationType = schema.getMutationType();
3696
3842
  const queryType = schema.getQueryType();
3697
3843
  if (!mutationType || !queryType) {
@@ -3717,17 +3863,36 @@ const rule$m = {
3717
3863
  },
3718
3864
  };
3719
3865
 
3720
- const RULE_ID$c = 'require-id-when-available';
3866
+ const RULE_ID$d = 'require-id-when-available';
3721
3867
  const DEFAULT_ID_FIELD_NAME = 'id';
3722
- const rule$n = {
3868
+ const schema$b = {
3869
+ definitions: {
3870
+ asString: {
3871
+ type: 'string',
3872
+ },
3873
+ asArray: ARRAY_DEFAULT_OPTIONS,
3874
+ },
3875
+ type: 'array',
3876
+ maxItems: 1,
3877
+ items: {
3878
+ type: 'object',
3879
+ additionalProperties: false,
3880
+ properties: {
3881
+ fieldName: {
3882
+ oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asArray' }],
3883
+ default: DEFAULT_ID_FIELD_NAME,
3884
+ },
3885
+ },
3886
+ },
3887
+ };
3888
+ const rule$o = {
3723
3889
  meta: {
3724
3890
  type: 'suggestion',
3725
- // eslint-disable-next-line eslint-plugin/require-meta-has-suggestions
3726
3891
  hasSuggestions: true,
3727
3892
  docs: {
3728
3893
  category: 'Operations',
3729
3894
  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`,
3895
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$d}.md`,
3731
3896
  requiresSchema: true,
3732
3897
  requiresSiblings: true,
3733
3898
  examples: [
@@ -3777,32 +3942,13 @@ const rule$n = {
3777
3942
  recommended: true,
3778
3943
  },
3779
3944
  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
- },
3945
+ [RULE_ID$d]: "Field{{ pluralSuffix }} {{ fieldName }} must be selected when it's available on a type.\nInclude it in your selection set{{ addition }}.",
3801
3946
  },
3947
+ schema: schema$b,
3802
3948
  },
3803
3949
  create(context) {
3804
- const schema = requireGraphQLSchemaFromContext(RULE_ID$c, context);
3805
- const siblings = requireSiblingsOperations(RULE_ID$c, context);
3950
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$d, context);
3951
+ const siblings = requireSiblingsOperations(RULE_ID$d, context);
3806
3952
  const { fieldName = DEFAULT_ID_FIELD_NAME } = context.options[0] || {};
3807
3953
  const idNames = asArray(fieldName);
3808
3954
  // Check selections only in OperationDefinition,
@@ -3883,7 +4029,7 @@ const rule$n = {
3883
4029
  : ` or add to used fragment${checkedFragmentSpreads.size > 1 ? 's' : ''} ${englishJoinWords([...checkedFragmentSpreads].map(name => `\`${name}\``))}`;
3884
4030
  const problem = {
3885
4031
  loc,
3886
- messageId: RULE_ID$c,
4032
+ messageId: RULE_ID$d,
3887
4033
  data: {
3888
4034
  pluralSuffix,
3889
4035
  fieldName,
@@ -3910,15 +4056,31 @@ const rule$n = {
3910
4056
  },
3911
4057
  };
3912
4058
 
3913
- const RULE_ID$d = 'selection-set-depth';
3914
- const rule$o = {
4059
+ const RULE_ID$e = 'selection-set-depth';
4060
+ const schema$c = {
4061
+ type: 'array',
4062
+ minItems: 1,
4063
+ maxItems: 1,
4064
+ items: {
4065
+ type: 'object',
4066
+ additionalProperties: false,
4067
+ required: ['maxDepth'],
4068
+ properties: {
4069
+ maxDepth: {
4070
+ type: 'number',
4071
+ },
4072
+ ignore: ARRAY_DEFAULT_OPTIONS,
4073
+ },
4074
+ },
4075
+ };
4076
+ const rule$p = {
3915
4077
  meta: {
3916
4078
  type: 'suggestion',
3917
4079
  hasSuggestions: true,
3918
4080
  docs: {
3919
4081
  category: 'Operations',
3920
4082
  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`,
4083
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$e}.md`,
3922
4084
  requiresSiblings: true,
3923
4085
  examples: [
3924
4086
  {
@@ -3964,30 +4126,15 @@ const rule$o = {
3964
4126
  recommended: true,
3965
4127
  configOptions: [{ maxDepth: 7 }],
3966
4128
  },
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
- },
4129
+ schema: schema$c,
3983
4130
  },
3984
4131
  create(context) {
3985
4132
  let siblings = null;
3986
4133
  try {
3987
- siblings = requireSiblingsOperations(RULE_ID$d, context);
4134
+ siblings = requireSiblingsOperations(RULE_ID$e, context);
3988
4135
  }
3989
4136
  catch (_a) {
3990
- logger.warn(`Rule "${RULE_ID$d}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
4137
+ logger.warn(`Rule "${RULE_ID$e}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
3991
4138
  }
3992
4139
  const { maxDepth, ignore = [] } = context.options[0];
3993
4140
  const checkFn = depthLimit(maxDepth, { ignore });
@@ -4031,22 +4178,54 @@ const rule$o = {
4031
4178
  });
4032
4179
  }
4033
4180
  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);
4181
+ 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
4182
  }
4036
4183
  },
4037
4184
  };
4038
4185
  },
4039
4186
  };
4040
4187
 
4041
- const RULE_ID$e = 'strict-id-in-types';
4042
- const rule$p = {
4188
+ const RULE_ID$f = 'strict-id-in-types';
4189
+ const schema$d = {
4190
+ type: 'array',
4191
+ maxItems: 1,
4192
+ items: {
4193
+ type: 'object',
4194
+ additionalProperties: false,
4195
+ properties: {
4196
+ acceptedIdNames: {
4197
+ ...ARRAY_DEFAULT_OPTIONS,
4198
+ default: ['id'],
4199
+ },
4200
+ acceptedIdTypes: {
4201
+ ...ARRAY_DEFAULT_OPTIONS,
4202
+ default: ['ID'],
4203
+ },
4204
+ exceptions: {
4205
+ type: 'object',
4206
+ additionalProperties: false,
4207
+ properties: {
4208
+ types: {
4209
+ ...ARRAY_DEFAULT_OPTIONS,
4210
+ description: 'This is used to exclude types with names that match one of the specified values.',
4211
+ },
4212
+ suffixes: {
4213
+ ...ARRAY_DEFAULT_OPTIONS,
4214
+ description: 'This is used to exclude types with names with suffixes that match one of the specified values.',
4215
+ },
4216
+ },
4217
+ },
4218
+ },
4219
+ },
4220
+ };
4221
+ const rule$q = {
4043
4222
  meta: {
4044
4223
  type: 'suggestion',
4045
4224
  docs: {
4046
4225
  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
4226
  category: 'Schema',
4048
4227
  recommended: true,
4049
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$e}.md`,
4228
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$f}.md`,
4050
4229
  requiresSchema: true,
4051
4230
  examples: [
4052
4231
  {
@@ -4110,37 +4289,7 @@ const rule$p = {
4110
4289
  },
4111
4290
  ],
4112
4291
  },
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
- },
4292
+ schema: schema$d,
4144
4293
  },
4145
4294
  create(context) {
4146
4295
  const options = {
@@ -4149,7 +4298,7 @@ const rule$p = {
4149
4298
  exceptions: {},
4150
4299
  ...context.options[0],
4151
4300
  };
4152
- const schema = requireGraphQLSchemaFromContext(RULE_ID$e, context);
4301
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$f, context);
4153
4302
  const rootTypeNames = [
4154
4303
  schema.getQueryType(),
4155
4304
  schema.getMutationType(),
@@ -4194,7 +4343,7 @@ const rule$p = {
4194
4343
  },
4195
4344
  };
4196
4345
 
4197
- const RULE_ID$f = 'unique-fragment-name';
4346
+ const RULE_ID$g = 'unique-fragment-name';
4198
4347
  const checkNode = (context, node, ruleId) => {
4199
4348
  const documentName = node.name.value;
4200
4349
  const siblings = requireSiblingsOperations(ruleId, context);
@@ -4221,13 +4370,13 @@ const checkNode = (context, node, ruleId) => {
4221
4370
  });
4222
4371
  }
4223
4372
  };
4224
- const rule$q = {
4373
+ const rule$r = {
4225
4374
  meta: {
4226
4375
  type: 'suggestion',
4227
4376
  docs: {
4228
4377
  category: 'Operations',
4229
4378
  description: 'Enforce unique fragment names across your project.',
4230
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$f}.md`,
4379
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$g}.md`,
4231
4380
  requiresSiblings: true,
4232
4381
  examples: [
4233
4382
  {
@@ -4265,27 +4414,27 @@ const rule$q = {
4265
4414
  ],
4266
4415
  },
4267
4416
  messages: {
4268
- [RULE_ID$f]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}',
4417
+ [RULE_ID$g]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}',
4269
4418
  },
4270
4419
  schema: [],
4271
4420
  },
4272
4421
  create(context) {
4273
4422
  return {
4274
4423
  FragmentDefinition(node) {
4275
- checkNode(context, node, RULE_ID$f);
4424
+ checkNode(context, node, RULE_ID$g);
4276
4425
  },
4277
4426
  };
4278
4427
  },
4279
4428
  };
4280
4429
 
4281
- const RULE_ID$g = 'unique-operation-name';
4282
- const rule$r = {
4430
+ const RULE_ID$h = 'unique-operation-name';
4431
+ const rule$s = {
4283
4432
  meta: {
4284
4433
  type: 'suggestion',
4285
4434
  docs: {
4286
4435
  category: 'Operations',
4287
4436
  description: 'Enforce unique operation names across your project.',
4288
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$g}.md`,
4437
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$h}.md`,
4289
4438
  requiresSiblings: true,
4290
4439
  examples: [
4291
4440
  {
@@ -4327,14 +4476,14 @@ const rule$r = {
4327
4476
  ],
4328
4477
  },
4329
4478
  messages: {
4330
- [RULE_ID$g]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}',
4479
+ [RULE_ID$h]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}',
4331
4480
  },
4332
4481
  schema: [],
4333
4482
  },
4334
4483
  create(context) {
4335
4484
  return {
4336
4485
  'OperationDefinition[name!=undefined]'(node) {
4337
- checkNode(context, node, RULE_ID$g);
4486
+ checkNode(context, node, RULE_ID$h);
4338
4487
  },
4339
4488
  };
4340
4489
  },
@@ -4348,31 +4497,32 @@ const rules = {
4348
4497
  alphabetize: rule,
4349
4498
  'description-style': rule$1,
4350
4499
  '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,
4500
+ 'lone-executable-definition': rule$3,
4501
+ 'match-document-filename': rule$4,
4502
+ 'naming-convention': rule$5,
4503
+ 'no-anonymous-operations': rule$6,
4504
+ 'no-case-insensitive-enum-values-duplicates': rule$7,
4505
+ 'no-deprecated': rule$8,
4506
+ 'no-duplicate-fields': rule$9,
4507
+ 'no-hashtag-description': rule$a,
4508
+ 'no-root-type': rule$b,
4509
+ 'no-scalar-result-type-on-mutation': rule$c,
4510
+ 'no-typename-prefix': rule$d,
4511
+ 'no-unreachable-types': rule$e,
4512
+ 'no-unused-fields': rule$f,
4513
+ 'relay-arguments': rule$g,
4514
+ 'relay-connection-types': rule$h,
4515
+ 'relay-edge-types': rule$i,
4516
+ 'relay-page-info': rule$j,
4517
+ 'require-deprecation-date': rule$k,
4518
+ 'require-deprecation-reason': rule$l,
4519
+ 'require-description': rule$m,
4520
+ 'require-field-of-type-query-in-mutation-result': rule$n,
4521
+ 'require-id-when-available': rule$o,
4522
+ 'selection-set-depth': rule$p,
4523
+ 'strict-id-in-types': rule$q,
4524
+ 'unique-fragment-name': rule$r,
4525
+ 'unique-operation-name': rule$s,
4376
4526
  };
4377
4527
 
4378
4528
  // Based on the `eslint-plugin-import`'s cache