@@ -413,7 +413,7 @@ async function getLatestStableVersion(updateUrl) {
413413 const { name : version } = await res . json ( ) ;
414414 return version ;
415415}
416- async function getNLS ( resourceUrlTemplate , languageId , version ) {
416+ async function getSpecificNLS ( resourceUrlTemplate , languageId , version ) {
417417 const resource = {
418418 publisher : 'ms-ceintl' ,
419419 name : `vscode-language-pack-${ languageId } ` ,
@@ -422,9 +422,30 @@ async function getNLS(resourceUrlTemplate, languageId, version) {
422422 } ;
423423 const url = resourceUrlTemplate . replace ( / \{ ( [ ^ } ] + ) \} / g, ( _ , key ) => resource [ key ] ) ;
424424 const res = await ( 0 , node_fetch_1 . default ) ( url ) ;
425+ if ( res . status !== 200 ) {
426+ throw new Error ( `[${ res . status } ] Error downloading language pack ${ languageId } @${ version } ` ) ;
427+ }
425428 const { contents : result } = await res . json ( ) ;
426429 return result ;
427430}
431+ function previousVersion ( version ) {
432+ const [ , major , minor , patch ] = / ^ ( \d + ) \. ( \d + ) \. ( \d + ) $ / . exec ( version ) ;
433+ return `${ major } .${ parseInt ( minor ) - 1 } .${ patch } ` ;
434+ }
435+ async function getNLS ( resourceUrlTemplate , languageId , version ) {
436+ try {
437+ return await getSpecificNLS ( resourceUrlTemplate , languageId , version ) ;
438+ }
439+ catch ( err ) {
440+ if ( / \[ 4 0 4 \] / . test ( err . message ) ) {
441+ console . warn ( `Language pack ${ languageId } @${ version } is missing. Downloading previous version...` ) ;
442+ return await getSpecificNLS ( resourceUrlTemplate , languageId , previousVersion ( version ) ) ;
443+ }
444+ else {
445+ throw err ;
446+ }
447+ }
448+ }
428449async function parsePolicies ( ) {
429450 const parser = new Parser ( ) ;
430451 parser . setLanguage ( typescript ) ;
0 commit comments