@@ -7,7 +7,12 @@ import { mkdir, rm } from "node:fs/promises";
7
7
import { type Stats , existsSync } from "node:fs" ;
8
8
import { spawn } from "node:child_process" ;
9
9
import { get } from "node:https" ;
10
- import { LanguageClient , LanguageClientOptions , RevealOutputChannelOn , ServerOptions } from "vscode-languageclient/node" ;
10
+ import {
11
+ LanguageClient ,
12
+ LanguageClientOptions ,
13
+ RevealOutputChannelOn ,
14
+ ServerOptions ,
15
+ } from "vscode-languageclient/node" ;
11
16
import { registerXmlFileAssociations , registerXPathSemanticTokensProvider } from "./xml" ;
12
17
import {
13
18
$ ,
@@ -175,71 +180,77 @@ async function downloadLspBinary(context: vscode.ExtensionContext) {
175
180
}
176
181
177
182
async function latestReleaseInfo ( includeStable : boolean , fallback ?: string ) {
178
- return ( await new Promise < string | undefined > ( resolve =>
179
- get (
180
- "https://api.github.com/repos/Desdaemon/odoo-lsp/releases?per_page=5" ,
181
- {
182
- headers : {
183
- accept : "application/vnd.github+json" ,
184
- "user-agent" : "vscode-odoo-lsp" ,
183
+ return (
184
+ ( await new Promise < string | undefined > ( ( resolve ) =>
185
+ get (
186
+ "https://api.github.com/repos/Desdaemon/odoo-lsp/releases?per_page=5" ,
187
+ {
188
+ headers : {
189
+ accept : "application/vnd.github+json" ,
190
+ "user-agent" : "vscode-odoo-lsp" ,
191
+ } ,
185
192
} ,
186
- } ,
187
- ( resp ) => {
188
- const chunks : Buffer [ ] = [ ] ;
189
- resp . on ( "data" , chunks . push . bind ( chunks ) ) . on ( "end" , ( ) => {
190
- try {
191
- const releases : { tag_name : string ; name : string , published_at : string } [ ] = JSON . parse ( Buffer . concat ( chunks ) . toString ( ) ) ;
192
- const today = new Date ( ) ;
193
- releases . sort ( ( a , z ) => z . published_at . localeCompare ( a . published_at ) ) ;
194
- const latest = releases . find ( ( r ) => ( includeStable || r . name === "nightly" ) && compareDate ( today , new Date ( r . published_at ) ) >= 0 ) ;
195
- resolve ( latest ?. tag_name || fallback ) ;
196
- } catch ( err ) {
197
- vscode . window . showErrorMessage ( `Unable to fetch nightly release: ${ err } ` ) ;
198
- resolve ( fallback ) ;
199
- }
200
- } ) ;
201
- } ,
202
- ) ,
203
- ) ) || fallback ;
193
+ ( resp ) => {
194
+ const chunks : Buffer [ ] = [ ] ;
195
+ resp . on ( "data" , chunks . push . bind ( chunks ) ) . on ( "end" , ( ) => {
196
+ try {
197
+ const releases : { tag_name : string ; name : string ; published_at : string } [ ] = JSON . parse (
198
+ Buffer . concat ( chunks ) . toString ( ) ,
199
+ ) ;
200
+ const today = new Date ( ) ;
201
+ releases . sort ( ( a , z ) => z . published_at . localeCompare ( a . published_at ) ) ;
202
+ const latest = releases . find (
203
+ ( r ) => ( includeStable || r . name === "nightly" ) && compareDate ( today , new Date ( r . published_at ) ) >= 0 ,
204
+ ) ;
205
+ resolve ( latest ?. tag_name || fallback ) ;
206
+ } catch ( err ) {
207
+ vscode . window . showErrorMessage ( `Unable to fetch nightly release: ${ err } ` ) ;
208
+ resolve ( fallback ) ;
209
+ }
210
+ } ) ;
211
+ } ,
212
+ ) ,
213
+ ) ) || fallback
214
+ ) ;
204
215
}
205
216
206
217
function updateExtension ( context : vscode . ExtensionContext , release : string ) {
207
218
const runtimeDir = context . globalStorageUri . fsPath ;
208
219
const vsixLink = `${ repo } /releases/download/${ release } /odoo-lsp-${ context . extension . packageJSON . version } .vsix` ;
209
220
const vsixOutput = `${ runtimeDir } /odoo-lsp.vsix` ;
210
- downloadFile ( vsixLink , vsixOutput ) . then ( async ( ) => {
211
- const resp =
212
- extensionState . nightlyExtensionUpdates === "always"
213
- ? "Yes"
214
- : await vscode . window . showInformationMessage (
215
- "A new nightly update for the extension is available. Install?" ,
216
- "Yes" ,
217
- "No" ,
218
- "Always" ,
219
- "Never show again" ,
220
- ) ;
221
- if ( resp === "Always" ) extensionState . nightlyExtensionUpdates = "always" ;
222
- else if ( resp === "Never show again" ) extensionState . nightlyExtensionUpdates = "never" ;
223
-
224
- if ( resp === "Yes" || resp === "Always" ) {
225
- try {
226
- await vscode . commands . executeCommand (
227
- "workbench.extensions.installExtension" ,
228
- vscode . Uri . file ( vsixOutput ) ,
229
- ) ;
230
- } catch ( err ) {
231
- vscode . window . showErrorMessage ( `Failed to update extension: ${ err } ` ) ;
232
- return ;
221
+ downloadFile ( vsixLink , vsixOutput ) . then (
222
+ async ( ) => {
223
+ const resp =
224
+ extensionState . nightlyExtensionUpdates === "always"
225
+ ? "Yes"
226
+ : await vscode . window . showInformationMessage (
227
+ "A new nightly update for the extension is available. Install?" ,
228
+ "Yes" ,
229
+ "No" ,
230
+ "Always" ,
231
+ "Never show again" ,
232
+ ) ;
233
+ if ( resp === "Always" ) extensionState . nightlyExtensionUpdates = "always" ;
234
+ else if ( resp === "Never show again" ) extensionState . nightlyExtensionUpdates = "never" ;
235
+
236
+ if ( resp === "Yes" || resp === "Always" ) {
237
+ try {
238
+ await vscode . commands . executeCommand ( "workbench.extensions.installExtension" , vscode . Uri . file ( vsixOutput ) ) ;
239
+ } catch ( err ) {
240
+ vscode . window . showErrorMessage ( `Failed to update extension: ${ err } ` ) ;
241
+ return ;
242
+ }
243
+ vscode . window
244
+ . showInformationMessage ( `Extension updated to ${ release } . Reload to apply changes.` , "Reload now" , "Later" )
245
+ . then ( ( resp ) => {
246
+ if ( resp === "Reload now" ) vscode . commands . executeCommand ( "workbench.action.reloadWindow" ) ;
247
+ } ) ;
233
248
}
234
- vscode . window
235
- . showInformationMessage ( `Extension updated to ${ release } . Reload to apply changes.` , "Reload now" , "Later" )
236
- . then ( ( resp ) => {
237
- if ( resp === "Reload now" ) vscode . commands . executeCommand ( "workbench.action.reloadWindow" ) ;
238
- } ) ;
239
- }
240
- } , reason => {
241
- vscode . window . showErrorMessage ( `Failed to download extension update: ${ reason } ` ) ;
242
- } )
249
+ } ,
250
+ ( reason ) => {
251
+ vscode . window . showErrorMessage ( `Failed to download extension update: ${ reason } ` ) ;
252
+ } ,
253
+ ) ;
243
254
}
244
255
245
256
const makeExtensionState = ( context : vscode . ExtensionContext ) =>
@@ -274,17 +285,19 @@ export async function activate(context: vscode.ExtensionContext) {
274
285
const runtimeDir = context . globalStorageUri . fsPath ;
275
286
let latestRelease : string | undefined ;
276
287
let vsixStat : Stats | null ;
277
- if ( preferNightly
278
- && command === "odoo-lsp"
279
- && ( latestRelease = await latestReleaseInfo ( false ) )
280
- && latestRelease . startsWith ( 'nightly-' )
281
- && ( ! ( vsixStat = tryStatSync ( `${ runtimeDir } /odoo-lsp.vsix` ) )
282
- || compareDate ( vsixStat . ctime , parseNightly ( latestRelease ) ) < 0 ) ) {
288
+ if (
289
+ preferNightly &&
290
+ command === "odoo-lsp" &&
291
+ ( latestRelease = await latestReleaseInfo ( false ) ) &&
292
+ latestRelease . startsWith ( "nightly-" ) &&
293
+ ( ! ( vsixStat = tryStatSync ( `${ runtimeDir } /odoo-lsp.vsix` ) ) ||
294
+ compareDate ( vsixStat . ctime , parseNightly ( latestRelease ) ) < 0 )
295
+ ) {
283
296
updateExtension ( context , latestRelease ) ;
284
297
}
285
298
286
299
const logLevel = vscode . workspace . getConfiguration ( "odoo-lsp.trace" ) . get ( "binary" ) ;
287
- const RUST_LOG_STYLE = ' never'
300
+ const RUST_LOG_STYLE = " never" ;
288
301
const serverOptions : ServerOptions = {
289
302
run : {
290
303
command,
@@ -305,27 +318,36 @@ export async function activate(context: vscode.ExtensionContext) {
305
318
const splitPattern = / ^ \[ / gm;
306
319
307
320
const oldAppend = binaryOutputChannel . append . bind ( binaryOutputChannel ) ;
308
- binaryOutputChannel . append = ( function ( this : vscode . LogOutputChannel , lines : string ) {
321
+ binaryOutputChannel . append = function ( this : vscode . LogOutputChannel , lines : string ) {
309
322
if ( ! lines ) return ;
310
-
323
+
311
324
for ( const line of lines . split ( splitPattern ) ) {
312
325
const match = logPattern . exec ( line ) ;
313
326
if ( match ) {
314
327
const rest = line . substring ( match [ 0 ] . length ) . trimEnd ( ) ;
315
328
const target = match [ 2 ] ! . trimStart ( ) ;
316
- switch ( match [ 1 ] ) {
317
- case 'INFO' : this . info ( `[${ target } ]${ rest } ` ) ; break ;
318
- case 'WARN' : this . warn ( `[${ target } ]${ rest } ` ) ; break ;
319
- case 'ERROR' : this . error ( `[${ target } ]${ rest } ` ) ; break ;
320
- case 'DEBUG' : this . debug ( `[${ target } ]${ rest } ` ) ; break ;
321
- case 'TRACE' : this . trace ( `[${ target } ]${ rest } ` ) ; break ;
329
+ switch ( match [ 1 ] ) {
330
+ case "INFO" :
331
+ this . info ( `[${ target } ]${ rest } ` ) ;
332
+ break ;
333
+ case "WARN" :
334
+ this . warn ( `[${ target } ]${ rest } ` ) ;
335
+ break ;
336
+ case "ERROR" :
337
+ this . error ( `[${ target } ]${ rest } ` ) ;
338
+ break ;
339
+ case "DEBUG" :
340
+ this . debug ( `[${ target } ]${ rest } ` ) ;
341
+ break ;
342
+ case "TRACE" :
343
+ this . trace ( `[${ target } ]${ rest } ` ) ;
344
+ break ;
322
345
}
323
346
continue ;
324
347
}
325
348
if ( line . trim ( ) ) oldAppend ( line ) ;
326
349
}
327
-
328
- } ) . bind ( binaryOutputChannel ) ;
350
+ } . bind ( binaryOutputChannel ) ;
329
351
330
352
const clientOptions = {
331
353
documentSelector : [
0 commit comments