From 92ce2f6d6108d1463b7c1fb6cb076771ab9e84de Mon Sep 17 00:00:00 2001 From: 1549469775 <1549469775@qq.com> Date: Mon, 15 Nov 2021 17:35:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/pp.cjs.js | 208 +++++++++++++++++++++++++++++++++++++++++++++++------ dist/pp.cjs.js.map | 2 +- src/data/config.ts | 6 +- src/data/index.ts | 15 +--- src/data/init.ts | 15 ++++ src/func.ts | 39 +--------- src/gitee/index.ts | 187 +++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 2 +- src/util.ts | 5 ++ 9 files changed, 399 insertions(+), 80 deletions(-) create mode 100644 src/data/init.ts create mode 100644 src/gitee/index.ts diff --git a/dist/pp.cjs.js b/dist/pp.cjs.js index 0ceeb20..daeeedd 100755 --- a/dist/pp.cjs.js +++ b/dist/pp.cjs.js @@ -5,27 +5,29 @@ var commander = require('commander'); var tslib = require('tslib'); var path = require('path'); var os = require('os'); -var ini = require('ini'); var fs = require('fs-extra'); +var ini = require('ini'); var chalk = require('chalk'); var uuid = require('uuid'); var download = require('download-git-repo'); var ejs = require('ejs'); var fetch = require('node-fetch'); var qs = require('qs'); +var ora = require('ora'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var path__default = /*#__PURE__*/_interopDefaultLegacy(path); var os__default = /*#__PURE__*/_interopDefaultLegacy(os); -var ini__default = /*#__PURE__*/_interopDefaultLegacy(ini); var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); +var ini__default = /*#__PURE__*/_interopDefaultLegacy(ini); var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk); var uuid__default = /*#__PURE__*/_interopDefaultLegacy(uuid); var download__default = /*#__PURE__*/_interopDefaultLegacy(download); var ejs__default = /*#__PURE__*/_interopDefaultLegacy(ejs); var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch); var qs__default = /*#__PURE__*/_interopDefaultLegacy(qs); +var ora__default = /*#__PURE__*/_interopDefaultLegacy(ora); var config = { dir: path__default["default"].join(os__default["default"].homedir(), '.pp'), @@ -33,6 +35,19 @@ var config = { listPath: path__default["default"].join(os__default["default"].homedir(), '.pp', '.listrc') }; +try { + fs__default["default"].ensureDirSync(config.dir); + fs__default["default"].ensureFileSync(config.configPath); + fs__default["default"].ensureFileSync(config.listPath); +} +catch (e) { + throw e; +} + +function readFileTime(path) { + var stat = fs__default["default"].statSync(path); + return stat.mtimeMs; +} function writeErrorFile(content, path) { if (path === void 0) { path = "pp.error.log"; } if (typeof content == 'string') @@ -119,9 +134,9 @@ var Config = (function () { Config.prototype.sync = function () { writeIniFile(configPath, configData); }; - Config.prototype.setGiteeToken = function (token) { - var gitee = this.getGitee(); - gitee.token = token; + Config.prototype.setGitee = function (data) { + var config = this.getData(); + config.gitee = data; this.sync(); }; Config.prototype.reomveGitee = function () { @@ -138,15 +153,6 @@ var Config = (function () { return Config; }()); -try { - fs__default["default"].ensureDirSync(config.dir); - fs__default["default"].ensureFileSync(config.configPath); - fs__default["default"].ensureFileSync(config.listPath); -} -catch (e) { - throw e; -} - function walkDir(dir, cb) { function _walk(_dir) { if (_dir === void 0) { _dir = '.'; } @@ -226,8 +232,26 @@ function writefile(fromDir, toDir, opts, force) { } function onLogin(token) { - Config.getInstance().setGiteeToken(token); - console.log(chalk__default["default"].green("已保存gitee的私人令牌")); + return tslib.__awaiter(this, void 0, void 0, function () { + var res; + return tslib.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, fetch__default["default"]("https://gitee.com/api/v5/user?access_token=" + token)]; + case 1: return [4, (_a.sent()).json()]; + case 2: + res = _a.sent(); + if (res.message) { + console.log(res.message); + console.log(chalk__default["default"].red("无效私人令牌")); + } + Config.getInstance().setGitee({ + token: token, + }); + console.log(chalk__default["default"].green("\u6709\u6548\u79C1\u4EBA\u4EE4\u724C\uFF0C\u6B22\u8FCE\u60A8: " + res.name + "(" + res.login + ")")); + return [2]; + } + }); + }); } function onLogOut() { Config.getInstance().reomveGitee(); @@ -243,30 +267,168 @@ function Whoami() { console.log(chalk__default["default"].green("您尚未保存gitee token")); } } -function sync() { +function sync(opts) { return tslib.__awaiter(this, void 0, void 0, function () { - var giteeConfig, token, params, requestInfo, res; + var giteeConfig, token, params, requestInfo, spinner, gistList, ppConfig, ppId, localTime, data, data, createTime, data; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: giteeConfig = Config.getInstance().getGitee(); token = giteeConfig.token; params = qs__default["default"].stringify({ - access_token: token + access_token: token, }); - requestInfo = new fetch.Request('https://gitee.com/api/v5/gists?' + params, { - method: "GET" + requestInfo = new fetch.Request("https://gitee.com/api/v5/gists?" + params, { + method: "GET", }); + spinner = ora__default["default"]("数据同步中,请稍后...").start(); return [4, fetch__default["default"](requestInfo)]; case 1: return [4, (_a.sent()).json()]; case 2: + gistList = _a.sent(); + spinner.clear(); + spinner.stop(); + ppConfig = null; + ppId = ""; + gistList.forEach(function (gist) { + if (gist.description === "pp" && + gist.files && + gist.files.templates && + gist.files.templates.content) { + ppId = gist.id; + var file = JSON.parse(decodeURIComponent(gist.files.templates.content)); + ppConfig = file; + } + }); + localTime = readFileTime(config.listPath); + if (opts.show) { + if (ppConfig) { + console.log("\u521B\u5EFA\u65F6\u95F4: " + ppConfig["create_time"] + "\n"); + console.log(ppConfig["data"]); + } + else { + console.log("远端暂无配置文件"); + } + return [2]; + } + if (!opts.delete) return [3, 6]; + if (!ppId) return [3, 4]; + return [4, DELETE(ppId)]; + case 3: + _a.sent(); + console.log(chalk__default["default"].green("删除成功")); + return [3, 5]; + case 4: + console.log(chalk__default["default"].green("远端未找到配置文件")); + _a.label = 5; + case 5: return [2]; + case 6: + if (!opts.force) return [3, 8]; + data = ini__default["default"].stringify(Data.getInstance().getData()); + return [4, POST(ppId, encodeURIComponent(JSON.stringify({ + create_time: localTime, + data: data, + })))]; + case 7: + _a.sent(); + console.log(chalk__default["default"].green("数据强制同步成功")); + return [2]; + case 8: + if (opts.pull) { + if (ppConfig && ppConfig["create_time"]) { + data = ppConfig["data"]; + writeIniFile(config.listPath, data); + console.log(chalk__default["default"].green("强制拉取成功")); + } + else { + console.log(chalk__default["default"].green("远端未找到配置文件")); + } + return [2]; + } + if (ppConfig && ppConfig["create_time"]) { + createTime = ppConfig["create_time"]; + data = ppConfig["data"]; + if (localTime > createTime) { + syncFile(ppId, localTime); + } + else if (localTime < createTime) { + writeIniFile(config.listPath, data); + console.log(chalk__default["default"].green("本地数据同步成功")); + } + else { + console.log(chalk__default["default"].green("配置文件数据一致")); + } + } + else { + syncFile(ppId, localTime); + } + return [2]; + } + }); + }); +} +function syncFile(ppId, localTime) { + return tslib.__awaiter(this, void 0, void 0, function () { + var data, res; + return tslib.__generator(this, function (_a) { + switch (_a.label) { + case 0: + data = ini__default["default"].stringify(Data.getInstance().getData()); + return [4, POST(ppId, encodeURIComponent(JSON.stringify({ + create_time: localTime, + data: data, + })))]; + case 1: return [4, (_a.sent()).json()]; + case 2: res = _a.sent(); - console.log(res); + if (res.message) { + console.log(res.message); + } + else { + console.log(chalk__default["default"].green("数据同步成功")); + } return [2]; } }); }); } +function DELETE(id) { + var giteeConfig = Config.getInstance().getGitee(); + var token = giteeConfig.token; + var requestInfo = new fetch.Request("https://gitee.com/api/v5/gists/" + id, { + method: "DELETE", + body: qs__default["default"].stringify({ + access_token: token, + }), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + }); + return fetch__default["default"](requestInfo); +} +function POST(id, data) { + var giteeConfig = Config.getInstance().getGitee(); + var token = giteeConfig.token; + var url = "https://gitee.com/api/v5/gists"; + var requestInfo = new fetch.Request(id ? url + "/" + id : url, { + method: "POST", + body: qs__default["default"].stringify({ + access_token: token, + files: { + templates: { + content: data, + }, + }, + description: "pp", + public: false, + }), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + }); + return fetch__default["default"](requestInfo); +} + function onList(opt) { var data = Data.getInstance().getData(); var keys = Object.keys(data); @@ -349,7 +511,7 @@ program.showHelpAfterError("( pp -h 查看帮助信息)"); program.command("login ").description("本地保存Gitee的私人令牌").action(onLogin); program.command("whoami").description("查看私人令牌").action(Whoami); program.command("logout").description("删除私人令牌").action(onLogOut); -program.command("sync").description("同步模板列表").action(sync); +program.command("sync").option('-f --force', "强制同步").option('-d --delete', "删除远端").option('-s --show', "查看远端").option('-p --pull', "强制拉取远端").description("同步模板列表").action(sync); program.command("list").option('-a --all').description("查看所有模板列表").action(onList); program.command("check").description("查看配置文件").action(onCheck); program diff --git a/dist/pp.cjs.js.map b/dist/pp.cjs.js.map index ff660dd..2248b8d 100644 --- a/dist/pp.cjs.js.map +++ b/dist/pp.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"pp.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"pp.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/src/data/config.ts b/src/data/config.ts index 7f48f38..fb4d149 100644 --- a/src/data/config.ts +++ b/src/data/config.ts @@ -27,9 +27,9 @@ export default class Config { writeIniFile(configPath, configData); } - setGiteeToken(token: string){ - let gitee = this.getGitee() - gitee.token = token; + setGitee(data: any){ + let config = this.getData() + config.gitee = data; this.sync() } reomveGitee(){ diff --git a/src/data/index.ts b/src/data/index.ts index ab98d95..fa5a52c 100644 --- a/src/data/index.ts +++ b/src/data/index.ts @@ -1,19 +1,6 @@ - +import "./init" import Data from "./data" import Config from "./config" -/** - * 确保配置文件存在 - */ -import fs from "fs-extra"; -import config from "@/config"; - -try { - fs.ensureDirSync(config.dir); - fs.ensureFileSync(config.configPath); - fs.ensureFileSync(config.listPath); -} catch (e) { - throw e; -} export { Config, diff --git a/src/data/init.ts b/src/data/init.ts new file mode 100644 index 0000000..2fa75d7 --- /dev/null +++ b/src/data/init.ts @@ -0,0 +1,15 @@ +/** + * 确保配置文件存在 + */ +import config from "@/config"; +import fs from "fs-extra"; + +try { + fs.ensureDirSync(config.dir); + fs.ensureFileSync(config.configPath); + fs.ensureFileSync(config.listPath); +} catch (e) { + throw e; +} + +export default {}; diff --git a/src/func.ts b/src/func.ts index a391cb2..f1b8202 100644 --- a/src/func.ts +++ b/src/func.ts @@ -6,45 +6,8 @@ import uuid from "uuid"; import download from "download-git-repo"; import writefile, {isExist} from "@/writefile"; import fs from "fs-extra"; -import fetch, {Request} from "node-fetch"; -import qs from "qs"; -export function onLogin(token: string) { - Config.getInstance().setGiteeToken(token) - console.log(chalk.green("已保存gitee的私人令牌")); -} - -export function onLogOut() { - Config.getInstance().reomveGitee() - console.log(chalk.green("已清除gitee")); -} - -export function Whoami() { - let giteeConfig = Config.getInstance().getGitee() - let token = giteeConfig.token - if(token){ - console.log( - chalk.green("gitee token: ") + chalk.greenBright(token) - ); - }else{ - console.log( - chalk.green("您尚未保存gitee token") - ); - } -} - -export async function sync() { - let giteeConfig = Config.getInstance().getGitee() - let token = giteeConfig.token - let params = qs.stringify({ - access_token: token - }) - const requestInfo = new Request('https://gitee.com/api/v5/gists?'+params,{ - method: "GET" - }); - const res = await (await fetch(requestInfo)).json() - console.log(res) -} +export * from "./gitee" // export function onLogin() { // const promptList = [{ diff --git a/src/gitee/index.ts b/src/gitee/index.ts new file mode 100644 index 0000000..d66d666 --- /dev/null +++ b/src/gitee/index.ts @@ -0,0 +1,187 @@ +import { Data, Config } from "@/data"; +import chalk from "chalk"; +import ini from "ini"; +import fetch, { Request } from "node-fetch"; +import qs from "qs"; +import ora from "ora"; +import config from "@/config"; +import { readFileTime, writeIniFile } from "@/util"; + +export async function onLogin(token: string) { + const res = await ( + await fetch("https://gitee.com/api/v5/user?access_token=" + token) + ).json(); + if (res.message) { + console.log(res.message); + console.log(chalk.red("无效私人令牌")); + } + Config.getInstance().setGitee({ + token, + }); + console.log(chalk.green(`有效私人令牌,欢迎您: ${res.name}(${res.login})`)); +} + +export function onLogOut() { + Config.getInstance().reomveGitee(); + console.log(chalk.green("已清除gitee")); +} + +export function Whoami() { + let giteeConfig = Config.getInstance().getGitee(); + let token = giteeConfig.token; + if (token) { + console.log(chalk.green("gitee token: ") + chalk.greenBright(token)); + } else { + console.log(chalk.green("您尚未保存gitee token")); + } +} + +export async function sync(opts: { + force: boolean; + delete: boolean; + show: boolean; + pull: boolean; +}) { + let giteeConfig = Config.getInstance().getGitee(); + let token = giteeConfig.token; + let params = qs.stringify({ + access_token: token, + }); + const requestInfo = new Request("https://gitee.com/api/v5/gists?" + params, { + method: "GET", + }); + let spinner = ora("数据同步中,请稍后...").start(); + const gistList = await (await fetch(requestInfo)).json(); + spinner.clear(); + spinner.stop(); + let ppConfig = null; + let ppId = ""; + gistList.forEach((gist: any) => { + if ( + gist.description === "pp" && + gist.files && + gist.files.templates && + gist.files.templates.content + ) { + ppId = gist.id; + let file = JSON.parse(decodeURIComponent(gist.files.templates.content)); + ppConfig = file; + } + }); + let localTime = readFileTime(config.listPath); + if (opts.show) { + if (ppConfig) { + console.log(`创建时间: ` + ppConfig["create_time"] + "\n"); + console.log(ppConfig["data"]); + } else { + console.log("远端暂无配置文件"); + } + return; + } + if (opts.delete) { + if (ppId) { + await DELETE(ppId); + console.log(chalk.green("删除成功")); + } else { + console.log(chalk.green("远端未找到配置文件")); + } + return; + } + if (opts.force) { + let data = ini.stringify(Data.getInstance().getData()); + await POST( + ppId, + encodeURIComponent( + JSON.stringify({ + create_time: localTime, + data: data, + }) + ) + ); + console.log(chalk.green("数据强制同步成功")); + return; + } + if (opts.pull) { + if (ppConfig && ppConfig["create_time"]) { + let data = ppConfig["data"]; + writeIniFile(config.listPath, data); + console.log(chalk.green("强制拉取成功")); + } else { + console.log(chalk.green("远端未找到配置文件")); + } + return; + } + if (ppConfig && ppConfig["create_time"]) { + // 存在配置文件,比较之后决定 + let createTime = ppConfig["create_time"]; + let data = ppConfig["data"]; + if (localTime > createTime) { + syncFile(ppId, localTime); + } else if (localTime < createTime) { + writeIniFile(config.listPath, data); + console.log(chalk.green("本地数据同步成功")); + } else { + console.log(chalk.green("配置文件数据一致")); + } + } else { + syncFile(ppId, localTime); + } +} + +async function syncFile(ppId: any, localTime: any) { + let data = ini.stringify(Data.getInstance().getData()); + let res = await ( + await POST( + ppId, + encodeURIComponent( + JSON.stringify({ + create_time: localTime, + data: data, + }) + ) + ) + ).json(); + if (res.message) { + console.log(res.message); + } else { + console.log(chalk.green("数据同步成功")); + } +} + +function DELETE(id: any) { + let giteeConfig = Config.getInstance().getGitee(); + let token = giteeConfig.token; + const requestInfo = new Request("https://gitee.com/api/v5/gists/" + id, { + method: "DELETE", + body: qs.stringify({ + access_token: token, + }), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + }); + return fetch(requestInfo); +} + +function POST(id: any, data: string) { + let giteeConfig = Config.getInstance().getGitee(); + let token = giteeConfig.token; + let url = "https://gitee.com/api/v5/gists"; + const requestInfo = new Request(id ? url + "/" + id : url, { + method: "POST", + body: qs.stringify({ + access_token: token, + files: { + templates: { + content: data, + }, + }, + description: "pp", + public: false, + }), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + }); + return fetch(requestInfo); +} diff --git a/src/index.ts b/src/index.ts index 0343d9a..d855363 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,7 +14,7 @@ program.showHelpAfterError("( pp -h 查看帮助信息)"); program.command("login ").description("本地保存Gitee的私人令牌").action(func.onLogin); program.command("whoami").description("查看私人令牌").action(func.Whoami); program.command("logout").description("删除私人令牌").action(func.onLogOut); -program.command("sync").description("同步模板列表").action(func.sync); +program.command("sync").option('-f --force', "强制同步").option('-d --delete', "删除远端").option('-s --show', "查看远端").option('-p --pull', "强制拉取远端").description("同步模板列表").action(func.sync); program.command("list").option('-a --all').description("查看所有模板列表").action(func.onList); diff --git a/src/util.ts b/src/util.ts index 6a4fce6..b1afe95 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,6 +1,11 @@ import ini from "ini" import fs from "fs-extra" +export function readFileTime(path: string){ + var stat = fs.statSync(path); + return stat.mtimeMs +} + export function syncReadFile(path:string, encoding: BufferEncoding="utf-8") { return fs.readFileSync(path, encoding) }