@graphql-eslint/eslint-plugin 3.20.0 → 3.20.1-alpha-20230713065115-b9bc635
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/configs/operations-all.js +1 -23
- package/cjs/configs/operations-recommended.js +1 -23
- package/cjs/configs/relay.js +1 -23
- package/cjs/configs/schema-all.js +1 -23
- package/cjs/configs/schema-recommended.js +1 -23
- package/cjs/documents.js +2 -1
- package/cjs/estree-converter/utils.js +1 -1
- package/cjs/parser.js +4 -3
- package/cjs/processor.js +1 -1
- package/cjs/rules/alphabetize.js +12 -9
- package/cjs/rules/graphql-js-validation.js +13 -8
- package/cjs/rules/lone-executable-definition.js +5 -3
- package/cjs/rules/match-document-filename.js +2 -1
- package/cjs/rules/naming-convention.js +2 -2
- package/cjs/rules/no-case-insensitive-enum-values-duplicates.js +2 -1
- package/cjs/rules/no-deprecated.js +4 -2
- package/cjs/rules/no-one-place-fragments.js +1 -1
- package/cjs/rules/no-unreachable-types.js +2 -2
- package/cjs/rules/no-unused-fields.js +4 -2
- package/cjs/rules/relay-arguments.js +2 -1
- package/cjs/rules/relay-connection-types.js +8 -2
- package/cjs/rules/relay-edge-types.js +7 -4
- package/cjs/rules/relay-page-info.js +2 -1
- package/cjs/rules/require-deprecation-date.js +3 -2
- package/cjs/rules/require-deprecation-reason.js +2 -1
- package/cjs/rules/require-description.js +3 -2
- package/cjs/rules/require-field-of-type-query-in-mutation-result.js +1 -1
- package/cjs/rules/require-import-fragment.js +2 -1
- package/cjs/rules/require-nullable-result-in-root.js +1 -1
- package/cjs/rules/require-type-pattern-with-oneof.js +2 -1
- package/cjs/rules/strict-id-in-types.js +4 -3
- package/cjs/rules/unique-fragment-name.js +2 -1
- package/cjs/siblings.js +8 -3
- package/cjs/utils.js +2 -1
- package/esm/cache.js +1 -0
- package/esm/chunk-BMTV3EA2.js +8 -0
- package/esm/configs/index.js +1 -0
- package/esm/configs/operations-all.js +32 -27
- package/esm/configs/operations-recommended.js +57 -52
- package/esm/configs/relay.js +17 -12
- package/esm/configs/schema-all.js +26 -21
- package/esm/configs/schema-recommended.js +53 -48
- package/esm/documents.js +3 -1
- package/esm/estree-converter/converter.js +1 -0
- package/esm/estree-converter/utils.js +2 -1
- package/esm/flat-configs.js +1 -0
- package/esm/graphql-config.js +1 -0
- package/esm/index.js +1 -0
- package/esm/parser.js +5 -3
- package/esm/processor.js +2 -1
- package/esm/rules/alphabetize.js +13 -9
- package/esm/rules/description-style.js +1 -0
- package/esm/rules/graphql-js-validation.js +14 -8
- package/esm/rules/index.js +1 -0
- package/esm/rules/input-name.js +1 -0
- package/esm/rules/lone-executable-definition.js +6 -3
- package/esm/rules/match-document-filename.js +3 -1
- package/esm/rules/naming-convention.js +3 -2
- package/esm/rules/no-anonymous-operations.js +1 -0
- package/esm/rules/no-case-insensitive-enum-values-duplicates.js +3 -1
- package/esm/rules/no-deprecated.js +5 -2
- package/esm/rules/no-duplicate-fields.js +1 -0
- package/esm/rules/no-hashtag-description.js +1 -0
- package/esm/rules/no-one-place-fragments.js +2 -1
- package/esm/rules/no-root-type.js +1 -0
- package/esm/rules/no-scalar-result-type-on-mutation.js +1 -0
- package/esm/rules/no-typename-prefix.js +1 -0
- package/esm/rules/no-unreachable-types.js +3 -2
- package/esm/rules/no-unused-fields.js +5 -2
- package/esm/rules/relay-arguments.js +3 -1
- package/esm/rules/relay-connection-types.js +9 -2
- package/esm/rules/relay-edge-types.js +8 -4
- package/esm/rules/relay-page-info.js +3 -1
- package/esm/rules/require-deprecation-date.js +4 -2
- package/esm/rules/require-deprecation-reason.js +3 -1
- package/esm/rules/require-description.js +4 -2
- package/esm/rules/require-field-of-type-query-in-mutation-result.js +2 -1
- package/esm/rules/require-id-when-available.js +1 -0
- package/esm/rules/require-import-fragment.js +3 -1
- package/esm/rules/require-nullable-fields-with-oneof.js +1 -0
- package/esm/rules/require-nullable-result-in-root.js +2 -1
- package/esm/rules/require-type-pattern-with-oneof.js +3 -1
- package/esm/rules/selection-set-depth.js +1 -0
- package/esm/rules/strict-id-in-types.js +5 -3
- package/esm/rules/unique-fragment-name.js +3 -1
- package/esm/rules/unique-operation-name.js +1 -0
- package/esm/schema.js +1 -0
- package/esm/siblings.js +9 -3
- package/esm/testkit.js +1 -0
- package/esm/utils.js +3 -1
- package/package.json +1 -4
package/esm/rules/alphabetize.js
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import {
|
2
3
|
Kind
|
3
4
|
} from "graphql";
|
@@ -206,6 +207,7 @@ const rule = {
|
|
206
207
|
schema
|
207
208
|
},
|
208
209
|
create(context) {
|
210
|
+
var _a, _b, _c, _d, _e;
|
209
211
|
const sourceCode = context.getSourceCode();
|
210
212
|
function isNodeAndCommentOnSameLine(node, comment) {
|
211
213
|
return node.loc.end.line === comment.loc.start.line;
|
@@ -241,19 +243,20 @@ const rule = {
|
|
241
243
|
return [from.range[0], to.range[1]];
|
242
244
|
}
|
243
245
|
function checkNodes(nodes = []) {
|
246
|
+
var _a2, _b2, _c2, _d2;
|
244
247
|
for (let i = 1; i < nodes.length; i += 1) {
|
245
248
|
const currNode = nodes[i];
|
246
|
-
const currName = "alias" in currNode && currNode.alias
|
249
|
+
const currName = "alias" in currNode && ((_a2 = currNode.alias) == null ? void 0 : _a2.value) || "name" in currNode && ((_b2 = currNode.name) == null ? void 0 : _b2.value);
|
247
250
|
if (!currName) {
|
248
251
|
continue;
|
249
252
|
}
|
250
253
|
const prevNode = nodes[i - 1];
|
251
|
-
const prevName = "alias" in prevNode && prevNode.alias
|
254
|
+
const prevName = "alias" in prevNode && ((_c2 = prevNode.alias) == null ? void 0 : _c2.value) || "name" in prevNode && ((_d2 = prevNode.name) == null ? void 0 : _d2.value);
|
252
255
|
if (prevName) {
|
253
256
|
const compareResult = prevName.localeCompare(currName);
|
254
257
|
const { groups } = opts;
|
255
258
|
let shouldSortByGroup = false;
|
256
|
-
if (groups
|
259
|
+
if (groups == null ? void 0 : groups.length) {
|
257
260
|
if (!groups.includes("*")) {
|
258
261
|
throw new Error("`groups` option should contain `*` string.");
|
259
262
|
}
|
@@ -300,7 +303,7 @@ const rule = {
|
|
300
303
|
}
|
301
304
|
}
|
302
305
|
const opts = context.options[0];
|
303
|
-
const fields = new Set(opts.fields
|
306
|
+
const fields = new Set((_a = opts.fields) != null ? _a : []);
|
304
307
|
const listeners = {};
|
305
308
|
const kinds = [
|
306
309
|
fields.has(Kind.OBJECT_TYPE_DEFINITION) && [
|
@@ -317,10 +320,10 @@ const rule = {
|
|
317
320
|
]
|
318
321
|
].filter(truthy).flat();
|
319
322
|
const fieldsSelector = kinds.join(",");
|
320
|
-
const hasEnumValues = opts.values
|
321
|
-
const selectionsSelector = opts.selections
|
322
|
-
const hasVariables = opts.variables
|
323
|
-
const argumentsSelector = opts.arguments
|
323
|
+
const hasEnumValues = ((_b = opts.values) == null ? void 0 : _b[0]) === Kind.ENUM_TYPE_DEFINITION;
|
324
|
+
const selectionsSelector = (_c = opts.selections) == null ? void 0 : _c.join(",");
|
325
|
+
const hasVariables = ((_d = opts.variables) == null ? void 0 : _d[0]) === Kind.OPERATION_DEFINITION;
|
326
|
+
const argumentsSelector = (_e = opts.arguments) == null ? void 0 : _e.join(",");
|
324
327
|
if (fieldsSelector) {
|
325
328
|
listeners[fieldsSelector] = (node) => {
|
326
329
|
checkNodes(node.fields);
|
@@ -339,7 +342,8 @@ const rule = {
|
|
339
342
|
}
|
340
343
|
if (hasVariables) {
|
341
344
|
listeners.OperationDefinition = (node) => {
|
342
|
-
|
345
|
+
var _a2;
|
346
|
+
checkNodes((_a2 = node.variableDefinitions) == null ? void 0 : _a2.map((varDef) => varDef.variable));
|
343
347
|
};
|
344
348
|
}
|
345
349
|
if (argumentsSelector) {
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { createRequire } from 'module';
|
2
2
|
const require = createRequire(import.meta.url);
|
3
|
+
import "../chunk-BMTV3EA2.js";
|
3
4
|
import {
|
4
5
|
Kind,
|
5
6
|
validate,
|
@@ -20,6 +21,7 @@ function validateDocument({
|
|
20
21
|
rule,
|
21
22
|
hasDidYouMeanSuggestions
|
22
23
|
}) {
|
24
|
+
var _a;
|
23
25
|
if (documentNode.definitions.length === 0) {
|
24
26
|
return;
|
25
27
|
}
|
@@ -40,7 +42,7 @@ function validateDocument({
|
|
40
42
|
loc = // if cursor on `@` symbol than use next node
|
41
43
|
token.type === "@" ? sourceCode.getNodeByRangeIndex(token.range[1] + 1).loc : token.loc;
|
42
44
|
}
|
43
|
-
const didYouMeanContent = error.message.match(/Did you mean (?<content>.*)\?$/)
|
45
|
+
const didYouMeanContent = (_a = error.message.match(/Did you mean (?<content>.*)\?$/)) == null ? void 0 : _a.groups.content;
|
44
46
|
const matches = didYouMeanContent ? [...didYouMeanContent.matchAll(/"(?<name>[^"]*)"/g)] : [];
|
45
47
|
context.report({
|
46
48
|
loc,
|
@@ -215,12 +217,15 @@ const GRAPHQL_JS_VALIDATIONS = Object.assign(
|
|
215
217
|
if (ignoreClientDirectives.length === 0) {
|
216
218
|
return documentNode;
|
217
219
|
}
|
218
|
-
const filterDirectives = (node) =>
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
220
|
+
const filterDirectives = (node) => {
|
221
|
+
var _a;
|
222
|
+
return {
|
223
|
+
...node,
|
224
|
+
directives: (_a = node.directives) == null ? void 0 : _a.filter(
|
225
|
+
(directive) => !ignoreClientDirectives.includes(directive.name.value)
|
226
|
+
)
|
227
|
+
};
|
228
|
+
};
|
224
229
|
return visit(documentNode, {
|
225
230
|
Field: filterDirectives,
|
226
231
|
OperationDefinition: filterDirectives
|
@@ -396,7 +401,8 @@ const GRAPHQL_JS_VALIDATIONS = Object.assign(
|
|
396
401
|
...siblings.getOperations(),
|
397
402
|
...siblings.getFragments()
|
398
403
|
].reduce((map, { filePath, document }) => {
|
399
|
-
|
404
|
+
var _a;
|
405
|
+
(_a = map[filePath]) != null ? _a : map[filePath] = [];
|
400
406
|
map[filePath].push(document);
|
401
407
|
return map;
|
402
408
|
}, /* @__PURE__ */ Object.create(null));
|
package/esm/rules/index.js
CHANGED
package/esm/rules/input-name.js
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { ARRAY_DEFAULT_OPTIONS, getLocation, pascalCase } from "../utils.js";
|
2
3
|
const RULE_ID = "lone-executable-definition";
|
3
4
|
const definitionTypes = ["fragment", "query", "mutation", "subscription"];
|
@@ -62,7 +63,8 @@ const rule = {
|
|
62
63
|
schema
|
63
64
|
},
|
64
65
|
create(context) {
|
65
|
-
|
66
|
+
var _a;
|
67
|
+
const ignore = new Set(((_a = context.options[0]) == null ? void 0 : _a.ignore) || []);
|
66
68
|
const definitions = [];
|
67
69
|
return {
|
68
70
|
":matches(OperationDefinition, FragmentDefinition)"(node) {
|
@@ -72,14 +74,15 @@ const rule = {
|
|
72
74
|
}
|
73
75
|
},
|
74
76
|
"Document:exit"() {
|
77
|
+
var _a2, _b;
|
75
78
|
for (const { node, type } of definitions.slice(1)) {
|
76
79
|
let name = pascalCase(type);
|
77
|
-
const definitionName = node.name
|
80
|
+
const definitionName = (_a2 = node.name) == null ? void 0 : _a2.value;
|
78
81
|
if (definitionName) {
|
79
82
|
name += ` "${definitionName}"`;
|
80
83
|
}
|
81
84
|
context.report({
|
82
|
-
loc: node.name
|
85
|
+
loc: ((_b = node.name) == null ? void 0 : _b.loc) || getLocation(node.loc.start, type),
|
83
86
|
messageId: RULE_ID,
|
84
87
|
data: { name }
|
85
88
|
});
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { basename, extname } from "path";
|
2
3
|
import { Kind } from "graphql";
|
3
4
|
import {
|
@@ -201,6 +202,7 @@ const rule = {
|
|
201
202
|
const filename = basename(filePath, fileExtension);
|
202
203
|
return {
|
203
204
|
Document(documentNode) {
|
205
|
+
var _a;
|
204
206
|
if (options.fileExtension && options.fileExtension !== fileExtension) {
|
205
207
|
context.report({
|
206
208
|
loc: REPORT_ON_FIRST_CHARACTER,
|
@@ -221,7 +223,7 @@ const rule = {
|
|
221
223
|
if (!node) {
|
222
224
|
return;
|
223
225
|
}
|
224
|
-
const docName = node.name
|
226
|
+
const docName = (_a = node.name) == null ? void 0 : _a.value;
|
225
227
|
if (!docName) {
|
226
228
|
return;
|
227
229
|
}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { Kind } from "graphql";
|
2
3
|
import {
|
3
4
|
ARRAY_DEFAULT_OPTIONS,
|
@@ -347,14 +348,14 @@ const rule = {
|
|
347
348
|
renameToNames: [name + suffix]
|
348
349
|
};
|
349
350
|
}
|
350
|
-
const forbiddenPrefix = forbiddenPrefixes
|
351
|
+
const forbiddenPrefix = forbiddenPrefixes == null ? void 0 : forbiddenPrefixes.find((prefix2) => name.startsWith(prefix2));
|
351
352
|
if (forbiddenPrefix) {
|
352
353
|
return {
|
353
354
|
errorMessage: `not have "${forbiddenPrefix}" prefix`,
|
354
355
|
renameToNames: [name.replace(new RegExp(`^${forbiddenPrefix}`), "")]
|
355
356
|
};
|
356
357
|
}
|
357
|
-
const forbiddenSuffix = forbiddenSuffixes
|
358
|
+
const forbiddenSuffix = forbiddenSuffixes == null ? void 0 : forbiddenSuffixes.find((suffix2) => name.endsWith(suffix2));
|
358
359
|
if (forbiddenSuffix) {
|
359
360
|
return {
|
360
361
|
errorMessage: `not have "${forbiddenSuffix}" suffix`,
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { Kind } from "graphql";
|
2
3
|
import { getNodeName } from "../utils.js";
|
3
4
|
const rule = {
|
@@ -44,7 +45,8 @@ const rule = {
|
|
44
45
|
const selector = [Kind.ENUM_TYPE_DEFINITION, Kind.ENUM_TYPE_EXTENSION].join(",");
|
45
46
|
return {
|
46
47
|
[selector](node) {
|
47
|
-
|
48
|
+
var _a;
|
49
|
+
const duplicates = (_a = node.values) == null ? void 0 : _a.filter(
|
48
50
|
(item, index, array) => array.findIndex((v) => v.name.value.toLowerCase() === item.name.value.toLowerCase()) !== index
|
49
51
|
);
|
50
52
|
for (const duplicate of duplicates || []) {
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { Kind } from "graphql";
|
2
3
|
import { requireGraphQLSchemaFromContext } from "../utils.js";
|
3
4
|
const RULE_ID = "no-deprecated";
|
@@ -110,15 +111,17 @@ const rule = {
|
|
110
111
|
}
|
111
112
|
return {
|
112
113
|
EnumValue(node) {
|
114
|
+
var _a;
|
113
115
|
const typeInfo = node.typeInfo();
|
114
|
-
const reason = typeInfo.enumValue
|
116
|
+
const reason = (_a = typeInfo.enumValue) == null ? void 0 : _a.deprecationReason;
|
115
117
|
if (reason) {
|
116
118
|
report(node, reason);
|
117
119
|
}
|
118
120
|
},
|
119
121
|
Field(node) {
|
122
|
+
var _a;
|
120
123
|
const typeInfo = node.typeInfo();
|
121
|
-
const reason = typeInfo.fieldDef
|
124
|
+
const reason = (_a = typeInfo.fieldDef) == null ? void 0 : _a.deprecationReason;
|
122
125
|
if (reason) {
|
123
126
|
report(node, reason);
|
124
127
|
}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { relative } from "path";
|
2
3
|
import { visit } from "graphql";
|
3
4
|
import { CWD, requireSiblingsOperations } from "../utils.js";
|
@@ -64,7 +65,7 @@ const rule = {
|
|
64
65
|
visit(document, {
|
65
66
|
FragmentSpread({ name }) {
|
66
67
|
const spreadName = name.value;
|
67
|
-
usedFragmentsMap[spreadName]
|
68
|
+
usedFragmentsMap[spreadName] || (usedFragmentsMap[spreadName] = []);
|
68
69
|
usedFragmentsMap[spreadName].push(relativeFilePath);
|
69
70
|
}
|
70
71
|
});
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import {
|
2
3
|
DirectiveLocation,
|
3
4
|
isInterfaceType,
|
@@ -50,7 +51,7 @@ function getReachableTypes(schema) {
|
|
50
51
|
for (const { astNode } of [...objects, ...interfaces]) {
|
51
52
|
visit(astNode, visitor);
|
52
53
|
}
|
53
|
-
} else if (type
|
54
|
+
} else if (type == null ? void 0 : type.astNode) {
|
54
55
|
visit(type.astNode, visitor);
|
55
56
|
}
|
56
57
|
};
|
@@ -70,7 +71,7 @@ function getReachableTypes(schema) {
|
|
70
71
|
schema.getMutationType(),
|
71
72
|
schema.getSubscriptionType()
|
72
73
|
]) {
|
73
|
-
if (type
|
74
|
+
if (type == null ? void 0 : type.astNode) {
|
74
75
|
visit(type.astNode, visitor);
|
75
76
|
}
|
76
77
|
}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { TypeInfo, visit, visitWithTypeInfo } from "graphql";
|
2
3
|
import { requireGraphQLSchemaFromContext, requireSiblingsOperations } from "../utils.js";
|
3
4
|
const RULE_ID = "no-unused-fields";
|
@@ -10,13 +11,14 @@ function getUsedFields(schema, operations) {
|
|
10
11
|
const typeInfo = new TypeInfo(schema);
|
11
12
|
const visitor = visitWithTypeInfo(typeInfo, {
|
12
13
|
Field(node) {
|
14
|
+
var _a;
|
13
15
|
const fieldDef = typeInfo.getFieldDef();
|
14
16
|
if (!fieldDef) {
|
15
17
|
return false;
|
16
18
|
}
|
17
19
|
const parentTypeName = typeInfo.getParentType().name;
|
18
20
|
const fieldName = node.name.value;
|
19
|
-
usedFields[parentTypeName]
|
21
|
+
(_a = usedFields[parentTypeName]) != null ? _a : usedFields[parentTypeName] = /* @__PURE__ */ new Set();
|
20
22
|
usedFields[parentTypeName].add(fieldName);
|
21
23
|
}
|
22
24
|
});
|
@@ -99,9 +101,10 @@ const rule = {
|
|
99
101
|
const usedFields = getUsedFields(schema, siblingsOperations);
|
100
102
|
return {
|
101
103
|
FieldDefinition(node) {
|
104
|
+
var _a;
|
102
105
|
const fieldName = node.name.value;
|
103
106
|
const parentTypeName = node.parent.name.value;
|
104
|
-
const isUsed = usedFields[parentTypeName]
|
107
|
+
const isUsed = (_a = usedFields[parentTypeName]) == null ? void 0 : _a.has(fieldName);
|
105
108
|
if (isUsed) {
|
106
109
|
return;
|
107
110
|
}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { isScalarType, Kind } from "graphql";
|
2
3
|
import { requireGraphQLSchemaFromContext } from "../utils.js";
|
3
4
|
const RULE_ID = "relay-arguments";
|
@@ -75,12 +76,13 @@ const rule = {
|
|
75
76
|
const { includeBoth = true } = context.options[0] || {};
|
76
77
|
return {
|
77
78
|
"FieldDefinition > .gqlType Name[value=/Connection$/]"(node) {
|
79
|
+
var _a;
|
78
80
|
let fieldNode = node.parent;
|
79
81
|
while (fieldNode.kind !== Kind.FIELD_DEFINITION) {
|
80
82
|
fieldNode = fieldNode.parent;
|
81
83
|
}
|
82
84
|
const args = Object.fromEntries(
|
83
|
-
fieldNode.arguments
|
85
|
+
((_a = fieldNode.arguments) == null ? void 0 : _a.map((argument) => [argument.name.value, argument])) || []
|
84
86
|
);
|
85
87
|
const hasForwardPagination = !!(args.first && args.after);
|
86
88
|
const hasBackwardPagination = !!(args.last && args.before);
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { Kind } from "graphql";
|
2
3
|
const MUST_BE_OBJECT_TYPE = "MUST_BE_OBJECT_TYPE";
|
3
4
|
const MUST_CONTAIN_FIELD_EDGES = "MUST_CONTAIN_FIELD_EDGES";
|
@@ -17,8 +18,14 @@ const NON_OBJECT_TYPES = [
|
|
17
18
|
Kind.INTERFACE_TYPE_EXTENSION
|
18
19
|
];
|
19
20
|
const notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`;
|
20
|
-
const hasEdgesField = (node) =>
|
21
|
-
|
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
|
+
};
|
22
29
|
const rule = {
|
23
30
|
meta: {
|
24
31
|
type: "problem",
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { getDocumentNodeFromSchema } from "@graphql-tools/utils";
|
2
3
|
import {
|
3
4
|
isObjectType,
|
@@ -19,12 +20,13 @@ function getEdgeTypes(schema2) {
|
|
19
20
|
const edgeTypes = /* @__PURE__ */ new Set();
|
20
21
|
const visitor = {
|
21
22
|
ObjectTypeDefinition(node) {
|
23
|
+
var _a;
|
22
24
|
const typeName = node.name.value;
|
23
25
|
const hasConnectionSuffix = typeName.endsWith("Connection");
|
24
26
|
if (!hasConnectionSuffix) {
|
25
27
|
return;
|
26
28
|
}
|
27
|
-
const edges = node.fields
|
29
|
+
const edges = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "edges");
|
28
30
|
if (edges) {
|
29
31
|
const edgesTypeName = getTypeName(edges);
|
30
32
|
const edgesType = schema2.getType(edgesTypeName);
|
@@ -118,7 +120,8 @@ const rule = {
|
|
118
120
|
};
|
119
121
|
const isNamedOrNonNullNamed = (node) => node.kind === Kind.NAMED_TYPE || node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.NAMED_TYPE;
|
120
122
|
const checkNodeField = (node) => {
|
121
|
-
|
123
|
+
var _a, _b;
|
124
|
+
const nodeField = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "node");
|
122
125
|
const message = "return either a Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types.";
|
123
126
|
if (!nodeField) {
|
124
127
|
context.report({
|
@@ -133,14 +136,15 @@ const rule = {
|
|
133
136
|
if (!isObjectType(type)) {
|
134
137
|
return;
|
135
138
|
}
|
136
|
-
const implementsNode = type.astNode.interfaces
|
139
|
+
const implementsNode = (_b = type.astNode.interfaces) == null ? void 0 : _b.some((n) => n.name.value === "Node");
|
137
140
|
if (!implementsNode) {
|
138
141
|
context.report({ node: node.name, messageId: MESSAGE_SHOULD_IMPLEMENTS_NODE });
|
139
142
|
}
|
140
143
|
}
|
141
144
|
};
|
142
145
|
const checkCursorField = (node) => {
|
143
|
-
|
146
|
+
var _a;
|
147
|
+
const cursorField = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "cursor");
|
144
148
|
const message = "return either a String, Scalar, or a non-null wrapper wrapper around one of those types.";
|
145
149
|
if (!cursorField) {
|
146
150
|
context.report({
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { isScalarType, Kind } from "graphql";
|
2
3
|
import { REPORT_ON_FIRST_CHARACTER, requireGraphQLSchemaFromContext } from "../utils.js";
|
3
4
|
import { NON_OBJECT_TYPES } from "./relay-connection-types.js";
|
@@ -61,8 +62,9 @@ const rule = {
|
|
61
62
|
context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
|
62
63
|
},
|
63
64
|
"ObjectTypeDefinition[name.value=PageInfo]"(node) {
|
65
|
+
var _a;
|
64
66
|
const fieldMap = Object.fromEntries(
|
65
|
-
node.fields
|
67
|
+
((_a = node.fields) == null ? void 0 : _a.map((field) => [field.name.value, field])) || []
|
66
68
|
);
|
67
69
|
const checkField = (fieldName, typeName) => {
|
68
70
|
const field = fieldMap[fieldName];
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { valueFromNode } from "../estree-converter/index.js";
|
2
3
|
import { getNodeName } from "../utils.js";
|
3
4
|
const DATE_REGEX = /^\d{2}\/\d{2}\/\d{4}$/;
|
@@ -77,8 +78,9 @@ const rule = {
|
|
77
78
|
create(context) {
|
78
79
|
return {
|
79
80
|
"Directive[name.value=deprecated]"(node) {
|
80
|
-
|
81
|
-
const
|
81
|
+
var _a, _b;
|
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);
|
82
84
|
if (!deletionDateNode) {
|
83
85
|
context.report({
|
84
86
|
node: node.name,
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { valueFromNode } from "../estree-converter/index.js";
|
2
3
|
import { getNodeName } from "../utils.js";
|
3
4
|
const rule = {
|
@@ -49,7 +50,8 @@ const rule = {
|
|
49
50
|
create(context) {
|
50
51
|
return {
|
51
52
|
"Directive[name.value=deprecated]"(node) {
|
52
|
-
|
53
|
+
var _a;
|
54
|
+
const reasonArgument = (_a = node.arguments) == null ? void 0 : _a.find(
|
53
55
|
(arg) => arg.name.value === "reason"
|
54
56
|
);
|
55
57
|
const value = reasonArgument && String(valueFromNode(reasonArgument.value)).trim();
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { getRootTypeNames } from "@graphql-tools/utils";
|
2
3
|
import { Kind, TokenKind } from "graphql";
|
3
4
|
import {
|
@@ -150,12 +151,13 @@ const rule = {
|
|
150
151
|
const selector = [...kinds].join(",");
|
151
152
|
return {
|
152
153
|
[selector](node) {
|
154
|
+
var _a;
|
153
155
|
let description = "";
|
154
156
|
const isOperation = node.kind === Kind.OPERATION_DEFINITION;
|
155
157
|
if (isOperation) {
|
156
158
|
const rawNode = node.rawNode();
|
157
159
|
const { prev, line } = rawNode.loc.startToken;
|
158
|
-
if (prev
|
160
|
+
if ((prev == null ? void 0 : prev.kind) === TokenKind.COMMENT) {
|
159
161
|
const value = prev.value.trim();
|
160
162
|
const linesBefore = line - prev.line;
|
161
163
|
if (!value.startsWith("eslint") && linesBefore === 1) {
|
@@ -163,7 +165,7 @@ const rule = {
|
|
163
165
|
}
|
164
166
|
}
|
165
167
|
} else {
|
166
|
-
description = node.description
|
168
|
+
description = ((_a = node.description) == null ? void 0 : _a.value.trim()) || "";
|
167
169
|
}
|
168
170
|
if (description.length === 0) {
|
169
171
|
context.report({
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { isObjectType } from "graphql";
|
2
3
|
import { getTypeName, requireGraphQLSchemaFromContext } from "../utils.js";
|
3
4
|
const RULE_ID = "require-field-of-type-query-in-mutation-result";
|
@@ -61,7 +62,7 @@ const rule = {
|
|
61
62
|
const graphQLType = schema.getType(typeName);
|
62
63
|
if (isObjectType(graphQLType)) {
|
63
64
|
const { fields } = graphQLType.astNode;
|
64
|
-
const hasQueryType = fields
|
65
|
+
const hasQueryType = fields == null ? void 0 : fields.some((field) => getTypeName(field) === queryType.name);
|
65
66
|
if (!hasQueryType) {
|
66
67
|
context.report({
|
67
68
|
node,
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import path from "path";
|
2
3
|
import { requireSiblingsOperations } from "../utils.js";
|
3
4
|
const RULE_ID = "require-import-fragment";
|
@@ -82,6 +83,7 @@ const rule = {
|
|
82
83
|
const filePath = context.getFilename();
|
83
84
|
return {
|
84
85
|
"FragmentSpread > .name"(node) {
|
86
|
+
var _a;
|
85
87
|
const fragmentName = node.value;
|
86
88
|
const fragmentsFromSiblings = siblings.getFragment(fragmentName);
|
87
89
|
for (const comment of comments) {
|
@@ -92,7 +94,7 @@ const rule = {
|
|
92
94
|
).test(comment.value);
|
93
95
|
if (!isPossibleImported)
|
94
96
|
continue;
|
95
|
-
const extractedImportPath = comment.value.match(/(["'])((?:\1|.)*?)\1/)
|
97
|
+
const extractedImportPath = (_a = comment.value.match(/(["'])((?:\1|.)*?)\1/)) == null ? void 0 : _a[2];
|
96
98
|
if (!extractedImportPath)
|
97
99
|
continue;
|
98
100
|
const importPath = path.join(path.dirname(filePath), extractedImportPath);
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { Kind } from "graphql";
|
2
3
|
import { getNodeName, requireGraphQLSchemaFromContext, truthy } from "../utils.js";
|
3
4
|
const RULE_ID = "require-nullable-result-in-root";
|
@@ -57,7 +58,7 @@ const rule = {
|
|
57
58
|
continue;
|
58
59
|
const name = field.gqlType.gqlType.name.value;
|
59
60
|
const type = schema.getType(name);
|
60
|
-
const resultType = type
|
61
|
+
const resultType = (type == null ? void 0 : type.astNode) ? getNodeName(type.astNode) : type == null ? void 0 : type.name;
|
61
62
|
context.report({
|
62
63
|
node: field.gqlType,
|
63
64
|
messageId: RULE_ID,
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import "../chunk-BMTV3EA2.js";
|
1
2
|
import { displayNodeName } from "../utils.js";
|
2
3
|
const RULE_ID = "require-type-pattern-with-oneof";
|
3
4
|
const rule = {
|
@@ -44,9 +45,10 @@ const rule = {
|
|
44
45
|
"Directive[name.value=oneOf][parent.kind=ObjectTypeDefinition]"({
|
45
46
|
parent
|
46
47
|
}) {
|
48
|
+
var _a;
|
47
49
|
const requiredFields = ["error", "ok"];
|
48
50
|
for (const fieldName of requiredFields) {
|
49
|
-
if (!parent.fields
|
51
|
+
if (!((_a = parent.fields) == null ? void 0 : _a.some((field) => field.name.value === fieldName))) {
|
50
52
|
context.report({
|
51
53
|
node: parent.name,
|
52
54
|
messageId: RULE_ID,
|