@@ -24,31 +24,31 @@ export function activate(context: vscode.ExtensionContext) {
2424      provideTerminalProfile ( 
2525        token : vscode . CancellationToken 
2626      ) : vscode . ProviderResult < vscode . TerminalProfile >  { 
27+         const  which  =  require ( "which" ) ; 
2728        const  path  =  require ( "path" ) ; 
28-         const  fs  =  require ( "fs" ) ; 
29-         const  glob  =  require ( "glob" ) ; 
30-         const  os  =  require ( "os" ) ; 
3129
30+         const  PATH_FROM_ENV  =  process . env [ "PATH" ] ; 
3231        const  pathsToCheck  =  [ 
32+           PATH_FROM_ENV , 
3333          // cargo install location 
34-           "~/.cargo/bin/nu" , 
35-           "~/.cargo/bin/nu.exe" , 
34+           ( process . env [ "CARGO_HOME" ]  ||  "~/.cargo" )  +  "/bin" , 
3635
3736          // winget on Windows install location 
38-           "c:\\program files\\nu\\bin\\nu.exe " , 
37+           "c:\\program files\\nu\\bin" , 
3938          // just add a few other drives for fun 
40-           "d:\\program files\\nu\\bin\\nu.exe " , 
41-           "e:\\program files\\nu\\bin\\nu.exe " , 
42-           "f:\\program files\\nu\\bin\\nu.exe " , 
39+           "d:\\program files\\nu\\bin" , 
40+           "e:\\program files\\nu\\bin" , 
41+           "f:\\program files\\nu\\bin" , 
4342
4443          // SCOOP:TODO 
4544          // all user installed programs and scoop itself install to 
4645          // c:\users\<user>\scoop\ unless SCOOP env var is set 
4746          // globally installed programs go in 
4847          // c:\programdata\scoop unless SCOOP_GLOBAL env var is set 
4948          // scoop install location 
50-           "~/scoop/apps/nu/*/nu.exe" , 
51-           "~/scoop/shims/nu.exe" , 
49+           // SCOOP should already set up the correct `PATH` env var 
50+           //"~/scoop/apps/nu/*/nu.exe", 
51+           //"~/scoop/shims/nu.exe", 
5252
5353          // chocolatey install location - same as winget 
5454          // 'c:\\program files\\nu\\bin\\nu.exe', 
@@ -60,59 +60,57 @@ export function activate(context: vscode.ExtensionContext) {
6060
6161          // brew install location mac 
6262          // intel 
63-           "/usr/local/bin/nu " , 
63+           "/usr/local/bin" , 
6464          // arm 
65-           "/opt/homebrew/bin/nu " , 
65+           "/opt/homebrew/bin" , 
6666
6767          // native package manager install location 
68-           "/usr/bin/nu" , 
68+           // standard location should be in `PATH` env var 
69+           //"/usr/bin/nu", 
6970        ] ; 
7071
71-         let  found_nushell_path  =  "" ; 
72-         const  home  =  os . homedir ( ) ; 
73- 
74-         for  ( const  cur_val  of  pathsToCheck )  { 
75-           // console.log("Inspecting location: " + cur_val); 
76-           let  constructed_file  =  "" ; 
77-           if  ( cur_val . startsWith ( "~/scoop" ) )  { 
78-             // console.log("Found scoop: " + cur_val); 
79-             const  p  =  path . join ( home ,  cur_val . slice ( 1 ) ) ; 
80-             // console.log("Expanded ~: " + p); 
81-             const  file  =  glob . sync ( p ,  "debug" ) . toString ( ) ; 
82-             // console.log("Glob for files: " + file); 
83- 
84-             if  ( file )  { 
85-               // console.log("Found some file: " + file); 
86-               // if there are slashes, reverse them to back slashes 
87-               constructed_file  =  file . replace ( / \/ / g,  "\\" ) ; 
72+         const  found_nushell_path  =  which . sync ( "nu" ,  { 
73+           nothrow : true , 
74+           path : pathsToCheck . join ( path . delimiter ) , 
75+         } ) ; 
76+ 
77+         if  ( found_nushell_path  ==  null )  { 
78+           console . log ( 
79+             "Nushell not found in env:PATH or any of the heuristic locations." 
80+           ) ; 
81+           // use an async arrow funciton to use `await` inside 
82+           return  ( async  ( )  =>  { 
83+             if  ( 
84+               ( await  vscode . window . showErrorMessage ( 
85+                 "We cannot find a nushell executable in your path or pre-defined locations" , 
86+                 "install from website" 
87+               ) )  && 
88+               ( await  vscode . env . openExternal ( 
89+                 vscode . Uri . parse ( "https://www.nushell.sh/" ) 
90+               ) )  && 
91+               ( await  vscode . window . showInformationMessage ( 
92+                 "after you install nushell, you might need to reload vscode" , 
93+                 "reload now" 
94+               ) ) 
95+             )  { 
96+               vscode . commands . executeCommand ( "workbench.action.reloadWindow" ) ; 
8897            } 
89-           }  else  if  ( cur_val . startsWith ( "~" ) )  { 
90-             constructed_file  =  path . join ( home ,  cur_val . slice ( 1 ) ) ; 
91-             // console.log("Found ~, constructing path: " + constructed_file); 
92-           }  else  { 
93-             constructed_file  =  cur_val ; 
94-           } 
95- 
96-           if  ( fs . existsSync ( constructed_file ) )  { 
97-             // console.log("File exists, returning: " + constructed_file); 
98-             found_nushell_path  =  constructed_file ; 
99-             break ; 
100-           }  else  { 
101-             // console.log("File not found: " + constructed_file); 
102-           } 
98+             // user has already seen error messages, but they didn't click through 
99+             // return a promise that never resolve to supress the confusing error 
100+             return  await  new  Promise ( ( )  =>  undefined ) ; 
101+           } ) ( ) ; 
103102        } 
104103
105-         if  ( found_nushell_path . length  >  0 )  { 
106-           return  { 
107-             options : { 
108-               name : "Nushell" , 
109-               shellPath : found_nushell_path , 
110-             } , 
111-           } ; 
112-         }  else  { 
113-           console . log ( "Nushell not found, returning undefined" ) ; 
114-           return  undefined ; 
115-         } 
104+         return  { 
105+           options : { 
106+             name : "Nushell" , 
107+             shellPath : found_nushell_path , 
108+             iconPath : vscode . Uri . joinPath ( 
109+               context . extensionUri , 
110+               "assets/nu.svg" 
111+             ) , 
112+           } , 
113+         } ; 
116114      } , 
117115    } ) 
118116  ) ; 
0 commit comments