@graphql-eslint/eslint-plugin 3.14.4-alpha-20230112222814-ed38c21 → 3.14.4-alpha-20230112232227-647789a

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.
Files changed (43) hide show
  1. package/cjs/rules/graphql-js-validation.js +19 -10
  2. package/cjs/rules/no-deprecated.js +3 -1
  3. package/cjs/rules/no-one-place-fragments.js +4 -2
  4. package/cjs/rules/no-root-type.js +3 -1
  5. package/cjs/rules/no-scalar-result-type-on-mutation.js +3 -1
  6. package/cjs/rules/no-unreachable-types.js +3 -1
  7. package/cjs/rules/no-unused-fields.js +5 -3
  8. package/cjs/rules/relay-arguments.js +3 -1
  9. package/cjs/rules/relay-edge-types.js +3 -1
  10. package/cjs/rules/relay-page-info.js +3 -1
  11. package/cjs/rules/require-description.js +7 -5
  12. package/cjs/rules/require-field-of-type-query-in-mutation-result.js +3 -1
  13. package/cjs/rules/require-id-when-available.js +4 -2
  14. package/cjs/rules/selection-set-depth.js +2 -5
  15. package/cjs/rules/strict-id-in-types.js +3 -1
  16. package/cjs/rules/unique-fragment-name.js +5 -3
  17. package/cjs/rules/unique-operation-name.js +5 -1
  18. package/cjs/schema.js +1 -2
  19. package/cjs/utils.js +20 -6
  20. package/esm/rules/graphql-js-validation.js +19 -10
  21. package/esm/rules/no-deprecated.js +3 -1
  22. package/esm/rules/no-one-place-fragments.js +4 -2
  23. package/esm/rules/no-root-type.js +3 -1
  24. package/esm/rules/no-scalar-result-type-on-mutation.js +3 -1
  25. package/esm/rules/no-unreachable-types.js +3 -1
  26. package/esm/rules/no-unused-fields.js +5 -3
  27. package/esm/rules/relay-arguments.js +3 -1
  28. package/esm/rules/relay-edge-types.js +3 -1
  29. package/esm/rules/relay-page-info.js +3 -1
  30. package/esm/rules/require-description.js +7 -5
  31. package/esm/rules/require-field-of-type-query-in-mutation-result.js +3 -1
  32. package/esm/rules/require-id-when-available.js +4 -2
  33. package/esm/rules/selection-set-depth.js +2 -5
  34. package/esm/rules/strict-id-in-types.js +3 -1
  35. package/esm/rules/unique-fragment-name.js +5 -3
  36. package/esm/rules/unique-operation-name.js +5 -1
  37. package/esm/schema.js +1 -2
  38. package/esm/utils.js +20 -6
  39. package/package.json +1 -1
  40. package/typings/rules/unique-fragment-name.d.cts +2 -1
  41. package/typings/rules/unique-fragment-name.d.ts +2 -1
  42. package/typings/utils.d.cts +2 -2
  43. package/typings/utils.d.ts +2 -2
@@ -71,10 +71,12 @@ const getMissingFragments = (node) => {
71
71
  const { fragmentDefs, fragmentSpreads } = getFragmentDefsAndFragmentSpreads(node);
72
72
  return [...fragmentSpreads].filter(name => !fragmentDefs.has(name));
73
73
  };
