2022-06-14 14:37:10 +08:00
"use strict" ;
/ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Copyright ( c ) Microsoft Corporation . All rights reserved .
* Licensed under the MIT License . See License . txt in the project root for license information .
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- * /
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
2024-04-30 20:57:13 +08:00
exports . getBuiltInExtensions = exports . getExtensionStream = void 0 ;
2022-06-14 14:37:10 +08:00
const fs = require ( "fs" ) ;
const path = require ( "path" ) ;
const os = require ( "os" ) ;
const rimraf = require ( "rimraf" ) ;
const es = require ( "event-stream" ) ;
const rename = require ( "gulp-rename" ) ;
const vfs = require ( "vinyl-fs" ) ;
const ext = require ( "./extensions" ) ;
const fancyLog = require ( "fancy-log" ) ;
const ansiColors = require ( "ansi-colors" ) ;
const mkdirp = require ( 'mkdirp' ) ;
const root = path . dirname ( path . dirname ( _ _dirname ) ) ;
const productjson = JSON . parse ( fs . readFileSync ( path . join ( _ _dirname , '../../product.json' ) , 'utf8' ) ) ;
const builtInExtensions = productjson . builtInExtensions || [ ] ;
const webBuiltInExtensions = productjson . webBuiltInExtensions || [ ] ;
2024-05-15 13:57:27 +08:00
const controlFilePath = path . join ( os . homedir ( ) , '.kylin-code-dev' , 'extensions' , 'control.json' ) ;
2022-06-14 14:37:10 +08:00
const ENABLE _LOGGING = ! process . env [ 'VSCODE_BUILD_BUILTIN_EXTENSIONS_SILENCE_PLEASE' ] ;
function log ( ... messages ) {
if ( ENABLE _LOGGING ) {
fancyLog ( ... messages ) ;
}
}
function getExtensionPath ( extension ) {
return path . join ( root , '.build' , 'builtInExtensions' , extension . name ) ;
}
function isUpToDate ( extension ) {
const packagePath = path . join ( getExtensionPath ( extension ) , 'package.json' ) ;
if ( ! fs . existsSync ( packagePath ) ) {
return false ;
}
const packageContents = fs . readFileSync ( packagePath , { encoding : 'utf8' } ) ;
try {
const diskVersion = JSON . parse ( packageContents ) . version ;
return ( diskVersion === extension . version ) ;
}
catch ( err ) {
return false ;
}
}
2024-04-30 20:57:13 +08:00
function getExtensionDownloadStream ( extension ) {
const galleryServiceUrl = productjson . extensionsGallery ? . serviceUrl ;
return ( galleryServiceUrl ? ext . fromMarketplace ( galleryServiceUrl , extension ) : ext . fromGithub ( extension ) )
. pipe ( rename ( p => p . dirname = ` ${ extension . name } / ${ p . dirname } ` ) ) ;
}
function getExtensionStream ( extension ) {
// if the extension exists on disk, use those files instead of downloading anew
if ( isUpToDate ( extension ) ) {
log ( '[extensions]' , ` ${ extension . name } @ ${ extension . version } up to date ` , ansiColors . green ( '✔︎' ) ) ;
return vfs . src ( [ '**' ] , { cwd : getExtensionPath ( extension ) , dot : true } )
. pipe ( rename ( p => p . dirname = ` ${ extension . name } / ${ p . dirname } ` ) ) ;
}
return getExtensionDownloadStream ( extension ) ;
}
exports . getExtensionStream = getExtensionStream ;
2022-06-14 14:37:10 +08:00
function syncMarketplaceExtension ( extension ) {
const galleryServiceUrl = productjson . extensionsGallery ? . serviceUrl ;
const source = ansiColors . blue ( galleryServiceUrl ? '[marketplace]' : '[github]' ) ;
if ( isUpToDate ( extension ) ) {
log ( source , ` ${ extension . name } @ ${ extension . version } ` , ansiColors . green ( '✔︎' ) ) ;
return es . readArray ( [ ] ) ;
}
rimraf . sync ( getExtensionPath ( extension ) ) ;
2024-04-30 20:57:13 +08:00
return getExtensionDownloadStream ( extension )
2022-06-14 14:37:10 +08:00
. pipe ( vfs . dest ( '.build/builtInExtensions' ) )
. on ( 'end' , ( ) => log ( source , extension . name , ansiColors . green ( '✔︎' ) ) ) ;
}
function syncExtension ( extension , controlState ) {
if ( extension . platforms ) {
const platforms = new Set ( extension . platforms ) ;
if ( ! platforms . has ( process . platform ) ) {
log ( ansiColors . gray ( '[skip]' ) , ` ${ extension . name } @ ${ extension . version } : Platform ' ${ process . platform } ' not supported: [ ${ extension . platforms } ] ` , ansiColors . green ( '✔︎' ) ) ;
return es . readArray ( [ ] ) ;
}
}
switch ( controlState ) {
case 'disabled' :
log ( ansiColors . blue ( '[disabled]' ) , ansiColors . gray ( extension . name ) ) ;
return es . readArray ( [ ] ) ;
case 'marketplace' :
return syncMarketplaceExtension ( extension ) ;
default :
if ( ! fs . existsSync ( controlState ) ) {
log ( ansiColors . red ( ` Error: Built-in extension ' ${ extension . name } ' is configured to run from ' ${ controlState } ' but that path does not exist. ` ) ) ;
return es . readArray ( [ ] ) ;
}
else if ( ! fs . existsSync ( path . join ( controlState , 'package.json' ) ) ) {
log ( ansiColors . red ( ` Error: Built-in extension ' ${ extension . name } ' is configured to run from ' ${ controlState } ' but there is no 'package.json' file in that directory. ` ) ) ;
return es . readArray ( [ ] ) ;
}
log ( ansiColors . blue ( '[local]' ) , ` ${ extension . name } : ${ ansiColors . cyan ( controlState ) } ` , ansiColors . green ( '✔︎' ) ) ;
return es . readArray ( [ ] ) ;
}
}
function readControlFile ( ) {
try {
return JSON . parse ( fs . readFileSync ( controlFilePath , 'utf8' ) ) ;
}
catch ( err ) {
return { } ;
}
}
function writeControlFile ( control ) {
mkdirp . sync ( path . dirname ( controlFilePath ) ) ;
fs . writeFileSync ( controlFilePath , JSON . stringify ( control , null , 2 ) ) ;
}
function getBuiltInExtensions ( ) {
log ( 'Synchronizing built-in extensions...' ) ;
log ( ` You can manage built-in extensions with the ${ ansiColors . cyan ( '--builtin' ) } flag ` ) ;
const control = readControlFile ( ) ;
const streams = [ ] ;
for ( const extension of [ ... builtInExtensions , ... webBuiltInExtensions ] ) {
2024-04-30 20:57:13 +08:00
const controlState = control [ extension . name ] || 'marketplace' ;
2022-06-14 14:37:10 +08:00
control [ extension . name ] = controlState ;
streams . push ( syncExtension ( extension , controlState ) ) ;
}
writeControlFile ( control ) ;
return new Promise ( ( resolve , reject ) => {
es . merge ( streams )
. on ( 'error' , reject )
. on ( 'end' , resolve ) ;
} ) ;
}
exports . getBuiltInExtensions = getBuiltInExtensions ;
if ( require . main === module ) {
getBuiltInExtensions ( ) . then ( ( ) => process . exit ( 0 ) ) . catch ( err => {
console . error ( err ) ;
process . exit ( 1 ) ;
} ) ;
}
2024-05-10 15:40:21 +08:00
//# sourceMappingURL=builtInExtensions.js.map