@graphql-eslint/eslint-plugin 3.0.0-alpha-636cc2a.0 → 3.0.0-alpha-0a996de.0

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.
package/README.md CHANGED
@@ -180,6 +180,10 @@ You can find a list of [ESLint directives here](https://eslint.org/docs/2.13.1/u
180
180
 
181
181
  You can find a complete list of [all available rules here](docs/README.md).
182
182
 
183
+ ## Deprecated Rules
184
+
185
+ See [docs/deprecated-rules.md](docs/deprecated-rules.md).
186
+
183
187
  ## Available Configs
184
188
 
185
189
  <!-- prettier-ignore-start -->
@@ -13,7 +13,10 @@ export declare const configs: {
13
13
  '@graphql-eslint/lone-schema-definition': string;
14
14
  '@graphql-eslint/naming-convention': (string | {
15
15
  types: string;
16
- fields: string;
16
+ FieldDefinition: string;
17
+ InputValueDefinition: string;
18
+ Argument: string;
19
+ DirectiveDefinition: string;
17
20
  EnumValueDefinition: string;
18
21
  'FieldDefinition[parent.name.value=Query]': {
19
22
  forbiddenPrefixes: string[];
@@ -32,7 +35,6 @@ export declare const configs: {
32
35
  '@graphql-eslint/no-hashtag-description': string;
33
36
  '@graphql-eslint/no-typename-prefix': string;
34
37
  '@graphql-eslint/no-unreachable-types': string;
35
- '@graphql-eslint/possible-type-extension': string;
36
38
  '@graphql-eslint/provided-required-arguments': string;
37
39
  '@graphql-eslint/require-deprecation-reason': string;
38
40
  '@graphql-eslint/require-description': (string | {
@@ -60,6 +62,7 @@ export declare const configs: {
60
62
  '@graphql-eslint/no-root-type': string;
61
63
  '@graphql-eslint/no-scalar-result-type-on-mutation': string;
62
64
  '@graphql-eslint/no-unused-fields': string;
65
+ '@graphql-eslint/possible-type-extension': string;
63
66
  '@graphql-eslint/require-deprecation-date': string;
64
67
  '@graphql-eslint/require-field-of-type-query-in-mutation-result': string;
65
68
  };
@@ -10,6 +10,7 @@ declare const _default: {
10
10
  '@graphql-eslint/no-root-type': string;
11
11
  '@graphql-eslint/no-scalar-result-type-on-mutation': string;
12
12
  '@graphql-eslint/no-unused-fields': string;
13
+ '@graphql-eslint/possible-type-extension': string;
13
14
  '@graphql-eslint/require-deprecation-date': string;
14
15
  '@graphql-eslint/require-field-of-type-query-in-mutation-result': string;
15
16
  };
@@ -8,7 +8,10 @@ declare const _default: {
8
8
  '@graphql-eslint/lone-schema-definition': string;
9
9
  '@graphql-eslint/naming-convention': (string | {
10
10
  types: string;
11
- fields: string;
11
+ FieldDefinition: string;
12
+ InputValueDefinition: string;
13
+ Argument: string;
14
+ DirectiveDefinition: string;
12
15
  EnumValueDefinition: string;
13
16
  'FieldDefinition[parent.name.value=Query]': {
14
17
  forbiddenPrefixes: string[];
@@ -27,7 +30,6 @@ declare const _default: {
27
30
  '@graphql-eslint/no-hashtag-description': string;
28
31
  '@graphql-eslint/no-typename-prefix': string;
29
32
  '@graphql-eslint/no-unreachable-types': string;
30
- '@graphql-eslint/possible-type-extension': string;
31
33
  '@graphql-eslint/provided-required-arguments': string;
32
34
  '@graphql-eslint/require-deprecation-reason': string;
33
35
  '@graphql-eslint/require-description': (string | {
package/docs/README.md CHANGED
@@ -42,7 +42,7 @@ Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs
42
42
  [one-field-subscriptions](rules/one-field-subscriptions.md)|A GraphQL subscription is valid only if it contains a single root field.|🔮||✅
43
43
  [overlapping-fields-can-be-merged](rules/overlapping-fields-can-be-merged.md)|A selection set is only valid if all fields (including spreading any fragments) either correspond to distinct response names or can be merged without ambiguity.|🔮||✅
44
44
  [possible-fragment-spread](rules/possible-fragment-spread.md)|A fragment spread is only valid if the type condition could ever possibly be true: if there is a non-empty intersection of the possible parent types, and possible types which pass the type condition.|🔮||✅
45
- [possible-type-extension](rules/possible-type-extension.md)|A type extension is only valid if the type is defined and has the same kind.|🔮||✅
45
+ [possible-type-extension](rules/possible-type-extension.md)|A type extension is only valid if the type is defined and has the same kind.|🔮||
46
46
  [provided-required-arguments](rules/provided-required-arguments.md)|A field or directive is only valid if all required (non-null without a default value) field arguments have been provided.|🔮||✅
47
47
  [require-deprecation-date](rules/require-deprecation-date.md)|Require deletion date on `@deprecated` directive. Suggest removing deprecated things after deprecated date.|🚀||
48
48
  [require-deprecation-reason](rules/require-deprecation-reason.md)|Require all deprecation directives to specify a reason.|🚀||✅
@@ -14,7 +14,7 @@ Require names to follow specified conventions.
14
14
  ### Incorrect
15
15
 
16
16
  ```graphql
17
- # eslint @graphql-eslint/naming-convention: ['error', { types: 'PascalCase', fields: 'camelCase' }]
17
+ # eslint @graphql-eslint/naming-convention: ['error', { types: 'PascalCase', FieldDefinition: 'camelCase' }]
18
18
 
19
19
  type user {
20
20
  first_name: String!
@@ -44,7 +44,7 @@ type Query {
44
44
  ### Correct
45
45
 
46
46
  ```graphql
47
- # eslint @graphql-eslint/naming-convention: ['error', { types: 'PascalCase', fields: 'camelCase' }]
47
+ # eslint @graphql-eslint/naming-convention: ['error', { types: 'PascalCase', FieldDefinition: 'camelCase' }]
48
48
 
49
49
  type User {
50
50
  firstName: String
@@ -97,20 +97,6 @@ The object must be one of the following types:
97
97
  * `asString`
98
98
  * `asObject`
99
99
 
100
- ### `fields`
101
-
102
- Includes:
103
-
104
- - `FieldDefinition`
105
- - `InputValueDefinition`
106
- - `Argument`
107
- - `DirectiveDefinition`
108
-
109
- The object must be one of the following types:
110
-
111
- * `asString`
112
- * `asObject`
113
-
114
100
  ### `Argument`
115
101
 
116
102
  Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#Argument).
@@ -1,7 +1,5 @@
1
1
  # `possible-type-extension`
2
2
 
3
- ✅ The `"extends": "plugin:@graphql-eslint/schema-recommended"` property in a configuration file enables this rule.
4
-
5
3
  - Category: `Schema`
6
4
  - Rule name: `@graphql-eslint/possible-type-extension`
7
5
  - Requires GraphQL Schema: `false` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
package/index.js CHANGED
@@ -38,7 +38,10 @@ const schemaRecommendedConfig = {
38
38
  'error',
39
39
  {
40
40
  types: 'PascalCase',
41
- fields: 'camelCase',
41
+ FieldDefinition: 'camelCase',
42
+ InputValueDefinition: 'camelCase',
43
+ Argument: 'camelCase',
44
+ DirectiveDefinition: 'camelCase',
42
45
  EnumValueDefinition: 'UPPER_CASE',
43
46
  'FieldDefinition[parent.name.value=Query]': {
44
47
  forbiddenPrefixes: ['query', 'get'],
@@ -58,7 +61,6 @@ const schemaRecommendedConfig = {
58
61
  '@graphql-eslint/no-hashtag-description': 'error',
59
62
  '@graphql-eslint/no-typename-prefix': 'error',
60
63
  '@graphql-eslint/no-unreachable-types': 'error',
61
- '@graphql-eslint/possible-type-extension': 'error',
62
64
  '@graphql-eslint/provided-required-arguments': 'error',
63
65
  '@graphql-eslint/require-deprecation-reason': 'error',
64
66
  '@graphql-eslint/require-description': ['error', { types: true, DirectiveDefinition: true }],
@@ -90,6 +92,7 @@ const schemaAllConfig = {
90
92
  '@graphql-eslint/no-root-type': 'off',
91
93
  '@graphql-eslint/no-scalar-result-type-on-mutation': 'error',
92
94
  '@graphql-eslint/no-unused-fields': 'off',
95
+ '@graphql-eslint/possible-type-extension': 'off',
93
96
  '@graphql-eslint/require-deprecation-date': 'error',
94
97
  '@graphql-eslint/require-field-of-type-query-in-mutation-result': 'error',
95
98
  },
@@ -384,9 +387,9 @@ const validationToRule = (name, ruleName, docs, getDocumentNode) => {
384
387
  [name]: {
385
388
  meta: {
386
389
  docs: {
390
+ recommended: true,
387
391
  ...docs,
388
392
  graphQLJSRuleName: ruleName,
389
- recommended: true,
390
393
  requiresSchema,
391
394
  url: `https://github.com/dotansimha/graphql-eslint/blob/master/docs/rules/${name}.md`,
392
395
  description: `${docs.description}\n\n> This rule is a wrapper around a \`graphql-js\` validation function. [You can find its source code here](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/${ruleName}Rule.ts).`,
@@ -562,6 +565,7 @@ const GRAPHQL_JS_VALIDATIONS = Object.assign({}, validationToRule('executable-de
562
565
  category: 'Schema',
563
566
  description: `A type extension is only valid if the type is defined and has the same kind.`,
564
567
  requiresSchema: false,
568
+ recommended: false, // TODO: enable after https://github.com/dotansimha/graphql-eslint/issues/787 will be fixed
565
569
  }), validationToRule('provided-required-arguments', 'ProvidedRequiredArguments', {
566
570
  category: ['Schema', 'Operations'],
567
571
  description: `A field or directive is only valid if all required (non-null without a default value) field arguments have been provided.`,
@@ -1247,7 +1251,6 @@ const rule$3 = {
1247
1251
  },
1248
1252
  };
1249
1253
 
1250
- const FIELDS_KINDS = [graphql.Kind.FIELD_DEFINITION, graphql.Kind.INPUT_VALUE_DEFINITION, graphql.Kind.ARGUMENT, graphql.Kind.DIRECTIVE_DEFINITION];
1251
1254
  const KindToDisplayName = {
1252
1255
  // types
1253
1256
  [graphql.Kind.OBJECT_TYPE_DEFINITION]: 'Type',
@@ -1289,7 +1292,7 @@ const rule$4 = {
1289
1292
  examples: [
1290
1293
  {
1291
1294
  title: 'Incorrect',
1292
- usage: [{ types: 'PascalCase', fields: 'camelCase' }],
1295
+ usage: [{ types: 'PascalCase', FieldDefinition: 'camelCase' }],
1293
1296
  code: /* GraphQL */ `
1294
1297
  type user {
1295
1298
  first_name: String!
@@ -1316,7 +1319,7 @@ const rule$4 = {
1316
1319
  },
1317
1320
  {
1318
1321
  title: 'Correct',
1319
- usage: [{ types: 'PascalCase', fields: 'camelCase' }],
1322
+ usage: [{ types: 'PascalCase', FieldDefinition: 'camelCase' }],
1320
1323
  code: /* GraphQL */ `
1321
1324
  type User {
1322
1325
  firstName: String
@@ -1346,7 +1349,10 @@ const rule$4 = {
1346
1349
  schema: [
1347
1350
  {
1348
1351
  types: 'PascalCase',
1349
- fields: 'camelCase',
1352
+ FieldDefinition: 'camelCase',
1353
+ InputValueDefinition: 'camelCase',
1354
+ Argument: 'camelCase',
1355
+ DirectiveDefinition: 'camelCase',
1350
1356
  EnumValueDefinition: 'UPPER_CASE',
1351
1357
  'FieldDefinition[parent.name.value=Query]': {
1352
1358
  forbiddenPrefixes: ['query', 'get'],
@@ -1417,10 +1423,6 @@ const rule$4 = {
1417
1423
  ...schemaOption$1,
1418
1424
  description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1419
1425
  },
1420
- fields: {
1421
- ...schemaOption$1,
1422
- description: `Includes:\n\n${FIELDS_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1423
- },
1424
1426
  ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1425
1427
  kind,
1426
1428
  {
@@ -1452,12 +1454,9 @@ const rule$4 = {
1452
1454
  },
1453
1455
  create(context) {
1454
1456
  const options = context.options[0] || {};
1455
- const { allowLeadingUnderscore, allowTrailingUnderscore, types, fields, ...restOptions } = options;
1457
+ const { allowLeadingUnderscore, allowTrailingUnderscore, types, ...restOptions } = options;
1456
1458
  function normalisePropertyOption(kind) {
1457
- let style = options[kind];
1458
- if (!style) {
1459
- style = TYPES_KINDS.includes(kind) ? types : fields;
1460
- }
1459
+ const style = restOptions[kind] || types;
1461
1460
  return typeof style === 'object' ? style : { style };
1462
1461
  }
1463
1462
  const checkNode = (selector) => (node) => {
@@ -1520,7 +1519,7 @@ const rule$4 = {
1520
1519
  if (!allowTrailingUnderscore) {
1521
1520
  listeners['Name[value=/_$/]:matches([parent.kind!=Field], [parent.kind=Field][parent.alias])'] = checkUnderscore;
1522
1521
  }
1523
- const selectors = new Set([types && TYPES_KINDS, fields && FIELDS_KINDS, Object.keys(restOptions)].flat().filter(Boolean));
1522
+ const selectors = new Set([types && TYPES_KINDS, Object.keys(restOptions)].flat().filter(Boolean));
1524
1523
  for (const selector of selectors) {
1525
1524
  listeners[selector] = checkNode(selector);
1526
1525
  }
package/index.mjs CHANGED
@@ -32,7 +32,10 @@ const schemaRecommendedConfig = {
32
32
  'error',
33
33
  {
34
34
  types: 'PascalCase',
35
- fields: 'camelCase',
35
+ FieldDefinition: 'camelCase',
36
+ InputValueDefinition: 'camelCase',
37
+ Argument: 'camelCase',
38
+ DirectiveDefinition: 'camelCase',
36
39
  EnumValueDefinition: 'UPPER_CASE',
37
40
  'FieldDefinition[parent.name.value=Query]': {
38
41
  forbiddenPrefixes: ['query', 'get'],
@@ -52,7 +55,6 @@ const schemaRecommendedConfig = {
52
55
  '@graphql-eslint/no-hashtag-description': 'error',
53
56
  '@graphql-eslint/no-typename-prefix': 'error',
54
57
  '@graphql-eslint/no-unreachable-types': 'error',
55
- '@graphql-eslint/possible-type-extension': 'error',
56
58
  '@graphql-eslint/provided-required-arguments': 'error',
57
59
  '@graphql-eslint/require-deprecation-reason': 'error',
58
60
  '@graphql-eslint/require-description': ['error', { types: true, DirectiveDefinition: true }],
@@ -84,6 +86,7 @@ const schemaAllConfig = {
84
86
  '@graphql-eslint/no-root-type': 'off',
85
87
  '@graphql-eslint/no-scalar-result-type-on-mutation': 'error',
86
88
  '@graphql-eslint/no-unused-fields': 'off',
89
+ '@graphql-eslint/possible-type-extension': 'off',
87
90
  '@graphql-eslint/require-deprecation-date': 'error',
88
91
  '@graphql-eslint/require-field-of-type-query-in-mutation-result': 'error',
89
92
  },
@@ -378,9 +381,9 @@ const validationToRule = (name, ruleName, docs, getDocumentNode) => {
378
381
  [name]: {
379
382
  meta: {
380
383
  docs: {
384
+ recommended: true,
381
385
  ...docs,
382
386
  graphQLJSRuleName: ruleName,
383
- recommended: true,
384
387
  requiresSchema,
385
388
  url: `https://github.com/dotansimha/graphql-eslint/blob/master/docs/rules/${name}.md`,
386
389
  description: `${docs.description}\n\n> This rule is a wrapper around a \`graphql-js\` validation function. [You can find its source code here](https://github.com/graphql/graphql-js/blob/main/src/validation/rules/${ruleName}Rule.ts).`,
@@ -556,6 +559,7 @@ const GRAPHQL_JS_VALIDATIONS = Object.assign({}, validationToRule('executable-de
556
559
  category: 'Schema',
557
560
  description: `A type extension is only valid if the type is defined and has the same kind.`,
558
561
  requiresSchema: false,
562
+ recommended: false, // TODO: enable after https://github.com/dotansimha/graphql-eslint/issues/787 will be fixed
559
563
  }), validationToRule('provided-required-arguments', 'ProvidedRequiredArguments', {
560
564
  category: ['Schema', 'Operations'],
561
565
  description: `A field or directive is only valid if all required (non-null without a default value) field arguments have been provided.`,
@@ -1241,7 +1245,6 @@ const rule$3 = {
1241
1245
  },
1242
1246
  };
1243
1247
 
1244
- const FIELDS_KINDS = [Kind.FIELD_DEFINITION, Kind.INPUT_VALUE_DEFINITION, Kind.ARGUMENT, Kind.DIRECTIVE_DEFINITION];
1245
1248
  const KindToDisplayName = {
1246
1249
  // types
1247
1250
  [Kind.OBJECT_TYPE_DEFINITION]: 'Type',
@@ -1283,7 +1286,7 @@ const rule$4 = {
1283
1286
  examples: [
1284
1287
  {
1285
1288
  title: 'Incorrect',
1286
- usage: [{ types: 'PascalCase', fields: 'camelCase' }],
1289
+ usage: [{ types: 'PascalCase', FieldDefinition: 'camelCase' }],
1287
1290
  code: /* GraphQL */ `
1288
1291
  type user {
1289
1292
  first_name: String!
@@ -1310,7 +1313,7 @@ const rule$4 = {
1310
1313
  },
1311
1314
  {
1312
1315
  title: 'Correct',
1313
- usage: [{ types: 'PascalCase', fields: 'camelCase' }],
1316
+ usage: [{ types: 'PascalCase', FieldDefinition: 'camelCase' }],
1314
1317
  code: /* GraphQL */ `
1315
1318
  type User {
1316
1319
  firstName: String
@@ -1340,7 +1343,10 @@ const rule$4 = {
1340
1343
  schema: [
1341
1344
  {
1342
1345
  types: 'PascalCase',
1343
- fields: 'camelCase',
1346
+ FieldDefinition: 'camelCase',
1347
+ InputValueDefinition: 'camelCase',
1348
+ Argument: 'camelCase',
1349
+ DirectiveDefinition: 'camelCase',
1344
1350
  EnumValueDefinition: 'UPPER_CASE',
1345
1351
  'FieldDefinition[parent.name.value=Query]': {
1346
1352
  forbiddenPrefixes: ['query', 'get'],
@@ -1411,10 +1417,6 @@ const rule$4 = {
1411
1417
  ...schemaOption$1,
1412
1418
  description: `Includes:\n\n${TYPES_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1413
1419
  },
1414
- fields: {
1415
- ...schemaOption$1,
1416
- description: `Includes:\n\n${FIELDS_KINDS.map(kind => `- \`${kind}\``).join('\n')}`,
1417
- },
1418
1420
  ...Object.fromEntries(ALLOWED_KINDS.map(kind => [
1419
1421
  kind,
1420
1422
  {
@@ -1446,12 +1448,9 @@ const rule$4 = {
1446
1448
  },
1447
1449
  create(context) {
1448
1450
  const options = context.options[0] || {};
1449
- const { allowLeadingUnderscore, allowTrailingUnderscore, types, fields, ...restOptions } = options;
1451
+ const { allowLeadingUnderscore, allowTrailingUnderscore, types, ...restOptions } = options;
1450
1452
  function normalisePropertyOption(kind) {
1451
- let style = options[kind];
1452
- if (!style) {
1453
- style = TYPES_KINDS.includes(kind) ? types : fields;
1454
- }
1453
+ const style = restOptions[kind] || types;
1455
1454
  return typeof style === 'object' ? style : { style };
1456
1455
  }
1457
1456
  const checkNode = (selector) => (node) => {
@@ -1514,7 +1513,7 @@ const rule$4 = {
1514
1513
  if (!allowTrailingUnderscore) {
1515
1514
  listeners['Name[value=/_$/]:matches([parent.kind!=Field], [parent.kind=Field][parent.alias])'] = checkUnderscore;
1516
1515
  }
1517
- const selectors = new Set([types && TYPES_KINDS, fields && FIELDS_KINDS, Object.keys(restOptions)].flat().filter(Boolean));
1516
+ const selectors = new Set([types && TYPES_KINDS, Object.keys(restOptions)].flat().filter(Boolean));
1518
1517
  for (const selector of selectors) {
1519
1518
  listeners[selector] = checkNode(selector);
1520
1519
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphql-eslint/eslint-plugin",
3
- "version": "3.0.0-alpha-636cc2a.0",
3
+ "version": "3.0.0-alpha-0a996de.0",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
6
  "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
package/rules/index.d.ts CHANGED
@@ -44,13 +44,6 @@ export declare const rules: {
44
44
  forbiddenPrefixes?: string[];
45
45
  forbiddenSuffixes?: string[];
46
46
  };
47
- fields?: ("PascalCase" | "camelCase" | "UPPER_CASE" | "snake_case") | {
48
- style?: "PascalCase" | "camelCase" | "UPPER_CASE" | "snake_case";
49
- suffix?: string;
50
- prefix?: string;
51
- forbiddenPrefixes?: string[];
52
- forbiddenSuffixes?: string[];
53
- };
54
47
  } & {
55
48
  [x: `OperationDefinition${string}`]: ("PascalCase" | "camelCase" | "UPPER_CASE" | "snake_case") | {
56
49
  style?: "PascalCase" | "camelCase" | "UPPER_CASE" | "snake_case";
@@ -29,7 +29,6 @@ declare type NamingConventionRuleConfig = {
29
29
  allowLeadingUnderscore?: boolean;
30
30
  allowTrailingUnderscore?: boolean;
31
31
  types?: Options;
32
- fields?: Options;
33
32
  } & {
34
33
  [key in `${AllowedKind}${string}`]?: Options;
35
34
  };