74
- const handleMissingFragments = ({ ruleId, context, node }) => {
74
+ const handleMissingFragments = ({ context, node }) => {
75
75
  const missingFragments = getMissingFragments(node);
76
76
  if (missingFragments.length > 0) {
77
- const siblings = (0, utils_js_1.requireSiblingsOperations)(ruleId, context);
77
+ const siblings = (0, utils_js_1.requireSiblingsOperations)(context);
78
+ if (!siblings)
79
+ return null;
78
80
  const fragmentsToAdd = [];
79
81
  for (const fragmentName of missingFragments) {
80
82
  const [foundFragment] = siblings.getFragment(fragmentName).map(source => source.document);
@@ -85,7 +87,6 @@ const handleMissingFragments = ({ ruleId, context, node }) => {
85
87
  if (fragmentsToAdd.length > 0) {
86
88
  // recall fn to make sure to add fragments inside fragments
87
89
  return handleMissingFragments({
88
- ruleId,
89
90
  context,
90
91
  node: {
91
92
  kind: graphql_1.Kind.DOCUMENT,
@@ -129,12 +130,18 @@ const validationToRule = ({ ruleId, ruleName, getDocumentNode, schema = [], hasD
129
130
  }
130
131
  return {
131
132
  Document(node) {
132
- const schema = docs.requiresSchema
133
- ? (0, utils_js_1.requireGraphQLSchemaFromContext)(ruleId, context)
134
- : null;
133
+ let schema = null;
134
+ if (docs.requiresSchema) {
135
+ schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
136
+ if (!schema)
137
+ return;
138
+ }
139
+ const rawNode = node.rawNode();
135
140
  const documentNode = getDocumentNode
136
- ? getDocumentNode({ ruleId, context, node: node.rawNode() })
137
- : node.rawNode();
141
+ ? getDocumentNode({ context, node: rawNode })
142
+ : rawNode;
143
+ if (!documentNode)
144
+ return;
138
145
  validateDocument({
139
146
  context,
140
147
  schema,
@@ -322,8 +329,10 @@ exports.GRAPHQL_JS_VALIDATIONS = Object.assign({}, validationToRule({
322
329
  }), validationToRule({
323
330
  ruleId: 'no-unused-fragments',
324
331
  ruleName: 'NoUnusedFragments',
325
- getDocumentNode: ({ ruleId, context, node }) => {
326
- const siblings = (0, utils_js_1.requireSiblingsOperations)(ruleId, context);
332
+ getDocumentNode: ({ context, node }) => {
333
+ const siblings = (0, utils_js_1.requireSiblingsOperations)(context);
334
+ if (!siblings)
335
+ return null;
327
336
  const FilePathToDocumentsMap = [
328
337
  ...siblings.getOperations(),
329
338
  ...siblings.getFragments(),
@@ -83,7 +83,9 @@ exports.rule = {
83
83
  schema: [],
84
84
  },
85
85
  create(context) {
86
- (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
86
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
87
+ if (!schema)
88
+ return {};
87
89
  function report(node, reason) {
88
90
  const nodeName = node.kind === graphql_1.Kind.ENUM ? node.value : node.name.value;
89
91
  const nodeType = node.kind === graphql_1.Kind.ENUM ? 'enum value' : 'field';
@@ -53,8 +53,10 @@ exports.rule = {
53
53
  schema: [],
54
54
  },
55
55
  create(context) {
56
- const operations = (0, utils_js_1.requireSiblingsOperations)(RULE_ID, context);
57
- const allDocuments = [...operations.getOperations(), ...operations.getFragments()];
56
+ const siblings = (0, utils_js_1.requireSiblingsOperations)(context);
57
+ if (!siblings)
58
+ return {};
59
+ const allDocuments = [...siblings.getOperations(), ...siblings.getFragments()];
58
60
  const usedFragmentsMap = Object.create(null);
59
61
  for (const { document, filePath } of allDocuments) {
60
62
  const relativeFilePath = (0, path_1.relative)(utils_js_1.CWD, filePath);
@@ -54,7 +54,9 @@ exports.rule = {
54
54
  schema,
55
55
  },
56
56
  create(context) {
57
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)('no-root-type', context);
57
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
58
+ if (!schema)
59
+ return {};
58
60
  const disallow = new Set(context.options[0].disallow);
59
61
  const rootTypeNames = [
60
62
  disallow.has('mutation') && schema.getMutationType(),
@@ -35,7 +35,9 @@ exports.rule = {
35
35
  schema: [],
36
36
  },
37
37
  create(context) {
38
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
38
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
39
+ if (!schema)
40
+ return {};
39
41
  const mutationType = schema.getMutationType();
40
42
  if (!mutationType) {
41
43
  return {};
@@ -130,7 +130,9 @@ exports.rule = {
130
130
  hasSuggestions: true,
131
131
  },
132
132
  create(context) {
133
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
133
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
134
+ if (!schema)
135
+ return {};
134
136
  const reachableTypes = getReachableTypes(schema);
135
137
  return {
136
138
  [`:matches(${KINDS}) > .name`](node) {
@@ -95,9 +95,11 @@ exports.rule = {
95
95
  hasSuggestions: true,
96
96
  },
97
97
  create(context) {
98
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
99
- const siblingsOperations = (0, utils_js_1.requireSiblingsOperations)(RULE_ID, context);
100
- const usedFields = getUsedFields(schema, siblingsOperations);
98
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
99
+ const siblings = (0, utils_js_1.requireSiblingsOperations)(context);
100
+ if (!schema || !siblings)
101
+ return {};
102
+ const usedFields = getUsedFields(schema, siblings);
101
103
  return {
102
104
  FieldDefinition(node) {
103
105
  var _a;
@@ -68,7 +68,9 @@ exports.rule = {
68
68
  schema,
69
69
  },
70
70
  create(context) {
71
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
71
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
72
+ if (!schema)
73
+ return {};
72
74
  const { includeBoth = true } = context.options[0] || {};
73
75
  return {
74
76
  'FieldDefinition > .gqlType Name[value=/Connection$/]'(node) {
@@ -106,7 +106,9 @@ exports.rule = {
106
106
  schema,
107
107
  },
108
108
  create(context) {
109
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
109
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
110
+ if (!schema)
111
+ return {};
110
112
  const edgeTypes = getEdgeTypes(schema);
111
113
  const options = {
112
114
  withEdgeSuffix: true,
@@ -45,7 +45,9 @@ exports.rule = {
45
45
  schema: [],
46
46
  },
47
47
  create(context) {
48
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
48
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
49
+ if (!schema)
50
+ return {};
49
51
  if (process.env.NODE_ENV === 'test' || !hasPageInfoChecked) {
50
52
  const pageInfoType = schema.getType('PageInfo');
51
53
  if (!pageInfoType) {
@@ -152,11 +152,13 @@ exports.rule = {
152
152
  }
153
153
  }
154
154
  if (rootField) {
155
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
156
- const rootTypeNames = (0, utils_1.getRootTypeNames)(schema);
157
- kinds.add(`:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
158
- ...rootTypeNames,
159
- ].join(',')})$/] > FieldDefinition`);
155
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
156
+ if (schema) {
157
+ const rootTypeNames = (0, utils_1.getRootTypeNames)(schema);
158
+ kinds.add(`:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
159
+ ...rootTypeNames,
160
+ ].join(',')})$/] > FieldDefinition`);
161
+ }
160
162
  }
161
163
  const selector = [...kinds].join(',');
162
164
  return {
@@ -45,7 +45,9 @@ exports.rule = {
45
45
  schema: [],
46
46
  },
47
47
  create(context) {
48
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
48
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
49
+ if (!schema)
50
+ return {};
49
51
  const mutationType = schema.getMutationType();
50
52
  const queryType = schema.getQueryType();
51
53
  if (!mutationType || !queryType) {
@@ -89,8 +89,10 @@ exports.rule = {
89
89
  schema,
90
90
  },
91
91
  create(context) {
92
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
93
- const siblings = (0, utils_js_1.requireSiblingsOperations)(RULE_ID, context);
92
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
93
+ const siblings = (0, utils_js_1.requireSiblingsOperations)(context);
94
+ if (!schema || !siblings)
95
+ return {};
94
96
  const { fieldName = DEFAULT_ID_FIELD_NAME } = context.options[0] || {};
95
97
  const idNames = (0, utils_1.asArray)(fieldName);
96
98
  // Check selections only in OperationDefinition,
@@ -78,11 +78,8 @@ exports.rule = {
78
78
  schema,
79
79
  },
80
80
  create(context) {
81
- let siblings = null;
82
- try {
83
- siblings = (0, utils_js_1.requireSiblingsOperations)(RULE_ID, context);
84
- }
85
- catch (_a) {
81
+ const siblings = (0, utils_js_1.requireSiblingsOperations)(context, false);
82
+ if (!siblings) {
86
83
  utils_js_1.logger.warn(`Rule "${RULE_ID}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
87
84
  }
88
85
  const { maxDepth, ignore = [] } = context.options[0];
@@ -116,7 +116,9 @@ exports.rule = {
116
116
  exceptions: {},
117
117
  ...context.options[0],
118
118
  };
119
- const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(RULE_ID, context);
119
+ const schema = (0, utils_js_1.requireGraphQLSchemaFromContext)(context);
120
+ if (!schema)
121
+ return {};
120
122
  const rootTypeNames = [
121
123
  schema.getQueryType(),
122
124
  schema.getMutationType(),
@@ -5,9 +5,8 @@ const path_1 = require("path");
5
5
  const graphql_1 = require("graphql");
6
6
  const utils_js_1 = require("../utils.js");
7
7
  const RULE_ID = 'unique-fragment-name';
8
- const checkNode = (context, node, ruleId) => {
8
+ const checkNode = (context, node, ruleId, siblings) => {
9
9
  const documentName = node.name.value;
10
- const siblings = (0, utils_js_1.requireSiblingsOperations)(ruleId, context);
11
10
  const siblingDocuments = node.kind === graphql_1.Kind.FRAGMENT_DEFINITION
12
11
  ? siblings.getFragment(documentName)
13
12
  : siblings.getOperation(documentName);
@@ -82,9 +81,12 @@ exports.rule = {
82
81
  schema: [],
83
82
  },
84
83
  create(context) {
84
+ const siblings = (0, utils_js_1.requireSiblingsOperations)(context);
85
+ if (!siblings)
86
+ return {};
85
87
  return {
86
88
  FragmentDefinition(node) {
87
- (0, exports.checkNode)(context, node, RULE_ID);
89
+ (0, exports.checkNode)(context, node, RULE_ID, siblings);
88
90
  },
89
91
  };
90
92
  },
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rule = void 0;
4
+ const utils_js_1 = require("../utils.js");
4
5
  const unique_fragment_name_js_1 = require("./unique-fragment-name.js");
5
6
  const RULE_ID = 'unique-operation-name';
6
7
  exports.rule = {
@@ -56,9 +57,12 @@ exports.rule = {
56
57
  schema: [],
57
58
  },
58
59
  create(context) {
60
+ const siblings = (0, utils_js_1.requireSiblingsOperations)(context);
61
+ if (!siblings)
62
+ return {};
59
63
  return {
60
64
  'OperationDefinition[name!=undefined]'(node) {
61
- (0, unique_fragment_name_js_1.checkNode)(context, node, RULE_ID);
65
+ (0, unique_fragment_name_js_1.checkNode)(context, node, RULE_ID, siblings);
62
66
  },
63
67
  };
64
68
  },
package/cjs/schema.js CHANGED
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSchema = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
5
  const debug_1 = tslib_1.__importDefault(require("debug"));
7
6
  const fast_glob_1 = tslib_1.__importDefault(require("fast-glob"));
8
7
  const graphql_1 = require("graphql");
@@ -35,7 +34,7 @@ function getSchema(project, schemaOptions) {
35
34
  }
36
35
  catch (error) {
37
36
  if (error instanceof Error) {
38
- error.message = chalk_1.default.red(`Error while loading schema: ${error.message}`);
37
+ error.message = `Error while loading schema: ${error.message}`;
39
38
  }
40
39
  schema = error;
41
40
  }
package/cjs/utils.js CHANGED
@@ -5,21 +5,35 @@ const tslib_1 = require("tslib");
5
5
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
6
  const graphql_1 = require("graphql");
7
7
  const lodash_lowercase_1 = tslib_1.__importDefault(require("lodash.lowercase"));
8
- function requireSiblingsOperations(ruleId, context) {
8
+ function requireSiblingsOperations(context, shouldReport = true) {
9
9
  const { siblingOperations } = context.parserServices;
10
10
  if (!siblingOperations.available) {
11
- throw new Error(`Rule \`${ruleId}\` requires \`parserOptions.operations\` to be set and loaded. See https://bit.ly/graphql-eslint-operations for more info`);
11
+ if (shouldReport) {
12
+ context.report({
13
+ loc: exports.REPORT_ON_FIRST_CHARACTER,
14
+ message: 'Rule requires `parserOptions.operations` to be set and loaded. See https://bit.ly/graphql-eslint-operations for more info',
15
+ });
16
+ }
17
+ return null;
12
18
  }
13
19
  return siblingOperations;
14
20
  }
15
21
  exports.requireSiblingsOperations = requireSiblingsOperations;
16
- function requireGraphQLSchemaFromContext(ruleId, context) {
22
+ function requireGraphQLSchemaFromContext(context) {
17
23
  const { schema } = context.parserServices;
18
24
  if (!schema) {
19
- throw new Error(`Rule \`${ruleId}\` requires \`parserOptions.schema\` to be set and loaded. See https://bit.ly/graphql-eslint-schema for more info`);
25
+ context.report({
26
+ loc: exports.REPORT_ON_FIRST_CHARACTER,
27
+ message: 'Rule requires `parserOptions.schema` to be set and loaded. See https://bit.ly/graphql-eslint-schema for more info',
28
+ });
29
+ return null;
20
30
  }
21
- else if (schema instanceof Error) {
22
- throw schema;
31
+ if (schema instanceof Error) {
32
+ context.report({
33
+ loc: exports.REPORT_ON_FIRST_CHARACTER,
34
+ message: schema.message,
35
+ });
36
+ return null;
23
37
  }
24
38
  return schema;
25
39
  }
@@ -70,10 +70,12 @@ const getMissingFragments = (node) => {
70
70
  const { fragmentDefs, fragmentSpreads } = getFragmentDefsAndFragmentSpreads(node);
71
71
  return [...fragmentSpreads].filter(name => !fragmentDefs.has(name));
72
72
  };
73
- const handleMissingFragments = ({ ruleId, context, node }) => {
73
+ const handleMissingFragments = ({ context, node }) => {
74
74
  const missingFragments = getMissingFragments(node);
75
75
  if (missingFragments.length > 0) {
76
- const siblings = requireSiblingsOperations(ruleId, context);
76
+ const siblings = requireSiblingsOperations(context);
77
+ if (!siblings)
78
+ return null;
77
79
  const fragmentsToAdd = [];
78
80
  for (const fragmentName of missingFragments) {
79
81
  const [foundFragment] = siblings.getFragment(fragmentName).map(source => source.document);
@@ -84,7 +86,6 @@ const handleMissingFragments = ({ ruleId, context, node }) => {
84
86
  if (fragmentsToAdd.length > 0) {
85
87
  // recall fn to make sure to add fragments inside fragments
86
88
  return handleMissingFragments({
87
- ruleId,
88
89
  context,
89
90
  node: {
90
91
  kind: Kind.DOCUMENT,
@@ -128,12 +129,18 @@ const validationToRule = ({ ruleId, ruleName, getDocumentNode, schema = [], hasD
128
129
  }
129
130
  return {
130
131
  Document(node) {
131
- const schema = docs.requiresSchema
132
- ? requireGraphQLSchemaFromContext(ruleId, context)
133
- : null;
132
+ let schema = null;
133
+ if (docs.requiresSchema) {
134
+ schema = requireGraphQLSchemaFromContext(context);
135
+ if (!schema)
136
+ return;
137
+ }
138
+ const rawNode = node.rawNode();
134
139
  const documentNode = getDocumentNode
135
- ? getDocumentNode({ ruleId, context, node: node.rawNode() })
136
- : node.rawNode();
140
+ ? getDocumentNode({ context, node: rawNode })
141
+ : rawNode;
142
+ if (!documentNode)
143
+ return;
137
144
  validateDocument({
138
145
  context,
139
146
  schema,
@@ -321,8 +328,10 @@ export const GRAPHQL_JS_VALIDATIONS = Object.assign({}, validationToRule({
321
328
  }), validationToRule({
322
329
  ruleId: 'no-unused-fragments',
323
330
  ruleName: 'NoUnusedFragments',
324
- getDocumentNode: ({ ruleId, context, node }) => {
325
- const siblings = requireSiblingsOperations(ruleId, context);
331
+ getDocumentNode: ({ context, node }) => {
332
+ const siblings = requireSiblingsOperations(context);
333
+ if (!siblings)
334
+ return null;
326
335
  const FilePathToDocumentsMap = [
327
336
  ...siblings.getOperations(),
328
337
  ...siblings.getFragments(),
@@ -80,7 +80,9 @@ export const rule = {
80
80
  schema: [],
81
81
  },
82
82
  create(context) {
83
- requireGraphQLSchemaFromContext(RULE_ID, context);
83
+ const schema = requireGraphQLSchemaFromContext(context);
84
+ if (!schema)
85
+ return {};
84
86
  function report(node, reason) {
85
87
  const nodeName = node.kind === Kind.ENUM ? node.value : node.name.value;
86
88
  const nodeType = node.kind === Kind.ENUM ? 'enum value' : 'field';
@@ -50,8 +50,10 @@ export const rule = {
50
50
  schema: [],
51
51
  },
52
52
  create(context) {
53
- const operations = requireSiblingsOperations(RULE_ID, context);
54
- const allDocuments = [...operations.getOperations(), ...operations.getFragments()];
53
+ const siblings = requireSiblingsOperations(context);
54
+ if (!siblings)
55
+ return {};
56
+ const allDocuments = [...siblings.getOperations(), ...siblings.getFragments()];
55
57
  const usedFragmentsMap = Object.create(null);
56
58
  for (const { document, filePath } of allDocuments) {
57
59
  const relativeFilePath = relative(CWD, filePath);
@@ -51,7 +51,9 @@ export const rule = {
51
51
  schema,
52
52
  },
53
53
  create(context) {
54
- const schema = requireGraphQLSchemaFromContext('no-root-type', context);
54
+ const schema = requireGraphQLSchemaFromContext(context);
55
+ if (!schema)
56
+ return {};
55
57
  const disallow = new Set(context.options[0].disallow);
56
58
  const rootTypeNames = [
57
59
  disallow.has('mutation') && schema.getMutationType(),
@@ -32,7 +32,9 @@ export const rule = {
32
32
  schema: [],
33
33
  },
34
34
  create(context) {
35
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
35
+ const schema = requireGraphQLSchemaFromContext(context);
36
+ if (!schema)
37
+ return {};
36
38
  const mutationType = schema.getMutationType();
37
39
  if (!mutationType) {
38
40
  return {};
@@ -126,7 +126,9 @@ export const rule = {
126
126
  hasSuggestions: true,
127
127
  },
128
128
  create(context) {
129
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
129
+ const schema = requireGraphQLSchemaFromContext(context);
130
+ if (!schema)
131
+ return {};
130
132
  const reachableTypes = getReachableTypes(schema);
131
133
  return {
132
134
  [`:matches(${KINDS}) > .name`](node) {
@@ -92,9 +92,11 @@ export const rule = {
92
92
  hasSuggestions: true,
93
93
  },
94
94
  create(context) {
95
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
96
- const siblingsOperations = requireSiblingsOperations(RULE_ID, context);
97
- const usedFields = getUsedFields(schema, siblingsOperations);
95
+ const schema = requireGraphQLSchemaFromContext(context);
96
+ const siblings = requireSiblingsOperations(context);
97
+ if (!schema || !siblings)
98
+ return {};
99
+ const usedFields = getUsedFields(schema, siblings);
98
100
  return {
99
101
  FieldDefinition(node) {
100
102
  var _a;
@@ -65,7 +65,9 @@ export const rule = {
65
65
  schema,
66
66
  },
67
67
  create(context) {
68
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
68
+ const schema = requireGraphQLSchemaFromContext(context);
69
+ if (!schema)
70
+ return {};
69
71
  const { includeBoth = true } = context.options[0] || {};
70
72
  return {
71
73
  'FieldDefinition > .gqlType Name[value=/Connection$/]'(node) {
@@ -103,7 +103,9 @@ export const rule = {
103
103
  schema,
104
104
  },
105
105
  create(context) {
106
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
106
+ const schema = requireGraphQLSchemaFromContext(context);
107
+ if (!schema)
108
+ return {};
107
109
  const edgeTypes = getEdgeTypes(schema);
108
110
  const options = {
109
111
  withEdgeSuffix: true,
@@ -42,7 +42,9 @@ export const rule = {
42
42
  schema: [],
43
43
  },
44
44
  create(context) {
45
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
45
+ const schema = requireGraphQLSchemaFromContext(context);
46
+ if (!schema)
47
+ return {};
46
48
  if (process.env.NODE_ENV === 'test' || !hasPageInfoChecked) {
47
49
  const pageInfoType = schema.getType('PageInfo');
48
50
  if (!pageInfoType) {
@@ -149,11 +149,13 @@ export const rule = {
149
149
  }
150
150
  }
151
151
  if (rootField) {
152
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
153
- const rootTypeNames = getRootTypeNames(schema);
154
- kinds.add(`:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
155
- ...rootTypeNames,
156
- ].join(',')})$/] > FieldDefinition`);
152
+ const schema = requireGraphQLSchemaFromContext(context);
153
+ if (schema) {
154
+ const rootTypeNames = getRootTypeNames(schema);
155
+ kinds.add(`:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
156
+ ...rootTypeNames,
157
+ ].join(',')})$/] > FieldDefinition`);
158
+ }
157
159
  }
158
160
  const selector = [...kinds].join(',');
159
161
  return {
@@ -42,7 +42,9 @@ export const rule = {
42
42
  schema: [],
43
43
  },
44
44
  create(context) {
45
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
45
+ const schema = requireGraphQLSchemaFromContext(context);
46
+ if (!schema)
47
+ return {};
46
48
  const mutationType = schema.getMutationType();
47
49
  const queryType = schema.getQueryType();
48
50
  if (!mutationType || !queryType) {
@@ -86,8 +86,10 @@ export const rule = {
86
86
  schema,
87
87
  },
88
88
  create(context) {
89
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
90
- const siblings = requireSiblingsOperations(RULE_ID, context);
89
+ const schema = requireGraphQLSchemaFromContext(context);
90
+ const siblings = requireSiblingsOperations(context);
91
+ if (!schema || !siblings)
92
+ return {};
91
93
  const { fieldName = DEFAULT_ID_FIELD_NAME } = context.options[0] || {};
92
94
  const idNames = asArray(fieldName);
93
95
  // Check selections only in OperationDefinition,
@@ -74,11 +74,8 @@ export const rule = {
74
74
  schema,
75
75
  },
76
76
  create(context) {
77
- let siblings = null;
78
- try {
79
- siblings = requireSiblingsOperations(RULE_ID, context);
80
- }
81
- catch (_a) {
77
+ const siblings = requireSiblingsOperations(context, false);
78
+ if (!siblings) {
82
79
  logger.warn(`Rule "${RULE_ID}" works best with siblings operations loaded. For more info: https://bit.ly/graphql-eslint-operations`);
83
80
  }
84
81
  const { maxDepth, ignore = [] } = context.options[0];
@@ -113,7 +113,9 @@ export const rule = {
113
113
  exceptions: {},
114
114
  ...context.options[0],
115
115
  };
116
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
116
+ const schema = requireGraphQLSchemaFromContext(context);
117
+ if (!schema)
118
+ return {};
117
119
  const rootTypeNames = [
118
120
  schema.getQueryType(),
119
121
  schema.getMutationType(),
@@ -2,9 +2,8 @@ import { relative } from 'path';
2
2
  import { Kind } from 'graphql';
3
3
  import { CWD, normalizePath, requireSiblingsOperations, VIRTUAL_DOCUMENT_REGEX } from '../utils.js';
4
4
  const RULE_ID = 'unique-fragment-name';
5
- export const checkNode = (context, node, ruleId) => {
5
+ export const checkNode = (context, node, ruleId, siblings) => {
6
6
  const documentName = node.name.value;
7
- const siblings = requireSiblingsOperations(ruleId, context);
8
7
  const siblingDocuments = node.kind === Kind.FRAGMENT_DEFINITION
9
8
  ? siblings.getFragment(documentName)
10
9
  : siblings.getOperation(documentName);
@@ -78,9 +77,12 @@ export const rule = {
78
77
  schema: [],
79
78
  },
80
79
  create(context) {
80
+ const siblings = requireSiblingsOperations(context);
81
+ if (!siblings)
82
+ return {};
81
83
  return {
82
84
  FragmentDefinition(node) {
83
- checkNode(context, node, RULE_ID);
85
+ checkNode(context, node, RULE_ID, siblings);
84
86
  },
85
87
  };
86
88
  },
@@ -1,3 +1,4 @@
1
+ import { requireSiblingsOperations } from '../utils.js';
1
2
  import { checkNode } from './unique-fragment-name.js';
2
3
  const RULE_ID = 'unique-operation-name';
3
4
  export const rule = {
@@ -53,9 +54,12 @@ export const rule = {
53
54
  schema: [],
54
55
  },
55
56
  create(context) {
57
+ const siblings = requireSiblingsOperations(context);
58
+ if (!siblings)
59
+ return {};
56
60
  return {
57
61
  'OperationDefinition[name!=undefined]'(node) {
58
- checkNode(context, node, RULE_ID);
62
+ checkNode(context, node, RULE_ID, siblings);
59
63
  },
60
64
  };
61
65
  },
package/esm/schema.js CHANGED
@@ -1,4 +1,3 @@
1
- import chalk from 'chalk';
2
1
  import debugFactory from 'debug';
3
2
  import fg from 'fast-glob';
4
3
  import { GraphQLSchema } from 'graphql';
@@ -31,7 +30,7 @@ export function getSchema(project, schemaOptions) {
31
30
  }
32
31
  catch (error) {
33
32
  if (error instanceof Error) {
34
- error.message = chalk.red(`Error while loading schema: ${error.message}`);
33
+ error.message = `Error while loading schema: ${error.message}`;
35
34
  }
36
35
  schema = error;
37
36
  }
package/esm/utils.js CHANGED
@@ -1,20 +1,34 @@
1
1
  import chalk from 'chalk';
2
2
  import { Kind } from 'graphql';
3
3
  import lowerCase from 'lodash.lowercase';
4
- export function requireSiblingsOperations(ruleId, context) {
4
+ export function requireSiblingsOperations(context, shouldReport = true) {
5
5
  const { siblingOperations } = context.parserServices;
6
6
  if (!siblingOperations.available) {
7
- throw new Error(`Rule \`${ruleId}\` requires \`parserOptions.operations\` to be set and loaded. See https://bit.ly/graphql-eslint-operations for more info`);
7
+ if (shouldReport) {
8
+ context.report({
9
+ loc: REPORT_ON_FIRST_CHARACTER,
10
+ message: 'Rule requires `parserOptions.operations` to be set and loaded. See https://bit.ly/graphql-eslint-operations for more info',
11
+ });
12
+ }
13
+ return null;
8
14
  }
9
15
  return siblingOperations;
10
16
  }
11
- export function requireGraphQLSchemaFromContext(ruleId, context) {
17
+ export function requireGraphQLSchemaFromContext(context) {
12
18
  const { schema } = context.parserServices;
13
19
  if (!schema) {
14
- throw new Error(`Rule \`${ruleId}\` requires \`parserOptions.schema\` to be set and loaded. See https://bit.ly/graphql-eslint-schema for more info`);
20
+ context.report({
21
+ loc: REPORT_ON_FIRST_CHARACTER,
22
+ message: 'Rule requires `parserOptions.schema` to be set and loaded. See https://bit.ly/graphql-eslint-schema for more info',
23
+ });
24
+ return null;
15
25
  }
16
- else if (schema instanceof Error) {
17
- throw schema;
26
+ if (schema instanceof Error) {
27
+ context.report({
28
+ loc: REPORT_ON_FIRST_CHARACTER,
29
+ message: schema.message,
30
+ });
31
+ return null;
18
32
  }
19
33
  return schema;
20
34
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphql-eslint/eslint-plugin",
3
- "version": "3.14.4-alpha-20230112222814-ed38c21",
3
+ "version": "3.14.4-alpha-20230112232227-647789a",
4
4
  "description": "GraphQL plugin for ESLint",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
@@ -1,5 +1,6 @@
1
1
  import { ExecutableDefinitionNode } from 'graphql';
2
2
  import { GraphQLESTreeNode } from '../estree-converter/index.cjs';
3
+ import { SiblingOperations } from '../siblings.cjs';
3
4
  import { GraphQLESLintRule, GraphQLESLintRuleContext } from '../types.cjs';
4
- export declare const checkNode: (context: GraphQLESLintRuleContext, node: GraphQLESTreeNode<ExecutableDefinitionNode>, ruleId: string) => void;
5
+ export declare const checkNode: (context: GraphQLESLintRuleContext, node: GraphQLESTreeNode<ExecutableDefinitionNode>, ruleId: string, siblings: SiblingOperations) => void;
5
6
  export declare const rule: GraphQLESLintRule;
@@ -1,5 +1,6 @@
1
1
  import { ExecutableDefinitionNode } from 'graphql';
2
2
  import { GraphQLESTreeNode } from '../estree-converter/index.js';
3
+ import { SiblingOperations } from '../siblings.js';
3
4
  import { GraphQLESLintRule, GraphQLESLintRuleContext } from '../types.js';
4
- export declare const checkNode: (context: GraphQLESLintRuleContext, node: GraphQLESTreeNode<ExecutableDefinitionNode>, ruleId: string) => void;
5
+ export declare const checkNode: (context: GraphQLESLintRuleContext, node: GraphQLESTreeNode<ExecutableDefinitionNode>, ruleId: string, siblings: SiblingOperations) => void;
5
6
  export declare const rule: GraphQLESLintRule;
@@ -3,8 +3,8 @@ import { Position } from 'estree';
3
3
  import { ASTNode, GraphQLSchema, Kind } from 'graphql';
4
4
  import { SiblingOperations } from './siblings.cjs';
5
5
  import { GraphQLESLintRuleContext } from './types.cjs';
6
- export declare function requireSiblingsOperations(ruleId: string, context: GraphQLESLintRuleContext): SiblingOperations | never;
7
- export declare function requireGraphQLSchemaFromContext(ruleId: string, context: GraphQLESLintRuleContext): GraphQLSchema | never;
6
+ export declare function requireSiblingsOperations(context: GraphQLESLintRuleContext, shouldReport?: boolean): SiblingOperations | null;
7
+ export declare function requireGraphQLSchemaFromContext(context: GraphQLESLintRuleContext): GraphQLSchema | null;
8
8
  export declare const logger: {
9
9
  error: (...args: unknown[]) => void;
10
10
  warn: (...args: unknown[]) => void;
@@ -3,8 +3,8 @@ import { Position } from 'estree';
3
3
  import { ASTNode, GraphQLSchema, Kind } from 'graphql';
4
4
  import { SiblingOperations } from './siblings.js';
5
5
  import { GraphQLESLintRuleContext } from './types.js';
6
- export declare function requireSiblingsOperations(ruleId: string, context: GraphQLESLintRuleContext): SiblingOperations | never;
7
- export declare function requireGraphQLSchemaFromContext(ruleId: string, context: GraphQLESLintRuleContext): GraphQLSchema | never;
6
+ export declare function requireSiblingsOperations(context: GraphQLESLintRuleContext, shouldReport?: boolean): SiblingOperations | null;
7
+ export declare function requireGraphQLSchemaFromContext(context: GraphQLESLintRuleContext): GraphQLSchema | null;
8
8
  export declare const logger: {
9
9
  error: (...args: unknown[]) => void;
10
10
  warn: (...args: unknown[]) => void;