From eb4cfc25a1f7d6aeff31c5f25e5957fb19658681 Mon Sep 17 00:00:00 2001 From: Ze-Zheng Wu Date: Mon, 13 May 2024 13:44:51 +0800 Subject: [PATCH] fix: deprecate `javascript.trailingComma` in favor of `javascript.trailingCommas` --- CHANGELOG.md | 4 + Cargo.lock | 1 + crates/biome_cli/src/commands/format.rs | 29 +++++- crates/biome_cli/src/commands/rage.rs | 5 +- .../biome_cli/src/execute/migrate/prettier.rs | 14 +-- crates/biome_cli/tests/commands/format.rs | 92 +++++++++++++++++-- .../main_commands_check/check_help.snap | 2 + .../snapshots/main_commands_ci/ci_help.snap | 2 + ...ap => applies_custom_trailing_commas.snap} | 0 ...mmas_overriding_the_deprecated_option.snap | 28 ++++++ ...ng_commas_using_the_deprecated_option.snap | 28 ++++++ .../main_commands_format/format_help.snap | 2 + ...snap => trailing_commas_parse_errors.snap} | 4 +- .../prettier_migrate.snap | 2 +- .../prettier_migrate_end_of_line.snap | 2 +- .../prettier_migrate_jsonc.snap | 2 +- .../prettier_migrate_overrides.snap | 2 +- .../prettier_migrate_with_ignore.snap | 2 +- .../prettier_migrate_write.snap | 2 +- .../prettier_migrate_write_biome_jsonc.snap | 2 +- .../prettier_migrate_write_packagejson.snap | 2 +- ...ettier_migrate_write_with_ignore_file.snap | 2 +- .../prettierjson_migrate_write.snap | 2 +- .../with_formatter_configuration.snap | 5 +- .../src/javascript/formatter.rs | 16 +++- .../src/lint/style/use_enum_initializers.rs | 2 +- crates/biome_js_formatter/src/context.rs | 22 ++--- .../{trailing_comma.rs => trailing_commas.rs} | 46 +++++----- .../expressions/arrow_function_expression.rs | 8 +- .../src/js/expressions/call_arguments.rs | 4 +- .../src/js/lists/array_element_list.rs | 4 +- .../lists/export_named_from_specifier_list.rs | 4 +- .../js/lists/export_named_specifier_list.rs | 4 +- .../js/lists/import_assertion_entry_list.rs | 4 +- .../js/lists/named_import_specifier_list.rs | 4 +- ...object_assignment_pattern_property_list.rs | 4 +- .../object_binding_pattern_property_list.rs | 4 +- .../src/js/lists/object_member_list.rs | 4 +- .../src/js/lists/parameter_list.rs | 4 +- .../src/ts/lists/enum_member_list.rs | 4 +- .../src/ts/lists/tuple_type_element_list.rs | 4 +- .../src/ts/lists/type_parameter_list.rs | 4 +- crates/biome_js_formatter/src/utils/array.rs | 6 +- crates/biome_js_formatter/src/utils/mod.rs | 4 +- .../js/module/array/array_nested.js.snap | 5 +- .../js/module/array/binding_pattern.js.snap | 5 +- .../specs/js/module/array/empty_lines.js.snap | 5 +- .../specs/js/module/array/spaces.js.snap | 5 +- .../specs/js/module/array/spread.js.snap | 5 +- .../es5/array_trailing_commas.js} | 0 .../es5/array_trailing_commas.js.snap} | 4 +- .../none => trailing-commas/es5}/options.json | 2 +- .../none/array_trailing_commas.js} | 0 .../none/array_trailing_commas.js.snap} | 4 +- .../trailing-commas}/none/options.json | 2 +- .../js/module/arrow/arrow-comments.js.snap | 4 +- .../module/arrow/arrow_chain_comments.js.snap | 4 +- .../js/module/arrow/arrow_function.js.snap | 4 +- .../js/module/arrow/arrow_nested.js.snap | 4 +- .../module/arrow/arrow_test_callback.js.snap | 4 +- .../assignment_binding_line_break.js.snap | 4 +- .../tests/specs/js/module/arrow/call.js.snap | 4 +- .../js/module/arrow/curried_indents.js.snap | 4 +- .../specs/js/module/arrow/currying.js.snap | 4 +- .../specs/js/module/arrow/params.js.snap | 4 +- .../assignment/array-assignment-holes.js.snap | 5 +- .../js/module/assignment/assignment.js.snap | 5 +- .../assignment/assignment_ignore.js.snap | 5 +- .../binding/array-binding-holes.js.snap | 4 +- .../js/module/binding/array_binding.js.snap | 4 +- .../module/binding/identifier_binding.js.snap | 4 +- .../js/module/binding/nested_bindings.js.snap | 4 +- .../js/module/binding/object_binding.js.snap | 4 +- .../specs/js/module/bom_character.js.snap | 5 +- .../specs/js/module/call/call_chain.js.snap | 5 +- .../js/module/call/simple_arguments.js.snap | 5 +- .../specs/js/module/call_expression.js.snap | 5 +- .../tests/specs/js/module/class/class.js.snap | 5 +- .../js/module/class/class_comments.js.snap | 5 +- .../js/module/class/private_method.js.snap | 5 +- .../tests/specs/js/module/comments.js.snap | 5 +- .../js/module/comments/import_exports.js.snap | 5 +- .../nested_comments/nested_comments.js.snap | 4 +- .../declarations/variable_declaration.js.snap | 5 +- .../class_members_call_decorator.js.snap | 5 +- .../decorators/class_members_mixed.js.snap | 5 +- .../decorators/class_members_simple.js.snap | 5 +- .../js/module/decorators/class_simple.js.snap | 5 +- .../class_simple_call_decorator.js.snap | 5 +- .../decorators/export_default_1.js.snap | 5 +- .../decorators/export_default_2.js.snap | 5 +- .../decorators/export_default_3.js.snap | 5 +- .../decorators/export_default_4.js.snap | 5 +- .../js/module/decorators/expression.js.snap | 5 +- .../js/module/decorators/multiline.js.snap | 5 +- .../tests/specs/js/module/each/each.js.snap | 5 +- .../export_bracket_spacing.js.snap | 4 +- .../js/module/export/class_clause.js.snap | 5 +- .../module/export/expression_clause.js.snap | 5 +- .../js/module/export/from_clause.js.snap | 5 +- .../js/module/export/function_clause.js.snap | 5 +- .../js/module/export/named_clause.js.snap | 5 +- .../module/export/named_from_clause.js.snap | 5 +- .../es5/export_trailing_commas.js} | 0 .../es5/export_trailing_commas.js.snap} | 6 +- .../es5/options.json | 2 +- .../none/export_trailing_commas.js} | 0 .../none/export_trailing_commas.js.snap} | 6 +- .../trailing-commas/none}/options.json | 2 +- .../export/variable_declaration.js.snap | 5 +- .../expression/binary_expression.js.snap | 5 +- .../binary_range_expression.js.snap | 5 +- .../expression/binaryish_expression.js.snap | 5 +- .../computed-member-expression.js.snap | 5 +- .../expression/conditional_expression.js.snap | 2 +- .../import_meta_expression.js.snap | 4 +- .../expression/literal_expression.js.snap | 5 +- .../expression/logical_expression.js.snap | 2 +- .../member-chain/complex_arguments.js.snap | 5 +- .../expression/member-chain/computed.js.snap | 5 +- .../member-chain/inline-merge.js.snap | 5 +- .../member-chain/multi_line.js.snap | 5 +- .../member-chain/static_member_regex.js.snap | 5 +- .../nested_conditional_expression.js.snap | 4 +- .../module/expression/new_expression.js.snap | 5 +- .../expression/post_update_expression.js.snap | 5 +- .../expression/pre_update_expression.js.snap | 5 +- .../expression/sequence_expression.js.snap | 5 +- .../static_member_expression.js.snap | 5 +- .../module/expression/this_expression.js.snap | 5 +- .../expression/unary_expression.js.snap | 6 +- ...unary_expression_verbatim_argument.js.snap | 5 +- .../specs/js/module/function/function.js.snap | 5 +- .../js/module/function/function_args.js.snap | 5 +- .../module/function/function_comments.js.snap | 5 +- .../tests/specs/js/module/ident.js.snap | 5 +- .../js/module/import/bare_import.js.snap | 5 +- .../import_bracket_spacing.js.snap | 4 +- .../js/module/import/default_import.js.snap | 5 +- .../js/module/import/import_call.js.snap | 5 +- .../module/import/import_specifiers.js.snap | 5 +- .../module/import/named_import_clause.js.snap | 2 +- .../js/module/import/namespace_import.js.snap | 5 +- .../import/trailing-comma/none/options.json | 8 -- .../es5/import_trailing_commas.js} | 0 .../es5/import_trailing_commas.js.snap} | 6 +- .../es5/options.json | 2 +- .../none/import_trailing_commas.js} | 0 .../none/import_trailing_commas.js.snap} | 6 +- .../import/trailing-commas/none/options.json | 8 ++ .../module/indent-width/4/example-1.js.snap | 4 +- .../module/indent-width/4/example-2.js.snap | 4 +- .../module/indent-width/8/example-1.js.snap | 4 +- .../module/indent-width/8/example-2.js.snap | 4 +- .../interpreter-with-trailing-spaces.js.snap | 5 +- .../tests/specs/js/module/interpreter.js.snap | 5 +- .../interpreter_with_empty_line.js.snap | 5 +- .../js/module/invalid/block_stmt_err.js.snap | 5 +- .../js/module/invalid/if_stmt_err.js.snap | 5 +- .../module/line-ending/cr/line_ending.js.snap | 4 +- .../line-ending/crlf/line_ending.js.snap | 4 +- .../tests/specs/js/module/newlines.js.snap | 5 +- .../specs/js/module/no-semi/class.js.snap | 4 +- .../specs/js/module/no-semi/issue2006.js.snap | 4 +- .../specs/js/module/no-semi/no-semi.js.snap | 4 +- .../js/module/no-semi/private-field.js.snap | 4 +- .../js/module/no-semi/semicolons-asi.js.snap | 4 +- .../module/no-semi/semicolons_range.js.snap | 4 +- .../specs/js/module/number/number.js.snap | 5 +- .../module/number/number_with_space.js.snap | 5 +- .../object_bracket_spacing.js.snap | 4 +- .../js/module/object/computed_member.js.snap | 5 +- .../js/module/object/getter_setter.js.snap | 5 +- .../js/module/object/numeric-property.js.snap | 5 +- .../specs/js/module/object/object.js.snap | 5 +- .../js/module/object/object_comments.js.snap | 5 +- .../module/object/octal_literals_key.js.snap | 5 +- .../js/module/object/property_key.js.snap | 5 +- .../object/property_object_member.js.snap | 5 +- .../object/trailing-comma/none/options.json | 8 -- .../es5/object_trailing_commas.js} | 0 .../es5/object_trailing_commas.js.snap} | 6 +- .../es5/options.json | 2 +- .../none/object_trailing_commas.js} | 0 .../none/object_trailing_commas.js.snap} | 6 +- .../object/trailing-commas/none/options.json | 8 ++ .../js/module/parentheses/parentheses.js.snap | 5 +- .../range_parentheses_binary.js.snap | 5 +- .../range_parenthesis_after_semicol.js.snap | 5 +- .../range_parenthesis_after_semicol_1.js.snap | 5 +- .../tests/specs/js/module/script.js.snap | 5 +- .../module/statement/block_statement.js.snap | 5 +- .../js/module/statement/continue_stmt.js.snap | 2 +- .../js/module/statement/do_while.js.snap | 5 +- .../js/module/statement/empty_blocks.js.snap | 5 +- .../specs/js/module/statement/for_in.js.snap | 5 +- .../js/module/statement/for_loop.js.snap | 5 +- .../specs/js/module/statement/for_of.js.snap | 5 +- .../js/module/statement/if_chain.js.snap | 5 +- .../specs/js/module/statement/if_else.js.snap | 5 +- .../specs/js/module/statement/return.js.snap | 2 +- .../return_verbatim_argument.js.snap | 5 +- .../js/module/statement/statement.js.snap | 5 +- .../specs/js/module/statement/switch.js.snap | 5 +- .../module/statement/switch_comment.js.snap | 5 +- .../specs/js/module/statement/throw.js.snap | 5 +- .../statement/try_catch_finally.js.snap | 5 +- .../js/module/statement/while_loop.js.snap | 5 +- .../string/quotePreserve/directives.js.snap | 4 +- .../quotePreserve/parentheses_token.js.snap | 4 +- .../quotePreserve/properties_quotes.js.snap | 4 +- .../string/quotePreserve/string.js.snap | 4 +- .../string/quoteSingle/directives.js.snap | 4 +- .../quoteSingle/parentheses_token.js.snap | 4 +- .../quoteSingle/properties_quotes.js.snap | 4 +- .../module/string/quoteSingle/string.js.snap | 4 +- .../tests/specs/js/module/suppression.js.snap | 5 +- .../specs/js/module/template/template.js.snap | 2 +- .../tests/specs/js/module/with.js.snap | 5 +- .../tests/specs/js/script/script.js.snap | 5 +- .../specs/js/script/script_with_bom.js.snap | 5 +- .../tests/specs/js/script/with.js.snap | 5 +- .../tests/specs/jsx/arrow_function.jsx.snap | 5 +- .../tests/specs/jsx/attribute_escape.jsx.snap | 5 +- .../attribute_position.jsx.snap | 4 +- .../tests/specs/jsx/attributes.jsx.snap | 5 +- .../bracket_same_line.jsx.snap | 4 +- .../tests/specs/jsx/comments.jsx.snap | 2 +- .../tests/specs/jsx/conditional.jsx.snap | 5 +- .../tests/specs/jsx/element.jsx.snap | 2 +- .../tests/specs/jsx/fragment.jsx.snap | 5 +- .../tests/specs/jsx/new-lines.jsx.snap | 5 +- .../specs/jsx/parentheses_range.jsx.snap | 5 +- .../quote_style.jsx.snap | 4 +- .../quote_style.jsx.snap | 4 +- .../quote_style.jsx.snap | 4 +- .../quote_style.jsx.snap | 4 +- .../tests/specs/jsx/self_closing.jsx.snap | 5 +- .../tests/specs/jsx/smoke.jsx.snap | 5 +- .../tests/specs/jsx/text_children.jsx.snap | 5 +- .../specs/ts/arrow/arrow_parentheses.ts.snap | 4 +- ..._arrow_parentheses_with_line_break.ts.snap | 4 +- ...rameter_default_binding_line_break.ts.snap | 4 +- .../tests/specs/ts/arrow_chain.ts.snap | 5 +- .../specs/ts/assignment/as_assignment.ts.snap | 5 +- .../specs/ts/assignment/assignment.ts.snap | 5 +- .../ts/assignment/assignment_comments.ts.snap | 5 +- .../property_assignment_comments.ts.snap | 5 +- .../type_assertion_assignment.ts.snap | 5 +- .../ts/binding/definite_variable.ts.snap | 5 +- .../tests/specs/ts/call_expression.ts.snap | 5 +- .../tests/specs/ts/class/accessor.ts.snap | 5 +- .../specs/ts/class/assigment_layout.ts.snap | 5 +- .../ts/class/constructor_parameter.ts.snap | 5 +- .../specs/ts/class/implements_clause.ts.snap | 5 +- .../class/readonly_ambient_property.ts.snap | 5 +- .../es5/class_trailing_commas.ts} | 0 .../es5/class_trailing_commas.ts.snap} | 6 +- .../es5/options.json | 2 +- .../none/class_trailing_commas.ts} | 0 .../none/class_trailing_commas.ts.snap} | 6 +- .../trailing_commas}/none/options.json | 2 +- .../tests/specs/ts/declaration/class.ts.snap | 5 +- .../ts/declaration/declare_function.ts.snap | 5 +- .../ts/declaration/global_declaration.ts.snap | 5 +- .../specs/ts/declaration/interface.ts.snap | 5 +- .../declaration/variable_declaration.ts.snap | 5 +- .../tests/specs/ts/declare.ts.snap | 5 +- .../tests/specs/ts/decoartors.ts.snap | 5 +- .../specs/ts/decorators/class_members.ts.snap | 5 +- .../enum_trailing_commas.ts} | 0 .../enum_trailing_commas.ts.snap} | 6 +- .../trailing_commas_es5}/options.json | 2 +- .../enum_trailing_commas.ts} | 0 .../enum_trailing_commas.ts.snap} | 6 +- .../trailing_commas_none}/options.json | 2 +- .../specs/ts/expression/as_expression.ts.snap | 5 +- .../expression_bracket_spacing.ts.snap | 4 +- .../ts/expression/non_null_expression.ts.snap | 5 +- .../type_assertion_expression.ts.snap | 5 +- .../ts/expression/type_expression.ts.snap | 5 +- .../specs/ts/expression/type_member.ts.snap | 5 +- .../function_parameters.ts.snap | 4 +- .../function_parameters.ts.snap | 4 +- .../es5/function_trailing_commas.ts} | 0 .../es5/function_trailing_commas.ts.snap} | 6 +- .../es5/options.json | 2 +- .../none/function_trailing_commas.ts} | 0 .../none/function_trailing_commas.ts.snap} | 6 +- .../trailing_commas/none/options.json | 8 ++ .../tests/specs/ts/issue1511.ts.snap | 5 +- .../specs/ts/module/export_clause.ts.snap | 5 +- .../module/external_module_reference.ts.snap | 5 +- .../module/import_type/import_types.ts.snap | 4 +- .../ts/module/module_declaration.ts.snap | 5 +- .../ts/module/qualified_module_name.ts.snap | 5 +- .../tests/specs/ts/no-semi/class.ts.snap | 4 +- .../tests/specs/ts/no-semi/non-null.ts.snap | 4 +- .../tests/specs/ts/no-semi/statements.ts.snap | 4 +- .../tests/specs/ts/no-semi/types.ts.snap | 4 +- .../object_trailing_commas.ts} | 0 .../object_trailing_commas.ts.snap} | 6 +- .../trailing_commas_es5}/options.json | 2 +- .../object_trailing_commas.ts} | 0 .../object_trailing_commas.ts.snap} | 6 +- .../trailing_commas_none}/options.json | 2 +- ...arameter_type_annotation_semicolon.ts.snap | 4 +- .../specs/ts/parameters/parameters.ts.snap | 5 +- .../tests/specs/ts/parenthesis.ts.snap | 5 +- .../tests/specs/ts/simple_arguments.ts.snap | 5 +- .../specs/ts/statement/empty_block.ts.snap | 5 +- .../specs/ts/statement/enum_statement.ts.snap | 5 +- .../quotePreserve/parameter_quotes.ts.snap | 4 +- .../quoteSingle/parameter_quotes.ts.snap | 4 +- .../tests/specs/ts/suppressions.ts.snap | 5 +- .../tests/specs/ts/type/conditional.ts.snap | 2 +- .../tests/specs/ts/type/import_type.ts.snap | 5 +- .../specs/ts/type/intersection_type.ts.snap | 5 +- .../tests/specs/ts/type/mapped_type.ts.snap | 5 +- .../specs/ts/type/qualified_name.ts.snap | 5 +- .../tests/specs/ts/type/template_type.ts.snap | 2 +- .../ts/type/trailing-comma/es5/options.json | 8 -- .../ts/type/trailing-comma/none/options.json | 8 -- .../trailing-commas/es5}/options.json | 2 +- .../es5/type_trailing_commas.ts} | 0 .../es5/type_trailing_commas.ts.snap} | 6 +- .../ts/type/trailing-commas/none/options.json | 8 ++ .../none/type_trailing_commas.ts} | 0 .../none/type_trailing_commas.ts.snap} | 6 +- .../tests/specs/ts/type/union_type.ts.snap | 2 +- .../union/nested_union/nested_union.ts.snap | 4 +- .../tests/specs/tsx/arrow/issue-2736.tsx.snap | 2 +- .../tests/specs/tsx/smoke.tsx.snap | 5 +- .../tests/specs/tsx/type_param.tsx.snap | 5 +- crates/biome_json_analyze/src/lib.rs | 1 + crates/biome_json_analyze/src/utils.rs | 48 ++++++++++ ...on => array_unclosed_trailing_commas.json} | 0 ... array_unclosed_trailing_commas.json.snap} | 5 +- .../err/object_trailing_comma.json.snap | 3 - crates/biome_migrate/Cargo.toml | 1 + crates/biome_migrate/src/analyzers.rs | 5 + .../src/analyzers/indent_size.rs | 13 +-- .../src/analyzers/trailing_comma.rs | 66 +++++++++++++ crates/biome_migrate/src/lib.rs | 19 +++- .../migrations/indentSize/invalid.json.snap | 14 ++- .../migrations/trailingComma/invalid.json | 17 ++++ .../trailingComma/invalid.json.snap | 74 +++++++++++++++ crates/biome_service/src/configuration.rs | 4 + .../src/file_handlers/javascript.rs | 6 +- crates/biome_service/src/settings.rs | 12 ++- ...ascript_formatter_trailing_comma.json.snap | 23 ----- ...javascript_formatter_trailing_commas.json} | 2 +- ...script_formatter_trailing_commas.json.snap | 20 ++++ .../tests/valid/base_options_inside_css.json | 4 +- .../valid/base_options_inside_javascript.json | 5 +- .../tests/valid/base_options_inside_json.json | 4 +- .../deprecated_options_inside_javascript.json | 13 +++ .../@biomejs/backend-jsonrpc/src/workspace.ts | 12 ++- .../@biomejs/biome/configuration_schema.json | 15 ++- 359 files changed, 989 insertions(+), 1048 deletions(-) rename crates/biome_cli/tests/snapshots/main_commands_format/{applies_custom_trailing_comma.snap => applies_custom_trailing_commas.snap} (100%) create mode 100644 crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_commas_overriding_the_deprecated_option.snap create mode 100644 crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_commas_using_the_deprecated_option.snap rename crates/biome_cli/tests/snapshots/main_commands_format/{trailing_comma_parse_errors.snap => trailing_commas_parse_errors.snap} (99%) rename crates/biome_js_formatter/src/context/{trailing_comma.rs => trailing_commas.rs} (65%) rename crates/biome_js_formatter/tests/specs/js/module/array/{trailing-comma/es5/array_trailing_comma.js => trailing-commas/es5/array_trailing_commas.js} (100%) rename crates/biome_js_formatter/tests/specs/js/module/array/{trailing-comma/es5/array_trailing_comma.js.snap => trailing-commas/es5/array_trailing_commas.js.snap} (97%) rename crates/biome_js_formatter/tests/specs/js/module/array/{trailing-comma/none => trailing-commas/es5}/options.json (82%) rename crates/biome_js_formatter/tests/specs/js/module/array/{trailing-comma/none/array_trailing_comma.js => trailing-commas/none/array_trailing_commas.js} (100%) rename crates/biome_js_formatter/tests/specs/js/module/array/{trailing-comma/none/array_trailing_comma.js.snap => trailing-commas/none/array_trailing_commas.js.snap} (97%) rename crates/biome_js_formatter/tests/specs/js/module/{export/trailing-comma => array/trailing-commas}/none/options.json (82%) rename crates/biome_js_formatter/tests/specs/js/module/export/{trailing-comma/es5/export_trailing_comma.js => trailing-commas/es5/export_trailing_commas.js} (100%) rename crates/biome_js_formatter/tests/specs/js/module/export/{trailing-comma/es5/export_trailing_comma.js.snap => trailing-commas/es5/export_trailing_commas.js.snap} (90%) rename crates/biome_js_formatter/tests/specs/js/module/export/{trailing-comma => trailing-commas}/es5/options.json (82%) rename crates/biome_js_formatter/tests/specs/js/module/export/{trailing-comma/none/export_trailing_comma.js => trailing-commas/none/export_trailing_commas.js} (100%) rename crates/biome_js_formatter/tests/specs/js/module/export/{trailing-comma/none/export_trailing_comma.js.snap => trailing-commas/none/export_trailing_commas.js.snap} (90%) rename crates/biome_js_formatter/tests/specs/js/module/{array/trailing-comma/es5 => export/trailing-commas/none}/options.json (82%) delete mode 100644 crates/biome_js_formatter/tests/specs/js/module/import/trailing-comma/none/options.json rename crates/biome_js_formatter/tests/specs/js/module/import/{trailing-comma/es5/import_trailing_comma.js => trailing-commas/es5/import_trailing_commas.js} (100%) rename crates/biome_js_formatter/tests/specs/js/module/import/{trailing-comma/es5/import_trailing_comma.js.snap => trailing-commas/es5/import_trailing_commas.js.snap} (97%) rename crates/biome_js_formatter/tests/specs/js/module/import/{trailing-comma => trailing-commas}/es5/options.json (82%) rename crates/biome_js_formatter/tests/specs/js/module/import/{trailing-comma/none/import_trailing_comma.js => trailing-commas/none/import_trailing_commas.js} (100%) rename crates/biome_js_formatter/tests/specs/js/module/import/{trailing-comma/none/import_trailing_comma.js.snap => trailing-commas/none/import_trailing_commas.js.snap} (97%) create mode 100644 crates/biome_js_formatter/tests/specs/js/module/import/trailing-commas/none/options.json delete mode 100644 crates/biome_js_formatter/tests/specs/js/module/object/trailing-comma/none/options.json rename crates/biome_js_formatter/tests/specs/js/module/object/{trailing-comma/es5/object_trailing_comma.js => trailing-commas/es5/object_trailing_commas.js} (100%) rename crates/biome_js_formatter/tests/specs/js/module/object/{trailing-comma/es5/object_trailing_comma.js.snap => trailing-commas/es5/object_trailing_commas.js.snap} (92%) rename crates/biome_js_formatter/tests/specs/js/module/object/{trailing-comma => trailing-commas}/es5/options.json (82%) rename crates/biome_js_formatter/tests/specs/js/module/object/{trailing-comma/none/object_trailing_comma.js => trailing-commas/none/object_trailing_commas.js} (100%) rename crates/biome_js_formatter/tests/specs/js/module/object/{trailing-comma/none/object_trailing_comma.js.snap => trailing-commas/none/object_trailing_commas.js.snap} (92%) create mode 100644 crates/biome_js_formatter/tests/specs/js/module/object/trailing-commas/none/options.json rename crates/biome_js_formatter/tests/specs/ts/class/{trailing_comma/es5/class_trailing_comma.ts => trailing_commas/es5/class_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/class/{trailing_comma/es5/class_trailing_comma.ts.snap => trailing_commas/es5/class_trailing_commas.ts.snap} (95%) rename crates/biome_js_formatter/tests/specs/ts/class/{trailing_comma => trailing_commas}/es5/options.json (82%) rename crates/biome_js_formatter/tests/specs/ts/class/{trailing_comma/none/class_trailing_comma.ts => trailing_commas/none/class_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/class/{trailing_comma/none/class_trailing_comma.ts.snap => trailing_commas/none/class_trailing_commas.ts.snap} (95%) rename crates/biome_js_formatter/tests/specs/ts/{function/trailing_comma => class/trailing_commas}/none/options.json (81%) rename crates/biome_js_formatter/tests/specs/ts/enum/{trailing_comma_es5/enum_trailing_comma.ts => trailing_commas_es5/enum_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/enum/{trailing_comma_es5/enum_trailing_comma.ts.snap => trailing_commas_es5/enum_trailing_commas.ts.snap} (91%) rename crates/biome_js_formatter/tests/specs/ts/{object/trailing_comma_es5 => enum/trailing_commas_es5}/options.json (82%) rename crates/biome_js_formatter/tests/specs/ts/enum/{trailing_comma_none/enum_trailing_comma.ts => trailing_commas_none/enum_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/enum/{trailing_comma_none/enum_trailing_comma.ts.snap => trailing_commas_none/enum_trailing_commas.ts.snap} (91%) rename crates/biome_js_formatter/tests/specs/ts/{object/trailing_comma_none => enum/trailing_commas_none}/options.json (81%) rename crates/biome_js_formatter/tests/specs/ts/function/{trailing_comma/es5/function_trailing_comma.ts => trailing_commas/es5/function_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/function/{trailing_comma/es5/function_trailing_comma.ts.snap => trailing_commas/es5/function_trailing_commas.ts.snap} (96%) rename crates/biome_js_formatter/tests/specs/ts/function/{trailing_comma => trailing_commas}/es5/options.json (82%) rename crates/biome_js_formatter/tests/specs/ts/function/{trailing_comma/none/function_trailing_comma.ts => trailing_commas/none/function_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/function/{trailing_comma/none/function_trailing_comma.ts.snap => trailing_commas/none/function_trailing_commas.ts.snap} (96%) create mode 100644 crates/biome_js_formatter/tests/specs/ts/function/trailing_commas/none/options.json rename crates/biome_js_formatter/tests/specs/ts/object/{trailing_comma_es5/object_trailing_comma.ts => trailing_commas_es5/object_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/object/{trailing_comma_es5/object_trailing_comma.ts.snap => trailing_commas_es5/object_trailing_commas.ts.snap} (95%) rename crates/biome_js_formatter/tests/specs/ts/{enum/trailing_comma_es5 => object/trailing_commas_es5}/options.json (82%) rename crates/biome_js_formatter/tests/specs/ts/object/{trailing_comma_none/object_trailing_comma.ts => trailing_commas_none/object_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/object/{trailing_comma_none/object_trailing_comma.ts.snap => trailing_commas_none/object_trailing_commas.ts.snap} (95%) rename crates/biome_js_formatter/tests/specs/ts/{enum/trailing_comma_none => object/trailing_commas_none}/options.json (81%) delete mode 100644 crates/biome_js_formatter/tests/specs/ts/type/trailing-comma/es5/options.json delete mode 100644 crates/biome_js_formatter/tests/specs/ts/type/trailing-comma/none/options.json rename crates/biome_js_formatter/tests/specs/ts/{class/trailing_comma/none => type/trailing-commas/es5}/options.json (82%) rename crates/biome_js_formatter/tests/specs/ts/type/{trailing-comma/es5/type_trailing_comma.ts => trailing-commas/es5/type_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/type/{trailing-comma/es5/type_trailing_comma.ts.snap => trailing-commas/es5/type_trailing_commas.ts.snap} (93%) create mode 100644 crates/biome_js_formatter/tests/specs/ts/type/trailing-commas/none/options.json rename crates/biome_js_formatter/tests/specs/ts/type/{trailing-comma/none/type_trailing_comma.ts => trailing-commas/none/type_trailing_commas.ts} (100%) rename crates/biome_js_formatter/tests/specs/ts/type/{trailing-comma/none/type_trailing_comma.ts.snap => trailing-commas/none/type_trailing_commas.ts.snap} (93%) create mode 100644 crates/biome_json_analyze/src/utils.rs rename crates/biome_json_parser/tests/json_test_suite/err/{array_unclosed_trailing_comma.json => array_unclosed_trailing_commas.json} (100%) rename crates/biome_json_parser/tests/json_test_suite/err/{array_unclosed_trailing_comma.json.snap => array_unclosed_trailing_commas.json.snap} (88%) create mode 100644 crates/biome_migrate/src/analyzers/trailing_comma.rs create mode 100644 crates/biome_migrate/tests/specs/migrations/trailingComma/invalid.json create mode 100644 crates/biome_migrate/tests/specs/migrations/trailingComma/invalid.json.snap delete mode 100644 crates/biome_service/tests/invalid/javascript_formatter_trailing_comma.json.snap rename crates/biome_service/tests/invalid/{javascript_formatter_trailing_comma.json => javascript_formatter_trailing_commas.json} (60%) create mode 100644 crates/biome_service/tests/invalid/javascript_formatter_trailing_commas.json.snap create mode 100644 crates/biome_service/tests/valid/deprecated_options_inside_javascript.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 09714bff515..4c237454291 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,10 @@ our [guidelines for writing a good changelog entry](https://github.com/biomejs/b ### Configuration +#### Enhancements + +- The `javascript.formatter.trailingComma` option is deprecated and renamed to `javascript.formatter.trailingCommas`. The corresponding CLI option `--trailing-comma` is also deprecated and renamed to `--trailing-commas`. Details can be checked in [#2492](https://github.com/biomejs/biome/pull/2492). Contributed by @Sec-ant + ### Editors #### New features diff --git a/Cargo.lock b/Cargo.lock index 6abd8076669..0e57d7e3cb5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -832,6 +832,7 @@ dependencies = [ "biome_analyze", "biome_console", "biome_diagnostics", + "biome_json_analyze", "biome_json_factory", "biome_json_parser", "biome_json_syntax", diff --git a/crates/biome_cli/src/commands/format.rs b/crates/biome_cli/src/commands/format.rs index 7efae9ddaf6..61577c7b412 100644 --- a/crates/biome_cli/src/commands/format.rs +++ b/crates/biome_cli/src/commands/format.rs @@ -82,7 +82,9 @@ pub(crate) fn format( {PrintDiagnostic::simple(&diagnostic)} }); - config.indent_width = Some(indent_size); + if config.indent_width.is_none() { + config.indent_width = Some(indent_size); + } } } // TODO: remove in biome 2.0 @@ -95,7 +97,22 @@ pub(crate) fn format( {PrintDiagnostic::simple(&diagnostic)} }); - js_formatter.indent_width = Some(indent_size); + if js_formatter.indent_width.is_none() { + js_formatter.indent_width = Some(indent_size); + } + } + + if let Some(trailing_comma) = js_formatter.trailing_comma { + let diagnostic = DeprecatedArgument::new(markup! { + "The argument ""--trailing-comma"" is deprecated, it will be removed in the next major release. Use ""--trailing-commas"" instead." + }); + console.error(markup! { + {PrintDiagnostic::simple(&diagnostic)} + }); + + if js_formatter.trailing_commas.is_none() { + js_formatter.trailing_commas = Some(trailing_comma); + } } } // TODO: remove in biome 2.0 @@ -108,7 +125,9 @@ pub(crate) fn format( {PrintDiagnostic::simple(&diagnostic)} }); - json_formatter.indent_width = Some(indent_size); + if json_formatter.indent_width.is_none() { + json_formatter.indent_width = Some(indent_size); + } } } // TODO: remove in biome 2.0 @@ -121,7 +140,9 @@ pub(crate) fn format( {PrintDiagnostic::simple(&diagnostic)} }); - css_formatter.indent_width = Some(indent_size); + if css_formatter.indent_width.is_none() { + css_formatter.indent_width = Some(indent_size); + } } } diff --git a/crates/biome_cli/src/commands/rage.rs b/crates/biome_cli/src/commands/rage.rs index ff841bb8a4a..7d3edd44e9c 100644 --- a/crates/biome_cli/src/commands/rage.rs +++ b/crates/biome_cli/src/commands/rage.rs @@ -216,7 +216,6 @@ impl Display for RageConfiguration<'_, '_> { {Section("Formatter")} {KeyValuePair("Format with errors", markup!({DebugDisplay(configuration.get_formatter_configuration().format_with_errors)}))} {KeyValuePair("Indent style", markup!({DebugDisplay(formatter_configuration.indent_style)}))} - {KeyValuePair("Indent size", markup!({DebugDisplay(formatter_configuration.indent_size)}))} {KeyValuePair("Indent width", markup!({DebugDisplay(formatter_configuration.indent_width)}))} {KeyValuePair("Line ending", markup!({DebugDisplay(formatter_configuration.line_ending)}))} {KeyValuePair("Line width", markup!({DebugDisplay(formatter_configuration.line_width.get())}))} @@ -232,14 +231,13 @@ impl Display for RageConfiguration<'_, '_> { {KeyValuePair("Enabled", markup!({DebugDisplay(javascript_formatter_configuration.enabled)}))} {KeyValuePair("JSX quote style", markup!({DebugDisplay(javascript_formatter_configuration.jsx_quote_style)}))} {KeyValuePair("Quote properties", markup!({DebugDisplay(javascript_formatter_configuration.quote_properties)}))} - {KeyValuePair("Trailing comma", markup!({DebugDisplay(javascript_formatter_configuration.trailing_comma)}))} + {KeyValuePair("Trailing commas", markup!({DebugDisplay(javascript_formatter_configuration.trailing_commas)}))} {KeyValuePair("Semicolons", markup!({DebugDisplay(javascript_formatter_configuration.semicolons)}))} {KeyValuePair("Arrow parentheses", markup!({DebugDisplay(javascript_formatter_configuration.arrow_parentheses)}))} {KeyValuePair("Bracket spacing", markup!({DebugDisplay(javascript_formatter_configuration.bracket_spacing)}))} {KeyValuePair("Bracket same line", markup!({DebugDisplay(javascript_formatter_configuration.bracket_same_line)}))} {KeyValuePair("Quote style", markup!({DebugDisplay(javascript_formatter_configuration.quote_style)}))} {KeyValuePair("Indent style", markup!({DebugDisplayOption(javascript_formatter_configuration.indent_style)}))} - {KeyValuePair("Indent size", markup!({DebugDisplayOption(javascript_formatter_configuration.indent_size)}))} {KeyValuePair("Indent width", markup!({DebugDisplayOption(javascript_formatter_configuration.indent_width)}))} {KeyValuePair("Line ending", markup!({DebugDisplayOption(javascript_formatter_configuration.line_ending)}))} {KeyValuePair("Line width", markup!({DebugDisplayOption(javascript_formatter_configuration.line_width.map(|lw| lw.get()))}))} @@ -254,7 +252,6 @@ impl Display for RageConfiguration<'_, '_> { {KeyValuePair("Enabled", markup!({DebugDisplay(json_formatter_configuration.enabled)}))} {KeyValuePair("Indent style", markup!({DebugDisplayOption(json_formatter_configuration.indent_style)}))} {KeyValuePair("Indent width", markup!({DebugDisplayOption(json_formatter_configuration.indent_width)}))} - {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)}))} diff --git a/crates/biome_cli/src/execute/migrate/prettier.rs b/crates/biome_cli/src/execute/migrate/prettier.rs index 14a99f26131..89a10d414ee 100644 --- a/crates/biome_cli/src/execute/migrate/prettier.rs +++ b/crates/biome_cli/src/execute/migrate/prettier.rs @@ -8,7 +8,7 @@ use biome_formatter::{ AttributePosition, LineEnding, LineWidth, LineWidthFromIntError, QuoteStyle, }; use biome_fs::{FileSystem, OpenOptions}; -use biome_js_formatter::context::{ArrowParentheses, QuoteProperties, Semicolons, TrailingComma}; +use biome_js_formatter::context::{ArrowParentheses, QuoteProperties, Semicolons, TrailingCommas}; use biome_json_parser::JsonParserOptions; use biome_service::DynRef; use std::path::Path; @@ -36,7 +36,7 @@ pub(crate) struct PrettierConfiguration { print_width: u16, /// https://prettier.io/docs/en/options#use-tabs use_tabs: bool, - /// https://prettier.io/docs/en/options#trailing-comma + /// https://prettier.io/docs/en/options#trailing-commas trailing_comma: PrettierTrailingComma, /// https://prettier.io/docs/en/options#tab-width tab_width: u8, @@ -93,7 +93,7 @@ pub(crate) struct OverrideOptions { print_width: Option, /// https://prettier.io/docs/en/options#use-tabs use_tabs: Option, - /// https://prettier.io/docs/en/options#trailing-comma + /// https://prettier.io/docs/en/options#trailing-commas trailing_comma: Option, /// https://prettier.io/docs/en/options#tab-width tab_width: Option, @@ -147,7 +147,7 @@ enum QuoteProps { Preserve, } -impl From for TrailingComma { +impl From for TrailingCommas { fn from(value: PrettierTrailingComma) -> Self { match value { PrettierTrailingComma::All => Self::All, @@ -240,7 +240,9 @@ impl TryFrom for biome_configuration::PartialConfiguratio bracket_same_line: Some(value.bracket_line), arrow_parentheses: Some(value.arrow_parens.into()), semicolons: Some(semicolons), - trailing_comma: Some(value.trailing_comma.into()), + trailing_commas: Some(value.trailing_comma.into()), + // deprecated + trailing_comma: None, quote_style: Some(quote_style), quote_properties: Some(value.quote_props.into()), bracket_spacing: Some(value.bracket_spacing), @@ -335,7 +337,7 @@ impl TryFrom for biome_configuration::OverridePattern { bracket_same_line: options.bracket_line, arrow_parentheses: options.arrow_parens.map(|arrow_parens| arrow_parens.into()), semicolons, - trailing_comma: options + trailing_commas: options .trailing_comma .map(|trailing_comma| trailing_comma.into()), quote_style, diff --git a/crates/biome_cli/tests/commands/format.rs b/crates/biome_cli/tests/commands/format.rs index 1decf72ded5..f0f6b0f0aa7 100644 --- a/crates/biome_cli/tests/commands/format.rs +++ b/crates/biome_cli/tests/commands/format.rs @@ -79,7 +79,7 @@ const hello: string = "world";
"#; -const APPLY_TRAILING_COMMA_BEFORE: &str = r#" +const APPLY_TRAILING_COMMAS_BEFORE: &str = r#" const a = [ longlonglonglongItem1longlonglonglongItem1, longlonglonglongItem1longlonglonglongItem2, @@ -87,7 +87,7 @@ const a = [ ]; "#; -const APPLY_TRAILING_COMMA_AFTER: &str = r#"const a = [ +const APPLY_TRAILING_COMMAS_AFTER: &str = r#"const a = [ longlonglonglongItem1longlonglonglongItem1, longlonglonglongItem1longlonglonglongItem2, longlonglonglongItem1longlonglonglongItem3 @@ -743,12 +743,48 @@ fn applies_custom_css_quote_style() { } #[test] -fn applies_custom_trailing_comma() { +fn applies_custom_trailing_commas() { let mut fs = MemoryFileSystem::default(); let mut console = BufferConsole::default(); let file_path = Path::new("file.js"); - fs.insert(file_path.into(), APPLY_TRAILING_COMMA_BEFORE.as_bytes()); + fs.insert(file_path.into(), APPLY_TRAILING_COMMAS_BEFORE.as_bytes()); + + let result = run_cli( + DynRef::Borrowed(&mut fs), + &mut console, + Args::from( + [ + ("format"), + ("--trailing-commas"), + ("none"), + ("--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, APPLY_TRAILING_COMMAS_AFTER); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "applies_custom_trailing_commas", + fs, + console, + result, + )); +} + +#[test] +fn applies_custom_trailing_commas_using_the_deprecated_option() { + let mut fs = MemoryFileSystem::default(); + let mut console = BufferConsole::default(); + + let file_path = Path::new("file.js"); + fs.insert(file_path.into(), APPLY_TRAILING_COMMAS_BEFORE.as_bytes()); let result = run_cli( DynRef::Borrowed(&mut fs), @@ -767,11 +803,49 @@ fn applies_custom_trailing_comma() { assert!(result.is_ok(), "run_cli returned {result:?}"); - assert_file_contents(&fs, file_path, APPLY_TRAILING_COMMA_AFTER); + assert_file_contents(&fs, file_path, APPLY_TRAILING_COMMAS_AFTER); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "applies_custom_trailing_commas_using_the_deprecated_option", + fs, + console, + result, + )); +} + +#[test] +fn applies_custom_trailing_commas_overriding_the_deprecated_option() { + let mut fs = MemoryFileSystem::default(); + let mut console = BufferConsole::default(); + + let file_path = Path::new("file.js"); + fs.insert(file_path.into(), APPLY_TRAILING_COMMAS_BEFORE.as_bytes()); + + let result = run_cli( + DynRef::Borrowed(&mut fs), + &mut console, + Args::from( + [ + ("format"), + ("--trailing-commas"), + ("none"), + ("--trailing-comma"), + ("all"), + ("--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, APPLY_TRAILING_COMMAS_AFTER); assert_cli_snapshot(SnapshotPayload::new( module_path!(), - "applies_custom_trailing_comma", + "applies_custom_trailing_commas_overriding_the_deprecated_option", fs, console, result, @@ -923,21 +997,21 @@ fn applies_custom_bracket_same_line() { } #[test] -fn trailing_comma_parse_errors() { +fn trailing_commas_parse_errors() { let mut console = BufferConsole::default(); let mut fs = MemoryFileSystem::default(); let result = run_cli( DynRef::Borrowed(&mut fs), &mut console, - Args::from([("format"), ("--trailing-comma"), ("NONE"), ("file.js")].as_slice()), + Args::from([("format"), ("--trailing-commas"), ("NONE"), ("file.js")].as_slice()), ); assert!(result.is_err(), "run_cli returned {result:?}"); assert_cli_snapshot(SnapshotPayload::new( module_path!(), - "trailing_comma_parse_errors", + "trailing_commas_parse_errors", fs, console, result, diff --git a/crates/biome_cli/tests/snapshots/main_commands_check/check_help.snap b/crates/biome_cli/tests/snapshots/main_commands_check/check_help.snap index 89c5be7d04f..b3fab644ca8 100644 --- a/crates/biome_cli/tests/snapshots/main_commands_check/check_help.snap +++ b/crates/biome_cli/tests/snapshots/main_commands_check/check_help.snap @@ -35,6 +35,8 @@ The configuration that is contained inside the file `biome.json` --quote-properties= When properties in objects are quoted. Defaults to asNeeded. --trailing-comma= Print trailing commas wherever possible in multi-line comma-separated syntactic structures. Defaults to "all". + --trailing-commas= Print trailing commas wherever possible in multi-line comma-separated + syntactic structures. Defaults to "all". --semicolons= Whether the formatter prints semicolons for all statements or only in for statements where it is necessary because of ASI. --arrow-parentheses= Whether to add non-necessary parentheses to arrow functions. diff --git a/crates/biome_cli/tests/snapshots/main_commands_ci/ci_help.snap b/crates/biome_cli/tests/snapshots/main_commands_ci/ci_help.snap index 8bb1b4e4093..d430c10412d 100644 --- a/crates/biome_cli/tests/snapshots/main_commands_ci/ci_help.snap +++ b/crates/biome_cli/tests/snapshots/main_commands_ci/ci_help.snap @@ -37,6 +37,8 @@ The configuration that is contained inside the file `biome.json` --quote-properties= When properties in objects are quoted. Defaults to asNeeded. --trailing-comma= Print trailing commas wherever possible in multi-line comma-separated syntactic structures. Defaults to "all". + --trailing-commas= Print trailing commas wherever possible in multi-line comma-separated + syntactic structures. Defaults to "all". --semicolons= Whether the formatter prints semicolons for all statements or only in for statements where it is necessary because of ASI. --arrow-parentheses= Whether to add non-necessary parentheses to arrow functions. diff --git a/crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_comma.snap b/crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_commas.snap similarity index 100% rename from crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_comma.snap rename to crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_commas.snap diff --git a/crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_commas_overriding_the_deprecated_option.snap b/crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_commas_overriding_the_deprecated_option.snap new file mode 100644 index 00000000000..473ed657126 --- /dev/null +++ b/crates/biome_cli/tests/snapshots/main_commands_format/applies_custom_trailing_commas_overriding_the_deprecated_option.snap @@ -0,0 +1,28 @@ +--- +source: crates/biome_cli/tests/snap_test.rs +expression: content +--- +## `file.js` + +```js +const a = [ + longlonglonglongItem1longlonglonglongItem1, + longlonglonglongItem1longlonglonglongItem2, + longlonglonglongItem1longlonglonglongItem3 +]; + +``` + +# Emitted Messages + +```block +internalError/fs DEPRECATED ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + ! The argument --trailing-comma is deprecated, it will be removed in the next major release. Use --trailing-commas instead. + + +``` + +```block +Formatted 1 file in