11use std:: collections:: HashMap ;
2+ use std:: path:: PathBuf ;
23use std:: { env, fs} ;
34
45use serde:: Deserialize ;
@@ -23,26 +24,53 @@ struct PackageJson {
2324 dev_dependencies : HashMap < String , String > ,
2425}
2526
27+ #[ derive( Debug , Deserialize ) ]
28+ struct Settings {
29+ #[ serde( default ) ]
30+ server_path : String ,
31+ #[ serde( default ) ]
32+ package_json_path : String ,
33+ }
34+
2635struct VueExtension {
2736 did_find_server : bool ,
37+ settings : Settings ,
2838}
2939
3040impl VueExtension {
3141 fn server_exists ( & self ) -> bool {
32- fs:: metadata ( SERVER_PATH ) . map_or ( false , |stat| stat. is_file ( ) )
42+ log:: info!(
43+ "[vue] settings || server = {} pkg = {}" ,
44+ self . settings. server_path,
45+ self . settings. package_json_path
46+ ) ;
47+ fs:: metadata ( self . settings . server_path . as_str ( ) ) . map_or ( false , |stat| stat. is_file ( ) )
3348 }
3449
3550 fn server_script_path (
3651 & mut self ,
3752 language_server_id : & zed:: LanguageServerId ,
3853 worktree : & zed:: Worktree ,
3954 ) -> Result < String > {
40- let server_exists = self . server_exists ( ) ;
55+ let mut server_exists = self . server_exists ( ) ;
4156 if self . did_find_server && server_exists {
4257 self . install_typescript_if_needed ( worktree) ?;
4358 self . install_ts_plugin_if_needed ( ) ?;
44- return Ok ( SERVER_PATH . to_string ( ) ) ;
59+ return Ok ( self . settings . server_path . to_string ( ) ) ;
4560 }
61+ let lsp_settings = LspSettings :: for_worktree ( "vue" , worktree)
62+ . ok ( )
63+ . and_then ( |settings| settings. settings )
64+ . unwrap_or_else ( || json ! ( { } ) ) ;
65+ self . settings = serde_json:: from_value ( lsp_settings) . unwrap_or ( Settings {
66+ server_path : SERVER_PATH . to_string ( ) ,
67+ package_json_path : "." . to_string ( ) ,
68+ } ) ;
69+ println ! (
70+ "settings ! server = {} ; pkg = {}" ,
71+ self . settings. server_path, self . settings. package_json_path
72+ ) ;
73+ server_exists = self . server_exists ( ) ;
4674
4775 zed:: set_language_server_installation_status (
4876 language_server_id,
@@ -59,24 +87,18 @@ impl VueExtension {
5987 ) ;
6088 let result = zed:: npm_install_package ( PACKAGE_NAME , & version) ;
6189 match result {
62- Ok ( ( ) ) => {
63- if !self . server_exists ( ) {
64- Err ( format ! (
65- "installed package '{PACKAGE_NAME}' did not contain expected path '{SERVER_PATH}'" ,
66- ) ) ?;
67- }
68- }
6990 Err ( error) => {
7091 if !self . server_exists ( ) {
7192 Err ( error) ?;
7293 }
7394 }
95+ _ => { }
7496 }
7597 }
7698
7799 self . install_typescript_if_needed ( worktree) ?;
78100 self . did_find_server = true ;
79- Ok ( SERVER_PATH . to_string ( ) )
101+ Ok ( self . settings . server_path . to_string ( ) )
80102 }
81103
82104 /// Returns whether a local copy of TypeScript exists in the worktree.
@@ -132,7 +154,9 @@ impl VueExtension {
132154 }
133155
134156 fn get_ts_plugin_root_path ( & self , worktree : & zed:: Worktree ) -> Result < Option < String > > {
135- let package_json = worktree. read_text_file ( "package.json" ) ?;
157+ let pbuf = PathBuf :: from ( self . settings . package_json_path . to_string ( ) ) . join ( "package.json" ) ;
158+
159+ let package_json = worktree. read_text_file ( pbuf. to_string_lossy ( ) . to_string ( ) . as_str ( ) ) ?;
136160 let package_json: PackageJson = serde_json:: from_str ( & package_json)
137161 . map_err ( |err| format ! ( "failed to parse package.json: {err}" ) ) ?;
138162
@@ -159,6 +183,10 @@ impl zed::Extension for VueExtension {
159183 fn new ( ) -> Self {
160184 Self {
161185 did_find_server : false ,
186+ settings : Settings {
187+ server_path : SERVER_PATH . to_string ( ) ,
188+ package_json_path : "." . to_string ( ) ,
189+ } ,
162190 }
163191 }
164192
@@ -171,8 +199,7 @@ impl zed::Extension for VueExtension {
171199 Ok ( zed:: Command {
172200 command : zed:: node_binary_path ( ) ?,
173201 args : vec ! [
174- env:: current_dir( )
175- . unwrap( )
202+ PathBuf :: from( worktree. root_path( ) )
176203 . join( & server_path)
177204 . to_string_lossy( )
178205 . to_string( ) ,
0 commit comments