├── .gitignore ├── Cargo.toml ├── extension.toml ├── LICENSE ├── README.md ├── src └── oxc.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | extension.wasm 3 | node_modules 4 | package-lock.json 5 | pnpm-lock.yaml 6 | package.json 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "zed-oxc" 3 | version = "0.3.3" 4 | edition = "2024" 5 | license = "MIT" 6 | publish = false 7 | 8 | [lib] 9 | crate-type = ["cdylib"] 10 | path = "src/oxc.rs" 11 | 12 | [dependencies] 13 | zed_extension_api = "0.7.0" 14 | -------------------------------------------------------------------------------- /extension.toml: -------------------------------------------------------------------------------- 1 | authors = ["suxiaoshao "] 2 | description = "Oxc support for Zed" 3 | id = "oxc" 4 | name = "Oxc" 5 | repository = "https://github.com/oxc-project/zed-oxc" 6 | schema_version = 1 7 | version = "0.3.3" 8 | 9 | [language_servers.oxc] 10 | code_actions_kind = ["quickfix","source.fixAll.oxc"] 11 | language = "JavaScript" 12 | languages = [ 13 | "JavaScript", 14 | "JSX", 15 | "TypeScript", 16 | "TSX", 17 | "Vue.js", 18 | "Astro", 19 | "Svelte", 20 | ] 21 | name = "Oxc Language Server" 22 | 23 | [language_servers.oxc.language_ids] 24 | "Astro" = "astro" 25 | "JSX" = "javascriptreact" 26 | "JavaScript" = "javascript" 27 | "Svelte" = "svelte" 28 | "TSX" = "typescriptreact" 29 | "TypeScript" = "typescript" 30 | "Vue.js" = "vuejs" 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025-present VoidZero Inc. & Contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | OXC Logo 3 |

