From d3c92419bff6dc147f345a4fa657e02dff8d99aa Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 27 Jan 2026 09:32:06 +0000 Subject: [PATCH 1/6] refactor(html): component parsing --- .../biome_cli/tests/cases/handle_vue_files.rs | 74 +++- ...pe_not_triggered_for_enum_in_template.snap | 11 + ...not_triggered_for_enum_in_template_v2.snap | 41 ++ .../src/lint/a11y/no_autofocus.rs | 4 +- .../src/lint/a11y/no_redundant_alt.rs | 6 +- .../src/lint/a11y/no_svg_without_title.rs | 4 +- .../src/lint/a11y/use_anchor_content.rs | 5 +- .../src/lint/a11y/use_valid_lang.rs | 6 +- .../lint/nursery/no_ambiguous_anchor_text.rs | 8 +- .../src/lint/nursery/no_script_url.rs | 3 +- .../src/lint/nursery/no_sync_scripts.rs | 4 +- .../nursery/use_vue_hyphenated_attributes.rs | 9 +- .../nursery/use_vue_valid_template_root.rs | 4 +- .../src/lint/nursery/use_vue_vapor.rs | 4 +- .../src/generated/node_factory.rs | 28 +- .../src/generated/syntax_factory.rs | 58 ++- crates/biome_html_formatter/src/generated.rs | 126 ++++++ .../src/html/any/component_object_name.rs | 16 + .../biome_html_formatter/src/html/any/mod.rs | 2 + .../src/html/any/tag_name.rs | 16 + .../src/html/auxiliary/attribute.rs | 6 +- .../src/html/auxiliary/attribute_name.rs | 6 +- .../src/html/auxiliary/component_name.rs | 11 + .../src/html/auxiliary/element.rs | 35 +- .../src/html/auxiliary/member_name.rs | 16 + .../src/html/auxiliary/mod.rs | 2 + .../src/html/auxiliary/opening_element.rs | 5 +- .../html/auxiliary/self_closing_element.rs | 5 +- .../src/html/lists/attribute_list.rs | 6 +- .../src/utils/css_display.rs | 20 +- .../src/utils/metadata.rs | 29 +- .../biome_html_formatter/tests/quick_test.rs | 26 +- .../specs/html/astro/component.astro.snap | 2 +- .../specs/html/svelte/component.svelte.snap | 2 +- .../tests/specs/html/vue/component.vue.snap | 2 +- crates/biome_html_parser/src/lexer/mod.rs | 8 +- crates/biome_html_parser/src/syntax/mod.rs | 80 +++- crates/biome_html_parser/src/token_source.rs | 1 + .../vue/invalid-v-bind-shorthand.vue.snap | 4 +- .../error/vue/invalid-v-on-shorthand.vue.snap | 4 +- .../html_specs/ok/astro/component.astro.snap | 8 +- .../ok/astro/component_member.astro | 1 + .../ok/astro/component_member.astro.snap | 62 +++ .../ok/astro/component_member_nested.astro | 1 + .../astro/component_member_nested.astro.snap | 82 ++++ .../ok/astro/component_with_attributes.astro | 4 + .../component_with_attributes.astro.snap | 102 +++++ .../html_specs/ok/astro/issue_7837.astro.snap | 34 +- .../multiple_nested_expression.astro.snap | 4 +- .../non-spec-compliant-tag-name.html.snap | 22 +- .../ok/svelte/await_catch_no_then.svelte.snap | 18 +- .../svelte/await_dynamic_import.svelte.snap | 4 +- .../ok/svelte/complex_expressions.svelte.snap | 36 +- .../ok/svelte/component.svelte.snap | 8 +- .../ok/svelte/component_member.svelte | 1 + .../ok/svelte/component_member.svelte.snap | 62 +++ .../ok/svelte/component_member_nested.svelte | 1 + .../component_member_nested.svelte.snap | 82 ++++ .../svelte/component_with_attributes.svelte | 4 + .../component_with_attributes.svelte.snap | 102 +++++ .../html_specs/ok/vue/component.vue.snap | 8 +- .../html_specs/ok/vue/component_member.vue | 3 + .../ok/vue/component_member.vue.snap | 98 +++++ .../ok/vue/component_member_nested.vue | 3 + .../ok/vue/component_member_nested.vue.snap | 118 +++++ .../ok/vue/component_member_simple.vue | 1 + .../ok/vue/component_member_simple.vue.snap | 62 +++ .../ok/vue/component_with_attributes.vue | 6 + .../ok/vue/component_with_attributes.vue.snap | 147 +++++++ .../ok/vue/event-with-colon.vue.snap | 4 +- .../html_specs/ok/vue/issue-8174.vue.snap | 8 +- .../html_specs/ok/vue/v-bind-dynamic.vue.snap | 4 +- .../ok/vue/v-bind-shorthand.vue.snap | 8 +- .../tests/html_specs/ok/vue/v-bind.vue.snap | 8 +- .../html_specs/ok/vue/v-on-shorthand.vue.snap | 8 +- crates/biome_html_parser/tests/quick_test.rs | 22 +- crates/biome_html_syntax/src/element_ext.rs | 110 +++-- .../biome_html_syntax/src/generated/kind.rs | 2 + .../biome_html_syntax/src/generated/macros.rs | 8 + .../biome_html_syntax/src/generated/nodes.rs | 405 +++++++++++++++++- .../src/generated/nodes_mut.rs | 34 +- .../src/lint/style/use_import_type.rs | 2 +- crates/biome_service/src/file_handlers/css.rs | 8 +- .../src/file_handlers/javascript.rs | 2 +- crates/biome_service/src/file_handlers/mod.rs | 6 +- .../services/embedded_value_references.rs | 128 +++++- crates/biome_service/src/workspace/server.rs | 38 +- xtask/codegen/html.ungram | 26 +- xtask/codegen/src/html_kinds_src.rs | 2 + 89 files changed, 2390 insertions(+), 226 deletions(-) create mode 100644 crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/use_import_type_not_triggered_for_enum_in_template_v2.snap create mode 100644 crates/biome_html_formatter/src/html/any/component_object_name.rs create mode 100644 crates/biome_html_formatter/src/html/any/tag_name.rs create mode 100644 crates/biome_html_formatter/src/html/auxiliary/component_name.rs create mode 100644 crates/biome_html_formatter/src/html/auxiliary/member_name.rs create mode 100644 crates/biome_html_parser/tests/html_specs/ok/astro/component_member.astro create mode 100644 crates/biome_html_parser/tests/html_specs/ok/astro/component_member.astro.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/astro/component_member_nested.astro create mode 100644 crates/biome_html_parser/tests/html_specs/ok/astro/component_member_nested.astro.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/astro/component_with_attributes.astro create mode 100644 crates/biome_html_parser/tests/html_specs/ok/astro/component_with_attributes.astro.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/svelte/component_member.svelte create mode 100644 crates/biome_html_parser/tests/html_specs/ok/svelte/component_member.svelte.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/svelte/component_member_nested.svelte create mode 100644 crates/biome_html_parser/tests/html_specs/ok/svelte/component_member_nested.svelte.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/svelte/component_with_attributes.svelte create mode 100644 crates/biome_html_parser/tests/html_specs/ok/svelte/component_with_attributes.svelte.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/vue/component_member.vue create mode 100644 crates/biome_html_parser/tests/html_specs/ok/vue/component_member.vue.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/vue/component_member_nested.vue create mode 100644 crates/biome_html_parser/tests/html_specs/ok/vue/component_member_nested.vue.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/vue/component_member_simple.vue create mode 100644 crates/biome_html_parser/tests/html_specs/ok/vue/component_member_simple.vue.snap create mode 100644 crates/biome_html_parser/tests/html_specs/ok/vue/component_with_attributes.vue create mode 100644 crates/biome_html_parser/tests/html_specs/ok/vue/component_with_attributes.vue.snap diff --git a/crates/biome_cli/tests/cases/handle_vue_files.rs b/crates/biome_cli/tests/cases/handle_vue_files.rs index bc6db8f15d0d..a7ad9b46e886 100644 --- a/crates/biome_cli/tests/cases/handle_vue_files.rs +++ b/crates/biome_cli/tests/cases/handle_vue_files.rs @@ -1140,6 +1140,47 @@ import Component from "./Component.vue" )); } +#[test] +fn use_import_type_not_triggered_for_enum_in_template() { + let fs = MemoryFileSystem::default(); + let mut console = BufferConsole::default(); + + fs.insert( + "biome.json".into(), + r#"{ "html": { "linter": {"enabled": true}, "experimentalFullSupportEnabled": true } }"# + .as_bytes(), + ); + + let file = Utf8Path::new("file.vue"); + fs.insert( + file.into(), + r#" +"# + .as_bytes(), + ); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", "--only=useImportType", file.as_str()].as_slice()), + ); + + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "use_import_type_not_triggered_for_enum_in_template", + fs, + console, + result, + )); +} + const VUE_ENUM_IN_TEMPLATE: &str = r#" @@ -1149,12 +1190,37 @@ import { Component, FooEnum } from './types'; "#; #[test] -fn use_import_type_not_triggered_for_enum_in_template() { +fn use_import_type_not_triggered_for_enum_in_template_v2() { let fs = MemoryFileSystem::default(); let mut console = BufferConsole::default(); + fs.insert( + "biome.json".into(), + r#"{ "html": { "linter": {"enabled": true}, "experimentalFullSupportEnabled": true } }"# + .as_bytes(), + ); + let file = Utf8Path::new("file.vue"); - fs.insert(file.into(), VUE_ENUM_IN_TEMPLATE.as_bytes()); + fs.insert( + file.into(), + r#" + + + +"# + .as_bytes(), + ); let (fs, result) = run_cli( fs, @@ -1162,11 +1228,9 @@ fn use_import_type_not_triggered_for_enum_in_template() { Args::from(["lint", "--only=useImportType", file.as_str()].as_slice()), ); - assert!(result.is_ok(), "run_cli returned {result:?}"); - assert_cli_snapshot(SnapshotPayload::new( module_path!(), - "use_import_type_not_triggered_for_enum_in_template", + "use_import_type_not_triggered_for_enum_in_template_v2", fs, console, result, diff --git a/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/use_import_type_not_triggered_for_enum_in_template.snap b/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/use_import_type_not_triggered_for_enum_in_template.snap index acdb13469fda..4798b1f0e89b 100644 --- a/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/use_import_type_not_triggered_for_enum_in_template.snap +++ b/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/use_import_type_not_triggered_for_enum_in_template.snap @@ -2,6 +2,17 @@ source: crates/biome_cli/tests/snap_test.rs expression: redactor(content) --- +## `biome.json` + +```json +{ + "html": { + "linter": { "enabled": true }, + "experimentalFullSupportEnabled": true + } +} +``` + ## `file.vue` ```vue diff --git a/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/use_import_type_not_triggered_for_enum_in_template_v2.snap b/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/use_import_type_not_triggered_for_enum_in_template_v2.snap new file mode 100644 index 000000000000..8cc82a8119f1 --- /dev/null +++ b/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/use_import_type_not_triggered_for_enum_in_template_v2.snap @@ -0,0 +1,41 @@ +--- +source: crates/biome_cli/tests/snap_test.rs +expression: redactor(content) +--- +## `biome.json` + +```json +{ + "html": { + "linter": { "enabled": true }, + "experimentalFullSupportEnabled": true + } +} +``` + +## `file.vue` + +```vue + + + + + +``` + +# Emitted Messages + +```block +Checked 1 file in