Skip to content

Commit 1e5094b

Browse files
committed
[language server] Allow configuration of validation rules.
Closes #1056
1 parent 8e3efb5 commit 1e5094b

9 files changed

Lines changed: 54 additions & 62 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
- `apollo-graphql`
2121
- <First `apollo-graphql` related entry goes here>
2222
- `apollo-language-server`
23-
- <First `apollo-language-server` related entry goes here>
23+
- Allow configuration of validation rules [#1288](https://github.com/apollographql/apollo-tooling/pull/1288)
2424
- `apollo-tools`
2525
- <First `apollo-tools` related entry goes here>
2626
- `vscode-apollo`

package-lock.json

Lines changed: 18 additions & 44 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/apollo-codegen-core/src/loading.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ function extractDocumentsWithAST(
8787
// This currently ignores the anti-pattern of including an interpolated
8888
// string as anything other than a fragment definition, for example a
8989
// literal(these cases could be covered during the replacement of
90-
// literals in the signature calcluation)
90+
// literals in the signature calculation)
9191
finished.push(
9292
(path.value.quasi.quasis as Array<{
9393
value: { cooked: string; raw: string };

packages/apollo-language-server/src/config/config.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
import URI from "vscode-uri";
1010
import { WithRequired } from "apollo-env";
1111
import { getServiceName, parseServiceSpecifier } from "./utils";
12+
import { ValidationRule } from "graphql/validation/ValidationContext";
1213

1314
export interface EngineStatsWindow {
1415
to: number;
@@ -72,6 +73,17 @@ export interface ClientConfigFormat extends ConfigBase {
7273
tagName?: string;
7374
// stats window config
7475
statsWindow?: StatsWindowSize;
76+
77+
/**
78+
* Rules that will be applied when validating GraphQL documents.
79+
*
80+
* If you wish to modify the default list of validation rules, import them from the apollo package:
81+
*
82+
* ```js
83+
* const { defaultValidationRules } = require("apollo/lib/defaultValidationRules");
84+
* ```
85+
*/
86+
validationRules?: ValidationRule[];
7587
}
7688

7789
export const DefaultClientConfig = {

packages/apollo-language-server/src/config/loadConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ export async function loadConfig({
184184

185185
let { config, filepath } = loadedConfig;
186186

187-
// selectivly apply defaults when loading the config
187+
// selectively apply defaults when loading the config
188188
// this is just the includes/excludes defaults.
189189
// These need to go on _all_ configs. That's why this is last.
190190
if (config.client) config = merge({ client: DefaultClientConfig }, config);

packages/apollo-language-server/src/diagnostics.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ import { rangeForASTNode } from "./utilities/source";
1414

1515
import { getValidationErrors } from "./errors/validation";
1616
import { DocumentUri } from "./project/base";
17+
import { ValidationRule } from "graphql/validation/ValidationContext";
1718

1819
/**
1920
* Build an array of code diagnostics for all executable definitions in a document.
2021
*/
2122
export function collectExecutableDefinitionDiagnositics(
2223
schema: GraphQLSchema,
2324
queryDocument: GraphQLDocument,
24-
fragments: { [fragmentName: string]: FragmentDefinitionNode } = {}
25+
fragments: { [fragmentName: string]: FragmentDefinitionNode } = {},
26+
rules?: ValidationRule[]
2527
): Diagnostic[] {
2628
const ast = queryDocument.ast;
2729
if (!ast) return queryDocument.syntaxErrors;
@@ -36,7 +38,8 @@ export function collectExecutableDefinitionDiagnositics(
3638
for (const error of getValidationErrors(
3739
schema,
3840
astWithExecutableDefinitions,
39-
fragments
41+
fragments,
42+
rules
4043
)) {
4144
diagnostics.push(
4245
...diagnosticsFromError(error, DiagnosticSeverity.Error, "Validation")

packages/apollo-language-server/src/errors/validation.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,22 @@ import {
1616
} from "graphql";
1717

1818
import { ToolError, logError } from "./logger";
19+
import { ValidationRule } from "graphql/validation/ValidationContext";
20+
21+
const specifiedRulesToBeRemoved = [NoUnusedFragmentsRule, KnownDirectivesRule];
22+
23+
export const defaultValidationRules: ValidationRule[] = [
24+
NoAnonymousQueries,
25+
NoTypenameAlias,
26+
...specifiedRules.filter(rule => !specifiedRulesToBeRemoved.includes(rule))
27+
];
1928

2029
export function getValidationErrors(
2130
schema: GraphQLSchema,
2231
document: DocumentNode,
23-
fragments?: { [fragmentName: string]: FragmentDefinitionNode }
32+
fragments?: { [fragmentName: string]: FragmentDefinitionNode },
33+
rules: ValidationRule[] = defaultValidationRules
2434
) {
25-
const specifiedRulesToBeRemoved = [
26-
NoUnusedFragmentsRule,
27-
KnownDirectivesRule
28-
];
29-
30-
const rules = [
31-
NoAnonymousQueries,
32-
NoTypenameAlias,
33-
...specifiedRules.filter(rule => !specifiedRulesToBeRemoved.includes(rule))
34-
];
35-
3635
const typeInfo = new TypeInfo(schema);
3736
const context = new ValidationContext(schema, document, typeInfo);
3837

packages/apollo-language-server/src/project/client.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ export class GraphQLClientProject extends GraphQLProject {
237237
collectExecutableDefinitionDiagnositics(
238238
this.schema,
239239
document,
240-
fragments
240+
fragments,
241+
this.config.client.validationRules
241242
)
242243
);
243244
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export {
2+
defaultValidationRules
3+
} from "apollo-language-server/lib/errors/validation";

0 commit comments

Comments
 (0)