From 52b49ecc692e55a2097603f7f20cd8df8288a1b9 Mon Sep 17 00:00:00 2001 From: Netail Date: Mon, 29 Dec 2025 19:42:24 +0100 Subject: [PATCH] feat(graphql_analyze): implement useLoneExecutableDefinition --- .changeset/lazy-doodles-attack.md | 17 +++ .../src/analyzer/linter/rules.rs | 141 ++++++++++-------- .../src/categories.rs | 1 + .../biome_graphql_analyze/src/lint/nursery.rs | 3 +- .../nursery/use_lone_executable_definition.rs | 109 ++++++++++++++ .../multi-executables-definitions.graphql | 26 ++++ ...multi-executables-definitions.graphql.snap | 134 +++++++++++++++++ .../invalid/multi-named-query.graphql | 8 + .../invalid/multi-named-query.graphql.snap | 52 +++++++ .../invalid/single-query-definition.graphql | 7 + .../single-query-definition.graphql.snap | 50 +++++++ .../valid/fragment.graphql | 4 + .../valid/fragment.graphql.snap | 12 ++ .../valid/single-anonymous-mutation.graphql | 6 + .../single-anonymous-mutation.graphql.snap | 14 ++ .../valid/single-anonymous-query.graphql | 4 + .../valid/single-anonymous-query.graphql.snap | 12 ++ .../single-anonymous-subscription.graphql | 4 + ...single-anonymous-subscription.graphql.snap | 12 ++ .../valid/single-named-mutation.graphql | 6 + .../valid/single-named-mutation.graphql.snap | 14 ++ .../valid/single-named-query.graphql | 4 + .../valid/single-named-query.graphql.snap | 12 ++ .../valid/single-named-subscription.graphql | 4 + .../single-named-subscription.graphql.snap | 12 ++ .../valid/single-shorthand-query.graphql | 4 + .../valid/single-shorthand-query.graphql.snap | 12 ++ crates/biome_rule_options/src/lib.rs | 1 + .../src/use_lone_executable_definition.rs | 6 + justfile | 2 + .../@biomejs/backend-jsonrpc/src/workspace.ts | 14 ++ .../@biomejs/biome/configuration_schema.json | 26 ++++ 32 files changed, 672 insertions(+), 61 deletions(-) create mode 100644 .changeset/lazy-doodles-attack.md create mode 100644 crates/biome_graphql_analyze/src/lint/nursery/use_lone_executable_definition.rs create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/invalid/multi-executables-definitions.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/invalid/multi-executables-definitions.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/invalid/multi-named-query.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/invalid/multi-named-query.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/invalid/single-query-definition.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/invalid/single-query-definition.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/fragment.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/fragment.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-anonymous-mutation.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-anonymous-mutation.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-anonymous-query.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-anonymous-query.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-anonymous-subscription.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-anonymous-subscription.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-named-mutation.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-named-mutation.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-named-query.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-named-query.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-named-subscription.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-named-subscription.graphql.snap create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-shorthand-query.graphql create mode 100644 crates/biome_graphql_analyze/tests/specs/nursery/useLoneExecutableDefinition/valid/single-shorthand-query.graphql.snap create mode 100644 crates/biome_rule_options/src/use_lone_executable_definition.rs diff --git a/.changeset/lazy-doodles-attack.md b/.changeset/lazy-doodles-attack.md new file mode 100644 index 000000000000..4d8e970e607a --- /dev/null +++ b/.changeset/lazy-doodles-attack.md @@ -0,0 +1,17 @@ +--- +"@biomejs/biome": patch +--- + +Added the nursery rule [`useLoneExecutableDefinition`](https://biomejs.dev/linter/rules/use-lone-executable-definition/). Require queries, mutations, subscriptions or fragments to be located in separate files. + +**Invalid:** + +```graphql +query Foo { + id +} + +fragment Bar on Baz { + id +} +``` diff --git a/crates/biome_configuration/src/analyzer/linter/rules.rs b/crates/biome_configuration/src/analyzer/linter/rules.rs index 6e695138a311..570ba96a326c 100644 --- a/crates/biome_configuration/src/analyzer/linter/rules.rs +++ b/crates/biome_configuration/src/analyzer/linter/rules.rs @@ -425,6 +425,7 @@ pub enum RuleName { UseKeyWithMouseEvents, UseLiteralEnumMembers, UseLiteralKeys, + UseLoneExecutableDefinition, UseMaxParams, UseMediaCaption, UseNamespaceKeyword, @@ -845,6 +846,7 @@ impl RuleName { Self::UseKeyWithMouseEvents => "useKeyWithMouseEvents", Self::UseLiteralEnumMembers => "useLiteralEnumMembers", Self::UseLiteralKeys => "useLiteralKeys", + Self::UseLoneExecutableDefinition => "useLoneExecutableDefinition", Self::UseMaxParams => "useMaxParams", Self::UseMediaCaption => "useMediaCaption", Self::UseNamespaceKeyword => "useNamespaceKeyword", @@ -1261,6 +1263,7 @@ impl RuleName { Self::UseKeyWithMouseEvents => RuleGroup::A11y, Self::UseLiteralEnumMembers => RuleGroup::Style, Self::UseLiteralKeys => RuleGroup::Complexity, + Self::UseLoneExecutableDefinition => RuleGroup::Nursery, Self::UseMaxParams => RuleGroup::Nursery, Self::UseMediaCaption => RuleGroup::A11y, Self::UseNamespaceKeyword => RuleGroup::Suspicious, @@ -1686,6 +1689,7 @@ impl std::str::FromStr for RuleName { "useKeyWithMouseEvents" => Ok(Self::UseKeyWithMouseEvents), "useLiteralEnumMembers" => Ok(Self::UseLiteralEnumMembers), "useLiteralKeys" => Ok(Self::UseLiteralKeys), + "useLoneExecutableDefinition" => Ok(Self::UseLoneExecutableDefinition), "useMaxParams" => Ok(Self::UseMaxParams), "useMediaCaption" => Ok(Self::UseMediaCaption), "useNamespaceKeyword" => Ok(Self::UseNamespaceKeyword), @@ -4896,7 +4900,7 @@ impl From for Correctness { #[cfg_attr(feature = "schema", derive(JsonSchema))] #[serde(rename_all = "camelCase", default, deny_unknown_fields)] #[doc = r" A list of rules that belong to this group"] -pub struct Nursery { # [doc = r" Enables the recommended rules for this group"] # [serde (skip_serializing_if = "Option::is_none")] pub recommended : Option < bool > , # [doc = "Disallow ambiguous anchor descriptions.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_ambiguous_anchor_text : Option < RuleConfiguration < biome_rule_options :: no_ambiguous_anchor_text :: NoAmbiguousAnchorTextOptions >> , # [doc = "Prevent usage of next/script's beforeInteractive strategy outside of pages/_document.js in a Next.js project.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_before_interactive_script_outside_document : Option < RuleConfiguration < biome_rule_options :: no_before_interactive_script_outside_document :: NoBeforeInteractiveScriptOutsideDocumentOptions >> , # [doc = "Disallow continue statements.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_continue : Option < RuleConfiguration < biome_rule_options :: no_continue :: NoContinueOptions >> , # [doc = "Restrict imports of deprecated exports.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_deprecated_imports : Option < RuleConfiguration < biome_rule_options :: no_deprecated_imports :: NoDeprecatedImportsOptions >> , # [doc = "Prevent the listing of duplicate dependencies. The rule supports the following dependency groups: \"bundledDependencies\", \"bundleDependencies\", \"dependencies\", \"devDependencies\", \"overrides\", \"optionalDependencies\", and \"peerDependencies\".\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_duplicate_dependencies : Option < RuleConfiguration < biome_rule_options :: no_duplicate_dependencies :: NoDuplicateDependenciesOptions >> , # [doc = "Disallow JSX prop spreading the same identifier multiple times.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_duplicated_spread_props : Option < RuleConfiguration < biome_rule_options :: no_duplicated_spread_props :: NoDuplicatedSpreadPropsOptions >> , # [doc = "Disallow empty sources.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_empty_source : Option < RuleConfiguration < biome_rule_options :: no_empty_source :: NoEmptySourceOptions >> , # [doc = "Require the use of === or !== for comparison with null.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_equals_to_null : Option < RuleFixConfiguration < biome_rule_options :: no_equals_to_null :: NoEqualsToNullOptions >> , # [doc = "Require Promise-like statements to be handled appropriately.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_floating_promises : Option < RuleFixConfiguration < biome_rule_options :: no_floating_promises :: NoFloatingPromisesOptions >> , # [doc = "Disallow iterating using a for-in loop.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_for_in : Option < RuleConfiguration < biome_rule_options :: no_for_in :: NoForInOptions >> , # [doc = "Prevent import cycles.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_import_cycles : Option < RuleConfiguration < biome_rule_options :: no_import_cycles :: NoImportCyclesOptions >> , # [doc = "Disallows the usage of the unary operators ++ and --.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_increment_decrement : Option < RuleConfiguration < biome_rule_options :: no_increment_decrement :: NoIncrementDecrementOptions >> , # [doc = "Disallow string literals inside JSX elements.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_jsx_literals : Option < RuleConfiguration < biome_rule_options :: no_jsx_literals :: NoJsxLiteralsOptions >> , # [doc = "Prevent problematic leaked values from being rendered.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_leaked_render : Option < RuleConfiguration < biome_rule_options :: no_leaked_render :: NoLeakedRenderOptions >> , # [doc = "Disallow Promises to be used in places where they are almost certainly a mistake.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_misused_promises : Option < RuleFixConfiguration < biome_rule_options :: no_misused_promises :: NoMisusedPromisesOptions >> , # [doc = "Disallow use of chained assignment expressions.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_multi_assign : Option < RuleConfiguration < biome_rule_options :: no_multi_assign :: NoMultiAssignOptions >> , # [doc = "Disallow creating multiline strings by escaping newlines.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_multi_str : Option < RuleConfiguration < biome_rule_options :: no_multi_str :: NoMultiStrOptions >> , # [doc = "Prevent client components from being async functions.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_next_async_client_component : Option < RuleConfiguration < biome_rule_options :: no_next_async_client_component :: NoNextAsyncClientComponentOptions >> , # [doc = "Disallow function parameters that are only used in recursive calls.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_parameters_only_used_in_recursion : Option < RuleFixConfiguration < biome_rule_options :: no_parameters_only_used_in_recursion :: NoParametersOnlyUsedInRecursionOptions >> , # [doc = "Disallow the use of the deprecated __proto__ object property.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_proto : Option < RuleConfiguration < biome_rule_options :: no_proto :: NoProtoOptions >> , # [doc = "Replaces usages of forwardRef with passing ref as a prop.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_react_forward_ref : Option < RuleFixConfiguration < biome_rule_options :: no_react_forward_ref :: NoReactForwardRefOptions >> , # [doc = "Disallow assignments in return statements.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_return_assign : Option < RuleConfiguration < biome_rule_options :: no_return_assign :: NoReturnAssignOptions >> , # [doc = "Disallow javascript: URLs in HTML.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_script_url : Option < RuleConfiguration < biome_rule_options :: no_script_url :: NoScriptUrlOptions >> , # [doc = "Disallow variable declarations from shadowing variables declared in the outer scope.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_shadow : Option < RuleConfiguration < biome_rule_options :: no_shadow :: NoShadowOptions >> , # [doc = "Prevent the usage of synchronous scripts.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_sync_scripts : Option < RuleConfiguration < biome_rule_options :: no_sync_scripts :: NoSyncScriptsOptions >> , # [doc = "Disallow ternary operators.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_ternary : Option < RuleConfiguration < biome_rule_options :: no_ternary :: NoTernaryOptions >> , # [doc = "Disallow the use of undeclared environment variables.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_undeclared_env_vars : Option < RuleConfiguration < biome_rule_options :: no_undeclared_env_vars :: NoUndeclaredEnvVarsOptions >> , # [doc = "Disallow unknown DOM properties.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_unknown_attribute : Option < RuleConfiguration < biome_rule_options :: no_unknown_attribute :: NoUnknownAttributeOptions >> , # [doc = "Disallow unnecessary type-based conditions that can be statically determined as redundant.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_unnecessary_conditions : Option < RuleConfiguration < biome_rule_options :: no_unnecessary_conditions :: NoUnnecessaryConditionsOptions >> , # [doc = "Warn when importing non-existing exports.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_unresolved_imports : Option < RuleConfiguration < biome_rule_options :: no_unresolved_imports :: NoUnresolvedImportsOptions >> , # [doc = "Disallow expression statements that are neither a function call nor an assignment.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_unused_expressions : Option < RuleConfiguration < biome_rule_options :: no_unused_expressions :: NoUnusedExpressionsOptions >> , # [doc = "Disallow unused catch bindings.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_useless_catch_binding : Option < RuleFixConfiguration < biome_rule_options :: no_useless_catch_binding :: NoUselessCatchBindingOptions >> , # [doc = "Disallow the use of useless undefined.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_useless_undefined : Option < RuleFixConfiguration < biome_rule_options :: no_useless_undefined :: NoUselessUndefinedOptions >> , # [doc = "Enforce that Vue component data options are declared as functions.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_vue_data_object_declaration : Option < RuleFixConfiguration < biome_rule_options :: no_vue_data_object_declaration :: NoVueDataObjectDeclarationOptions >> , # [doc = "Disallow duplicate keys in Vue component data, methods, computed properties, and other options.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_vue_duplicate_keys : Option < RuleConfiguration < biome_rule_options :: no_vue_duplicate_keys :: NoVueDuplicateKeysOptions >> , # [doc = "Disallow reserved keys in Vue component data and computed properties.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_vue_reserved_keys : Option < RuleConfiguration < biome_rule_options :: no_vue_reserved_keys :: NoVueReservedKeysOptions >> , # [doc = "Disallow reserved names to be used as props.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_vue_reserved_props : Option < RuleConfiguration < biome_rule_options :: no_vue_reserved_props :: NoVueReservedPropsOptions >> , # [doc = "Disallow destructuring of props passed to setup in Vue projects.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_vue_setup_props_reactivity_loss : Option < RuleConfiguration < biome_rule_options :: no_vue_setup_props_reactivity_loss :: NoVueSetupPropsReactivityLossOptions >> , # [doc = "Disallow using v-if and v-for directives on the same element.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub no_vue_v_if_with_v_for : Option < RuleConfiguration < biome_rule_options :: no_vue_v_if_with_v_for :: NoVueVIfWithVForOptions >> , # [doc = "Require Array#sort and Array#toSorted calls to always provide a compareFunction.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_array_sort_compare : Option < RuleConfiguration < biome_rule_options :: use_array_sort_compare :: UseArraySortCompareOptions >> , # [doc = "Enforce that await is only used on Promise values.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_await_thenable : Option < RuleConfiguration < biome_rule_options :: use_await_thenable :: UseAwaitThenableOptions >> , # [doc = "Enforce consistent arrow function bodies.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_consistent_arrow_return : Option < RuleFixConfiguration < biome_rule_options :: use_consistent_arrow_return :: UseConsistentArrowReturnOptions >> , # [doc = "Require all descriptions to follow the same style (either block or inline) to maintain consistency and improve readability across the schema.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_consistent_graphql_descriptions : Option < RuleConfiguration < biome_rule_options :: use_consistent_graphql_descriptions :: UseConsistentGraphqlDescriptionsOptions >> , # [doc = "Require the @deprecated directive to specify a deletion date.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_deprecated_date : Option < RuleConfiguration < biome_rule_options :: use_deprecated_date :: UseDeprecatedDateOptions >> , # [doc = "Require destructuring from arrays and/or objects.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_destructuring : Option < RuleConfiguration < biome_rule_options :: use_destructuring :: UseDestructuringOptions >> , # [doc = "Require switch-case statements to be exhaustive.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_exhaustive_switch_cases : Option < RuleFixConfiguration < biome_rule_options :: use_exhaustive_switch_cases :: UseExhaustiveSwitchCasesOptions >> , # [doc = "Enforce types in functions, methods, variables, and parameters.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_explicit_type : Option < RuleConfiguration < biome_rule_options :: use_explicit_type :: UseExplicitTypeOptions >> , # [doc = "Enforce the use of Array.prototype.find() over Array.prototype.filter() followed by [0] when looking for a single result.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_find : Option < RuleConfiguration < biome_rule_options :: use_find :: UseFindOptions >> , # [doc = "Enforce a maximum number of parameters in function definitions.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_max_params : Option < RuleConfiguration < biome_rule_options :: use_max_params :: UseMaxParamsOptions >> , # [doc = "Disallow use* hooks outside of component$ or other use* hooks in Qwik applications.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_qwik_method_usage : Option < RuleConfiguration < biome_rule_options :: use_qwik_method_usage :: UseQwikMethodUsageOptions >> , # [doc = "Disallow unserializable expressions in Qwik dollar ($) scopes.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_qwik_valid_lexical_scope : Option < RuleConfiguration < biome_rule_options :: use_qwik_valid_lexical_scope :: UseQwikValidLexicalScopeOptions >> , # [doc = "Enforce RegExp#exec over String#match if no global flag is provided.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_regexp_exec : Option < RuleConfiguration < biome_rule_options :: use_regexp_exec :: UseRegexpExecOptions >> , # [doc = "Enforce the presence of required scripts in package.json.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_required_scripts : Option < RuleConfiguration < biome_rule_options :: use_required_scripts :: UseRequiredScriptsOptions >> , # [doc = "Enforce the sorting of CSS utility classes.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_sorted_classes : Option < RuleFixConfiguration < biome_rule_options :: use_sorted_classes :: UseSortedClassesOptions >> , # [doc = "Enforce the use of the spread operator over .apply().\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_spread : Option < RuleFixConfiguration < biome_rule_options :: use_spread :: UseSpreadOptions >> , # [doc = "Require all argument names for fields & directives to be unique.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_unique_argument_names : Option < RuleConfiguration < biome_rule_options :: use_unique_argument_names :: UseUniqueArgumentNamesOptions >> , # [doc = "Require all fields of a type to be unique.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_unique_field_definition_names : Option < RuleConfiguration < biome_rule_options :: use_unique_field_definition_names :: UseUniqueFieldDefinitionNamesOptions >> , # [doc = "Enforce unique operation names across a GraphQL document.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_unique_graphql_operation_name : Option < RuleConfiguration < biome_rule_options :: use_unique_graphql_operation_name :: UseUniqueGraphqlOperationNameOptions >> , # [doc = "Require fields within an input object to be unique.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_unique_input_field_names : Option < RuleConfiguration < biome_rule_options :: use_unique_input_field_names :: UseUniqueInputFieldNamesOptions >> , # [doc = "Require all variable definitions to be unique.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_unique_variable_names : Option < RuleConfiguration < biome_rule_options :: use_unique_variable_names :: UseUniqueVariableNamesOptions >> , # [doc = "Enforce consistent defineProps declaration style.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_vue_consistent_define_props_declaration : Option < RuleConfiguration < biome_rule_options :: use_vue_consistent_define_props_declaration :: UseVueConsistentDefinePropsDeclarationOptions >> , # [doc = "Enforce a consistent style for v-bind in Vue templates.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_vue_consistent_v_bind_style : Option < RuleFixConfiguration < biome_rule_options :: use_vue_consistent_v_bind_style :: UseVueConsistentVBindStyleOptions >> , # [doc = "Enforce a consistent style for v-on in Vue templates.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_vue_consistent_v_on_style : Option < RuleFixConfiguration < biome_rule_options :: use_vue_consistent_v_on_style :: UseVueConsistentVOnStyleOptions >> , # [doc = "Enforce specific order of Vue compiler macros.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_vue_define_macros_order : Option < RuleFixConfiguration < biome_rule_options :: use_vue_define_macros_order :: UseVueDefineMacrosOrderOptions >> , # [doc = "Enforce hyphenated (kebab-case) attribute names in Vue templates.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_vue_hyphenated_attributes : Option < RuleFixConfiguration < biome_rule_options :: use_vue_hyphenated_attributes :: UseVueHyphenatedAttributesOptions >> , # [doc = "Enforce multi-word component names in Vue components.\nSee "] # [serde (skip_serializing_if = "Option::is_none")] pub use_vue_multi_word_component_names : Option < RuleConfiguration < biome_rule_options :: use_vue_multi_word_component_names :: UseVueMultiWordComponentNamesOptions >> , # [doc = "Enforce valid Vue \\