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

fix(overrides): json.formatter.trailingCommas should work #2025

Merged
Merged
Show file tree
Hide file tree
Changes from 3 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
2 changes: 1 addition & 1 deletion crates/biome_cli/src/commands/rage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ impl Display for RageConfiguration<'_, '_> {
{KeyValuePair("Indent size", markup!({DebugDisplayOption(json_formatter_configuration.indent_size)}))}
{KeyValuePair("Line ending", markup!({DebugDisplayOption(json_formatter_configuration.line_ending)}))}
{KeyValuePair("Line width", markup!({DebugDisplayOption(json_formatter_configuration.line_width.map(|lw| lw.get()))}))}
{KeyValuePair("Trailing Commas", markup!({DebugDisplayOption(json_formatter_configuration.trailing_commas)}))}
{KeyValuePair("Trailing Commas", markup!({DebugDisplay(json_formatter_configuration.trailing_commas)}))}
).fmt(fmt)?;
}

Expand Down
108 changes: 104 additions & 4 deletions crates/biome_cli/tests/commands/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2302,7 +2302,7 @@ fn format_json_when_allow_trailing_commas_write() {
}

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

Expand Down Expand Up @@ -2338,15 +2338,15 @@ fn format_omits_json_trailing_comma() {

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

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

Expand Down Expand Up @@ -2382,7 +2382,107 @@ fn format_omits_json_trailing_comma_omit() {

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

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

let config_json = r#"{
"json": {
"parser": { "allowTrailingCommas": true },
"formatter": { "trailingCommas": "none" }
},
"overrides": [{
"include": ["file.json"],
"json": {
"formatter": { "trailingCommas": "all" }
}
}]
}"#;
let biome_config = "biome.json";
let code = r#"{ "loreum_ipsum_lorem_ipsum": "bar", "loreum_ipsum_lorem_ipsum": "bar", "loreum_ipsum_lorem_ipsum": "bar", "loreum_ipsum_lorem_ipsum": "bar", "loreum_ipsum_lorem_ipsum": "bar",
}"#;
let file_path = Path::new("file.json");
fs.insert(file_path.into(), code.as_bytes());
fs.insert(biome_config.into(), config_json);

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, Path::new(file_path), "{\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n}\n");

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

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

let config_json = r#"{
"json": {
"parser": { "allowTrailingCommas": true },
"formatter": { "trailingCommas": "all" }
},
"overrides": [{
"include": ["file.json"],
"json": {
"formatter": { "trailingCommas": "none" }
}
}]
}"#;
let biome_config = "biome.json";
let code = r#"{ "loreum_ipsum_lorem_ipsum": "bar", "loreum_ipsum_lorem_ipsum": "bar", "loreum_ipsum_lorem_ipsum": "bar", "loreum_ipsum_lorem_ipsum": "bar", "loreum_ipsum_lorem_ipsum": "bar",
}"#;
let file_path = Path::new("file.json");
fs.insert(file_path.into(), code.as_bytes());
fs.insert(biome_config.into(), config_json);

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, Path::new(file_path), "{\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\",\n\t\"loreum_ipsum_lorem_ipsum\": \"bar\"\n}\n");

