vscode/build/lib/builtInExtensions.js

123 lines
3.8 KiB
JavaScript
Raw Normal View History

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
const fs = require('fs');
const path = require('path');
2018-01-29 16:15:22 +00:00
const os = require('os');
2018-01-29 11:23:43 +00:00
const mkdirp = require('mkdirp');
const rimraf = require('rimraf');
const es = require('event-stream');
const rename = require('gulp-rename');
const vfs = require('vinyl-fs');
const ext = require('./extensions');
2019-02-05 21:21:05 +00:00
const fancyLog = require('fancy-log');
const ansiColors = require('ansi-colors');
2018-01-29 11:23:43 +00:00
const root = path.dirname(path.dirname(__dirname));
2018-02-01 13:39:12 +00:00
const builtInExtensions = require('../builtInExtensions.json');
2018-01-29 16:15:22 +00:00
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
2018-01-29 11:23:43 +00:00
function getExtensionPath(extension) {
return path.join(root, '.build', 'builtInExtensions', extension.name);
}
function isUpToDate(extension) {
2018-01-29 11:23:43 +00:00
const packagePath = path.join(getExtensionPath(extension), 'package.json');
if (!fs.existsSync(packagePath)) {
return false;
}
2018-01-29 11:23:43 +00:00
2018-02-27 14:41:00 +00:00
const packageContents = fs.readFileSync(packagePath, { encoding: 'utf8' });
2018-01-29 11:23:43 +00:00
try {
const diskVersion = JSON.parse(packageContents).version;
return (diskVersion === extension.version);
2018-01-29 11:23:43 +00:00
} catch (err) {
return false;
}
}
2018-01-29 11:23:43 +00:00
function syncMarketplaceExtension(extension) {
if (isUpToDate(extension)) {
2019-02-05 21:21:05 +00:00
fancyLog(ansiColors.blue('[marketplace]'), `${extension.name}@${extension.version}`, ansiColors.green('✔︎'));
2018-01-29 11:23:43 +00:00
return es.readArray([]);
}
rimraf.sync(getExtensionPath(extension));
2018-09-21 10:16:23 +00:00
return ext.fromMarketplace(extension.name, extension.version, extension.metadata)
2018-01-29 11:23:43 +00:00
.pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`))
.pipe(vfs.dest('.build/builtInExtensions'))
2019-02-05 21:21:05 +00:00
.on('end', () => fancyLog(ansiColors.blue('[marketplace]'), extension.name, ansiColors.green('✔︎')));
2018-01-29 11:23:43 +00:00
}
function syncExtension(extension, controlState) {
switch (controlState) {
case 'disabled':
2019-02-05 21:21:05 +00:00
fancyLog(ansiColors.blue('[disabled]'), ansiColors.gray(extension.name));
2018-01-29 11:23:43 +00:00
return es.readArray([]);
case 'marketplace':
return syncMarketplaceExtension(extension);
default:
if (!fs.existsSync(controlState)) {
2019-02-05 21:21:05 +00:00
fancyLog(ansiColors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but that path does not exist.`));
2018-01-29 11:23:43 +00:00
return es.readArray([]);
} else if (!fs.existsSync(path.join(controlState, 'package.json'))) {
2019-02-05 21:21:05 +00:00
fancyLog(ansiColors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but there is no 'package.json' file in that directory.`));
2018-01-29 11:23:43 +00:00
return es.readArray([]);
}
2019-02-05 21:21:05 +00:00
fancyLog(ansiColors.blue('[local]'), `${extension.name}: ${ansiColors.cyan(controlState)}`, ansiColors.green('✔︎'));
2018-01-29 11:23:43 +00:00
return es.readArray([]);
}
2018-01-29 11:23:43 +00:00
}
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 main() {
2019-02-05 21:21:05 +00:00
fancyLog('Syncronizing built-in extensions...');
fancyLog(`You can manage built-in extensions with the ${ansiColors.cyan('--builtin')} flag`);
2018-01-29 11:23:43 +00:00
const control = readControlFile();
const streams = [];
for (const extension of builtInExtensions) {
let controlState = control[extension.name] || 'marketplace';
control[extension.name] = controlState;
streams.push(syncExtension(extension, controlState));
}
writeControlFile(control);
es.merge(streams)
.on('error', err => {
console.error(err);
process.exit(1);
})
.on('end', () => {
process.exit(0);
});
}
main();