Skip to content

fix(oxfmt/lsp): format non file:// URIs without a authority#21647

Merged
graphite-app[bot] merged 1 commit intomainfrom
04-22-fix_oxfmt_lsp_format_non_file___without_a_authority
Apr 24, 2026
Merged

fix(oxfmt/lsp): format non file:// URIs without a authority#21647
graphite-app[bot] merged 1 commit intomainfrom
04-22-fix_oxfmt_lsp_format_non_file___without_a_authority

Conversation

@Sysix
Copy link
Copy Markdown
Member

@Sysix Sysix commented Apr 22, 2026

Pull request overview

This PR updates oxfmt’s LSP in-memory formatting to handle URIs that don’t have an authority component (i.e., non-file:// URIs like vscode-userdata:/...) by deriving a “fake” file path from the URI’s authority or path, and updates the LSP formatting tests/snapshots accordingly.

Copy link
Copy Markdown
Member Author

Sysix commented Apr 22, 2026


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent changes, fast-track this PR to the front of the merge queue

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@Sysix Sysix changed the title fix(oxfmt/lsp): format non file:// without a authority fix(oxfmt/lsp): format non file:// URIs without a authority Apr 22, 2026
@Sysix Sysix force-pushed the 04-22-fix_oxfmt_lsp_format_non_file___without_a_authority branch from 8688249 to 9612b28 Compare April 22, 2026 18:04
@Sysix Sysix requested a review from Copilot April 22, 2026 18:16
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR updates oxfmt’s LSP in-memory formatting to handle URIs that don’t have an authority component (i.e., non-file:// URIs like vscode-userdata:/...) by deriving a “fake” file path from the URI’s authority or path, and updates the LSP formatting tests/snapshots accordingly.

Changes:

  • Adjust create_fake_file_path_from_language_id to fall back to uri.path() when uri.authority() is missing.
  • Simplify/reshape the in-memory LSP formatting test matrix to include an authority-less vscode-userdata:/... URI case.
  • Update Vitest snapshots to match the new test cases and snapshot keys.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
apps/oxfmt/src/lsp/mod.rs Changes fake path derivation for in-memory formatting; adds a unit test.
apps/oxfmt/test/lsp/format/format.test.ts Consolidates in-memory URI formatting tests and adds an authority-less URI case.
apps/oxfmt/test/lsp/format/snapshots/format.test.ts.snap Updates snapshots to reflect the new test table and snapshot names.

Comment thread apps/oxfmt/src/lsp/mod.rs Outdated
Comment thread apps/oxfmt/src/lsp/mod.rs
@Sysix Sysix marked this pull request as ready for review April 22, 2026 18:25
@Sysix Sysix requested a review from leaysgur as a code owner April 22, 2026 18:25
Copy link
Copy Markdown
Member

@leaysgur leaysgur left a comment

Choose a reason for hiding this comment

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

From my agent 🤖:

  • Path escaping issue with uri.path() fallback

When uri.path() returns an absolute path like /c%3A/Users/User/settings.json, the resulting file_name starts with /, causing root.join(file_name) to ignore root entirely and produce an absolute path.
This fake path is then passed to resolve_and_format, where resolve_config_scope(path) uses it for config lookup — so the path escaping root could lead to unintended config resolution.

Consider extracting just the last segment:

let name = uri.authority().map_or_else(
    || uri.path().as_str().rsplit('/').next().unwrap_or("untitled"),
    |s| s.as_str(),
);

@Sysix Sysix force-pushed the 04-22-fix_oxfmt_lsp_format_non_file___without_a_authority branch from 9612b28 to be70d78 Compare April 23, 2026 17:20
@Sysix Sysix requested a review from Copilot April 23, 2026 17:22
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

Comment thread apps/oxfmt/src/lsp/mod.rs Outdated
Comment thread apps/oxfmt/test/lsp/format/format.test.ts
@Sysix Sysix force-pushed the 04-22-fix_oxfmt_lsp_format_non_file___without_a_authority branch from be70d78 to 4bd1a91 Compare April 23, 2026 18:14
@Sysix Sysix requested a review from leaysgur April 23, 2026 18:24
Copy link
Copy Markdown
Member

@leaysgur leaysgur left a comment

Choose a reason for hiding this comment

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

🙏🏻

@leaysgur leaysgur added the 0-merge Merge with Graphite Merge Queue label Apr 24, 2026
Copy link
Copy Markdown
Member

leaysgur commented Apr 24, 2026

Merge activity

> ## Pull request overview

> This PR updates oxfmt’s LSP in-memory formatting to handle URIs that don’t have an authority component (i.e., non-`file://` URIs like `vscode-userdata:/...`) by deriving a “fake” file path from the URI’s authority *or* path, and updates the LSP formatting tests/snapshots accordingly.
@graphite-app graphite-app Bot force-pushed the 04-22-fix_oxfmt_lsp_format_non_file___without_a_authority branch from 4bd1a91 to 38d1e82 Compare April 24, 2026 05:19
@graphite-app graphite-app Bot merged commit 38d1e82 into main Apr 24, 2026
25 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Apr 24, 2026
@graphite-app graphite-app Bot deleted the 04-22-fix_oxfmt_lsp_format_non_file___without_a_authority branch April 24, 2026 05:23
camc314 added a commit that referenced this pull request Apr 27, 2026
# Oxlint
### 💥 BREAKING CHANGES

- 502e804 ast: [**BREAKING**] Reduce size of `TSTypePredicateName`
(#21711) (overlookmotel)
- 5651539 ast: [**BREAKING**] Reduce size of `JSXExpression` (#21710)
(overlookmotel)
- c44e280 ast: [**BREAKING**] Reduce size of `ArrayExpressionElement`
(#21709) (overlookmotel)

### 🚀 Features

- b4acdbd linter/vue: Implement no-deprecated-delete-set rule (#21766)
(bab)
- 613bfef linter: Split jest/prefer-to-contain into a jest and a vitest
rule. (#21821) (connorshea)
- c629719 linter/vue: Implement no-deprecated-events-api rule (#21793)
(Alex Peshkov)
- f2a8528 linter: Split jest/require-top-level-describe rule into a Jest
and a Vitest rule. (#21822) (connorshea)
- ea4b358 linter: Split jest/prefer-todo into a shared rule and a
vitest-specific rule. (#21820) (connorshea)
- 3a66819 linter: Split jest/no-mocks-import into vitest/no-mocks-import
(#21818) (camchenry)
- 0b3ffce linter: Split jest/no-large-snapshots into
vitest/no-large-snapshots (#21814) (camchenry)
- d1cf22e linter: Split jest/no-interpolation-in-snapshots into
vitest/no-interpolation-in-snapshots (#21812) (camchenry)
- bb0c359 linter: Split jest/no-identical-title into
vitest/no-identical-title (#21810) (camchenry)
- c26ea41 linter: Split jest/no-hooks into vitest/no-hooks (#21809)
(camchenry)
- 46b32f2 linter: Split jest/no-focused-tests into
vitest/no-focused-tests (#21804) (camchenry)
- acf41a8 linter: Split jest/no-duplicate-hooks into
vitest/no-duplicate-hooks (#21803) (camchenry)
- 54d787f linter: Split jest/no-disabled-tests into
vitest/no-disabled-tests (#21802) (camchenry)
- 9c9a676 linter/vue: Implement no-deprecated-data-object-declaration
rule (#21764) (bab)
- 4445855 linter: Split `jest/no-conditional-in-test` into
`vitest/no-conditional-in-test` (#21763) (camchenry)
- b8604de linter: Split `jest/no-conditional-expect` into
`vitest/no-conditional-expect` (#21762) (camchenry)
- 0dbd650 linter: Split `jest/no-commented-out-tests` into
`vitest/no-commented-out-tests` (#21761) (camchenry)
- 7f1a97c linter: Split `jest/no-alias-methods` into
`vitest/no-alias-methods` (#21760) (camchenry)
- eb97c49 linter: Split `jest/max-nested-describe` into
`vitest/max-nested-describe` (#21759) (camchenry)
- d870cad linter: Split `jest/max-expects` into `vitest/max-expects`
(#21758) (camchenry)
- 1b97124 linter/vue: Implement no-deprecated-vue-config-keycodes rule
(#21699) (bab)
- 5f81883 linter/eslint: Implement `func-name-matching` rule (#21708)
(Mikhail Baev)
- 348f46c linter: Add `respectEslintDisableDirectives` option (#21384)
(Christian Vuerings)
- 63ec351 linter: Support nested vite+ config discovery (#21638)
(camc314)
- 560feb4 linter: Introduce `Vite` variant to `DiscoveredConfigFile`
(#21637) (camc314)
- 07dc41e linter/eslint: Implement `no-underscore-dangle` rule (#21630)
(Paul-Arthur THIERY)
- e270d54 linter/react: Impl react/no-did-update-set-state (#17322)
(Kenzo Wada)
- ca81199 linter/react: Implement `forbid-component-props` rule (#20005)
(Mikhail Baev)
- 6776403 linter/branches-sharing-code: Move rule from nursery to
pedantic (#21621) (camc314)
- ce7a4dc linter/no-unreachable: Move rule from nursery to correctness
(#21618) (camc314)
- e3b5e78 linter/getter-return: Move rule from nursery to correctness
(#21617) (camc314)
- d3a7e9a linter/unicorn: Implement suggestion for
`no-useless-iterator-to-array` rule (#21610) (Mikhail Baev)
- a0c883c oxlint/lsp: Add vite plus version to server info (#21587)
(Sysix)
- 67ff860 linter/no-unknown-property: Support React 19 `precedence` prop
(#21590) (João Pedro Schmitz)

### 🐛 Bug Fixes

- aace797 linter: Detect Svelte TS and module scripts correctly (#20819)
(mustafa0x)
- 3612db1 linter/prefer-default-parameters: Skip reporting on
object/class setters (#21836) (camc314)
- 28c3521 oxlint/lsp: Remove overlapping edits for
`source.fixAllDangerous.oxc` code action (#21785) (Sysix)
- 705a82c linter/no-non-null-asserted-nullish-coalescing: Add fixer
(#21827) (yyh)
- 33f5535 linter: Add checks that `Program` is in current allocator
chunk before JS plugins linting (#21774) (overlookmotel)
- d122877 linter/no-extra-non-null-assertions: Add fixer (#21744) (yyh)
- 37f0731 linter: `with_plugin_vitest(true)` working realiable in test
mode (#21769) (Said Atrahouch)
- e42e6a6 linter/role-supports-aria-props: False positive with
`combobox` and `haspopup` (#21725) (Leonabcd123)
- e24324f linter: Iframe-has-title false positive for template literals
(#21714) (Leonabcd123)
- 41a6510 linter/vitest/hoisted-apis-on-top: Only check first member
(#20068) (Sidharth Vinod)
- 98ed888 linter: Check initializer for allowConstantExport in
only-export-components (#20608) (Eyüp Can Akman)
- 1946e8b linter: Avoid applying override plugin categories to eslint
rules (#21521) (bab)
- 3d1e83a linter: Parse `<script>` tag attributes with curly braces in
Svelte files (#21089) (bab)
- bc6ade5 linter: Report actual disable directive prefix (#21682)
(camc314)
- bf84466 linter: Respect category settings in overrides (#19411)
(Connor Shea)
- 52ecb45 linter/vitest: Don't treat `test.extend` or `it.extend` as
test functions (#21668) (Said Atrahouch)
- aa1a00c linter: Support jsx-a11y attributes setting in anchor-is-valid
rule (#21665) (camchenry)
- 30e0ad3 linter/prefer-default-parameters: Preserve TS annotations in
fixer (#21655) (camc314)
- 8c425db linter: Allow string for jest version in config schema
(#21649) (camc314)
- 3617864 linter/react/display-name: Fix false positive for named
default class (#21643) (Mikhail Baev)
- f3a02cc linter/no-non-null-assertion: Improve diagnostic message
(#21616) (Cameron)
- c2ada2c linter: Make `--fix-dangerously` fix dangerous fixes and
suggestions as documented (#13366) (Ulrich Stark)
- 8265ed9 linter/sort-keys: Handle CRLF separated groups (#21608)
(camc314)
- 96c559e linter/no-shadow: Add note explaining enum member shadowing
(#21607) (camc314)
- 3b49389 linter: No-irregular-whitespace: add config options (#21559)
(camchenry)

### ⚡ Performance

- cdc9eae oxlint/lsp: Avoid clones on lsp options deserializion (#21748)
(Sysix)
- be2db80 linter/sort-keys: Reduce allocations (#21560) (camchenry)

### 📚 Documentation

- 453d647 linter: Remove now-unnecessary compatibility notes from shared
Jest/Vitest rules. (#21826) (connorshea)
- b1574a2 linter: Fix the configuration docs for no-underscore-dangle
rule. (#21801) (connorshea)
- 6946aee linter: Remove no-longer-relevant documentation about vitest
compatibility from shared Jest/Vitest rules. (#21799) (connorshea)
- 0652ea2 linter: Misc grammar cleanup for Vitest rules. (#21755)
(connorshea)
- 99f0b68 linter: Improve docs for `vitest/require-mock-type-parameters`
rule. (#21754) (connorshea)
- 9e2796b linter: Improve the docs for the `vitest/hoisted-apis-on-top`
rule. (#21753) (connorshea)
- 2ccede2 linter: Improve function usage examples in doc comments
(#21718) (overlookmotel)
- 43adae9 linter: Add version section to rules page (#21601) (camchenry)
- d15dad2 linter: Export rule version metadata (#21588) (Old Autumn)
# Oxfmt
### 💥 BREAKING CHANGES

- 502e804 ast: [**BREAKING**] Reduce size of `TSTypePredicateName`
(#21711) (overlookmotel)
- 5651539 ast: [**BREAKING**] Reduce size of `JSXExpression` (#21710)
(overlookmotel)
- c44e280 ast: [**BREAKING**] Reduce size of `ArrayExpressionElement`
(#21709) (overlookmotel)

### 🚀 Features

- 3bc54a9 oxfmt: Respect nested config for `--stdin-filepath` (#21627)
(leaysgur)
- 144f27a oxfmt: Respect ignore settings for `--stdin-filepath` (#21625)
(leaysgur)
- 81c7ae4 oxfmt/lsp: Add vite plus version to server info (#21586)
(Sysix)

### 🐛 Bug Fixes

- 477435b formatter/sort_imports: Keep leading blank line when
decreasing group transitions (#21835) (leaysgur)
- 38d1e82 oxfmt/lsp: Format non `file://` URIs without a authority
(#21647) (Sysix)
- 5eb8e2b formatter/sort_imports: Preserve blank lines around ignored
side-effect imports (#21692) (leaysgur)
- 0dce3c6 oxfmt: Handle invalid `overrides` config without panic
(#21661) (Yuji Sugiura)
- 9f82ed4 formatter: Escape backticks in JSDoc inline code spans
(#21577) (bab)

### ⚡ Performance

- db6c603 oxfmt/lsp: Avoid clones on lsp options deserializion (#21749)
(Sysix)
- 6a96c76 formatter: Avoid heap alloc for jsdoc delimiter (#21597)
(leaysgur)

---------

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Co-authored-by: Cameron Clark <cameron.clark@hey.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants