Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: enable GraphQL linting #3350

Merged
merged 5 commits into from
Jul 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ our [guidelines for writing a good changelog entry](https://github.com/biomejs/b

### CLI

#### New features

- Add `--graphql-linter-enabled` option, to control whether the linter should enabled or not for GraphQL files. Contributed by @ematipico

### Configuration

- Add support for loading configuration from `.editorconfig` files ([#1724](https://github.com/biomejs/biome/issues/1724)). Contributed by @dyc3
Expand Down Expand Up @@ -69,6 +73,10 @@ our [guidelines for writing a good changelog entry](https://github.com/biomejs/b

Contributed by @Conaclos

#### New features

- Add support for GraphQL linting. Contributed by @ematipico

#### Bug fixes

- Don't request alt text for elements hidden from assistive technologies ([#3316](https://github.com/biomejs/biome/issues/3316)). Contributed by @robintown
Expand Down
9 changes: 8 additions & 1 deletion crates/biome_cli/src/commands/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use crate::{
use biome_configuration::vcs::PartialVcsConfiguration;
use biome_configuration::{
PartialCssFormatter, PartialFilesConfiguration, PartialFormatterConfiguration,
PartialJavascriptFormatter, PartialJsonFormatter,
PartialGraphqlFormatter, PartialJavascriptFormatter, PartialJsonFormatter,
};
use biome_console::{markup, ConsoleExt};
use biome_deserialize::Merge;
Expand All @@ -27,6 +27,7 @@ pub(crate) struct FormatCommandPayload {
pub(crate) javascript_formatter: Option<PartialJavascriptFormatter>,
pub(crate) json_formatter: Option<PartialJsonFormatter>,
pub(crate) css_formatter: Option<PartialCssFormatter>,
pub(crate) graphql_formatter: Option<PartialGraphqlFormatter>,
pub(crate) formatter_configuration: Option<PartialFormatterConfiguration>,
pub(crate) vcs_configuration: Option<PartialVcsConfiguration>,
pub(crate) files_configuration: Option<PartialFilesConfiguration>,
Expand Down Expand Up @@ -57,6 +58,7 @@ pub(crate) fn format(
fix,
mut json_formatter,
css_formatter,
graphql_formatter,
since,
staged,
changed,
Expand Down Expand Up @@ -196,6 +198,11 @@ pub(crate) fn format(
let css = configuration.css.get_or_insert_with(Default::default);
css.formatter.merge_with(css_formatter);
}
if graphql_formatter.is_some() {
let graphql = configuration.graphql.get_or_insert_with(Default::default);
graphql.formatter.merge_with(graphql_formatter);
}

if javascript_formatter.is_some() {
let javascript = configuration
.javascript
Expand Down
12 changes: 11 additions & 1 deletion crates/biome_cli/src/commands/lint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ use biome_configuration::json::PartialJsonLinter;
use biome_configuration::linter::RuleSelector;
use biome_configuration::vcs::PartialVcsConfiguration;
use biome_configuration::{
PartialConfiguration, PartialFilesConfiguration, PartialLinterConfiguration,
PartialConfiguration, PartialFilesConfiguration, PartialGraphqlLinter,
PartialLinterConfiguration,
};
use biome_deserialize::Merge;
use biome_service::configuration::{
Expand Down Expand Up @@ -43,6 +44,7 @@ pub(crate) struct LintCommandPayload {
pub(crate) javascript_linter: Option<PartialJavascriptLinter>,
pub(crate) json_linter: Option<PartialJsonLinter>,
pub(crate) css_linter: Option<PartialCssLinter>,
pub(crate) graphql_linter: Option<PartialGraphqlLinter>,
}

/// Handler for the "lint" command of the Biome CLI
Expand All @@ -67,6 +69,7 @@ pub(crate) fn lint(session: CliSession, payload: LintCommandPayload) -> Result<(
javascript_linter,
css_linter,
json_linter,
graphql_linter,
} = payload;
setup_cli_subscriber(cli_options.log_level, cli_options.log_kind);

Expand Down Expand Up @@ -118,6 +121,13 @@ pub(crate) fn lint(session: CliSession, payload: LintCommandPayload) -> Result<(
let css = fs_configuration.css.get_or_insert_with(Default::default);
css.linter.merge_with(css_linter);
}

if graphql_linter.is_some() {
let graphql = fs_configuration
.graphql
.get_or_insert_with(Default::default);
graphql.linter.merge_with(graphql_linter);
}
if javascript_linter.is_some() {
let javascript = fs_configuration
.javascript
Expand Down
12 changes: 10 additions & 2 deletions crates/biome_cli/src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ use biome_configuration::javascript::PartialJavascriptLinter;
use biome_configuration::json::PartialJsonLinter;
use biome_configuration::linter::RuleSelector;
use biome_configuration::{
css::partial_css_formatter, css::partial_css_linter, javascript::partial_javascript_formatter,
css::partial_css_formatter, css::partial_css_linter, graphql::partial_graphql_formatter,
graphql::partial_graphql_linter, javascript::partial_javascript_formatter,
javascript::partial_javascript_linter, json::partial_json_formatter, json::partial_json_linter,
partial_configuration, partial_files_configuration, partial_formatter_configuration,
partial_linter_configuration, vcs::partial_vcs_configuration, vcs::PartialVcsConfiguration,
PartialCssFormatter, PartialFilesConfiguration, PartialFormatterConfiguration,
PartialJavascriptFormatter, PartialJsonFormatter, PartialLinterConfiguration,
PartialGraphqlFormatter, PartialGraphqlLinter, PartialJavascriptFormatter,
PartialJsonFormatter, PartialLinterConfiguration,
};
use biome_configuration::{BiomeDiagnostic, PartialConfiguration};
use biome_console::{markup, Console, ConsoleExt};
Expand Down Expand Up @@ -190,6 +192,9 @@ pub enum BiomeCommand {
#[bpaf(external(partial_css_linter), optional, hide_usage, hide)]
css_linter: Option<PartialCssLinter>,

#[bpaf(external(partial_graphql_linter), optional, hide_usage, hide)]
graphql_linter: Option<PartialGraphqlLinter>,

#[bpaf(external, hide_usage)]
cli_options: CliOptions,

Expand Down Expand Up @@ -246,6 +251,9 @@ pub enum BiomeCommand {
#[bpaf(external(partial_css_formatter), optional, hide_usage, hide)]
css_formatter: Option<PartialCssFormatter>,

#[bpaf(external(partial_graphql_formatter), optional, hide_usage, hide)]
graphql_formatter: Option<PartialGraphqlFormatter>,

#[bpaf(external(partial_vcs_configuration), optional, hide_usage)]
vcs_configuration: Option<PartialVcsConfiguration>,

Expand Down
4 changes: 3 additions & 1 deletion crates/biome_cli/src/commands/rage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ impl Display for RageConfiguration<'_, '_> {
configuration.get_graphql_formatter_configuration();
markup! (
{Section("GraphQL Formatter")}
{KeyValuePair("Enabled", markup!({DebugDisplay(graphql_formatter_configuration.enabled)}))}
{KeyValuePair("Enabled", markup!({DebugDisplayOption(graphql_formatter_configuration.enabled)}))}
{KeyValuePair("Indent style", markup!({DebugDisplayOption(graphql_formatter_configuration.indent_style)}))}
{KeyValuePair("Indent width", markup!({DebugDisplayOption(graphql_formatter_configuration.indent_width)}))}
{KeyValuePair("Line ending", markup!({DebugDisplayOption(graphql_formatter_configuration.line_ending)}))}
Expand All @@ -288,11 +288,13 @@ impl Display for RageConfiguration<'_, '_> {
let javascript_linter = configuration.get_javascript_linter_configuration();
let json_linter = configuration.get_json_linter_configuration();
let css_linter = configuration.get_css_linter_configuration();
let graphq_linter = configuration.get_graphql_linter_configuration();
markup! (
{Section("Linter")}
{KeyValuePair("JavaScript enabled", markup!({DebugDisplay(javascript_linter.enabled)}))}
{KeyValuePair("JSON enabled", markup!({DebugDisplay(json_linter.enabled)}))}
{KeyValuePair("CSS enabled", markup!({DebugDisplay(css_linter.enabled)}))}
{KeyValuePair("GraphQL enabled", markup!({DebugDisplayOption(graphq_linter.enabled)}))}
{KeyValuePair("Recommended", markup!({DebugDisplay(linter_configuration.recommended.unwrap_or_default())}))}
{KeyValuePair("All", markup!({DebugDisplay(linter_configuration.all.unwrap_or_default())}))}
{RageConfigurationLintRules("Enabled rules",linter_configuration)}
Expand Down
4 changes: 4 additions & 0 deletions crates/biome_cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ impl<'app> CliSession<'app> {
css_linter,
javascript_linter,
json_linter,
graphql_linter,
} => commands::lint::lint(
self,
LintCommandPayload {
Expand All @@ -157,6 +158,7 @@ impl<'app> CliSession<'app> {
css_linter,
javascript_linter,
json_linter,
graphql_linter,
},
),
BiomeCommand::Ci {
Expand Down Expand Up @@ -193,6 +195,7 @@ impl<'app> CliSession<'app> {
files_configuration,
json_formatter,
css_formatter,
graphql_formatter,
staged,
changed,
since,
Expand All @@ -210,6 +213,7 @@ impl<'app> CliSession<'app> {
files_configuration,
json_formatter,
css_formatter,
graphql_formatter,
staged,
changed,
since,
Expand Down
115 changes: 115 additions & 0 deletions crates/biome_cli/tests/cases/graphql.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
use crate::run_cli;
use crate::snap_test::{assert_cli_snapshot, assert_file_contents, SnapshotPayload};
use biome_console::BufferConsole;
use biome_fs::MemoryFileSystem;
use biome_service::DynRef;
use bpaf::Args;
use std::path::Path;

const UNFORMATTED: &str = r#"type Query {
me: User
}

type User { id: ID name: String
}"#;

const FORMATTED: &str = "type Query {\n\tme: User\n}\n\ntype User {\n\tid: ID\n\tname: String\n}\n";

const MISSING_REASON: &str = r#"query {
member @deprecated {
id
}
}"#;

#[test]
fn format_graphql_files() {
let mut fs = MemoryFileSystem::default();
let mut console = BufferConsole::default();

let file_path = Path::new("file.graphql");
fs.insert(file_path.into(), UNFORMATTED.as_bytes());

let result = run_cli(
DynRef::Borrowed(&mut fs),
&mut console,
Args::from([("format"), file_path.as_os_str().to_str().unwrap()].as_slice()),
);

assert!(result.is_err(), "run_cli returned {result:?}");

assert_file_contents(&fs, file_path, UNFORMATTED);

assert_cli_snapshot(SnapshotPayload::new(
module_path!(),
"format_graphql_files",
fs,
console,
result,
));
}

#[test]
fn format_and_write_graphql_files() {
let mut fs = MemoryFileSystem::default();
let mut console = BufferConsole::default();

let file_path = Path::new("file.graphql");
fs.insert(file_path.into(), UNFORMATTED.as_bytes());

let result = run_cli(
DynRef::Borrowed(&mut fs),
&mut console,
Args::from(
[
("format"),
"--write",
file_path.as_os_str().to_str().unwrap(),
]
.as_slice(),
),
);

assert!(result.is_ok(), "run_cli returned {result:?}");

assert_file_contents(&fs, file_path, FORMATTED);

assert_cli_snapshot(SnapshotPayload::new(
module_path!(),
"format_and_write_graphql_files",
fs,
console,
result,
));
}

#[test]
fn lint_single_rule() {
let mut fs = MemoryFileSystem::default();
let mut console = BufferConsole::default();

let file_path = Path::new("file.graphql");
fs.insert(file_path.into(), MISSING_REASON.as_bytes());

let result = run_cli(
DynRef::Borrowed(&mut fs),
&mut console,
Args::from(
[
("lint"),
"--only=nursery/useDeprecatedReason",
file_path.as_os_str().to_str().unwrap(),
]
.as_slice(),
),
);

assert!(result.is_ok(), "run_cli returned {result:?}");

assert_cli_snapshot(SnapshotPayload::new(
module_path!(),
"lint_single_rule",
fs,
console,
result,
));
}
1 change: 1 addition & 0 deletions crates/biome_cli/tests/cases/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ mod config_path;
mod cts_files;
mod diagnostics;
mod editorconfig;
mod graphql;
mod handle_astro_files;
mod handle_css_files;
mod handle_svelte_files;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
source: crates/biome_cli/tests/snap_test.rs
expression: content
---
## `file.graphql`

```graphql
type Query {
me: User
}

type User {
id: ID
name: String
}

```

# Emitted Messages

```block
Formatted 1 file in <TIME>. Fixed 1 file.
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
source: crates/biome_cli/tests/snap_test.rs
expression: content
---
## `file.graphql`

```graphql
type Query {
me: User
}

type User { id: ID name: String
}
```

# Termination Message

```block
format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× Some errors were emitted while running checks.



```

# Emitted Messages

```block
file.graphql format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× Formatter would have printed the following content:

1 1 │ type Query {
2 │ - ············me:·User
2 │ + → me:·User
3 3 │ }
4 4 │
5 │ - type·User·{···id:·ID···name:·String
6 │ - }
5 │ + type·User·{
6 │ + → id:·ID
7 │ + → name:·String
8 │ + }
9 │ +


```

```block
Checked 1 file in <TIME>. No fixes applied.
Found 1 error.
```
Loading