@graphql-eslint/eslint-plugin 4.0.0-alpha.12 → 4.0.0-alpha.13
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/cjs/meta.js +1 -1
- package/cjs/rules/no-deprecated/index.js +15 -5
- package/cjs/utils.d.cts +1 -1
- package/cjs/utils.js +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/meta.js +1 -1
- package/esm/rules/index.d.ts +1 -1
- package/esm/rules/no-deprecated/index.js +16 -6
- package/esm/utils.d.ts +1 -1
- package/esm/utils.js +1 -1
- package/index.browser.js +87 -77
- package/package.json +1 -1
package/cjs/meta.js
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }require('../../chunk-UIAXBAMD.js');
|
2
|
-
var _graphql = require('graphql');
|
3
2
|
var _utilsjs = require('../../utils.js');
|
4
3
|
const RULE_ID = "no-deprecated", rule = exports.rule = {
|
5
4
|
meta: {
|
@@ -84,24 +83,24 @@ const RULE_ID = "no-deprecated", rule = exports.rule = {
|
|
84
83
|
recommended: !0
|
85
84
|
},
|
86
85
|
messages: {
|
87
|
-
[RULE_ID]: "
|
86
|
+
[RULE_ID]: "{{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})"
|
88
87
|
},
|
89
88
|
schema: []
|
90
89
|
},
|
91
90
|
create(context) {
|
92
91
|
_utilsjs.requireGraphQLSchemaFromContext.call(void 0, RULE_ID, context);
|
93
92
|
function report(node, reason) {
|
94
|
-
const
|
93
|
+
const nodeType = _utilsjs.displayNodeName.call(void 0, node);
|
95
94
|
context.report({
|
96
95
|
node,
|
97
96
|
messageId: RULE_ID,
|
98
97
|
data: {
|
99
|
-
type: nodeType,
|
98
|
+
type: nodeType[0].toUpperCase() + nodeType.slice(1),
|
100
99
|
reason
|
101
100
|
},
|
102
101
|
suggest: [
|
103
102
|
{
|
104
|
-
desc: `Remove
|
103
|
+
desc: `Remove ${nodeType}`,
|
105
104
|
fix: (fixer) => fixer.remove(node)
|
106
105
|
}
|
107
106
|
]
|
@@ -115,6 +114,17 @@ const RULE_ID = "no-deprecated", rule = exports.rule = {
|
|
115
114
|
Field(node) {
|
116
115
|
const reason = _optionalChain([node, 'access', _5 => _5.typeInfo, 'call', _6 => _6(), 'access', _7 => _7.fieldDef, 'optionalAccess', _8 => _8.deprecationReason]);
|
117
116
|
reason && report(node, reason);
|
117
|
+
},
|
118
|
+
Argument(node) {
|
119
|
+
const reason = _optionalChain([node, 'access', _9 => _9.typeInfo, 'call', _10 => _10(), 'access', _11 => _11.argument, 'optionalAccess', _12 => _12.deprecationReason]);
|
120
|
+
reason && report(node, reason);
|
121
|
+
},
|
122
|
+
ObjectValue(node) {
|
123
|
+
const fields = node.typeInfo().inputType.getFields();
|
124
|
+
for (const field of node.fields) {
|
125
|
+
const fieldName = field.name.value, reason = fields[fieldName].deprecationReason;
|
126
|
+
reason && report(field, reason);
|
127
|
+
}
|
118
128
|
}
|
119
129
|
};
|
120
130
|
}
|
package/cjs/utils.d.cts
CHANGED
@@ -39,7 +39,7 @@ declare const ARRAY_DEFAULT_OPTIONS: {
|
|
39
39
|
declare const englishJoinWords: (words: string[]) => string;
|
40
40
|
type Truthy<T> = T extends '' | 0 | false | null | undefined ? never : T;
|
41
41
|
declare function truthy<T>(value: T): value is Truthy<T>;
|
42
|
-
declare function displayNodeName(node: GraphQLESTreeNode<ASTNode>): string;
|
42
|
+
declare function displayNodeName(node: GraphQLESTreeNode<ASTNode, boolean>): string;
|
43
43
|
declare function getNodeName(node: GraphQLESTreeNode<ASTNode>): string;
|
44
44
|
|
45
45
|
export { ARRAY_DEFAULT_OPTIONS, CWD, type CaseStyle, REPORT_ON_FIRST_CHARACTER, TYPES_KINDS, VIRTUAL_DOCUMENT_REGEX, camelCase, convertCase, displayNodeName, englishJoinWords, getLocation, getNodeName, getTypeName, logger, pascalCase, requireGraphQLSchemaFromContext, requireSiblingsOperations, slash, truthy };
|
package/cjs/utils.js
CHANGED
@@ -123,7 +123,7 @@ const DisplayNodeNameMap = {
|
|
123
123
|
[_graphql.Kind.VARIABLE]: "variable"
|
124
124
|
};
|
125
125
|
function displayNodeName(node) {
|
126
|
-
return `${node.kind === _graphql.Kind.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && _optionalChain([node, 'access', _ => _.alias, 'optionalAccess', _2 => _2.value]) || "name" in node && _optionalChain([node, 'access', _3 => _3.name, 'optionalAccess', _4 => _4.value])}"`;
|
126
|
+
return `${node.kind === _graphql.Kind.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && _optionalChain([node, 'access', _ => _.alias, 'optionalAccess', _2 => _2.value]) || "name" in node && _optionalChain([node, 'access', _3 => _3.name, 'optionalAccess', _4 => _4.value]) || node.value}"`;
|
127
127
|
}
|
128
128
|
function getNodeName(node) {
|
129
129
|
switch (node.kind) {
|
package/esm/index.d.ts
CHANGED
@@ -48,10 +48,10 @@ declare const _default: {
|
|
48
48
|
};
|
49
49
|
rules: {
|
50
50
|
alphabetize: GraphQLESLintRule<{
|
51
|
-
values?: boolean | undefined;
|
52
51
|
definitions?: boolean | undefined;
|
53
52
|
selections?: ("OperationDefinition" | "FragmentDefinition")[] | undefined;
|
54
53
|
arguments?: ("Field" | "Directive" | "FieldDefinition" | "DirectiveDefinition")[] | undefined;
|
54
|
+
values?: boolean | undefined;
|
55
55
|
fields?: ("ObjectTypeDefinition" | "InterfaceTypeDefinition" | "InputObjectTypeDefinition")[] | undefined;
|
56
56
|
variables?: boolean | undefined;
|
57
57
|
groups?: string[] | undefined;
|
package/esm/meta.js
CHANGED
package/esm/rules/index.d.ts
CHANGED
@@ -12,10 +12,10 @@ import 'json-schema-to-ts';
|
|
12
12
|
|
13
13
|
declare const rules: {
|
14
14
|
alphabetize: GraphQLESLintRule<{
|
15
|
-
values?: boolean | undefined;
|
16
15
|
definitions?: boolean | undefined;
|
17
16
|
selections?: ("OperationDefinition" | "FragmentDefinition")[] | undefined;
|
18
17
|
arguments?: ("Field" | "Directive" | "FieldDefinition" | "DirectiveDefinition")[] | undefined;
|
18
|
+
values?: boolean | undefined;
|
19
19
|
fields?: ("ObjectTypeDefinition" | "InterfaceTypeDefinition" | "InputObjectTypeDefinition")[] | undefined;
|
20
20
|
variables?: boolean | undefined;
|
21
21
|
groups?: string[] | undefined;
|
@@ -1,6 +1,5 @@
|
|
1
1
|
import "../../chunk-UIAXBAMD.js";
|
2
|
-
import {
|
3
|
-
import { requireGraphQLSchemaFromContext } from "../../utils.js";
|
2
|
+
import { displayNodeName, requireGraphQLSchemaFromContext } from "../../utils.js";
|
4
3
|
const RULE_ID = "no-deprecated", rule = {
|
5
4
|
meta: {
|
6
5
|
type: "suggestion",
|
@@ -84,24 +83,24 @@ const RULE_ID = "no-deprecated", rule = {
|
|
84
83
|
recommended: !0
|
85
84
|
},
|
86
85
|
messages: {
|
87
|
-
[RULE_ID]: "
|
86
|
+
[RULE_ID]: "{{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})"
|
88
87
|
},
|
89
88
|
schema: []
|
90
89
|
},
|
91
90
|
create(context) {
|
92
91
|
requireGraphQLSchemaFromContext(RULE_ID, context);
|
93
92
|
function report(node, reason) {
|
94
|
-
const
|
93
|
+
const nodeType = displayNodeName(node);
|
95
94
|
context.report({
|
96
95
|
node,
|
97
96
|
messageId: RULE_ID,
|
98
97
|
data: {
|
99
|
-
type: nodeType,
|
98
|
+
type: nodeType[0].toUpperCase() + nodeType.slice(1),
|
100
99
|
reason
|
101
100
|
},
|
102
101
|
suggest: [
|
103
102
|
{
|
104
|
-
desc: `Remove
|
103
|
+
desc: `Remove ${nodeType}`,
|
105
104
|
fix: (fixer) => fixer.remove(node)
|
106
105
|
}
|
107
106
|
]
|
@@ -115,6 +114,17 @@ const RULE_ID = "no-deprecated", rule = {
|
|
115
114
|
Field(node) {
|
116
115
|
const reason = node.typeInfo().fieldDef?.deprecationReason;
|
117
116
|
reason && report(node, reason);
|
117
|
+
},
|
118
|
+
Argument(node) {
|
119
|
+
const reason = node.typeInfo().argument?.deprecationReason;
|
120
|
+
reason && report(node, reason);
|
121
|
+
},
|
122
|
+
ObjectValue(node) {
|
123
|
+
const fields = node.typeInfo().inputType.getFields();
|
124
|
+
for (const field of node.fields) {
|
125
|
+
const fieldName = field.name.value, reason = fields[fieldName].deprecationReason;
|
126
|
+
reason && report(field, reason);
|
127
|
+
}
|
118
128
|
}
|
119
129
|
};
|
120
130
|
}
|
package/esm/utils.d.ts
CHANGED
@@ -39,7 +39,7 @@ declare const ARRAY_DEFAULT_OPTIONS: {
|
|
39
39
|
declare const englishJoinWords: (words: string[]) => string;
|
40
40
|
type Truthy<T> = T extends '' | 0 | false | null | undefined ? never : T;
|
41
41
|
declare function truthy<T>(value: T): value is Truthy<T>;
|
42
|
-
declare function displayNodeName(node: GraphQLESTreeNode<ASTNode>): string;
|
42
|
+
declare function displayNodeName(node: GraphQLESTreeNode<ASTNode, boolean>): string;
|
43
43
|
declare function getNodeName(node: GraphQLESTreeNode<ASTNode>): string;
|
44
44
|
|
45
45
|
export { ARRAY_DEFAULT_OPTIONS, CWD, type CaseStyle, REPORT_ON_FIRST_CHARACTER, TYPES_KINDS, VIRTUAL_DOCUMENT_REGEX, camelCase, convertCase, displayNodeName, englishJoinWords, getLocation, getNodeName, getTypeName, logger, pascalCase, requireGraphQLSchemaFromContext, requireSiblingsOperations, slash, truthy };
|
package/esm/utils.js
CHANGED
@@ -123,7 +123,7 @@ const DisplayNodeNameMap = {
|
|
123
123
|
[Kind.VARIABLE]: "variable"
|
124
124
|
};
|
125
125
|
function displayNodeName(node) {
|
126
|
-
return `${node.kind === Kind.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && node.alias?.value || "name" in node && node.name?.value}"`;
|
126
|
+
return `${node.kind === Kind.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && node.alias?.value || "name" in node && node.name?.value || node.value}"`;
|
127
127
|
}
|
128
128
|
function getNodeName(node) {
|
129
129
|
switch (node.kind) {
|
package/index.browser.js
CHANGED
@@ -521,7 +521,7 @@ var DisplayNodeNameMap = {
|
|
521
521
|
[Kind2.VARIABLE]: "variable"
|
522
522
|
};
|
523
523
|
function displayNodeName(node) {
|
524
|
-
return `${node.kind === Kind2.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && node.alias?.value || "name" in node && node.name?.value}"`;
|
524
|
+
return `${node.kind === Kind2.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && node.alias?.value || "name" in node && node.name?.value || node.value}"`;
|
525
525
|
}
|
526
526
|
function getNodeName(node) {
|
527
527
|
switch (node.kind) {
|
@@ -2596,7 +2596,6 @@ var RULE_ID3 = "no-anonymous-operations", rule7 = {
|
|
2596
2596
|
};
|
2597
2597
|
|
2598
2598
|
// src/rules/no-deprecated/index.ts
|
2599
|
-
import { Kind as Kind10 } from "graphql";
|
2600
2599
|
var RULE_ID4 = "no-deprecated", rule8 = {
|
2601
2600
|
meta: {
|
2602
2601
|
type: "suggestion",
|
@@ -2680,24 +2679,24 @@ var RULE_ID4 = "no-deprecated", rule8 = {
|
|
2680
2679
|
recommended: !0
|
2681
2680
|
},
|
2682
2681
|
messages: {
|
2683
|
-
[RULE_ID4]: "
|
2682
|
+
[RULE_ID4]: "{{ type }} is marked as deprecated in your GraphQL schema (reason: {{ reason }})"
|
2684
2683
|
},
|
2685
2684
|
schema: []
|
2686
2685
|
},
|
2687
2686
|
create(context) {
|
2688
2687
|
requireGraphQLSchemaFromContext(RULE_ID4, context);
|
2689
2688
|
function report(node, reason) {
|
2690
|
-
let
|
2689
|
+
let nodeType = displayNodeName(node);
|
2691
2690
|
context.report({
|
2692
2691
|
node,
|
2693
2692
|
messageId: RULE_ID4,
|
2694
2693
|
data: {
|
2695
|
-
type: nodeType,
|
2694
|
+
type: nodeType[0].toUpperCase() + nodeType.slice(1),
|
2696
2695
|
reason
|
2697
2696
|
},
|
2698
2697
|
suggest: [
|
2699
2698
|
{
|
2700
|
-
desc: `Remove
|
2699
|
+
desc: `Remove ${nodeType}`,
|
2701
2700
|
fix: (fixer) => fixer.remove(node)
|
2702
2701
|
}
|
2703
2702
|
]
|
@@ -2711,13 +2710,24 @@ var RULE_ID4 = "no-deprecated", rule8 = {
|
|
2711
2710
|
Field(node) {
|
2712
2711
|
let reason = node.typeInfo().fieldDef?.deprecationReason;
|
2713
2712
|
reason && report(node, reason);
|
2713
|
+
},
|
2714
|
+
Argument(node) {
|
2715
|
+
let reason = node.typeInfo().argument?.deprecationReason;
|
2716
|
+
reason && report(node, reason);
|
2717
|
+
},
|
2718
|
+
ObjectValue(node) {
|
2719
|
+
let fields = node.typeInfo().inputType.getFields();
|
2720
|
+
for (let field of node.fields) {
|
2721
|
+
let fieldName = field.name.value, reason = fields[fieldName].deprecationReason;
|
2722
|
+
reason && report(field, reason);
|
2723
|
+
}
|
2714
2724
|
}
|
2715
2725
|
};
|
2716
2726
|
}
|
2717
2727
|
};
|
2718
2728
|
|
2719
2729
|
// src/rules/no-duplicate-fields/index.ts
|
2720
|
-
import { Kind as
|
2730
|
+
import { Kind as Kind10 } from "graphql";
|
2721
2731
|
var RULE_ID5 = "no-duplicate-fields", rule9 = {
|
2722
2732
|
meta: {
|
2723
2733
|
type: "suggestion",
|
@@ -2801,7 +2811,7 @@ var RULE_ID5 = "no-duplicate-fields", rule9 = {
|
|
2801
2811
|
desc: `Remove \`${fieldName}\` ${parent.type.toLowerCase()}`,
|
2802
2812
|
fix(fixer) {
|
2803
2813
|
return fixer.remove(
|
2804
|
-
parent.type ===
|
2814
|
+
parent.type === Kind10.VARIABLE ? parent.parent : parent
|
2805
2815
|
);
|
2806
2816
|
}
|
2807
2817
|
}
|
@@ -2824,7 +2834,7 @@ var RULE_ID5 = "no-duplicate-fields", rule9 = {
|
|
2824
2834
|
SelectionSet(node) {
|
2825
2835
|
let set = /* @__PURE__ */ new Set();
|
2826
2836
|
for (let selection of node.selections)
|
2827
|
-
selection.kind ===
|
2837
|
+
selection.kind === Kind10.FIELD && checkNode2(set, selection.alias || selection.name);
|
2828
2838
|
}
|
2829
2839
|
};
|
2830
2840
|
}
|
@@ -3094,7 +3104,7 @@ var schema7 = {
|
|
3094
3104
|
};
|
3095
3105
|
|
3096
3106
|
// src/rules/no-scalar-result-type-on-mutation/index.ts
|
3097
|
-
import { isScalarType, Kind as
|
3107
|
+
import { isScalarType, Kind as Kind11 } from "graphql";
|
3098
3108
|
var RULE_ID8 = "no-scalar-result-type-on-mutation", rule13 = {
|
3099
3109
|
meta: {
|
3100
3110
|
type: "suggestion",
|
@@ -3141,7 +3151,7 @@ var RULE_ID8 = "no-scalar-result-type-on-mutation", rule13 = {
|
|
3141
3151
|
let typeName = node.value, graphQLType = schema16.getType(typeName);
|
3142
3152
|
if (isScalarType(graphQLType)) {
|
3143
3153
|
let fieldDef = node.parent;
|
3144
|
-
for (; fieldDef.kind !==
|
3154
|
+
for (; fieldDef.kind !== Kind11.FIELD_DEFINITION; )
|
3145
3155
|
fieldDef = fieldDef.parent;
|
3146
3156
|
context.report({
|
3147
3157
|
node,
|
@@ -3232,24 +3242,24 @@ var NO_TYPENAME_PREFIX = "NO_TYPENAME_PREFIX", rule14 = {
|
|
3232
3242
|
import {
|
3233
3243
|
DirectiveLocation,
|
3234
3244
|
isInterfaceType,
|
3235
|
-
Kind as
|
3245
|
+
Kind as Kind12,
|
3236
3246
|
visit as visit5
|
3237
3247
|
} from "graphql";
|
3238
3248
|
import lowerCase3 from "lodash.lowercase";
|
3239
3249
|
var RULE_ID9 = "no-unreachable-types", KINDS = [
|
3240
|
-
|
3241
|
-
|
3242
|
-
|
3243
|
-
|
3244
|
-
|
3245
|
-
|
3246
|
-
|
3247
|
-
|
3248
|
-
|
3249
|
-
|
3250
|
-
|
3251
|
-
|
3252
|
-
|
3250
|
+
Kind12.DIRECTIVE_DEFINITION,
|
3251
|
+
Kind12.OBJECT_TYPE_DEFINITION,
|
3252
|
+
Kind12.OBJECT_TYPE_EXTENSION,
|
3253
|
+
Kind12.INTERFACE_TYPE_DEFINITION,
|
3254
|
+
Kind12.INTERFACE_TYPE_EXTENSION,
|
3255
|
+
Kind12.SCALAR_TYPE_DEFINITION,
|
3256
|
+
Kind12.SCALAR_TYPE_EXTENSION,
|
3257
|
+
Kind12.INPUT_OBJECT_TYPE_DEFINITION,
|
3258
|
+
Kind12.INPUT_OBJECT_TYPE_EXTENSION,
|
3259
|
+
Kind12.UNION_TYPE_DEFINITION,
|
3260
|
+
Kind12.UNION_TYPE_EXTENSION,
|
3261
|
+
Kind12.ENUM_TYPE_DEFINITION,
|
3262
|
+
Kind12.ENUM_TYPE_EXTENSION
|
3253
3263
|
], reachableTypesCache = new ModuleCache(), RequestDirectiveLocations = /* @__PURE__ */ new Set([
|
3254
3264
|
DirectiveLocation.QUERY,
|
3255
3265
|
DirectiveLocation.MUTATION,
|
@@ -3600,7 +3610,7 @@ var rule16 = {
|
|
3600
3610
|
};
|
3601
3611
|
|
3602
3612
|
// src/rules/relay-arguments/index.ts
|
3603
|
-
import { isScalarType as isScalarType2, Kind as
|
3613
|
+
import { isScalarType as isScalarType2, Kind as Kind13 } from "graphql";
|
3604
3614
|
var RULE_ID11 = "relay-arguments", MISSING_ARGUMENTS = "MISSING_ARGUMENTS", schema9 = {
|
3605
3615
|
type: "array",
|
3606
3616
|
maxItems: 1,
|
@@ -3674,7 +3684,7 @@ var RULE_ID11 = "relay-arguments", MISSING_ARGUMENTS = "MISSING_ARGUMENTS", sche
|
|
3674
3684
|
return {
|
3675
3685
|
"FieldDefinition > .gqlType Name[value=/Connection$/]"(node) {
|
3676
3686
|
let fieldNode = node.parent;
|
3677
|
-
for (; fieldNode.kind !==
|
3687
|
+
for (; fieldNode.kind !== Kind13.FIELD_DEFINITION; )
|
3678
3688
|
fieldNode = fieldNode.parent;
|
3679
3689
|
let args = Object.fromEntries(
|
3680
3690
|
fieldNode.arguments?.map((argument) => [argument.name.value, argument]) || []
|
@@ -3688,7 +3698,7 @@ var RULE_ID11 = "relay-arguments", MISSING_ARGUMENTS = "MISSING_ARGUMENTS", sche
|
|
3688
3698
|
}
|
3689
3699
|
function checkField(typeName, argumentName) {
|
3690
3700
|
let argument = args[argumentName], hasArgument = !!argument, type = argument;
|
3691
|
-
if (hasArgument && type.gqlType.kind ===
|
3701
|
+
if (hasArgument && type.gqlType.kind === Kind13.NON_NULL_TYPE && (type = type.gqlType), !(hasArgument && type.gqlType.kind === Kind13.NAMED_TYPE && (type.gqlType.name.value === typeName || typeName === "String" && isScalarType2(schema16.getType(type.gqlType.name.value))))) {
|
3692
3702
|
let returnType = typeName === "String" ? "String or Scalar" : typeName;
|
3693
3703
|
context.report({
|
3694
3704
|
node: (argument || fieldNode).name,
|
@@ -3703,17 +3713,17 @@ var RULE_ID11 = "relay-arguments", MISSING_ARGUMENTS = "MISSING_ARGUMENTS", sche
|
|
3703
3713
|
};
|
3704
3714
|
|
3705
3715
|
// src/rules/relay-connection-types/index.ts
|
3706
|
-
import { Kind as
|
3716
|
+
import { Kind as Kind14 } from "graphql";
|
3707
3717
|
var MUST_BE_OBJECT_TYPE = "MUST_BE_OBJECT_TYPE", MUST_CONTAIN_FIELD_EDGES = "MUST_CONTAIN_FIELD_EDGES", MUST_CONTAIN_FIELD_PAGE_INFO = "MUST_CONTAIN_FIELD_PAGE_INFO", MUST_HAVE_CONNECTION_SUFFIX = "MUST_HAVE_CONNECTION_SUFFIX", EDGES_FIELD_MUST_RETURN_LIST_TYPE = "EDGES_FIELD_MUST_RETURN_LIST_TYPE", PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE = "PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE", NON_OBJECT_TYPES = [
|
3708
|
-
|
3709
|
-
|
3710
|
-
|
3711
|
-
|
3712
|
-
|
3713
|
-
|
3714
|
-
|
3715
|
-
|
3716
|
-
|
3718
|
+
Kind14.SCALAR_TYPE_DEFINITION,
|
3719
|
+
Kind14.UNION_TYPE_DEFINITION,
|
3720
|
+
Kind14.UNION_TYPE_EXTENSION,
|
3721
|
+
Kind14.INPUT_OBJECT_TYPE_DEFINITION,
|
3722
|
+
Kind14.INPUT_OBJECT_TYPE_EXTENSION,
|
3723
|
+
Kind14.ENUM_TYPE_DEFINITION,
|
3724
|
+
Kind14.ENUM_TYPE_EXTENSION,
|
3725
|
+
Kind14.INTERFACE_TYPE_DEFINITION,
|
3726
|
+
Kind14.INTERFACE_TYPE_EXTENSION
|
3717
3727
|
], notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`, hasEdgesField = (node) => node.fields?.some((field) => field.name.value === "edges"), hasPageInfoField = (node) => node.fields?.some((field) => field.name.value === "pageInfo"), rule18 = {
|
3718
3728
|
meta: {
|
3719
3729
|
type: "problem",
|
@@ -3780,10 +3790,10 @@ var MUST_BE_OBJECT_TYPE = "MUST_BE_OBJECT_TYPE", MUST_CONTAIN_FIELD_EDGES = "MUS
|
|
3780
3790
|
hasEdgesField(node) || context.report({ node: node.name, messageId: MUST_CONTAIN_FIELD_EDGES }), hasPageInfoField(node) || context.report({ node: node.name, messageId: MUST_CONTAIN_FIELD_PAGE_INFO });
|
3781
3791
|
},
|
3782
3792
|
":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType"(node) {
|
3783
|
-
node.kind ===
|
3793
|
+
node.kind === Kind14.LIST_TYPE || node.kind === Kind14.NON_NULL_TYPE && node.gqlType.kind === Kind14.LIST_TYPE || context.report({ node, messageId: EDGES_FIELD_MUST_RETURN_LIST_TYPE });
|
3784
3794
|
},
|
3785
3795
|
":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=pageInfo] > .gqlType"(node) {
|
3786
|
-
node.kind ===
|
3796
|
+
node.kind === Kind14.NON_NULL_TYPE && node.gqlType.kind === Kind14.NAMED_TYPE && node.gqlType.name.value === "PageInfo" || context.report({ node, messageId: PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE });
|
3787
3797
|
}
|
3788
3798
|
};
|
3789
3799
|
}
|
@@ -3793,7 +3803,7 @@ var MUST_BE_OBJECT_TYPE = "MUST_BE_OBJECT_TYPE", MUST_CONTAIN_FIELD_EDGES = "MUS
|
|
3793
3803
|
import {
|
3794
3804
|
isObjectType as isObjectType2,
|
3795
3805
|
isScalarType as isScalarType3,
|
3796
|
-
Kind as
|
3806
|
+
Kind as Kind15,
|
3797
3807
|
visit as visit7
|
3798
3808
|
} from "graphql";
|
3799
3809
|
import { getDocumentNodeFromSchema } from "@graphql-tools/utils";
|
@@ -3888,7 +3898,7 @@ var schema10 = {
|
|
3888
3898
|
shouldImplementNode: !0,
|
3889
3899
|
listTypeCanWrapOnlyEdgeType: !0,
|
3890
3900
|
...context.options[0]
|
3891
|
-
}, isNamedOrNonNullNamed = (node) => node.kind ===
|
3901
|
+
}, isNamedOrNonNullNamed = (node) => node.kind === Kind15.NAMED_TYPE || node.kind === Kind15.NON_NULL_TYPE && node.gqlType.kind === Kind15.NAMED_TYPE, checkNodeField = (node) => {
|
3892
3902
|
let nodeField = node.fields?.find((field) => field.name.value === "node"), message = "return either a Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types.";
|
3893
3903
|
if (!nodeField)
|
3894
3904
|
context.report({
|
@@ -3925,7 +3935,7 @@ var schema10 = {
|
|
3925
3935
|
}
|
3926
3936
|
};
|
3927
3937
|
return options.listTypeCanWrapOnlyEdgeType && (listeners["FieldDefinition > .gqlType"] = (node) => {
|
3928
|
-
if (node.kind ===
|
3938
|
+
if (node.kind === Kind15.LIST_TYPE || node.kind === Kind15.NON_NULL_TYPE && node.gqlType.kind === Kind15.LIST_TYPE) {
|
3929
3939
|
let typeName = getTypeName(node.rawNode());
|
3930
3940
|
edgeTypes.has(typeName) || context.report({ node, messageId: MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE });
|
3931
3941
|
}
|
@@ -3934,7 +3944,7 @@ var schema10 = {
|
|
3934
3944
|
};
|
3935
3945
|
|
3936
3946
|
// src/rules/relay-page-info/index.ts
|
3937
|
-
import { isScalarType as isScalarType4, Kind as
|
3947
|
+
import { isScalarType as isScalarType4, Kind as Kind16 } from "graphql";
|
3938
3948
|
var RULE_ID13 = "relay-page-info", MESSAGE_MUST_EXIST = "MESSAGE_MUST_EXIST", MESSAGE_MUST_BE_OBJECT_TYPE2 = "MESSAGE_MUST_BE_OBJECT_TYPE", notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`, hasPageInfoChecked = !1, rule20 = {
|
3939
3949
|
meta: {
|
3940
3950
|
type: "problem",
|
@@ -3990,7 +4000,7 @@ var RULE_ID13 = "relay-page-info", MESSAGE_MUST_EXIST = "MESSAGE_MUST_EXIST", ME
|
|
3990
4000
|
let field = fieldMap[fieldName], isAllowedType = !1;
|
3991
4001
|
if (field) {
|
3992
4002
|
let type = field.gqlType;
|
3993
|
-
typeName === "Boolean" ? isAllowedType = type.kind ===
|
4003
|
+
typeName === "Boolean" ? isAllowedType = type.kind === Kind16.NON_NULL_TYPE && type.gqlType.kind === Kind16.NAMED_TYPE && type.gqlType.name.value === "Boolean" : type.kind === Kind16.NAMED_TYPE && (isAllowedType = type.name.value === "String" || isScalarType4(schema16.getType(type.name.value)));
|
3994
4004
|
}
|
3995
4005
|
if (!isAllowedType) {
|
3996
4006
|
let returnType = typeName === "Boolean" ? "non-null Boolean" : "either String or Scalar, which can be null if there are no results";
|
@@ -4194,15 +4204,15 @@ var rule22 = {
|
|
4194
4204
|
};
|
4195
4205
|
|
4196
4206
|
// src/rules/require-description/index.ts
|
4197
|
-
import { Kind as
|
4207
|
+
import { Kind as Kind17, TokenKind as TokenKind3 } from "graphql";
|
4198
4208
|
import { getRootTypeNames } from "@graphql-tools/utils";
|
4199
4209
|
var RULE_ID14 = "require-description", ALLOWED_KINDS2 = [
|
4200
4210
|
...TYPES_KINDS,
|
4201
|
-
|
4202
|
-
|
4203
|
-
|
4204
|
-
|
4205
|
-
|
4211
|
+
Kind17.DIRECTIVE_DEFINITION,
|
4212
|
+
Kind17.FIELD_DEFINITION,
|
4213
|
+
Kind17.INPUT_VALUE_DEFINITION,
|
4214
|
+
Kind17.ENUM_VALUE_DEFINITION,
|
4215
|
+
Kind17.OPERATION_DEFINITION
|
4206
4216
|
], schema12 = {
|
4207
4217
|
type: "array",
|
4208
4218
|
minItems: 1,
|
@@ -4225,7 +4235,7 @@ ${TYPES_KINDS.map((kind) => `- \`${kind}\``).join(`
|
|
4225
4235
|
...Object.fromEntries(
|
4226
4236
|
[...ALLOWED_KINDS2].sort().map((kind) => {
|
4227
4237
|
let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
|
4228
|
-
return kind ===
|
4238
|
+
return kind === Kind17.OPERATION_DEFINITION && (description += '\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.'), [kind, { type: "boolean", description }];
|
4229
4239
|
})
|
4230
4240
|
)
|
4231
4241
|
}
|
@@ -4301,7 +4311,7 @@ ${TYPES_KINDS.map((kind) => `- \`${kind}\``).join(`
|
|
4301
4311
|
configOptions: [
|
4302
4312
|
{
|
4303
4313
|
types: !0,
|
4304
|
-
[
|
4314
|
+
[Kind17.DIRECTIVE_DEFINITION]: !0,
|
4305
4315
|
rootField: !0
|
4306
4316
|
}
|
4307
4317
|
],
|
@@ -4327,7 +4337,7 @@ ${TYPES_KINDS.map((kind) => `- \`${kind}\``).join(`
|
|
4327
4337
|
}
|
4328
4338
|
return {
|
4329
4339
|
[[...kinds].join(",")](node) {
|
4330
|
-
let description = "", isOperation = node.kind ===
|
4340
|
+
let description = "", isOperation = node.kind === Kind17.OPERATION_DEFINITION;
|
4331
4341
|
if (isOperation) {
|
4332
4342
|
let rawNode = node.rawNode(), { prev, line } = rawNode.loc.startToken;
|
4333
4343
|
if (prev?.kind === TokenKind3.COMMENT) {
|
@@ -4533,7 +4543,7 @@ var RULE_ID16 = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
|
|
4533
4543
|
};
|
4534
4544
|
|
4535
4545
|
// src/rules/require-nullable-fields-with-oneof/index.ts
|
4536
|
-
import { Kind as
|
4546
|
+
import { Kind as Kind18 } from "graphql";
|
4537
4547
|
var RULE_ID17 = "require-nullable-fields-with-oneof", rule26 = {
|
4538
4548
|
meta: {
|
4539
4549
|
type: "suggestion",
|
@@ -4577,11 +4587,11 @@ var RULE_ID17 = "require-nullable-fields-with-oneof", rule26 = {
|
|
4577
4587
|
return {
|
4578
4588
|
"Directive[name.value=oneOf]"({ parent }) {
|
4579
4589
|
if ([
|
4580
|
-
|
4581
|
-
|
4590
|
+
Kind18.OBJECT_TYPE_DEFINITION,
|
4591
|
+
Kind18.INPUT_OBJECT_TYPE_DEFINITION
|
4582
4592
|
].includes(parent.kind))
|
4583
4593
|
for (let field of parent.fields || [])
|
4584
|
-
field.gqlType.kind ===
|
4594
|
+
field.gqlType.kind === Kind18.NON_NULL_TYPE && context.report({
|
4585
4595
|
node: field.name,
|
4586
4596
|
messageId: RULE_ID17,
|
4587
4597
|
data: { nodeName: getNodeName(field) }
|
@@ -4592,7 +4602,7 @@ var RULE_ID17 = "require-nullable-fields-with-oneof", rule26 = {
|
|
4592
4602
|
};
|
4593
4603
|
|
4594
4604
|
// src/rules/require-nullable-result-in-root/index.ts
|
4595
|
-
import { Kind as
|
4605
|
+
import { Kind as Kind19 } from "graphql";
|
4596
4606
|
var RULE_ID18 = "require-nullable-result-in-root", rule27 = {
|
4597
4607
|
meta: {
|
4598
4608
|
type: "suggestion",
|
@@ -4642,7 +4652,7 @@ var RULE_ID18 = "require-nullable-result-in-root", rule27 = {
|
|
4642
4652
|
"ObjectTypeDefinition,ObjectTypeExtension"(node) {
|
4643
4653
|
if (rootTypeNames.has(node.name.value))
|
4644
4654
|
for (let field of node.fields || []) {
|
4645
|
-
if (field.gqlType.type !==
|
4655
|
+
if (field.gqlType.type !== Kind19.NON_NULL_TYPE || field.gqlType.gqlType.type !== Kind19.NAMED_TYPE)
|
4646
4656
|
continue;
|
4647
4657
|
let name = field.gqlType.gqlType.name.value, type = schema16.getType(name), resultType = type?.astNode ? getNodeName(type.astNode) : type?.name;
|
4648
4658
|
context.report({
|
@@ -4673,7 +4683,7 @@ import {
|
|
4673
4683
|
GraphQLInterfaceType,
|
4674
4684
|
GraphQLObjectType,
|
4675
4685
|
GraphQLUnionType,
|
4676
|
-
Kind as
|
4686
|
+
Kind as Kind20,
|
4677
4687
|
TypeInfo as TypeInfo3,
|
4678
4688
|
visit as visit8,
|
4679
4689
|
visitWithTypeInfo as visitWithTypeInfo3
|
@@ -4770,7 +4780,7 @@ Include it in your selection set{{ addition }}.`
|
|
4770
4780
|
let schema16 = requireGraphQLSchemaFromContext(RULE_ID19, context), siblings = requireSiblingsOperations(RULE_ID19, context), { fieldName = DEFAULT_ID_FIELD_NAME } = context.options[0] || {}, idNames = asArray(fieldName), selector = "SelectionSet[parent.kind!=/(^OperationDefinition|InlineFragment)$/]", typeInfo = new TypeInfo3(schema16);
|
4771
4781
|
function checkFragments(node) {
|
4772
4782
|
for (let selection of node.selections) {
|
4773
|
-
if (selection.kind !==
|
4783
|
+
if (selection.kind !== Kind20.FRAGMENT_SPREAD)
|
4774
4784
|
continue;
|
4775
4785
|
let [foundSpread] = siblings.getFragment(selection.name.value);
|
4776
4786
|
if (!foundSpread)
|
@@ -4778,7 +4788,7 @@ Include it in your selection set{{ addition }}.`
|
|
4778
4788
|
let checkedFragmentSpreads = /* @__PURE__ */ new Set(), visitor = visitWithTypeInfo3(typeInfo, {
|
4779
4789
|
SelectionSet(node2, key, _parent) {
|
4780
4790
|
let parent = _parent;
|
4781
|
-
parent.kind ===
|
4791
|
+
parent.kind === Kind20.FRAGMENT_DEFINITION ? checkedFragmentSpreads.add(parent.name.value) : parent.kind !== Kind20.INLINE_FRAGMENT && checkSelections(
|
4782
4792
|
node2,
|
4783
4793
|
typeInfo.getType(),
|
4784
4794
|
selection.loc.start,
|
@@ -4797,10 +4807,10 @@ Include it in your selection set{{ addition }}.`
|
|
4797
4807
|
else if (rawType instanceof GraphQLUnionType)
|
4798
4808
|
for (let selection of node.selections) {
|
4799
4809
|
let types = rawType.getTypes();
|
4800
|
-
if (selection.kind ===
|
4810
|
+
if (selection.kind === Kind20.INLINE_FRAGMENT) {
|
4801
4811
|
let t = types.find((t2) => t2.name === selection.typeCondition.name.value);
|
4802
4812
|
t && checkFields(t);
|
4803
|
-
} else if (selection.kind ===
|
4813
|
+
} else if (selection.kind === Kind20.FRAGMENT_SPREAD) {
|
4804
4814
|
let [foundSpread] = siblings.getFragment(selection.name.value);
|
4805
4815
|
if (!foundSpread) return;
|
4806
4816
|
let fragmentSpread = foundSpread.document, t = fragmentSpread.typeCondition.name.value === rawType.name ? rawType : types.find((t2) => t2.name === fragmentSpread.typeCondition.name.value);
|
@@ -4813,11 +4823,11 @@ Include it in your selection set{{ addition }}.`
|
|
4813
4823
|
return;
|
4814
4824
|
function hasIdField({ selections }) {
|
4815
4825
|
return selections.some((selection) => {
|
4816
|
-
if (selection.kind ===
|
4826
|
+
if (selection.kind === Kind20.FIELD)
|
4817
4827
|
return selection.alias && idNames.includes(selection.alias.value) ? !0 : idNames.includes(selection.name.value);
|
4818
|
-
if (selection.kind ===
|
4828
|
+
if (selection.kind === Kind20.INLINE_FRAGMENT)
|
4819
4829
|
return hasIdField(selection.selectionSet);
|
4820
|
-
if (selection.kind ===
|
4830
|
+
if (selection.kind === Kind20.FRAGMENT_SPREAD) {
|
4821
4831
|
let [foundSpread] = siblings.getFragment(selection.name.value);
|
4822
4832
|
if (foundSpread) {
|
4823
4833
|
let fragmentSpread = foundSpread.document;
|
@@ -4845,7 +4855,7 @@ Include it in your selection set{{ addition }}.`
|
|
4845
4855
|
desc: `Add \`${idName}\` selection`,
|
4846
4856
|
fix: (fixer) => {
|
4847
4857
|
let insertNode = node.selections[0];
|
4848
|
-
return insertNode = insertNode.kind ===
|
4858
|
+
return insertNode = insertNode.kind === Kind20.INLINE_FRAGMENT ? insertNode.selectionSet.selections[0] : insertNode, fixer.insertTextBefore(insertNode, `${idName} `);
|
4849
4859
|
}
|
4850
4860
|
}))), context.report(problem);
|
4851
4861
|
}
|
@@ -4920,7 +4930,7 @@ var RULE_ID20 = "require-type-pattern-with-oneof", rule29 = {
|
|
4920
4930
|
};
|
4921
4931
|
|
4922
4932
|
// src/rules/selection-set-depth/index.ts
|
4923
|
-
import { Kind as
|
4933
|
+
import { Kind as Kind21 } from "graphql";
|
4924
4934
|
import depthLimit from "graphql-depth-limit";
|
4925
4935
|
var RULE_ID21 = "selection-set-depth", schema14 = {
|
4926
4936
|
type: "array",
|
@@ -5006,7 +5016,7 @@ var RULE_ID21 = "selection-set-depth", schema14 = {
|
|
5006
5016
|
"OperationDefinition, FragmentDefinition"(node) {
|
5007
5017
|
try {
|
5008
5018
|
let rawNode = node.rawNode(), fragmentsInUse = siblings ? siblings.getFragmentsInUse(rawNode) : [], document = {
|
5009
|
-
kind:
|
5019
|
+
kind: Kind21.DOCUMENT,
|
5010
5020
|
definitions: [rawNode, ...fragmentsInUse]
|
5011
5021
|
};
|
5012
5022
|
checkFn({
|
@@ -5050,7 +5060,7 @@ var RULE_ID21 = "selection-set-depth", schema14 = {
|
|
5050
5060
|
};
|
5051
5061
|
|
5052
5062
|
// src/rules/strict-id-in-types/index.ts
|
5053
|
-
import { Kind as
|
5063
|
+
import { Kind as Kind22 } from "graphql";
|
5054
5064
|
var RULE_ID22 = "strict-id-in-types", schema15 = {
|
5055
5065
|
type: "array",
|
5056
5066
|
maxItems: 1,
|
@@ -5179,7 +5189,7 @@ var RULE_ID22 = "strict-id-in-types", schema15 = {
|
|
5179
5189
|
return;
|
5180
5190
|
if (node.fields?.filter((field) => {
|
5181
5191
|
let fieldNode = field.rawNode(), isValidIdName = options.acceptedIdNames.includes(fieldNode.name.value), isValidIdType = !1;
|
5182
|
-
return fieldNode.type.kind ===
|
5192
|
+
return fieldNode.type.kind === Kind22.NON_NULL_TYPE && fieldNode.type.type.kind === Kind22.NAMED_TYPE && (isValidIdType = options.acceptedIdTypes.includes(fieldNode.type.type.name.value)), isValidIdName && isValidIdType;
|
5183
5193
|
})?.length !== 1) {
|
5184
5194
|
let pluralNamesSuffix = options.acceptedIdNames.length > 1 ? "s" : "", pluralTypesSuffix = options.acceptedIdTypes.length > 1 ? "s" : "";
|
5185
5195
|
context.report({
|
@@ -5195,7 +5205,7 @@ Accepted type${pluralTypesSuffix}: ${englishJoinWords(options.acceptedIdTypes)}.
|
|
5195
5205
|
};
|
5196
5206
|
|
5197
5207
|
// src/rules/unique-enum-value-names/index.ts
|
5198
|
-
import { Kind as
|
5208
|
+
import { Kind as Kind23 } from "graphql";
|
5199
5209
|
var rule32 = {
|
5200
5210
|
meta: {
|
5201
5211
|
type: "suggestion",
|
@@ -5239,7 +5249,7 @@ var rule32 = {
|
|
5239
5249
|
},
|
5240
5250
|
create(context) {
|
5241
5251
|
return {
|
5242
|
-
[[
|
5252
|
+
[[Kind23.ENUM_TYPE_DEFINITION, Kind23.ENUM_TYPE_EXTENSION].join(",")](node) {
|
5243
5253
|
let duplicates = node.values?.filter(
|
5244
5254
|
(item, index, array) => array.findIndex((v) => v.name.value.toLowerCase() === item.name.value.toLowerCase()) !== index
|
5245
5255
|
);
|
@@ -5265,9 +5275,9 @@ var rule32 = {
|
|
5265
5275
|
|
5266
5276
|
// src/rules/unique-fragment-name/index.ts
|
5267
5277
|
import { relative as relative2 } from "node:path";
|
5268
|
-
import { Kind as
|
5278
|
+
import { Kind as Kind24 } from "graphql";
|
5269
5279
|
var RULE_ID23 = "unique-fragment-name", checkNode = (context, node, ruleId) => {
|
5270
|
-
let documentName = node.name.value, siblings = requireSiblingsOperations(ruleId, context), siblingDocuments = node.kind ===
|
5280
|
+
let documentName = node.name.value, siblings = requireSiblingsOperations(ruleId, context), siblingDocuments = node.kind === Kind24.FRAGMENT_DEFINITION ? siblings.getFragment(documentName) : siblings.getOperation(documentName), filepath = context.filename, conflictingDocuments = siblingDocuments.filter((f) => {
|
5271
5281
|
let isSameName = f.document.name?.value === documentName, isSamePath = slash(f.filePath) === slash(filepath);
|
5272
5282
|
return isSameName && !isSamePath;
|
5273
5283
|
});
|