mirror of https://github.com/IoTcat/todo-ddl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
700 lines
17 KiB
700 lines
17 KiB
#!/usr/bin/env node |
|
const request = require('request'); |
|
require('shelljs/global'); |
|
const ora = require('ora'); |
|
const boxen = require('boxen'); |
|
const table = require('cli-table'); |
|
const colors = require('colors'); |
|
const fs = require('fs'); |
|
const md5 = require('md5'); |
|
|
|
const conf = new (require('conf'))({ |
|
email: { |
|
type: "string", |
|
format: "email" |
|
}, |
|
url: { |
|
type: "string", |
|
format: "url", |
|
default: "https://api.yimian.xyz/todo-ddl/" |
|
}, |
|
taskData: { |
|
type: "array", |
|
default: [] |
|
}, |
|
ddlData: { |
|
type: "array", |
|
default: [] |
|
} |
|
}); |
|
|
|
if(conf.get('url') == undefined) conf.set('url', "https://api.yimian.xyz/todo-ddl/"); |
|
if(conf.get('email') == undefined) conf.set('email', ""); |
|
if(conf.get('taskData') == undefined) conf.set('taskData', []); |
|
if(conf.get('ddlData') == undefined) conf.set('ddlData', []); |
|
|
|
|
|
const tds = ['todo', 'task', 'history', 'ash']; |
|
|
|
var tools = { |
|
_parseTime: t => { |
|
var st = new Date(t); |
|
return `${st.getFullYear()}-${st.getMonth()+1}-${st.getDate()} ${st.getHours()}:${st.getMinutes()}:${st.getSeconds()}`; |
|
}, |
|
_showInfo: (arr, head, value) => { |
|
var info = new table({ |
|
'head': head |
|
}); |
|
arr.forEach((i, index) => { |
|
var item = conf.get('taskData')[i]; |
|
info.push(value(item)); |
|
if(index == arr.length-1){ |
|
console.log(info.toString()); |
|
} |
|
}); |
|
}, |
|
td: { |
|
_filter: condition => new Promise(resolve => { |
|
var arr = []; |
|
conf.get('taskData').forEach((item, index) => { |
|
if(condition(item)){ |
|
arr.push(index); |
|
} |
|
if(index == conf.get('taskData').length-1){ |
|
resolve(arr); |
|
} |
|
}); |
|
}), |
|
task: { |
|
_: item => (!item.isDel && item.tt == null), |
|
_head: ['id', 'class', 'name', 'Create Time'], |
|
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st)], |
|
ls: {} |
|
}, |
|
todo: { |
|
_: item => !item.isDel && item.tt != null && item.et == null, |
|
_head: ['id', 'class', 'name', 'Create Time', 'Start Time'], |
|
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt)], |
|
ls: {} |
|
}, |
|
history: { |
|
_: item => !item.isDel && item.tt != null && item.et != null, |
|
_head: ['id', 'class', 'name', 'Create Time', 'Start Time', 'Finish Time'], |
|
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt), tools._parseTime(item.et)], |
|
ls: {} |
|
}, |
|
ash: { |
|
_: item => item.isDel, |
|
_head: ['id', 'class', 'name', 'Create Time', 'Start Time', 'Finish Time'], |
|
_value: item => [item.id, item.class, item.name, tools._parseTime(item.st), tools._parseTime(item.tt), tools._parseTime(item.et)], |
|
ls: {} |
|
} |
|
} |
|
}; |
|
|
|
tds.forEach(item => { |
|
tools.td[item].ls.all = async () => { |
|
tools._showInfo(await tools.td._filter(tools.td[item]._), tools.td[item]._head, tools.td[item]._value); |
|
}; |
|
tools.td[item].__ = async () => new Promise(async resolve => { |
|
var arr = []; |
|
var index = await tools.td._filter(tools.td[item]._); |
|
index.forEach((i, ind) => { |
|
arr.push(conf.get('taskData')[i]); |
|
if(ind == index.length-1){ |
|
resolve(arr); |
|
} |
|
}); |
|
}); |
|
}); |
|
|
|
|
|
const getIDs = (id, data, zone) => new Promise(resolve => { |
|
var ban = ora('Searching IDs...').start(); |
|
var arr = []; |
|
data.forEach((item, index) => { |
|
if(item.id.substring(0, String(id).length) == id && tools.td[zone]._(item)){ |
|
arr.push(index); |
|
ban.info(item.id); |
|
ban = new ora('Searching IDs...').start(); |
|
} |
|
if(index == data.length-1){ |
|
ban.succeed('Search finished!! Found '+arr.length+' result!!'); |
|
resolve(arr); |
|
} |
|
}); |
|
}); |
|
|
|
const getID = async (id, data, zone) => { |
|
var arr = await getIDs(id, data, zone); |
|
if(arr.length > 1){ |
|
console.error(boxen('Which ID do you want?')); |
|
return null; |
|
} |
|
if(arr.length < 1){ |
|
console.error(boxen('No ID Found!! Please use '+'td task|todo|history|ddl ls'.blue+' to check!!')); |
|
return null; |
|
} |
|
return arr[0]; |
|
}; |
|
|
|
|
|
|
|
|
|
const argv = require('yargs') |
|
.command("config", "Set todo-ddl tool confignation..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.command("show", "Show config details..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, yargs2 => { |
|
var configInfo = new table(); |
|
configInfo.push({email: conf.get('email')},{remote: conf.get('url')}); |
|
console.log(configInfo.toString()); |
|
}) |
|
.command("reset", "Reset All config..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, yargs2 => { |
|
conf.set('url', "https://api.yimian.xyz/todo-ddl/"); |
|
conf.set('email', ""); |
|
}) |
|
.option("e", { |
|
alias: "email", |
|
default: "", |
|
describe: "Your Email to login.", |
|
demand: false, |
|
type: 'string' |
|
}) |
|
.option("r", { |
|
alias: "remote", |
|
default: "", |
|
describe: "Remote todo-ddl server URL.", |
|
demand: false, |
|
type: 'string' |
|
}) |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
if(yargs.e == "" && yargs.r == ""){ |
|
console.error(boxen('Please use '+'td config -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
if(yargs.e != ""){ |
|
conf.set('email', yargs.e); |
|
} |
|
if(yargs.r != ""){ |
|
conf.set('url', yargs.r); |
|
} |
|
var configInfo = new table(); |
|
configInfo.push({email: conf.get('email')},{remote: conf.get('url')}); |
|
console.log(configInfo.toString()); |
|
}) |
|
|
|
|
|
/* init */ |
|
.command("init", "Set todo-ddl tool confignation..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
var t = (new Date()).valueOf(); |
|
var ban = ora('Clear Data...').start(); |
|
var data = conf.get('taskData'); |
|
for(var i = 0; i < data.length; i ++){ |
|
ban.succeed(data[i].id.red); |
|
ban = new ora('Clear Data...').start(); |
|
} |
|
conf.set('taskData', []); |
|
ban.succeed(`Finished in ${(new Date()).valueOf() - t} ms!!`); |
|
}) |
|
|
|
|
|
/* ls */ |
|
.command("ls", "= td todo ls..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
tools.td.todo.ls.all(); |
|
}) |
|
|
|
/* lst */ |
|
.command("lst", "= td todo ls..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
tools.td.task.ls.all(); |
|
}) |
|
|
|
/* lsh */ |
|
.command("lsh", "= td todo ls..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
tools.td.history.ls.all(); |
|
}) |
|
|
|
/* lsa */ |
|
.command("lsa", "= td todo ls..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
tools.td.ash.ls.all(); |
|
}) |
|
|
|
/* new */ |
|
.command("new", "= td task add -n <name> -c [class]..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
if(yargs._.length < 2 || yargs._.length > 3){ |
|
return; |
|
} |
|
if(yargs._.length == 2){ |
|
yargs._[2] = "default"; |
|
} |
|
if(yargs._[1].length > 30){ |
|
console.error(boxen('Too Long Name!!!\nPlease shorten your task name!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
data.push({ |
|
id: md5((new Date()).valueOf()).substring(0, 6), |
|
name: yargs._[1], |
|
class: yargs._[2], |
|
st: (new Date()).valueOf(), |
|
tt: null, |
|
et: null, |
|
isDel: false |
|
}); |
|
conf.set('taskData', data); |
|
tools.td.task.ls.all(); |
|
}) |
|
|
|
/* add */ |
|
.command("add", "= td todo add..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, async yargs => { |
|
if(yargs._.length != 2) { |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs._[1], data, 'task'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].tt = (new Date()).valueOf(); |
|
conf.set('taskData', data); |
|
tools.td.todo.ls.all(); |
|
}) |
|
|
|
|
|
/* done */ |
|
.command("done", "= td todo done..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, async yargs => { |
|
if(yargs._.length != 2) { |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs._[1], data, 'todo'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].et = (new Date()).valueOf(); |
|
conf.set('taskData', data); |
|
tools.td.todo.ls.all(); |
|
}) |
|
|
|
|
|
/* return */ |
|
.command("return", "= td todo return..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, async yargs => { |
|
if(yargs._.length != 2) { |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs._[1], data, 'todo'); |
|
if(index == null) index = getID(yargs._[1], data, 'history'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].tt = null; |
|
data[index].et = null; |
|
conf.set('taskData', data); |
|
tools.td.todo.ls.all(); |
|
}) |
|
|
|
|
|
/* rm */ |
|
.command("rm", "= td task del..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, async yargs => { |
|
if(yargs._.length != 2) { |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs._[1], data, 'todo'); |
|
if(index == null) index = getID(yargs._[1], data, 'task'); |
|
if(index == null) index = getID(yargs._[1], data, 'history'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].isDel = true; |
|
conf.set('taskData', data); |
|
//tools.td.todo.ls.all(); |
|
}) |
|
|
|
/* tasks */ |
|
.command("task", "Add, del and change tasks..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.command("ls", "Show all tasks..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, yargs2 => { |
|
tools.td.task.ls.all(); |
|
}) |
|
.command("add", "td task add -n <name> -c [class]".green+" Add new task..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.option("n", { |
|
alias: "name", |
|
default: "", |
|
describe: "Task name.", |
|
demand: true, |
|
type: 'string' |
|
}) |
|
.option("c", { |
|
alias: "class", |
|
default: "", |
|
describe: "Task class.", |
|
demand: false, |
|
type: 'string' |
|
}) |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, yargs2 => { |
|
if(yargs2.n == "" && yargs2.c == ""){ |
|
console.error(boxen('Please use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
if(yargs2.n == ""){ |
|
console.error(boxen('No Task Name!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
if(yargs2.c == ""){ |
|
yargs2.c = "default"; |
|
} |
|
if(yargs2.c.length > 30){ |
|
console.error(boxen('Too Long Name!!!\nPlease shorten your task name!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
data.push({ |
|
id: md5((new Date()).valueOf()).substring(0, 6), |
|
name: yargs2.n, |
|
class: yargs2.c, |
|
st: (new Date()).valueOf(), |
|
tt: null, |
|
et: null, |
|
isDel: false |
|
}); |
|
conf.set('taskData', data); |
|
tools.td.task.ls.all(); |
|
}) |
|
|
|
.command("del", "td del -i <id>".green+" Delete task..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.option("i", { |
|
alias: "id", |
|
default: "", |
|
describe: "Task id.", |
|
demand: true, |
|
type: 'string' |
|
}) |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, async yargs2 => { |
|
if(yargs2.i == ""){ |
|
console.error(boxen('No Task ID!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs2.i, data, 'task'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].isDel = true; |
|
conf.set('taskData', data); |
|
tools.td.task.ls.all(); |
|
}) |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
console.error(boxen('Please use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
}) |
|
|
|
|
|
/* todo */ |
|
.command("todo", "Add, return and done todos..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.command("ls", "td todo ls".green+" Show all todos..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, yargs2 => { |
|
tools.td.todo.ls.all(); |
|
}) |
|
|
|
.command("add", "td todo add -i <id>".green+" Add new todo from tasks..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.option("i", { |
|
alias: "id", |
|
default: "", |
|
describe: "Task ID.", |
|
demand: true, |
|
type: 'string' |
|
}) |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, async yargs2 => { |
|
if(yargs2.i == ""){ |
|
console.error(boxen('Please use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs2.i, data, 'task'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].tt = (new Date()).valueOf(); |
|
conf.set('taskData', data); |
|
tools.td.todo.ls.all(); |
|
}) |
|
|
|
.command("return", "td todo return -i <id>".green+" Delete task..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.option("i", { |
|
alias: "id", |
|
default: "", |
|
describe: "Task id.", |
|
demand: true, |
|
type: 'string' |
|
}) |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, async yargs2 => { |
|
if(yargs2.i == ""){ |
|
console.error(boxen('No Task ID!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs2.i, data, 'todo'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].tt = null; |
|
conf.set('taskData', data); |
|
tools.td.todo.ls.all(); |
|
}) |
|
|
|
|
|
.command("done", "td todo done -i <id>".green+" Delete task..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.option("i", { |
|
alias: "id", |
|
default: "", |
|
describe: "Task id.", |
|
demand: true, |
|
type: 'string' |
|
}) |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, async yargs2 => { |
|
if(yargs2.i == ""){ |
|
console.error(boxen('No Task ID!!!\nPlease use '+'td task -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs2.i, data, 'todo'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].et = (new Date()).valueOf(); |
|
conf.set('taskData', data); |
|
tools.td.todo.ls.all(); |
|
}) |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
console.error(boxen('Please use '+'td todo -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
}) |
|
|
|
|
|
|
|
|
|
/* history */ |
|
.command("history", "Check history..", yargs => { |
|
var argv = yargs |
|
.reset() |
|
.command("ls", "td history ls".green+" Show all history..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.option("a", { |
|
alias: "ash", |
|
default: "", |
|
describe: "Show ash bin..", |
|
demand: false, |
|
type: 'string' |
|
}) |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, yargs2 => { |
|
if(yargs2.a == ""){ |
|
tools.td.history.ls.all(); |
|
}else{ |
|
tools.td.ash.ls.all(); |
|
} |
|
}) |
|
|
|
.command("return", "td history return -i <id>".green+" Return item to tasks..", yargs2 => { |
|
var argv = yargs2 |
|
.reset() |
|
.option("i", { |
|
alias: "id", |
|
default: "", |
|
describe: "Task id.", |
|
demand: true, |
|
type: 'string' |
|
}) |
|
.version(false) |
|
.help("") |
|
.argv |
|
return argv; |
|
}, async yargs2 => { |
|
if(yargs2.i == ""){ |
|
console.error(boxen('No Task ID!!!\nPlease use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
var data = conf.get('taskData'); |
|
var index = await getID(yargs2.i, data, 'history'); |
|
if(index==null){ |
|
console.error(boxen('Illegal operation!!!\nPlease use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
} |
|
data[index].tt = null; |
|
data[index].et = null; |
|
conf.set('taskData', data); |
|
tools.td.history.ls.all(); |
|
}) |
|
.version(false) |
|
.argv |
|
|
|
return argv; |
|
}, yargs => { |
|
console.error(boxen('Please use '+'td history -h '.red+'to get Help!!', {padding: 1, margin: 1, borderStyle: 'double'})); |
|
return; |
|
}) |
|
.help() |
|
.alias("h", "help") |
|
.alias("v", "version") |
|
//.recommendCommands() |
|
.epilogue("") |
|
.argv; |
|
|
|
|
|
|
|
|