From 30d9c1bc8cb31d2c4fcd024fc684082afd18ea1a Mon Sep 17 00:00:00 2001 From: 1549469775 <1549469775@qq.com> Date: Tue, 16 Nov 2021 21:23:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 32 +++++++++--- dist/pp.cjs.js | 146 ++++++++++++++++++++++++++++++++++++++++++----------- dist/pp.cjs.js.map | 2 +- package.json | 2 +- src/func.ts | 31 ++++++++---- src/gitee/index.ts | 37 ++++++++++---- src/index.ts | 7 ++- src/util.ts | 52 ++++++++++++++++++- 8 files changed, 245 insertions(+), 64 deletions(-) mode change 100755 => 100644 dist/pp.cjs.js diff --git a/README.MD b/README.MD index 938d53e..76f1508 100644 --- a/README.MD +++ b/README.MD @@ -2,24 +2,42 @@ ### 安装 ```bash -npm i @noderun/pp -h +npm i @noderun/pp -g ``` ### 帮助 ```bash pp -h + +Options: + -v, --version output the version number + -h --help 显示帮助信息 + +Commands: + login 本地保存Gitee的私人令牌 + whoami 查看私人令牌 + logout 删除私人令牌 + sync [options] 同步模板列表 + list [options] 查看所有模板列表 + check 查看配置文件 + add [options] 添加一个模板仓库 + remove 删除一个模板仓库 + clone 克隆模板仓库 + copy [options] 简单文件夹克隆 + help [command] display help for command ``` -### 查询 -```bash -pp list # 查询已存在的模板列表 -pp list -a # 包含仓库地址 -``` +### 同步 +* 在gitee创建私人令牌,权限包括gist的操作 +* 复制token,执行`pp sync`同步到gist +> 注意操作gist的是description的pp的,请注意跟你的gist不要重复 +> `pp sync`需要手动执行 命令行管理模板项目 * [x] 增删查模板列表 * [x] 克隆项目到本地 +* [x] 代码整理 +* [x] 同步功能 TODO * [ ] 代码整理 -* [ ] 同步功能 diff --git a/dist/pp.cjs.js b/dist/pp.cjs.js old mode 100755 new mode 100644 index daeeedd..f316ec6 --- a/dist/pp.cjs.js +++ b/dist/pp.cjs.js @@ -44,10 +44,14 @@ catch (e) { throw e; } -function readFileTime(path) { +function readFileModifyTime(path) { var stat = fs__default["default"].statSync(path); return stat.mtimeMs; } +function readFileCreateTime(path) { + var stat = fs__default["default"].statSync(path); + return stat.birthtimeMs; +} function writeErrorFile(content, path) { if (path === void 0) { path = "pp.error.log"; } if (typeof content == 'string') @@ -68,6 +72,50 @@ function readIniFile(path, encoding) { function writeIniFile(path, data) { fs__default["default"].writeFileSync(path, ini__default["default"].stringify(data)); } +function dateTimeFormat(date, fmt) { + if (fmt === void 0) { fmt = 'yyyy-MM-dd HH:mm:ss'; } + if (!date) { + return ''; + } + if (typeof date === 'string') { + date = date.replace('T', ' ').replace('Z', ''); + date = new Date(date.replace(/-/g, '/')); + } + if (typeof date === 'number') { + date = new Date(date); + } + var o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, + 'H+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds(), + 'q+': Math.floor((date.getMonth() + 3) / 3), + 'S': date.getMilliseconds() + }; + var week = { + '0': '\u65e5', + '1': '\u4e00', + '2': '\u4e8c', + '3': '\u4e09', + '4': '\u56db', + '5': '\u4e94', + '6': '\u516d' + }; + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); + } + if (/(E+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468') : '') + week[date.getDay() + '']); + } + for (var k in o) { + if (new RegExp('(' + k + ')').test(fmt)) { + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))); + } + } + return fmt; +} var dataPath = config.listPath; var Lists = readIniFile(dataPath); @@ -243,6 +291,7 @@ function onLogin(token) { if (res.message) { console.log(res.message); console.log(chalk__default["default"].red("无效私人令牌")); + return [2]; } Config.getInstance().setGitee({ token: token, @@ -258,23 +307,46 @@ function onLogOut() { console.log(chalk__default["default"].green("已清除gitee")); } function Whoami() { - var giteeConfig = Config.getInstance().getGitee(); - var token = giteeConfig.token; - if (token) { - console.log(chalk__default["default"].green("gitee token: ") + chalk__default["default"].greenBright(token)); - } - else { - console.log(chalk__default["default"].green("您尚未保存gitee token")); - } + return tslib.__awaiter(this, void 0, void 0, function () { + var giteeConfig, token, res; + return tslib.__generator(this, function (_a) { + switch (_a.label) { + case 0: + giteeConfig = Config.getInstance().getGitee(); + token = giteeConfig.token; + if (!token) return [3, 3]; + console.log(chalk__default["default"].green("gitee token: ") + chalk__default["default"].greenBright(token)); + 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("私人令牌已失效")); + return [2]; + } + console.log(chalk__default["default"].green("\u6709\u6548\u79C1\u4EBA\u4EE4\u724C\uFF0C\u6B22\u8FCE\u60A8: " + res.name + "(" + res.login + ")")); + return [3, 4]; + case 3: + console.log(chalk__default["default"].green("您尚未保存gitee token")); + _a.label = 4; + case 4: return [2]; + } + }); + }); } function sync(opts) { return tslib.__awaiter(this, void 0, void 0, function () { - var giteeConfig, token, params, requestInfo, spinner, gistList, ppConfig, ppId, localTime, data, data, createTime, data; + var giteeConfig, token, params, requestInfo, spinner, gistList, ppConfig, ppId, localTime, localCreateTime, isJustCreate, data, data, createTime, data; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: giteeConfig = Config.getInstance().getGitee(); token = giteeConfig.token; + if (!token) { + console.log(chalk__default["default"].green("您尚未保存gitee token")); + return [2]; + } params = qs__default["default"].stringify({ access_token: token, }); @@ -300,11 +372,14 @@ function sync(opts) { ppConfig = file; } }); - localTime = readFileTime(config.listPath); + localTime = readFileModifyTime(config.listPath); + localCreateTime = readFileCreateTime(config.listPath); + isJustCreate = localTime === localCreateTime; if (opts.show) { if (ppConfig) { - console.log("\u521B\u5EFA\u65F6\u95F4: " + ppConfig["create_time"] + "\n"); - console.log(ppConfig["data"]); + console.log("\u521B\u5EFA\u65F6\u95F4: " + dateTimeFormat(ppConfig["create_time"], "yyyy-MM-dd HH:mm:ss")); + console.log("\u6570\u636E\u5982\u4E0B: "); + console.log(ppConfig["data"] ? ppConfig["data"] : "暂无数据,请同步"); } else { console.log("远端暂无配置文件"); @@ -334,11 +409,11 @@ function sync(opts) { console.log(chalk__default["default"].green("数据强制同步成功")); return [2]; case 8: - if (opts.pull) { + if (opts.pull || isJustCreate) { if (ppConfig && ppConfig["create_time"]) { data = ppConfig["data"]; - writeIniFile(config.listPath, data); - console.log(chalk__default["default"].green("强制拉取成功")); + syncWriteFile(config.listPath, data); + console.log(chalk__default["default"].green("拉取成功")); } else { console.log(chalk__default["default"].green("远端未找到配置文件")); @@ -352,7 +427,7 @@ function sync(opts) { syncFile(ppId, localTime); } else if (localTime < createTime) { - writeIniFile(config.listPath, data); + syncWriteFile(config.listPath, data); console.log(chalk__default["default"].green("本地数据同步成功")); } else { @@ -411,7 +486,7 @@ function POST(id, data) { var token = giteeConfig.token; var url = "https://gitee.com/api/v5/gists"; var requestInfo = new fetch.Request(id ? url + "/" + id : url, { - method: "POST", + method: id ? "PATCH" : 'POST', body: qs__default["default"].stringify({ access_token: token, files: { @@ -438,11 +513,23 @@ function onList(opt) { } keys.forEach(function (key) { var value = data[key]; + if (opt === null || opt === void 0 ? void 0 : opt.tag) { + if (!value.tag) { + return; + } + var tagList = opt.tag.split(','); + var tags_1 = value.tag.split(','); + var filterTags = tagList.filter(function (v) { return tags_1.includes(v); }); + if (!filterTags.length) { + console.log("暂无此标签的模板"); + return; + } + } if (opt === null || opt === void 0 ? void 0 : opt.all) { - console.log(key + (value.desc ? "(" + value.desc + ")" : "") + (": " + value.url)); + console.log(key + (value.desc ? "(" + value.desc + ")" : "") + (value.tag ? "[" + value.tag + "]" : "") + (": " + value.url)); } else { - console.log(key + (value.desc ? "(" + value.desc + ")" : "")); + console.log(key + (value.desc ? "(" + value.desc + ")" : "") + (value.tag ? "[" + value.tag + "]" : "")); } }); } @@ -457,14 +544,14 @@ function onCopy(templateDir, opts) { } writefile(templateDir, opts.targetDir); } -function onClone(name, opts) { +function onClone(name, target) { var item = Data.getInstance().findOne(name); if (!item) { - console.log("请先添加项目"); + console.log("\u8BF7\u5148\u6DFB\u52A0\u8BE5\u9879\u76EE"); return; } var tempPath = path__default["default"].join(os__default["default"].tmpdir(), "pp-" + uuid__default["default"].v4()); - var to = opts.dir; + var to = target; var git_url = "direct:" + item.url; if (isExist(to)) { console.log(chalk__default["default"].red("安全起见,不覆写已存在的目录,请先删除相同目录文件夹")); @@ -490,18 +577,18 @@ function onRemove(name) { console.error(chalk__default["default"].red("不存在该模板")); } } -function onAdd(url, opt) { +function onAdd(url, name, opt) { var http = /^(http|https)\:\/\//g; var git = /(git|root)\@/g; if (!git.test(url) && !http.test(url)) { console.error(chalk__default["default"].red("请添加正确的Git仓库地址")); return; } - Data.getInstance().addUrl(tslib.__assign(tslib.__assign({}, opt), { url: url })); + Data.getInstance().addUrl(tslib.__assign(tslib.__assign({}, opt), { url: url, name: name })); console.log(chalk__default["default"].green("添加成功")); } function onCheck() { - console.log(JSON.stringify(Data.getInstance().getData())); + console.log(ini__default["default"].stringify(Data.getInstance().getData())); } var program = new commander.Command(); @@ -512,11 +599,10 @@ program.command("login ").description("本地保存Gitee的私人令牌") program.command("whoami").description("查看私人令牌").action(Whoami); program.command("logout").description("删除私人令牌").action(onLogOut); 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("list").option('-a --all').option('-t --tag ', "标签筛选").description("查看所有模板列表").action(onList); program.command("check").description("查看配置文件").action(onCheck); program - .command("add ") - .requiredOption("-n --name ", "模板名字") + .command("add ") .option("-d --desc ", "模板具体描述") .option("-t --tag ", "模板标签") .description("添加一个模板仓库") @@ -525,7 +611,7 @@ program .command("remove ") .description("删除一个模板仓库") .action(onRemove); -program.command("clone ").requiredOption("-d --dir ", "目标路径").description("克隆模板仓库").action(onClone); +program.command("clone ").description("克隆模板仓库").action(onClone); program.command("copy ").requiredOption("-d --targetDir ", "目标路径").description("简单文件夹克隆").action(onCopy); program.parse(process.argv); //# sourceMappingURL=pp.cjs.js.map diff --git a/dist/pp.cjs.js.map b/dist/pp.cjs.js.map index 2248b8d..8bfd527 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/package.json b/package.json index 7da9708..e594d20 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@noderun/pp", - "version": "0.0.1", + "version": "0.0.2", "description": "命令行管理模板项目", "main": "dist/pp.umd.js", "module": "dist/pp.esm.js", diff --git a/src/func.ts b/src/func.ts index f1b8202..dc4c80e 100644 --- a/src/func.ts +++ b/src/func.ts @@ -6,6 +6,7 @@ import uuid from "uuid"; import download from "download-git-repo"; import writefile, {isExist} from "@/writefile"; import fs from "fs-extra"; +import ini from "ini"; export * from "./gitee" @@ -38,7 +39,7 @@ export * from "./gitee" * 显示保存的列表 * @param opt 参数: all:是否显示Git地址 */ -export function onList(opt?: { all?: boolean }) { +export function onList(opt?: { all?: boolean, tag:string }) { const data = Data.getInstance().getData() const keys = Object.keys(data) if (!data || !keys.length) { @@ -47,12 +48,24 @@ export function onList(opt?: { all?: boolean }) { } keys.forEach((key) => { const value = data[key] + if(opt?.tag){ + if(!value.tag){ + return + } + let tagList = opt.tag.split(',') + let tags = value.tag.split(',') + let filterTags = tagList.filter(v=>tags.includes(v)) + if (!filterTags.length) { + console.log("暂无此标签的模板"); + return + } + } if (opt?.all) { console.log( - key + (value.desc ? `(${value.desc})` : "") + `: ${value.url}` + key + (value.desc ? `(${value.desc})` : "") + (value.tag ? `[${value.tag}]` : "") + `: ${value.url}` ); } else { - console.log(key + (value.desc ? `(${value.desc})` : "")); + console.log(key + (value.desc ? `(${value.desc})` : "") + (value.tag ? `[${value.tag}]` : "")); } }); } @@ -73,14 +86,14 @@ export function onCopy(templateDir: string, opts: { targetDir: string }){ writefile(templateDir, opts.targetDir); } -export function onClone(name: string, opts: { dir: string }) { +export function onClone(name: string, target: string) { const item = Data.getInstance().findOne(name) if (!item) { - console.log("请先添加项目"); + console.log(`请先添加该项目`); return; } let tempPath = path.join(os.tmpdir(), "pp-" + uuid.v4()); - let to = opts.dir; + let to = target; let git_url = "direct:" + item.url; if (isExist(to)) { console.log( @@ -108,17 +121,17 @@ export function onRemove(name: string) { } } -export function onAdd(url: string, opt: { name: string; desc?: string }) { +export function onAdd(url: string, name: string, opt: { desc?: string,tag?:string }) { const http = /^(http|https)\:\/\//g; const git = /(git|root)\@/g; if (!git.test(url) && !http.test(url)) { console.error(chalk.red("请添加正确的Git仓库地址")); return; } - Data.getInstance().addUrl({...opt, url: url}); + Data.getInstance().addUrl({...opt, url: url, name: name}); console.log(chalk.green("添加成功")); } export function onCheck() { - console.log(JSON.stringify(Data.getInstance().getData())); + console.log(ini.stringify(Data.getInstance().getData())); } diff --git a/src/gitee/index.ts b/src/gitee/index.ts index d66d666..df548f2 100644 --- a/src/gitee/index.ts +++ b/src/gitee/index.ts @@ -5,7 +5,7 @@ import fetch, { Request } from "node-fetch"; import qs from "qs"; import ora from "ora"; import config from "@/config"; -import { readFileTime, writeIniFile } from "@/util"; +import {dateTimeFormat, readFileCreateTime, readFileModifyTime, syncWriteFile, writeIniFile} from "@/util"; export async function onLogin(token: string) { const res = await ( @@ -14,6 +14,7 @@ export async function onLogin(token: string) { if (res.message) { console.log(res.message); console.log(chalk.red("无效私人令牌")); + return } Config.getInstance().setGitee({ token, @@ -26,11 +27,20 @@ export function onLogOut() { console.log(chalk.green("已清除gitee")); } -export function Whoami() { +export async function Whoami() { let giteeConfig = Config.getInstance().getGitee(); let token = giteeConfig.token; if (token) { console.log(chalk.green("gitee token: ") + chalk.greenBright(token)); + 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("私人令牌已失效")); + return + } + console.log(chalk.green(`有效私人令牌,欢迎您: ${res.name}(${res.login})`)); } else { console.log(chalk.green("您尚未保存gitee token")); } @@ -44,6 +54,10 @@ export async function sync(opts: { }) { let giteeConfig = Config.getInstance().getGitee(); let token = giteeConfig.token; + if(!token){ + console.log(chalk.green("您尚未保存gitee token")); + return + } let params = qs.stringify({ access_token: token, }); @@ -68,11 +82,14 @@ export async function sync(opts: { ppConfig = file; } }); - let localTime = readFileTime(config.listPath); + let localTime = readFileModifyTime(config.listPath); + let localCreateTime = readFileCreateTime(config.listPath); + let isJustCreate = localTime === localCreateTime; if (opts.show) { if (ppConfig) { - console.log(`创建时间: ` + ppConfig["create_time"] + "\n"); - console.log(ppConfig["data"]); + console.log(`创建时间: ` + dateTimeFormat(ppConfig["create_time"],"yyyy-MM-dd HH:mm:ss")); + console.log(`数据如下: `); + console.log(ppConfig["data"]?ppConfig["data"]:"暂无数据,请同步"); } else { console.log("远端暂无配置文件"); } @@ -101,11 +118,11 @@ export async function sync(opts: { console.log(chalk.green("数据强制同步成功")); return; } - if (opts.pull) { + if (opts.pull || isJustCreate) { if (ppConfig && ppConfig["create_time"]) { let data = ppConfig["data"]; - writeIniFile(config.listPath, data); - console.log(chalk.green("强制拉取成功")); + syncWriteFile(config.listPath, data); + console.log(chalk.green("拉取成功")); } else { console.log(chalk.green("远端未找到配置文件")); } @@ -118,7 +135,7 @@ export async function sync(opts: { if (localTime > createTime) { syncFile(ppId, localTime); } else if (localTime < createTime) { - writeIniFile(config.listPath, data); + syncWriteFile(config.listPath, data); console.log(chalk.green("本地数据同步成功")); } else { console.log(chalk.green("配置文件数据一致")); @@ -168,7 +185,7 @@ function POST(id: any, data: string) { let token = giteeConfig.token; let url = "https://gitee.com/api/v5/gists"; const requestInfo = new Request(id ? url + "/" + id : url, { - method: "POST", + method: id ? "PATCH": 'POST', body: qs.stringify({ access_token: token, files: { diff --git a/src/index.ts b/src/index.ts index d855363..90cff13 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,13 +16,12 @@ program.command("whoami").description("查看私人令牌").action(func.Whoami); program.command("logout").description("删除私人令牌").action(func.onLogOut); 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); +program.command("list").option('-a --all').option('-t --tag ', "标签筛选").description("查看所有模板列表").action(func.onList); program.command("check").description("查看配置文件").action(func.onCheck); program - .command("add ") - .requiredOption("-n --name ", "模板名字") + .command("add ") .option("-d --desc ", "模板具体描述") .option("-t --tag ", "模板标签") .description("添加一个模板仓库") @@ -33,7 +32,7 @@ program .description("删除一个模板仓库") .action(func.onRemove); -program.command("clone ").requiredOption("-d --dir ", "目标路径").description("克隆模板仓库").action(func.onClone); +program.command("clone ").description("克隆模板仓库").action(func.onClone); program.command("copy ").requiredOption("-d --targetDir ", "目标路径").description("简单文件夹克隆").action(func.onCopy); program.parse(process.argv); diff --git a/src/util.ts b/src/util.ts index b1afe95..132b4bc 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,11 +1,14 @@ import ini from "ini" import fs from "fs-extra" -export function readFileTime(path: string){ +export function readFileModifyTime(path: string){ var stat = fs.statSync(path); return stat.mtimeMs } - +export function readFileCreateTime(path: string){ + var stat = fs.statSync(path); + return stat.birthtimeMs +} export function syncReadFile(path:string, encoding: BufferEncoding="utf-8") { return fs.readFileSync(path, encoding) } @@ -26,3 +29,48 @@ export function readIniFile(path:string, encoding: BufferEncoding="utf-8") { export function writeIniFile(path:string, data: Object) { fs.writeFileSync(path, ini.stringify(data)) } + + +export function dateTimeFormat(date: Date|number|string, fmt = 'yyyy-MM-dd HH:mm:ss') { //日期时间格式化 + if (!date) { + return '' + } + if (typeof date === 'string') { + date = date.replace('T', ' ').replace('Z', ''); + date = new Date(date.replace(/-/g, '/')) + } + if (typeof date === 'number') { + date = new Date(date) + } + var o:Record = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, + 'H+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds(), + 'q+': Math.floor((date.getMonth() + 3) / 3), + 'S': date.getMilliseconds() + } + let week:Record = { + '0': '\u65e5', + '1': '\u4e00', + '2': '\u4e8c', + '3': '\u4e09', + '4': '\u56db', + '5': '\u4e94', + '6': '\u516d' + } + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + if (/(E+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468') : '') + week[date.getDay() + '']) + } + for (var k in o) { + if (new RegExp('(' + k + ')').test(fmt)) { + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) + } + } + return fmt +}