@graphql-eslint/eslint-plugin 4.0.0-alpha.7 → 4.0.0-alpha.9
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 -1
- package/cjs/documents.js +8 -3
- package/cjs/meta.js +1 -1
- package/cjs/rules/alphabetize/index.d.cts +1 -1
- package/cjs/rules/alphabetize/index.js +27 -11
- package/cjs/rules/require-import-fragment/index.js +7 -2
- package/cjs/utils.js +38 -15
- package/esm/configs/operations-all.js +1 -1
- package/esm/documents.js +8 -3
- package/esm/meta.js +1 -1
- package/esm/rules/alphabetize/index.d.ts +1 -1
- package/esm/rules/alphabetize/index.js +24 -8
- package/esm/rules/require-import-fragment/index.js +8 -3
- package/esm/utils.js +38 -15
- package/index.browser.js +70 -26
- package/package.json +1 -1
@@ -13,7 +13,7 @@ var require_operations_all = _chunkUIAXBAMDjs.__commonJS.call(void 0, {
|
|
13
13
|
selections: ["OperationDefinition", "FragmentDefinition"],
|
14
14
|
variables: !0,
|
15
15
|
arguments: ["Field", "Directive"],
|
16
|
-
groups: ["
|
16
|
+
groups: ["...", "id", "*", "{"]
|
17
17
|
}
|
18
18
|
],
|
19
19
|
"@graphql-eslint/lone-executable-definition": "error",
|
package/cjs/documents.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }require('./chunk-UIAXBAMD.js');
|
2
|
-
var _nodepath = require('node:path');
|
2
|
+
var _nodepath = require('node:path'); var _nodepath2 = _interopRequireDefault(_nodepath);
|
3
3
|
var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug);
|
4
4
|
var _fastglob = require('fast-glob'); var _fastglob2 = _interopRequireDefault(_fastglob);
|
5
5
|
var _cachejs = require('./cache.js');
|
@@ -8,12 +8,17 @@ const debug = _debug2.default.call(void 0, "graphql-eslint:operations"), operati
|
|
8
8
|
return documents.map((source) => {
|
9
9
|
const location = source.location;
|
10
10
|
if ([".gql", ".graphql"].some((extension) => location.endsWith(extension)))
|
11
|
-
return
|
11
|
+
return {
|
12
|
+
...source,
|
13
|
+
// When using glob pattern e.g. `**/*.gql` location contains always forward slashes even on
|
14
|
+
// Windows
|
15
|
+
location: _nodepath2.default.resolve(location)
|
16
|
+
};
|
12
17
|
filepathMap[location] ??= -1;
|
13
18
|
const index = filepathMap[location] += 1;
|
14
19
|
return {
|
15
20
|
...source,
|
16
|
-
location:
|
21
|
+
location: _nodepath2.default.resolve(location, `${index}_document.graphql`)
|
17
22
|
};
|
18
23
|
});
|
19
24
|
}, getDocuments = exports.getDocuments = (project) => {
|
package/cjs/meta.js
CHANGED
@@ -58,7 +58,7 @@ declare const schema: {
|
|
58
58
|
};
|
59
59
|
readonly groups: {
|
60
60
|
readonly minItems: 2;
|
61
|
-
readonly description:
|
61
|
+
readonly description: string;
|
62
62
|
readonly type: "array";
|
63
63
|
readonly uniqueItems: true;
|
64
64
|
readonly items: {
|
@@ -61,7 +61,14 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
61
61
|
groups: {
|
62
62
|
..._utilsjs.ARRAY_DEFAULT_OPTIONS,
|
63
63
|
minItems: 2,
|
64
|
-
description:
|
64
|
+
description: [
|
65
|
+
"Order group. Example: `['...', 'id', '*', '{']` where:",
|
66
|
+
"- `...` stands for fragment spreads",
|
67
|
+
"- `id` stands for field with name `id`",
|
68
|
+
"- `*` stands for everything else",
|
69
|
+
"- `{` stands for fields `selection set`"
|
70
|
+
].join(`
|
71
|
+
`)
|
65
72
|
}
|
66
73
|
}
|
67
74
|
}
|
@@ -183,7 +190,7 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
183
190
|
selections: selectionsEnum,
|
184
191
|
variables: !0,
|
185
192
|
arguments: [_graphql.Kind.FIELD, _graphql.Kind.DIRECTIVE],
|
186
|
-
groups: ["
|
193
|
+
groups: ["...", "id", "*", "{"]
|
187
194
|
}
|
188
195
|
]
|
189
196
|
}
|
@@ -221,20 +228,18 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
221
228
|
}
|
222
229
|
function checkNodes(nodes = []) {
|
223
230
|
for (let i = 1; i < nodes.length; i += 1) {
|
224
|
-
const currNode = nodes[i], currName =
|
231
|
+
const currNode = nodes[i], currName = getName(currNode);
|
225
232
|
if (!currName)
|
226
233
|
continue;
|
227
|
-
const prevNode = nodes[i - 1], prevName =
|
234
|
+
const prevNode = nodes[i - 1], prevName = getName(prevNode);
|
228
235
|
if (prevName) {
|
229
236
|
const compareResult = prevName.localeCompare(currName), { groups } = opts;
|
230
237
|
let shouldSortByGroup = !1;
|
231
|
-
if (_optionalChain([groups, 'optionalAccess',
|
238
|
+
if (_optionalChain([groups, 'optionalAccess', _ => _.length])) {
|
232
239
|
if (!groups.includes("*"))
|
233
240
|
throw new Error("`groups` option should contain `*` string.");
|
234
|
-
|
235
|
-
indexForPrev
|
236
|
-
let indexForCurr = groups.indexOf(currName);
|
237
|
-
if (indexForCurr === -1 && (indexForCurr = groups.indexOf("*")), shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
|
241
|
+
const indexForPrev = getIndex({ node: prevNode, groups }), indexForCurr = getIndex({ node: currNode, groups });
|
242
|
+
if (shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
|
238
243
|
continue;
|
239
244
|
}
|
240
245
|
if (!shouldSortByGroup && !(compareResult === 1) && (!(compareResult === 0) || !prevNode.kind.endsWith("Extension") || currNode.kind.endsWith("Extension")))
|
@@ -274,7 +279,7 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
274
279
|
_graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION,
|
275
280
|
_graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION
|
276
281
|
]
|
277
|
-
].filter(_utilsjs.truthy).flat().join(","), selectionsSelector = _optionalChain([opts, 'access',
|
282
|
+
].filter(_utilsjs.truthy).flat().join(","), selectionsSelector = _optionalChain([opts, 'access', _2 => _2.selections, 'optionalAccess', _3 => _3.join, 'call', _4 => _4(",")]), argumentsSelector = _optionalChain([opts, 'access', _5 => _5.arguments, 'optionalAccess', _6 => _6.join, 'call', _7 => _7(",")]);
|
278
283
|
if (fieldsSelector && (listeners[fieldsSelector] = (node) => {
|
279
284
|
checkNodes(node.fields);
|
280
285
|
}), opts.values) {
|
@@ -286,7 +291,7 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
286
291
|
return selectionsSelector && (listeners[`:matches(${selectionsSelector}) SelectionSet`] = (node) => {
|
287
292
|
checkNodes(node.selections);
|
288
293
|
}), opts.variables && (listeners.OperationDefinition = (node) => {
|
289
|
-
checkNodes(_optionalChain([node, 'access',
|
294
|
+
checkNodes(_optionalChain([node, 'access', _8 => _8.variableDefinitions, 'optionalAccess', _9 => _9.map, 'call', _10 => _10((varDef) => varDef.variable)]));
|
290
295
|
}), argumentsSelector && (listeners[argumentsSelector] = (node) => {
|
291
296
|
checkNodes(node.arguments);
|
292
297
|
}), opts.definitions && (listeners.Document = (node) => {
|
@@ -294,6 +299,17 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
294
299
|
}), listeners;
|
295
300
|
}
|
296
301
|
};
|
302
|
+
function getIndex({
|
303
|
+
node,
|
304
|
+
groups
|
305
|
+
}) {
|
306
|
+
let index = groups.indexOf(getName(node));
|
307
|
+
return index === -1 && "selectionSet" in node && node.selectionSet && (index = groups.indexOf("{")), index === -1 && node.kind === _graphql.Kind.FRAGMENT_SPREAD && (index = groups.indexOf("...")), index === -1 && (index = groups.indexOf("*")), index;
|
308
|
+
}
|
309
|
+
function getName(node) {
|
310
|
+
return "alias" in node && _optionalChain([node, 'access', _11 => _11.alias, 'optionalAccess', _12 => _12.value]) || //
|
311
|
+
"name" in node && _optionalChain([node, 'access', _13 => _13.name, 'optionalAccess', _14 => _14.value]) || "";
|
312
|
+
}
|
297
313
|
|
298
314
|
|
299
315
|
exports.rule = rule;
|
@@ -85,7 +85,7 @@ const RULE_ID = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
|
|
85
85
|
).test(comment.value)) continue;
|
86
86
|
const extractedImportPath = _optionalChain([comment, 'access', _ => _.value, 'access', _2 => _2.match, 'call', _3 => _3(/(["'])((?:\1|.)*?)\1/), 'optionalAccess', _4 => _4[2]]);
|
87
87
|
if (!extractedImportPath) continue;
|
88
|
-
const importPath = _nodepath2.default.join(
|
88
|
+
const importPath = _nodepath2.default.join(filePath, "..", extractedImportPath);
|
89
89
|
if (fragmentsFromSiblings.some(
|
90
90
|
(source) => source.filePath === importPath
|
91
91
|
)) return;
|
@@ -93,7 +93,12 @@ const RULE_ID = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
|
|
93
93
|
if (fragmentsFromSiblings.some(
|
94
94
|
(source) => source.filePath === filePath
|
95
95
|
)) return;
|
96
|
-
const suggestedFilePaths = fragmentsFromSiblings.length ? fragmentsFromSiblings.map(
|
96
|
+
const suggestedFilePaths = fragmentsFromSiblings.length ? fragmentsFromSiblings.map(
|
97
|
+
(o) => (
|
98
|
+
// Use always forward slash for suggested import path
|
99
|
+
_utilsjs.slash.call(void 0, _nodepath2.default.relative(_nodepath2.default.dirname(filePath), o.filePath))
|
100
|
+
)
|
101
|
+
) : ["CHANGE_ME.graphql"];
|
97
102
|
context.report({
|
98
103
|
node,
|
99
104
|
messageId: RULE_ID,
|
package/cjs/utils.js
CHANGED
@@ -29,7 +29,7 @@ const chalk = {
|
|
29
29
|
// eslint-disable-next-line no-console
|
30
30
|
console.warn(chalk.yellow("warning"), "[graphql-eslint]", ...args)
|
31
31
|
)
|
32
|
-
}, slash = exports.slash = (path) => path.replaceAll("\\", "/"), VIRTUAL_DOCUMENT_REGEX = exports.VIRTUAL_DOCUMENT_REGEX = /[
|
32
|
+
}, slash = exports.slash = (path) => path.replaceAll("\\", "/"), VIRTUAL_DOCUMENT_REGEX = exports.VIRTUAL_DOCUMENT_REGEX = /[/\\]\d+_document.graphql$/, CWD = exports.CWD = process.cwd(), getTypeName = exports.getTypeName = (node) => "type" in node ? getTypeName(node.type) : "name" in node && node.name ? node.name.value : "", TYPES_KINDS = exports.TYPES_KINDS = [
|
33
33
|
_graphql.Kind.OBJECT_TYPE_DEFINITION,
|
34
34
|
_graphql.Kind.INTERFACE_TYPE_DEFINITION,
|
35
35
|
_graphql.Kind.ENUM_TYPE_DEFINITION,
|
@@ -78,26 +78,49 @@ function truthy(value) {
|
|
78
78
|
return !!value;
|
79
79
|
}
|
80
80
|
const DisplayNodeNameMap = {
|
81
|
-
[_graphql.Kind.
|
82
|
-
[_graphql.Kind.
|
83
|
-
[_graphql.Kind.
|
84
|
-
[_graphql.Kind.
|
81
|
+
[_graphql.Kind.ARGUMENT]: "argument",
|
82
|
+
[_graphql.Kind.BOOLEAN]: "boolean",
|
83
|
+
[_graphql.Kind.DIRECTIVE_DEFINITION]: "directive",
|
84
|
+
[_graphql.Kind.DIRECTIVE]: "directive",
|
85
|
+
[_graphql.Kind.DOCUMENT]: "document",
|
85
86
|
[_graphql.Kind.ENUM_TYPE_DEFINITION]: "enum",
|
86
87
|
[_graphql.Kind.ENUM_TYPE_EXTENSION]: "enum",
|
87
|
-
[_graphql.Kind.
|
88
|
+
[_graphql.Kind.ENUM_VALUE_DEFINITION]: "enum value",
|
89
|
+
[_graphql.Kind.ENUM]: "enum",
|
90
|
+
[_graphql.Kind.FIELD_DEFINITION]: "field",
|
91
|
+
[_graphql.Kind.FIELD]: "field",
|
92
|
+
[_graphql.Kind.FLOAT]: "float",
|
93
|
+
[_graphql.Kind.FRAGMENT_DEFINITION]: "fragment",
|
94
|
+
[_graphql.Kind.FRAGMENT_SPREAD]: "fragment spread",
|
95
|
+
[_graphql.Kind.INLINE_FRAGMENT]: "inline fragment",
|
88
96
|
[_graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION]: "input",
|
89
97
|
[_graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION]: "input",
|
90
|
-
[_graphql.Kind.UNION_TYPE_DEFINITION]: "union",
|
91
|
-
[_graphql.Kind.UNION_TYPE_EXTENSION]: "union",
|
92
|
-
[_graphql.Kind.DIRECTIVE_DEFINITION]: "directive",
|
93
|
-
[_graphql.Kind.FIELD_DEFINITION]: "field",
|
94
|
-
[_graphql.Kind.ENUM_VALUE_DEFINITION]: "enum value",
|
95
98
|
[_graphql.Kind.INPUT_VALUE_DEFINITION]: "input value",
|
96
|
-
[_graphql.Kind.
|
97
|
-
[_graphql.Kind.
|
98
|
-
[_graphql.Kind.
|
99
|
+
[_graphql.Kind.INT]: "int",
|
100
|
+
[_graphql.Kind.INTERFACE_TYPE_DEFINITION]: "interface",
|
101
|
+
[_graphql.Kind.INTERFACE_TYPE_EXTENSION]: "interface",
|
102
|
+
[_graphql.Kind.LIST_TYPE]: "list type",
|
103
|
+
[_graphql.Kind.LIST]: "list",
|
104
|
+
[_graphql.Kind.NAME]: "name",
|
105
|
+
[_graphql.Kind.NAMED_TYPE]: "named type",
|
106
|
+
[_graphql.Kind.NON_NULL_TYPE]: "non-null type",
|
107
|
+
[_graphql.Kind.NULL]: "null",
|
108
|
+
[_graphql.Kind.OBJECT_FIELD]: "object field",
|
109
|
+
[_graphql.Kind.OBJECT_TYPE_DEFINITION]: "type",
|
110
|
+
[_graphql.Kind.OBJECT_TYPE_EXTENSION]: "type",
|
111
|
+
[_graphql.Kind.OBJECT]: "object",
|
99
112
|
[_graphql.Kind.OPERATION_DEFINITION]: "operation",
|
100
|
-
[_graphql.Kind.
|
113
|
+
[_graphql.Kind.OPERATION_TYPE_DEFINITION]: "operation type",
|
114
|
+
[_graphql.Kind.SCALAR_TYPE_DEFINITION]: "scalar",
|
115
|
+
[_graphql.Kind.SCALAR_TYPE_EXTENSION]: "scalar",
|
116
|
+
[_graphql.Kind.SCHEMA_DEFINITION]: "schema",
|
117
|
+
[_graphql.Kind.SCHEMA_EXTENSION]: "schema",
|
118
|
+
[_graphql.Kind.SELECTION_SET]: "selection set",
|
119
|
+
[_graphql.Kind.STRING]: "string",
|
120
|
+
[_graphql.Kind.UNION_TYPE_DEFINITION]: "union",
|
121
|
+
[_graphql.Kind.UNION_TYPE_EXTENSION]: "union",
|
122
|
+
[_graphql.Kind.VARIABLE_DEFINITION]: "variable",
|
123
|
+
[_graphql.Kind.VARIABLE]: "variable"
|
101
124
|
};
|
102
125
|
function displayNodeName(node) {
|
103
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])}"`;
|
@@ -13,7 +13,7 @@ var require_operations_all = __commonJS({
|
|
13
13
|
selections: ["OperationDefinition", "FragmentDefinition"],
|
14
14
|
variables: !0,
|
15
15
|
arguments: ["Field", "Directive"],
|
16
|
-
groups: ["
|
16
|
+
groups: ["...", "id", "*", "{"]
|
17
17
|
}
|
18
18
|
],
|
19
19
|
"@graphql-eslint/lone-executable-definition": "error",
|
package/esm/documents.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import "./chunk-UIAXBAMD.js";
|
2
|
-
import
|
2
|
+
import path from "node:path";
|
3
3
|
import debugFactory from "debug";
|
4
4
|
import fg from "fast-glob";
|
5
5
|
import { ModuleCache } from "./cache.js";
|
@@ -8,12 +8,17 @@ const debug = debugFactory("graphql-eslint:operations"), operationsCache = new M
|
|
8
8
|
return documents.map((source) => {
|
9
9
|
const location = source.location;
|
10
10
|
if ([".gql", ".graphql"].some((extension) => location.endsWith(extension)))
|
11
|
-
return
|
11
|
+
return {
|
12
|
+
...source,
|
13
|
+
// When using glob pattern e.g. `**/*.gql` location contains always forward slashes even on
|
14
|
+
// Windows
|
15
|
+
location: path.resolve(location)
|
16
|
+
};
|
12
17
|
filepathMap[location] ??= -1;
|
13
18
|
const index = filepathMap[location] += 1;
|
14
19
|
return {
|
15
20
|
...source,
|
16
|
-
location: resolve(location, `${index}_document.graphql`)
|
21
|
+
location: path.resolve(location, `${index}_document.graphql`)
|
17
22
|
};
|
18
23
|
});
|
19
24
|
}, getDocuments = (project) => {
|
package/esm/meta.js
CHANGED
@@ -58,7 +58,7 @@ declare const schema: {
|
|
58
58
|
};
|
59
59
|
readonly groups: {
|
60
60
|
readonly minItems: 2;
|
61
|
-
readonly description:
|
61
|
+
readonly description: string;
|
62
62
|
readonly type: "array";
|
63
63
|
readonly uniqueItems: true;
|
64
64
|
readonly items: {
|
@@ -61,7 +61,14 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
61
61
|
groups: {
|
62
62
|
...ARRAY_DEFAULT_OPTIONS,
|
63
63
|
minItems: 2,
|
64
|
-
description:
|
64
|
+
description: [
|
65
|
+
"Order group. Example: `['...', 'id', '*', '{']` where:",
|
66
|
+
"- `...` stands for fragment spreads",
|
67
|
+
"- `id` stands for field with name `id`",
|
68
|
+
"- `*` stands for everything else",
|
69
|
+
"- `{` stands for fields `selection set`"
|
70
|
+
].join(`
|
71
|
+
`)
|
65
72
|
}
|
66
73
|
}
|
67
74
|
}
|
@@ -183,7 +190,7 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
183
190
|
selections: selectionsEnum,
|
184
191
|
variables: !0,
|
185
192
|
arguments: [Kind.FIELD, Kind.DIRECTIVE],
|
186
|
-
groups: ["
|
193
|
+
groups: ["...", "id", "*", "{"]
|
187
194
|
}
|
188
195
|
]
|
189
196
|
}
|
@@ -221,20 +228,18 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
221
228
|
}
|
222
229
|
function checkNodes(nodes = []) {
|
223
230
|
for (let i = 1; i < nodes.length; i += 1) {
|
224
|
-
const currNode = nodes[i], currName =
|
231
|
+
const currNode = nodes[i], currName = getName(currNode);
|
225
232
|
if (!currName)
|
226
233
|
continue;
|
227
|
-
const prevNode = nodes[i - 1], prevName =
|
234
|
+
const prevNode = nodes[i - 1], prevName = getName(prevNode);
|
228
235
|
if (prevName) {
|
229
236
|
const compareResult = prevName.localeCompare(currName), { groups } = opts;
|
230
237
|
let shouldSortByGroup = !1;
|
231
238
|
if (groups?.length) {
|
232
239
|
if (!groups.includes("*"))
|
233
240
|
throw new Error("`groups` option should contain `*` string.");
|
234
|
-
|
235
|
-
indexForPrev
|
236
|
-
let indexForCurr = groups.indexOf(currName);
|
237
|
-
if (indexForCurr === -1 && (indexForCurr = groups.indexOf("*")), shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
|
241
|
+
const indexForPrev = getIndex({ node: prevNode, groups }), indexForCurr = getIndex({ node: currNode, groups });
|
242
|
+
if (shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
|
238
243
|
continue;
|
239
244
|
}
|
240
245
|
if (!shouldSortByGroup && !(compareResult === 1) && (!(compareResult === 0) || !prevNode.kind.endsWith("Extension") || currNode.kind.endsWith("Extension")))
|
@@ -294,6 +299,17 @@ const RULE_ID = "alphabetize", fieldsEnum = [
|
|
294
299
|
}), listeners;
|
295
300
|
}
|
296
301
|
};
|
302
|
+
function getIndex({
|
303
|
+
node,
|
304
|
+
groups
|
305
|
+
}) {
|
306
|
+
let index = groups.indexOf(getName(node));
|
307
|
+
return index === -1 && "selectionSet" in node && node.selectionSet && (index = groups.indexOf("{")), index === -1 && node.kind === Kind.FRAGMENT_SPREAD && (index = groups.indexOf("...")), index === -1 && (index = groups.indexOf("*")), index;
|
308
|
+
}
|
309
|
+
function getName(node) {
|
310
|
+
return "alias" in node && node.alias?.value || //
|
311
|
+
"name" in node && node.name?.value || "";
|
312
|
+
}
|
297
313
|
export {
|
298
314
|
rule
|
299
315
|
};
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import "../../chunk-UIAXBAMD.js";
|
2
2
|
import path from "node:path";
|
3
|
-
import { requireSiblingsOperations } from "../../utils.js";
|
3
|
+
import { requireSiblingsOperations, slash } from "../../utils.js";
|
4
4
|
const RULE_ID = "require-import-fragment", SUGGESTION_ID = "add-import-expression", rule = {
|
5
5
|
meta: {
|
6
6
|
type: "suggestion",
|
@@ -85,7 +85,7 @@ const RULE_ID = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
|
|
85
85
|
).test(comment.value)) continue;
|
86
86
|
const extractedImportPath = comment.value.match(/(["'])((?:\1|.)*?)\1/)?.[2];
|
87
87
|
if (!extractedImportPath) continue;
|
88
|
-
const importPath = path.join(
|
88
|
+
const importPath = path.join(filePath, "..", extractedImportPath);
|
89
89
|
if (fragmentsFromSiblings.some(
|
90
90
|
(source) => source.filePath === importPath
|
91
91
|
)) return;
|
@@ -93,7 +93,12 @@ const RULE_ID = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
|
|
93
93
|
if (fragmentsFromSiblings.some(
|
94
94
|
(source) => source.filePath === filePath
|
95
95
|
)) return;
|
96
|
-
const suggestedFilePaths = fragmentsFromSiblings.length ? fragmentsFromSiblings.map(
|
96
|
+
const suggestedFilePaths = fragmentsFromSiblings.length ? fragmentsFromSiblings.map(
|
97
|
+
(o) => (
|
98
|
+
// Use always forward slash for suggested import path
|
99
|
+
slash(path.relative(path.dirname(filePath), o.filePath))
|
100
|
+
)
|
101
|
+
) : ["CHANGE_ME.graphql"];
|
97
102
|
context.report({
|
98
103
|
node,
|
99
104
|
messageId: RULE_ID,
|
package/esm/utils.js
CHANGED
@@ -29,7 +29,7 @@ const chalk = {
|
|
29
29
|
// eslint-disable-next-line no-console
|
30
30
|
console.warn(chalk.yellow("warning"), "[graphql-eslint]", ...args)
|
31
31
|
)
|
32
|
-
}, slash = (path) => path.replaceAll("\\", "/"), VIRTUAL_DOCUMENT_REGEX = /[
|
32
|
+
}, slash = (path) => path.replaceAll("\\", "/"), VIRTUAL_DOCUMENT_REGEX = /[/\\]\d+_document.graphql$/, CWD = process.cwd(), getTypeName = (node) => "type" in node ? getTypeName(node.type) : "name" in node && node.name ? node.name.value : "", TYPES_KINDS = [
|
33
33
|
Kind.OBJECT_TYPE_DEFINITION,
|
34
34
|
Kind.INTERFACE_TYPE_DEFINITION,
|
35
35
|
Kind.ENUM_TYPE_DEFINITION,
|
@@ -78,26 +78,49 @@ function truthy(value) {
|
|
78
78
|
return !!value;
|
79
79
|
}
|
80
80
|
const DisplayNodeNameMap = {
|
81
|
-
[Kind.
|
82
|
-
[Kind.
|
83
|
-
[Kind.
|
84
|
-
[Kind.
|
81
|
+
[Kind.ARGUMENT]: "argument",
|
82
|
+
[Kind.BOOLEAN]: "boolean",
|
83
|
+
[Kind.DIRECTIVE_DEFINITION]: "directive",
|
84
|
+
[Kind.DIRECTIVE]: "directive",
|
85
|
+
[Kind.DOCUMENT]: "document",
|
85
86
|
[Kind.ENUM_TYPE_DEFINITION]: "enum",
|
86
87
|
[Kind.ENUM_TYPE_EXTENSION]: "enum",
|
87
|
-
[Kind.
|
88
|
+
[Kind.ENUM_VALUE_DEFINITION]: "enum value",
|
89
|
+
[Kind.ENUM]: "enum",
|
90
|
+
[Kind.FIELD_DEFINITION]: "field",
|
91
|
+
[Kind.FIELD]: "field",
|
92
|
+
[Kind.FLOAT]: "float",
|
93
|
+
[Kind.FRAGMENT_DEFINITION]: "fragment",
|
94
|
+
[Kind.FRAGMENT_SPREAD]: "fragment spread",
|
95
|
+
[Kind.INLINE_FRAGMENT]: "inline fragment",
|
88
96
|
[Kind.INPUT_OBJECT_TYPE_DEFINITION]: "input",
|
89
97
|
[Kind.INPUT_OBJECT_TYPE_EXTENSION]: "input",
|
90
|
-
[Kind.UNION_TYPE_DEFINITION]: "union",
|
91
|
-
[Kind.UNION_TYPE_EXTENSION]: "union",
|
92
|
-
[Kind.DIRECTIVE_DEFINITION]: "directive",
|
93
|
-
[Kind.FIELD_DEFINITION]: "field",
|
94
|
-
[Kind.ENUM_VALUE_DEFINITION]: "enum value",
|
95
98
|
[Kind.INPUT_VALUE_DEFINITION]: "input value",
|
96
|
-
[Kind.
|
97
|
-
[Kind.
|
98
|
-
[Kind.
|
99
|
+
[Kind.INT]: "int",
|
100
|
+
[Kind.INTERFACE_TYPE_DEFINITION]: "interface",
|
101
|
+
[Kind.INTERFACE_TYPE_EXTENSION]: "interface",
|
102
|
+
[Kind.LIST_TYPE]: "list type",
|
103
|
+
[Kind.LIST]: "list",
|
104
|
+
[Kind.NAME]: "name",
|
105
|
+
[Kind.NAMED_TYPE]: "named type",
|
106
|
+
[Kind.NON_NULL_TYPE]: "non-null type",
|
107
|
+
[Kind.NULL]: "null",
|
108
|
+
[Kind.OBJECT_FIELD]: "object field",
|
109
|
+
[Kind.OBJECT_TYPE_DEFINITION]: "type",
|
110
|
+
[Kind.OBJECT_TYPE_EXTENSION]: "type",
|
111
|
+
[Kind.OBJECT]: "object",
|
99
112
|
[Kind.OPERATION_DEFINITION]: "operation",
|
100
|
-
[Kind.
|
113
|
+
[Kind.OPERATION_TYPE_DEFINITION]: "operation type",
|
114
|
+
[Kind.SCALAR_TYPE_DEFINITION]: "scalar",
|
115
|
+
[Kind.SCALAR_TYPE_EXTENSION]: "scalar",
|
116
|
+
[Kind.SCHEMA_DEFINITION]: "schema",
|
117
|
+
[Kind.SCHEMA_EXTENSION]: "schema",
|
118
|
+
[Kind.SELECTION_SET]: "selection set",
|
119
|
+
[Kind.STRING]: "string",
|
120
|
+
[Kind.UNION_TYPE_DEFINITION]: "union",
|
121
|
+
[Kind.UNION_TYPE_EXTENSION]: "union",
|
122
|
+
[Kind.VARIABLE_DEFINITION]: "variable",
|
123
|
+
[Kind.VARIABLE]: "variable"
|
101
124
|
};
|
102
125
|
function displayNodeName(node) {
|
103
126
|
return `${node.kind === Kind.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && node.alias?.value || "name" in node && node.name?.value}"`;
|
package/index.browser.js
CHANGED
@@ -35,7 +35,7 @@ var require_operations_all = __commonJS({
|
|
35
35
|
selections: ["OperationDefinition", "FragmentDefinition"],
|
36
36
|
variables: !0,
|
37
37
|
arguments: ["Field", "Directive"],
|
38
|
-
groups: ["
|
38
|
+
groups: ["...", "id", "*", "{"]
|
39
39
|
}
|
40
40
|
],
|
41
41
|
"@graphql-eslint/lone-executable-definition": "error",
|
@@ -427,7 +427,7 @@ var chalk = {
|
|
427
427
|
// eslint-disable-next-line no-console
|
428
428
|
console.warn(chalk.yellow("warning"), "[graphql-eslint]", ...args)
|
429
429
|
)
|
430
|
-
}, slash = (path2) => path2.replaceAll("\\", "/"), VIRTUAL_DOCUMENT_REGEX = /[
|
430
|
+
}, slash = (path2) => path2.replaceAll("\\", "/"), VIRTUAL_DOCUMENT_REGEX = /[/\\]\d+_document.graphql$/, CWD = process.cwd(), getTypeName = (node) => "type" in node ? getTypeName(node.type) : "name" in node && node.name ? node.name.value : "", TYPES_KINDS = [
|
431
431
|
Kind2.OBJECT_TYPE_DEFINITION,
|
432
432
|
Kind2.INTERFACE_TYPE_DEFINITION,
|
433
433
|
Kind2.ENUM_TYPE_DEFINITION,
|
@@ -476,26 +476,49 @@ function truthy(value) {
|
|
476
476
|
return !!value;
|
477
477
|
}
|
478
478
|
var DisplayNodeNameMap = {
|
479
|
-
[Kind2.
|
480
|
-
[Kind2.
|
481
|
-
[Kind2.
|
482
|
-
[Kind2.
|
479
|
+
[Kind2.ARGUMENT]: "argument",
|
480
|
+
[Kind2.BOOLEAN]: "boolean",
|
481
|
+
[Kind2.DIRECTIVE_DEFINITION]: "directive",
|
482
|
+
[Kind2.DIRECTIVE]: "directive",
|
483
|
+
[Kind2.DOCUMENT]: "document",
|
483
484
|
[Kind2.ENUM_TYPE_DEFINITION]: "enum",
|
484
485
|
[Kind2.ENUM_TYPE_EXTENSION]: "enum",
|
485
|
-
[Kind2.
|
486
|
+
[Kind2.ENUM_VALUE_DEFINITION]: "enum value",
|
487
|
+
[Kind2.ENUM]: "enum",
|
488
|
+
[Kind2.FIELD_DEFINITION]: "field",
|
489
|
+
[Kind2.FIELD]: "field",
|
490
|
+
[Kind2.FLOAT]: "float",
|
491
|
+
[Kind2.FRAGMENT_DEFINITION]: "fragment",
|
492
|
+
[Kind2.FRAGMENT_SPREAD]: "fragment spread",
|
493
|
+
[Kind2.INLINE_FRAGMENT]: "inline fragment",
|
486
494
|
[Kind2.INPUT_OBJECT_TYPE_DEFINITION]: "input",
|
487
495
|
[Kind2.INPUT_OBJECT_TYPE_EXTENSION]: "input",
|
488
|
-
[Kind2.UNION_TYPE_DEFINITION]: "union",
|
489
|
-
[Kind2.UNION_TYPE_EXTENSION]: "union",
|
490
|
-
[Kind2.DIRECTIVE_DEFINITION]: "directive",
|
491
|
-
[Kind2.FIELD_DEFINITION]: "field",
|
492
|
-
[Kind2.ENUM_VALUE_DEFINITION]: "enum value",
|
493
496
|
[Kind2.INPUT_VALUE_DEFINITION]: "input value",
|
494
|
-
[Kind2.
|
495
|
-
[Kind2.
|
496
|
-
[Kind2.
|
497
|
+
[Kind2.INT]: "int",
|
498
|
+
[Kind2.INTERFACE_TYPE_DEFINITION]: "interface",
|
499
|
+
[Kind2.INTERFACE_TYPE_EXTENSION]: "interface",
|
500
|
+
[Kind2.LIST_TYPE]: "list type",
|
501
|
+
[Kind2.LIST]: "list",
|
502
|
+
[Kind2.NAME]: "name",
|
503
|
+
[Kind2.NAMED_TYPE]: "named type",
|
504
|
+
[Kind2.NON_NULL_TYPE]: "non-null type",
|
505
|
+
[Kind2.NULL]: "null",
|
506
|
+
[Kind2.OBJECT_FIELD]: "object field",
|
507
|
+
[Kind2.OBJECT_TYPE_DEFINITION]: "type",
|
508
|
+
[Kind2.OBJECT_TYPE_EXTENSION]: "type",
|
509
|
+
[Kind2.OBJECT]: "object",
|
497
510
|
[Kind2.OPERATION_DEFINITION]: "operation",
|
498
|
-
[Kind2.
|
511
|
+
[Kind2.OPERATION_TYPE_DEFINITION]: "operation type",
|
512
|
+
[Kind2.SCALAR_TYPE_DEFINITION]: "scalar",
|
513
|
+
[Kind2.SCALAR_TYPE_EXTENSION]: "scalar",
|
514
|
+
[Kind2.SCHEMA_DEFINITION]: "schema",
|
515
|
+
[Kind2.SCHEMA_EXTENSION]: "schema",
|
516
|
+
[Kind2.SELECTION_SET]: "selection set",
|
517
|
+
[Kind2.STRING]: "string",
|
518
|
+
[Kind2.UNION_TYPE_DEFINITION]: "union",
|
519
|
+
[Kind2.UNION_TYPE_EXTENSION]: "union",
|
520
|
+
[Kind2.VARIABLE_DEFINITION]: "variable",
|
521
|
+
[Kind2.VARIABLE]: "variable"
|
499
522
|
};
|
500
523
|
function displayNodeName(node) {
|
501
524
|
return `${node.kind === Kind2.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && node.alias?.value || "name" in node && node.name?.value}"`;
|
@@ -726,7 +749,14 @@ var RULE_ID = "alphabetize", fieldsEnum = [
|
|
726
749
|
groups: {
|
727
750
|
...ARRAY_DEFAULT_OPTIONS,
|
728
751
|
minItems: 2,
|
729
|
-
description:
|
752
|
+
description: [
|
753
|
+
"Order group. Example: `['...', 'id', '*', '{']` where:",
|
754
|
+
"- `...` stands for fragment spreads",
|
755
|
+
"- `id` stands for field with name `id`",
|
756
|
+
"- `*` stands for everything else",
|
757
|
+
"- `{` stands for fields `selection set`"
|
758
|
+
].join(`
|
759
|
+
`)
|
730
760
|
}
|
731
761
|
}
|
732
762
|
}
|
@@ -848,7 +878,7 @@ var RULE_ID = "alphabetize", fieldsEnum = [
|
|
848
878
|
selections: selectionsEnum,
|
849
879
|
variables: !0,
|
850
880
|
arguments: [Kind4.FIELD, Kind4.DIRECTIVE],
|
851
|
-
groups: ["
|
881
|
+
groups: ["...", "id", "*", "{"]
|
852
882
|
}
|
853
883
|
]
|
854
884
|
}
|
@@ -886,19 +916,17 @@ var RULE_ID = "alphabetize", fieldsEnum = [
|
|
886
916
|
}
|
887
917
|
function checkNodes(nodes = []) {
|
888
918
|
for (let i = 1; i < nodes.length; i += 1) {
|
889
|
-
let currNode = nodes[i], currName =
|
919
|
+
let currNode = nodes[i], currName = getName(currNode);
|
890
920
|
if (!currName)
|
891
921
|
continue;
|
892
|
-
let prevNode = nodes[i - 1], prevName =
|
922
|
+
let prevNode = nodes[i - 1], prevName = getName(prevNode);
|
893
923
|
if (prevName) {
|
894
924
|
let compareResult = prevName.localeCompare(currName), { groups } = opts, shouldSortByGroup = !1;
|
895
925
|
if (groups?.length) {
|
896
926
|
if (!groups.includes("*"))
|
897
927
|
throw new Error("`groups` option should contain `*` string.");
|
898
|
-
let indexForPrev = groups
|
899
|
-
indexForPrev
|
900
|
-
let indexForCurr = groups.indexOf(currName);
|
901
|
-
if (indexForCurr === -1 && (indexForCurr = groups.indexOf("*")), shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
|
928
|
+
let indexForPrev = getIndex({ node: prevNode, groups }), indexForCurr = getIndex({ node: currNode, groups });
|
929
|
+
if (shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
|
902
930
|
continue;
|
903
931
|
}
|
904
932
|
if (!shouldSortByGroup && !(compareResult === 1) && (!(compareResult === 0) || !prevNode.kind.endsWith("Extension") || currNode.kind.endsWith("Extension")))
|
@@ -958,6 +986,17 @@ var RULE_ID = "alphabetize", fieldsEnum = [
|
|
958
986
|
}), listeners;
|
959
987
|
}
|
960
988
|
};
|
989
|
+
function getIndex({
|
990
|
+
node,
|
991
|
+
groups
|
992
|
+
}) {
|
993
|
+
let index = groups.indexOf(getName(node));
|
994
|
+
return index === -1 && "selectionSet" in node && node.selectionSet && (index = groups.indexOf("{")), index === -1 && node.kind === Kind4.FRAGMENT_SPREAD && (index = groups.indexOf("...")), index === -1 && (index = groups.indexOf("*")), index;
|
995
|
+
}
|
996
|
+
function getName(node) {
|
997
|
+
return "alias" in node && node.alias?.value || //
|
998
|
+
"name" in node && node.name?.value || "";
|
999
|
+
}
|
961
1000
|
|
962
1001
|
// src/rules/description-style/index.ts
|
963
1002
|
var schema2 = {
|
@@ -4348,7 +4387,7 @@ var RULE_ID16 = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
|
|
4348
4387
|
).test(comment.value)) continue;
|
4349
4388
|
let extractedImportPath = comment.value.match(/(["'])((?:\1|.)*?)\1/)?.[2];
|
4350
4389
|
if (!extractedImportPath) continue;
|
4351
|
-
let importPath = path.join(
|
4390
|
+
let importPath = path.join(filePath, "..", extractedImportPath);
|
4352
4391
|
if (fragmentsFromSiblings.some(
|
4353
4392
|
(source) => source.filePath === importPath
|
4354
4393
|
)) return;
|
@@ -4356,7 +4395,12 @@ var RULE_ID16 = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
|
|
4356
4395
|
if (fragmentsFromSiblings.some(
|
4357
4396
|
(source) => source.filePath === filePath
|
4358
4397
|
)) return;
|
4359
|
-
let suggestedFilePaths = fragmentsFromSiblings.length ? fragmentsFromSiblings.map(
|
4398
|
+
let suggestedFilePaths = fragmentsFromSiblings.length ? fragmentsFromSiblings.map(
|
4399
|
+
(o) => (
|
4400
|
+
// Use always forward slash for suggested import path
|
4401
|
+
slash(path.relative(path.dirname(filePath), o.filePath))
|
4402
|
+
)
|
4403
|
+
) : ["CHANGE_ME.graphql"];
|
4360
4404
|
context.report({
|
4361
4405
|
node,
|
4362
4406
|
messageId: RULE_ID16,
|