UNPKG

vscode-config

Version:

在多台设备上同步vscode配置的命令行工具

169 lines (157 loc) 4.96 kB
// const path = require("path"); const shell = require("shelljs"); const fs = require("fs-extra"); const ora = require("ora"); const JSON5 = require("json5"); const Config = require("./config"); const createHttp = require("./create-http"); const PlatForm = require("./platform"); class VCService { /** * 拉取gist上的配置 */ async pull() { try { const getConfigSpinners = ora("Get Gist Config").start(); const { data } = await createHttp().get(`/gists/${Config.gistId}`); const content = data.files[Config.gistFileName].content; const userVscodeConfig = JSON5.parse(content); if (userVscodeConfig) { getConfigSpinners.succeed("Get Gist Config Success"); const { extensions, settings } = userVscodeConfig; const nowExtensions = await this._getExtensions(); setTimeout(() => { Promise.all( extensions .filter((id) => !nowExtensions.includes(id)) .map((id, index) => this._installExtension(id, index)) ).then(() => ora("Installation Complete").succeed()); }); try { const setSettingJsonSpinners = ora("Setting setting.json").start(); await this._setSettings(JSON.stringify(settings, null, " ")); setSettingJsonSpinners.succeed(); } catch (error) { setSettingJsonSpinners.fail(); throw error; } } else { getConfigSpinners.fail(); throw new Error(`gist并没有push配置 如果继续设置您本地配置将被清空!!`); } } catch (error) { console.error(error); } } /** * 将本地配置发送到gist */ async push() { const getLocalConfigSpinners = ora("get local config").start(); const userVscodeConfig = { settings: await this._getSettings(), extensions: await this._getExtensions(), }; getLocalConfigSpinners.succeed(); const pushSpinners = ora("Push").start(); try { const content = JSON5.stringify(userVscodeConfig, null, " "); await createHttp()({ url: "/gists/" + Config.gistId.trim(), method: "PATCH", data: { files: { [Config.gistFileName]: { content }, }, }, }); pushSpinners.succeed(); } catch (error) { pushSpinners.fail(); console.error(error); process.exit(1); } } /** * 安装插件 * @param {string} extension 插件id */ _installExtension(extension, index) { return new Promise((res) => { if (!extension.trim()) { res(); return; } setTimeout( () => { const { code } = shell.exec(`code --install-extension ${extension}`); if (code !== 0) { console.log("\r"); shell.exit(1); } res(); }, index % 2 === 0 ? 1000 : 0 ); }); } /** * 设置本地setting.json * @param {string} jsonString */ async _setSettings(jsonString) { const fp = PlatForm.getSettinsPath(); if (fs.existsSync(fp)) { await fs.outputFile(fp, jsonString); } } /** * 获取本地的setting.json * @result { Promise<{}> } */ async _getSettings() { const fp = PlatForm.getSettinsPath(); if (fs.existsSync(fp)) { return JSON5.parse(await fs.readFile(fp, "utf8")); } else { console.error(`settings.json 文件没找到,或则不存在.`); process.exit(1); } } /** * 获取本地的插件列表 * @result { string[] } */ async _getExtensions() { try { // 使用code命令获取插件列表 const r = shell.exec(`code --list-extensions`, { silent: true }).stdout; if (r) { return r .split(/\n/) .map((e) => e.trim()) .filter((e) => !!e); } else { return []; } } catch (error) { console.log("获取插件列表失败"); console.log(error); process.exit(1); } // 通过读取本地文件,来获取插件列表 // 注: 如果删除了插件,但是本地没有删除文件,还是会读取 // const extensionsDir = PlatForm.getExtentionsPath(); // if (fs.existsSync(extensionsDir)) { // let extensions = await fs.readdir(extensionsDir); // extensions = extensions // .filter(s => !s.startsWith(".")) // 砍掉隐藏文件 // .filter(s => fs.lstatSync(path.join(extensionsDir, s)).isDirectory()) // 只要目录 // .map(s => s.replace(/(?:-\d+\.\d+\.\d+)$/g, "")); // 砍掉vsersion // return Array.from(new Set(extensions)); // 去重 // } else { // throw new Error(`插件安装目录没有找到.`); // } } } module.exports = new VCService();