@graphql-eslint/eslint-plugin 3.14.4-alpha-20230111223410-a558ee8 → 3.14.4-alpha-20230111225020-02d9c28
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +5 -288
- package/cjs/documents.js +2 -105
- package/cjs/graphql-config.js +1 -1
- package/cjs/parser.js +9 -3
- package/cjs/rules/alphabetize.js +1 -1
- package/cjs/rules/description-style.js +1 -1
- package/cjs/rules/graphql-js-validation.js +1 -1
- package/cjs/rules/input-name.js +4 -4
- package/cjs/rules/lone-executable-definition.js +1 -1
- package/cjs/rules/match-document-filename.js +2 -3
- package/cjs/rules/naming-convention.js +1 -1
- package/cjs/rules/no-anonymous-operations.js +1 -1
- package/cjs/rules/no-case-insensitive-enum-values-duplicates.js +1 -1
- package/cjs/rules/no-deprecated.js +1 -1
- package/cjs/rules/no-duplicate-fields.js +1 -1
- package/cjs/rules/no-hashtag-description.js +1 -1
- package/cjs/rules/no-one-place-fragments.js +1 -1
- package/cjs/rules/no-root-type.js +1 -1
- package/cjs/rules/no-scalar-result-type-on-mutation.js +1 -1
- package/cjs/rules/no-typename-prefix.js +1 -1
- package/cjs/rules/no-unreachable-types.js +1 -1
- package/cjs/rules/no-unused-fields.js +1 -1
- package/cjs/rules/relay-arguments.js +1 -1
- package/cjs/rules/relay-connection-types.js +1 -1
- package/cjs/rules/relay-edge-types.js +1 -1
- package/cjs/rules/relay-page-info.js +1 -1
- package/cjs/rules/require-deprecation-date.js +1 -1
- package/cjs/rules/require-deprecation-reason.js +1 -1
- package/cjs/rules/require-description.js +1 -1
- package/cjs/rules/require-field-of-type-query-in-mutation-result.js +1 -1
- package/cjs/rules/require-id-when-available.js +1 -1
- package/cjs/rules/require-nullable-fields-with-oneof.js +1 -1
- package/cjs/rules/require-type-pattern-with-oneof.js +1 -1
- package/cjs/rules/selection-set-depth.js +1 -1
- package/cjs/rules/strict-id-in-types.js +1 -1
- package/cjs/rules/unique-fragment-name.js +1 -1
- package/cjs/rules/unique-operation-name.js +1 -1
- package/cjs/siblings.js +113 -0
- package/cjs/utils.js +2 -1
- package/docs/README.md +1 -85
- package/docs/custom-rules.md +1 -184
- package/docs/deprecated-rules.md +1 -24
- package/docs/parser-options.md +1 -107
- package/docs/parser.md +1 -67
- package/esm/documents.js +2 -105
- package/esm/graphql-config.js +1 -1
- package/esm/parser.js +10 -4
- package/esm/rules/alphabetize.js +1 -1
- package/esm/rules/description-style.js +1 -1
- package/esm/rules/graphql-js-validation.js +1 -1
- package/esm/rules/input-name.js +4 -4
- package/esm/rules/lone-executable-definition.js +1 -1
- package/esm/rules/match-document-filename.js +3 -4
- package/esm/rules/naming-convention.js +1 -1
- package/esm/rules/no-anonymous-operations.js +1 -1
- package/esm/rules/no-case-insensitive-enum-values-duplicates.js +1 -1
- package/esm/rules/no-deprecated.js +1 -1
- package/esm/rules/no-duplicate-fields.js +1 -1
- package/esm/rules/no-hashtag-description.js +1 -1
- package/esm/rules/no-one-place-fragments.js +1 -1
- package/esm/rules/no-root-type.js +1 -1
- package/esm/rules/no-scalar-result-type-on-mutation.js +1 -1
- package/esm/rules/no-typename-prefix.js +1 -1
- package/esm/rules/no-unreachable-types.js +1 -1
- package/esm/rules/no-unused-fields.js +1 -1
- package/esm/rules/relay-arguments.js +1 -1
- package/esm/rules/relay-connection-types.js +1 -1
- package/esm/rules/relay-edge-types.js +1 -1
- package/esm/rules/relay-page-info.js +1 -1
- package/esm/rules/require-deprecation-date.js +1 -1
- package/esm/rules/require-deprecation-reason.js +1 -1
- package/esm/rules/require-description.js +1 -1
- package/esm/rules/require-field-of-type-query-in-mutation-result.js +1 -1
- package/esm/rules/require-id-when-available.js +1 -1
- package/esm/rules/require-nullable-fields-with-oneof.js +1 -1
- package/esm/rules/require-type-pattern-with-oneof.js +1 -1
- package/esm/rules/selection-set-depth.js +1 -1
- package/esm/rules/strict-id-in-types.js +1 -1
- package/esm/rules/unique-fragment-name.js +1 -1
- package/esm/rules/unique-operation-name.js +1 -1
- package/esm/siblings.js +109 -0
- package/esm/utils.js +1 -0
- package/package.json +1 -1
- package/typings/documents.d.cts +2 -20
- package/typings/documents.d.ts +2 -20
- package/typings/rules/input-name.d.cts +1 -1
- package/typings/rules/input-name.d.ts +1 -1
- package/typings/siblings.d.cts +22 -0
- package/typings/siblings.d.ts +22 -0
- package/typings/types.d.cts +3 -2
- package/typings/types.d.ts +3 -2
- package/typings/utils.d.cts +2 -1
- package/typings/utils.d.ts +2 -1
- package/docs/rules/alphabetize.md +0 -194
- package/docs/rules/description-style.md +0 -57
- package/docs/rules/executable-definitions.md +0 -20
- package/docs/rules/fields-on-correct-type.md +0 -23
- package/docs/rules/fragments-on-composite-type.md +0 -20
- package/docs/rules/input-name.md +0 -80
- package/docs/rules/known-argument-names.md +0 -23
- package/docs/rules/known-directives.md +0 -48
- package/docs/rules/known-fragment-names.md +0 -72
- package/docs/rules/known-type-names.md +0 -24
- package/docs/rules/lone-anonymous-operation.md +0 -20
- package/docs/rules/lone-executable-definition.md +0 -59
- package/docs/rules/lone-schema-definition.md +0 -19
- package/docs/rules/match-document-filename.md +0 -181
- package/docs/rules/naming-convention.md +0 -320
- package/docs/rules/no-anonymous-operations.md +0 -43
- package/docs/rules/no-case-insensitive-enum-values-duplicates.md +0 -46
- package/docs/rules/no-deprecated.md +0 -88
- package/docs/rules/no-duplicate-fields.md +0 -69
- package/docs/rules/no-fragment-cycles.md +0 -19
- package/docs/rules/no-hashtag-description.md +0 -62
- package/docs/rules/no-one-place-fragments.md +0 -51
- package/docs/rules/no-root-type.md +0 -55
- package/docs/rules/no-scalar-result-type-on-mutation.md +0 -39
- package/docs/rules/no-typename-prefix.md +0 -42
- package/docs/rules/no-undefined-variables.md +0 -20
- package/docs/rules/no-unreachable-types.md +0 -52
- package/docs/rules/no-unused-fields.md +0 -64
- package/docs/rules/no-unused-fragments.md +0 -20
- package/docs/rules/no-unused-variables.md +0 -20
- package/docs/rules/one-field-subscriptions.md +0 -19
- package/docs/rules/overlapping-fields-can-be-merged.md +0 -20
- package/docs/rules/possible-fragment-spread.md +0 -21
- package/docs/rules/possible-type-extension.md +0 -19
- package/docs/rules/provided-required-arguments.md +0 -21
- package/docs/rules/relay-arguments.md +0 -59
- package/docs/rules/relay-connection-types.md +0 -43
- package/docs/rules/relay-edge-types.md +0 -60
- package/docs/rules/relay-page-info.md +0 -34
- package/docs/rules/require-deprecation-date.md +0 -59
- package/docs/rules/require-deprecation-reason.md +0 -49
- package/docs/rules/require-description.md +0 -147
- package/docs/rules/require-field-of-type-query-in-mutation-result.md +0 -50
- package/docs/rules/require-id-when-available.md +0 -91
- package/docs/rules/require-nullable-fields-with-oneof.md +0 -38
- package/docs/rules/require-type-pattern-with-oneof.md +0 -39
- package/docs/rules/scalar-leafs.md +0 -23
- package/docs/rules/selection-set-depth.md +0 -86
- package/docs/rules/strict-id-in-types.md +0 -129
- package/docs/rules/unique-argument-names.md +0 -19
- package/docs/rules/unique-directive-names-per-location.md +0 -21
- package/docs/rules/unique-directive-names.md +0 -19
- package/docs/rules/unique-enum-value-names.md +0 -16
- package/docs/rules/unique-field-definition-names.md +0 -19
- package/docs/rules/unique-fragment-name.md +0 -52
- package/docs/rules/unique-input-field-names.md +0 -19
- package/docs/rules/unique-operation-name.md +0 -56
- package/docs/rules/unique-operation-types.md +0 -19
- package/docs/rules/unique-type-names.md +0 -19
- package/docs/rules/unique-variable-names.md +0 -19
- package/docs/rules/value-literals-of-correct-type.md +0 -22
- package/docs/rules/variables-are-input-types.md +0 -20
- package/docs/rules/variables-in-allowed-position.md +0 -19
@@ -25,7 +25,7 @@ export const rule = {
|
|
25
25
|
docs: {
|
26
26
|
category: 'Schema',
|
27
27
|
description: 'Require deletion date on `@deprecated` directive. Suggest removing deprecated things after deprecated date.',
|
28
|
-
url: 'https://
|
28
|
+
url: 'https://the-guild.dev/graphql/eslint/rules/require-deprecation-date',
|
29
29
|
examples: [
|
30
30
|
{
|
31
31
|
title: 'Incorrect',
|
@@ -4,7 +4,7 @@ export const rule = {
|
|
4
4
|
docs: {
|
5
5
|
description: 'Require all deprecation directives to specify a reason.',
|
6
6
|
category: 'Schema',
|
7
|
-
url: 'https://
|
7
|
+
url: 'https://the-guild.dev/graphql/eslint/rules/require-deprecation-reason',
|
8
8
|
recommended: true,
|
9
9
|
examples: [
|
10
10
|
{
|
@@ -71,7 +71,7 @@ export const rule = {
|
|
71
71
|
docs: {
|
72
72
|
category: 'Schema',
|
73
73
|
description: 'Enforce descriptions in type definitions and operations.',
|
74
|
-
url: `https://
|
74
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
75
75
|
examples: [
|
76
76
|
{
|
77
77
|
title: 'Incorrect',
|
@@ -7,7 +7,7 @@ export const rule = {
|
|
7
7
|
docs: {
|
8
8
|
category: 'Schema',
|
9
9
|
description: 'Allow the client in one round-trip not only to call mutation but also to get a wagon of data to update their application.\n> Currently, no errors are reported for result type `union`, `interface` and `scalar`.',
|
10
|
-
url: `https://
|
10
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
11
11
|
requiresSchema: true,
|
12
12
|
examples: [
|
13
13
|
{
|
@@ -31,7 +31,7 @@ export const rule = {
|
|
31
31
|
docs: {
|
32
32
|
category: 'Operations',
|
33
33
|
description: 'Enforce selecting specific fields when they are available on the GraphQL type.',
|
34
|
-
url: `https://
|
34
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
35
35
|
requiresSchema: true,
|
36
36
|
requiresSiblings: true,
|
37
37
|
examples: [
|
@@ -6,7 +6,7 @@ export const rule = {
|
|
6
6
|
docs: {
|
7
7
|
category: 'Schema',
|
8
8
|
description: 'Require `input` or `type` fields to be non-nullable with `@oneOf` directive.',
|
9
|
-
url: `https://
|
9
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
10
10
|
examples: [
|
11
11
|
{
|
12
12
|
title: 'Incorrect',
|
@@ -5,7 +5,7 @@ export const rule = {
|
|
5
5
|
docs: {
|
6
6
|
category: 'Schema',
|
7
7
|
description: 'Enforce types with `@oneOf` directive have `error` and `ok` fields.',
|
8
|
-
url: `https://
|
8
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
9
9
|
examples: [
|
10
10
|
{
|
11
11
|
title: 'Correct',
|
@@ -25,7 +25,7 @@ export const rule = {
|
|
25
25
|
docs: {
|
26
26
|
category: 'Operations',
|
27
27
|
description: 'Limit the complexity of the GraphQL operations solely by their depth. Based on [graphql-depth-limit](https://npmjs.com/package/graphql-depth-limit).',
|
28
|
-
url: `https://
|
28
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
29
29
|
requiresSiblings: true,
|
30
30
|
examples: [
|
31
31
|
{
|
@@ -40,7 +40,7 @@ export const rule = {
|
|
40
40
|
description: 'Requires output types to have one unique identifier unless they do not have a logical one. Exceptions can be used to ignore output types that do not have unique identifiers.',
|
41
41
|
category: 'Schema',
|
42
42
|
recommended: true,
|
43
|
-
url: `https://
|
43
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
44
44
|
requiresSchema: true,
|
45
45
|
examples: [
|
46
46
|
{
|
@@ -35,7 +35,7 @@ export const rule = {
|
|
35
35
|
docs: {
|
36
36
|
category: 'Operations',
|
37
37
|
description: 'Enforce unique fragment names across your project.',
|
38
|
-
url: `https://
|
38
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
39
39
|
requiresSiblings: true,
|
40
40
|
examples: [
|
41
41
|
{
|
@@ -6,7 +6,7 @@ export const rule = {
|
|
6
6
|
docs: {
|
7
7
|
category: 'Operations',
|
8
8
|
description: 'Enforce unique operation names across your project.',
|
9
|
-
url: `https://
|
9
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
10
10
|
requiresSiblings: true,
|
11
11
|
examples: [
|
12
12
|
{
|
package/esm/siblings.js
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
import { parseGraphQLSDL } from '@graphql-tools/utils';
|
2
|
+
import { Kind, visit, } from 'graphql';
|
3
|
+
import { getDocuments } from './documents.js';
|
4
|
+
import { logger } from './utils.js';
|
5
|
+
const siblingOperationsCache = new Map();
|
6
|
+
export function getSiblings(project, documents) {
|
7
|
+
const siblings = project
|
8
|
+
? getDocuments(project)
|
9
|
+
: typeof documents === 'string'
|
10
|
+
? [parseGraphQLSDL('operation.graphql', documents, { noLocation: true })]
|
11
|
+
: [];
|
12
|
+
if (siblings.length === 0) {
|
13
|
+
let printed = false;
|
14
|
+
const noopWarn = () => {
|
15
|
+
if (!printed) {
|
16
|
+
logger.warn('getSiblingOperations was called without any operations. Make sure to set "parserOptions.operations" to make this feature available!');
|
17
|
+
printed = true;
|
18
|
+
}
|
19
|
+
return [];
|
20
|
+
};
|
21
|
+
return {
|
22
|
+
available: false,
|
23
|
+
getFragment: noopWarn,
|
24
|
+
getFragments: noopWarn,
|
25
|
+
getFragmentByType: noopWarn,
|
26
|
+
getFragmentsInUse: noopWarn,
|
27
|
+
getOperation: noopWarn,
|
28
|
+
getOperations: noopWarn,
|
29
|
+
getOperationByType: noopWarn,
|
30
|
+
};
|
31
|
+
}
|
32
|
+
// Since the siblings array is cached, we can use it as cache key.
|
33
|
+
// We should get the same array reference each time we get
|
34
|
+
// to this point for the same graphql project
|
35
|
+
const value = siblingOperationsCache.get(siblings);
|
36
|
+
if (value) {
|
37
|
+
return value;
|
38
|
+
}
|
39
|
+
let fragmentsCache = null;
|
40
|
+
const getFragments = () => {
|
41
|
+
var _a;
|
42
|
+
if (fragmentsCache === null) {
|
43
|
+
const result = [];
|
44
|
+
for (const source of siblings) {
|
45
|
+
for (const definition of ((_a = source.document) === null || _a === void 0 ? void 0 : _a.definitions) || []) {
|
46
|
+
if (definition.kind === Kind.FRAGMENT_DEFINITION) {
|
47
|
+
result.push({
|
48
|
+
filePath: source.location,
|
49
|
+
document: definition,
|
50
|
+
});
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
fragmentsCache = result;
|
55
|
+
}
|
56
|
+
return fragmentsCache;
|
57
|
+
};
|
58
|
+
let cachedOperations = null;
|
59
|
+
const getOperations = () => {
|
60
|
+
var _a;
|
61
|
+
if (cachedOperations === null) {
|
62
|
+
const result = [];
|
63
|
+
for (const source of siblings) {
|
64
|
+
for (const definition of ((_a = source.document) === null || _a === void 0 ? void 0 : _a.definitions) || []) {
|
65
|
+
if (definition.kind === Kind.OPERATION_DEFINITION) {
|
66
|
+
result.push({
|
67
|
+
filePath: source.location,
|
68
|
+
document: definition,
|
69
|
+
});
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
cachedOperations = result;
|
74
|
+
}
|
75
|
+
return cachedOperations;
|
76
|
+
};
|
77
|
+
const getFragment = (name) => getFragments().filter(f => { var _a; return ((_a = f.document.name) === null || _a === void 0 ? void 0 : _a.value) === name; });
|
78
|
+
const collectFragments = (selectable, recursive, collected = new Map()) => {
|
79
|
+
visit(selectable, {
|
80
|
+
FragmentSpread(spread) {
|
81
|
+
const fragmentName = spread.name.value;
|
82
|
+
const [fragment] = getFragment(fragmentName);
|
83
|
+
if (!fragment) {
|
84
|
+
logger.warn(`Unable to locate fragment named "${fragmentName}", please make sure it's loaded using "parserOptions.operations"`);
|
85
|
+
return;
|
86
|
+
}
|
87
|
+
if (!collected.has(fragmentName)) {
|
88
|
+
collected.set(fragmentName, fragment.document);
|
89
|
+
if (recursive) {
|
90
|
+
collectFragments(fragment.document, recursive, collected);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
},
|
94
|
+
});
|
95
|
+
return collected;
|
96
|
+
};
|
97
|
+
const siblingOperations = {
|
98
|
+
available: true,
|
99
|
+
getFragment,
|
100
|
+
getFragments,
|
101
|
+
getFragmentByType: typeName => getFragments().filter(f => { var _a, _b; return ((_b = (_a = f.document.typeCondition) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.value) === typeName; }),
|
102
|
+
getFragmentsInUse: (selectable, recursive = true) => Array.from(collectFragments(selectable, recursive).values()),
|
103
|
+
getOperation: name => getOperations().filter(o => { var _a; return ((_a = o.document.name) === null || _a === void 0 ? void 0 : _a.value) === name; }),
|
104
|
+
getOperations,
|
105
|
+
getOperationByType: type => getOperations().filter(o => o.document.operation === type),
|
106
|
+
};
|
107
|
+
siblingOperationsCache.set(siblings, siblingOperations);
|
108
|
+
return siblingOperations;
|
109
|
+
}
|
package/esm/utils.js
CHANGED
@@ -29,6 +29,7 @@ export const logger = {
|
|
29
29
|
export const normalizePath = (path) => (path || '').replace(/\\/g, '/');
|
30
30
|
export const VIRTUAL_DOCUMENT_REGEX = /\/\d+_document.graphql$/;
|
31
31
|
export const CWD = process.cwd();
|
32
|
+
export const IS_BROWSER = typeof window !== 'undefined';
|
32
33
|
export const getTypeName = (node) => 'type' in node ? getTypeName(node.type) : 'name' in node && node.name ? node.name.value : '';
|
33
34
|
export const TYPES_KINDS = [
|
34
35
|
Kind.OBJECT_TYPE_DEFINITION,
|
package/package.json
CHANGED
package/typings/documents.d.cts
CHANGED
@@ -1,21 +1,3 @@
|
|
1
|
-
import {
|
1
|
+
import { Source } from '@graphql-tools/utils';
|
2
2
|
import { GraphQLProjectConfig } from 'graphql-config';
|
3
|
-
export
|
4
|
-
filePath: string;
|
5
|
-
document: FragmentDefinitionNode;
|
6
|
-
};
|
7
|
-
export type OperationSource = {
|
8
|
-
filePath: string;
|
9
|
-
document: OperationDefinitionNode;
|
10
|
-
};
|
11
|
-
export type SiblingOperations = {
|
12
|
-
available: boolean;
|
13
|
-
getFragment(fragmentName: string): FragmentSource[];
|
14
|
-
getFragments(): FragmentSource[];
|
15
|
-
getFragmentByType(typeName: string): FragmentSource[];
|
16
|
-
getFragmentsInUse(baseOperation: OperationDefinitionNode | FragmentDefinitionNode | SelectionSetNode, recursive?: boolean): FragmentDefinitionNode[];
|
17
|
-
getOperation(operationName: string): OperationSource[];
|
18
|
-
getOperations(): OperationSource[];
|
19
|
-
getOperationByType(operationType: OperationTypeNode): OperationSource[];
|
20
|
-
};
|
21
|
-
export declare function getDocuments(project: GraphQLProjectConfig): SiblingOperations;
|
3
|
+
export declare const getDocuments: (project: GraphQLProjectConfig) => Source[];
|
package/typings/documents.d.ts
CHANGED
@@ -1,21 +1,3 @@
|
|
1
|
-
import {
|
1
|
+
import { Source } from '@graphql-tools/utils';
|
2
2
|
import { GraphQLProjectConfig } from 'graphql-config';
|
3
|
-
export
|
4
|
-
filePath: string;
|
5
|
-
document: FragmentDefinitionNode;
|
6
|
-
};
|
7
|
-
export type OperationSource = {
|
8
|
-
filePath: string;
|
9
|
-
document: OperationDefinitionNode;
|
10
|
-
};
|
11
|
-
export type SiblingOperations = {
|
12
|
-
available: boolean;
|
13
|
-
getFragment(fragmentName: string): FragmentSource[];
|
14
|
-
getFragments(): FragmentSource[];
|
15
|
-
getFragmentByType(typeName: string): FragmentSource[];
|
16
|
-
getFragmentsInUse(baseOperation: OperationDefinitionNode | FragmentDefinitionNode | SelectionSetNode, recursive?: boolean): FragmentDefinitionNode[];
|
17
|
-
getOperation(operationName: string): OperationSource[];
|
18
|
-
getOperations(): OperationSource[];
|
19
|
-
getOperationByType(operationType: OperationTypeNode): OperationSource[];
|
20
|
-
};
|
21
|
-
export declare function getDocuments(project: GraphQLProjectConfig): SiblingOperations;
|
3
|
+
export declare const getDocuments: (project: GraphQLProjectConfig) => Source[];
|
@@ -10,7 +10,7 @@ declare const schema: {
|
|
10
10
|
readonly checkInputType: {
|
11
11
|
readonly type: "boolean";
|
12
12
|
readonly default: false;
|
13
|
-
readonly description: "Check that the input type name follows the convention
|
13
|
+
readonly description: "Check that the input type name follows the convention \\<mutationName>Input";
|
14
14
|
};
|
15
15
|
readonly caseSensitiveInputType: {
|
16
16
|
readonly type: "boolean";
|
@@ -10,7 +10,7 @@ declare const schema: {
|
|
10
10
|
readonly checkInputType: {
|
11
11
|
readonly type: "boolean";
|
12
12
|
readonly default: false;
|
13
|
-
readonly description: "Check that the input type name follows the convention
|
13
|
+
readonly description: "Check that the input type name follows the convention \\<mutationName>Input";
|
14
14
|
};
|
15
15
|
readonly caseSensitiveInputType: {
|
16
16
|
readonly type: "boolean";
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { FragmentDefinitionNode, OperationDefinitionNode, OperationTypeNode, SelectionSetNode } from 'graphql';
|
2
|
+
import { GraphQLProjectConfig } from 'graphql-config';
|
3
|
+
import { ParserOptions } from './types.cjs';
|
4
|
+
export type FragmentSource = {
|
5
|
+
filePath: string;
|
6
|
+
document: FragmentDefinitionNode;
|
7
|
+
};
|
8
|
+
export type OperationSource = {
|
9
|
+
filePath: string;
|
10
|
+
document: OperationDefinitionNode;
|
11
|
+
};
|
12
|
+
export type SiblingOperations = {
|
13
|
+
available: boolean;
|
14
|
+
getFragment(fragmentName: string): FragmentSource[];
|
15
|
+
getFragments(): FragmentSource[];
|
16
|
+
getFragmentByType(typeName: string): FragmentSource[];
|
17
|
+
getFragmentsInUse(baseOperation: OperationDefinitionNode | FragmentDefinitionNode | SelectionSetNode, recursive?: boolean): FragmentDefinitionNode[];
|
18
|
+
getOperation(operationName: string): OperationSource[];
|
19
|
+
getOperations(): OperationSource[];
|
20
|
+
getOperationByType(operationType: OperationTypeNode): OperationSource[];
|
21
|
+
};
|
22
|
+
export declare function getSiblings(project?: GraphQLProjectConfig, documents?: ParserOptions['documents']): SiblingOperations;
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { FragmentDefinitionNode, OperationDefinitionNode, OperationTypeNode, SelectionSetNode } from 'graphql';
|
2
|
+
import { GraphQLProjectConfig } from 'graphql-config';
|
3
|
+
import { ParserOptions } from './types.js';
|
4
|
+
export type FragmentSource = {
|
5
|
+
filePath: string;
|
6
|
+
document: FragmentDefinitionNode;
|
7
|
+
};
|
8
|
+
export type OperationSource = {
|
9
|
+
filePath: string;
|
10
|
+
document: OperationDefinitionNode;
|
11
|
+
};
|
12
|
+
export type SiblingOperations = {
|
13
|
+
available: boolean;
|
14
|
+
getFragment(fragmentName: string): FragmentSource[];
|
15
|
+
getFragments(): FragmentSource[];
|
16
|
+
getFragmentByType(typeName: string): FragmentSource[];
|
17
|
+
getFragmentsInUse(baseOperation: OperationDefinitionNode | FragmentDefinitionNode | SelectionSetNode, recursive?: boolean): FragmentDefinitionNode[];
|
18
|
+
getOperation(operationName: string): OperationSource[];
|
19
|
+
getOperations(): OperationSource[];
|
20
|
+
getOperationByType(operationType: OperationTypeNode): OperationSource[];
|
21
|
+
};
|
22
|
+
export declare function getSiblings(project?: GraphQLProjectConfig, documents?: ParserOptions['documents']): SiblingOperations;
|
package/typings/types.d.cts
CHANGED
@@ -4,7 +4,7 @@ import * as ESTree from 'estree';
|
|
4
4
|
import { GraphQLSchema } from 'graphql';
|
5
5
|
import { IExtensions, IGraphQLProject } from 'graphql-config';
|
6
6
|
import { JSONSchema } from 'json-schema-to-ts';
|
7
|
-
import { SiblingOperations } from './
|
7
|
+
import { SiblingOperations } from './siblings.cjs';
|
8
8
|
import { GraphQLESLintRuleListener } from './testkit.cjs';
|
9
9
|
export type Schema = GraphQLSchema | Error | null;
|
10
10
|
export type Pointer = string | string[];
|
@@ -13,7 +13,6 @@ export interface ParserOptions {
|
|
13
13
|
headers: Record<string, string>;
|
14
14
|
}>;
|
15
15
|
documents?: Pointer;
|
16
|
-
operations?: Pointer;
|
17
16
|
extensions?: IExtensions;
|
18
17
|
include?: Pointer;
|
19
18
|
exclude?: Pointer;
|
@@ -24,6 +23,8 @@ export interface ParserOptions {
|
|
24
23
|
graphQLParserOptions?: Omit<GraphQLParseOptions, 'noLocation'>;
|
25
24
|
skipGraphQLConfig?: boolean;
|
26
25
|
filePath: string;
|
26
|
+
/** @deprecated Use `documents` instead */
|
27
|
+
operations?: Pointer;
|
27
28
|
}
|
28
29
|
export type ParserServices = {
|
29
30
|
schema: Schema;
|
package/typings/types.d.ts
CHANGED
@@ -4,7 +4,7 @@ import * as ESTree from 'estree';
|
|
4
4
|
import { GraphQLSchema } from 'graphql';
|
5
5
|
import { IExtensions, IGraphQLProject } from 'graphql-config';
|
6
6
|
import { JSONSchema } from 'json-schema-to-ts';
|
7
|
-
import { SiblingOperations } from './
|
7
|
+
import { SiblingOperations } from './siblings.js';
|
8
8
|
import { GraphQLESLintRuleListener } from './testkit.js';
|
9
9
|
export type Schema = GraphQLSchema | Error | null;
|
10
10
|
export type Pointer = string | string[];
|
@@ -13,7 +13,6 @@ export interface ParserOptions {
|
|
13
13
|
headers: Record<string, string>;
|
14
14
|
}>;
|
15
15
|
documents?: Pointer;
|
16
|
-
operations?: Pointer;
|
17
16
|
extensions?: IExtensions;
|
18
17
|
include?: Pointer;
|
19
18
|
exclude?: Pointer;
|
@@ -24,6 +23,8 @@ export interface ParserOptions {
|
|
24
23
|
graphQLParserOptions?: Omit<GraphQLParseOptions, 'noLocation'>;
|
25
24
|
skipGraphQLConfig?: boolean;
|
26
25
|
filePath: string;
|
26
|
+
/** @deprecated Use `documents` instead */
|
27
|
+
operations?: Pointer;
|
27
28
|
}
|
28
29
|
export type ParserServices = {
|
29
30
|
schema: Schema;
|
package/typings/utils.d.cts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import { AST } from 'eslint';
|
2
2
|
import { Position } from 'estree';
|
3
3
|
import { ASTNode, GraphQLSchema, Kind } from 'graphql';
|
4
|
-
import { SiblingOperations } from './
|
4
|
+
import { SiblingOperations } from './siblings.cjs';
|
5
5
|
import { GraphQLESLintRuleContext } from './types.cjs';
|
6
6
|
export declare function requireSiblingsOperations(ruleId: string, context: GraphQLESLintRuleContext): SiblingOperations | never;
|
7
7
|
export declare function requireGraphQLSchemaFromContext(ruleId: string, context: GraphQLESLintRuleContext): GraphQLSchema | never;
|
@@ -12,6 +12,7 @@ export declare const logger: {
|
|
12
12
|
export declare const normalizePath: (path: string) => string;
|
13
13
|
export declare const VIRTUAL_DOCUMENT_REGEX: RegExp;
|
14
14
|
export declare const CWD: string;
|
15
|
+
export declare const IS_BROWSER: boolean;
|
15
16
|
export declare const getTypeName: (node: ASTNode) => string;
|
16
17
|
export declare const TYPES_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];
|
17
18
|
export type CaseStyle = 'camelCase' | 'PascalCase' | 'snake_case' | 'UPPER_CASE' | 'kebab-case';
|
package/typings/utils.d.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import { AST } from 'eslint';
|
2
2
|
import { Position } from 'estree';
|
3
3
|
import { ASTNode, GraphQLSchema, Kind } from 'graphql';
|
4
|
-
import { SiblingOperations } from './
|
4
|
+
import { SiblingOperations } from './siblings.js';
|
5
5
|
import { GraphQLESLintRuleContext } from './types.js';
|
6
6
|
export declare function requireSiblingsOperations(ruleId: string, context: GraphQLESLintRuleContext): SiblingOperations | never;
|
7
7
|
export declare function requireGraphQLSchemaFromContext(ruleId: string, context: GraphQLESLintRuleContext): GraphQLSchema | never;
|
@@ -12,6 +12,7 @@ export declare const logger: {
|
|
12
12
|
export declare const normalizePath: (path: string) => string;
|
13
13
|
export declare const VIRTUAL_DOCUMENT_REGEX: RegExp;
|
14
14
|
export declare const CWD: string;
|
15
|
+
export declare const IS_BROWSER: boolean;
|
15
16
|
export declare const getTypeName: (node: ASTNode) => string;
|
16
17
|
export declare const TYPES_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];
|
17
18
|
export type CaseStyle = 'camelCase' | 'PascalCase' | 'snake_case' | 'UPPER_CASE' | 'kebab-case';
|
@@ -1,194 +0,0 @@
|
|
1
|
-
# `alphabetize`
|
2
|
-
|
3
|
-
🔧 The `--fix` option on the
|
4
|
-
[command line](https://eslint.org/docs/user-guide/command-line-interface#--fix) can automatically
|
5
|
-
fix some of the problems reported by this rule.
|
6
|
-
|
7
|
-
- Category: `Schema & Operations`
|
8
|
-
- Rule name: `@graphql-eslint/alphabetize`
|
9
|
-
- Requires GraphQL Schema: `false` [ℹ️](../../README.md#extended-linting-rules-with-graphql-schema)
|
10
|
-
- Requires GraphQL Operations: `false`
|
11
|
-
[ℹ️](../../README.md#extended-linting-rules-with-siblings-operations)
|
12
|
-
|
13
|
-
Enforce arrange in alphabetical order for type fields, enum values, input object fields, operation
|
14
|
-
selections and more.
|
15
|
-
|
16
|
-
## Usage Examples
|
17
|
-
|
18
|
-
### Incorrect
|
19
|
-
|
20
|
-
```graphql
|
21
|
-
# eslint @graphql-eslint/alphabetize: ['error', { fields: ['ObjectTypeDefinition'] }]
|
22
|
-
|
23
|
-
type User {
|
24
|
-
password: String
|
25
|
-
firstName: String! # should be before "password"
|
26
|
-
age: Int # should be before "firstName"
|
27
|
-
lastName: String!
|
28
|
-
}
|
29
|
-
```
|
30
|
-
|
31
|
-
### Correct
|
32
|
-
|
33
|
-
```graphql
|
34
|
-
# eslint @graphql-eslint/alphabetize: ['error', { fields: ['ObjectTypeDefinition'] }]
|
35
|
-
|
36
|
-
type User {
|
37
|
-
age: Int
|
38
|
-
firstName: String!
|
39
|
-
lastName: String!
|
40
|
-
password: String
|
41
|
-
}
|
42
|
-
```
|
43
|
-
|
44
|
-
### Incorrect
|
45
|
-
|
46
|
-
```graphql
|
47
|
-
# eslint @graphql-eslint/alphabetize: ['error', { values: ['EnumTypeDefinition'] }]
|
48
|
-
|
49
|
-
enum Role {
|
50
|
-
SUPER_ADMIN
|
51
|
-
ADMIN # should be before "SUPER_ADMIN"
|
52
|
-
USER
|
53
|
-
GOD # should be before "USER"
|
54
|
-
}
|
55
|
-
```
|
56
|
-
|
57
|
-
### Correct
|
58
|
-
|
59
|
-
```graphql
|
60
|
-
# eslint @graphql-eslint/alphabetize: ['error', { values: ['EnumTypeDefinition'] }]
|
61
|
-
|
62
|
-
enum Role {
|
63
|
-
ADMIN
|
64
|
-
GOD
|
65
|
-
SUPER_ADMIN
|
66
|
-
USER
|
67
|
-
}
|
68
|
-
```
|
69
|
-
|
70
|
-
### Incorrect
|
71
|
-
|
72
|
-
```graphql
|
73
|
-
# eslint @graphql-eslint/alphabetize: ['error', { selections: ['OperationDefinition'] }]
|
74
|
-
|
75
|
-
query {
|
76
|
-
me {
|
77
|
-
firstName
|
78
|
-
lastName
|
79
|
-
email # should be before "lastName"
|
80
|
-
}
|
81
|
-
}
|
82
|
-
```
|
83
|
-
|
84
|
-
### Correct
|
85
|
-
|
86
|
-
```graphql
|
87
|
-
# eslint @graphql-eslint/alphabetize: ['error', { selections: ['OperationDefinition'] }]
|
88
|
-
|
89
|
-
query {
|
90
|
-
me {
|
91
|
-
email
|
92
|
-
firstName
|
93
|
-
lastName
|
94
|
-
}
|
95
|
-
}
|
96
|
-
```
|
97
|
-
|
98
|
-
## Config Schema
|
99
|
-
|
100
|
-
The schema defines the following properties:
|
101
|
-
|
102
|
-
### `fields` (array)
|
103
|
-
|
104
|
-
Fields of `type`, `interface`, and `input`.
|
105
|
-
|
106
|
-
The elements of the array can contain the following enum values:
|
107
|
-
|
108
|
-
- `ObjectTypeDefinition`
|
109
|
-
- `InterfaceTypeDefinition`
|
110
|
-
- `InputObjectTypeDefinition`
|
111
|
-
|
112
|
-
Additional restrictions:
|
113
|
-
|
114
|
-
- Minimum items: `1`
|
115
|
-
- Unique items: `true`
|
116
|
-
|
117
|
-
### `values` (array)
|
118
|
-
|
119
|
-
Values of `enum`.
|
120
|
-
|
121
|
-
The elements of the array can contain the following enum values:
|
122
|
-
|
123
|
-
- `EnumTypeDefinition`
|
124
|
-
|
125
|
-
Additional restrictions:
|
126
|
-
|
127
|
-
- Minimum items: `1`
|
128
|
-
- Unique items: `true`
|
129
|
-
|
130
|
-
### `selections` (array)
|
131
|
-
|
132
|
-
Selections of `fragment` and operations `query`, `mutation` and `subscription`.
|
133
|
-
|
134
|
-
The elements of the array can contain the following enum values:
|
135
|
-
|
136
|
-
- `OperationDefinition`
|
137
|
-
- `FragmentDefinition`
|
138
|
-
|
139
|
-
Additional restrictions:
|
140
|
-
|
141
|
-
- Minimum items: `1`
|
142
|
-
- Unique items: `true`
|
143
|
-
|
144
|
-
### `variables` (array)
|
145
|
-
|
146
|
-
Variables of operations `query`, `mutation` and `subscription`.
|
147
|
-
|
148
|
-
The elements of the array can contain the following enum values:
|
149
|
-
|
150
|
-
- `OperationDefinition`
|
151
|
-
|
152
|
-
Additional restrictions:
|
153
|
-
|
154
|
-
- Minimum items: `1`
|
155
|
-
- Unique items: `true`
|
156
|
-
|
157
|
-
### `arguments` (array)
|
158
|
-
|
159
|
-
Arguments of fields and directives.
|
160
|
-
|
161
|
-
The elements of the array can contain the following enum values:
|
162
|
-
|
163
|
-
- `FieldDefinition`
|
164
|
-
- `Field`
|
165
|
-
- `DirectiveDefinition`
|
166
|
-
- `Directive`
|
167
|
-
|
168
|
-
Additional restrictions:
|
169
|
-
|
170
|
-
- Minimum items: `1`
|
171
|
-
- Unique items: `true`
|
172
|
-
|
173
|
-
### `definitions` (boolean)
|
174
|
-
|
175
|
-
Definitions – `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.
|
176
|
-
|
177
|
-
Default: `false`
|
178
|
-
|
179
|
-
### `groups` (array)
|
180
|
-
|
181
|
-
Custom order group. Example: `['id', '*', 'createdAt', 'updatedAt']` where `*` says for everything
|
182
|
-
else.
|
183
|
-
|
184
|
-
The object is an array with all elements of the type `string`.
|
185
|
-
|
186
|
-
Additional restrictions:
|
187
|
-
|
188
|
-
- Minimum items: `2`
|
189
|
-
- Unique items: `true`
|
190
|
-
|
191
|
-
## Resources
|
192
|
-
|
193
|
-
- [Rule source](../../packages/plugin/src/rules/alphabetize.ts)
|
194
|
-
- [Test source](../../packages/plugin/tests/alphabetize.spec.ts)
|