@@ -106,7 +106,59 @@ if ($autoChoice) {
106106 }
107107}
108108
109- Write-Host " `n Fetching latest version info..."
109+ $global :activeSpinner = $null
110+
111+ function Start-Spinner {
112+ param ([string ]$Message )
113+ Write-Host - NoNewline " $Message "
114+ try { [Console ]::CursorVisible = $false } catch {}
115+
116+ $runspace = [runspacefactory ]::CreateRunspace()
117+ $runspace.Open ()
118+ $ps = [powershell ]::Create()
119+ $ps.Runspace = $runspace
120+ $ps.AddScript ({
121+ $spinner = @ (' -' , ' \' , ' |' , ' /' )
122+ $i = 0
123+ while ($true ) {
124+ try { [Console ]::Write(" `r $ ( $spinner [$i % 4 ]) " ) } catch {}
125+ $i ++
126+ Start-Sleep - Milliseconds 100
127+ }
128+ }) | Out-Null
129+ $asyncResult = $ps.BeginInvoke ()
130+ $spinnerObj = @ { PS = $ps ; Runspace = $runspace ; Message = $Message }
131+ $global :activeSpinner = $spinnerObj
132+ return $spinnerObj
133+ }
134+
135+ function Stop-Spinner {
136+ param ($spinnerObj , [bool ]$Success = $true )
137+ if ($global :activeSpinner -and $spinnerObj -and $global :activeSpinner.PS -eq $spinnerObj.PS ) {
138+ $global :activeSpinner = $null
139+ }
140+ $msg = if ($spinnerObj.Message ) { $spinnerObj.Message } else { " " }
141+ if ($spinnerObj ) {
142+ try { $spinnerObj.PS.Stop () } catch {}
143+ try { $spinnerObj.PS.Dispose () } catch {}
144+ try { $spinnerObj.Runspace.Close () } catch {}
145+ try { $spinnerObj.Runspace.Dispose () } catch {}
146+ }
147+ try { [Console ]::CursorVisible = $true } catch {}
148+
149+ if ($Success ) {
150+ Write-Host " `r $ ( [char ]0x2714 ) " - ForegroundColor Green - NoNewline
151+ Write-Host $msg
152+ } else {
153+ Write-Host " `r $ ( [char ]0x2718 ) " - ForegroundColor Red - NoNewline
154+ Write-Host $msg
155+ }
156+ }
157+
158+ Write-Host " "
159+
160+ try {
161+
110162$page = 1
111163$latestTag = $null
112164
@@ -130,18 +182,30 @@ if (!$latestTag) {
130182 exit 1
131183}
132184
133- Write-Host " The latest is $ ( $latestTag.name -replace ' -vscode$' , ' ' ) "
134185$zipUrl = $latestTag.zipball_url
135186
136187$tmpDir = Join-Path $env: TEMP (" CWC_Install_" + [Guid ]::NewGuid().ToString().Substring(0 , 8 ))
137188New-Item - ItemType Directory - Path $tmpDir | Out-Null
138189
139190$zipPath = Join-Path $tmpDir " source.zip"
140- Write-Host " Downloading source code..."
141- Invoke-WebRequest - Uri $zipUrl - OutFile $zipPath - UseBasicParsing
191+ $spinner = Start-Spinner " Downloading source code..."
192+ try {
193+ Invoke-WebRequest - Uri $zipUrl - OutFile $zipPath - UseBasicParsing
194+ Stop-Spinner $spinner $true
195+ } catch {
196+ Stop-Spinner $spinner $false
197+ Write-Host " Error: Download failed." - ForegroundColor Red
198+ Pause
199+ exit 1
200+ }
142201
143- Write-Host " Extracting archive..."
144- Expand-Archive - Path $zipPath - DestinationPath $tmpDir - Force
202+ try {
203+ Expand-Archive - Path $zipPath - DestinationPath $tmpDir - Force
204+ } catch {
205+ Write-Host " Error: Extraction failed." - ForegroundColor Red
206+ Pause
207+ exit 1
208+ }
145209
146210$extractedDir = Get-ChildItem - Path $tmpDir - Directory | Select-Object - First 1
147211
@@ -153,14 +217,31 @@ if (!$extractedDir) {
153217
154218Push-Location $extractedDir.FullName
155219
156- Write-Host " Installing dependencies..."
220+ $spinner = Start-Spinner " Installing dependencies..."
157221$ErrorActionPreference = " Continue"
158222npx.cmd -- yes pnpm install * > $null
223+ $cmdSuccess = $?
224+ Stop-Spinner $spinner $cmdSuccess
159225
160- Write-Host " Building extension..."
226+ if (! $cmdSuccess ) {
227+ Write-Host " Error: Failed to install dependencies." - ForegroundColor Red
228+ Pause
229+ exit 1
230+ }
231+
232+ $spinner = Start-Spinner " Building extension..."
161233Set-Location apps/ editor
162234npx.cmd -- yes pnpm run build * > $null
235+ $cmdSuccess = $?
163236$ErrorActionPreference = " Stop"
237+ Stop-Spinner $spinner $cmdSuccess
238+
239+ if (! $cmdSuccess ) {
240+ Write-Host " Error: Build failed." - ForegroundColor Red
241+ Pop-Location
242+ Pause
243+ exit 1
244+ }
164245
165246$vsixFile = Get-ChildItem * .vsix | Select-Object - First 1
166247
@@ -174,14 +255,23 @@ if (!$vsixFile) {
174255function Install-ToEditor ($idx ) {
175256 $editorName = $availableEditors [$idx ]
176257 $editorCmd = $editorCmds [$idx ]
258+
259+ $spinner = Start-Spinner " Installing to $editorName ..."
177260 $ErrorActionPreference = " Continue"
178261 & $editorCmd -- install-extension $vsixFile.FullName -- force * > $null
262+ $cmdSuccess = $?
179263 $ErrorActionPreference = " Stop"
180264
181- if ($targetScheme ) {
182- Write-Host " Updated successfully! Please reload the window or restart the editor for changes to take effect."
265+ Stop-Spinner $spinner $cmdSuccess
266+
267+ if ($cmdSuccess ) {
268+ if ($targetScheme ) {
269+ Write-Host " Updated successfully! Please reload the window or restart the editor for changes to take effect."
270+ } else {
271+ Write-Host " Successfully installed to $editorName !"
272+ }
183273 } else {
184- Write-Host " Successfully installed to $editorName ! "
274+ Write-Host " Error: Failed to install to $editorName . " - ForegroundColor Red
185275 }
186276}
187277
@@ -194,6 +284,13 @@ if ($choice -eq 'a' -or $choice -eq 'A') {
194284 Install-ToEditor ([int ]$choice - 1 )
195285}
196286
287+ } finally {
288+ if ($global :activeSpinner ) {
289+ Stop-Spinner $global :activeSpinner $false
290+ }
291+ try { [Console ]::CursorVisible = $true } catch {}
292+ }
293+
197294Pause
198295Pop-Location
199296Start-Process - FilePath " cmd.exe" - ArgumentList " /c" , " rmdir" , " /s" , " /q" , " `" $tmpDir `" " - WindowStyle Hidden
0 commit comments