feat(parse/html): parse svelte function bindings more precisely#10300
Conversation
🦋 Changeset detectedLatest commit: 7300cbc The changes in this PR will be included in the next version bump. This PR includes changesets to release 13 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Parser conformance results onjs/262
jsx/babel
markdown/commonmark
symbols/microsoft
ts/babel
ts/microsoft
|
|
ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (9)
📒 Files selected for processing (17)
✅ Files skipped from review due to trivial changes (5)
🚧 Files skipped from review as they are similar to previous changes (9)
WalkthroughThis PR adds grammar and HTML-kind entries for Svelte bind-function initializers, implements dedicated parsing (with guarded lookahead and fallback), updates token lexing for comma-restricted expressions, adds formatter rules and generated wiring for the new nodes, changes embedded-JS extraction to emit separate candidates for bind get/set, tightens compact formatting gating, and adds tests covering valid and invalid comma uses. Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.changeset/fix-svelte-bind-comma.md:
- Line 5: Update the changeset line that references the lint rule by linking
`noCommaOperator` to its docs using the required format; replace the plain rule
name in the sentence with
[`noCommaOperator`](https://biomejs.dev/linter/rules/no-comma-operator) so the
changeset reads as: "Svelte function bindings ... so
[`noCommaOperator`](https://biomejs.dev/linter/rules/no-comma-operator) won't
emit false positives..." and ensure the link appears exactly in that
markdown-style format.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 6d003fd6-bc33-424c-8235-ba635ae8d4f2
⛔ Files ignored due to path filters (9)
crates/biome_html_factory/src/generated/node_factory.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_html_factory/src/generated/syntax_factory.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_html_parser/tests/html_specs/ok/svelte/directives/bind_function.svelte.snapis excluded by!**/*.snapand included by**crates/biome_html_syntax/src/generated/kind.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_html_syntax/src/generated/macros.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_html_syntax/src/generated/nodes.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_html_syntax/src/generated/nodes_mut.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_js_analyze/tests/specs/complexity/noCommaOperator/invalid-svelte-template.svelte.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/complexity/noCommaOperator/valid-svelte-bind-function.svelte.snapis excluded by!**/*.snapand included by**
📒 Files selected for processing (17)
.changeset/fix-svelte-bind-comma.mdcrates/biome_html_formatter/src/generated.rscrates/biome_html_formatter/src/svelte/any/directive_initializer_clause.rscrates/biome_html_formatter/src/svelte/any/mod.rscrates/biome_html_formatter/src/svelte/auxiliary/bind_function_binding_expression.rscrates/biome_html_formatter/src/svelte/auxiliary/bind_function_binding_initializer_clause.rscrates/biome_html_formatter/src/svelte/auxiliary/mod.rscrates/biome_html_formatter/src/svelte/value/directive_value.rscrates/biome_html_parser/src/syntax/svelte.rscrates/biome_html_parser/src/token_source.rscrates/biome_html_parser/tests/html_specs/ok/svelte/directives/bind_function.sveltecrates/biome_html_syntax/src/directive_ext.rscrates/biome_js_analyze/tests/specs/complexity/noCommaOperator/invalid-svelte-template.sveltecrates/biome_js_analyze/tests/specs/complexity/noCommaOperator/valid-svelte-bind-function.sveltecrates/biome_service/src/file_handlers/html/parse_embedded_nodes.rsxtask/codegen/html.ungramxtask/codegen/src/html_kinds_src.rs
Merging this PR will not alter performance
Comparing Footnotes
|
39fbc46 to
c664879
Compare
c664879 to
7300cbc
Compare
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.4.15` -> `2.4.16`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.15/2.4.16) | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.4.16`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#2416) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.15...@biomejs/biome@2.4.16) ##### Patch Changes - [#​10329](biomejs/biome#10329) [`ef764d5`](biomejs/biome@ef764d5) Thanks [@​Conaclos](https://github.com/Conaclos)! - Fixed an issue where diagnostics showed an incorrect location in Astro files. - [#​10363](biomejs/biome#10363) [`50aa415`](biomejs/biome@50aa415) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed HTML formatting for a case where comments could cause the formatter to split up a closing tag, which would cause the resulting HTML to be syntactically invalid. Input: ```html <span ><!-- 1 --><span>a</span ><!-- 2 --><span>b</span ><!-- 3 --></span> ``` Output: ```diff <span ><!-- 1 - --> <span>a</span<!-- 2 - --> ><span>b</span><!-- 3 + --><span>a</span><!-- 2 + --><span>b</span><!-- 3 --></span > ``` - [#​10465](biomejs/biome#10465) [`0c718da`](biomejs/biome@0c718da) Thanks [@​dfedoryshchev](https://github.com/dfedoryshchev)! - Fixed diagnostics emitted by the `noUntrustedLicenses` rule. - [#​10358](biomejs/biome#10358) [`05c2617`](biomejs/biome@05c2617) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10356](biomejs/biome#10356): `biome rage --linter` now displays rules enabled through linter domains in the enabled rules list. - [#​10300](biomejs/biome#10300) [`950247c`](biomejs/biome@950247c) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10265](biomejs/biome#10265): Svelte function bindings such as `bind:value={get, set}` are now parsed more precisely, so [`noCommaOperator`](https://biomejs.dev/linter/rules/no-comma-operator/) won't emit false positives for that syntax anymore. - [#​9786](biomejs/biome#9786) [`e71f584`](biomejs/biome@e71f584) Thanks [@​MeGaNeKoS](https://github.com/MeGaNeKoS)! - Fixed [#​8480](biomejs/biome#8480): [`useDestructuring`](https://biomejs.dev/linter/rules/use-destructuring/) now provides `variableDeclarator` and `assignmentExpression` options to control which contexts enforce destructuring, matching ESLint's `prefer-destructuring` configuration. Both default to `{array: true, object: true}`. The diagnostic for object destructuring in assignment expressions now instructs users to wrap the assignment in parentheses. - [#​10425](biomejs/biome#10425) [`1948b72`](biomejs/biome@1948b72) Thanks [@​sjh9714](https://github.com/sjh9714)! - Fixed [#​10244](biomejs/biome#10244): The `useOptionalChain` rule now detects negated guard inequality chains like `!foo || foo.bar !== "x"`. - [#​10442](biomejs/biome#10442) [`001f94f`](biomejs/biome@001f94f) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​10411](biomejs/biome#10411): [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/) no longer causes a stack overflow when a nested function returns an object with shorthand properties that shadow destructured variables from an outer scope. - [#​10318](biomejs/biome#10318) [`9b1577f`](biomejs/biome@9b1577f) Thanks [@​dyc3](https://github.com/dyc3)! - Added support for `formatter.trailingCommas` in overrides. This option was previously available in the top-level formatter configuration but missing from formatter overrides. - [#​10319](biomejs/biome#10319) [`2e37709`](biomejs/biome@2e37709) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed Vue and Svelte formatting for standalone interpolations in inline elements. Biome now preserves existing newlines in cases like: ```diff - <span> {{ value }} </span> + <span> + {{ value }} + </span> ``` - [#​10365](biomejs/biome#10365) [`0a58eb0`](biomejs/biome@0a58eb0) Thanks [@​Netail](https://github.com/Netail)! - Fixed [#​10361](biomejs/biome#10361): [`noUnusedFunctionParameters`](https://biomejs.dev/linter/rules/no-unused-function-parameters/) now mentions the parameter name in the diagnostic. - [#​10439](biomejs/biome#10439) [`df6b867`](biomejs/biome@df6b867) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS and SCSS formatting for comments around declaration colons so comments between property names, colons, and values stay at the same boundary as Prettier. ```diff .selector { - color: /* red, */ - blue; + color: /* red, */ blue; } ``` - [#​10344](biomejs/biome#10344) [`b30208c`](biomejs/biome@b30208c) Thanks [@​siketyan](https://github.com/siketyan)! - Fixed [`#10123`](biomejs/biome#10123): Corrected the [`noReactNativeDeepImports`](https://biomejs.dev/linter/rules/no-react-native-deep-imports/) source rule to point to the proper upstream rule, so users can migrate from the original rule correctly. - [#​10328](biomejs/biome#10328) [`b59133f`](biomejs/biome@b59133f) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10309](biomejs/biome#10309): Biome no longer adds newlines to Astro frontmatter when linter or assist `--write` mode is enabled. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xOTUuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE5NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Client/pulls/5
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.4.15` -> `2.4.16`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.15/2.4.16) | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.4.16`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#2416) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.15...@biomejs/biome@2.4.16) ##### Patch Changes - [#​10329](biomejs/biome#10329) [`ef764d5`](biomejs/biome@ef764d5) Thanks [@​Conaclos](https://github.com/Conaclos)! - Fixed an issue where diagnostics showed an incorrect location in Astro files. - [#​10363](biomejs/biome#10363) [`50aa415`](biomejs/biome@50aa415) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed HTML formatting for a case where comments could cause the formatter to split up a closing tag, which would cause the resulting HTML to be syntactically invalid. Input: ```html <span ><!-- 1 --><span>a</span ><!-- 2 --><span>b</span ><!-- 3 --></span> ``` Output: ```diff <span ><!-- 1 - --> <span>a</span<!-- 2 - --> ><span>b</span><!-- 3 + --><span>a</span><!-- 2 + --><span>b</span><!-- 3 --></span > ``` - [#​10465](biomejs/biome#10465) [`0c718da`](biomejs/biome@0c718da) Thanks [@​dfedoryshchev](https://github.com/dfedoryshchev)! - Fixed diagnostics emitted by the `noUntrustedLicenses` rule. - [#​10358](biomejs/biome#10358) [`05c2617`](biomejs/biome@05c2617) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10356](biomejs/biome#10356): `biome rage --linter` now displays rules enabled through linter domains in the enabled rules list. - [#​10300](biomejs/biome#10300) [`950247c`](biomejs/biome@950247c) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10265](biomejs/biome#10265): Svelte function bindings such as `bind:value={get, set}` are now parsed more precisely, so [`noCommaOperator`](https://biomejs.dev/linter/rules/no-comma-operator/) won't emit false positives for that syntax anymore. - [#​9786](biomejs/biome#9786) [`e71f584`](biomejs/biome@e71f584) Thanks [@​MeGaNeKoS](https://github.com/MeGaNeKoS)! - Fixed [#​8480](biomejs/biome#8480): [`useDestructuring`](https://biomejs.dev/linter/rules/use-destructuring/) now provides `variableDeclarator` and `assignmentExpression` options to control which contexts enforce destructuring, matching ESLint's `prefer-destructuring` configuration. Both default to `{array: true, object: true}`. The diagnostic for object destructuring in assignment expressions now instructs users to wrap the assignment in parentheses. - [#​10425](biomejs/biome#10425) [`1948b72`](biomejs/biome@1948b72) Thanks [@​sjh9714](https://github.com/sjh9714)! - Fixed [#​10244](biomejs/biome#10244): The `useOptionalChain` rule now detects negated guard inequality chains like `!foo || foo.bar !== "x"`. - [#​10442](biomejs/biome#10442) [`001f94f`](biomejs/biome@001f94f) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​10411](biomejs/biome#10411): [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/) no longer causes a stack overflow when a nested function returns an object with shorthand properties that shadow destructured variables from an outer scope. - [#​10318](biomejs/biome#10318) [`9b1577f`](biomejs/biome@9b1577f) Thanks [@​dyc3](https://github.com/dyc3)! - Added support for `formatter.trailingCommas` in overrides. This option was previously available in the top-level formatter configuration but missing from formatter overrides. - [#​10319](biomejs/biome#10319) [`2e37709`](biomejs/biome@2e37709) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed Vue and Svelte formatting for standalone interpolations in inline elements. Biome now preserves existing newlines in cases like: ```diff - <span> {{ value }} </span> + <span> + {{ value }} + </span> ``` - [#​10365](biomejs/biome#10365) [`0a58eb0`](biomejs/biome@0a58eb0) Thanks [@​Netail](https://github.com/Netail)! - Fixed [#​10361](biomejs/biome#10361): [`noUnusedFunctionParameters`](https://biomejs.dev/linter/rules/no-unused-function-parameters/) now mentions the parameter name in the diagnostic. - [#​10439](biomejs/biome#10439) [`df6b867`](biomejs/biome@df6b867) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS and SCSS formatting for comments around declaration colons so comments between property names, colons, and values stay at the same boundary as Prettier. ```diff .selector { - color: /* red, */ - blue; + color: /* red, */ blue; } ``` - [#​10344](biomejs/biome#10344) [`b30208c`](biomejs/biome@b30208c) Thanks [@​siketyan](https://github.com/siketyan)! - Fixed [`#10123`](biomejs/biome#10123): Corrected the [`noReactNativeDeepImports`](https://biomejs.dev/linter/rules/no-react-native-deep-imports/) source rule to point to the proper upstream rule, so users can migrate from the original rule correctly. - [#​10328](biomejs/biome#10328) [`b59133f`](biomejs/biome@b59133f) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed [#​10309](biomejs/biome#10309): Biome no longer adds newlines to Astro frontmatter when linter or assist `--write` mode is enabled. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xOTUuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE5NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/13
Summary
Function bindings in svelte are where you can use getter/setter functions in a bind directive. documented here: https://svelte.dev/docs/svelte/bind#Function-bindings
This makes it so we parse that syntax more precisely.
Implemented by gpt 5.5, but i had to do a bit of steering.
fixes #10265
Test Plan
snapshots
Docs