assert_cli_snapshot(SnapshotPayload::new(
module_path!(),
"format_json_trailing_commas_overrides_none",
fs,
console,
result,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,3 @@ expression: content
```block
Formatted 1 file in <TIME>. Fixed 1 file.
```


Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,3 @@ expression: content
```block
Formatted 1 file in <TIME>. Fixed 1 file.
```


Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
source: crates/biome_cli/tests/snap_test.rs
expression: content
---
## `biome.json`

```json
{
"json": {
"parser": { "allowTrailingCommas": true },
"formatter": { "trailingCommas": "none" }
},
"overrides": [
{
"include": ["file.json"],
"json": {
"formatter": { "trailingCommas": "all" }
}
}
]
}
```

## `file.json`

```json
{
"loreum_ipsum_lorem_ipsum": "bar",
"loreum_ipsum_lorem_ipsum": "bar",
"loreum_ipsum_lorem_ipsum": "bar",
"loreum_ipsum_lorem_ipsum": "bar",
"loreum_ipsum_lorem_ipsum": "bar",
}

```

# Emitted Messages

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

```json
{
"json": {
"parser": { "allowTrailingCommas": true },
"formatter": { "trailingCommas": "all" }
},
"overrides": [
{
"include": ["file.json"],
"json": {
"formatter": { "trailingCommas": "none" }
}
}
]
}
```

## `file.json`

```json
{
"loreum_ipsum_lorem_ipsum": "bar",
"loreum_ipsum_lorem_ipsum": "bar",
"loreum_ipsum_lorem_ipsum": "bar",
"loreum_ipsum_lorem_ipsum": "bar",
"loreum_ipsum_lorem_ipsum": "bar"
}

```

# Emitted Messages

```block
Formatted 1 file in <TIME>. Fixed 1 file.
```
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ JSON Formatter:
Indent size: unset
Line ending: Lf
Line width: 100
Trailing Commas: unset
Trailing Commas: None

Server:
Version: 0.0.0
Expand All @@ -121,5 +121,3 @@ Server:
Workspace:
Open Documents: 0
```


14 changes: 9 additions & 5 deletions crates/biome_json_formatter/src/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ pub struct JsonFormatOptions {
)]
pub enum TrailingCommas {
#[default]
/// The formatter will remove the trailing comma
/// The formatter will remove the trailing commas
None,
/// The trailing comma is allowed and advised
/// The trailing commas are allowed and advised
All,
}

Expand Down Expand Up @@ -131,8 +131,8 @@ impl JsonFormatOptions {
self
}

pub fn with_trailing_comma(mut self, trailing_comma: TrailingCommas) -> Self {
self.trailing_commas = trailing_comma;
pub fn with_trailing_commas(mut self, trailing_commas: TrailingCommas) -> Self {
self.trailing_commas = trailing_commas;
self
}

Expand All @@ -152,6 +152,10 @@ impl JsonFormatOptions {
self.line_width = line_width;
}

pub fn set_trailing_commas(&mut self, trailing_commas: TrailingCommas) {
self.trailing_commas = trailing_commas;
}

pub(crate) fn to_trailing_separator(&self) -> TrailingSeparator {
match self.trailing_commas {
TrailingCommas::None => TrailingSeparator::Omit,
Expand Down Expand Up @@ -192,6 +196,6 @@ impl fmt::Display for JsonFormatOptions {
writeln!(f, "Indent width: {}", self.indent_width.value())?;
writeln!(f, "Line ending: {}", self.line_ending)?;
writeln!(f, "Line width: {}", self.line_width.get())?;
writeln!(f, "Trailing comma: {}", self.trailing_commas)
writeln!(f, "Trailing commas: {}", self.trailing_commas)
}
}
4 changes: 2 additions & 2 deletions crates/biome_service/src/configuration/json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ pub struct JsonFormatter {

/// Print trailing commas wherever possible in multi-line comma-separated syntactic structures. Defaults to "none".
#[partial(bpaf(long("json-formatter-trailing-commas"), argument("none|all"), optional))]
pub trailing_commas: Option<TrailingCommas>,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like to keep this consistent with the rest of the CLI options.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reverted them in c0d3ab2.

There're some failures in CI tests, I'll take a look at them tomorrow.

pub trailing_commas: TrailingCommas,
}

impl PartialJsonFormatter {
Expand All @@ -83,7 +83,7 @@ impl PartialJsonFormatter {
indent_size: self.indent_size,
line_ending: self.line_ending,
line_width: self.line_width,
trailing_commas: self.trailing_commas,
trailing_commas: self.trailing_commas.unwrap_or_default(),
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions crates/biome_service/src/configuration/overrides.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,9 @@ fn to_json_language_settings(
.indent_style
.map(Into::into)
.or(parent_formatter.indent_style);
language_setting.formatter.trailing_commas = formatter
.trailing_commas
.or(parent_formatter.trailing_commas);

let parser = conf.parser.take().unwrap_or_default();
let parent_parser = &parent_settings.parser;
Expand Down
4 changes: 2 additions & 2 deletions crates/biome_service/src/file_handlers/json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ pub struct JsonFormatterSettings {
pub line_width: Option<LineWidth>,
pub indent_width: Option<IndentWidth>,
pub indent_style: Option<IndentStyle>,
pub trailing_comma: Option<TrailingCommas>,
pub trailing_commas: Option<TrailingCommas>,
pub enabled: Option<bool>,
}

Expand Down Expand Up @@ -95,7 +95,7 @@ impl Language for JsonLanguage {
.with_indent_style(indent_style)
.with_indent_width(indent_width)
.with_line_width(line_width)
.with_trailing_comma(language.trailing_comma.unwrap_or_default()),
.with_trailing_commas(language.trailing_commas.unwrap_or_default()),
)
}
}
Expand Down
6 changes: 4 additions & 2 deletions crates/biome_service/src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ impl From<JsonConfiguration> for LanguageSettings<JsonLanguage> {

language_setting.parser.allow_comments = json.parser.allow_comments;
language_setting.parser.allow_trailing_commas = json.parser.allow_trailing_commas;
language_setting.formatter.trailing_comma = json.formatter.trailing_commas;
language_setting.formatter.trailing_commas = Some(json.formatter.trailing_commas);
language_setting.formatter.enabled = Some(json.formatter.enabled);
language_setting.formatter.line_width = json.formatter.line_width;
language_setting.formatter.indent_width = json.formatter.indent_width.map(Into::into);
Expand Down Expand Up @@ -833,13 +833,15 @@ impl OverrideSettingPattern {
if let Some(indent_style) = json_formatter.indent_style.or(self.formatter.indent_style) {
options.set_indent_style(indent_style);
}

if let Some(indent_width) = json_formatter.indent_width.or(self.formatter.indent_width) {
options.set_indent_width(indent_width)
}
if let Some(line_width) = json_formatter.line_width.or(self.formatter.line_width) {
options.set_line_width(line_width);
}
if let Some(trailing_commas) = json_formatter.trailing_commas {
options.set_trailing_commas(trailing_commas);
}
let mut cache = self.cached_json_format_options.write().unwrap();
let _ = cache.insert(options.clone());
}
Expand Down
4 changes: 2 additions & 2 deletions packages/@biomejs/biome/configuration_schema.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading