@graphql-eslint/eslint-plugin 4.0.0-alpha-20230801163310-8bc4340 → 4.0.0-alpha-20230810155929-e89edf7
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 +2 -0
- package/cjs/cache.js +10 -19
- package/cjs/configs/index.d.ts +42 -16
- package/cjs/configs/index.js +10 -19
- package/cjs/configs/operations-all.d.ts +4 -3
- package/cjs/configs/operations-all.js +5 -4
- package/cjs/configs/operations-recommended.d.ts +3 -1
- package/cjs/configs/operations-recommended.js +3 -1
- package/cjs/configs/schema-all.d.ts +6 -1
- package/cjs/configs/schema-all.js +5 -2
- package/cjs/configs/schema-recommended.d.ts +19 -1
- package/cjs/configs/schema-recommended.js +22 -2
- package/cjs/documents.js +17 -32
- package/cjs/estree-converter/converter.js +14 -27
- package/cjs/estree-converter/index.js +4 -7
- package/cjs/estree-converter/types.js +3 -5
- package/cjs/estree-converter/utils.d.ts +2 -3
- package/cjs/estree-converter/utils.js +15 -45
- package/cjs/flat-configs.d.ts +59 -12
- package/cjs/flat-configs.js +9 -14
- package/cjs/graphql-config.d.ts +4 -3
- package/cjs/graphql-config.js +23 -44
- package/cjs/index.d.ts +10 -4
- package/cjs/index.js +8 -16
- package/cjs/parser.d.ts +4 -3
- package/cjs/parser.js +38 -45
- package/cjs/processor.d.ts +5 -1
- package/cjs/processor.js +25 -57
- package/cjs/rules/alphabetize.d.ts +6 -16
- package/cjs/rules/alphabetize.js +60 -132
- package/cjs/rules/description-style.d.ts +4 -3
- package/cjs/rules/description-style.js +11 -18
- package/cjs/rules/graphql-js-validation.d.ts +4 -3
- package/cjs/rules/graphql-js-validation.js +151 -225
- package/cjs/rules/index.d.ts +15 -13
- package/cjs/rules/index.js +8 -45
- package/cjs/rules/input-name.d.ts +4 -3
- package/cjs/rules/input-name.js +43 -59
- package/cjs/rules/lone-executable-definition.d.ts +6 -5
- package/cjs/rules/lone-executable-definition.js +14 -28
- package/cjs/rules/match-document-filename.d.ts +4 -3
- package/cjs/rules/match-document-filename.js +39 -70
- package/cjs/rules/naming-convention.d.ts +4 -3
- package/cjs/rules/naming-convention.js +56 -74
- package/cjs/rules/no-anonymous-operations.d.ts +4 -3
- package/cjs/rules/no-anonymous-operations.js +11 -18
- package/cjs/rules/no-deprecated.d.ts +4 -3
- package/cjs/rules/no-deprecated.js +15 -29
- package/cjs/rules/no-duplicate-fields.d.ts +4 -3
- package/cjs/rules/no-duplicate-fields.js +13 -23
- package/cjs/rules/no-hashtag-description.d.ts +4 -3
- package/cjs/rules/no-hashtag-description.js +16 -29
- package/cjs/rules/no-one-place-fragments.d.ts +4 -3
- package/cjs/rules/no-one-place-fragments.js +17 -29
- package/cjs/rules/no-root-type.d.ts +4 -3
- package/cjs/rules/no-root-type.js +15 -25
- package/cjs/rules/no-scalar-result-type-on-mutation.d.ts +4 -3
- package/cjs/rules/no-scalar-result-type-on-mutation.js +18 -30
- package/cjs/rules/no-typename-prefix.d.ts +4 -3
- package/cjs/rules/no-typename-prefix.js +26 -33
- package/cjs/rules/no-unreachable-types.d.ts +4 -3
- package/cjs/rules/no-unreachable-types.js +25 -47
- package/cjs/rules/no-unused-fields.d.ts +4 -3
- package/cjs/rules/no-unused-fields.js +24 -49
- package/cjs/rules/relay-arguments.d.ts +4 -3
- package/cjs/rules/relay-arguments.js +20 -43
- package/cjs/rules/relay-connection-types.d.ts +4 -3
- package/cjs/rules/relay-connection-types.js +14 -45
- package/cjs/rules/relay-edge-types.d.ts +4 -3
- package/cjs/rules/relay-edge-types.js +48 -99
- package/cjs/rules/relay-page-info.d.ts +4 -3
- package/cjs/rules/relay-page-info.js +21 -44
- package/cjs/rules/require-deprecation-date.d.ts +4 -3
- package/cjs/rules/require-deprecation-date.js +15 -31
- package/cjs/rules/require-deprecation-reason.d.ts +4 -3
- package/cjs/rules/require-deprecation-reason.js +12 -20
- package/cjs/rules/require-description.d.ts +4 -3
- package/cjs/rules/require-description.js +39 -65
- package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +4 -3
- package/cjs/rules/require-field-of-type-query-in-mutation-result.js +16 -31
- package/cjs/rules/require-import-fragment.d.ts +4 -3
- package/cjs/rules/require-import-fragment.js +22 -40
- package/cjs/rules/require-nullable-fields-with-oneof.d.ts +4 -3
- package/cjs/rules/require-nullable-fields-with-oneof.js +11 -22
- package/cjs/rules/require-nullable-result-in-root.d.ts +4 -3
- package/cjs/rules/require-nullable-result-in-root.js +34 -44
- package/cjs/rules/{require-id-when-available.d.ts → require-selections.d.ts} +4 -3
- package/cjs/rules/require-selections.js +198 -0
- package/cjs/rules/require-type-pattern-with-oneof.d.ts +4 -3
- package/cjs/rules/require-type-pattern-with-oneof.js +15 -23
- package/cjs/rules/selection-set-depth.d.ts +4 -3
- package/cjs/rules/selection-set-depth.js +18 -34
- package/cjs/rules/strict-id-in-types.d.ts +4 -3
- package/cjs/rules/strict-id-in-types.js +25 -43
- package/cjs/rules/{no-case-insensitive-enum-values-duplicates.d.ts → unique-enum-value-names.d.ts} +4 -3
- package/cjs/rules/{no-case-insensitive-enum-values-duplicates.js → unique-enum-value-names.js} +16 -21
- package/cjs/rules/unique-fragment-name.d.ts +3 -2
- package/cjs/rules/unique-fragment-name.js +24 -36
- package/cjs/rules/unique-operation-name.d.ts +4 -3
- package/cjs/rules/unique-operation-name.js +10 -12
- package/cjs/schema.d.ts +4 -3
- package/cjs/schema.js +14 -27
- package/cjs/siblings.d.ts +24 -8
- package/cjs/siblings.js +42 -82
- package/cjs/types.d.ts +74 -7
- package/cjs/types.js +3 -5
- package/cjs/utils.d.ts +3 -2
- package/cjs/utils.js +27 -44
- package/esm/cache.js +4 -8
- package/esm/{chunk-BMTV3EA2.js → chunk-U3TKCM4X.js} +1 -1
- package/esm/configs/index.d.mts +42 -16
- package/esm/configs/index.js +4 -4
- package/esm/configs/operations-all.d.mts +4 -3
- package/esm/configs/operations-all.js +6 -5
- package/esm/configs/operations-recommended.d.mts +3 -1
- package/esm/configs/operations-recommended.js +4 -2
- package/esm/configs/schema-all.d.mts +6 -1
- package/esm/configs/schema-all.js +6 -3
- package/esm/configs/schema-recommended.d.mts +19 -1
- package/esm/configs/schema-recommended.js +23 -3
- package/esm/configs/{relay.js → schema-relay.js} +4 -4
- package/esm/documents.js +10 -17
- package/esm/estree-converter/converter.js +9 -18
- package/esm/estree-converter/utils.d.mts +2 -3
- package/esm/estree-converter/utils.js +11 -38
- package/esm/flat-configs.d.mts +59 -12
- package/esm/flat-configs.js +4 -5
- package/esm/graphql-config.d.mts +4 -3
- package/esm/graphql-config.js +18 -34
- package/esm/index.d.mts +10 -4
- package/esm/index.js +1 -1
- package/esm/parser.d.mts +4 -3
- package/esm/parser.js +33 -27
- package/esm/processor.d.mts +5 -1
- package/esm/processor.js +21 -46
- package/esm/rules/alphabetize.d.mts +6 -16
- package/esm/rules/alphabetize.js +53 -118
- package/esm/rules/description-style.d.mts +4 -3
- package/esm/rules/description-style.js +7 -11
- package/esm/rules/graphql-js-validation.d.mts +4 -3
- package/esm/rules/graphql-js-validation.js +178 -218
- package/esm/rules/index.d.mts +15 -13
- package/esm/rules/index.js +5 -5
- package/esm/rules/input-name.d.mts +4 -3
- package/esm/rules/input-name.js +39 -52
- package/esm/rules/lone-executable-definition.d.mts +6 -5
- package/esm/rules/lone-executable-definition.js +10 -20
- package/esm/rules/match-document-filename.d.mts +4 -3
- package/esm/rules/match-document-filename.js +35 -61
- package/esm/rules/naming-convention.d.mts +4 -3
- package/esm/rules/naming-convention.js +51 -65
- package/esm/rules/no-anonymous-operations.d.mts +4 -3
- package/esm/rules/no-anonymous-operations.js +6 -9
- package/esm/rules/no-deprecated.d.mts +4 -3
- package/esm/rules/no-deprecated.js +10 -20
- package/esm/rules/no-duplicate-fields.d.mts +4 -3
- package/esm/rules/no-duplicate-fields.js +9 -16
- package/esm/rules/no-hashtag-description.d.mts +4 -3
- package/esm/rules/no-hashtag-description.js +11 -20
- package/esm/rules/no-one-place-fragments.d.mts +4 -3
- package/esm/rules/no-one-place-fragments.js +12 -19
- package/esm/rules/no-root-type.d.mts +4 -3
- package/esm/rules/no-root-type.js +11 -18
- package/esm/rules/no-scalar-result-type-on-mutation.d.mts +4 -3
- package/esm/rules/no-scalar-result-type-on-mutation.js +13 -21
- package/esm/rules/no-typename-prefix.d.mts +4 -3
- package/esm/rules/no-typename-prefix.js +22 -26
- package/esm/rules/no-unreachable-types.d.mts +4 -3
- package/esm/rules/no-unreachable-types.js +18 -33
- package/esm/rules/no-unused-fields.d.mts +4 -3
- package/esm/rules/no-unused-fields.js +19 -40
- package/esm/rules/relay-arguments.d.mts +4 -3
- package/esm/rules/relay-arguments.js +15 -34
- package/esm/rules/relay-connection-types.d.mts +4 -3
- package/esm/rules/relay-connection-types.js +10 -38
- package/esm/rules/relay-edge-types.d.mts +4 -3
- package/esm/rules/relay-edge-types.js +43 -89
- package/esm/rules/relay-page-info.d.mts +4 -3
- package/esm/rules/relay-page-info.js +16 -34
- package/esm/rules/require-deprecation-date.d.mts +4 -3
- package/esm/rules/require-deprecation-date.js +10 -22
- package/esm/rules/require-deprecation-reason.d.mts +4 -3
- package/esm/rules/require-deprecation-reason.js +7 -11
- package/esm/rules/require-description.d.mts +4 -3
- package/esm/rules/require-description.js +34 -55
- package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +4 -3
- package/esm/rules/require-field-of-type-query-in-mutation-result.js +11 -22
- package/esm/rules/require-import-fragment.d.mts +4 -3
- package/esm/rules/require-import-fragment.js +14 -26
- package/esm/rules/require-nullable-fields-with-oneof.d.mts +4 -3
- package/esm/rules/require-nullable-fields-with-oneof.js +6 -13
- package/esm/rules/require-nullable-result-in-root.d.mts +4 -3
- package/esm/rules/require-nullable-result-in-root.js +29 -35
- package/esm/rules/{require-id-when-available.d.mts → require-selections.d.mts} +4 -3
- package/esm/rules/{require-id-when-available.js → require-selections.js} +43 -80
- package/esm/rules/require-type-pattern-with-oneof.d.mts +4 -3
- package/esm/rules/require-type-pattern-with-oneof.js +11 -16
- package/esm/rules/selection-set-depth.d.mts +4 -3
- package/esm/rules/selection-set-depth.js +11 -20
- package/esm/rules/strict-id-in-types.d.mts +4 -3
- package/esm/rules/strict-id-in-types.js +20 -34
- package/esm/rules/{no-case-insensitive-enum-values-duplicates.d.mts → unique-enum-value-names.d.mts} +4 -3
- package/esm/rules/{no-case-insensitive-enum-values-duplicates.js → unique-enum-value-names.js} +8 -9
- package/esm/rules/unique-fragment-name.d.mts +3 -2
- package/esm/rules/unique-fragment-name.js +20 -27
- package/esm/rules/unique-operation-name.d.mts +4 -3
- package/esm/rules/unique-operation-name.js +6 -5
- package/esm/schema.d.mts +4 -3
- package/esm/schema.js +7 -12
- package/esm/siblings.d.mts +24 -8
- package/esm/siblings.js +37 -73
- package/esm/types.d.mts +74 -7
- package/esm/utils.d.mts +3 -2
- package/esm/utils.js +20 -31
- package/index.browser.mjs +5323 -0
- package/package.json +8 -13
- package/cjs/rules/require-id-when-available.js +0 -241
- package/cjs/types-8d5f4ae0.d.ts +0 -107
- package/esm/types-ace77d86.d.ts +0 -107
- /package/cjs/configs/{relay.d.ts → schema-relay.d.ts} +0 -0
- /package/cjs/configs/{relay.js → schema-relay.js} +0 -0
- /package/esm/configs/{relay.d.mts → schema-relay.d.mts} +0 -0
@@ -1,12 +1,6 @@
|
|
1
|
-
import "../chunk-
|
1
|
+
import "../chunk-U3TKCM4X.js";
|
2
2
|
import { Kind } from "graphql";
|
3
|
-
const MUST_BE_OBJECT_TYPE = "MUST_BE_OBJECT_TYPE"
|
4
|
-
const MUST_CONTAIN_FIELD_EDGES = "MUST_CONTAIN_FIELD_EDGES";
|
5
|
-
const MUST_CONTAIN_FIELD_PAGE_INFO = "MUST_CONTAIN_FIELD_PAGE_INFO";
|
6
|
-
const MUST_HAVE_CONNECTION_SUFFIX = "MUST_HAVE_CONNECTION_SUFFIX";
|
7
|
-
const EDGES_FIELD_MUST_RETURN_LIST_TYPE = "EDGES_FIELD_MUST_RETURN_LIST_TYPE";
|
8
|
-
const PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE = "PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE";
|
9
|
-
const NON_OBJECT_TYPES = [
|
3
|
+
const 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 = [
|
10
4
|
Kind.SCALAR_TYPE_DEFINITION,
|
11
5
|
Kind.UNION_TYPE_DEFINITION,
|
12
6
|
Kind.UNION_TYPE_EXTENSION,
|
@@ -16,17 +10,7 @@ const NON_OBJECT_TYPES = [
|
|
16
10
|
Kind.ENUM_TYPE_EXTENSION,
|
17
11
|
Kind.INTERFACE_TYPE_DEFINITION,
|
18
12
|
Kind.INTERFACE_TYPE_EXTENSION
|
19
|
-
]
|
20
|
-
const notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`;
|
21
|
-
const hasEdgesField = (node) => {
|
22
|
-
var _a;
|
23
|
-
return (_a = node.fields) == null ? void 0 : _a.some((field) => field.name.value === "edges");
|
24
|
-
};
|
25
|
-
const hasPageInfoField = (node) => {
|
26
|
-
var _a;
|
27
|
-
return (_a = node.fields) == null ? void 0 : _a.some((field) => field.name.value === "pageInfo");
|
28
|
-
};
|
29
|
-
const rule = {
|
13
|
+
], 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"), rule = {
|
30
14
|
meta: {
|
31
15
|
type: "problem",
|
32
16
|
docs: {
|
@@ -38,9 +22,10 @@ const rule = {
|
|
38
22
|
"- Connection type must be an Object type",
|
39
23
|
"- Connection type must contain a field `edges` that return a list type that wraps an edge type",
|
40
24
|
"- Connection type must contain a field `pageInfo` that return a non-null `PageInfo` Object type"
|
41
|
-
].join(
|
25
|
+
].join(`
|
26
|
+
`),
|
42
27
|
url: "https://the-guild.dev/graphql/eslint/rules/relay-connection-types",
|
43
|
-
isDisabledForAllConfig:
|
28
|
+
isDisabledForAllConfig: !0,
|
44
29
|
examples: [
|
45
30
|
{
|
46
31
|
title: "Incorrect",
|
@@ -85,29 +70,16 @@ const rule = {
|
|
85
70
|
context.report({ node, messageId: MUST_BE_OBJECT_TYPE });
|
86
71
|
},
|
87
72
|
":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value!=/Connection$/]"(node) {
|
88
|
-
|
89
|
-
context.report({ node: node.name, messageId: MUST_HAVE_CONNECTION_SUFFIX });
|
90
|
-
}
|
73
|
+
hasEdgesField(node) && hasPageInfoField(node) && context.report({ node: node.name, messageId: MUST_HAVE_CONNECTION_SUFFIX });
|
91
74
|
},
|
92
75
|
":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/]"(node) {
|
93
|
-
|
94
|
-
context.report({ node: node.name, messageId: MUST_CONTAIN_FIELD_EDGES });
|
95
|
-
}
|
96
|
-
if (!hasPageInfoField(node)) {
|
97
|
-
context.report({ node: node.name, messageId: MUST_CONTAIN_FIELD_PAGE_INFO });
|
98
|
-
}
|
76
|
+
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 });
|
99
77
|
},
|
100
78
|
":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType"(node) {
|
101
|
-
|
102
|
-
if (!isListType) {
|
103
|
-
context.report({ node, messageId: EDGES_FIELD_MUST_RETURN_LIST_TYPE });
|
104
|
-
}
|
79
|
+
node.kind === Kind.LIST_TYPE || node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.LIST_TYPE || context.report({ node, messageId: EDGES_FIELD_MUST_RETURN_LIST_TYPE });
|
105
80
|
},
|
106
81
|
":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=pageInfo] > .gqlType"(node) {
|
107
|
-
|
108
|
-
if (!isNonNullPageInfoType) {
|
109
|
-
context.report({ node, messageId: PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE });
|
110
|
-
}
|
82
|
+
node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.NAMED_TYPE && node.gqlType.name.value === "PageInfo" || context.report({ node, messageId: PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE });
|
111
83
|
}
|
112
84
|
};
|
113
85
|
}
|
@@ -1,11 +1,12 @@
|
|
1
1
|
import { FromSchema } from 'json-schema-to-ts';
|
2
|
-
import {
|
3
|
-
import '@graphql-tools/utils';
|
2
|
+
import { GraphQLESLintRule } from '../types.mjs';
|
4
3
|
import 'eslint';
|
5
4
|
import 'estree';
|
6
5
|
import 'graphql';
|
7
|
-
import '
|
6
|
+
import '../siblings.mjs';
|
7
|
+
import '@graphql-tools/utils';
|
8
8
|
import '../estree-converter/types.mjs';
|
9
|
+
import 'graphql-config';
|
9
10
|
|
10
11
|
declare const schema: {
|
11
12
|
readonly type: "array";
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import "../chunk-
|
1
|
+
import "../chunk-U3TKCM4X.js";
|
2
2
|
import { getDocumentNodeFromSchema } from "@graphql-tools/utils";
|
3
3
|
import {
|
4
4
|
isObjectType,
|
@@ -7,67 +7,50 @@ import {
|
|
7
7
|
visit
|
8
8
|
} from "graphql";
|
9
9
|
import { getTypeName, requireGraphQLSchemaFromContext } from "../utils.js";
|
10
|
-
const RULE_ID = "relay-edge-types";
|
11
|
-
const MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE";
|
12
|
-
const MESSAGE_MISSING_EDGE_SUFFIX = "MESSAGE_MISSING_EDGE_SUFFIX";
|
13
|
-
const MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = "MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE";
|
14
|
-
const MESSAGE_SHOULD_IMPLEMENTS_NODE = "MESSAGE_SHOULD_IMPLEMENTS_NODE";
|
10
|
+
const RULE_ID = "relay-edge-types", MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE", MESSAGE_MISSING_EDGE_SUFFIX = "MESSAGE_MISSING_EDGE_SUFFIX", MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = "MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE", MESSAGE_SHOULD_IMPLEMENTS_NODE = "MESSAGE_SHOULD_IMPLEMENTS_NODE";
|
15
11
|
let edgeTypesCache;
|
16
12
|
function getEdgeTypes(schema2) {
|
17
|
-
if (edgeTypesCache)
|
13
|
+
if (edgeTypesCache)
|
18
14
|
return edgeTypesCache;
|
19
|
-
|
20
|
-
const edgeTypes = /* @__PURE__ */ new Set();
|
21
|
-
const visitor = {
|
15
|
+
const edgeTypes = /* @__PURE__ */ new Set(), visitor = {
|
22
16
|
ObjectTypeDefinition(node) {
|
23
|
-
|
24
|
-
const typeName = node.name.value;
|
25
|
-
const hasConnectionSuffix = typeName.endsWith("Connection");
|
26
|
-
if (!hasConnectionSuffix) {
|
17
|
+
if (!node.name.value.endsWith("Connection"))
|
27
18
|
return;
|
28
|
-
|
29
|
-
const edges = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "edges");
|
19
|
+
const edges = node.fields?.find((field) => field.name.value === "edges");
|
30
20
|
if (edges) {
|
31
|
-
const edgesTypeName = getTypeName(edges);
|
32
|
-
|
33
|
-
if (isObjectType(edgesType)) {
|
34
|
-
edgeTypes.add(edgesTypeName);
|
35
|
-
}
|
21
|
+
const edgesTypeName = getTypeName(edges), edgesType = schema2.getType(edgesTypeName);
|
22
|
+
isObjectType(edgesType) && edgeTypes.add(edgesTypeName);
|
36
23
|
}
|
37
24
|
}
|
38
|
-
};
|
39
|
-
|
40
|
-
visit(astNode, visitor);
|
41
|
-
edgeTypesCache = edgeTypes;
|
42
|
-
return edgeTypesCache;
|
25
|
+
}, astNode = getDocumentNodeFromSchema(schema2);
|
26
|
+
return visit(astNode, visitor), edgeTypesCache = edgeTypes, edgeTypesCache;
|
43
27
|
}
|
44
28
|
const schema = {
|
45
29
|
type: "array",
|
46
30
|
maxItems: 1,
|
47
31
|
items: {
|
48
32
|
type: "object",
|
49
|
-
additionalProperties:
|
33
|
+
additionalProperties: !1,
|
50
34
|
minProperties: 1,
|
51
35
|
properties: {
|
52
36
|
withEdgeSuffix: {
|
53
37
|
type: "boolean",
|
54
|
-
default:
|
38
|
+
default: !0,
|
55
39
|
description: 'Edge type name must end in "Edge".'
|
56
40
|
},
|
57
41
|
shouldImplementNode: {
|
58
42
|
type: "boolean",
|
59
|
-
default:
|
43
|
+
default: !0,
|
60
44
|
description: "Edge type's field `node` must implement `Node` interface."
|
61
45
|
},
|
62
46
|
listTypeCanWrapOnlyEdgeType: {
|
63
47
|
type: "boolean",
|
64
|
-
default:
|
48
|
+
default: !0,
|
65
49
|
description: "A list type should only wrap an edge type."
|
66
50
|
}
|
67
51
|
}
|
68
52
|
}
|
69
|
-
}
|
70
|
-
const rule = {
|
53
|
+
}, rule = {
|
71
54
|
meta: {
|
72
55
|
type: "problem",
|
73
56
|
docs: {
|
@@ -82,10 +65,11 @@ const rule = {
|
|
82
65
|
'- Edge type name must end in "Edge" _(optional)_',
|
83
66
|
"- Edge type's field `node` must implement `Node` interface _(optional)_",
|
84
67
|
"- A list type should only wrap an edge type _(optional)_"
|
85
|
-
].join(
|
68
|
+
].join(`
|
69
|
+
`),
|
86
70
|
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
87
|
-
isDisabledForAllConfig:
|
88
|
-
requiresSchema:
|
71
|
+
isDisabledForAllConfig: !0,
|
72
|
+
requiresSchema: !0,
|
89
73
|
examples: [
|
90
74
|
{
|
91
75
|
title: "Correct",
|
@@ -110,42 +94,28 @@ const rule = {
|
|
110
94
|
schema
|
111
95
|
},
|
112
96
|
create(context) {
|
113
|
-
const schema2 = requireGraphQLSchemaFromContext(RULE_ID, context)
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
shouldImplementNode: true,
|
118
|
-
listTypeCanWrapOnlyEdgeType: true,
|
97
|
+
const schema2 = requireGraphQLSchemaFromContext(RULE_ID, context), edgeTypes = getEdgeTypes(schema2), options = {
|
98
|
+
withEdgeSuffix: !0,
|
99
|
+
shouldImplementNode: !0,
|
100
|
+
listTypeCanWrapOnlyEdgeType: !0,
|
119
101
|
...context.options[0]
|
120
|
-
}
|
121
|
-
|
122
|
-
|
123
|
-
var _a, _b;
|
124
|
-
const nodeField = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "node");
|
125
|
-
const message = "return either a Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types.";
|
126
|
-
if (!nodeField) {
|
102
|
+
}, isNamedOrNonNullNamed = (node) => node.kind === Kind.NAMED_TYPE || node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.NAMED_TYPE, checkNodeField = (node) => {
|
103
|
+
const 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.";
|
104
|
+
if (!nodeField)
|
127
105
|
context.report({
|
128
106
|
node: node.name,
|
129
107
|
message: `Edge type must contain a field \`node\` that ${message}`
|
130
108
|
});
|
131
|
-
|
109
|
+
else if (!isNamedOrNonNullNamed(nodeField.gqlType))
|
132
110
|
context.report({ node: nodeField.name, message: `Field \`node\` must ${message}` });
|
133
|
-
|
134
|
-
const nodeReturnTypeName = getTypeName(nodeField.gqlType.rawNode());
|
135
|
-
|
136
|
-
if (!isObjectType(type)) {
|
111
|
+
else if (options.shouldImplementNode) {
|
112
|
+
const nodeReturnTypeName = getTypeName(nodeField.gqlType.rawNode()), type = schema2.getType(nodeReturnTypeName);
|
113
|
+
if (!isObjectType(type))
|
137
114
|
return;
|
138
|
-
}
|
139
|
-
const implementsNode = (_b = type.astNode.interfaces) == null ? void 0 : _b.some((n) => n.name.value === "Node");
|
140
|
-
if (!implementsNode) {
|
141
|
-
context.report({ node: node.name, messageId: MESSAGE_SHOULD_IMPLEMENTS_NODE });
|
142
|
-
}
|
115
|
+
type.astNode.interfaces?.some((n) => n.name.value === "Node") || context.report({ node: node.name, messageId: MESSAGE_SHOULD_IMPLEMENTS_NODE });
|
143
116
|
}
|
144
|
-
}
|
145
|
-
|
146
|
-
var _a;
|
147
|
-
const cursorField = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "cursor");
|
148
|
-
const message = "return either a String, Scalar, or a non-null wrapper wrapper around one of those types.";
|
117
|
+
}, checkCursorField = (node) => {
|
118
|
+
const cursorField = node.fields?.find((field) => field.name.value === "cursor"), message = "return either a String, Scalar, or a non-null wrapper wrapper around one of those types.";
|
149
119
|
if (!cursorField) {
|
150
120
|
context.report({
|
151
121
|
node: node.name,
|
@@ -154,39 +124,23 @@ const rule = {
|
|
154
124
|
return;
|
155
125
|
}
|
156
126
|
const typeName = getTypeName(cursorField.rawNode());
|
157
|
-
|
158
|
-
|
159
|
-
}
|
160
|
-
};
|
161
|
-
const listeners = {
|
127
|
+
(!isNamedOrNonNullNamed(cursorField.gqlType) || typeName !== "String" && !isScalarType(schema2.getType(typeName))) && context.report({ node: cursorField.name, message: `Field \`cursor\` must ${message}` });
|
128
|
+
}, listeners = {
|
162
129
|
":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType Name"(node) {
|
163
130
|
const type = schema2.getType(node.value);
|
164
|
-
|
165
|
-
context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
|
166
|
-
}
|
131
|
+
isObjectType(type) || context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
|
167
132
|
},
|
168
133
|
":matches(ObjectTypeDefinition, ObjectTypeExtension)"(node) {
|
169
134
|
const typeName = node.name.value;
|
170
|
-
|
171
|
-
checkNodeField(node);
|
172
|
-
checkCursorField(node);
|
173
|
-
if (options.withEdgeSuffix && !typeName.endsWith("Edge")) {
|
174
|
-
context.report({ node: node.name, messageId: MESSAGE_MISSING_EDGE_SUFFIX });
|
175
|
-
}
|
176
|
-
}
|
135
|
+
edgeTypes.has(typeName) && (checkNodeField(node), checkCursorField(node), options.withEdgeSuffix && !typeName.endsWith("Edge") && context.report({ node: node.name, messageId: MESSAGE_MISSING_EDGE_SUFFIX }));
|
177
136
|
}
|
178
137
|
};
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
}
|
186
|
-
}
|
187
|
-
};
|
188
|
-
}
|
189
|
-
return listeners;
|
138
|
+
return options.listTypeCanWrapOnlyEdgeType && (listeners["FieldDefinition > .gqlType"] = (node) => {
|
139
|
+
if (node.kind === Kind.LIST_TYPE || node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.LIST_TYPE) {
|
140
|
+
const typeName = getTypeName(node.rawNode());
|
141
|
+
edgeTypes.has(typeName) || context.report({ node, messageId: MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE });
|
142
|
+
}
|
143
|
+
}), listeners;
|
190
144
|
}
|
191
145
|
};
|
192
146
|
export {
|
@@ -1,11 +1,12 @@
|
|
1
|
-
import {
|
2
|
-
import '@graphql-tools/utils';
|
1
|
+
import { GraphQLESLintRule } from '../types.mjs';
|
3
2
|
import 'eslint';
|
4
3
|
import 'estree';
|
5
4
|
import 'graphql';
|
6
|
-
import 'graphql-config';
|
7
5
|
import 'json-schema-to-ts';
|
6
|
+
import '../siblings.mjs';
|
7
|
+
import '@graphql-tools/utils';
|
8
8
|
import '../estree-converter/types.mjs';
|
9
|
+
import 'graphql-config';
|
9
10
|
|
10
11
|
declare const rule: GraphQLESLintRule;
|
11
12
|
|
@@ -1,12 +1,9 @@
|
|
1
|
-
import "../chunk-
|
1
|
+
import "../chunk-U3TKCM4X.js";
|
2
2
|
import { isScalarType, Kind } from "graphql";
|
3
3
|
import { REPORT_ON_FIRST_CHARACTER, requireGraphQLSchemaFromContext } from "../utils.js";
|
4
4
|
import { NON_OBJECT_TYPES } from "./relay-connection-types.js";
|
5
|
-
const RULE_ID = "relay-page-info"
|
6
|
-
|
7
|
-
const MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE";
|
8
|
-
const notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
|
9
|
-
let hasPageInfoChecked = false;
|
5
|
+
const RULE_ID = "relay-page-info", MESSAGE_MUST_EXIST = "MESSAGE_MUST_EXIST", MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE", notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
|
6
|
+
let hasPageInfoChecked = !1;
|
10
7
|
const rule = {
|
11
8
|
meta: {
|
12
9
|
type: "problem",
|
@@ -18,7 +15,8 @@ const rule = {
|
|
18
15
|
"- `PageInfo` must be an Object type",
|
19
16
|
"- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean",
|
20
17
|
"- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results"
|
21
|
-
].join(
|
18
|
+
].join(`
|
19
|
+
`),
|
22
20
|
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
23
21
|
examples: [
|
24
22
|
{
|
@@ -36,8 +34,8 @@ const rule = {
|
|
36
34
|
)
|
37
35
|
}
|
38
36
|
],
|
39
|
-
isDisabledForAllConfig:
|
40
|
-
requiresSchema:
|
37
|
+
isDisabledForAllConfig: !0,
|
38
|
+
requiresSchema: !0
|
41
39
|
},
|
42
40
|
messages: {
|
43
41
|
[MESSAGE_MUST_EXIST]: "The server must provide a `PageInfo` object.",
|
@@ -47,35 +45,22 @@ const rule = {
|
|
47
45
|
},
|
48
46
|
create(context) {
|
49
47
|
const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
loc: REPORT_ON_FIRST_CHARACTER,
|
55
|
-
messageId: MESSAGE_MUST_EXIST
|
56
|
-
});
|
57
|
-
}
|
58
|
-
hasPageInfoChecked = true;
|
59
|
-
}
|
60
|
-
return {
|
48
|
+
return hasPageInfoChecked || (schema.getType("PageInfo") || context.report({
|
49
|
+
loc: REPORT_ON_FIRST_CHARACTER,
|
50
|
+
messageId: MESSAGE_MUST_EXIST
|
51
|
+
}), hasPageInfoChecked = !0), {
|
61
52
|
[notPageInfoTypesSelector](node) {
|
62
53
|
context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
|
63
54
|
},
|
64
55
|
"ObjectTypeDefinition[name.value=PageInfo]"(node) {
|
65
|
-
var _a;
|
66
56
|
const fieldMap = Object.fromEntries(
|
67
|
-
|
68
|
-
)
|
69
|
-
const checkField = (fieldName, typeName) => {
|
57
|
+
node.fields?.map((field) => [field.name.value, field]) || []
|
58
|
+
), checkField = (fieldName, typeName) => {
|
70
59
|
const field = fieldMap[fieldName];
|
71
|
-
let isAllowedType =
|
60
|
+
let isAllowedType = !1;
|
72
61
|
if (field) {
|
73
62
|
const type = field.gqlType;
|
74
|
-
|
75
|
-
isAllowedType = type.kind === Kind.NON_NULL_TYPE && type.gqlType.kind === Kind.NAMED_TYPE && type.gqlType.name.value === "Boolean";
|
76
|
-
} else if (type.kind === Kind.NAMED_TYPE) {
|
77
|
-
isAllowedType = type.name.value === "String" || isScalarType(schema.getType(type.name.value));
|
78
|
-
}
|
63
|
+
typeName === "Boolean" ? isAllowedType = type.kind === Kind.NON_NULL_TYPE && type.gqlType.kind === Kind.NAMED_TYPE && type.gqlType.name.value === "Boolean" : type.kind === Kind.NAMED_TYPE && (isAllowedType = type.name.value === "String" || isScalarType(schema.getType(type.name.value)));
|
79
64
|
}
|
80
65
|
if (!isAllowedType) {
|
81
66
|
const returnType = typeName === "Boolean" ? "non-null Boolean" : "either String or Scalar, which can be null if there are no results";
|
@@ -85,10 +70,7 @@ const rule = {
|
|
85
70
|
});
|
86
71
|
}
|
87
72
|
};
|
88
|
-
checkField("hasPreviousPage", "Boolean");
|
89
|
-
checkField("hasNextPage", "Boolean");
|
90
|
-
checkField("startCursor", "String");
|
91
|
-
checkField("endCursor", "String");
|
73
|
+
checkField("hasPreviousPage", "Boolean"), checkField("hasNextPage", "Boolean"), checkField("startCursor", "String"), checkField("endCursor", "String");
|
92
74
|
}
|
93
75
|
};
|
94
76
|
}
|
@@ -1,11 +1,12 @@
|
|
1
1
|
import { FromSchema } from 'json-schema-to-ts';
|
2
|
-
import {
|
3
|
-
import '@graphql-tools/utils';
|
2
|
+
import { GraphQLESLintRule } from '../types.mjs';
|
4
3
|
import 'eslint';
|
5
4
|
import 'estree';
|
6
5
|
import 'graphql';
|
7
|
-
import '
|
6
|
+
import '../siblings.mjs';
|
7
|
+
import '@graphql-tools/utils';
|
8
8
|
import '../estree-converter/types.mjs';
|
9
|
+
import 'graphql-config';
|
9
10
|
|
10
11
|
declare const schema: {
|
11
12
|
readonly type: "array";
|
@@ -1,28 +1,22 @@
|
|
1
|
-
import "../chunk-
|
1
|
+
import "../chunk-U3TKCM4X.js";
|
2
2
|
import { valueFromNode } from "../estree-converter/index.js";
|
3
3
|
import { getNodeName } from "../utils.js";
|
4
|
-
const DATE_REGEX = /^\d{2}\/\d{2}\/\d{4}
|
5
|
-
const MESSAGE_REQUIRE_DATE = "MESSAGE_REQUIRE_DATE";
|
6
|
-
const MESSAGE_INVALID_FORMAT = "MESSAGE_INVALID_FORMAT";
|
7
|
-
const MESSAGE_INVALID_DATE = "MESSAGE_INVALID_DATE";
|
8
|
-
const MESSAGE_CAN_BE_REMOVED = "MESSAGE_CAN_BE_REMOVED";
|
9
|
-
const schema = {
|
4
|
+
const DATE_REGEX = /^\d{2}\/\d{2}\/\d{4}$/, MESSAGE_REQUIRE_DATE = "MESSAGE_REQUIRE_DATE", MESSAGE_INVALID_FORMAT = "MESSAGE_INVALID_FORMAT", MESSAGE_INVALID_DATE = "MESSAGE_INVALID_DATE", MESSAGE_CAN_BE_REMOVED = "MESSAGE_CAN_BE_REMOVED", schema = {
|
10
5
|
type: "array",
|
11
6
|
maxItems: 1,
|
12
7
|
items: {
|
13
8
|
type: "object",
|
14
|
-
additionalProperties:
|
9
|
+
additionalProperties: !1,
|
15
10
|
properties: {
|
16
11
|
argumentName: {
|
17
12
|
type: "string"
|
18
13
|
}
|
19
14
|
}
|
20
15
|
}
|
21
|
-
}
|
22
|
-
const rule = {
|
16
|
+
}, rule = {
|
23
17
|
meta: {
|
24
18
|
type: "suggestion",
|
25
|
-
hasSuggestions:
|
19
|
+
hasSuggestions: !0,
|
26
20
|
docs: {
|
27
21
|
category: "Schema",
|
28
22
|
description: "Require deletion date on `@deprecated` directive. Suggest removing deprecated things after deprecated date.",
|
@@ -78,9 +72,7 @@ const rule = {
|
|
78
72
|
create(context) {
|
79
73
|
return {
|
80
74
|
"Directive[name.value=deprecated]"(node) {
|
81
|
-
|
82
|
-
const argName = ((_a = context.options[0]) == null ? void 0 : _a.argumentName) || "deletionDate";
|
83
|
-
const deletionDateNode = (_b = node.arguments) == null ? void 0 : _b.find((arg) => arg.name.value === argName);
|
75
|
+
const argName = context.options[0]?.argumentName || "deletionDate", deletionDateNode = node.arguments?.find((arg) => arg.name.value === argName);
|
84
76
|
if (!deletionDateNode) {
|
85
77
|
context.report({
|
86
78
|
node: node.name,
|
@@ -92,8 +84,7 @@ const rule = {
|
|
92
84
|
return;
|
93
85
|
}
|
94
86
|
const deletionDate = valueFromNode(deletionDateNode.value);
|
95
|
-
|
96
|
-
if (!isValidDate) {
|
87
|
+
if (!DATE_REGEX.test(deletionDate)) {
|
97
88
|
context.report({
|
98
89
|
node: deletionDateNode.value,
|
99
90
|
messageId: MESSAGE_INVALID_FORMAT,
|
@@ -102,8 +93,7 @@ const rule = {
|
|
102
93
|
return;
|
103
94
|
}
|
104
95
|
let [day, month, year] = deletionDate.split("/");
|
105
|
-
day = day.padStart(2, "0");
|
106
|
-
month = month.padStart(2, "0");
|
96
|
+
day = day.padStart(2, "0"), month = month.padStart(2, "0");
|
107
97
|
const deletionDateInMS = Date.parse(`${year}-${month}-${day}`);
|
108
98
|
if (Number.isNaN(deletionDateInMS)) {
|
109
99
|
context.report({
|
@@ -116,10 +106,8 @@ const rule = {
|
|
116
106
|
});
|
117
107
|
return;
|
118
108
|
}
|
119
|
-
|
120
|
-
|
121
|
-
const { parent } = node;
|
122
|
-
const nodeName = parent.name.value;
|
109
|
+
if (Date.now() > deletionDateInMS) {
|
110
|
+
const { parent } = node, nodeName = parent.name.value;
|
123
111
|
context.report({
|
124
112
|
node: parent.name,
|
125
113
|
messageId: MESSAGE_CAN_BE_REMOVED,
|
@@ -1,11 +1,12 @@
|
|
1
|
-
import {
|
2
|
-
import '@graphql-tools/utils';
|
1
|
+
import { GraphQLESLintRule } from '../types.mjs';
|
3
2
|
import 'eslint';
|
4
3
|
import 'estree';
|
5
4
|
import 'graphql';
|
6
|
-
import 'graphql-config';
|
7
5
|
import 'json-schema-to-ts';
|
6
|
+
import '../siblings.mjs';
|
7
|
+
import '@graphql-tools/utils';
|
8
8
|
import '../estree-converter/types.mjs';
|
9
|
+
import 'graphql-config';
|
9
10
|
|
10
11
|
declare const rule: GraphQLESLintRule;
|
11
12
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import "../chunk-
|
1
|
+
import "../chunk-U3TKCM4X.js";
|
2
2
|
import { valueFromNode } from "../estree-converter/index.js";
|
3
3
|
import { getNodeName } from "../utils.js";
|
4
4
|
const rule = {
|
@@ -7,7 +7,7 @@ const rule = {
|
|
7
7
|
description: "Require all deprecation directives to specify a reason.",
|
8
8
|
category: "Schema",
|
9
9
|
url: "https://the-guild.dev/graphql/eslint/rules/require-deprecation-reason",
|
10
|
-
recommended:
|
10
|
+
recommended: !0,
|
11
11
|
examples: [
|
12
12
|
{
|
13
13
|
title: "Incorrect",
|
@@ -50,17 +50,13 @@ const rule = {
|
|
50
50
|
create(context) {
|
51
51
|
return {
|
52
52
|
"Directive[name.value=deprecated]"(node) {
|
53
|
-
|
54
|
-
const reasonArgument = (_a = node.arguments) == null ? void 0 : _a.find(
|
53
|
+
const reasonArgument = node.arguments?.find(
|
55
54
|
(arg) => arg.name.value === "reason"
|
56
55
|
);
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
message: `Deprecation reason is required for ${getNodeName(node.parent)}.`
|
62
|
-
});
|
63
|
-
}
|
56
|
+
reasonArgument && String(valueFromNode(reasonArgument.value)).trim() || context.report({
|
57
|
+
node: node.name,
|
58
|
+
message: `Deprecation reason is required for ${getNodeName(node.parent)}.`
|
59
|
+
});
|
64
60
|
}
|
65
61
|
};
|
66
62
|
}
|
@@ -1,11 +1,12 @@
|
|
1
1
|
import { Kind } from 'graphql';
|
2
|
-
import {
|
3
|
-
import '@graphql-tools/utils';
|
2
|
+
import { GraphQLESLintRule } from '../types.mjs';
|
4
3
|
import 'eslint';
|
5
4
|
import 'estree';
|
6
|
-
import 'graphql-config';
|
7
5
|
import 'json-schema-to-ts';
|
6
|
+
import '../siblings.mjs';
|
7
|
+
import '@graphql-tools/utils';
|
8
8
|
import '../estree-converter/types.mjs';
|
9
|
+
import 'graphql-config';
|
9
10
|
|
10
11
|
declare const RULE_ID = "require-description";
|
11
12
|
declare const ALLOWED_KINDS: readonly [Kind.OBJECT_TYPE_DEFINITION, Kind.INTERFACE_TYPE_DEFINITION, Kind.ENUM_TYPE_DEFINITION, Kind.SCALAR_TYPE_DEFINITION, Kind.INPUT_OBJECT_TYPE_DEFINITION, Kind.UNION_TYPE_DEFINITION, Kind.DIRECTIVE_DEFINITION, Kind.FIELD_DEFINITION, Kind.INPUT_VALUE_DEFINITION, Kind.ENUM_VALUE_DEFINITION, Kind.OPERATION_DEFINITION];
|