4 | 5 | # Oxc extension for Zed 6 | 7 | This extension adds support for [Oxc](https://github.com/oxc-project/oxc) in [Zed](https://zed.dev/). 8 | 9 | Languages currently supported: 10 | 11 | - **JavaScript** 12 | - **TypeScript** 13 | - **JSX** 14 | - **TSX** 15 | - **Vue.js** 16 | - **Astro** 17 | - **Svelte** 18 | 19 | ## Installation 20 | 21 | Requires Zed >= **v0.131.0**. 22 | 23 | This extension is available in the extensions view inside the Zed editor. Open `zed: extensions` and search for _Oxc_. 24 | 25 | ## Configuration 26 | 27 | To configure the oxc extension in the Zed editor, edit your settings.json file and add the following configuration: 28 | 29 | ```json 30 | { 31 | "lsp": { 32 | "oxc": { 33 | "initialization_options": { 34 | "options": { 35 | "run": "onType", 36 | "configPath": null, 37 | "tsConfigPath": null, 38 | "unusedDisableDirectives": "allow", 39 | "typeAware": false, 40 | "flags": {} 41 | } 42 | } 43 | } 44 | } 45 | } 46 | ``` 47 | 48 | Below are the available values and descriptions for each option: 49 | 50 | | Option Key | Value(s) | Default | Description | 51 | | ------------------------- | ------------------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | 52 | | `run` | `"onSave" \| "onType"` | `"onType"` | Should the server lint the files when the user is typing or saving | 53 | | `configPath` | `` \| `null` | `null` | Path to a oxlint configuration file, passing a string will disable nested configuration | 54 | | `tsConfigPath` | `` \| `null` | `null` | Path to a TypeScript configuration file. If your `tsconfig.json` is not at the root, alias paths will not be resolve correctly for the `import` plugin | 55 | | `unusedDisableDirectives` | `"allow" \| "warn"` \| "deny"` | `"allow"` | Define how directive comments like `// oxlint-disable-line` should be reported, when no errors would have been reported on that line anyway | 56 | | `typeAware` | `true` \| `false` | `false` | Enables type-aware linting | 57 | | `flags` | `Map` | `` | Special oxc language server flags, currently only one flag key is supported: `disable_nested_config` | 58 | 59 | For more information, see 60 | -------------------------------------------------------------------------------- /src/oxc.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | fs, 3 | path::{Path, PathBuf}, 4 | }; 5 | use zed_extension_api::{ 6 | self as zed, LanguageServerId, Result, 7 | serde_json::{self}, 8 | settings::LspSettings, 9 | }; 10 | 11 | // the general expected server path (excluded for windows) 12 | const WORKTREE_SERVER_PATH: &str = "node_modules/oxlint/bin/oxc_language_server"; 13 | 14 | const PACKAGE_NAME: &str = "oxlint"; 15 | 16 | struct OxcExtension; 17 | 18 | impl OxcExtension { 19 | fn extension_server_exists(&self, path: &Path) -> bool { 20 | fs::metadata(path).is_ok_and(|stat| stat.is_file()) 21 | } 22 | 23 | fn binary_specifier(&self) -> Result { 24 | let (platform, arch) = zed::current_platform(); 25 | 26 | let binary_name = match platform { 27 | zed::Os::Windows => "oxc_language_server.exe", 28 | _ => "oxc_language_server", 29 | }; 30 | 31 | // Zed does not currently provide an API to determine whether it is gnu or musl, 32 | // So on Linux you need to run the sh (./node_modules/.bin/oxc_language_server) script. 33 | if let zed::Os::Linux = platform { 34 | return Ok(".bin/oxc_language_server".to_string()); 35 | } 36 | 37 | Ok(format!( 38 | "@oxlint/{platform}-{arch}{build}/{binary}", 39 | platform = match platform { 40 | zed::Os::Mac => "darwin", 41 | zed::Os::Linux => "linux", 42 | zed::Os::Windows => "win32", 43 | }, 44 | arch = match arch { 45 | zed::Architecture::Aarch64 => "arm64", 46 | zed::Architecture::X8664 => "x64", 47 | _ => return Err(format!("unsupported architecture: {arch:?}")), 48 | }, 49 | build = match platform { 50 | zed::Os::Linux => "-gnu", 51 | _ => "", 52 | }, 53 | binary = binary_name, 54 | )) 55 | } 56 | 57 | fn workspace_oxc_exists(&self, worktree: &zed::Worktree) -> bool { 58 | // This is a workaround, as reading the file from wasm doesn't work. 59 | // Instead we try to read the `package.json`, see if `oxlint` is installed 60 | let package_json = worktree 61 | .read_text_file("package.json") 62 | .unwrap_or(String::from(r#"{}"#)); 63 | 64 | let package_json: Option = 65 | serde_json::from_str(package_json.as_str()).ok(); 66 | 67 | package_json.is_some_and(|f| { 68 | !f["dependencies"][PACKAGE_NAME].is_null() 69 | || !f["devDependencies"][PACKAGE_NAME].is_null() 70 | }) 71 | } 72 | 73 | fn check_oxc_updates(&mut self, language_server_id: &LanguageServerId) -> Result<()> { 74 | // fallback to extension owned oxlint 75 | zed::set_language_server_installation_status( 76 | language_server_id, 77 | &zed::LanguageServerInstallationStatus::CheckingForUpdate, 78 | ); 79 | 80 | let extension_server_path = &Path::new("./node_modules").join(self.binary_specifier()?); 81 | let version = zed::npm_package_latest_version(PACKAGE_NAME)?; 82 | 83 | if !self.extension_server_exists(extension_server_path) 84 | || zed::npm_package_installed_version(PACKAGE_NAME)?.as_ref() != Some(&version) 85 | { 86 | zed::set_language_server_installation_status( 87 | language_server_id, 88 | &zed::LanguageServerInstallationStatus::Downloading, 89 | ); 90 | let result = zed::npm_install_package(PACKAGE_NAME, &version); 91 | match result { 92 | Ok(()) => { 93 | if !self.extension_server_exists(extension_server_path) { 94 | Err(format!( 95 | "installed package '{PACKAGE_NAME}' did not contain expected path '{extension_server_path:?}'", 96 | ))?; 97 | } 98 | } 99 | Err(error) => { 100 | if !self.extension_server_exists(extension_server_path) { 101 | Err(format!( 102 | "failed to install package '{PACKAGE_NAME}': {error}" 103 | ))?; 104 | } 105 | } 106 | } 107 | } 108 | 109 | Ok(()) 110 | } 111 | } 112 | 113 | impl zed_extension_api::Extension for OxcExtension { 114 | fn new() -> Self 115 | where 116 | Self: Sized, 117 | { 118 | Self 119 | } 120 | 121 | fn language_server_command( 122 | &mut self, 123 | language_server_id: &zed_extension_api::LanguageServerId, 124 | worktree: &zed_extension_api::Worktree, 125 | ) -> zed_extension_api::Result { 126 | let settings = LspSettings::for_worktree(language_server_id.as_ref(), worktree)?; 127 | 128 | let mut args = vec![]; 129 | 130 | // check and run oxlint with custom binary 131 | if let Some(binary) = settings.binary { 132 | return Ok(zed::Command { 133 | command: binary 134 | .path 135 | .map_or(WORKTREE_SERVER_PATH.to_string(), |path| path), 136 | args: binary.arguments.map_or(args, |args| args), 137 | env: Default::default(), 138 | }); 139 | } 140 | 141 | // try to run oxlint with workspace oxc 142 | if self.workspace_oxc_exists(worktree) { 143 | let server_path = Path::new(worktree.root_path().as_str()) 144 | .join(WORKTREE_SERVER_PATH) 145 | .to_string_lossy() 146 | .to_string(); 147 | let mut node_args = vec![server_path]; 148 | node_args.append(&mut args); 149 | 150 | return Ok(zed::Command { 151 | command: zed::node_binary_path()?, 152 | args: node_args, 153 | env: Default::default(), 154 | }); 155 | } 156 | 157 | // install/update and run oxlint for extension 158 | self.check_oxc_updates(language_server_id)?; 159 | 160 | let mut server_path = PathBuf::from("./node_modules"); 161 | server_path.push(self.binary_specifier()?); 162 | 163 | Ok(zed::Command { 164 | command: server_path.to_string_lossy().to_string(), 165 | args, 166 | env: Default::default(), 167 | }) 168 | } 169 | 170 | fn language_server_workspace_configuration( 171 | &mut self, 172 | language_server_id: &LanguageServerId, 173 | worktree: &zed_extension_api::Worktree, 174 | ) -> Result> { 175 | let settings = LspSettings::for_worktree(language_server_id.as_ref(), worktree)?; 176 | Ok(settings 177 | .initialization_options 178 | .and_then(|data| data.get("options").cloned())) 179 | } 180 | fn language_server_initialization_options( 181 | &mut self, 182 | language_server_id: &LanguageServerId, 183 | worktree: &zed_extension_api::Worktree, 184 | ) -> Result> { 185 | let settings = LspSettings::for_worktree(language_server_id.as_ref(), worktree)?; 186 | Ok(settings.initialization_options) 187 | } 188 | } 189 | 190 | zed_extension_api::register_extension!(OxcExtension); 191 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "adler2" 7 | version = "2.0.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 10 | 11 | [[package]] 12 | name = "anyhow" 13 | version = "1.0.99" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 16 | 17 | [[package]] 18 | name = "auditable-serde" 19 | version = "0.8.0" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5" 22 | dependencies = [ 23 | "semver", 24 | "serde", 25 | "serde_json", 26 | "topological-sort", 27 | ] 28 | 29 | [[package]] 30 | name = "bitflags" 31 | version = "2.9.4" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 34 | 35 | [[package]] 36 | name = "cfg-if" 37 | version = "1.0.3" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 40 | 41 | [[package]] 42 | name = "crc32fast" 43 | version = "1.5.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 46 | dependencies = [ 47 | "cfg-if", 48 | ] 49 | 50 | [[package]] 51 | name = "displaydoc" 52 | version = "0.2.5" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 55 | dependencies = [ 56 | "proc-macro2", 57 | "quote", 58 | "syn", 59 | ] 60 | 61 | [[package]] 62 | name = "equivalent" 63 | version = "1.0.2" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 66 | 67 | [[package]] 68 | name = "flate2" 69 | version = "1.1.2" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 72 | dependencies = [ 73 | "crc32fast", 74 | "miniz_oxide", 75 | ] 76 | 77 | [[package]] 78 | name = "foldhash" 79 | version = "0.1.5" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 82 | 83 | [[package]] 84 | name = "form_urlencoded" 85 | version = "1.2.2" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 88 | dependencies = [ 89 | "percent-encoding", 90 | ] 91 | 92 | [[package]] 93 | name = "futures" 94 | version = "0.3.31" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 97 | dependencies = [ 98 | "futures-channel", 99 | "futures-core", 100 | "futures-executor", 101 | "futures-io", 102 | "futures-sink", 103 | "futures-task", 104 | "futures-util", 105 | ] 106 | 107 | [[package]] 108 | name = "futures-channel" 109 | version = "0.3.31" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 112 | dependencies = [ 113 | "futures-core", 114 | "futures-sink", 115 | ] 116 | 117 | [[package]] 118 | name = "futures-core" 119 | version = "0.3.31" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 122 | 123 | [[package]] 124 | name = "futures-executor" 125 | version = "0.3.31" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 128 | dependencies = [ 129 | "futures-core", 130 | "futures-task", 131 | "futures-util", 132 | ] 133 | 134 | [[package]] 135 | name = "futures-io" 136 | version = "0.3.31" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 139 | 140 | [[package]] 141 | name = "futures-macro" 142 | version = "0.3.31" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 145 | dependencies = [ 146 | "proc-macro2", 147 | "quote", 148 | "syn", 149 | ] 150 | 151 | [[package]] 152 | name = "futures-sink" 153 | version = "0.3.31" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 156 | 157 | [[package]] 158 | name = "futures-task" 159 | version = "0.3.31" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 162 | 163 | [[package]] 164 | name = "futures-util" 165 | version = "0.3.31" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 168 | dependencies = [ 169 | "futures-channel", 170 | "futures-core", 171 | "futures-io", 172 | "futures-macro", 173 | "futures-sink", 174 | "futures-task", 175 | "memchr", 176 | "pin-project-lite", 177 | "pin-utils", 178 | "slab", 179 | ] 180 | 181 | [[package]] 182 | name = "hashbrown" 183 | version = "0.15.5" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 186 | dependencies = [ 187 | "foldhash", 188 | ] 189 | 190 | [[package]] 191 | name = "heck" 192 | version = "0.5.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 195 | 196 | [[package]] 197 | name = "icu_collections" 198 | version = "2.0.0" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 201 | dependencies = [ 202 | "displaydoc", 203 | "potential_utf", 204 | "yoke", 205 | "zerofrom", 206 | "zerovec", 207 | ] 208 | 209 | [[package]] 210 | name = "icu_locale_core" 211 | version = "2.0.0" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 214 | dependencies = [ 215 | "displaydoc", 216 | "litemap", 217 | "tinystr", 218 | "writeable", 219 | "zerovec", 220 | ] 221 | 222 | [[package]] 223 | name = "icu_normalizer" 224 | version = "2.0.0" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 227 | dependencies = [ 228 | "displaydoc", 229 | "icu_collections", 230 | "icu_normalizer_data", 231 | "icu_properties", 232 | "icu_provider", 233 | "smallvec", 234 | "zerovec", 235 | ] 236 | 237 | [[package]] 238 | name = "icu_normalizer_data" 239 | version = "2.0.0" 240 | source = "registry+https://github.com/rust-lang/crates.io-index" 241 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 242 | 243 | [[package]] 244 | name = "icu_properties" 245 | version = "2.0.1" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 248 | dependencies = [ 249 | "displaydoc", 250 | "icu_collections", 251 | "icu_locale_core", 252 | "icu_properties_data", 253 | "icu_provider", 254 | "potential_utf", 255 | "zerotrie", 256 | "zerovec", 257 | ] 258 | 259 | [[package]] 260 | name = "icu_properties_data" 261 | version = "2.0.1" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 264 | 265 | [[package]] 266 | name = "icu_provider" 267 | version = "2.0.0" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 270 | dependencies = [ 271 | "displaydoc", 272 | "icu_locale_core", 273 | "stable_deref_trait", 274 | "tinystr", 275 | "writeable", 276 | "yoke", 277 | "zerofrom", 278 | "zerotrie", 279 | "zerovec", 280 | ] 281 | 282 | [[package]] 283 | name = "id-arena" 284 | version = "2.2.1" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" 287 | 288 | [[package]] 289 | name = "idna" 290 | version = "1.1.0" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 293 | dependencies = [ 294 | "idna_adapter", 295 | "smallvec", 296 | "utf8_iter", 297 | ] 298 | 299 | [[package]] 300 | name = "idna_adapter" 301 | version = "1.2.1" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 304 | dependencies = [ 305 | "icu_normalizer", 306 | "icu_properties", 307 | ] 308 | 309 | [[package]] 310 | name = "indexmap" 311 | version = "2.11.1" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" 314 | dependencies = [ 315 | "equivalent", 316 | "hashbrown", 317 | "serde", 318 | ] 319 | 320 | [[package]] 321 | name = "itoa" 322 | version = "1.0.15" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 325 | 326 | [[package]] 327 | name = "leb128fmt" 328 | version = "0.1.0" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 331 | 332 | [[package]] 333 | name = "litemap" 334 | version = "0.8.0" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 337 | 338 | [[package]] 339 | name = "log" 340 | version = "0.4.28" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 343 | 344 | [[package]] 345 | name = "memchr" 346 | version = "2.7.5" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 349 | 350 | [[package]] 351 | name = "miniz_oxide" 352 | version = "0.8.9" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 355 | dependencies = [ 356 | "adler2", 357 | ] 358 | 359 | [[package]] 360 | name = "once_cell" 361 | version = "1.21.3" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 364 | 365 | [[package]] 366 | name = "percent-encoding" 367 | version = "2.3.2" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 370 | 371 | [[package]] 372 | name = "pin-project-lite" 373 | version = "0.2.16" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 376 | 377 | [[package]] 378 | name = "pin-utils" 379 | version = "0.1.0" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 382 | 383 | [[package]] 384 | name = "potential_utf" 385 | version = "0.1.3" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 388 | dependencies = [ 389 | "zerovec", 390 | ] 391 | 392 | [[package]] 393 | name = "prettyplease" 394 | version = "0.2.37" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 397 | dependencies = [ 398 | "proc-macro2", 399 | "syn", 400 | ] 401 | 402 | [[package]] 403 | name = "proc-macro2" 404 | version = "1.0.101" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 407 | dependencies = [ 408 | "unicode-ident", 409 | ] 410 | 411 | [[package]] 412 | name = "quote" 413 | version = "1.0.40" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 416 | dependencies = [ 417 | "proc-macro2", 418 | ] 419 | 420 | [[package]] 421 | name = "ryu" 422 | version = "1.0.20" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 425 | 426 | [[package]] 427 | name = "semver" 428 | version = "1.0.26" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 431 | dependencies = [ 432 | "serde", 433 | ] 434 | 435 | [[package]] 436 | name = "serde" 437 | version = "1.0.219" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 440 | dependencies = [ 441 | "serde_derive", 442 | ] 443 | 444 | [[package]] 445 | name = "serde_derive" 446 | version = "1.0.219" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 449 | dependencies = [ 450 | "proc-macro2", 451 | "quote", 452 | "syn", 453 | ] 454 | 455 | [[package]] 456 | name = "serde_json" 457 | version = "1.0.143" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" 460 | dependencies = [ 461 | "itoa", 462 | "memchr", 463 | "ryu", 464 | "serde", 465 | ] 466 | 467 | [[package]] 468 | name = "slab" 469 | version = "0.4.11" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 472 | 473 | [[package]] 474 | name = "smallvec" 475 | version = "1.15.1" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 478 | 479 | [[package]] 480 | name = "spdx" 481 | version = "0.10.9" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3" 484 | dependencies = [ 485 | "smallvec", 486 | ] 487 | 488 | [[package]] 489 | name = "stable_deref_trait" 490 | version = "1.2.0" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 493 | 494 | [[package]] 495 | name = "syn" 496 | version = "2.0.106" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 499 | dependencies = [ 500 | "proc-macro2", 501 | "quote", 502 | "unicode-ident", 503 | ] 504 | 505 | [[package]] 506 | name = "synstructure" 507 | version = "0.13.2" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 510 | dependencies = [ 511 | "proc-macro2", 512 | "quote", 513 | "syn", 514 | ] 515 | 516 | [[package]] 517 | name = "tinystr" 518 | version = "0.8.1" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 521 | dependencies = [ 522 | "displaydoc", 523 | "zerovec", 524 | ] 525 | 526 | [[package]] 527 | name = "topological-sort" 528 | version = "0.2.2" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" 531 | 532 | [[package]] 533 | name = "unicode-ident" 534 | version = "1.0.19" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 537 | 538 | [[package]] 539 | name = "unicode-xid" 540 | version = "0.2.6" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 543 | 544 | [[package]] 545 | name = "url" 546 | version = "2.5.7" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 549 | dependencies = [ 550 | "form_urlencoded", 551 | "idna", 552 | "percent-encoding", 553 | "serde", 554 | ] 555 | 556 | [[package]] 557 | name = "utf8_iter" 558 | version = "1.0.4" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 561 | 562 | [[package]] 563 | name = "wasm-encoder" 564 | version = "0.227.1" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822" 567 | dependencies = [ 568 | "leb128fmt", 569 | "wasmparser", 570 | ] 571 | 572 | [[package]] 573 | name = "wasm-metadata" 574 | version = "0.227.1" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d" 577 | dependencies = [ 578 | "anyhow", 579 | "auditable-serde", 580 | "flate2", 581 | "indexmap", 582 | "serde", 583 | "serde_derive", 584 | "serde_json", 585 | "spdx", 586 | "url", 587 | "wasm-encoder", 588 | "wasmparser", 589 | ] 590 | 591 | [[package]] 592 | name = "wasmparser" 593 | version = "0.227.1" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" 596 | dependencies = [ 597 | "bitflags", 598 | "hashbrown", 599 | "indexmap", 600 | "semver", 601 | ] 602 | 603 | [[package]] 604 | name = "wit-bindgen" 605 | version = "0.41.0" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de" 608 | dependencies = [ 609 | "wit-bindgen-rt", 610 | "wit-bindgen-rust-macro", 611 | ] 612 | 613 | [[package]] 614 | name = "wit-bindgen-core" 615 | version = "0.41.0" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b" 618 | dependencies = [ 619 | "anyhow", 620 | "heck", 621 | "wit-parser", 622 | ] 623 | 624 | [[package]] 625 | name = "wit-bindgen-rt" 626 | version = "0.41.0" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621" 629 | dependencies = [ 630 | "bitflags", 631 | "futures", 632 | "once_cell", 633 | ] 634 | 635 | [[package]] 636 | name = "wit-bindgen-rust" 637 | version = "0.41.0" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" 640 | dependencies = [ 641 | "anyhow", 642 | "heck", 643 | "indexmap", 644 | "prettyplease", 645 | "syn", 646 | "wasm-metadata", 647 | "wit-bindgen-core", 648 | "wit-component", 649 | ] 650 | 651 | [[package]] 652 | name = "wit-bindgen-rust-macro" 653 | version = "0.41.0" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799" 656 | dependencies = [ 657 | "anyhow", 658 | "prettyplease", 659 | "proc-macro2", 660 | "quote", 661 | "syn", 662 | "wit-bindgen-core", 663 | "wit-bindgen-rust", 664 | ] 665 | 666 | [[package]] 667 | name = "wit-component" 668 | version = "0.227.1" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" 671 | dependencies = [ 672 | "anyhow", 673 | "bitflags", 674 | "indexmap", 675 | "log", 676 | "serde", 677 | "serde_derive", 678 | "serde_json", 679 | "wasm-encoder", 680 | "wasm-metadata", 681 | "wasmparser", 682 | "wit-parser", 683 | ] 684 | 685 | [[package]] 686 | name = "wit-parser" 687 | version = "0.227.1" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" 690 | dependencies = [ 691 | "anyhow", 692 | "id-arena", 693 | "indexmap", 694 | "log", 695 | "semver", 696 | "serde", 697 | "serde_derive", 698 | "serde_json", 699 | "unicode-xid", 700 | "wasmparser", 701 | ] 702 | 703 | [[package]] 704 | name = "writeable" 705 | version = "0.6.1" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 708 | 709 | [[package]] 710 | name = "yoke" 711 | version = "0.8.0" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 714 | dependencies = [ 715 | "serde", 716 | "stable_deref_trait", 717 | "yoke-derive", 718 | "zerofrom", 719 | ] 720 | 721 | [[package]] 722 | name = "yoke-derive" 723 | version = "0.8.0" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 726 | dependencies = [ 727 | "proc-macro2", 728 | "quote", 729 | "syn", 730 | "synstructure", 731 | ] 732 | 733 | [[package]] 734 | name = "zed-oxc" 735 | version = "0.3.3" 736 | dependencies = [ 737 | "zed_extension_api", 738 | ] 739 | 740 | [[package]] 741 | name = "zed_extension_api" 742 | version = "0.7.0" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "0729d50b4ca0a7e28e590bbe32e3ca0194d97ef654961451a424c661a366fca0" 745 | dependencies = [ 746 | "serde", 747 | "serde_json", 748 | "wit-bindgen", 749 | ] 750 | 751 | [[package]] 752 | name = "zerofrom" 753 | version = "0.1.6" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 756 | dependencies = [ 757 | "zerofrom-derive", 758 | ] 759 | 760 | [[package]] 761 | name = "zerofrom-derive" 762 | version = "0.1.6" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 765 | dependencies = [ 766 | "proc-macro2", 767 | "quote", 768 | "syn", 769 | "synstructure", 770 | ] 771 | 772 | [[package]] 773 | name = "zerotrie" 774 | version = "0.2.2" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 777 | dependencies = [ 778 | "displaydoc", 779 | "yoke", 780 | "zerofrom", 781 | ] 782 | 783 | [[package]] 784 | name = "zerovec" 785 | version = "0.11.4" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 788 | dependencies = [ 789 | "yoke", 790 | "zerofrom", 791 | "zerovec-derive", 792 | ] 793 | 794 | [[package]] 795 | name = "zerovec-derive" 796 | version = "0.11.1" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 799 | dependencies = [ 800 | "proc-macro2", 801 | "quote", 802 | "syn", 803 | ] 804 | --------------------------------------------------------------------------------