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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. package/configs/operations-all.json +1 -0
  2. package/index.js +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.js CHANGED
@@ -334,7 +334,7 @@ const validationToRule = ({ ruleId, ruleName, getDocumentNode, schema = [], hasD
334
334
  ...docs,
335
335
  graphQLJSRuleName: ruleName,
336
336
  url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${ruleId}.md`,
337
- description: `${docs.description}\n\n> This rule is a wrapper around a \`graphql-js\` validation function.`,
337
+ description: `${docs.description}\n> This rule is a wrapper around a \`graphql-js\` validation function.`,
338
338
  },
339
339
  schema,
340
340
  hasSuggestions: hasDidYouMeanSuggestions,
@@ -733,6 +733,58 @@ const argumentsEnum = [
733
733
  graphql.Kind.DIRECTIVE_DEFINITION,
734
734
  graphql.Kind.DIRECTIVE,
735
735
  ];
736
+ const schema = {
737
+ type: 'array',
738
+ minItems: 1,
739
+ maxItems: 1,
740
+ items: {
741
+ type: 'object',
742
+ additionalProperties: false,
743
+ minProperties: 1,
744
+ properties: {
745
+ fields: {
746
+ ...ARRAY_DEFAULT_OPTIONS,
747
+ items: {
748
+ enum: fieldsEnum,
749
+ },
750
+ description: 'Fields of `type`, `interface`, and `input`.',
751
+ },
752
+ values: {
753
+ ...ARRAY_DEFAULT_OPTIONS,
754
+ items: {
755
+ enum: valuesEnum,
756
+ },
757
+ description: 'Values of `enum`.',
758
+ },
759
+ selections: {
760
+ ...ARRAY_DEFAULT_OPTIONS,
761
+ items: {
762
+ enum: selectionsEnum,
763
+ },
764
+ description: 'Selections of `fragment` and operations `query`, `mutation` and `subscription`.',
765
+ },
766
+ variables: {
767
+ ...ARRAY_DEFAULT_OPTIONS,
768
+ items: {
769
+ enum: variablesEnum,
770
+ },
771
+ description: 'Variables of operations `query`, `mutation` and `subscription`.',
772
+ },
773
+ arguments: {
774
+ ...ARRAY_DEFAULT_OPTIONS,
775
+ items: {
776
+ enum: argumentsEnum,
777
+ },
778
+ description: 'Arguments of fields and directives.',
779
+ },
780
+ definitions: {
781
+ type: 'boolean',
782
+ description: 'Definitions – `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.',
783
+ default: false,
784
+ },
785
+ },
786
+ },
787
+ };
736
788
  const rule = {
737
789
  meta: {
738
790
  type: 'suggestion',
@@ -839,58 +891,7 @@ const rule = {
839
891
  messages: {
840
892
  [RULE_ID]: '`{{ currName }}` should be before {{ prevName }}.',
841
893
  },
842
- schema: {
843
- type: 'array',
844
- minItems: 1,
845
- maxItems: 1,
846
- items: {
847
- type: 'object',
848
- additionalProperties: false,
849
- minProperties: 1,
850
- properties: {
851
- fields: {
852
- ...ARRAY_DEFAULT_OPTIONS,
853
- items: {
854
- enum: fieldsEnum,
855
- },
856
- description: 'Fields of `type`, `interface`, and `input`.',
857
- },
858
- values: {
859
- ...ARRAY_DEFAULT_OPTIONS,
860
- items: {
861
- enum: valuesEnum,
862
- },
863
- description: 'Values of `enum`.',
864
- },
865
- selections: {
866
- ...ARRAY_DEFAULT_OPTIONS,
867
- items: {
868
- enum: selectionsEnum,
869
- },
870
- description: 'Selections of `fragment` and operations `query`, `mutation` and `subscription`.',
871
- },
872
- variables: {
873
- ...ARRAY_DEFAULT_OPTIONS,
874
- items: {
875
- enum: variablesEnum,
876
- },
877
- description: 'Variables of operations `query`, `mutation` and `subscription`.',
878
- },
879
- arguments: {
880
- ...ARRAY_DEFAULT_OPTIONS,
881
- items: {
882
- enum: argumentsEnum,
883
- },
884
- description: 'Arguments of fields and directives.',
885
- },
886
- definitions: {
887
- type: 'boolean',
888
- description: 'Definitions – `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.',
889
- default: false,
890
- },
891
- },
892
- },
893
- },
894
+ schema,
894
895
  },
895
896
  create(context) {
896
897
  var _a, _b, _c, _d, _e;
@@ -1033,6 +1034,21 @@ const rule = {
1033
1034
  },
1034
1035
  };
1035
1036
 
1037
+ const schema$1 = {
1038
+ type: 'array',
1039
+ maxItems: 1,
1040
+ items: {
1041
+ type: 'object',
1042
+ additionalProperties: false,
1043
+ minProperties: 1,
1044
+ properties: {
1045
+ style: {
1046
+ enum: ['block', 'inline'],
1047
+ default: 'block',
1048
+ },
1049
+ },
1050
+ },
1051
+ };
1036
1052
  const rule$1 = {
1037
1053
  meta: {
1038
1054
  type: 'suggestion',
@@ -1065,18 +1081,7 @@ const rule$1 = {
1065
1081
  url: 'https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/description-style.md',
1066
1082
  recommended: true,
1067
1083
  },
1068
- schema: [
1069
- {
1070
- type: 'object',
1071
- additionalProperties: false,
1072
- properties: {
1073
- style: {
1074
- enum: ['block', 'inline'],
1075
- default: 'block',
1076
- },
1077
- },
1078
- },
1079
- ],
1084
+ schema: schema$1,
1080
1085
  },
1081
1086
  create(context) {
1082
1087
  const { style = 'block' } = context.options[0] || {};
@@ -1105,6 +1110,36 @@ const rule$1 = {
1105
1110
  },
1106
1111
  };
1107
1112
 
1113
+ const schema$2 = {
1114
+ type: 'array',
1115
+ maxItems: 1,
1116
+ items: {
1117
+ type: 'object',
1118
+ additionalProperties: false,
1119
+ properties: {
1120
+ checkInputType: {
1121
+ type: 'boolean',
1122
+ default: false,
1123
+ description: 'Check that the input type name follows the convention <mutationName>Input',
1124
+ },
1125
+ caseSensitiveInputType: {
1126
+ type: 'boolean',
1127
+ default: true,
1128
+ description: 'Allow for case discrepancies in the input type name',
1129
+ },
1130
+ checkQueries: {
1131
+ type: 'boolean',
1132
+ default: false,
1133
+ description: 'Apply the rule to Queries',
1134
+ },
1135
+ checkMutations: {
1136
+ type: 'boolean',
1137
+ default: true,
1138
+ description: 'Apply the rule to Mutations',
1139
+ },
1140
+ },
1141
+ },
1142
+ };
1108
1143
  const isObjectType = (node) => [graphql.Kind.OBJECT_TYPE_DEFINITION, graphql.Kind.OBJECT_TYPE_EXTENSION].includes(node.type);
1109
1144
  const isQueryType = (node) => isObjectType(node) && node.name.value === 'Query';
1110
1145
  const isMutationType = (node) => isObjectType(node) && node.name.value === 'Mutation';
@@ -1146,34 +1181,7 @@ const rule$2 = {
1146
1181
  },
1147
1182
  ],
1148
1183
  },
1149
- schema: [
1150
- {
1151
- type: 'object',
1152
- additionalProperties: false,
1153
- properties: {
1154
- checkInputType: {
1155
- type: 'boolean',
1156
- default: false,
1157
- description: 'Check that the input type name follows the convention <mutationName>Input',
1158
- },
1159
- caseSensitiveInputType: {
1160
- type: 'boolean',
1161
- default: true,
1162
- description: 'Allow for case discrepancies in the input type name',
1163
- },
1164
- checkQueries: {
1165
- type: 'boolean',
1166
- default: false,
1167
- description: 'Apply the rule to Queries',
1168
- },
1169
- checkMutations: {
1170
- type: 'boolean',
1171
- default: true,
1172
- description: 'Apply the rule to Mutations',
1173
- },
1174
- },
1175
- },
1176
- ],
1184
+ schema: schema$2,
1177
1185
  },
1178
1186
  create(context) {
1179
1187
  const options = {
@@ -1235,9 +1243,92 @@ const rule$2 = {
1235
1243
  },
1236
1244
  };
1237
1245
 
1246
+ const RULE_ID$1 = 'lone-executable-definition';
1247
+ const schema$3 = {
1248
+ type: 'array',
1249
+ maxItems: 1,
1250
+ items: {
1251
+ type: 'object',
1252
+ minProperties: 1,
1253
+ additionalProperties: false,
1254
+ properties: {
1255
+ ignore: {
1256
+ ...ARRAY_DEFAULT_OPTIONS,
1257
+ maxItems: 3,
1258
+ items: {
1259
+ enum: ['fragment', 'query', 'mutation', 'subscription'],
1260
+ },
1261
+ description: 'Allow certain definitions to be placed alongside others.',
1262
+ },
1263
+ },
1264
+ },
1265
+ };
1266
+ const rule$3 = {
1267
+ meta: {
1268
+ type: 'suggestion',
1269
+ docs: {
1270
+ category: 'Operations',
1271
+ description: 'Require all queries, mutations, subscriptions and fragments to be located in separate files.',
1272
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$1}.md`,
1273
+ examples: [
1274
+ {
1275
+ title: 'Incorrect',
1276
+ code: /* GraphQL */ `
1277
+ query Foo {
1278
+ id
1279
+ }
1280
+ fragment Bar on Baz {
1281
+ id
1282
+ }
1283
+ `,
1284
+ },
1285
+ {
1286
+ title: 'Correct',
1287
+ code: /* GraphQL */ `
1288
+ query Foo {
1289
+ id
1290
+ }
1291
+ `,
1292
+ },
1293
+ ],
1294
+ },
1295
+ messages: {
1296
+ [RULE_ID$1]: '{{name}} should be in a separate file.',
1297
+ },
1298
+ schema: schema$3,
1299
+ },
1300
+ create(context) {
1301
+ var _a;
1302
+ const ignore = new Set(((_a = context.options[0]) === null || _a === void 0 ? void 0 : _a.ignore) || []);
1303
+ const definitions = [];
1304
+ return {
1305
+ ':matches(OperationDefinition, FragmentDefinition)'(node) {
1306
+ const type = 'operation' in node ? node.operation : 'fragment';
1307
+ if (!ignore.has(type)) {
1308
+ definitions.push({ type, node });
1309
+ }
1310
+ },
1311
+ 'Program:exit'() {
1312
+ var _a, _b;
1313
+ for (const { node, type } of definitions.slice(1) /* ignore first definition */) {
1314
+ let name = pascalCase(type);
1315
+ const definitionName = (_a = node.name) === null || _a === void 0 ? void 0 : _a.value;
1316
+ if (definitionName) {
1317
+ name += ` "${definitionName}"`;
1318
+ }
1319
+ context.report({
1320
+ loc: ((_b = node.name) === null || _b === void 0 ? void 0 : _b.loc) || getLocation(node.loc.start, type),
1321
+ messageId: RULE_ID$1,
1322
+ data: { name },
1323
+ });
1324
+ }
1325
+ },
1326
+ };
1327
+ },
1328
+ };
1329
+
1238
1330
  const MATCH_EXTENSION = 'MATCH_EXTENSION';
1239
1331
  const MATCH_STYLE = 'MATCH_STYLE';
1240
- const ACCEPTED_EXTENSIONS = ['.gql', '.graphql'];
1241
1332
  const CASE_STYLES = [
1242
1333
  'camelCase',
1243
1334
  'PascalCase',
@@ -1249,7 +1340,40 @@ const CASE_STYLES = [
1249
1340
  const schemaOption = {
1250
1341
  oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asObject' }],
1251
1342
  };
1252
- const rule$3 = {
1343
+ const schema$4 = {
1344
+ definitions: {
1345
+ asString: {
1346
+ enum: CASE_STYLES,
1347
+ description: `One of: ${CASE_STYLES.map(t => `\`${t}\``).join(', ')}`,
1348
+ },
1349
+ asObject: {
1350
+ type: 'object',
1351
+ additionalProperties: false,
1352
+ minProperties: 1,
1353
+ properties: {
1354
+ style: { enum: CASE_STYLES },
1355
+ suffix: { type: 'string' },
1356
+ prefix: { type: 'string' },
1357
+ },
1358
+ },
1359
+ },
1360
+ type: 'array',
1361
+ minItems: 1,
1362
+ maxItems: 1,
1363
+ items: {
1364
+ type: 'object',
1365
+ additionalProperties: false,
1366
+ minProperties: 1,
1367
+ properties: {
1368
+ fileExtension: { enum: ['.gql', '.graphql'] },
1369
+ query: schemaOption,
1370
+ mutation: schemaOption,
1371
+ subscription: schemaOption,
1372
+ fragment: schemaOption,
1373
+ },
1374
+ },
1375
+ };
1376
+ const rule$4 = {
1253
1377
  meta: {
1254
1378
  type: 'suggestion',
1255
1379
  docs: {
@@ -1324,6 +1448,26 @@ const rule$3 = {
1324
1448
  fullName
1325
1449
  }
1326
1450
  }
1451
+ `,
1452
+ },
1453
+ {
1454
+ title: 'Correct',
1455
+ usage: [{ fragment: { style: 'kebab-case', prefix: 'mutation.' } }],
1456
+ code: /* GraphQL */ `
1457
+ # mutation.add-alert.graphql
1458
+ mutation addAlert {
1459
+ foo
1460
+ }
1461
+ `,
1462
+ },
1463
+ {
1464
+ title: 'Correct',
1465
+ usage: [{ fragment: { prefix: 'query.' } }],
1466
+ code: /* GraphQL */ `
1467
+ # query.me.graphql
1468
+ query me {
1469
+ foo
1470
+ }
1327
1471
  `,
1328
1472
  },
1329
1473
  ],
@@ -1340,38 +1484,7 @@ const rule$3 = {
1340
1484
  [MATCH_EXTENSION]: 'File extension "{{ fileExtension }}" don\'t match extension "{{ expectedFileExtension }}"',
1341
1485
  [MATCH_STYLE]: 'Unexpected filename "{{ filename }}". Rename it to "{{ expectedFilename }}"',
1342
1486
  },
1343
- schema: {
1344
- definitions: {
1345
- asString: {
1346
- enum: CASE_STYLES,
1347
- description: `One of: ${CASE_STYLES.map(t => `\`${t}\``).join(', ')}`,
1348
- },
1349
- asObject: {
1350
- type: 'object',
1351
- additionalProperties: false,
1352
- minProperties: 1,
1353
- properties: {
1354
- style: { enum: CASE_STYLES },
1355
- suffix: { type: 'string' },
1356
- },
1357
- },
1358
- },
1359
- type: 'array',
1360
- minItems: 1,
1361
- maxItems: 1,
1362
- items: {
1363
- type: 'object',
1364
- additionalProperties: false,
1365
- minProperties: 1,
1366
- properties: {
1367
- fileExtension: { enum: ACCEPTED_EXTENSIONS },
1368
- query: schemaOption,
1369
- mutation: schemaOption,
1370
- subscription: schemaOption,
1371
- fragment: schemaOption,
1372
- },
1373
- },
1374
- },
1487
+ schema: schema$4,
1375
1488
  },
1376
1489
  create(context) {
1377
1490
  const options = context.options[0] || {
@@ -1418,13 +1531,13 @@ const rule$3 = {
1418
1531
  option = { style: option };
1419
1532
  }
1420
1533
  const expectedExtension = options.fileExtension || fileExtension;
1421
- let expectedFilename;
1534
+ let expectedFilename = option.prefix || '';
1422
1535
  if (option.style) {
1423
- expectedFilename =
1536
+ expectedFilename +=
1424
1537
  option.style === 'matchDocumentStyle' ? docName : convertCase(option.style, docName);
1425
1538
  }
1426
1539
  else {
1427
- expectedFilename = filename;
1540
+ expectedFilename += filename;
1428
1541
  }
1429
1542
  expectedFilename += (option.suffix || '') + expectedExtension;
1430
1543
  const filenameWithExtension = filename + expectedExtension;
@@ -1473,7 +1586,67 @@ const ALLOWED_STYLES = Object.keys(StyleToRegex);
1473
1586
  const schemaOption$1 = {
1474
1587
  oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asObject' }],
1475
1588
  };
1476
- const rule$4 = {
1589
+ const schema$5 = {
1590
+ definitions: {
1591
+ asString: {
1592
+ enum: ALLOWED_STYLES,
1593
+ description: `One of: ${ALLOWED_STYLES.map(t => `\`${t}\``).join(', ')}`,
1594
+ },
1595
+ asObject: {
1596
+ type: 'object',
1597
+ additionalProperties: false,
1598
+ properties: {
1599
+ style: { enum: ALLOWED_STYLES },
1600
+ prefix: { type: 'string' },
1601
+ suffix: { type: 'string' },
1602
+ forbiddenPrefixes: ARRAY_DEFAULT_OPTIONS,
1603
+ forbiddenSuffixes: ARRAY_DEFAULT_OPTIONS,
1604
+ ignorePattern: {
1605
+ type: 'string',
1606
+ description: 'Option to skip validation of some words, e.g. acronyms',
1607
+ },
1608
+ },
1609
+ },
1610
+ },
1611
+ type: 'array',
1612
+ maxItems: 1,
1613
+ items: {
1614
+ type: 'object',
1615
+ additionalProperties: false,
1616
+ properties: {
1617
+ types: {
1618
+ ...schemaOption$1,
1619
+ description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1620
+ },
1621
+ ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1622
+ kind,
1623
+ {
1624
+ ...schemaOption$1,
1625
+ description: `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`,
1626
+ },
1627
+ ])),
1628
+ allowLeadingUnderscore: {
1629
+ type: 'boolean',
1630
+ default: false,
1631
+ },
1632
+ allowTrailingUnderscore: {
1633
+ type: 'boolean',
1634
+ default: false,
1635
+ },
1636
+ },
1637
+ patternProperties: {
1638
+ [`^(${ALLOWED_KINDS.join('|')})(.+)?$`]: schemaOption$1,
1639
+ },
1640
+ description: [
1641
+ "> It's possible to use a [`selector`](https://eslint.org/docs/developer-guide/selectors) that starts with allowed `ASTNode` names which are described below.",
1642
+ '>',
1643
+ '> Paste or drop code into the editor in [ASTExplorer](https://astexplorer.net) and inspect the generated AST to compose your selector.',
1644
+ '>',
1645
+ '> Example: pattern property `FieldDefinition[parent.name.value=Query]` will match only fields for type `Query`.',
1646
+ ].join('\n'),
1647
+ },
1648
+ };
1649
+ const rule$5 = {
1477
1650
  meta: {
1478
1651
  type: 'suggestion',
1479
1652
  docs: {
@@ -1589,66 +1762,7 @@ const rule$4 = {
1589
1762
  },
1590
1763
  },
1591
1764
  hasSuggestions: true,
1592
- schema: {
1593
- definitions: {
1594
- asString: {
1595
- enum: ALLOWED_STYLES,
1596
- description: `One of: ${ALLOWED_STYLES.map(t => `\`${t}\``).join(', ')}`,
1597
- },
1598
- asObject: {
1599
- type: 'object',
1600
- additionalProperties: false,
1601
- properties: {
1602
- style: { enum: ALLOWED_STYLES },
1603
- prefix: { type: 'string' },
1604
- suffix: { type: 'string' },
1605
- forbiddenPrefixes: ARRAY_DEFAULT_OPTIONS,
1606
- forbiddenSuffixes: ARRAY_DEFAULT_OPTIONS,
1607
- ignorePattern: {
1608
- type: 'string',
1609
- description: 'Option to skip validation of some words, e.g. acronyms',
1610
- },
1611
- },
1612
- },
1613
- },
1614
- type: 'array',
1615
- maxItems: 1,
1616
- items: {
1617
- type: 'object',
1618
- additionalProperties: false,
1619
- properties: {
1620
- types: {
1621
- ...schemaOption$1,
1622
- description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1623
- },
1624
- ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1625
- kind,
1626
- {
1627
- ...schemaOption$1,
1628
- description: `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`,
1629
- },
1630
- ])),
1631
- allowLeadingUnderscore: {
1632
- type: 'boolean',
1633
- default: false,
1634
- },
1635
- allowTrailingUnderscore: {
1636
- type: 'boolean',
1637
- default: false,
1638
- },
1639
- },
1640
- patternProperties: {
1641
- [`^(${ALLOWED_KINDS.join('|')})(.+)?$`]: schemaOption$1,
1642
- },
1643
- description: [
1644
- "> It's possible to use a [`selector`](https://eslint.org/docs/developer-guide/selectors) that starts with allowed `ASTNode` names which are described below.",
1645
- '>',
1646
- '> Paste or drop code into the editor in [ASTExplorer](https://astexplorer.net) and inspect the generated AST to compose your selector.',
1647
- '>',
1648
- '> Example: pattern property `FieldDefinition[parent.name.value=Query]` will match only fields for type `Query`.',
1649
- ].join('\n'),
1650
- },
1651
- },
1765
+ schema: schema$5,
1652
1766
  },
1653
1767
  create(context) {
1654
1768
  const options = context.options[0] || {};
@@ -1748,8 +1862,8 @@ const rule$4 = {
1748
1862
  },
1749
1863
  };
1750
1864
 
1751
- const RULE_ID$1 = 'no-anonymous-operations';
1752
- const rule$5 = {
1865
+ const RULE_ID$2 = 'no-anonymous-operations';
1866
+ const rule$6 = {
1753
1867
  meta: {
1754
1868
  type: 'suggestion',
1755
1869
  hasSuggestions: true,
@@ -1757,7 +1871,7 @@ const rule$5 = {
1757
1871
  category: 'Operations',
1758
1872
  description: 'Require name for your GraphQL operations. This is useful since most GraphQL client libraries are using the operation name for caching purposes.',
1759
1873
  recommended: true,
1760
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$1}.md`,
1874
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$2}.md`,
1761
1875
  examples: [
1762
1876
  {
1763
1877
  title: 'Incorrect',
@@ -1778,7 +1892,7 @@ const rule$5 = {
1778
1892
  ],
1779
1893
  },
1780
1894
  messages: {
1781
- [RULE_ID$1]: 'Anonymous GraphQL operations are forbidden. Make sure to name your {{ operation }}!',
1895
+ [RULE_ID$2]: 'Anonymous GraphQL operations are forbidden. Make sure to name your {{ operation }}!',
1782
1896
  },
1783
1897
  schema: [],
1784
1898
  },
@@ -1791,7 +1905,7 @@ const rule$5 = {
1791
1905
  : node.operation;
1792
1906
  context.report({
1793
1907
  loc: getLocation(node.loc.start, node.operation),
1794
- messageId: RULE_ID$1,
1908
+ messageId: RULE_ID$2,
1795
1909
  data: {
1796
1910
  operation: node.operation,
1797
1911
  },
@@ -1811,7 +1925,7 @@ const rule$5 = {
1811
1925
  },
1812
1926
  };
1813
1927
 
1814
- const rule$6 = {
1928
+ const rule$7 = {
1815
1929
  meta: {
1816
1930
  type: 'suggestion',
1817
1931
  hasSuggestions: true,
@@ -1869,15 +1983,15 @@ const rule$6 = {
1869
1983
  },
1870
1984
  };
1871
1985
 
1872
- const RULE_ID$2 = 'no-deprecated';
1873
- const rule$7 = {
1986
+ const RULE_ID$3 = 'no-deprecated';
1987
+ const rule$8 = {
1874
1988
  meta: {
1875
1989
  type: 'suggestion',
1876
1990
  hasSuggestions: true,
1877
1991
  docs: {
1878
1992
  category: 'Operations',
1879
1993
  description: 'Enforce that deprecated fields or enum values are not in use by operations.',
1880
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$2}.md`,
1994
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$3}.md`,
1881
1995
  requiresSchema: true,
1882
1996
  examples: [
1883
1997
  {
@@ -1944,18 +2058,18 @@ const rule$7 = {
1944
2058
  recommended: true,
1945
2059
  },
1946
2060
  messages: {
1947
- [RULE_ID$2]: 'This {{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})',
2061
+ [RULE_ID$3]: 'This {{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})',
1948
2062
  },
1949
2063
  schema: [],
1950
2064
  },
1951
2065
  create(context) {
1952
- requireGraphQLSchemaFromContext(RULE_ID$2, context);
2066
+ requireGraphQLSchemaFromContext(RULE_ID$3, context);
1953
2067
  function report(node, reason) {
1954
2068
  const nodeName = node.kind === graphql.Kind.ENUM ? node.value : node.name.value;
1955
2069
  const nodeType = node.kind === graphql.Kind.ENUM ? 'enum value' : 'field';
1956
2070
  context.report({
1957
2071
  node,
1958
- messageId: RULE_ID$2,
2072
+ messageId: RULE_ID$3,
1959
2073
  data: {
1960
2074
  type: nodeType,
1961
2075
  reason,
@@ -1989,15 +2103,15 @@ const rule$7 = {
1989
2103
  },
1990
2104
  };
1991
2105
 
1992
- const RULE_ID$3 = 'no-duplicate-fields';
1993
- const rule$8 = {
2106
+ const RULE_ID$4 = 'no-duplicate-fields';
2107
+ const rule$9 = {
1994
2108
  meta: {
1995
2109
  type: 'suggestion',
1996
2110
  hasSuggestions: true,
1997
2111
  docs: {
1998
2112
  description: 'Checks for duplicate fields in selection set, variables in operation definition, or in arguments set of a field.',
1999
2113
  category: 'Operations',
2000
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$3}.md`,
2114
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$4}.md`,
2001
2115
  recommended: true,
2002
2116
  examples: [
2003
2117
  {
@@ -2043,7 +2157,7 @@ const rule$8 = {
2043
2157
  ],
2044
2158
  },
2045
2159
  messages: {
2046
- [RULE_ID$3]: '{{ type }} `{{ fieldName }}` defined multiple times.',
2160
+ [RULE_ID$4]: '{{ type }} `{{ fieldName }}` defined multiple times.',
2047
2161
  },
2048
2162
  schema: [],
2049
2163
  },
@@ -2054,7 +2168,7 @@ const rule$8 = {
2054
2168
  const { parent } = node;
2055
2169
  context.report({
2056
2170
  node,
2057
- messageId: RULE_ID$3,
2171
+ messageId: RULE_ID$4,
2058
2172
  data: {
2059
2173
  type: parent.type,
2060
2174
  fieldName,
@@ -2099,7 +2213,7 @@ const rule$8 = {
2099
2213
  };
2100
2214
 
2101
2215
  const HASHTAG_COMMENT = 'HASHTAG_COMMENT';
2102
- const rule$9 = {
2216
+ const rule$a = {
2103
2217
  meta: {
2104
2218
  type: 'suggestion',
2105
2219
  hasSuggestions: true,
@@ -2184,8 +2298,25 @@ const rule$9 = {
2184
2298
  },
2185
2299
  };
2186
2300
 
2187
- const ROOT_TYPES = ['mutation', 'subscription'];
2188
- const rule$a = {
2301
+ const schema$6 = {
2302
+ type: 'array',
2303
+ minItems: 1,
2304
+ maxItems: 1,
2305
+ items: {
2306
+ type: 'object',
2307
+ additionalProperties: false,
2308
+ required: ['disallow'],
2309
+ properties: {
2310
+ disallow: {
2311
+ ...ARRAY_DEFAULT_OPTIONS,
2312
+ items: {
2313
+ enum: ['mutation', 'subscription'],
2314
+ },
2315
+ },
2316
+ },
2317
+ },
2318
+ };
2319
+ const rule$b = {
2189
2320
  meta: {
2190
2321
  type: 'suggestion',
2191
2322
  hasSuggestions: true,
@@ -2216,24 +2347,7 @@ const rule$a = {
2216
2347
  },
2217
2348
  ],
2218
2349
  },
2219
- schema: {
2220
- type: 'array',
2221
- minItems: 1,
2222
- maxItems: 1,
2223
- items: {
2224
- type: 'object',
2225
- additionalProperties: false,
2226
- required: ['disallow'],
2227
- properties: {
2228
- disallow: {
2229
- ...ARRAY_DEFAULT_OPTIONS,
2230
- items: {
2231
- enum: ROOT_TYPES,
2232
- },
2233
- },
2234
- },
2235
- },
2236
- },
2350
+ schema: schema$6,
2237
2351
  },
2238
2352
  create(context) {
2239
2353
  const schema = requireGraphQLSchemaFromContext('no-root-type', context);
@@ -2267,15 +2381,15 @@ const rule$a = {
2267
2381
  },
2268
2382
  };
2269
2383
 
2270
- const RULE_ID$4 = 'no-scalar-result-type-on-mutation';
2271
- const rule$b = {
2384
+ const RULE_ID$5 = 'no-scalar-result-type-on-mutation';
2385
+ const rule$c = {
2272
2386
  meta: {
2273
2387
  type: 'suggestion',
2274
2388
  hasSuggestions: true,
2275
2389
  docs: {
2276
2390
  category: 'Schema',
2277
2391
  description: 'Avoid scalar result type on mutation type to make sure to return a valid state.',
2278
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$4}.md`,
2392
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$5}.md`,
2279
2393
  requiresSchema: true,
2280
2394
  examples: [
2281
2395
  {
@@ -2299,7 +2413,7 @@ const rule$b = {
2299
2413
  schema: [],
2300
2414
  },
2301
2415
  create(context) {
2302
- const schema = requireGraphQLSchemaFromContext(RULE_ID$4, context);
2416
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$5, context);
2303
2417
  const mutationType = schema.getMutationType();
2304
2418
  if (!mutationType) {
2305
2419
  return {};
@@ -2330,7 +2444,7 @@ const rule$b = {
2330
2444
  };
2331
2445
 
2332
2446
  const NO_TYPENAME_PREFIX = 'NO_TYPENAME_PREFIX';
2333
- const rule$c = {
2447
+ const rule$d = {
2334
2448
  meta: {
2335
2449
  type: 'suggestion',
2336
2450
  hasSuggestions: true,
@@ -2392,7 +2506,7 @@ const rule$c = {
2392
2506
  },
2393
2507
  };
2394
2508
 
2395
- const RULE_ID$5 = 'no-unreachable-types';
2509
+ const RULE_ID$6 = 'no-unreachable-types';
2396
2510
  const KINDS = [
2397
2511
  graphql.Kind.DIRECTIVE_DEFINITION,
2398
2512
  graphql.Kind.OBJECT_TYPE_DEFINITION,
@@ -2472,15 +2586,15 @@ function getReachableTypes(schema) {
2472
2586
  reachableTypesCache = reachableTypes;
2473
2587
  return reachableTypesCache;
2474
2588
  }
2475
- const rule$d = {
2589
+ const rule$e = {
2476
2590
  meta: {
2477
2591
  messages: {
2478
- [RULE_ID$5]: '{{ type }} `{{ typeName }}` is unreachable.',
2592
+ [RULE_ID$6]: '{{ type }} `{{ typeName }}` is unreachable.',
2479
2593
  },
2480
2594
  docs: {
2481
2595
  description: 'Requires all types to be reachable at some level by root level fields.',
2482
2596
  category: 'Schema',
2483
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$5}.md`,
2597
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$6}.md`,
2484
2598
  requiresSchema: true,
2485
2599
  examples: [
2486
2600
  {
@@ -2517,7 +2631,7 @@ const rule$d = {
2517
2631
  hasSuggestions: true,
2518
2632
  },
2519
2633
  create(context) {
2520
- const schema = requireGraphQLSchemaFromContext(RULE_ID$5, context);
2634
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$6, context);
2521
2635
  const reachableTypes = getReachableTypes(schema);
2522
2636
  return {
2523
2637
  [`:matches(${KINDS}) > .name`](node) {
@@ -2526,7 +2640,7 @@ const rule$d = {
2526
2640
  const type = lowerCase(node.parent.kind.replace(/(Extension|Definition)$/, ''));
2527
2641
  context.report({
2528
2642
  node,
2529
- messageId: RULE_ID$5,
2643
+ messageId: RULE_ID$6,
2530
2644
  data: {
2531
2645
  type: type[0].toUpperCase() + type.slice(1),
2532
2646
  typeName,
@@ -2544,7 +2658,7 @@ const rule$d = {
2544
2658
  },
2545
2659
  };
2546
2660
 
2547
- const RULE_ID$6 = 'no-unused-fields';
2661
+ const RULE_ID$7 = 'no-unused-fields';
2548
2662
  let usedFieldsCache;
2549
2663
  function getUsedFields(schema, operations) {
2550
2664
  // We don't want cache usedFields on test environment
@@ -2575,15 +2689,15 @@ function getUsedFields(schema, operations) {
2575
2689
  usedFieldsCache = usedFields;
2576
2690
  return usedFieldsCache;
2577
2691
  }
2578
- const rule$e = {
2692
+ const rule$f = {
2579
2693
  meta: {
2580
2694
  messages: {
2581
- [RULE_ID$6]: 'Field "{{fieldName}}" is unused',
2695
+ [RULE_ID$7]: 'Field "{{fieldName}}" is unused',
2582
2696
  },
2583
2697
  docs: {
2584
2698
  description: 'Requires all fields to be used at some level by siblings operations.',
2585
2699
  category: 'Schema',
2586
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$6}.md`,
2700
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$7}.md`,
2587
2701
  requiresSiblings: true,
2588
2702
  requiresSchema: true,
2589
2703
  isDisabledForAllConfig: true,
@@ -2636,8 +2750,8 @@ const rule$e = {
2636
2750
  hasSuggestions: true,
2637
2751
  },
2638
2752
  create(context) {
2639
- const schema = requireGraphQLSchemaFromContext(RULE_ID$6, context);
2640
- const siblingsOperations = requireSiblingsOperations(RULE_ID$6, context);
2753
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$7, context);
2754
+ const siblingsOperations = requireSiblingsOperations(RULE_ID$7, context);
2641
2755
  const usedFields = getUsedFields(schema, siblingsOperations);
2642
2756
  return {
2643
2757
  FieldDefinition(node) {
@@ -2650,7 +2764,7 @@ const rule$e = {
2650
2764
  }
2651
2765
  context.report({
2652
2766
  node: node.name,
2653
- messageId: RULE_ID$6,
2767
+ messageId: RULE_ID$7,
2654
2768
  data: { fieldName },
2655
2769
  suggest: [
2656
2770
  {
@@ -2670,9 +2784,25 @@ const rule$e = {
2670
2784
  },
2671
2785
  };
2672
2786
 
2673
- const RULE_ID$7 = 'relay-arguments';
2787
+ const RULE_ID$8 = 'relay-arguments';
2674
2788
  const MISSING_ARGUMENTS = 'MISSING_ARGUMENTS';
2675
- const rule$f = {
2789
+ const schema$7 = {
2790
+ type: 'array',
2791
+ maxItems: 1,
2792
+ items: {
2793
+ type: 'object',
2794
+ additionalProperties: false,
2795
+ minProperties: 1,
2796
+ properties: {
2797
+ includeBoth: {
2798
+ type: 'boolean',
2799
+ default: true,
2800
+ description: 'Enforce including both forward and backward pagination arguments',
2801
+ },
2802
+ },
2803
+ },
2804
+ };
2805
+ const rule$g = {
2676
2806
  meta: {
2677
2807
  type: 'problem',
2678
2808
  docs: {
@@ -2692,7 +2822,7 @@ const rule$f = {
2692
2822
  '- `last` takes a non-negative integer',
2693
2823
  '- `before` takes the Cursor type',
2694
2824
  ].join('\n'),
2695
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$7}.md`,
2825
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$8}.md`,
2696
2826
  examples: [
2697
2827
  {
2698
2828
  title: 'Incorrect',
@@ -2716,25 +2846,10 @@ const rule$f = {
2716
2846
  messages: {
2717
2847
  [MISSING_ARGUMENTS]: 'A field that returns a Connection type must include forward pagination arguments (`first` and `after`), backward pagination arguments (`last` and `before`), or both.',
2718
2848
  },
2719
- schema: {
2720
- type: 'array',
2721
- maxItems: 1,
2722
- items: {
2723
- type: 'object',
2724
- additionalProperties: false,
2725
- minProperties: 1,
2726
- properties: {
2727
- includeBoth: {
2728
- type: 'boolean',
2729
- default: true,
2730
- description: 'Enforce including both forward and backward pagination arguments',
2731
- },
2732
- },
2733
- },
2734
- },
2849
+ schema: schema$7,
2735
2850
  },
2736
2851
  create(context) {
2737
- const schema = requireGraphQLSchemaFromContext(RULE_ID$7, context);
2852
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$8, context);
2738
2853
  const { includeBoth = true } = context.options[0] || {};
2739
2854
  return {
2740
2855
  'FieldDefinition > .gqlType Name[value=/Connection$/]'(node) {
@@ -2806,7 +2921,7 @@ const NON_OBJECT_TYPES = [
2806
2921
  const notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`;
2807
2922
  const hasEdgesField = (node) => node.fields.some(field => field.name.value === 'edges');
2808
2923
  const hasPageInfoField = (node) => node.fields.some(field => field.name.value === 'pageInfo');
2809
- const rule$g = {
2924
+ const rule$h = {
2810
2925
  meta: {
2811
2926
  type: 'problem',
2812
2927
  docs: {
@@ -2890,7 +3005,7 @@ const rule$g = {
2890
3005
  },
2891
3006
  };
2892
3007
 
2893
- const RULE_ID$8 = 'relay-edge-types';
3008
+ const RULE_ID$9 = 'relay-edge-types';
2894
3009
  const MESSAGE_MUST_BE_OBJECT_TYPE = 'MESSAGE_MUST_BE_OBJECT_TYPE';
2895
3010
  const MESSAGE_MISSING_EDGE_SUFFIX = 'MESSAGE_MISSING_EDGE_SUFFIX';
2896
3011
  const MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = 'MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE';
@@ -2925,7 +3040,33 @@ function getEdgeTypes(schema) {
2925
3040
  edgeTypesCache = edgeTypes;
2926
3041
  return edgeTypesCache;
2927
3042
  }
2928
- const rule$h = {
3043
+ const schema$8 = {
3044
+ type: 'array',
3045
+ maxItems: 1,
3046
+ items: {
3047
+ type: 'object',
3048
+ additionalProperties: false,
3049
+ minProperties: 1,
3050
+ properties: {
3051
+ withEdgeSuffix: {
3052
+ type: 'boolean',
3053
+ default: true,
3054
+ description: 'Edge type name must end in "Edge".',
3055
+ },
3056
+ shouldImplementNode: {
3057
+ type: 'boolean',
3058
+ default: true,
3059
+ description: "Edge type's field `node` must implement `Node` interface.",
3060
+ },
3061
+ listTypeCanWrapOnlyEdgeType: {
3062
+ type: 'boolean',
3063
+ default: true,
3064
+ description: 'A list type should only wrap an edge type.',
3065
+ },
3066
+ },
3067
+ },
3068
+ };
3069
+ const rule$i = {
2929
3070
  meta: {
2930
3071
  type: 'problem',
2931
3072
  docs: {
@@ -2941,7 +3082,7 @@ const rule$h = {
2941
3082
  "- Edge type's field `node` must implement `Node` interface _(optional)_",
2942
3083
  '- A list type should only wrap an edge type _(optional)_',
2943
3084
  ].join('\n'),
2944
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$8}.md`,
3085
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$9}.md`,
2945
3086
  isDisabledForAllConfig: true,
2946
3087
  requiresSchema: true,
2947
3088
  examples: [
@@ -2962,35 +3103,10 @@ const rule$h = {
2962
3103
  [MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE]: 'A list type should only wrap an edge type.',
2963
3104
  [MESSAGE_SHOULD_IMPLEMENTS_NODE]: "Edge type's field `node` must implement `Node` interface.",
2964
3105
  },
2965
- schema: {
2966
- type: 'array',
2967
- maxItems: 1,
2968
- items: {
2969
- type: 'object',
2970
- additionalProperties: false,
2971
- minProperties: 1,
2972
- properties: {
2973
- withEdgeSuffix: {
2974
- type: 'boolean',
2975
- default: true,
2976
- description: 'Edge type name must end in "Edge".',
2977
- },
2978
- shouldImplementNode: {
2979
- type: 'boolean',
2980
- default: true,
2981
- description: "Edge type's field `node` must implement `Node` interface.",
2982
- },
2983
- listTypeCanWrapOnlyEdgeType: {
2984
- type: 'boolean',
2985
- default: true,
2986
- description: 'A list type should only wrap an edge type.',
2987
- },
2988
- },
2989
- },
2990
- },
3106
+ schema: schema$8,
2991
3107
  },
2992
3108
  create(context) {
2993
- const schema = requireGraphQLSchemaFromContext(RULE_ID$8, context);
3109
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$9, context);
2994
3110
  const edgeTypes = getEdgeTypes(schema);
2995
3111
  const options = {
2996
3112
  withEdgeSuffix: true,
@@ -3073,12 +3189,12 @@ const rule$h = {
3073
3189
  },
3074
3190
  };
3075
3191
 
3076
- const RULE_ID$9 = 'relay-page-info';
3192
+ const RULE_ID$a = 'relay-page-info';
3077
3193
  const MESSAGE_MUST_EXIST = 'MESSAGE_MUST_EXIST';
3078
3194
  const MESSAGE_MUST_BE_OBJECT_TYPE$1 = 'MESSAGE_MUST_BE_OBJECT_TYPE';
3079
3195
  const notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
3080
3196
  let hasPageInfoChecked = false;
3081
- const rule$i = {
3197
+ const rule$j = {
3082
3198
  meta: {
3083
3199
  type: 'problem',
3084
3200
  docs: {
@@ -3090,7 +3206,7 @@ const rule$i = {
3090
3206
  '- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean',
3091
3207
  '- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results',
3092
3208
  ].join('\n'),
3093
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$9}.md`,
3209
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$a}.md`,
3094
3210
  examples: [
3095
3211
  {
3096
3212
  title: 'Correct',
@@ -3114,7 +3230,7 @@ const rule$i = {
3114
3230
  schema: [],
3115
3231
  },
3116
3232
  create(context) {
3117
- const schema = requireGraphQLSchemaFromContext(RULE_ID$9, context);
3233
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$a, context);
3118
3234
  if (process.env.NODE_ENV === 'test' || !hasPageInfoChecked) {
3119
3235
  const pageInfoType = schema.getType('PageInfo');
3120
3236
  if (!pageInfoType) {
@@ -3330,7 +3446,20 @@ const MESSAGE_REQUIRE_DATE = 'MESSAGE_REQUIRE_DATE';
3330
3446
  const MESSAGE_INVALID_FORMAT = 'MESSAGE_INVALID_FORMAT';
3331
3447
  const MESSAGE_INVALID_DATE = 'MESSAGE_INVALID_DATE';
3332
3448
  const MESSAGE_CAN_BE_REMOVED = 'MESSAGE_CAN_BE_REMOVED';
3333
- const rule$j = {
3449
+ const schema$9 = {
3450
+ type: 'array',
3451
+ maxItems: 1,
3452
+ items: {
3453
+ type: 'object',
3454
+ additionalProperties: false,
3455
+ properties: {
3456
+ argumentName: {
3457
+ type: 'string',
3458
+ },
3459
+ },
3460
+ },
3461
+ };
3462
+ const rule$k = {
3334
3463
  meta: {
3335
3464
  type: 'suggestion',
3336
3465
  hasSuggestions: true,
@@ -3375,17 +3504,7 @@ const rule$j = {
3375
3504
  [MESSAGE_INVALID_DATE]: 'Invalid "{{ deletionDate }}" deletion date',
3376
3505
  [MESSAGE_CAN_BE_REMOVED]: '"{{ nodeName }}" сan be removed',
3377
3506
  },
3378
- schema: [
3379
- {
3380
- type: 'object',
3381
- additionalProperties: false,
3382
- properties: {
3383
- argumentName: {
3384
- type: 'string',
3385
- },
3386
- },
3387
- },
3388
- ],
3507
+ schema: schema$9,
3389
3508
  },
3390
3509
  create(context) {
3391
3510
  return {
@@ -3441,7 +3560,7 @@ const rule$j = {
3441
3560
  },
3442
3561
  };
3443
3562
 
3444
- const rule$k = {
3563
+ const rule$l = {
3445
3564
  meta: {
3446
3565
  docs: {
3447
3566
  description: 'Require all deprecation directives to specify a reason.',
@@ -3494,7 +3613,7 @@ const rule$k = {
3494
3613
  },
3495
3614
  };
3496
3615
 
3497
- const RULE_ID$a = 'require-description';
3616
+ const RULE_ID$b = 'require-description';
3498
3617
  const ALLOWED_KINDS$1 = [
3499
3618
  ...TYPES_KINDS,
3500
3619
  graphql.Kind.DIRECTIVE_DEFINITION,
@@ -3531,12 +3650,40 @@ function getNodeName(node) {
3531
3650
  return node.name ? `${node.operation} ${node.name.value}` : node.operation;
3532
3651
  }
3533
3652
  }
3534
- const rule$l = {
3653
+ const schema$a = {
3654
+ type: 'array',
3655
+ minItems: 1,
3656
+ maxItems: 1,
3657
+ items: {
3658
+ type: 'object',
3659
+ additionalProperties: false,
3660
+ minProperties: 1,
3661
+ properties: {
3662
+ types: {
3663
+ type: 'boolean',
3664
+ description: `Includes:\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
3665
+ },
3666
+ rootField: {
3667
+ type: 'boolean',
3668
+ description: 'Definitions within `Query`, `Mutation`, and `Subscription` root types.',
3669
+ },
3670
+ ...Object.fromEntries([...ALLOWED_KINDS$1].sort().map(kind => {
3671
+ let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
3672
+ if (kind === graphql.Kind.OPERATION_DEFINITION) {
3673
+ description +=
3674
+ '\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.';
3675
+ }
3676
+ return [kind, { type: 'boolean', description }];
3677
+ })),
3678
+ },
3679
+ },
3680
+ };
3681
+ const rule$m = {
3535
3682
  meta: {
3536
3683
  docs: {
3537
3684
  category: 'Schema',
3538
3685
  description: 'Enforce descriptions in type definitions and operations.',
3539
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$a}.md`,
3686
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$b}.md`,
3540
3687
  examples: [
3541
3688
  {
3542
3689
  title: 'Incorrect',
@@ -3570,6 +3717,20 @@ const rule$l = {
3570
3717
  mutation createUser {
3571
3718
  # ...
3572
3719
  }
3720
+ `,
3721
+ },
3722
+ {
3723
+ title: 'Correct',
3724
+ usage: [{ rootField: true }],
3725
+ code: /* GraphQL */ `
3726
+ type Mutation {
3727
+ "Create a new user"
3728
+ createUser: User
3729
+ }
3730
+
3731
+ type User {
3732
+ name: String
3733
+ }
3573
3734
  `,
3574
3735
  },
3575
3736
  ],
@@ -3577,41 +3738,19 @@ const rule$l = {
3577
3738
  {
3578
3739
  types: true,
3579
3740
  [graphql.Kind.DIRECTIVE_DEFINITION]: true,
3741
+ // rootField: true TODO enable in graphql-eslint v4
3580
3742
  },
3581
3743
  ],
3582
3744
  recommended: true,
3583
3745
  },
3584
3746
  type: 'suggestion',
3585
3747
  messages: {
3586
- [RULE_ID$a]: 'Description is required for `{{ nodeName }}`.',
3587
- },
3588
- schema: {
3589
- type: 'array',
3590
- minItems: 1,
3591
- maxItems: 1,
3592
- items: {
3593
- type: 'object',
3594
- additionalProperties: false,
3595
- minProperties: 1,
3596
- properties: {
3597
- types: {
3598
- type: 'boolean',
3599
- description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
3600
- },
3601
- ...Object.fromEntries([...ALLOWED_KINDS$1].sort().map(kind => {
3602
- let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
3603
- if (kind === graphql.Kind.OPERATION_DEFINITION) {
3604
- description +=
3605
- '\n\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.';
3606
- }
3607
- return [kind, { type: 'boolean', description }];
3608
- })),
3609
- },
3610
- },
3748
+ [RULE_ID$b]: 'Description is required for `{{ nodeName }}`.',
3611
3749
  },
3750
+ schema: schema$a,
3612
3751
  },
3613
3752
  create(context) {
3614
- const { types, ...restOptions } = context.options[0] || {};
3753
+ const { types, rootField, ...restOptions } = context.options[0] || {};
3615
3754
  const kinds = new Set(types ? TYPES_KINDS : []);
3616
3755
  for (const [kind, isEnabled] of Object.entries(restOptions)) {
3617
3756
  if (isEnabled) {
@@ -3621,6 +3760,13 @@ const rule$l = {
3621
3760
  kinds.delete(kind);
3622
3761
  }
3623
3762
  }
3763
+ if (rootField) {
3764
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$b, context);
3765
+ const rootTypeNames = utils.getRootTypeNames(schema);
3766
+ kinds.add(`:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
3767
+ ...rootTypeNames,
3768
+ ].join(',')})$/] > FieldDefinition`);
3769
+ }
3624
3770
  const selector = [...kinds].join(',');
3625
3771
  return {
3626
3772
  [selector](node) {
@@ -3644,7 +3790,7 @@ const rule$l = {
3644
3790
  if (description.length === 0) {
3645
3791
  context.report({
3646
3792
  loc: isOperation ? getLocation(node.loc.start, node.operation) : node.name.loc,
3647
- messageId: RULE_ID$a,
3793
+ messageId: RULE_ID$b,
3648
3794
  data: {
3649
3795
  nodeName: getNodeName(node),
3650
3796
  },
@@ -3655,14 +3801,14 @@ const rule$l = {
3655
3801
  },
3656
3802
  };
3657
3803
 
3658
- const RULE_ID$b = 'require-field-of-type-query-in-mutation-result';
3659
- const rule$m = {
3804
+ const RULE_ID$c = 'require-field-of-type-query-in-mutation-result';
3805
+ const rule$n = {
3660
3806
  meta: {
3661
3807
  type: 'suggestion',
3662
3808
  docs: {
3663
3809
  category: 'Schema',
3664
3810
  description: 'Allow the client in one round-trip not only to call mutation but also to get a wagon of data to update their application.\n> Currently, no errors are reported for result type `union`, `interface` and `scalar`.',
3665
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$b}.md`,
3811
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$c}.md`,
3666
3812
  requiresSchema: true,
3667
3813
  examples: [
3668
3814
  {
@@ -3697,7 +3843,7 @@ const rule$m = {
3697
3843
  schema: [],
3698
3844
  },
3699
3845
  create(context) {
3700
- const schema = requireGraphQLSchemaFromContext(RULE_ID$b, context);
3846
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$c, context);
3701
3847
  const mutationType = schema.getMutationType();
3702
3848
  const queryType = schema.getQueryType();
3703
3849
  if (!mutationType || !queryType) {
@@ -3723,17 +3869,36 @@ const rule$m = {
3723
3869
  },
3724
3870
  };
3725
3871
 
3726
- const RULE_ID$c = 'require-id-when-available';
3872
+ const RULE_ID$d = 'require-id-when-available';
3727
3873
  const DEFAULT_ID_FIELD_NAME = 'id';
3728
- const rule$n = {
3874
+ const schema$b = {
3875
+ definitions: {
3876
+ asString: {
3877
+ type: 'string',
3878
+ },
3879
+ asArray: ARRAY_DEFAULT_OPTIONS,
3880
+ },
3881
+ type: 'array',
3882
+ maxItems: 1,
3883
+ items: {
3884
+ type: 'object',
3885
+ additionalProperties: false,
3886
+ properties: {
3887
+ fieldName: {
3888
+ oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asArray' }],
3889
+ default: DEFAULT_ID_FIELD_NAME,
3890
+ },
3891
+ },
3892
+ },
3893
+ };
3894
+ const rule$o = {
3729
3895
  meta: {
3730
3896
  type: 'suggestion',
3731
- // eslint-disable-next-line eslint-plugin/require-meta-has-suggestions
3732
3897
  hasSuggestions: true,
3733
3898
  docs: {
3734
3899
  category: 'Operations',
3735
3900
  description: 'Enforce selecting specific fields when they are available on the GraphQL type.',
3736
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$c}.md`,
3901
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$d}.md`,
3737
3902
  requiresSchema: true,
3738
3903
  requiresSiblings: true,
3739
3904
  examples: [
@@ -3783,32 +3948,13 @@ const rule$n = {
3783
3948
  recommended: true,
3784
3949
  },
3785
3950
  messages: {
3786
- [RULE_ID$c]: "Field{{ pluralSuffix }} {{ fieldName }} must be selected when it's available on a type.\nInclude it in your selection set{{ addition }}.",
3787
- },
3788
- schema: {
3789
- definitions: {
3790
- asString: {
3791
- type: 'string',
3792
- },
3793
- asArray: ARRAY_DEFAULT_OPTIONS,
3794
- },
3795
- type: 'array',
3796
- maxItems: 1,
3797
- items: {
3798
- type: 'object',
3799
- additionalProperties: false,
3800
- properties: {
3801
- fieldName: {
3802
- oneOf: [{ $ref: '#/definitions/asString' }, { $ref: '#/definitions/asArray' }],
3803
- default: DEFAULT_ID_FIELD_NAME,
3804
- },
3805
- },
3806
- },
3951
+ [RULE_ID$d]: "Field{{ pluralSuffix }} {{ fieldName }} must be selected when it's available on a type.\nInclude it in your selection set{{ addition }}.",
3807
3952
  },
3953
+ schema: schema$b,
3808
3954
  },
3809
3955
  create(context) {
3810
- const schema = requireGraphQLSchemaFromContext(RULE_ID$c, context);
3811
- const siblings = requireSiblingsOperations(RULE_ID$c, context);
3956
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$d, context);
3957
+ const siblings = requireSiblingsOperations(RULE_ID$d, context);
3812
3958
  const { fieldName = DEFAULT_ID_FIELD_NAME } = context.options[0] || {};
3813
3959
  const idNames = utils.asArray(fieldName);
3814
3960
  // Check selections only in OperationDefinition,
@@ -3889,7 +4035,7 @@ const rule$n = {
3889
4035
  : ` or add to used fragment${checkedFragmentSpreads.size > 1 ? 's' : ''} ${englishJoinWords([...checkedFragmentSpreads].map(name => `\`${name}\``))}`;
3890
4036
  const problem = {
3891
4037
  loc,
3892
- messageId: RULE_ID$c,
4038
+ messageId: RULE_ID$d,
3893
4039
  data: {
3894
4040
  pluralSuffix,
3895
4041
  fieldName,
@@ -3916,15 +4062,31 @@ const rule$n = {
3916
4062
  },
3917
4063
  };
3918
4064
 
3919
- const RULE_ID$d = 'selection-set-depth';
3920
- const rule$o = {
4065
+ const RULE_ID$e = 'selection-set-depth';
4066
+ const schema$c = {
4067
+ type: 'array',
4068
+ minItems: 1,
4069
+ maxItems: 1,
4070
+ items: {
4071
+ type: 'object',
4072
+ additionalProperties: false,
4073
+ required: ['maxDepth'],
4074
+ properties: {
4075
+ maxDepth: {
4076
+ type: 'number',
4077
+ },
4078
+ ignore: ARRAY_DEFAULT_OPTIONS,
4079
+ },
4080
+ },
4081
+ };
4082
+ const rule$p = {
3921
4083
  meta: {
3922
4084
  type: 'suggestion',
3923
4085
  hasSuggestions: true,
3924
4086
  docs: {
3925
4087
  category: 'Operations',
3926
4088
  description: 'Limit the complexity of the GraphQL operations solely by their depth. Based on [graphql-depth-limit](https://npmjs.com/package/graphql-depth-limit).',
3927
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$d}.md`,
4089
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$e}.md`,
3928
4090
  requiresSiblings: true,
3929
4091
  examples: [
3930
4092
  {
@@ -3970,30 +4132,15 @@ const rule$o = {
3970
4132
  recommended: true,
3971
4133
  configOptions: [{ maxDepth: 7 }],
3972
4134
  },
3973
- schema: {
3974
- type: 'array',
3975
- minItems: 1,
3976
- maxItems: 1,
3977
- items: {
3978
- type: 'object',
3979
- additionalProperties: false,
3980
- required: ['maxDepth'],
3981
- properties: {
3982
- maxDepth: {
3983
- type: 'number',
3984
- },
3985
- ignore: ARRAY_DEFAULT_OPTIONS,
3986
- },
3987
- },
3988
- },
4135
+ schema: schema$c,
3989
4136
  },
3990
4137
  create(context) {
3991
4138
  let siblings = null;
3992
4139
  try {
3993
- siblings = requireSiblingsOperations(RULE_ID$d, context);
4140
+ siblings = requireSiblingsOperations(RULE_ID$e, context);
3994
4141
  }
3995
4142
  catch (_a) {
3996
- logger.warn(`Rule "${RULE_ID$d}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
4143
+ logger.warn(`Rule "${RULE_ID$e}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
3997
4144
  }
3998
4145
  const { maxDepth, ignore = [] } = context.options[0];
3999
4146
  const checkFn = depthLimit(maxDepth, { ignore });
@@ -4037,22 +4184,54 @@ const rule$o = {
4037
4184
  });
4038
4185
  }
4039
4186
  catch (e) {
4040
- logger.warn(`Rule "${RULE_ID$d}" check failed due to a missing siblings operations. For more info: https://bit.ly/graphql-eslint-operations`, e);
4187
+ logger.warn(`Rule "${RULE_ID$e}" check failed due to a missing siblings operations. For more info: https://bit.ly/graphql-eslint-operations`, e);
4041
4188
  }
4042
4189
  },
4043
4190
  };
4044
4191
  },
4045
4192
  };
4046
4193
 
4047
- const RULE_ID$e = 'strict-id-in-types';
4048
- const rule$p = {
4194
+ const RULE_ID$f = 'strict-id-in-types';
4195
+ const schema$d = {
4196
+ type: 'array',
4197
+ maxItems: 1,
4198
+ items: {
4199
+ type: 'object',
4200
+ additionalProperties: false,
4201
+ properties: {
4202
+ acceptedIdNames: {
4203
+ ...ARRAY_DEFAULT_OPTIONS,
4204
+ default: ['id'],
4205
+ },
4206
+ acceptedIdTypes: {
4207
+ ...ARRAY_DEFAULT_OPTIONS,
4208
+ default: ['ID'],
4209
+ },
4210
+ exceptions: {
4211
+ type: 'object',
4212
+ additionalProperties: false,
4213
+ properties: {
4214
+ types: {
4215
+ ...ARRAY_DEFAULT_OPTIONS,
4216
+ description: 'This is used to exclude types with names that match one of the specified values.',
4217
+ },
4218
+ suffixes: {
4219
+ ...ARRAY_DEFAULT_OPTIONS,
4220
+ description: 'This is used to exclude types with names with suffixes that match one of the specified values.',
4221
+ },
4222
+ },
4223
+ },
4224
+ },
4225
+ },
4226
+ };
4227
+ const rule$q = {
4049
4228
  meta: {
4050
4229
  type: 'suggestion',
4051
4230
  docs: {
4052
4231
  description: 'Requires output types to have one unique identifier unless they do not have a logical one. Exceptions can be used to ignore output types that do not have unique identifiers.',
4053
4232
  category: 'Schema',
4054
4233
  recommended: true,
4055
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$e}.md`,
4234
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$f}.md`,
4056
4235
  requiresSchema: true,
4057
4236
  examples: [
4058
4237
  {
@@ -4116,37 +4295,7 @@ const rule$p = {
4116
4295
  },
4117
4296
  ],
4118
4297
  },
4119
- schema: {
4120
- type: 'array',
4121
- maxItems: 1,
4122
- items: {
4123
- type: 'object',
4124
- additionalProperties: false,
4125
- properties: {
4126
- acceptedIdNames: {
4127
- ...ARRAY_DEFAULT_OPTIONS,
4128
- default: ['id'],
4129
- },
4130
- acceptedIdTypes: {
4131
- ...ARRAY_DEFAULT_OPTIONS,
4132
- default: ['ID'],
4133
- },
4134
- exceptions: {
4135
- type: 'object',
4136
- properties: {
4137
- types: {
4138
- ...ARRAY_DEFAULT_OPTIONS,
4139
- description: 'This is used to exclude types with names that match one of the specified values.',
4140
- },
4141
- suffixes: {
4142
- ...ARRAY_DEFAULT_OPTIONS,
4143
- description: 'This is used to exclude types with names with suffixes that match one of the specified values.',
4144
- },
4145
- },
4146
- },
4147
- },
4148
- },
4149
- },
4298
+ schema: schema$d,
4150
4299
  },
4151
4300
  create(context) {
4152
4301
  const options = {
@@ -4155,7 +4304,7 @@ const rule$p = {
4155
4304
  exceptions: {},
4156
4305
  ...context.options[0],
4157
4306
  };
4158
- const schema = requireGraphQLSchemaFromContext(RULE_ID$e, context);
4307
+ const schema = requireGraphQLSchemaFromContext(RULE_ID$f, context);
4159
4308
  const rootTypeNames = [
4160
4309
  schema.getQueryType(),
4161
4310
  schema.getMutationType(),
@@ -4200,7 +4349,7 @@ const rule$p = {
4200
4349
  },
4201
4350
  };
4202
4351
 
4203
- const RULE_ID$f = 'unique-fragment-name';
4352
+ const RULE_ID$g = 'unique-fragment-name';
4204
4353
  const checkNode = (context, node, ruleId) => {
4205
4354
  const documentName = node.name.value;
4206
4355
  const siblings = requireSiblingsOperations(ruleId, context);
@@ -4227,13 +4376,13 @@ const checkNode = (context, node, ruleId) => {
4227
4376
  });
4228
4377
  }
4229
4378
  };
4230
- const rule$q = {
4379
+ const rule$r = {
4231
4380
  meta: {
4232
4381
  type: 'suggestion',
4233
4382
  docs: {
4234
4383
  category: 'Operations',
4235
4384
  description: 'Enforce unique fragment names across your project.',
4236
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$f}.md`,
4385
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$g}.md`,
4237
4386
  requiresSiblings: true,
4238
4387
  examples: [
4239
4388
  {
@@ -4271,27 +4420,27 @@ const rule$q = {
4271
4420
  ],
4272
4421
  },
4273
4422
  messages: {
4274
- [RULE_ID$f]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}',
4423
+ [RULE_ID$g]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}',
4275
4424
  },
4276
4425
  schema: [],
4277
4426
  },
4278
4427
  create(context) {
4279
4428
  return {
4280
4429
  FragmentDefinition(node) {
4281
- checkNode(context, node, RULE_ID$f);
4430
+ checkNode(context, node, RULE_ID$g);
4282
4431
  },
4283
4432
  };
4284
4433
  },
4285
4434
  };
4286
4435
 
4287
- const RULE_ID$g = 'unique-operation-name';
4288
- const rule$r = {
4436
+ const RULE_ID$h = 'unique-operation-name';
4437
+ const rule$s = {
4289
4438
  meta: {
4290
4439
  type: 'suggestion',
4291
4440
  docs: {
4292
4441
  category: 'Operations',
4293
4442
  description: 'Enforce unique operation names across your project.',
4294
- url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$g}.md`,
4443
+ url: `https://github.com/B2o5T/graphql-eslint/blob/master/docs/rules/${RULE_ID$h}.md`,
4295
4444
  requiresSiblings: true,
4296
4445
  examples: [
4297
4446
  {
@@ -4333,14 +4482,14 @@ const rule$r = {
4333
4482
  ],
4334
4483
  },
4335
4484
  messages: {
4336
- [RULE_ID$g]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}',
4485
+ [RULE_ID$h]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}',
4337
4486
  },
4338
4487
  schema: [],
4339
4488
  },
4340
4489
  create(context) {
4341
4490
  return {
4342
4491
  'OperationDefinition[name!=undefined]'(node) {
4343
- checkNode(context, node, RULE_ID$g);
4492
+ checkNode(context, node, RULE_ID$h);
4344
4493
  },
4345
4494
  };
4346
4495
  },
@@ -4354,31 +4503,32 @@ const rules = {
4354
4503
  alphabetize: rule,
4355
4504
  'description-style': rule$1,
4356
4505
  'input-name': rule$2,
4357
- 'match-document-filename': rule$3,
4358
- 'naming-convention': rule$4,
4359
- 'no-anonymous-operations': rule$5,
4360
- 'no-case-insensitive-enum-values-duplicates': rule$6,
4361
- 'no-deprecated': rule$7,
4362
- 'no-duplicate-fields': rule$8,
4363
- 'no-hashtag-description': rule$9,
4364
- 'no-root-type': rule$a,
4365
- 'no-scalar-result-type-on-mutation': rule$b,
4366
- 'no-typename-prefix': rule$c,
4367
- 'no-unreachable-types': rule$d,
4368
- 'no-unused-fields': rule$e,
4369
- 'relay-arguments': rule$f,
4370
- 'relay-connection-types': rule$g,
4371
- 'relay-edge-types': rule$h,
4372
- 'relay-page-info': rule$i,
4373
- 'require-deprecation-date': rule$j,
4374
- 'require-deprecation-reason': rule$k,
4375
- 'require-description': rule$l,
4376
- 'require-field-of-type-query-in-mutation-result': rule$m,
4377
- 'require-id-when-available': rule$n,
4378
- 'selection-set-depth': rule$o,
4379
- 'strict-id-in-types': rule$p,
4380
- 'unique-fragment-name': rule$q,
4381
- 'unique-operation-name': rule$r,
4506
+ 'lone-executable-definition': rule$3,
4507
+ 'match-document-filename': rule$4,
4508
+ 'naming-convention': rule$5,
4509
+ 'no-anonymous-operations': rule$6,
4510
+ 'no-case-insensitive-enum-values-duplicates': rule$7,
4511
+ 'no-deprecated': rule$8,
4512
+ 'no-duplicate-fields': rule$9,
4513
+ 'no-hashtag-description': rule$a,
4514
+ 'no-root-type': rule$b,
4515
+ 'no-scalar-result-type-on-mutation': rule$c,
4516
+ 'no-typename-prefix': rule$d,
4517
+ 'no-unreachable-types': rule$e,
4518
+ 'no-unused-fields': rule$f,
4519
+ 'relay-arguments': rule$g,
4520
+ 'relay-connection-types': rule$h,
4521
+ 'relay-edge-types': rule$i,
4522
+ 'relay-page-info': rule$j,
4523
+ 'require-deprecation-date': rule$k,
4524
+ 'require-deprecation-reason': rule$l,
4525
+ 'require-description': rule$m,
4526
+ 'require-field-of-type-query-in-mutation-result': rule$n,
4527
+ 'require-id-when-available': rule$o,
4528
+ 'selection-set-depth': rule$p,
4529
+ 'strict-id-in-types': rule$q,
4530
+ 'unique-fragment-name': rule$r,
4531
+ 'unique-operation-name': rule$s,
4382
4532
  };
4383
4533
 
4384
4534
  // Based on the `eslint-plugin-import`'s cache