From c7b6912dce6f0f9db14a6c12e2dd775d94d69c4c Mon Sep 17 00:00:00 2001 From: Kohei TAKATA Date: Sat, 20 Feb 2016 23:36:13 +0900 Subject: [PATCH 01/51] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65319a2..c16c483 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ -a, --add Adds time to a task. Example: "1h2m3s" --remove Subtract time from a task. Example: "1h2m3s" -l, --log Logs the timer task. - -r, --report Report time of the tasks, searched by key, you can report all using all as key. Also you can pass a rate to calc an amount ex: 20h, calc the hours and mulpitly by 20 + -r, --report Report time of the tasks, searched by key, you can report all using all as key. Also you can pass a rate to calc an amount ex: 20h, calc the hours and multiply by 20 -e, --export Prints the json of all tasks. ``` From 9f9c21b9a67610642c75e16d3e59149f18b27964 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 13:10:51 +0100 Subject: [PATCH 02/51] Update packages --- package.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index f186bd1..bac3256 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { "name": "time-tracker-cli", - "version": "1.1.2", + "version": "2.0.0", "description": "Tiny time tracker", - "keywords":[ - "time", - "tracker", - "timer", - "cli", - "time log", - "time logger", - "logger" + "keywords": [ + "time", + "tracker", + "timer", + "cli", + "time log", + "time logger", + "logger" ], "bin": { "timer": "./bin/timer" @@ -29,20 +29,20 @@ "license": "ISC", "devDependencies": { "babel": "^6.3.26", - "babel-cli": "^6.4.0", + "babel-cli": "^6.22.2", "babel-plugin-transform-decorators-legacy": "^1.3.4", - "babel-preset-es2015": "^6.3.13", - "babel-preset-stage-0": "^6.3.13", - "mocha": "^2.3.4", - "source-map-support": "^0.4.0" + "babel-preset-es2015": "^6.22.0", + "babel-preset-stage-0": "^6.22.0", + "mocha": "^3.2.0" }, "dependencies": { - "babel-polyfill": "^6.3.14", + "babel-polyfill": "^6.22.0", "cli-table": "^0.3.1", "commander": "^2.9.0", - "configstore": "^1.4.0", + "configstore": "^2.1.0", "flat": "^2.0.0", "moment": "^2.11.2", - "update-notifier": "^0.6.0" + "omelette": "^0.3.1", + "update-notifier": "^1.0.3" } } From 8af97215db9be10b8ac06b4d939001202f1fcc01 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 13:13:19 +0100 Subject: [PATCH 03/51] New additions: -better commands -autocomplete -internal rework of the tool -add output config for the reports -automigration of the tasks -little fixes --- bin/timer | 3 +- src/Manager.js | 99 ----------------- src/Output.js | 46 -------- src/__test__/es6.spec.js | 7 -- src/autocomplete.js | 31 ++++++ src/constants/index.js | 3 - src/core/Manager.js | 179 +++++++++++++++++++++++++++++++ src/core/Task.js | 183 ++++++++++++++++++++++++++++++++ src/core/constants.js | 5 + src/core/output.js | 70 ++++++++++++ src/{Utils.js => core/utils.js} | 5 +- src/index.js | 181 ++++++++++++++++++++++--------- 12 files changed, 604 insertions(+), 208 deletions(-) delete mode 100644 src/Manager.js delete mode 100644 src/Output.js delete mode 100644 src/__test__/es6.spec.js create mode 100644 src/autocomplete.js delete mode 100644 src/constants/index.js create mode 100644 src/core/Manager.js create mode 100644 src/core/Task.js create mode 100644 src/core/constants.js create mode 100644 src/core/output.js rename src/{Utils.js => core/utils.js} (96%) diff --git a/bin/timer b/bin/timer index 3216336..c4168cc 100755 --- a/bin/timer +++ b/bin/timer @@ -1,4 +1,3 @@ #!/usr/bin/env node 'use strict' -var t = require('../lib') -t(process) +require('../lib') diff --git a/src/Manager.js b/src/Manager.js deleted file mode 100644 index 46c8e46..0000000 --- a/src/Manager.js +++ /dev/null @@ -1,99 +0,0 @@ -import flat from 'flat' - -import moment from 'moment' -import Configstore from 'configstore' -import pkg from '../package.json' - -import {recognizeModifierTiming} from './Utils' - -export class Manager { - constructor(cfg) { - this.tasks = cfg.all.tasks - } - - getTask(name) { - return (this.tasks[name]) ? this.tasks[name] : {} - } - - storeTasks() { - config.set('tasks', this.tasks) - } - - setTask(name, obj) { - let update = {} - update[name] = obj - this.tasks = Object.assign({}, this.tasks, update) - this.storeTasks() - } - - start(name, description) { - let t = this.getTask(name) - if (!t.start) { - t.start = moment().toDate() - if (description) t.description = description - this.setTask(name, t) - } - } - - stop(name, description) { - let t = this.getTask(name) - if (!t.stop) { - t.stop = moment().toDate() - if (description) t.description = description - this.setTask(name, t) - } - } - - getTime(name) { - let t = this.getTask(name) - if (t.stop) { - return moment(t.stop).diff(moment(t.start), 'seconds') - } else { - return moment().diff(moment(t.start), 'seconds') - } - } - - modifyTask(operation, name, stringTime){ - let t = this.getTask(name) - - if (t.stop){ - - let newStop = moment(t.stop) - let parsed = recognizeModifierTiming(stringTime) - parsed.map((t)=>{ - newStop = newStop[operation](t.value, t.momentKey) - }) - - if (operation === 'subtract' && newStop.isBefore(t.start)){ - console.error('You cant subtract more time') - return - } - - t.stop = newStop - this.setTask(name, t) - } - - return t.stop - } - - search(string) { - let keys = Object.keys(this.tasks) - let tasks = [] - keys.map((key)=>{ - if (string === 'all' || key.indexOf(string) > -1){ - tasks.push({ - name: key, - task: this.tasks[key] - }) - } - }) - return tasks - } - getTasksJson() { - return flat.unflatten(this.tasks) - } -} - -const config = new Configstore(pkg.name, {tasks:{}}) - -export default new Manager(config) diff --git a/src/Output.js b/src/Output.js deleted file mode 100644 index aa46b95..0000000 --- a/src/Output.js +++ /dev/null @@ -1,46 +0,0 @@ -import moment from 'moment' -import Table from 'cli-table' - -import {humanParseDiff, recognizeModifierTiming, calcRate} from './Utils' - -export const sumarize = function(search, tasks, rate, full) { - let table = new Table({ - head: ['Duration', 'Dates', 'Task'], - chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, - colAligns: ['right', 'center', 'left'], - style: { head: ['green'] } - }); - let total = 0 - let head= `Search: ${search} \n` - - tasks.map((task, index)=>{ - let duration = moment(task.task.stop).diff(moment(task.task.start), 'seconds') - total += duration - - let outputDuration = humanParseDiff(duration) - - let name = task.name - let startTime = moment(task.task.start).format('DD/MM/YYYY') - let stopTime = moment(task.task.stop).format('DD/MM/YYYY') - if (startTime !== stopTime){ - startTime = moment(task.task.start).format('DD/MM') + '|' + moment(task.task.stop).format('DD/MM YYYY') - } - table.push([outputDuration, startTime, name]) - }) - - console.log(table.toString()); - - if (full){ - let table2 = new Table() - table2.push( - { 'Search': ['\"' + search + '\"'] }, - { 'Total time': [humanParseDiff(total)] } - ) - - if (rate){ - table2.push({ 'Rate': [calcRate(rate, total)] }) - } - - console.log(table2.toString()); - } -} diff --git a/src/__test__/es6.spec.js b/src/__test__/es6.spec.js deleted file mode 100644 index 9de53b2..0000000 --- a/src/__test__/es6.spec.js +++ /dev/null @@ -1,7 +0,0 @@ -import es6FreshModule from '../' - -describe('es6-fresh-module', () => { - it("should be awesome", () => { - es6FreshModule() - }) -}) diff --git a/src/autocomplete.js b/src/autocomplete.js new file mode 100644 index 0000000..d821cd1 --- /dev/null +++ b/src/autocomplete.js @@ -0,0 +1,31 @@ +import omelette from 'omelette' + +const autocomplete = function(config){ + + const complete = omelette("timer ") + + let allTaskKeys = function() { + this.reply(Object.keys(config.all.tasks)); + } + + complete.on("cmd", function() { + this.reply(["start", "pause", "unpause", "finish", "description", "add", "remove", "report", "log", "export"]) + }); + + complete.on("key", function(cmd) { + let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove'] + + if (keyTasks.indexOf(cmd) > -1){ + this.reply(Object.keys(config.all.tasks)); + } + }); + + complete.init(); + + if (~process.argv.indexOf('--setupCLI')) { + complete.setupShellInitFile(); + } + +} + +export default autocomplete diff --git a/src/constants/index.js b/src/constants/index.js deleted file mode 100644 index a556a1b..0000000 --- a/src/constants/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export const notStarted = 'Not started' -export const inProgress = 'In progress' -export const finished = 'Finished' diff --git a/src/core/Manager.js b/src/core/Manager.js new file mode 100644 index 0000000..5c5ad9e --- /dev/null +++ b/src/core/Manager.js @@ -0,0 +1,179 @@ +import flat from 'flat' + +import Task from './Task' +import moment from 'moment' + +import { recognizeModifierTiming } from './utils' +import { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED } from './constants' +import { sumarize, outputVertical, cliError } from './output' + +export default class Manager { + + configElements = ['format.output'] + repositories = ['tasks', 'config'] + + constructor(cfg) { + this.cfg = cfg + this.tasks = cfg.all.tasks + this.config = (cfg.all.config) ? cfg.all.config : {} + + if (!this.config['config.version']){ + this.migrateToV2(this.tasks) + .then((migratedTasks)=>{ + this.cfg.set('tasks', migratedTasks) + this.cfg.set('config', Object.assign(this.config, { + 'config.version': 2 + })) + }, cliError) + .catch(cliError) + } + } + + getTask(key) { + let task = (this.tasks[key]) ? this.tasks[key] : null + return new Task(task) + } + + storeTask(key, task){ + let update = {} + update[key] = task.get() + this.tasks = Object.assign({}, this.tasks, update) + this.cfg.set('tasks', this.tasks) + } + + startTask(key, description) { + let t = this.getTask(key) + t.start(description) + .then(() => { + this.storeTask(key, t) + console.log( + outputVertical('Task:', key, STARTED, moment().toISOString()) + ) + }, cliError) + .catch(cliError) + } + + pauseTask(key){ + let t = this.getTask(key) + t.pause() + .then(()=>{ + this.storeTask(key, t) + console.log( + outputVertical('Task:', key, PAUSED, moment().toISOString()) + ) + }, cliError) + .catch(cliError) + } + + unpauseTask(key){ + let t = this.getTask(key) + t.unpause() + .then(()=>{ + this.storeTask(key, t) + console.log( + outputVertical('Task:', key, UNPAUSED, moment().toISOString()) + ) + }, cliError) + .catch(cliError) + } + + stopTask(key, description) { + let t = this.getTask(key) + t.stop(description) + .then(()=>{ + this.storeTask(key, t) + console.log( + outputVertical('Task:', key, FINISHED, moment().toISOString()) + ) + }, cliError) + .catch(cliError) + } + + addDescription(key, text){ + let t = this.getTask(key) + t.setDescription(text) + this.storeTask(key, t) + } + + getTime(name) { + let t = this.getTask(name) + return t.getSeconds() + } + + modifyTask(operation, name, stringTime){ + let t = this.getTask(name) + t.makeOperationOverTime(operation, stringTime) + .then(()=>{ + this.storeTask(name, t) + }, cliError) + .catch(cliError) + } + + search(string) { + let keys = Object.keys(this.tasks) + let tasks = [] + keys.forEach((key)=>{ + if (string === 'all' || key.indexOf(string) > -1){ + tasks.push({ + name: key, + task: new Task(this.tasks[key]) + }) + } + }) + return tasks + } + + getTasksJson() { + return flat.unflatten(this.tasks) + } + + getConfig(){ + return this.config + } + + configure(element, value){ + + if (this.configElements.indexOf(element) < 0){ + return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `) + } + + let newCfg = { + [element]: value + } + + this.config = Object.assign({}, this.config, newCfg) + this.cfg.set('config', this.config) + + return this.config + } + + migrateToV2(tasks){ + return new Promise((resolve, reject)=>{ + Object.keys(tasks).forEach(k => { + if (!tasks[k].timings){ + reject('Config migrated') + } + + if (!tasks[k].start && !tasks[k].stop){ + reject('Config corrupted or migrated') + } + + tasks[k].timings = [{ + start: (tasks[k].start) ? tasks[k].start : null, + stop: (tasks[k].stop) ? tasks[k].stop : null + }] + + delete tasks[k].start + delete tasks[k].stop + }) + + resolve(tasks) + }) + + } + + sumarize(key, rate, full=true){ + let tasks = this.search(key) + sumarize(key, tasks, rate, full, this.config['format.output']) + } +} diff --git a/src/core/Task.js b/src/core/Task.js new file mode 100644 index 0000000..1bea713 --- /dev/null +++ b/src/core/Task.js @@ -0,0 +1,183 @@ +import moment from 'moment' + +import { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants' +import { recognizeModifierTiming } from './Utils' +import { cliError } from './output' + + +export default class Task { + constructor(task){ + this.task = (task) ? task : { + description: '', + timings: [] + } + } + + _calcTime(t){ + if (t.stop) { + return moment(t.stop).diff(moment(t.start), 'seconds') + } else { + return moment().diff(moment(t.start), 'seconds') + } + } + + _modifyTiming(time, operation){ + let timing = this.task.timings[this.task.timings.length - 1] + if (!timing){ + throw (`This task is not started, start it.`) + } + + let newStop = moment(timing.stop) + newStop = newStop[operation](time.value, time.momentKey) + + if (operation === 'subtract' && newStop.isBefore(timing.start)){ + throw('You cant subtract more time') + return + } + + this.task.timings[this.task.timings.length - 1].stop = newStop + } + + start(description){ + return new Promise((resolve, reject)=>{ + let started = false + + let timing = this.task.timings[this.task.timings.length - 1] + + if (timing && timing.start && !timing.stop) { + reject(this.error(`This task already started.`)) + } + + this.task.timings.push({ + start: moment().toDate() + }) + + this.setDescription(description) + this.setStatus(IN_PROGRESS) + this.log('start') + resolve() + }) + } + + pause(){ + return new Promise((resolve, reject)=>{ + let timing = this.task.timings[this.task.timings.length - 1] + + if (!timing){ + reject(this.error(`This task is not started, start it.`)) + } + + if (timing && timing.start && timing.stop) { + reject(this.error(`This task are ended/paused, unpaused it.`)) + } + + this.task.timings[this.task.timings.length - 1].stop = moment().toDate() + this.setStatus(PAUSED) + this.log('pause') + resolve() + }) + } + + unpause(){ + return new Promise((resolve, reject)=>{ + let timing = this.task.timings[this.task.timings.length - 1] + if (!timing){ + reject(this.error(`This task is not started, start it`)) + } + + if (timing && timing.start && !timing.stop) { + reject(this.error(`This task is started, pause/stop first`)) + } + + this.task.timings.push({ + start: moment().toDate() + }) + this.setStatus(IN_PROGRESS) + this.log('unpause') + resolve() + }) + } + + stop (description){ + return new Promise((resolve, reject)=>{ + let timing = this.task.timings[this.task.timings.length - 1] + if (!timing || timing && !timing.start){ + reject(this.error(`This task is not started, start it`)) + } + + if (timing.start && timing.stop) { + reject(this.error(`This task already ended, start/unpause it.`)) + } + + this.task.timings[this.task.timings.length - 1].stop = moment().toDate() + this.setDescription(description) + this.setStatus(FINISHED) + this.log('stop') + resolve() + }) + } + + log(operation){ + if (!this.task.log){ + this.task.log = [] + } + + this.task.log.push(`${operation}#${moment().toISOString()}`) + } + + setDescription(text){ + this.task.description = (text) ? text : (this.task.description) ? this.task.description : '' + } + + setStatus(status){ + this.task.status = status + } + + makeOperationOverTime(operation, stringTime) { + return new Promise((resolve, reject) => { + let parsed = recognizeModifierTiming(stringTime) + + try { + parsed.map((t)=>{ + this._modifyTiming(t, operation) + }) + } catch(err){ + console.error(err) + reject(this.error(`Error trying to ${operation} time to task`)) + } + this.log(`${operation}:${stringTime}`) + + resolve() + }) + } + + get(){ + return this.task + } + + getSeconds(){ + let duration = 0 + + if (this.task.timings){ + this.task.timings.forEach(timing => { + duration += this._calcTime(timing) + }) + } else { + duration = this._calcTime(this.task) + } + + return duration + } + + getStartDate(){ + if (this.task.timings){ + return this.task.timings[0].start + } else { + return this.task.start + } + } + + error(err){ + return err //+ ` \n Task: ${JSON.stringify(this.task)}` + } +} diff --git a/src/core/constants.js b/src/core/constants.js new file mode 100644 index 0000000..ac92ddd --- /dev/null +++ b/src/core/constants.js @@ -0,0 +1,5 @@ +export const STARTED = 'STARTED' +export const PAUSED = 'PAUSED' +export const UNPAUSED = 'UNPAUSED' +export const IN_PROGRESS = 'IN_PROGRESS' +export const FINISHED = 'FINISHED' diff --git a/src/core/output.js b/src/core/output.js new file mode 100644 index 0000000..293cba8 --- /dev/null +++ b/src/core/output.js @@ -0,0 +1,70 @@ +import moment from 'moment' +import Table from 'cli-table' + +import { humanParseDiff, calcRate } from './utils' + +export const sumarize = function(search, tasks, rate, full, format) { + let table = new Table({ + head: ['Duration', 'Dates', 'Task'], + chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, + colAligns: ['right', 'center', 'left'], + style: { head: ['green'] } + }); + let total = 0 + let head= `Search: ${search} \n` + + tasks.forEach((task, index) => { + let name = task.name + task = task.task + + let duration = task.getSeconds() + total += duration + + table.push([humanParseDiff(duration), moment(task.getStartDate()).format(format), name]) + }) + + console.log(table.toString()); + + if (full){ + let table2 = new Table() + table2.push( + { 'Search': ['\"' + search + '\"'] }, + { 'Total time': [humanParseDiff(total)] } + ) + + if (rate){ + table2.push({ 'Rate': [calcRate(rate, total)] }) + } + + console.log(table2.toString()); + } +} + +export const outputConfig = function (config){ + let table = new Table({ + head: ['Key', 'value'], + chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, + colAligns: ['center', 'center'], + style: { head: ['green'] } + }); + + Object.keys(config).map(e => table.push([e, config[e]])) + + console.log(table.toString()); +} + +export const outputVertical = function (...args){ + let table2 = new Table() + let key = args.splice(0, 1) + table2.push( + { [key]: args }, + ) + + return table2.toString() +} + +export const cliError = function(err) { + console.log('\x1b[31m'); // red + console.error(`Error: ${err}`) + console.log('\x1b[0m'); // end red +} diff --git a/src/Utils.js b/src/core/utils.js similarity index 96% rename from src/Utils.js rename to src/core/utils.js index 838b748..a9103b2 100644 --- a/src/Utils.js +++ b/src/core/utils.js @@ -8,6 +8,7 @@ export const recognizeModifierTiming = function (string){ momentKey: arr[2] }) } + return res } @@ -35,8 +36,8 @@ export const humanParseDiff = function(secs) { let hours = Math.floor(secs / 3600) let minutes = Math.floor((secs - (hours * 3600)) / 60) let seconds = secs - (hours * 3600) - (minutes * 60) - hours = (hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h ') - minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm ') + hours = (hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h') + minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm') seconds = (seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's') return hours + minutes + seconds } diff --git a/src/index.js b/src/index.js index 14cd0e4..c2b6dab 100644 --- a/src/index.js +++ b/src/index.js @@ -2,58 +2,141 @@ import 'babel-polyfill' import program from 'commander' import updateNotifier from 'update-notifier' +import Configstore from 'configstore' +import pkg from '../package.json' -import Task from './Task' -import {sumarize} from './Output' -import {humanParseDiff} from './Utils' +import Manager from './core/Manager' +import { humanParseDiff } from './core/utils' +import { outputVertical, cliError } from './core/output' -import timer from './Manager' -import pkg from '../package.json' +import autocomplete from './autocomplete' -updateNotifier({pkg}).notify() - -module.exports = function createTimer (p) { - - program - .version(pkg.version) - .description('Tiny time tracker for projects') - - .option('-s, --start ', 'Start the timer task.') - .option('-f, --finish ', 'Stops the timer task.') - .option('-d, --description ', 'Adds a description for the task only in start/stop methods.') - - .option('-a, --add ', 'Adds time to a task. Example: "1h2m3s"') - .option('--remove ', 'Subtract time from a task. Example: "1h2m3s"') - - .option('-l, --log ', 'Logs the timer task.') - .option('-r, --report ', 'Report time of the tasks, searched by key, you can report all using all as key. Also you can pass a rate to calc an amount ex: 20h, calc the hours and mulpitly by 20') - .option('-e, --export', 'Prints the json of all tasks.') - - .parse(p.argv) - - let description - if (program.start){ - description = program.description || program.args[0] - timer.start(program.start, description) - } else if (program.finish){ - description = program.description || program.args[0] - timer.stop(program.finish, description) - console.log(humanParseDiff(timer.getTime(program.finish))) - } else if (program.add){ - timer.modifyTask('add', program.add, program.args[0]) - sumarize(program.add, timer.search(program.add)) - } else if (program.remove){ - timer.modifyTask('subtract', program.remove, program.args[0]) - sumarize(program.remove, timer.search(program.remove)) - } else if (program.log){ - setInterval(function() { - process.stdout.clearLine() - process.stdout.write(`\r Task: ${program.log} ${humanParseDiff(timer.getTime(program.log))}`) - }, 100) - } else if (program.report){ - sumarize(program.report, timer.search(program.report), program.args[0], true) - } else if (program.export){ - console.log(JSON.stringify(timer.getTasksJson(), null, 4)) +const config = new Configstore(pkg.name, { + tasks:{}, + config:{ + 'format.output': 'DD/MM', + 'config.version': '2' } +}) + +updateNotifier({ pkg }).notify() + +const manager = new Manager(config) +autocomplete(config) + +//Exec +let EXEC = false + +program + .version(pkg.version) + .description('Tiny time tracker for projects') + +program + .command('start [description]') + .description('Start task with a description.') + .alias('s') + .action(function(key, description) { + description = (description) ? Array.isArray(description) ? description.join(' ') : description : null + manager.startTask(key, description) + EXEC = true + }) + +program + .command('pause ') + .description('Pause task') + .alias('p') + .action(function(key) { + manager.pauseTask(key) + EXEC = true + }) + +program + .command('unpause ') + .description('Unpause task') + .alias('up') + .action(function(key) { + manager.unpauseTask(key) + EXEC = true + }) + + +program + .command('finish [description]') + .description('Stop task, you can add a description') + .alias('f') + .action(function(key, description) { + manager.stopTask(key, description) + EXEC = true + }) + +program + .command('description ') + .description('Add description to your task.') + .alias('d') + .action(function(key, text) { + text = Array.isArray(text) ? text.join(' ') : text + manager.addDescription(key, text) + EXEC = true + }) + +program + .command('add ') + .description('Adds time to a task. Example: "1h2m3s"') + .action(function(key, stringTime) { + manager.modifyTask('add', key, stringTime) + manager.sumarize(key, manager.search(key), false) + EXEC = true + }) + +program + .command('remove ') + .description('Subtract time to a task. Example: "1h2m3s"') + .alias('sub') + .action(function(key, stringTime) { + manager.modifyTask('subtract', key, stringTime) + manager.sumarize(key, manager.search(key), false) + EXEC = true + }) + +program + .command('report [tasks] [rate]') + .description('Report time of the tasks, searched by key. Can pass a rate (1h).') + .alias('r') + .action(function(tasks, rate) { + tasks = (tasks) ? tasks : 'all' + manager.sumarize(tasks, rate) + EXEC = true + }) + + + +program + .command('log ') + .description('Logs the time of the task') + .alias('l') + .action(function(key) { + setInterval(() => { + let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key))) + process.stdout.write(text) + process.stdout.moveCursor(0,-2) + }, 1000) + EXEC = true + }) + +program + .command('export') + .description('Export the tasks in a JSON') + .alias('e') + .action(function(key) { + console.log(JSON.stringify(manager.getTasksJson(), null, 4)) + EXEC = true + }) + +program + .parse(process.argv); +if (program.args.length === 0 || !EXEC) { + cliError('You must use a valid command.') + program.outputHelp() + process.exit(1) } From f571e8decc05166c10d0532eb5991b23668af7ea Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 13:13:39 +0100 Subject: [PATCH 04/51] new build --- lib/HelloWorld.js | 16 --- lib/HelloWorld.js.map | 1 - lib/Output.js | 58 -------- lib/Output.js.map | 1 - lib/Taks.js | 2 - lib/Taks.js.map | 1 - lib/Task.js | 65 --------- lib/Task.js.map | 1 - lib/Timer.js | 81 ----------- lib/Timer.js.map | 1 - lib/Utils.js.map | 1 - lib/__test__/es6.spec.js | 14 -- lib/__test__/es6.spec.js.map | 1 - lib/__test__/mocker.spec.js | 14 -- lib/__test__/mocker.spec.js.map | 1 - lib/autocomplete.js | 41 ++++++ lib/autocomplete.js.map | 1 + lib/constants/index.js | 9 -- lib/constants/index.js.map | 1 - lib/core/Manager.js | 219 ++++++++++++++++++++++++++++++ lib/core/Manager.js.map | 1 + lib/core/Task.js | 234 ++++++++++++++++++++++++++++++++ lib/core/Task.js.map | 1 + lib/core/constants.js | 11 ++ lib/core/constants.js.map | 1 + lib/core/output.js | 88 ++++++++++++ lib/core/output.js.map | 1 + lib/{Utils.js => core/utils.js} | 11 +- lib/core/utils.js.map | 1 + lib/index.js | 129 +++++++++++++----- lib/index.js.map | 2 +- lib/manager.js | 151 --------------------- lib/manager.js.map | 1 - 33 files changed, 699 insertions(+), 462 deletions(-) delete mode 100644 lib/HelloWorld.js delete mode 100644 lib/HelloWorld.js.map delete mode 100644 lib/Output.js delete mode 100644 lib/Output.js.map delete mode 100644 lib/Taks.js delete mode 100644 lib/Taks.js.map delete mode 100644 lib/Task.js delete mode 100644 lib/Task.js.map delete mode 100644 lib/Timer.js delete mode 100644 lib/Timer.js.map delete mode 100644 lib/Utils.js.map delete mode 100644 lib/__test__/es6.spec.js delete mode 100644 lib/__test__/es6.spec.js.map delete mode 100644 lib/__test__/mocker.spec.js delete mode 100644 lib/__test__/mocker.spec.js.map create mode 100644 lib/autocomplete.js create mode 100644 lib/autocomplete.js.map delete mode 100644 lib/constants/index.js delete mode 100644 lib/constants/index.js.map create mode 100644 lib/core/Manager.js create mode 100644 lib/core/Manager.js.map create mode 100644 lib/core/Task.js create mode 100644 lib/core/Task.js.map create mode 100644 lib/core/constants.js create mode 100644 lib/core/constants.js.map create mode 100644 lib/core/output.js create mode 100644 lib/core/output.js.map rename lib/{Utils.js => core/utils.js} (91%) create mode 100644 lib/core/utils.js.map delete mode 100644 lib/manager.js delete mode 100644 lib/manager.js.map diff --git a/lib/HelloWorld.js b/lib/HelloWorld.js deleted file mode 100644 index 52ef308..0000000 --- a/lib/HelloWorld.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var HelloWorld = function HelloWorld() { - _classCallCheck(this, HelloWorld); - - console.log('Hello Magician!'); -}; - -exports.default = HelloWorld; -//# sourceMappingURL=HelloWorld.js.map \ No newline at end of file diff --git a/lib/HelloWorld.js.map b/lib/HelloWorld.js.map deleted file mode 100644 index 853abfd..0000000 --- a/lib/HelloWorld.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/HelloWorld.js"],"names":[],"mappings":";;;;;;;;IACqB,UAAU,GAC3B,SADiB,UAAU,GACd;0BADI,UAAU;;AAEvB,WAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;CAClC;;kBAHgB,UAAU","file":"HelloWorld.js","sourcesContent":["\nexport default class HelloWorld {\n constructor(){\n console.log('Hello Magician!')\n }\n}\n"]} \ No newline at end of file diff --git a/lib/Output.js b/lib/Output.js deleted file mode 100644 index 9ea43b2..0000000 --- a/lib/Output.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.sumarize = undefined; - -var _moment = require('moment'); - -var _moment2 = _interopRequireDefault(_moment); - -var _cliTable = require('cli-table'); - -var _cliTable2 = _interopRequireDefault(_cliTable); - -var _Utils = require('./Utils'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full) { - var table = new _cliTable2.default({ - head: ['Duration', 'Dates', 'Task'], - chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, - colAligns: ['right', 'center', 'left'], - style: { head: ['green'] } - }); - var total = 0; - var head = 'Search: ' + search + ' \n'; - - tasks.map(function (task, index) { - var duration = (0, _moment2.default)(task.task.stop).diff((0, _moment2.default)(task.task.start), 'seconds'); - total += duration; - - var outputDuration = (0, _Utils.humanParseDiff)(duration); - - var name = task.name; - var startTime = (0, _moment2.default)(task.task.start).format('DD/MM/YYYY'); - var stopTime = (0, _moment2.default)(task.task.stop).format('DD/MM/YYYY'); - if (startTime !== stopTime) { - startTime = (0, _moment2.default)(task.task.start).format('DD/MM') + '|' + (0, _moment2.default)(task.task.stop).format('DD/MM YYYY'); - } - table.push([outputDuration, startTime, name]); - }); - - console.log(table.toString()); - - if (full) { - var table2 = new _cliTable2.default(); - table2.push({ 'Search': ['\"' + search + '\"'] }, { 'Total time': [(0, _Utils.humanParseDiff)(total)] }); - - if (rate) { - table2.push({ 'Rate': [(0, _Utils.calcRate)(rate, total)] }); - } - - console.log(table2.toString()); - } -}; -//# sourceMappingURL=Output.js.map \ No newline at end of file diff --git a/lib/Output.js.map b/lib/Output.js.map deleted file mode 100644 index d427b00..0000000 --- a/lib/Output.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/Output.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAKO,IAAM,8BAAW,SAAX,QAAW,CAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,IAA9B,EAAoC;AACxD,QAAI,QAAQ,uBAAU;AAClB,cAAM,CAAC,UAAD,EAAa,OAAb,EAAsB,MAAtB,CAAN;AACA,eAAO,EAAC,OAAO,EAAP,EAAW,YAAY,EAAZ,EAAgB,WAAW,EAAX,EAAe,aAAa,EAAb,EAAlD;AACA,mBAAW,CAAC,OAAD,EAAU,QAAV,EAAoB,MAApB,CAAX;AACA,eAAO,EAAE,MAAM,CAAC,OAAD,CAAN,EAAT;KAJQ,CAAR,CADoD;AAOxD,QAAI,QAAQ,CAAR,CAPoD;AAQxD,QAAI,oBAAiB,cAAjB,CARoD;;AAUxD,UAAM,GAAN,CAAU,UAAC,IAAD,EAAO,KAAP,EAAe;AACrB,YAAI,WAAW,sBAAO,KAAK,IAAL,CAAU,IAAV,CAAP,CAAuB,IAAvB,CAA4B,sBAAO,KAAK,IAAL,CAAU,KAAV,CAAnC,EAAqD,SAArD,CAAX,CADiB;AAErB,iBAAS,QAAT,CAFqB;;AAIrB,YAAI,iBAAiB,2BAAe,QAAf,CAAjB,CAJiB;;AAMrB,YAAI,OAAO,KAAK,IAAL,CANU;AAOrB,YAAI,YAAY,sBAAO,KAAK,IAAL,CAAU,KAAV,CAAP,CAAwB,MAAxB,CAA+B,YAA/B,CAAZ,CAPiB;AAQrB,YAAI,WAAW,sBAAO,KAAK,IAAL,CAAU,IAAV,CAAP,CAAuB,MAAvB,CAA8B,YAA9B,CAAX,CARiB;AASrB,YAAI,cAAc,QAAd,EAAuB;AACvB,wBAAY,sBAAO,KAAK,IAAL,CAAU,KAAV,CAAP,CAAwB,MAAxB,CAA+B,OAA/B,IAA0C,GAA1C,GAAgD,sBAAO,KAAK,IAAL,CAAU,IAAV,CAAP,CAAuB,MAAvB,CAA8B,YAA9B,CAAhD,CADW;SAA3B;AAGA,cAAM,IAAN,CAAW,CAAC,cAAD,EAAiB,SAAjB,EAA4B,IAA5B,CAAX,EAZqB;KAAf,CAAV,CAVwD;;AAyBxD,YAAQ,GAAR,CAAY,MAAM,QAAN,EAAZ,EAzBwD;;AA2BxD,QAAI,IAAJ,EAAS;AACL,YAAI,SAAS,wBAAT,CADC;AAEL,eAAO,IAAP,CACI,EAAE,UAAU,CAAC,OAAO,MAAP,GAAgB,IAAhB,CAAX,EADN,EAEI,EAAE,cAAc,CAAC,2BAAe,KAAf,CAAD,CAAd,EAFN,EAFK;;AAOL,YAAI,IAAJ,EAAS;AACL,mBAAO,IAAP,CAAY,EAAE,QAAQ,CAAC,qBAAS,IAAT,EAAe,KAAf,CAAD,CAAR,EAAd,EADK;SAAT;;AAIA,gBAAQ,GAAR,CAAY,OAAO,QAAP,EAAZ,EAXK;KAAT;CA3BoB","file":"Output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table'\n\nimport {humanParseDiff, recognizeModifierTiming, calcRate} from './Utils'\n\nexport const sumarize = function(search, tasks, rate, full) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['right', 'center', 'left'],\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.map((task, index)=>{\n let duration = moment(task.task.stop).diff(moment(task.task.start), 'seconds')\n total += duration\n\n let outputDuration = humanParseDiff(duration)\n\n let name = task.name\n let startTime = moment(task.task.start).format('DD/MM/YYYY')\n let stopTime = moment(task.task.stop).format('DD/MM/YYYY')\n if (startTime !== stopTime){\n startTime = moment(task.task.start).format('DD/MM') + '|' + moment(task.task.stop).format('DD/MM YYYY')\n }\n table.push([outputDuration, startTime, name])\n })\n\n console.log(table.toString());\n\n if (full){\n let table2 = new Table()\n table2.push(\n { 'Search': ['\\\"' + search + '\\\"'] },\n { 'Total time': [humanParseDiff(total)] }\n )\n\n if (rate){\n table2.push({ 'Rate': [calcRate(rate, total)] })\n }\n\n console.log(table2.toString());\n }\n}\n"]} \ No newline at end of file diff --git a/lib/Taks.js b/lib/Taks.js deleted file mode 100644 index 8b86c12..0000000 --- a/lib/Taks.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -//# sourceMappingURL=Taks.js.map \ No newline at end of file diff --git a/lib/Taks.js.map b/lib/Taks.js.map deleted file mode 100644 index d115d59..0000000 --- a/lib/Taks.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"Taks.js","sourcesContent":[]} \ No newline at end of file diff --git a/lib/Task.js b/lib/Task.js deleted file mode 100644 index a467311..0000000 --- a/lib/Task.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = undefined; - -var _moment = require('moment'); - -var _moment2 = _interopRequireDefault(_moment); - -var _constants = require('./constants'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Task = function () { - function Task(task) { - _classCallCheck(this, Task); - - this.startT = task.start ? (0, _moment2.default)(task.start) : null; - this.stopT = task.stop ? (0, _moment2.default)(task.stop) : null; - - if (task.start && !task.stop) { - this.status = _constants.inProgress; - } - - if (task.start && task.stop) { - this.status = _constants.finished; - } - } - - _createClass(Task, [{ - key: 'start', - value: function start() { - if (!this.startT) { - this.startT = (0, _moment2.default)().toDate(); - } - } - }, { - key: 'stop', - value: function stop() { - if (!this.stopT) { - this.stopT = (0, _moment2.default)().toDate(); - } - } - }, { - key: 'getTime', - value: function getTime() { - if (this.stop) { - return this.stop.diff(this.startT, 'seconds'); - } else { - return (0, _moment2.default)().diff(this.startT, 'seconds'); - } - } - }]); - - return Task; -}(); - -exports.default = Task; -//# sourceMappingURL=Task.js.map \ No newline at end of file diff --git a/lib/Task.js.map b/lib/Task.js.map deleted file mode 100644 index 7f187e3..0000000 --- a/lib/Task.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/Task.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;IAIqB;AACjB,aADiB,IACjB,CAAY,IAAZ,EAAkB;8BADD,MACC;;AACd,aAAK,MAAL,GAAc,IAAC,CAAK,KAAL,GAAe,sBAAO,KAAK,KAAL,CAAvB,GAAqC,IAArC,CADA;AAEd,aAAK,KAAL,GAAa,IAAC,CAAK,IAAL,GAAc,sBAAO,KAAK,IAAL,CAAtB,GAAmC,IAAnC,CAFC;;AAId,YAAI,KAAK,KAAL,IAAc,CAAC,KAAK,IAAL,EAAW;AAAE,iBAAK,MAAL,yBAAF;SAA9B;;AAEA,YAAI,KAAK,KAAL,IAAc,KAAK,IAAL,EAAW;AAAE,iBAAK,MAAL,uBAAF;SAA7B;KANJ;;iBADiB;;gCAUT;AACJ,gBAAI,CAAC,KAAK,MAAL,EAAa;AACd,qBAAK,MAAL,GAAc,wBAAS,MAAT,EAAd,CADc;aAAlB;;;;+BAKG;AACH,gBAAI,CAAC,KAAK,KAAL,EAAY;AACb,qBAAK,KAAL,GAAa,wBAAS,MAAT,EAAb,CADa;aAAjB;;;;kCAKM;AACN,gBAAI,KAAK,IAAL,EAAW;AACX,uBAAO,KAAK,IAAL,CAAU,IAAV,CAAe,KAAK,MAAL,EAAa,SAA5B,CAAP,CADW;aAAf,MAEO;AACH,uBAAO,wBAAS,IAAT,CAAc,KAAK,MAAL,EAAa,SAA3B,CAAP,CADG;aAFP;;;;WAvBa","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport {notStarted, inProgress, finished} from './constants'\n\nexport default class Task {\n constructor(task) {\n this.startT = (task.start) ? moment(task.start) : null\n this.stopT = (task.stop) ? moment(task.stop) : null\n\n if (task.start && !task.stop) { this.status = inProgress }\n\n if (task.start && task.stop) { this.status = finished }\n }\n\n start() {\n if (!this.startT) {\n this.startT = moment().toDate()\n }\n }\n\n stop() {\n if (!this.stopT) {\n this.stopT = moment().toDate()\n }\n }\n\n getTime() {\n if (this.stop) {\n return this.stop.diff(this.startT, 'seconds')\n } else {\n return moment().diff(this.startT, 'seconds')\n }\n }\n}\n"]} \ No newline at end of file diff --git a/lib/Timer.js b/lib/Timer.js deleted file mode 100644 index 1459761..0000000 --- a/lib/Timer.js +++ /dev/null @@ -1,81 +0,0 @@ -'use strict'; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = undefined; - -var _moment = require('moment'); - -var _moment2 = _interopRequireDefault(_moment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Timer = function () { - function Timer(tasks) { - _classCallCheck(this, Timer); - - this.tasks = tasks; - } - - _createClass(Timer, [{ - key: 'getTasks', - value: function getTasks() { - return this.tasks; - } - }, { - key: 'getTask', - value: function getTask(name) { - return this.tasks[name] ? this.tasks[name] : {}; - } - }, { - key: 'setTask', - value: function setTask(name, obj) { - var update = {}; - update[name] = obj; - this.tasks = Object.assign({}, this.tasks, update); - } - }, { - key: 'start', - value: function start(name) { - var t = this.getTask(name); - if (!t.start) { - this.setTask(name, { start: (0, _moment2.default)() }); - } - } - }, { - key: 'stop', - value: function stop(name) { - var t = this.getTask(name); - if (!t.stop && t.start) { - this.setTask(name, { start: t.start, stop: (0, _moment2.default)() }); - } - } - }, { - key: 'getTime', - value: function getTime(name) { - var t = this.getTask(name); - if (t.start) { - return (0, _moment2.default)().diff(t.start, 'seconds'); - } - } - }, { - key: 'humanParseDiff', - value: function humanParseDiff(secs) { - var hours = Math.floor(secs / 3600); - var minutes = Math.floor((secs - hours * 3600) / 60); - var seconds = secs - hours * 3600 - minutes * 60; - - return (hours < 10 ? "0" + hours : hours) + "h " + (minutes < 10 ? "0" + minutes : minutes) + "m " + (seconds < 10 ? "0" + seconds : seconds) + "s"; - } - }]); - - return Timer; -}(); - -exports.default = Timer; -//# sourceMappingURL=Timer.js.map \ No newline at end of file diff --git a/lib/Timer.js.map b/lib/Timer.js.map deleted file mode 100644 index c1e685f..0000000 --- a/lib/Timer.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/Timer.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;IAEqB;AACjB,aADiB,KACjB,CAAY,KAAZ,EAAkB;8BADD,OACC;;AACd,aAAK,KAAL,GAAa,KAAb,CADc;KAAlB;;iBADiB;;mCAIP;AACN,mBAAO,KAAK,KAAL,CADD;;;;gCAGF,MAAK;AACT,mBAAO,IAAC,CAAK,KAAL,CAAW,IAAX,CAAD,GAAqB,KAAK,KAAL,CAAW,IAAX,CAArB,GAAwC,EAAxC,CADE;;;;gCAGL,MAAM,KAAI;AACd,gBAAI,SAAS,EAAT,CADU;AAEd,mBAAO,IAAP,IAAe,GAAf,CAFc;AAGd,iBAAK,KAAL,GAAa,OAAO,MAAP,CAAc,EAAd,EAAkB,KAAK,KAAL,EAAY,MAA9B,CAAb,CAHc;;;;8BAKZ,MAAK;AACP,gBAAI,IAAI,KAAK,OAAL,CAAa,IAAb,CAAJ,CADG;AAEP,gBAAI,CAAC,EAAE,KAAF,EAAQ;AACT,qBAAK,OAAL,CAAa,IAAb,EAAmB,EAAC,OAAO,uBAAP,EAApB,EADS;aAAb;;;;6BAIC,MAAK;AACN,gBAAI,IAAI,KAAK,OAAL,CAAa,IAAb,CAAJ,CADE;AAEN,gBAAI,CAAC,EAAE,IAAF,IAAU,EAAE,KAAF,EAAQ;AACnB,qBAAK,OAAL,CAAa,IAAb,EAAmB,EAAC,OAAO,EAAE,KAAF,EAAS,MAAM,uBAAN,EAApC,EADmB;aAAvB;;;;gCAII,MAAK;AACT,gBAAI,IAAI,KAAK,OAAL,CAAa,IAAb,CAAJ,CADK;AAET,gBAAI,EAAE,KAAF,EAAS;AACT,uBAAO,wBAAS,IAAT,CAAc,EAAE,KAAF,EAAS,SAAvB,CAAP,CADS;aAAb;;;;uCAIW,MAAK;AAChB,gBAAI,QAAU,KAAK,KAAL,CAAW,OAAO,IAAP,CAArB,CADY;AAEhB,gBAAI,UAAU,KAAK,KAAL,CAAW,CAAC,OAAQ,QAAQ,IAAR,CAAT,GAA0B,EAA1B,CAArB,CAFY;AAGhB,gBAAI,UAAU,OAAQ,QAAQ,IAAR,GAAiB,UAAU,EAAV,CAHvB;;AAKhB,mBAAO,CAAC,QAAQ,EAAR,GAAa,MAAM,KAAN,GAAc,KAA3B,CAAD,GAAqC,IAArC,IAA6C,UAAU,EAAV,GAAe,MAAM,OAAN,GAAgB,OAA/B,CAA7C,GAAuF,IAAvF,IAA+F,UAAW,EAAX,GAAgB,MAAM,OAAN,GAAgB,OAAhC,CAA/F,GAA0I,GAA1I,CALS;;;;WAjCH","file":"Timer.js","sourcesContent":["import moment from 'moment'\n\nexport default class Timer {\n constructor(tasks){\n this.tasks = tasks\n }\n getTasks(){\n return this.tasks\n }\n getTask(name){\n return (this.tasks[name]) ? this.tasks[name] : {}\n }\n setTask(name, obj){\n let update = {}\n update[name] = obj\n this.tasks = Object.assign({}, this.tasks, update)\n }\n start(name){\n let t = this.getTask(name)\n if (!t.start){\n this.setTask(name, {start: moment()})\n }\n }\n stop(name){\n let t = this.getTask(name)\n if (!t.stop && t.start){\n this.setTask(name, {start: t.start, stop: moment()})\n }\n }\n getTime(name){\n let t = this.getTask(name)\n if (t.start) {\n return moment().diff(t.start, 'seconds');\n }\n }\n humanParseDiff(secs){\n let hours = Math.floor(secs / 3600);\n let minutes = Math.floor((secs - (hours * 3600)) / 60);\n let seconds = secs - (hours * 3600) - (minutes * 60);\n\n return (hours < 10 ? \"0\" + hours : hours) + \"h \" + (minutes < 10 ? \"0\" + minutes : minutes) + \"m \" + (seconds < 10 ? \"0\" + seconds : seconds) + \"s\";\n }\n}\n"]} \ No newline at end of file diff --git a/lib/Utils.js.map b/lib/Utils.js.map deleted file mode 100644 index a115095..0000000 --- a/lib/Utils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/Utils.js"],"names":[],"mappings":";;;;;AAAO,IAAM,4DAA0B,SAA1B,uBAA0B,CAAU,MAAV,EAAiB;AACpD,QAAI,IAAI,kBAAJ,CADgD;AAEpD,QAAI,eAAJ,CAFoD;AAGpD,QAAI,MAAM,EAAN,CAHgD;AAIpD,WAAO,CAAC,MAAM,EAAE,IAAF,CAAO,MAAP,CAAN,CAAD,KAA2B,IAA3B,EAAiC;AACpC,YAAI,IAAJ,CAAS;AACL,mBAAO,IAAI,CAAJ,CAAP;AACA,uBAAW,IAAI,CAAJ,CAAX;SAFJ,EADoC;KAAxC;AAMA,WAAO,GAAP,CAVoD;CAAjB;;AAahC,IAAM,8BAAW,SAAX,QAAW,CAAU,IAAV,EAAgB,KAAhB,EAAsB;AAC1C,QAAI,kBAAJ,CAD0C;AAE1C,QAAI,MAAM,KAAK,MAAL,CAAY,KAAK,MAAL,GAAc,CAAd,CAAlB,CAFsC;AAG1C,QAAI,QAAQ,KAAK,KAAL,CAAW,CAAX,EAAc,KAAK,MAAL,GAAc,CAAd,CAAtB,CAHsC;;AAK1C,YAAQ,GAAR;AACI,aAAK,GAAL;AACI,qBAAS,KAAC,GAAM,EAAN,GAAS,EAAT,GAAa,WAAW,KAAX,CAAd,CADb;AAEI,kBAFJ;AADJ,aAIS,GAAL;AACI,qBAAS,KAAC,GAAM,EAAN,GAAU,WAAW,KAAX,CAAX,CADb;AAEI,kBAFJ;AAJJ,aAOS,GAAL;AACI,qBAAS,QAAM,WAAW,KAAX,CAAN,CADb;AAEI,kBAFJ;AAPJ,KAL0C;;AAiB1C,WAAO,OAAO,OAAP,CAAe,CAAf,CAAP,CAjB0C;CAAtB;;AAoBjB,IAAM,0CAAiB,SAAjB,cAAiB,CAAS,IAAT,EAAe;AACzC,QAAI,QAAU,KAAK,KAAL,CAAW,OAAO,IAAP,CAArB,CADqC;AAEzC,QAAI,UAAU,KAAK,KAAL,CAAW,CAAC,OAAQ,QAAQ,IAAR,CAAT,GAA0B,EAA1B,CAArB,CAFqC;AAGzC,QAAI,UAAU,OAAQ,QAAQ,IAAR,GAAiB,UAAU,EAAV,CAHE;AAIzC,YAAS,SAAS,CAAT,GAAa,EAAb,GAAkB,CAAC,QAAQ,EAAR,GAAa,MAAM,KAAN,GAAc,KAA3B,CAAD,GAAqC,IAArC,CAJc;AAKzC,cAAW,OAAC,IAAW,CAAX,IAAgB,SAAS,EAAT,GAAe,EAAhC,GAAqC,CAAC,UAAU,EAAV,GAAe,MAAM,OAAN,GAAgB,OAA/B,CAAD,GAA2C,IAA3C,CALP;AAMzC,cAAW,WAAW,CAAX,GAAe,EAAf,GAAoB,CAAC,UAAW,EAAX,GAAgB,MAAM,OAAN,GAAgB,OAAhC,CAAD,GAA4C,GAA5C,CANU;AAOzC,WAAO,QAAQ,OAAR,GAAkB,OAAlB,CAPkC;CAAf","file":"Utils.js","sourcesContent":["export const recognizeModifierTiming = function (string){\n let r = /(\\d{1,})([hms])/g\n let arr\n let res = []\n while ((arr = r.exec(string)) !== null) {\n res.push({\n value: arr[1],\n momentKey: arr[2]\n })\n }\n return res\n}\n\nexport const calcRate = function (rate, total){\n let amount\n let mod = rate.substr(rate.length - 1)\n let value = rate.slice(0, rate.length - 1)\n\n switch (mod) {\n case 'h':\n amount = (total/60/60)*parseFloat(value)\n break;\n case 'm':\n amount = (total/60)*parseFloat(value)\n break;\n case 's':\n amount = total*parseFloat(value)\n break;\n }\n\n return amount.toFixed(2)\n}\n\nexport const humanParseDiff = function(secs) {\n let hours = Math.floor(secs / 3600)\n let minutes = Math.floor((secs - (hours * 3600)) / 60)\n let seconds = secs - (hours * 3600) - (minutes * 60)\n hours = (hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h ')\n minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm ')\n seconds = (seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's')\n return hours + minutes + seconds\n}\n"]} \ No newline at end of file diff --git a/lib/__test__/es6.spec.js b/lib/__test__/es6.spec.js deleted file mode 100644 index 2632472..0000000 --- a/lib/__test__/es6.spec.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var _ = require('../'); - -var _2 = _interopRequireDefault(_); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -describe('es6-fresh-module', function () { - it("should be awesome", function () { - (0, _2.default)(); - }); -}); -//# sourceMappingURL=es6.spec.js.map \ No newline at end of file diff --git a/lib/__test__/es6.spec.js.map b/lib/__test__/es6.spec.js.map deleted file mode 100644 index 3da4533..0000000 --- a/lib/__test__/es6.spec.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/__test__/es6.spec.js"],"names":[],"mappings":";;;;;;;;AAEA,SAAS,kBAAT,EAA6B,YAAM;AACjC,KAAG,mBAAH,EAAwB,YAAM;AAC5B,sBAD4B;GAAN,CAAxB,CADiC;CAAN,CAA7B","file":"es6.spec.js","sourcesContent":["import es6FreshModule from '../'\n\ndescribe('es6-fresh-module', () => {\n it(\"should be awesome\", () => {\n es6FreshModule()\n })\n})\n"]} \ No newline at end of file diff --git a/lib/__test__/mocker.spec.js b/lib/__test__/mocker.spec.js deleted file mode 100644 index bac91ba..0000000 --- a/lib/__test__/mocker.spec.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var _ = require('../'); - -var _2 = _interopRequireDefault(_); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -describe('es6-fresh-module', function () { - it("should be awesome", function () { - (0, _2.default)(); - }); -}); -//# sourceMappingURL=mocker.spec.js.map \ No newline at end of file diff --git a/lib/__test__/mocker.spec.js.map b/lib/__test__/mocker.spec.js.map deleted file mode 100644 index 34941ff..0000000 --- a/lib/__test__/mocker.spec.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/__test__/mocker.spec.js"],"names":[],"mappings":";;;;;;;;AAEA,QAAQ,CAAC,kBAAkB,EAAE,YAAM;AACjC,IAAE,CAAC,mBAAmB,EAAE,YAAM;AAC5B,qBAAgB,CAAA;GACjB,CAAC,CAAA;CACH,CAAC,CAAA","file":"mocker.spec.js","sourcesContent":["import es6FreshModule from '../'\n\ndescribe('es6-fresh-module', () => {\n it(\"should be awesome\", () => {\n es6FreshModule()\n })\n})\n"]} \ No newline at end of file diff --git a/lib/autocomplete.js b/lib/autocomplete.js new file mode 100644 index 0000000..cd21ddb --- /dev/null +++ b/lib/autocomplete.js @@ -0,0 +1,41 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _omelette = require("omelette"); + +var _omelette2 = _interopRequireDefault(_omelette); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var autocomplete = function autocomplete(config) { + + var complete = (0, _omelette2.default)("timer "); + + var allTaskKeys = function allTaskKeys() { + this.reply(Object.keys(config.all.tasks)); + }; + + complete.on("cmd", function () { + this.reply(["start", "pause", "unpause", "finish", "description", "add", "remove", "report", "log", "export"]); + }); + + complete.on("key", function (cmd) { + var keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']; + + if (keyTasks.indexOf(cmd) > -1) { + this.reply(Object.keys(config.all.tasks)); + } + }); + + complete.init(); + + if (~process.argv.indexOf('--setupCLI')) { + complete.setupShellInitFile(); + } +}; + +exports.default = autocomplete; +//# sourceMappingURL=autocomplete.js.map \ No newline at end of file diff --git a/lib/autocomplete.js.map b/lib/autocomplete.js.map new file mode 100644 index 0000000..e68f8ef --- /dev/null +++ b/lib/autocomplete.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","complete","allTaskKeys","reply","Object","keys","all","tasks","on","cmd","keyTasks","indexOf","init","process","argv","setupShellInitFile"],"mappings":";;;;;;AAAA;;;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAgB;;AAEjC,QAAMC,WAAW,wBAAS,mBAAT,CAAjB;;AAEA,QAAIC,cAAc,SAAdA,WAAc,GAAW;AACzB,aAAKC,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH,KAFD;;AAIAN,aAASO,EAAT,CAAY,KAAZ,EAAmB,YAAW;AAC1B,aAAKL,KAAL,CAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,QAA9D,EAAwE,QAAxE,EAAkF,KAAlF,EAAyF,QAAzF,CAAX;AACH,KAFD;;AAIAF,aAASO,EAAT,CAAY,KAAZ,EAAmB,UAASC,GAAT,EAAc;AAC7B,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,GAAjB,IAAwB,CAAC,CAA7B,EAA+B;AAC3B,iBAAKN,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH;AACJ,KAND;;AAQAN,aAASW,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaH,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCV,iBAASc,kBAAT;AACH;AAEJ,CA1BD;;kBA4BehB,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\n\nconst autocomplete = function(config){\n\n const complete = omelette(\"timer \")\n\n let allTaskKeys = function() {\n this.reply(Object.keys(config.all.tasks));\n }\n\n complete.on(\"cmd\", function() {\n this.reply([\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"remove\", \"report\", \"log\", \"export\"])\n });\n\n complete.on(\"key\", function(cmd) {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(cmd) > -1){\n this.reply(Object.keys(config.all.tasks));\n }\n });\n\n complete.init();\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile();\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file diff --git a/lib/constants/index.js b/lib/constants/index.js deleted file mode 100644 index baab99f..0000000 --- a/lib/constants/index.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var notStarted = exports.notStarted = 'Not started'; -var inProgress = exports.inProgress = 'In progress'; -var finished = exports.finished = 'Finished'; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/constants/index.js.map b/lib/constants/index.js.map deleted file mode 100644 index 73f942a..0000000 --- a/lib/constants/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/constants/index.js"],"names":[],"mappings":";;;;;AAAO,IAAM,kCAAa,aAAb;AACN,IAAM,kCAAa,aAAb;AACN,IAAM,8BAAW,UAAX","file":"index.js","sourcesContent":["export const notStarted = 'Not started'\nexport const inProgress = 'In progress'\nexport const finished = 'Finished'\n"]} \ No newline at end of file diff --git a/lib/core/Manager.js b/lib/core/Manager.js new file mode 100644 index 0000000..fae0253 --- /dev/null +++ b/lib/core/Manager.js @@ -0,0 +1,219 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _flat = require('flat'); + +var _flat2 = _interopRequireDefault(_flat); + +var _Task = require('./Task'); + +var _Task2 = _interopRequireDefault(_Task); + +var _moment = require('moment'); + +var _moment2 = _interopRequireDefault(_moment); + +var _utils = require('./utils'); + +var _constants = require('./constants'); + +var _output = require('./output'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Manager = function () { + function Manager(cfg) { + var _this = this; + + _classCallCheck(this, Manager); + + this.configElements = ['format.output']; + this.repositories = ['tasks', 'config']; + + this.cfg = cfg; + this.tasks = cfg.all.tasks; + this.config = cfg.all.config ? cfg.all.config : {}; + + if (!this.config['config.version']) { + this.migrateToV2(this.tasks).then(function (migratedTasks) { + _this.cfg.set('tasks', migratedTasks); + _this.cfg.set('config', Object.assign(_this.config, { + 'config.version': 2 + })); + }, _output.cliError).catch(_output.cliError); + } + } + + _createClass(Manager, [{ + key: 'getTask', + value: function getTask(key) { + var task = this.tasks[key] ? this.tasks[key] : null; + return new _Task2.default(task); + } + }, { + key: 'storeTask', + value: function storeTask(key, task) { + var update = {}; + update[key] = task.get(); + this.tasks = Object.assign({}, this.tasks, update); + this.cfg.set('tasks', this.tasks); + } + }, { + key: 'startTask', + value: function startTask(key, description) { + var _this2 = this; + + var t = this.getTask(key); + t.start(description).then(function () { + _this2.storeTask(key, t); + console.log((0, _output.outputVertical)('Task:', key, _constants.STARTED, (0, _moment2.default)().toISOString())); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'pauseTask', + value: function pauseTask(key) { + var _this3 = this; + + var t = this.getTask(key); + t.pause().then(function () { + _this3.storeTask(key, t); + console.log((0, _output.outputVertical)('Task:', key, _constants.PAUSED, (0, _moment2.default)().toISOString())); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'unpauseTask', + value: function unpauseTask(key) { + var _this4 = this; + + var t = this.getTask(key); + t.unpause().then(function () { + _this4.storeTask(key, t); + console.log((0, _output.outputVertical)('Task:', key, _constants.UNPAUSED, (0, _moment2.default)().toISOString())); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'stopTask', + value: function stopTask(key, description) { + var _this5 = this; + + var t = this.getTask(key); + t.stop(description).then(function () { + _this5.storeTask(key, t); + console.log((0, _output.outputVertical)('Task:', key, _constants.FINISHED, (0, _moment2.default)().toISOString())); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'addDescription', + value: function addDescription(key, text) { + var t = this.getTask(key); + t.setDescription(text); + this.storeTask(key, t); + } + }, { + key: 'getTime', + value: function getTime(name) { + var t = this.getTask(name); + return t.getSeconds(); + } + }, { + key: 'modifyTask', + value: function modifyTask(operation, name, stringTime) { + var _this6 = this; + + var t = this.getTask(name); + t.makeOperationOverTime(operation, stringTime).then(function () { + _this6.storeTask(name, t); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'search', + value: function search(string) { + var _this7 = this; + + var keys = Object.keys(this.tasks); + var tasks = []; + keys.forEach(function (key) { + if (string === 'all' || key.indexOf(string) > -1) { + tasks.push({ + name: key, + task: new _Task2.default(_this7.tasks[key]) + }); + } + }); + return tasks; + } + }, { + key: 'getTasksJson', + value: function getTasksJson() { + return _flat2.default.unflatten(this.tasks); + } + }, { + key: 'getConfig', + value: function getConfig() { + return this.config; + } + }, { + key: 'configure', + value: function configure(element, value) { + + if (this.configElements.indexOf(element) < 0) { + return (0, _output.cliError)('Config key (' + element + ') not allowed, allowed keys: ' + this.configElements.toString() + ' '); + } + + var newCfg = _defineProperty({}, element, value); + + this.config = Object.assign({}, this.config, newCfg); + this.cfg.set('config', this.config); + + return this.config; + } + }, { + key: 'migrateToV2', + value: function migrateToV2(tasks) { + return new Promise(function (resolve, reject) { + Object.keys(tasks).forEach(function (k) { + if (!tasks[k].timings) { + reject('Config migrated'); + } + + if (!tasks[k].start && !tasks[k].stop) { + reject('Config corrupted or migrated'); + } + + tasks[k].timings = [{ + start: tasks[k].start ? tasks[k].start : null, + stop: tasks[k].stop ? tasks[k].stop : null + }]; + + delete tasks[k].start; + delete tasks[k].stop; + }); + + resolve(tasks); + }); + } + }, { + key: 'sumarize', + value: function sumarize(key, rate) { + var full = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + var tasks = this.search(key); + (0, _output.sumarize)(key, tasks, rate, full, this.config['format.output']); + } + }]); + + return Manager; +}(); + +exports.default = Manager; +//# sourceMappingURL=Manager.js.map \ No newline at end of file diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map new file mode 100644 index 0000000..882ac95 --- /dev/null +++ b/lib/core/Manager.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","configElements","repositories","tasks","all","config","migrateToV2","then","migratedTasks","set","Object","assign","catch","key","task","update","get","description","t","getTask","start","storeTask","console","log","toISOString","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","unflatten","element","value","toString","newCfg","Promise","resolve","reject","k","timings","rate","full","search"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\n\nimport Task from './Task'\nimport moment from 'moment'\n\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { sumarize, outputVertical, cliError } from './output'\n\nexport default class Manager {\n\n configElements = ['format.output']\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n\n if (!this.config['config.version']){\n this.migrateToV2(this.tasks)\n .then((migratedTasks)=>{\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': 2\n }))\n }, cliError)\n .catch(cliError)\n }\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n getTasksJson() {\n return flat.unflatten(this.tasks)\n }\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (this.configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n migrateToV2(tasks){\n return new Promise((resolve, reject)=>{\n Object.keys(tasks).forEach(k => {\n if (!tasks[k].timings){\n reject('Config migrated')\n }\n\n if (!tasks[k].start && !tasks[k].stop){\n reject('Config corrupted or migrated')\n }\n\n tasks[k].timings = [{\n start: (tasks[k].start) ? tasks[k].start : null,\n stop: (tasks[k].stop) ? tasks[k].stop : null\n }]\n\n delete tasks[k].start\n delete tasks[k].stop\n })\n\n resolve(tasks)\n })\n\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/Task.js b/lib/core/Task.js new file mode 100644 index 0000000..4c1680b --- /dev/null +++ b/lib/core/Task.js @@ -0,0 +1,234 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _moment = require('moment'); + +var _moment2 = _interopRequireDefault(_moment); + +var _constants = require('./constants'); + +var _Utils = require('./Utils'); + +var _output = require('./output'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Task = function () { + function Task(task) { + _classCallCheck(this, Task); + + this.task = task ? task : { + description: '', + timings: [] + }; + } + + _createClass(Task, [{ + key: '_calcTime', + value: function _calcTime(t) { + if (t.stop) { + return (0, _moment2.default)(t.stop).diff((0, _moment2.default)(t.start), 'seconds'); + } else { + return (0, _moment2.default)().diff((0, _moment2.default)(t.start), 'seconds'); + } + } + }, { + key: '_modifyTiming', + value: function _modifyTiming(time, operation) { + var timing = this.task.timings[this.task.timings.length - 1]; + if (!timing) { + throw 'This task is not started, start it.'; + } + + var newStop = (0, _moment2.default)(timing.stop); + newStop = newStop[operation](time.value, time.momentKey); + + if (operation === 'subtract' && newStop.isBefore(timing.start)) { + throw 'You cant subtract more time'; + return; + } + + this.task.timings[this.task.timings.length - 1].stop = newStop; + } + }, { + key: 'start', + value: function start(description) { + var _this = this; + + return new Promise(function (resolve, reject) { + var started = false; + + var timing = _this.task.timings[_this.task.timings.length - 1]; + + if (timing && timing.start && !timing.stop) { + reject(_this.error('This task already started.')); + } + + _this.task.timings.push({ + start: (0, _moment2.default)().toDate() + }); + + _this.setDescription(description); + _this.setStatus(_constants.IN_PROGRESS); + _this.log('start'); + resolve(); + }); + } + }, { + key: 'pause', + value: function pause() { + var _this2 = this; + + return new Promise(function (resolve, reject) { + var timing = _this2.task.timings[_this2.task.timings.length - 1]; + + if (!timing) { + reject(_this2.error('This task is not started, start it.')); + } + + if (timing && timing.start && timing.stop) { + reject(_this2.error('This task are ended/paused, unpaused it.')); + } + + _this2.task.timings[_this2.task.timings.length - 1].stop = (0, _moment2.default)().toDate(); + _this2.setStatus(_constants.PAUSED); + _this2.log('pause'); + resolve(); + }); + } + }, { + key: 'unpause', + value: function unpause() { + var _this3 = this; + + return new Promise(function (resolve, reject) { + var timing = _this3.task.timings[_this3.task.timings.length - 1]; + if (!timing) { + reject(_this3.error('This task is not started, start it')); + } + + if (timing && timing.start && !timing.stop) { + reject(_this3.error('This task is started, pause/stop first')); + } + + _this3.task.timings.push({ + start: (0, _moment2.default)().toDate() + }); + _this3.setStatus(_constants.IN_PROGRESS); + _this3.log('unpause'); + resolve(); + }); + } + }, { + key: 'stop', + value: function stop(description) { + var _this4 = this; + + return new Promise(function (resolve, reject) { + var timing = _this4.task.timings[_this4.task.timings.length - 1]; + if (!timing || timing && !timing.start) { + reject(_this4.error('This task is not started, start it')); + } + + if (timing.start && timing.stop) { + reject(_this4.error('This task already ended, start/unpause it.')); + } + + _this4.task.timings[_this4.task.timings.length - 1].stop = (0, _moment2.default)().toDate(); + _this4.setDescription(description); + _this4.setStatus(_constants.FINISHED); + _this4.log('stop'); + resolve(); + }); + } + }, { + key: 'log', + value: function log(operation) { + if (!this.task.log) { + this.task.log = []; + } + + this.task.log.push(operation + '#' + (0, _moment2.default)().toISOString()); + } + }, { + key: 'setDescription', + value: function setDescription(text) { + this.task.description = text ? text : this.task.description ? this.task.description : ''; + } + }, { + key: 'setStatus', + value: function setStatus(status) { + this.task.status = status; + } + }, { + key: 'makeOperationOverTime', + value: function makeOperationOverTime(operation, stringTime) { + var _this5 = this; + + return new Promise(function (resolve, reject) { + var parsed = (0, _Utils.recognizeModifierTiming)(stringTime); + + try { + parsed.map(function (t) { + _this5._modifyTiming(t, operation); + }); + } catch (err) { + console.error(err); + reject(_this5.error('Error trying to ' + operation + ' time to task')); + } + _this5.log(operation + ':' + stringTime); + + resolve(); + }); + } + }, { + key: 'get', + value: function get() { + return this.task; + } + }, { + key: 'getSeconds', + value: function getSeconds() { + var _this6 = this; + + var duration = 0; + + if (this.task.timings) { + this.task.timings.forEach(function (timing) { + duration += _this6._calcTime(timing); + }); + } else { + duration = this._calcTime(this.task); + } + + return duration; + } + }, { + key: 'getStartDate', + value: function getStartDate() { + if (this.task.timings) { + return this.task.timings[0].start; + } else { + return this.task.start; + } + } + }, { + key: 'error', + value: function error(err) { + return err; //+ ` \n Task: ${JSON.stringify(this.task)}` + } + }]); + + return Task; +}(); + +exports.default = Task; +//# sourceMappingURL=Task.js.map \ No newline at end of file diff --git a/lib/core/Task.js.map b/lib/core/Task.js.map new file mode 100644 index 0000000..4aae470 --- /dev/null +++ b/lib/core/Task.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './Utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/constants.js b/lib/core/constants.js new file mode 100644 index 0000000..741775c --- /dev/null +++ b/lib/core/constants.js @@ -0,0 +1,11 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var STARTED = exports.STARTED = 'STARTED'; +var PAUSED = exports.PAUSED = 'PAUSED'; +var UNPAUSED = exports.UNPAUSED = 'UNPAUSED'; +var IN_PROGRESS = exports.IN_PROGRESS = 'IN_PROGRESS'; +var FINISHED = exports.FINISHED = 'FINISHED'; +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/lib/core/constants.js.map b/lib/core/constants.js.map new file mode 100644 index 0000000..fd7cc88 --- /dev/null +++ b/lib/core/constants.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/core/constants.js"],"names":["STARTED","PAUSED","UNPAUSED","IN_PROGRESS","FINISHED"],"mappings":";;;;;AAAO,IAAMA,4BAAU,SAAhB;AACA,IAAMC,0BAAS,QAAf;AACA,IAAMC,8BAAW,UAAjB;AACA,IAAMC,oCAAc,aAApB;AACA,IAAMC,8BAAW,UAAjB","file":"constants.js","sourcesContent":["export const STARTED = 'STARTED'\nexport const PAUSED = 'PAUSED'\nexport const UNPAUSED = 'UNPAUSED'\nexport const IN_PROGRESS = 'IN_PROGRESS'\nexport const FINISHED = 'FINISHED'\n"]} \ No newline at end of file diff --git a/lib/core/output.js b/lib/core/output.js new file mode 100644 index 0000000..edec25e --- /dev/null +++ b/lib/core/output.js @@ -0,0 +1,88 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; + +var _moment = require('moment'); + +var _moment2 = _interopRequireDefault(_moment); + +var _cliTable = require('cli-table'); + +var _cliTable2 = _interopRequireDefault(_cliTable); + +var _utils = require('./utils'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, format) { + var table = new _cliTable2.default({ + head: ['Duration', 'Dates', 'Task'], + chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, + colAligns: ['right', 'center', 'left'], + style: { head: ['green'] } + }); + var total = 0; + var head = 'Search: ' + search + ' \n'; + + tasks.forEach(function (task, index) { + var name = task.name; + task = task.task; + + var duration = task.getSeconds(); + total += duration; + + table.push([(0, _utils.humanParseDiff)(duration), (0, _moment2.default)(task.getStartDate()).format(format), name]); + }); + + console.log(table.toString()); + + if (full) { + var table2 = new _cliTable2.default(); + table2.push({ 'Search': ['\"' + search + '\"'] }, { 'Total time': [(0, _utils.humanParseDiff)(total)] }); + + if (rate) { + table2.push({ 'Rate': [(0, _utils.calcRate)(rate, total)] }); + } + + console.log(table2.toString()); + } +}; + +var outputConfig = exports.outputConfig = function outputConfig(config) { + var table = new _cliTable2.default({ + head: ['Key', 'value'], + chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, + colAligns: ['center', 'center'], + style: { head: ['green'] } + }); + + Object.keys(config).map(function (e) { + return table.push([e, config[e]]); + }); + + console.log(table.toString()); +}; + +var outputVertical = exports.outputVertical = function outputVertical() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var table2 = new _cliTable2.default(); + var key = args.splice(0, 1); + table2.push(_defineProperty({}, key, args)); + + return table2.toString(); +}; + +var cliError = exports.cliError = function cliError(err) { + console.log('\x1b[31m'); // red + console.error('Error: ' + err); + console.log('\x1b[0m'); // end red +}; +//# sourceMappingURL=output.js.map \ No newline at end of file diff --git a/lib/core/output.js.map b/lib/core/output.js.map new file mode 100644 index 0000000..12aad92 --- /dev/null +++ b/lib/core/output.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","chars","colAligns","style","total","forEach","task","index","name","duration","getSeconds","push","getStartDate","console","log","toString","table2","outputConfig","config","Object","keys","map","e","outputVertical","args","key","splice","cliError","err","error"],"mappings":";;;;;;;AAAA;;;;AACA;;;;AAEA;;;;;;AAEO,IAAMA,8BAAW,SAAXA,QAAW,CAASC,MAAT,EAAiBC,KAAjB,EAAwBC,IAAxB,EAA8BC,IAA9B,EAAoCC,MAApC,EAA4C;AAChE,QAAIC,QAAQ,uBAAU;AAClBC,cAAM,CAAC,UAAD,EAAa,OAAb,EAAsB,MAAtB,CADY;AAElBC,eAAO,EAAC,OAAO,EAAR,EAAY,YAAY,EAAxB,EAA4B,WAAW,EAAvC,EAA2C,aAAa,EAAxD,EAFW;AAGlBC,mBAAW,CAAC,OAAD,EAAU,QAAV,EAAoB,MAApB,CAHO;AAIlBC,eAAO,EAAEH,MAAM,CAAC,OAAD,CAAR;AAJW,KAAV,CAAZ;AAMA,QAAII,QAAQ,CAAZ;AACA,QAAIJ,oBAAiBN,MAAjB,QAAJ;;AAEAC,UAAMU,OAAN,CAAc,UAACC,IAAD,EAAOC,KAAP,EAAiB;AAC3B,YAAIC,OAAOF,KAAKE,IAAhB;AACAF,eAAOA,KAAKA,IAAZ;;AAEA,YAAIG,WAAWH,KAAKI,UAAL,EAAf;AACAN,iBAASK,QAAT;;AAEAV,cAAMY,IAAN,CAAW,CAAC,2BAAeF,QAAf,CAAD,EAA2B,sBAAOH,KAAKM,YAAL,EAAP,EAA4Bd,MAA5B,CAAmCA,MAAnC,CAA3B,EAAuEU,IAAvE,CAAX;AACH,KARD;;AAUAK,YAAQC,GAAR,CAAYf,MAAMgB,QAAN,EAAZ;;AAEA,QAAIlB,IAAJ,EAAS;AACL,YAAImB,SAAS,wBAAb;AACAA,eAAOL,IAAP,CACI,EAAE,UAAU,CAAC,OAAOjB,MAAP,GAAgB,IAAjB,CAAZ,EADJ,EAEI,EAAE,cAAc,CAAC,2BAAeU,KAAf,CAAD,CAAhB,EAFJ;;AAKA,YAAIR,IAAJ,EAAS;AACLoB,mBAAOL,IAAP,CAAY,EAAE,QAAQ,CAAC,qBAASf,IAAT,EAAeQ,KAAf,CAAD,CAAV,EAAZ;AACH;;AAEDS,gBAAQC,GAAR,CAAYE,OAAOD,QAAP,EAAZ;AACH;AACJ,CAnCM;;AAqCA,IAAME,sCAAe,SAAfA,YAAe,CAAUC,MAAV,EAAiB;AACzC,QAAInB,QAAQ,uBAAU;AAClBC,cAAM,CAAC,KAAD,EAAQ,OAAR,CADY;AAElBC,eAAO,EAAC,OAAO,EAAR,EAAY,YAAY,EAAxB,EAA4B,WAAW,EAAvC,EAA2C,aAAa,EAAxD,EAFW;AAGlBC,mBAAW,CAAC,QAAD,EAAW,QAAX,CAHO;AAIlBC,eAAO,EAAEH,MAAM,CAAC,OAAD,CAAR;AAJW,KAAV,CAAZ;;AAOAmB,WAAOC,IAAP,CAAYF,MAAZ,EAAoBG,GAApB,CAAwB;AAAA,eAAKtB,MAAMY,IAAN,CAAW,CAACW,CAAD,EAAIJ,OAAOI,CAAP,CAAJ,CAAX,CAAL;AAAA,KAAxB;;AAEAT,YAAQC,GAAR,CAAYf,MAAMgB,QAAN,EAAZ;AACH,CAXM;;AAaA,IAAMQ,0CAAiB,SAAjBA,cAAiB,GAAkB;AAAA,sCAALC,IAAK;AAALA,YAAK;AAAA;;AAC5C,QAAIR,SAAS,wBAAb;AACI,QAAIS,MAAMD,KAAKE,MAAL,CAAY,CAAZ,EAAe,CAAf,CAAV;AACAV,WAAOL,IAAP,qBACOc,GADP,EACaD,IADb;;AAIA,WAAOR,OAAOD,QAAP,EAAP;AACP,CARM;;AAUA,IAAMY,8BAAW,SAAXA,QAAW,CAASC,GAAT,EAAc;AAClCf,YAAQC,GAAR,CAAY,UAAZ,EADkC,CACT;AACzBD,YAAQgB,KAAR,aAAwBD,GAAxB;AACAf,YAAQC,GAAR,CAAY,SAAZ,EAHkC,CAGV;AAC3B,CAJM","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['right', 'center', 'left'],\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n table.push([humanParseDiff(duration), moment(task.getStartDate()).format(format), name])\n })\n\n console.log(table.toString());\n\n if (full){\n let table2 = new Table()\n table2.push(\n { 'Search': ['\\\"' + search + '\\\"'] },\n { 'Total time': [humanParseDiff(total)] }\n )\n\n if (rate){\n table2.push({ 'Rate': [calcRate(rate, total)] })\n }\n\n console.log(table2.toString());\n }\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.log('\\x1b[31m'); // red\n console.error(`Error: ${err}`)\n console.log('\\x1b[0m'); // end red\n}\n"]} \ No newline at end of file diff --git a/lib/Utils.js b/lib/core/utils.js similarity index 91% rename from lib/Utils.js rename to lib/core/utils.js index 57458f7..5c2110f 100644 --- a/lib/Utils.js +++ b/lib/core/utils.js @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); var recognizeModifierTiming = exports.recognizeModifierTiming = function recognizeModifierTiming(string) { var r = /(\d{1,})([hms])/g; - var arr = undefined; + var arr = void 0; var res = []; while ((arr = r.exec(string)) !== null) { res.push({ @@ -13,11 +13,12 @@ var recognizeModifierTiming = exports.recognizeModifierTiming = function recogni momentKey: arr[2] }); } + return res; }; var calcRate = exports.calcRate = function calcRate(rate, total) { - var amount = undefined; + var amount = void 0; var mod = rate.substr(rate.length - 1); var value = rate.slice(0, rate.length - 1); @@ -40,9 +41,9 @@ var humanParseDiff = exports.humanParseDiff = function humanParseDiff(secs) { var hours = Math.floor(secs / 3600); var minutes = Math.floor((secs - hours * 3600) / 60); var seconds = secs - hours * 3600 - minutes * 60; - hours = hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h '; - minutes = minutes == 0 && hours == '' ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm '; + hours = hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h'; + minutes = minutes == 0 && hours == '' ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm'; seconds = seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's'; return hours + minutes + seconds; }; -//# sourceMappingURL=Utils.js.map \ No newline at end of file +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/lib/core/utils.js.map b/lib/core/utils.js.map new file mode 100644 index 0000000..883deb8 --- /dev/null +++ b/lib/core/utils.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/core/utils.js"],"names":["recognizeModifierTiming","string","r","arr","res","exec","push","value","momentKey","calcRate","rate","total","amount","mod","substr","length","slice","parseFloat","toFixed","humanParseDiff","secs","hours","Math","floor","minutes","seconds"],"mappings":";;;;;AAAO,IAAMA,4DAA0B,SAA1BA,uBAA0B,CAAUC,MAAV,EAAiB;AACpD,QAAIC,IAAI,kBAAR;AACA,QAAIC,YAAJ;AACA,QAAIC,MAAM,EAAV;AACA,WAAO,CAACD,MAAMD,EAAEG,IAAF,CAAOJ,MAAP,CAAP,MAA2B,IAAlC,EAAwC;AACpCG,YAAIE,IAAJ,CAAS;AACLC,mBAAOJ,IAAI,CAAJ,CADF;AAELK,uBAAWL,IAAI,CAAJ;AAFN,SAAT;AAIH;;AAED,WAAOC,GAAP;AACH,CAZM;;AAcA,IAAMK,8BAAW,SAAXA,QAAW,CAAUC,IAAV,EAAgBC,KAAhB,EAAsB;AAC1C,QAAIC,eAAJ;AACA,QAAIC,MAAMH,KAAKI,MAAL,CAAYJ,KAAKK,MAAL,GAAc,CAA1B,CAAV;AACA,QAAIR,QAAQG,KAAKM,KAAL,CAAW,CAAX,EAAcN,KAAKK,MAAL,GAAc,CAA5B,CAAZ;;AAEA,YAAQF,GAAR;AACI,aAAK,GAAL;AACID,qBAAUD,QAAM,EAAN,GAAS,EAAV,GAAcM,WAAWV,KAAX,CAAvB;AACA;AACJ,aAAK,GAAL;AACIK,qBAAUD,QAAM,EAAP,GAAWM,WAAWV,KAAX,CAApB;AACA;AACJ,aAAK,GAAL;AACIK,qBAASD,QAAMM,WAAWV,KAAX,CAAf;AACA;AATR;;AAYA,WAAOK,OAAOM,OAAP,CAAe,CAAf,CAAP;AACH,CAlBM;;AAoBA,IAAMC,0CAAiB,SAAjBA,cAAiB,CAASC,IAAT,EAAe;AACzC,QAAIC,QAAUC,KAAKC,KAAL,CAAWH,OAAO,IAAlB,CAAd;AACA,QAAII,UAAUF,KAAKC,KAAL,CAAW,CAACH,OAAQC,QAAQ,IAAjB,IAA0B,EAArC,CAAd;AACA,QAAII,UAAUL,OAAQC,QAAQ,IAAhB,GAAyBG,UAAU,EAAjD;AACAH,YAASA,SAAS,CAAT,GAAa,EAAb,GAAkB,CAACA,QAAQ,EAAR,GAAa,MAAMA,KAAnB,GAA2BA,KAA5B,IAAqC,GAAhE;AACAG,cAAYA,WAAW,CAAX,IAAgBH,SAAS,EAA1B,GAAgC,EAAhC,GAAqC,CAACG,UAAU,EAAV,GAAe,MAAMA,OAArB,GAA+BA,OAAhC,IAA2C,GAA3F;AACAC,cAAWA,WAAW,CAAX,GAAe,EAAf,GAAoB,CAACA,UAAW,EAAX,GAAgB,MAAMA,OAAtB,GAAgCA,OAAjC,IAA4C,GAA3E;AACA,WAAOJ,QAAQG,OAAR,GAAkBC,OAAzB;AACH,CARM","file":"utils.js","sourcesContent":["export const recognizeModifierTiming = function (string){\n let r = /(\\d{1,})([hms])/g\n let arr\n let res = []\n while ((arr = r.exec(string)) !== null) {\n res.push({\n value: arr[1],\n momentKey: arr[2]\n })\n }\n\n return res\n}\n\nexport const calcRate = function (rate, total){\n let amount\n let mod = rate.substr(rate.length - 1)\n let value = rate.slice(0, rate.length - 1)\n\n switch (mod) {\n case 'h':\n amount = (total/60/60)*parseFloat(value)\n break;\n case 'm':\n amount = (total/60)*parseFloat(value)\n break;\n case 's':\n amount = total*parseFloat(value)\n break;\n }\n\n return amount.toFixed(2)\n}\n\nexport const humanParseDiff = function(secs) {\n let hours = Math.floor(secs / 3600)\n let minutes = Math.floor((secs - (hours * 3600)) / 60)\n let seconds = secs - (hours * 3600) - (minutes * 60)\n hours = (hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h')\n minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm')\n seconds = (seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's')\n return hours + minutes + seconds\n}\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index d2a9417..fa7c147 100644 --- a/lib/index.js +++ b/lib/index.js @@ -10,53 +10,110 @@ var _updateNotifier = require('update-notifier'); var _updateNotifier2 = _interopRequireDefault(_updateNotifier); -var _Task = require('./Task'); +var _configstore = require('configstore'); -var _Task2 = _interopRequireDefault(_Task); +var _configstore2 = _interopRequireDefault(_configstore); -var _Output = require('./Output'); +var _package = require('../package.json'); -var _Utils = require('./Utils'); +var _package2 = _interopRequireDefault(_package); -var _Manager = require('./Manager'); +var _Manager = require('./core/Manager'); var _Manager2 = _interopRequireDefault(_Manager); -var _package = require('../package.json'); +var _utils = require('./core/utils'); -var _package2 = _interopRequireDefault(_package); +var _output = require('./core/output'); + +var _autocomplete = require('./autocomplete'); + +var _autocomplete2 = _interopRequireDefault(_autocomplete); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var config = new _configstore2.default(_package2.default.name, { + tasks: {}, + config: { + 'format.output': 'DD/MM', + 'config.version': '2' + } +}); + (0, _updateNotifier2.default)({ pkg: _package2.default }).notify(); -module.exports = function createTimer(p) { - - _commander2.default.version(_package2.default.version).description('Tiny time tracker for projects').option('-s, --start ', 'Start the timer task.').option('-f, --finish ', 'Stops the timer task.').option('-d, --description ', 'Adds a description for the task only in start/stop methods.').option('-a, --add ', 'Adds time to a task. Example: "1h2m3s"').option('--remove ', 'Subtract time from a task. Example: "1h2m3s"').option('-l, --log ', 'Logs the timer task.').option('-r, --report ', 'Report time of the tasks, searched by key, you can report all using all as key. Also you can pass a rate to calc an amount ex: 20h, calc the hours and mulpitly by 20').option('-e, --export', 'Prints the json of all tasks.').parse(p.argv); - - var description = undefined; - if (_commander2.default.start) { - description = _commander2.default.description || _commander2.default.args[0]; - _Manager2.default.start(_commander2.default.start, description); - } else if (_commander2.default.finish) { - description = _commander2.default.description || _commander2.default.args[0]; - _Manager2.default.stop(_commander2.default.finish, description); - console.log((0, _Utils.humanParseDiff)(_Manager2.default.getTime(_commander2.default.finish))); - } else if (_commander2.default.add) { - _Manager2.default.modifyTask('add', _commander2.default.add, _commander2.default.args[0]); - (0, _Output.sumarize)(_commander2.default.add, _Manager2.default.search(_commander2.default.add)); - } else if (_commander2.default.remove) { - _Manager2.default.modifyTask('subtract', _commander2.default.remove, _commander2.default.args[0]); - (0, _Output.sumarize)(_commander2.default.remove, _Manager2.default.search(_commander2.default.remove)); - } else if (_commander2.default.log) { - setInterval(function () { - process.stdout.clearLine(); - process.stdout.write('\r Task: ' + _commander2.default.log + ' ' + (0, _Utils.humanParseDiff)(_Manager2.default.getTime(_commander2.default.log))); - }, 100); - } else if (_commander2.default.report) { - (0, _Output.sumarize)(_commander2.default.report, _Manager2.default.search(_commander2.default.report), _commander2.default.args[0], true); - } else if (_commander2.default.export) { - console.log(JSON.stringify(_Manager2.default.getTasksJson(), null, 4)); - } -}; +var manager = new _Manager2.default(config); +(0, _autocomplete2.default)(config); + +//Exec +var EXEC = false; + +_commander2.default.version(_package2.default.version).description('Tiny time tracker for projects'); + +_commander2.default.command('start [description]').description('Start task with a description.').alias('s').action(function (key, description) { + description = description ? Array.isArray(description) ? description.join(' ') : description : null; + manager.startTask(key, description); + EXEC = true; +}); + +_commander2.default.command('pause ').description('Pause task').alias('p').action(function (key) { + manager.pauseTask(key); + EXEC = true; +}); + +_commander2.default.command('unpause ').description('Unpause task').alias('up').action(function (key) { + manager.unpauseTask(key); + EXEC = true; +}); + +_commander2.default.command('finish [description]').description('Stop task, you can add a description').alias('f').action(function (key, description) { + manager.stopTask(key, description); + EXEC = true; +}); + +_commander2.default.command('description ').description('Add description to your task.').alias('d').action(function (key, text) { + text = Array.isArray(text) ? text.join(' ') : text; + manager.addDescription(key, text); + EXEC = true; +}); + +_commander2.default.command('add ').description('Adds time to a task. Example: "1h2m3s"').action(function (key, stringTime) { + manager.modifyTask('add', key, stringTime); + manager.sumarize(key, manager.search(key), false); + EXEC = true; +}); + +_commander2.default.command('remove ').description('Subtract time to a task. Example: "1h2m3s"').alias('sub').action(function (key, stringTime) { + manager.modifyTask('subtract', key, stringTime); + manager.sumarize(key, manager.search(key), false); + EXEC = true; +}); + +_commander2.default.command('report [tasks] [rate]').description('Report time of the tasks, searched by key. Can pass a rate (1h).').alias('r').action(function (tasks, rate) { + tasks = tasks ? tasks : 'all'; + manager.sumarize(tasks, rate); + EXEC = true; +}); + +_commander2.default.command('log ').description('Logs the time of the task').alias('l').action(function (key) { + setInterval(function () { + var text = (0, _output.outputVertical)('Task:', key, (0, _utils.humanParseDiff)(manager.getTime(key))); + process.stdout.write(text); + process.stdout.moveCursor(0, -2); + }, 1000); + EXEC = true; +}); + +_commander2.default.command('export').description('Export the tasks in a JSON').alias('e').action(function (key) { + console.log(JSON.stringify(manager.getTasksJson(), null, 4)); + EXEC = true; +}); + +_commander2.default.parse(process.argv); + +if (_commander2.default.args.length === 0 || !EXEC) { + (0, _output.cliError)('You must use a valid command.'); + _commander2.default.outputHelp(); + process.exit(1); +} //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map index 22a61bd..11dae2e 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,8BAAe,EAAC,sBAAD,EAAf,EAAsB,MAAtB;;AAEA,OAAO,OAAP,GAAiB,SAAS,WAAT,CAAsB,CAAtB,EAAyB;;AAEtC,wBACK,OADL,CACa,kBAAI,OAAJ,CADb,CAEK,WAFL,CAEiB,gCAFjB,EAIK,MAJL,CAIY,kCAJZ,EAIgD,uBAJhD,EAKK,MALL,CAKY,mCALZ,EAKiD,uBALjD,EAMK,MANL,CAMY,iCANZ,EAM+C,6DAN/C,EAQK,MARL,CAQY,+BARZ,EAQ6C,wCAR7C,EASK,MATL,CASY,8BATZ,EAS4C,8CAT5C,EAWK,MAXL,CAWY,kBAXZ,EAWgC,sBAXhC,EAYK,MAZL,CAYY,4BAZZ,EAY0C,uKAZ1C,EAaK,MAbL,CAaY,cAbZ,EAa4B,+BAb5B,EAeK,KAfL,CAeW,EAAE,IAAF,CAfX,CAFsC;;AAmBtC,QAAI,uBAAJ,CAnBsC;AAoBtC,QAAI,oBAAQ,KAAR,EAAc;AACd,sBAAc,oBAAQ,WAAR,IAAuB,oBAAQ,IAAR,CAAa,CAAb,CAAvB,CADA;AAEd,0BAAM,KAAN,CAAY,oBAAQ,KAAR,EAAe,WAA3B,EAFc;KAAlB,MAGO,IAAI,oBAAQ,MAAR,EAAe;AACtB,sBAAc,oBAAQ,WAAR,IAAuB,oBAAQ,IAAR,CAAa,CAAb,CAAvB,CADQ;AAEtB,0BAAM,IAAN,CAAW,oBAAQ,MAAR,EAAgB,WAA3B,EAFsB;AAGtB,gBAAQ,GAAR,CAAY,2BAAe,kBAAM,OAAN,CAAc,oBAAQ,MAAR,CAA7B,CAAZ,EAHsB;KAAnB,MAIA,IAAI,oBAAQ,GAAR,EAAY;AACnB,0BAAM,UAAN,CAAiB,KAAjB,EAAwB,oBAAQ,GAAR,EAAa,oBAAQ,IAAR,CAAa,CAAb,CAArC,EADmB;AAEnB,8BAAS,oBAAQ,GAAR,EAAa,kBAAM,MAAN,CAAa,oBAAQ,GAAR,CAAnC,EAFmB;KAAhB,MAGA,IAAI,oBAAQ,MAAR,EAAe;AACtB,0BAAM,UAAN,CAAiB,UAAjB,EAA6B,oBAAQ,MAAR,EAAgB,oBAAQ,IAAR,CAAa,CAAb,CAA7C,EADsB;AAEtB,8BAAS,oBAAQ,MAAR,EAAgB,kBAAM,MAAN,CAAa,oBAAQ,MAAR,CAAtC,EAFsB;KAAnB,MAGA,IAAI,oBAAQ,GAAR,EAAY;AACnB,oBAAY,YAAW;AACnB,oBAAQ,MAAR,CAAe,SAAf,GADmB;AAEnB,oBAAQ,MAAR,CAAe,KAAf,eAAiC,oBAAQ,GAAR,SAAe,2BAAe,kBAAM,OAAN,CAAc,oBAAQ,GAAR,CAA7B,CAAhD,EAFmB;SAAX,EAGT,GAHH,EADmB;KAAhB,MAKA,IAAI,oBAAQ,MAAR,EAAe;AACtB,8BAAS,oBAAQ,MAAR,EAAgB,kBAAM,MAAN,CAAa,oBAAQ,MAAR,CAAtC,EAAuD,oBAAQ,IAAR,CAAa,CAAb,CAAvD,EAAwE,IAAxE,EADsB;KAAnB,MAEA,IAAI,oBAAQ,MAAR,EAAe;AACtB,gBAAQ,GAAR,CAAY,KAAK,SAAL,CAAe,kBAAM,YAAN,EAAf,EAAqC,IAArC,EAA2C,CAA3C,CAAZ,EADsB;KAAnB;CAxCM","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\n\nimport Task from './Task'\nimport {sumarize} from './Output'\nimport {humanParseDiff} from './Utils'\n\nimport timer from './Manager'\nimport pkg from '../package.json'\n\nupdateNotifier({pkg}).notify()\n\nmodule.exports = function createTimer (p) {\n\n program\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n\n .option('-s, --start ', 'Start the timer task.')\n .option('-f, --finish ', 'Stops the timer task.')\n .option('-d, --description ', 'Adds a description for the task only in start/stop methods.')\n\n .option('-a, --add ', 'Adds time to a task. Example: \"1h2m3s\"')\n .option('--remove ', 'Subtract time from a task. Example: \"1h2m3s\"')\n\n .option('-l, --log ', 'Logs the timer task.')\n .option('-r, --report ', 'Report time of the tasks, searched by key, you can report all using all as key. Also you can pass a rate to calc an amount ex: 20h, calc the hours and mulpitly by 20')\n .option('-e, --export', 'Prints the json of all tasks.')\n\n .parse(p.argv)\n\n let description\n if (program.start){\n description = program.description || program.args[0]\n timer.start(program.start, description)\n } else if (program.finish){\n description = program.description || program.args[0]\n timer.stop(program.finish, description)\n console.log(humanParseDiff(timer.getTime(program.finish)))\n } else if (program.add){\n timer.modifyTask('add', program.add, program.args[0])\n sumarize(program.add, timer.search(program.add))\n } else if (program.remove){\n timer.modifyTask('subtract', program.remove, program.args[0])\n sumarize(program.remove, timer.search(program.remove))\n } else if (program.log){\n setInterval(function() {\n process.stdout.clearLine()\n process.stdout.write(`\\r Task: ${program.log} ${humanParseDiff(timer.getTime(program.log))}`)\n }, 100)\n } else if (program.report){\n sumarize(program.report, timer.search(program.report), program.args[0], true)\n } else if (program.export){\n console.log(JSON.stringify(timer.getTasksJson(), null, 4))\n }\n\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","parse","argv","args","length","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM',\n 'config.version': '2'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('remove ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [tasks] [rate]')\n .description('Report time of the tasks, searched by key. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\n\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\n EXEC = true\n })\n\nprogram\n .parse(process.argv);\n\nif (program.args.length === 0 || !EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file diff --git a/lib/manager.js b/lib/manager.js deleted file mode 100644 index 68df19d..0000000 --- a/lib/manager.js +++ /dev/null @@ -1,151 +0,0 @@ -'use strict'; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.Manager = undefined; - -var _flat = require('flat'); - -var _flat2 = _interopRequireDefault(_flat); - -var _moment = require('moment'); - -var _moment2 = _interopRequireDefault(_moment); - -var _configstore = require('configstore'); - -var _configstore2 = _interopRequireDefault(_configstore); - -var _package = require('../package.json'); - -var _package2 = _interopRequireDefault(_package); - -var _Utils = require('./Utils'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Manager = exports.Manager = function () { - function Manager(cfg) { - _classCallCheck(this, Manager); - - this.tasks = cfg.all.tasks; - } - - _createClass(Manager, [{ - key: 'getTask', - value: function getTask(name) { - return this.tasks[name] ? this.tasks[name] : {}; - } - }, { - key: 'storeTasks', - value: function storeTasks() { - config.set('tasks', this.tasks); - } - }, { - key: 'setTask', - value: function setTask(name, obj) { - var update = {}; - update[name] = obj; - this.tasks = Object.assign({}, this.tasks, update); - this.storeTasks(); - } - }, { - key: 'start', - value: function start(name, description) { - var t = this.getTask(name); - if (!t.start) { - t.start = (0, _moment2.default)().toDate(); - if (description) t.description = description; - this.setTask(name, t); - } - } - }, { - key: 'stop', - value: function stop(name, description) { - var t = this.getTask(name); - if (!t.stop) { - t.stop = (0, _moment2.default)().toDate(); - if (description) t.description = description; - this.setTask(name, t); - } - } - }, { - key: 'getTime', - value: function getTime(name) { - var t = this.getTask(name); - if (t.stop) { - return (0, _moment2.default)(t.stop).diff((0, _moment2.default)(t.start), 'seconds'); - } else { - return (0, _moment2.default)().diff((0, _moment2.default)(t.start), 'seconds'); - } - } - }, { - key: 'modifyTask', - value: function modifyTask(operation, name, stringTime) { - var _this = this; - - var t = this.getTask(name); - - if (t.stop) { - var _ret = function () { - - var newStop = (0, _moment2.default)(t.stop); - var parsed = (0, _Utils.recognizeModifierTiming)(stringTime); - parsed.map(function (t) { - newStop = newStop[operation](t.value, t.momentKey); - }); - - if (operation === 'subtract' && newStop.isBefore(t.start)) { - console.error('You cant subtract more time'); - return { - v: undefined - }; - } - - t.stop = newStop; - _this.setTask(name, t); - }(); - - if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; - } - - return t.stop; - } - }, { - key: 'search', - value: function search(string) { - var _this2 = this; - - var keys = Object.keys(this.tasks); - var tasks = []; - keys.map(function (key) { - if (string === 'all' || key.indexOf(string) > -1) { - tasks.push({ - name: key, - task: _this2.tasks[key] - }); - } - }); - return tasks; - } - }, { - key: 'getTasksJson', - value: function getTasksJson() { - return _flat2.default.unflatten(this.tasks); - } - }]); - - return Manager; -}(); - -var config = new _configstore2.default(_package2.default.name, { tasks: {} }); - -exports.default = new Manager(config); -//# sourceMappingURL=Manager.js.map \ No newline at end of file diff --git a/lib/manager.js.map b/lib/manager.js.map deleted file mode 100644 index 8ba593f..0000000 --- a/lib/manager.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/Manager.js"],"names":[],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\n\nimport moment from 'moment'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport {recognizeModifierTiming} from './Utils'\n\nexport class Manager {\n constructor(cfg) {\n this.tasks = cfg.all.tasks\n }\n\n getTask(name) {\n return (this.tasks[name]) ? this.tasks[name] : {}\n }\n\n storeTasks() {\n config.set('tasks', this.tasks)\n }\n\n setTask(name, obj) {\n let update = {}\n update[name] = obj\n this.tasks = Object.assign({}, this.tasks, update)\n this.storeTasks()\n }\n\n start(name, description) {\n let t = this.getTask(name)\n if (!t.start) {\n t.start = moment().toDate()\n if (description) t.description = description\n this.setTask(name, t)\n }\n }\n\n stop(name, description) {\n let t = this.getTask(name)\n if (!t.stop) {\n t.stop = moment().toDate()\n if (description) t.description = description\n this.setTask(name, t)\n }\n }\n\n getTime(name) {\n let t = this.getTask(name)\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n\n if (t.stop){\n\n let newStop = moment(t.stop)\n let parsed = recognizeModifierTiming(stringTime)\n parsed.map((t)=>{\n newStop = newStop[operation](t.value, t.momentKey)\n })\n\n if (operation === 'subtract' && newStop.isBefore(t.start)){\n console.error('You cant subtract more time')\n return\n }\n\n t.stop = newStop\n this.setTask(name, t)\n }\n\n return t.stop\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.map((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: this.tasks[key]\n })\n }\n })\n return tasks\n }\n getTasksJson() {\n return flat.unflatten(this.tasks)\n }\n}\n\nconst config = new Configstore(pkg.name, {tasks:{}})\n\nexport default new Manager(config)\n"]} \ No newline at end of file From 419e43f07e08bb458c857c9b28d2b88f4cddbe9a Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 15:55:28 +0100 Subject: [PATCH 05/51] Add: delete and some fixes on the updateDB --- package.json | 2 + src/autocomplete.js | 2 +- src/core/Manager.js | 88 ++++++++++++++++++++++++---------------- src/core/dbMigrations.js | 32 +++++++++++++++ src/core/output.js | 9 ++-- src/index.js | 29 +++++++++---- 6 files changed, 115 insertions(+), 47 deletions(-) create mode 100644 src/core/dbMigrations.js diff --git a/package.json b/package.json index bac3256..57a2fcb 100644 --- a/package.json +++ b/package.json @@ -37,10 +37,12 @@ }, "dependencies": { "babel-polyfill": "^6.22.0", + "chalk": "^1.1.3", "cli-table": "^0.3.1", "commander": "^2.9.0", "configstore": "^2.1.0", "flat": "^2.0.0", + "inquirer": "^3.0.1", "moment": "^2.11.2", "omelette": "^0.3.1", "update-notifier": "^1.0.3" diff --git a/src/autocomplete.js b/src/autocomplete.js index d821cd1..16af9f5 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -9,7 +9,7 @@ const autocomplete = function(config){ } complete.on("cmd", function() { - this.reply(["start", "pause", "unpause", "finish", "description", "add", "remove", "report", "log", "export"]) + this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete"]) }); complete.on("key", function(cmd) { diff --git a/src/core/Manager.js b/src/core/Manager.js index 5c5ad9e..92220cc 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -1,11 +1,12 @@ import flat from 'flat' - -import Task from './Task' import moment from 'moment' +import inquirer from 'inquirer' +import Task from './Task' import { recognizeModifierTiming } from './utils' import { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED } from './constants' -import { sumarize, outputVertical, cliError } from './output' +import { sumarize, outputVertical, cliError, cliSuccess } from './output' +import { migrateToV2 } from './dbMigrations' export default class Manager { @@ -16,17 +17,6 @@ export default class Manager { this.cfg = cfg this.tasks = cfg.all.tasks this.config = (cfg.all.config) ? cfg.all.config : {} - - if (!this.config['config.version']){ - this.migrateToV2(this.tasks) - .then((migratedTasks)=>{ - this.cfg.set('tasks', migratedTasks) - this.cfg.set('config', Object.assign(this.config, { - 'config.version': 2 - })) - }, cliError) - .catch(cliError) - } } getTask(key) { @@ -123,6 +113,35 @@ export default class Manager { return tasks } + delete(string) { + let tasks = this.search(string) + + console.log( + tasks.map(k => `${k.name} \n`).join('') + ) + + if (tasks.length === 0) { + cliSuccess('No tasks found to delete.') + return + } + + inquirer.prompt([{ + type: 'confirm', + name: 'cls', + message: `Are you sure you want to delete this tasks?`, + default: false + }]).then((answers) => { + if (answers.cls){ + tasks.forEach(k => { + delete this.tasks[k.name] + this.cfg.set('tasks', this.tasks) + }) + cliSuccess('Tasks deleted.') + } + }) + .catch(cliError) + } + getTasksJson() { return flat.unflatten(this.tasks) } @@ -147,29 +166,28 @@ export default class Manager { return this.config } - migrateToV2(tasks){ - return new Promise((resolve, reject)=>{ - Object.keys(tasks).forEach(k => { - if (!tasks[k].timings){ - reject('Config migrated') - } + update() { + if (!this.config || (this.config && this.config['config.version'] !== '2') ){ + console.log('DB: Need to be updated') - if (!tasks[k].start && !tasks[k].stop){ - reject('Config corrupted or migrated') - } - - tasks[k].timings = [{ - start: (tasks[k].start) ? tasks[k].start : null, - stop: (tasks[k].stop) ? tasks[k].stop : null - }] - - delete tasks[k].start - delete tasks[k].stop - }) - - resolve(tasks) - }) + migrateToV2(this.tasks) + .then(tasks => { + let newTasks = {} + tasks.forEach(t => newTasks[t.key] = t.task) + return newTasks + }) + .then(migratedTasks => { + this.cfg.set('tasks', migratedTasks) + this.cfg.set('config', Object.assign(this.config, { + 'config.version': '2' + })) + cliSuccess('Configuration migrated to version 2.') + }, cliError) + .catch(cliError) + } else { + cliSuccess('No need to update the DB.') + } } sumarize(key, rate, full=true){ diff --git a/src/core/dbMigrations.js b/src/core/dbMigrations.js new file mode 100644 index 0000000..020b5fe --- /dev/null +++ b/src/core/dbMigrations.js @@ -0,0 +1,32 @@ +export const migrateToV2 = function (tasks){ + let promises = [] + let migrate = (key, task) => new Promise((resolve, reject) => { + + let timing = {} + let update = false + + if (task.start) { + update = true + timing.start = task.start + delete task.start + } + + if (task.stop) { + timing.stop = task.stop + delete task.stop + } + + if (update) { + task.timings = [timing] + } + + resolve({ + key, + task + }) + }) + + Object.keys(tasks).forEach(k => promises.push( migrate(k, tasks[k]) )) + + return Promise.all(promises) +} diff --git a/src/core/output.js b/src/core/output.js index 293cba8..d571d92 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -1,5 +1,6 @@ import moment from 'moment' import Table from 'cli-table' +import chalk from 'chalk' import { humanParseDiff, calcRate } from './utils' @@ -64,7 +65,9 @@ export const outputVertical = function (...args){ } export const cliError = function(err) { - console.log('\x1b[31m'); // red - console.error(`Error: ${err}`) - console.log('\x1b[0m'); // end red + console.error(chalk.red(`Error: ${err}`)) +} + +export const cliSuccess = function(err) { + console.log(chalk.green(err)) } diff --git a/src/index.js b/src/index.js index c2b6dab..f62a5ee 100644 --- a/src/index.js +++ b/src/index.js @@ -14,8 +14,7 @@ import autocomplete from './autocomplete' const config = new Configstore(pkg.name, { tasks:{}, config:{ - 'format.output': 'DD/MM', - 'config.version': '2' + 'format.output': 'DD/MM' } }) @@ -30,6 +29,7 @@ let EXEC = false program .version(pkg.version) .description('Tiny time tracker for projects') + .option('--updateDB', 'Bool to update the db') program .command('start [description]') @@ -89,7 +89,7 @@ program }) program - .command('remove ') + .command('subtract ') .description('Subtract time to a task. Example: "1h2m3s"') .alias('sub') .action(function(key, stringTime) { @@ -99,7 +99,7 @@ program }) program - .command('report [tasks] [rate]') + .command('report [task_string] [rate]') .description('Report time of the tasks, searched by key. Can pass a rate (1h).') .alias('r') .action(function(tasks, rate) { @@ -108,8 +108,6 @@ program EXEC = true }) - - program .command('log ') .description('Logs the time of the task') @@ -133,9 +131,24 @@ program }) program - .parse(process.argv); + .command('delete [task_string]') + .description('Remove tasks from the list') + .alias('cl') + .action(function(string) { + manager.delete(string) + EXEC = true + }) + +program + .parse(process.argv) + + +if (program.updateDB) { + manager.update() + EXEC = true +} -if (program.args.length === 0 || !EXEC) { +if (!EXEC) { cliError('You must use a valid command.') program.outputHelp() process.exit(1) From dfe96dc734d9ba9f1cc3fa2cb8f5160488c79228 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 16:01:50 +0100 Subject: [PATCH 06/51] some little fixes --- package.json | 6 +++--- src/index.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 57a2fcb..02c4a84 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "build": "node_modules/.bin/babel -s -d lib src", "dev": "npm run build -- -w", "test": "mocha -R spec --require source-map-support/register lib/__test__/*.spec.js ", - "test:dev": "npm run test -- -w" + "test:dev": "npm run test -- -w", + "postinstall": "timer --updateDB" }, "repository": { "type": "git", @@ -32,8 +33,7 @@ "babel-cli": "^6.22.2", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-preset-es2015": "^6.22.0", - "babel-preset-stage-0": "^6.22.0", - "mocha": "^3.2.0" + "babel-preset-stage-0": "^6.22.0" }, "dependencies": { "babel-polyfill": "^6.22.0", diff --git a/src/index.js b/src/index.js index f62a5ee..efb4c23 100644 --- a/src/index.js +++ b/src/index.js @@ -100,7 +100,7 @@ program program .command('report [task_string] [rate]') - .description('Report time of the tasks, searched by key. Can pass a rate (1h).') + .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).') .alias('r') .action(function(tasks, rate) { tasks = (tasks) ? tasks : 'all' @@ -132,8 +132,8 @@ program program .command('delete [task_string]') - .description('Remove tasks from the list') - .alias('cl') + .description('Remove tasks from the list. Empty for select all tasks') + .alias('del') .action(function(string) { manager.delete(string) EXEC = true From 56a7634a4297bad3e74cc1227e6ed1d5e2b26f7a Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 16:12:07 +0100 Subject: [PATCH 07/51] add configure and configuration commands --- src/index.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index efb4c23..9f7b673 100644 --- a/src/index.js +++ b/src/index.js @@ -7,7 +7,7 @@ import pkg from '../package.json' import Manager from './core/Manager' import { humanParseDiff } from './core/utils' -import { outputVertical, cliError } from './core/output' +import { outputVertical, cliError, outputConfig } from './core/output' import autocomplete from './autocomplete' @@ -65,6 +65,7 @@ program .description('Stop task, you can add a description') .alias('f') .action(function(key, description) { + description = (description) ? Array.isArray(description) ? description.join(' ') : description : null manager.stopTask(key, description) EXEC = true }) @@ -139,6 +140,22 @@ program EXEC = true }) +program + .command('configure ') + .description('Configure the value of the config passing a key') + .action(function(key, value) { + manager.configure(key, value) + EXEC = true + }) + +program + .command('configuration') + .description('Output configuration') + .action(function(string) { + outputConfig(manager.getConfig()) + EXEC = true + }) + program .parse(process.argv) From f0252b18e951df7f5b4010568d3988dc431219d5 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 16:18:00 +0100 Subject: [PATCH 08/51] Moving some config to constants to use on autocomplete --- src/autocomplete.js | 7 ++++++- src/core/Manager.js | 5 ++--- src/core/constants.js | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/autocomplete.js b/src/autocomplete.js index 16af9f5..18fad3d 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -1,4 +1,5 @@ import omelette from 'omelette' +import { configElements } from './core/constants' const autocomplete = function(config){ @@ -9,7 +10,7 @@ const autocomplete = function(config){ } complete.on("cmd", function() { - this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete"]) + this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]) }); complete.on("key", function(cmd) { @@ -18,6 +19,10 @@ const autocomplete = function(config){ if (keyTasks.indexOf(cmd) > -1){ this.reply(Object.keys(config.all.tasks)); } + + if (cmd === 'configure' ){ + this.reply(configElements); + } }); complete.init(); diff --git a/src/core/Manager.js b/src/core/Manager.js index 92220cc..93e91bf 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -4,13 +4,12 @@ import inquirer from 'inquirer' import Task from './Task' import { recognizeModifierTiming } from './utils' -import { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED } from './constants' +import { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants' import { sumarize, outputVertical, cliError, cliSuccess } from './output' import { migrateToV2 } from './dbMigrations' export default class Manager { - configElements = ['format.output'] repositories = ['tasks', 'config'] constructor(cfg) { @@ -152,7 +151,7 @@ export default class Manager { configure(element, value){ - if (this.configElements.indexOf(element) < 0){ + if (configElements.indexOf(element) < 0){ return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `) } diff --git a/src/core/constants.js b/src/core/constants.js index ac92ddd..80f9a57 100644 --- a/src/core/constants.js +++ b/src/core/constants.js @@ -3,3 +3,4 @@ export const PAUSED = 'PAUSED' export const UNPAUSED = 'UNPAUSED' export const IN_PROGRESS = 'IN_PROGRESS' export const FINISHED = 'FINISHED' +export const configElements = ['format.output'] From 8f4eb4567dfe324a36362ca15201bee5240b92f4 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 16:52:08 +0100 Subject: [PATCH 09/51] Add changeling and updated readme --- CHANGELOG.md | 9 ++++ README.md | 125 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 90 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6638936..7f42d4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [v2.0.0] - Jan 25, 2017 + +- Internal Rework, now you use commands in a git style +- Added Autcomplete, of the commands and tasks +- Added configure and configuration to modify the ouput time on the table +- Added pause and unpause methods +- Added --updateDB method to update the config to the version 2 + ## [v1.1.2] - Feb 11, 2016 - Added the posibility to calc an amount from a rate in the -r option @@ -18,3 +26,4 @@ [v1.1.0]: https://github.com/danibram/time-tracker-cli/compare/v1.0.0...v1.1.0 [v1.1.1]: https://github.com/danibram/time-tracker-cli/compare/v1.1.0...v1.1.1 [v1.1.2]: https://github.com/danibram/time-tracker-cli/compare/v1.1.1...v1.1.2 +[v2.0.0]: https://github.com/danibram/time-tracker-cli/compare/v1.1.2...v2.0.0 diff --git a/README.md b/README.md index c16c483..5adfbb6 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,120 @@ # Tiny Time tracker -[![NPM](https://nodei.co/npm/time-tracker-cli.png?downloads=true)](https://nodei.co/npm/time-tracker-cli/) +[![NPM](https://nodei.co/npm/time-tracker-cli.png?downloads=true)][npm-home-module] [![npm version](https://img.shields.io/npm/v/time-tracker-cli.svg?style=flat-square)](https://github.com/danibram/time-tracker-cli) -[![Dependency Status](https://david-dm.org/danibram/time-tracker-cli.svg?style=flat-square)](https://david-dm.org/danibram/time-tracker-cli)[![DevDependency Status](https://img.shields.io/david/dev/danibram/time-tracker-cli.svg?style=flat-square)][npm-home-module] - +[![Dependency Status](https://img.shields.io/bithound/dependencies/github/danibram/time-tracker-cli.svg?style=flat-square)](https://www.bithound.io/github/danibram/time-tracker-cli) [![Support link][paypal-badge]][paypal-link] ## Usage -[![asciicast](https://asciinema.org/a/dzegwhnwxvv28q84u8uvsgyas.png)](https://asciinema.org/a/dzegwhnwxvv28q84u8uvsgyas) +[![asciicast](https://asciinema.org/a/100679.png)](https://asciinema.org/a/100679) ``` -±❩❩❩ timer --help +└┘#! timer + +Usage: timer [options] [command] + - Usage: timer [options] + Commands: - Tiny time tracker for projects + start|s [description] Start task with a description. + pause|p Pause task + unpause|up Unpause task + finish|f [description] Stop task, you can add a description + description|d Add description to your task. + add Adds time to a task. Example: "1h2m3s" + subtract|sub Subtract time to a task. Example: "1h2m3s" + report|r [task_string] [rate] Report time of the tasks, empty for select all tasks. Can pass a rate (1h). + log|l Logs the time of the task + export|e Export the tasks in a JSON + delete|del [task_string] Remove tasks from the list. Empty for select all tasks + configure Configure the value of the config passing a key + configuration Output configuration - Options: + Tiny time tracker for projects - -h, --help output usage information - -V, --version output the version number - -s, --start Start the timer task. - -f, --finish Stops the timer task. - -d, --description Adds a description for the task only in start/stop methods. - -a, --add Adds time to a task. Example: "1h2m3s" - --remove Subtract time from a task. Example: "1h2m3s" - -l, --log Logs the timer task. - -r, --report Report time of the tasks, searched by key, you can report all using all as key. Also you can pass a rate to calc an amount ex: 20h, calc the hours and multiply by 20 - -e, --export Prints the json of all tasks. + Options: + + -h, --help output usage information + -V, --version output the version number + --updateDB Bool to update the db ``` - To start a task run: ``` -$ timer -s -d +$ timer start ``` - To finish a task run: ``` -$ timer -s -d +$ timer finish ``` - You can add a description adding: ``` -$ timer -s -d -$ timer -h -d +$ timer description ``` - You can also see the timer running: ``` -$ timer -l +$ timer log ``` + ## How it works The data are stored inside ~/.config/time-tracker-cli.json -If you open you should see: +The config need to be updated if you have the 1.x to the 2.x to do that, to update config run timer --updateDB +If you open you should see: ```javascript { - "tasks": { - "work1.website.design": { - "start": "2016-02-19T10:00:36.393Z", - "stop": "2016-02-19T18:01:50.921Z" - }, - "work1.website.deployServer": { - "start": "2016-02-19T10:01:59.116Z", - "stop": "2016-02-19T10:32:10.687Z" - }, - "work1.api.develop.userController": { - "start": "2016-02-19T10:04:23.060Z", - "stop": "2016-02-19T20:04:36.836Z" - }, - "work1.api.develop.loginController": { - "start": "2016-02-19T10:09:41.848Z", - "stop": "2016-02-19T13:11:54.059Z" - } - } + "tasks": { + "work1.website.design": { + "description": "If you added one", + "timings": [{ + "start": "2016-02-19T10:00:36.393Z", + "stop": "2016-02-19T18:01:50.921Z" + }], + "log": [ + "start#2016-02-19T10:00:36.393Z", + "stop#2016-02-19T18:01:50.921Z" + ] + }, + "work1.website.deployServer": { + "timings": [{ + "start": "2016-02-19T10:01:59.116Z", + "stop": "2016-02-19T10:32:10.687Z" + }], + "log": [ + "start#2016-02-19T10:01:59.116Z", + "stop#2016-02-19T10:32:10.687Z" + ] + }, + "work2.api.develop.userController": { + "timings": [{ + "start": "2016-02-19T10:04:23.060Z", + "stop": "2016-02-19T20:04:36.836Z" + }], + "log": [ + "start#2016-02-19T10:04:23.060Z", + "stop#2016-02-19T20:04:36.836Z" + ] + }, + "work2.api.develop.loginController": { + "timings": [{ + "start": "2016-02-19T10:09:41.848Z", + "stop": "2016-02-19T13:11:54.059Z" + }], + "log": [ + "start#2016-02-19T10:09:41.848Z", + "stop#2016-02-19T13:11:54.059Z" + ] + } + }, + "config": { + "format.output": "DD/MM", + "config.version": 2 + } } ``` -The -r method, simply finds by regex and count the time. - ## Development Run ```npm install;npm run dev``` to watch the proyect, and compile the code automatically. From ffe1e71c5bf335a5f5b5fd56f99bde479d0e8ffc Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 25 Jan 2017 16:52:55 +0100 Subject: [PATCH 10/51] new Build --- lib/autocomplete.js | 12 +++- lib/autocomplete.js.map | 2 +- lib/core/Manager.js | 130 +++++++++++++++++++++-------------- lib/core/Manager.js.map | 2 +- lib/core/constants.js | 1 + lib/core/constants.js.map | 2 +- lib/core/dbMigrations.js | 42 +++++++++++ lib/core/dbMigrations.js.map | 1 + lib/core/output.js | 14 ++-- lib/core/output.js.map | 2 +- lib/index.js | 33 +++++++-- lib/index.js.map | 2 +- src/index.js | 1 + 13 files changed, 174 insertions(+), 70 deletions(-) create mode 100644 lib/core/dbMigrations.js create mode 100644 lib/core/dbMigrations.js.map diff --git a/lib/autocomplete.js b/lib/autocomplete.js index cd21ddb..01cb0a8 100644 --- a/lib/autocomplete.js +++ b/lib/autocomplete.js @@ -1,13 +1,15 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var _omelette = require("omelette"); +var _omelette = require('omelette'); var _omelette2 = _interopRequireDefault(_omelette); +var _constants = require('./core/constants'); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var autocomplete = function autocomplete(config) { @@ -19,7 +21,7 @@ var autocomplete = function autocomplete(config) { }; complete.on("cmd", function () { - this.reply(["start", "pause", "unpause", "finish", "description", "add", "remove", "report", "log", "export"]); + this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]); }); complete.on("key", function (cmd) { @@ -28,6 +30,10 @@ var autocomplete = function autocomplete(config) { if (keyTasks.indexOf(cmd) > -1) { this.reply(Object.keys(config.all.tasks)); } + + if (cmd === 'configure') { + this.reply(_constants.configElements); + } }); complete.init(); diff --git a/lib/autocomplete.js.map b/lib/autocomplete.js.map index e68f8ef..09e4110 100644 --- a/lib/autocomplete.js.map +++ b/lib/autocomplete.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","complete","allTaskKeys","reply","Object","keys","all","tasks","on","cmd","keyTasks","indexOf","init","process","argv","setupShellInitFile"],"mappings":";;;;;;AAAA;;;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAgB;;AAEjC,QAAMC,WAAW,wBAAS,mBAAT,CAAjB;;AAEA,QAAIC,cAAc,SAAdA,WAAc,GAAW;AACzB,aAAKC,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH,KAFD;;AAIAN,aAASO,EAAT,CAAY,KAAZ,EAAmB,YAAW;AAC1B,aAAKL,KAAL,CAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,QAA9D,EAAwE,QAAxE,EAAkF,KAAlF,EAAyF,QAAzF,CAAX;AACH,KAFD;;AAIAF,aAASO,EAAT,CAAY,KAAZ,EAAmB,UAASC,GAAT,EAAc;AAC7B,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,GAAjB,IAAwB,CAAC,CAA7B,EAA+B;AAC3B,iBAAKN,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH;AACJ,KAND;;AAQAN,aAASW,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaH,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCV,iBAASc,kBAAT;AACH;AAEJ,CA1BD;;kBA4BehB,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\n\nconst autocomplete = function(config){\n\n const complete = omelette(\"timer \")\n\n let allTaskKeys = function() {\n this.reply(Object.keys(config.all.tasks));\n }\n\n complete.on(\"cmd\", function() {\n this.reply([\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"remove\", \"report\", \"log\", \"export\"])\n });\n\n complete.on(\"key\", function(cmd) {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(cmd) > -1){\n this.reply(Object.keys(config.all.tasks));\n }\n });\n\n complete.init();\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile();\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file +{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","complete","allTaskKeys","reply","Object","keys","all","tasks","on","cmd","keyTasks","indexOf","init","process","argv","setupShellInitFile"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAgB;;AAEjC,QAAMC,WAAW,wBAAS,mBAAT,CAAjB;;AAEA,QAAIC,cAAc,SAAdA,WAAc,GAAW;AACzB,aAAKC,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH,KAFD;;AAIAN,aAASO,EAAT,CAAY,KAAZ,EAAmB,YAAW;AAC1B,aAAKL,KAAL,CAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAAX;AACH,KAFD;;AAIAF,aAASO,EAAT,CAAY,KAAZ,EAAmB,UAASC,GAAT,EAAc;AAC7B,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,GAAjB,IAAwB,CAAC,CAA7B,EAA+B;AAC3B,iBAAKN,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH;;AAED,YAAIE,QAAQ,WAAZ,EAAyB;AACrB,iBAAKN,KAAL;AACH;AACJ,KAVD;;AAYAF,aAASW,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaH,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCV,iBAASc,kBAAT;AACH;AAEJ,CA9BD;;kBAgCehB,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport { configElements } from './core/constants'\n\nconst autocomplete = function(config){\n\n const complete = omelette(\"timer \")\n\n let allTaskKeys = function() {\n this.reply(Object.keys(config.all.tasks));\n }\n\n complete.on(\"cmd\", function() {\n this.reply([\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"])\n });\n\n complete.on(\"key\", function(cmd) {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(cmd) > -1){\n this.reply(Object.keys(config.all.tasks));\n }\n\n if (cmd === 'configure' ){\n this.reply(configElements);\n }\n });\n\n complete.init();\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile();\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file diff --git a/lib/core/Manager.js b/lib/core/Manager.js index fae0253..7db44ce 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -11,20 +11,26 @@ var _flat = require('flat'); var _flat2 = _interopRequireDefault(_flat); -var _Task = require('./Task'); - -var _Task2 = _interopRequireDefault(_Task); - var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); +var _inquirer = require('inquirer'); + +var _inquirer2 = _interopRequireDefault(_inquirer); + +var _Task = require('./Task'); + +var _Task2 = _interopRequireDefault(_Task); + var _utils = require('./utils'); var _constants = require('./constants'); var _output = require('./output'); +var _dbMigrations = require('./dbMigrations'); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -33,25 +39,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var Manager = function () { function Manager(cfg) { - var _this = this; - _classCallCheck(this, Manager); - this.configElements = ['format.output']; this.repositories = ['tasks', 'config']; this.cfg = cfg; this.tasks = cfg.all.tasks; this.config = cfg.all.config ? cfg.all.config : {}; - - if (!this.config['config.version']) { - this.migrateToV2(this.tasks).then(function (migratedTasks) { - _this.cfg.set('tasks', migratedTasks); - _this.cfg.set('config', Object.assign(_this.config, { - 'config.version': 2 - })); - }, _output.cliError).catch(_output.cliError); - } } _createClass(Manager, [{ @@ -71,44 +65,44 @@ var Manager = function () { }, { key: 'startTask', value: function startTask(key, description) { - var _this2 = this; + var _this = this; var t = this.getTask(key); t.start(description).then(function () { - _this2.storeTask(key, t); + _this.storeTask(key, t); console.log((0, _output.outputVertical)('Task:', key, _constants.STARTED, (0, _moment2.default)().toISOString())); }, _output.cliError).catch(_output.cliError); } }, { key: 'pauseTask', value: function pauseTask(key) { - var _this3 = this; + var _this2 = this; var t = this.getTask(key); t.pause().then(function () { - _this3.storeTask(key, t); + _this2.storeTask(key, t); console.log((0, _output.outputVertical)('Task:', key, _constants.PAUSED, (0, _moment2.default)().toISOString())); }, _output.cliError).catch(_output.cliError); } }, { key: 'unpauseTask', value: function unpauseTask(key) { - var _this4 = this; + var _this3 = this; var t = this.getTask(key); t.unpause().then(function () { - _this4.storeTask(key, t); + _this3.storeTask(key, t); console.log((0, _output.outputVertical)('Task:', key, _constants.UNPAUSED, (0, _moment2.default)().toISOString())); }, _output.cliError).catch(_output.cliError); } }, { key: 'stopTask', value: function stopTask(key, description) { - var _this5 = this; + var _this4 = this; var t = this.getTask(key); t.stop(description).then(function () { - _this5.storeTask(key, t); + _this4.storeTask(key, t); console.log((0, _output.outputVertical)('Task:', key, _constants.FINISHED, (0, _moment2.default)().toISOString())); }, _output.cliError).catch(_output.cliError); } @@ -128,17 +122,17 @@ var Manager = function () { }, { key: 'modifyTask', value: function modifyTask(operation, name, stringTime) { - var _this6 = this; + var _this5 = this; var t = this.getTask(name); t.makeOperationOverTime(operation, stringTime).then(function () { - _this6.storeTask(name, t); + _this5.storeTask(name, t); }, _output.cliError).catch(_output.cliError); } }, { key: 'search', value: function search(string) { - var _this7 = this; + var _this6 = this; var keys = Object.keys(this.tasks); var tasks = []; @@ -146,12 +140,43 @@ var Manager = function () { if (string === 'all' || key.indexOf(string) > -1) { tasks.push({ name: key, - task: new _Task2.default(_this7.tasks[key]) + task: new _Task2.default(_this6.tasks[key]) }); } }); return tasks; } + }, { + key: 'delete', + value: function _delete(string) { + var _this7 = this; + + var tasks = this.search(string); + + console.log(tasks.map(function (k) { + return k.name + ' \n'; + }).join('')); + + if (tasks.length === 0) { + (0, _output.cliSuccess)('No tasks found to delete.'); + return; + } + + _inquirer2.default.prompt([{ + type: 'confirm', + name: 'cls', + message: 'Are you sure you want to delete this tasks?', + default: false + }]).then(function (answers) { + if (answers.cls) { + tasks.forEach(function (k) { + delete _this7.tasks[k.name]; + _this7.cfg.set('tasks', _this7.tasks); + }); + (0, _output.cliSuccess)('Tasks deleted.'); + } + }).catch(_output.cliError); + } }, { key: 'getTasksJson', value: function getTasksJson() { @@ -166,7 +191,7 @@ var Manager = function () { key: 'configure', value: function configure(element, value) { - if (this.configElements.indexOf(element) < 0) { + if (_constants.configElements.indexOf(element) < 0) { return (0, _output.cliError)('Config key (' + element + ') not allowed, allowed keys: ' + this.configElements.toString() + ' '); } @@ -178,29 +203,30 @@ var Manager = function () { return this.config; } }, { - key: 'migrateToV2', - value: function migrateToV2(tasks) { - return new Promise(function (resolve, reject) { - Object.keys(tasks).forEach(function (k) { - if (!tasks[k].timings) { - reject('Config migrated'); - } - - if (!tasks[k].start && !tasks[k].stop) { - reject('Config corrupted or migrated'); - } - - tasks[k].timings = [{ - start: tasks[k].start ? tasks[k].start : null, - stop: tasks[k].stop ? tasks[k].stop : null - }]; - - delete tasks[k].start; - delete tasks[k].stop; - }); - - resolve(tasks); - }); + key: 'update', + value: function update() { + var _this8 = this; + + if (!this.config || this.config && this.config['config.version'] !== '2') { + console.log('DB: Need to be updated'); + + (0, _dbMigrations.migrateToV2)(this.tasks).then(function (tasks) { + var newTasks = {}; + tasks.forEach(function (t) { + return newTasks[t.key] = t.task; + }); + return newTasks; + }).then(function (migratedTasks) { + _this8.cfg.set('tasks', migratedTasks); + _this8.cfg.set('config', Object.assign(_this8.config, { + 'config.version': '2' + })); + + (0, _output.cliSuccess)('Configuration migrated to version 2.'); + }, _output.cliError).catch(_output.cliError); + } else { + (0, _output.cliSuccess)('No need to update the DB.'); + } } }, { key: 'sumarize', diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map index 882ac95..82f745f 100644 --- a/lib/core/Manager.js.map +++ b/lib/core/Manager.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","configElements","repositories","tasks","all","config","migrateToV2","then","migratedTasks","set","Object","assign","catch","key","task","update","get","description","t","getTask","start","storeTask","console","log","toISOString","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","unflatten","element","value","toString","newCfg","Promise","resolve","reject","k","timings","rate","full","search"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\n\nimport Task from './Task'\nimport moment from 'moment'\n\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { sumarize, outputVertical, cliError } from './output'\n\nexport default class Manager {\n\n configElements = ['format.output']\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n\n if (!this.config['config.version']){\n this.migrateToV2(this.tasks)\n .then((migratedTasks)=>{\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': 2\n }))\n }, cliError)\n .catch(cliError)\n }\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n getTasksJson() {\n return flat.unflatten(this.tasks)\n }\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (this.configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n migrateToV2(tasks){\n return new Promise((resolve, reject)=>{\n Object.keys(tasks).forEach(k => {\n if (!tasks[k].timings){\n reject('Config migrated')\n }\n\n if (!tasks[k].start && !tasks[k].stop){\n reject('Config corrupted or migrated')\n }\n\n tasks[k].timings = [{\n start: (tasks[k].start) ? tasks[k].start : null,\n stop: (tasks[k].stop) ? tasks[k].stop : null\n }]\n\n delete tasks[k].start\n delete tasks[k].stop\n })\n\n resolve(tasks)\n })\n\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson() {\n return flat.unflatten(this.tasks)\n }\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/constants.js b/lib/core/constants.js index 741775c..0cef4a4 100644 --- a/lib/core/constants.js +++ b/lib/core/constants.js @@ -8,4 +8,5 @@ var PAUSED = exports.PAUSED = 'PAUSED'; var UNPAUSED = exports.UNPAUSED = 'UNPAUSED'; var IN_PROGRESS = exports.IN_PROGRESS = 'IN_PROGRESS'; var FINISHED = exports.FINISHED = 'FINISHED'; +var configElements = exports.configElements = ['format.output']; //# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/lib/core/constants.js.map b/lib/core/constants.js.map index fd7cc88..a4ab00c 100644 --- a/lib/core/constants.js.map +++ b/lib/core/constants.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/constants.js"],"names":["STARTED","PAUSED","UNPAUSED","IN_PROGRESS","FINISHED"],"mappings":";;;;;AAAO,IAAMA,4BAAU,SAAhB;AACA,IAAMC,0BAAS,QAAf;AACA,IAAMC,8BAAW,UAAjB;AACA,IAAMC,oCAAc,aAApB;AACA,IAAMC,8BAAW,UAAjB","file":"constants.js","sourcesContent":["export const STARTED = 'STARTED'\nexport const PAUSED = 'PAUSED'\nexport const UNPAUSED = 'UNPAUSED'\nexport const IN_PROGRESS = 'IN_PROGRESS'\nexport const FINISHED = 'FINISHED'\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/constants.js"],"names":["STARTED","PAUSED","UNPAUSED","IN_PROGRESS","FINISHED","configElements"],"mappings":";;;;;AAAO,IAAMA,4BAAU,SAAhB;AACA,IAAMC,0BAAS,QAAf;AACA,IAAMC,8BAAW,UAAjB;AACA,IAAMC,oCAAc,aAApB;AACA,IAAMC,8BAAW,UAAjB;AACA,IAAMC,0CAAiB,CAAC,eAAD,CAAvB","file":"constants.js","sourcesContent":["export const STARTED = 'STARTED'\nexport const PAUSED = 'PAUSED'\nexport const UNPAUSED = 'UNPAUSED'\nexport const IN_PROGRESS = 'IN_PROGRESS'\nexport const FINISHED = 'FINISHED'\nexport const configElements = ['format.output']\n"]} \ No newline at end of file diff --git a/lib/core/dbMigrations.js b/lib/core/dbMigrations.js new file mode 100644 index 0000000..c511734 --- /dev/null +++ b/lib/core/dbMigrations.js @@ -0,0 +1,42 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var migrateToV2 = exports.migrateToV2 = function migrateToV2(tasks) { + var promises = []; + var migrate = function migrate(key, task) { + return new Promise(function (resolve, reject) { + + var timing = {}; + var update = false; + + if (task.start) { + update = true; + timing.start = task.start; + delete task.start; + } + + if (task.stop) { + timing.stop = task.stop; + delete task.stop; + } + + if (update) { + task.timings = [timing]; + } + + resolve({ + key: key, + task: task + }); + }); + }; + + Object.keys(tasks).forEach(function (k) { + return promises.push(migrate(k, tasks[k])); + }); + + return Promise.all(promises); +}; +//# sourceMappingURL=dbMigrations.js.map \ No newline at end of file diff --git a/lib/core/dbMigrations.js.map b/lib/core/dbMigrations.js.map new file mode 100644 index 0000000..354b01a --- /dev/null +++ b/lib/core/dbMigrations.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/core/dbMigrations.js"],"names":["migrateToV2","tasks","promises","migrate","key","task","Promise","resolve","reject","timing","update","start","stop","timings","Object","keys","forEach","push","k","all"],"mappings":";;;;;AAAO,IAAMA,oCAAc,SAAdA,WAAc,CAAUC,KAAV,EAAgB;AACvC,QAAIC,WAAW,EAAf;AACA,QAAIC,UAAU,SAAVA,OAAU,CAACC,GAAD,EAAMC,IAAN;AAAA,eAAe,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;;AAE1D,gBAAIC,SAAS,EAAb;AACA,gBAAIC,SAAS,KAAb;;AAEA,gBAAIL,KAAKM,KAAT,EAAgB;AACZD,yBAAS,IAAT;AACAD,uBAAOE,KAAP,GAAeN,KAAKM,KAApB;AACA,uBAAON,KAAKM,KAAZ;AACH;;AAED,gBAAIN,KAAKO,IAAT,EAAe;AACXH,uBAAOG,IAAP,GAAcP,KAAKO,IAAnB;AACA,uBAAOP,KAAKO,IAAZ;AACH;;AAED,gBAAIF,MAAJ,EAAY;AACRL,qBAAKQ,OAAL,GAAe,CAACJ,MAAD,CAAf;AACH;;AAEDF,oBAAQ;AACJH,wBADI;AAEJC;AAFI,aAAR;AAIH,SAxB4B,CAAf;AAAA,KAAd;;AA0BAS,WAAOC,IAAP,CAAYd,KAAZ,EAAmBe,OAAnB,CAA2B;AAAA,eAAKd,SAASe,IAAT,CAAed,QAAQe,CAAR,EAAWjB,MAAMiB,CAAN,CAAX,CAAf,CAAL;AAAA,KAA3B;;AAEA,WAAOZ,QAAQa,GAAR,CAAYjB,QAAZ,CAAP;AACH,CA/BM","file":"dbMigrations.js","sourcesContent":["export const migrateToV2 = function (tasks){\n let promises = []\n let migrate = (key, task) => new Promise((resolve, reject) => {\n\n let timing = {}\n let update = false\n\n if (task.start) {\n update = true\n timing.start = task.start\n delete task.start\n }\n\n if (task.stop) {\n timing.stop = task.stop\n delete task.stop\n }\n\n if (update) {\n task.timings = [timing]\n }\n\n resolve({\n key,\n task\n })\n })\n\n Object.keys(tasks).forEach(k => promises.push( migrate(k, tasks[k]) ))\n\n return Promise.all(promises)\n}\n"]} \ No newline at end of file diff --git a/lib/core/output.js b/lib/core/output.js index edec25e..3b9e401 100644 --- a/lib/core/output.js +++ b/lib/core/output.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; +exports.cliSuccess = exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; var _moment = require('moment'); @@ -13,6 +13,10 @@ var _cliTable = require('cli-table'); var _cliTable2 = _interopRequireDefault(_cliTable); +var _chalk = require('chalk'); + +var _chalk2 = _interopRequireDefault(_chalk); + var _utils = require('./utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -81,8 +85,10 @@ var outputVertical = exports.outputVertical = function outputVertical() { }; var cliError = exports.cliError = function cliError(err) { - console.log('\x1b[31m'); // red - console.error('Error: ' + err); - console.log('\x1b[0m'); // end red + console.error(_chalk2.default.red('Error: ' + err)); +}; + +var cliSuccess = exports.cliSuccess = function cliSuccess(err) { + console.log(_chalk2.default.green(err)); }; //# sourceMappingURL=output.js.map \ No newline at end of file diff --git a/lib/core/output.js.map b/lib/core/output.js.map index 12aad92..2df6e59 100644 --- a/lib/core/output.js.map +++ b/lib/core/output.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","chars","colAligns","style","total","forEach","task","index","name","duration","getSeconds","push","getStartDate","console","log","toString","table2","outputConfig","config","Object","keys","map","e","outputVertical","args","key","splice","cliError","err","error"],"mappings":";;;;;;;AAAA;;;;AACA;;;;AAEA;;;;;;AAEO,IAAMA,8BAAW,SAAXA,QAAW,CAASC,MAAT,EAAiBC,KAAjB,EAAwBC,IAAxB,EAA8BC,IAA9B,EAAoCC,MAApC,EAA4C;AAChE,QAAIC,QAAQ,uBAAU;AAClBC,cAAM,CAAC,UAAD,EAAa,OAAb,EAAsB,MAAtB,CADY;AAElBC,eAAO,EAAC,OAAO,EAAR,EAAY,YAAY,EAAxB,EAA4B,WAAW,EAAvC,EAA2C,aAAa,EAAxD,EAFW;AAGlBC,mBAAW,CAAC,OAAD,EAAU,QAAV,EAAoB,MAApB,CAHO;AAIlBC,eAAO,EAAEH,MAAM,CAAC,OAAD,CAAR;AAJW,KAAV,CAAZ;AAMA,QAAII,QAAQ,CAAZ;AACA,QAAIJ,oBAAiBN,MAAjB,QAAJ;;AAEAC,UAAMU,OAAN,CAAc,UAACC,IAAD,EAAOC,KAAP,EAAiB;AAC3B,YAAIC,OAAOF,KAAKE,IAAhB;AACAF,eAAOA,KAAKA,IAAZ;;AAEA,YAAIG,WAAWH,KAAKI,UAAL,EAAf;AACAN,iBAASK,QAAT;;AAEAV,cAAMY,IAAN,CAAW,CAAC,2BAAeF,QAAf,CAAD,EAA2B,sBAAOH,KAAKM,YAAL,EAAP,EAA4Bd,MAA5B,CAAmCA,MAAnC,CAA3B,EAAuEU,IAAvE,CAAX;AACH,KARD;;AAUAK,YAAQC,GAAR,CAAYf,MAAMgB,QAAN,EAAZ;;AAEA,QAAIlB,IAAJ,EAAS;AACL,YAAImB,SAAS,wBAAb;AACAA,eAAOL,IAAP,CACI,EAAE,UAAU,CAAC,OAAOjB,MAAP,GAAgB,IAAjB,CAAZ,EADJ,EAEI,EAAE,cAAc,CAAC,2BAAeU,KAAf,CAAD,CAAhB,EAFJ;;AAKA,YAAIR,IAAJ,EAAS;AACLoB,mBAAOL,IAAP,CAAY,EAAE,QAAQ,CAAC,qBAASf,IAAT,EAAeQ,KAAf,CAAD,CAAV,EAAZ;AACH;;AAEDS,gBAAQC,GAAR,CAAYE,OAAOD,QAAP,EAAZ;AACH;AACJ,CAnCM;;AAqCA,IAAME,sCAAe,SAAfA,YAAe,CAAUC,MAAV,EAAiB;AACzC,QAAInB,QAAQ,uBAAU;AAClBC,cAAM,CAAC,KAAD,EAAQ,OAAR,CADY;AAElBC,eAAO,EAAC,OAAO,EAAR,EAAY,YAAY,EAAxB,EAA4B,WAAW,EAAvC,EAA2C,aAAa,EAAxD,EAFW;AAGlBC,mBAAW,CAAC,QAAD,EAAW,QAAX,CAHO;AAIlBC,eAAO,EAAEH,MAAM,CAAC,OAAD,CAAR;AAJW,KAAV,CAAZ;;AAOAmB,WAAOC,IAAP,CAAYF,MAAZ,EAAoBG,GAApB,CAAwB;AAAA,eAAKtB,MAAMY,IAAN,CAAW,CAACW,CAAD,EAAIJ,OAAOI,CAAP,CAAJ,CAAX,CAAL;AAAA,KAAxB;;AAEAT,YAAQC,GAAR,CAAYf,MAAMgB,QAAN,EAAZ;AACH,CAXM;;AAaA,IAAMQ,0CAAiB,SAAjBA,cAAiB,GAAkB;AAAA,sCAALC,IAAK;AAALA,YAAK;AAAA;;AAC5C,QAAIR,SAAS,wBAAb;AACI,QAAIS,MAAMD,KAAKE,MAAL,CAAY,CAAZ,EAAe,CAAf,CAAV;AACAV,WAAOL,IAAP,qBACOc,GADP,EACaD,IADb;;AAIA,WAAOR,OAAOD,QAAP,EAAP;AACP,CARM;;AAUA,IAAMY,8BAAW,SAAXA,QAAW,CAASC,GAAT,EAAc;AAClCf,YAAQC,GAAR,CAAY,UAAZ,EADkC,CACT;AACzBD,YAAQgB,KAAR,aAAwBD,GAAxB;AACAf,YAAQC,GAAR,CAAY,SAAZ,EAHkC,CAGV;AAC3B,CAJM","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['right', 'center', 'left'],\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n table.push([humanParseDiff(duration), moment(task.getStartDate()).format(format), name])\n })\n\n console.log(table.toString());\n\n if (full){\n let table2 = new Table()\n table2.push(\n { 'Search': ['\\\"' + search + '\\\"'] },\n { 'Total time': [humanParseDiff(total)] }\n )\n\n if (rate){\n table2.push({ 'Rate': [calcRate(rate, total)] })\n }\n\n console.log(table2.toString());\n }\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.log('\\x1b[31m'); // red\n console.error(`Error: ${err}`)\n console.log('\\x1b[0m'); // end red\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","chars","colAligns","style","total","forEach","task","index","name","duration","getSeconds","push","getStartDate","console","log","toString","table2","outputConfig","config","Object","keys","map","e","outputVertical","args","key","splice","cliError","err","error","red","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table'\nimport chalk from 'chalk'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['right', 'center', 'left'],\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n table.push([humanParseDiff(duration), moment(task.getStartDate()).format(format), name])\n })\n\n console.log(table.toString());\n\n if (full){\n let table2 = new Table()\n table2.push(\n { 'Search': ['\\\"' + search + '\\\"'] },\n { 'Total time': [humanParseDiff(total)] }\n )\n\n if (rate){\n table2.push({ 'Rate': [calcRate(rate, total)] })\n }\n\n console.log(table2.toString());\n }\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(chalk.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(chalk.green(err))\n}\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index fa7c147..7093506 100644 --- a/lib/index.js +++ b/lib/index.js @@ -35,8 +35,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var config = new _configstore2.default(_package2.default.name, { tasks: {}, config: { - 'format.output': 'DD/MM', - 'config.version': '2' + 'format.output': 'DD/MM' } }); @@ -48,7 +47,7 @@ var manager = new _Manager2.default(config); //Exec var EXEC = false; -_commander2.default.version(_package2.default.version).description('Tiny time tracker for projects'); +_commander2.default.version(_package2.default.version).description('Tiny time tracker for projects').option('--updateDB', 'Bool to update the db'); _commander2.default.command('start [description]').description('Start task with a description.').alias('s').action(function (key, description) { description = description ? Array.isArray(description) ? description.join(' ') : description : null; @@ -67,6 +66,7 @@ _commander2.default.command('unpause ').description('Unpause task').al }); _commander2.default.command('finish [description]').description('Stop task, you can add a description').alias('f').action(function (key, description) { + description = description ? Array.isArray(description) ? description.join(' ') : description : null; manager.stopTask(key, description); EXEC = true; }); @@ -83,13 +83,13 @@ _commander2.default.command('add ').description('Adds tim EXEC = true; }); -_commander2.default.command('remove ').description('Subtract time to a task. Example: "1h2m3s"').alias('sub').action(function (key, stringTime) { +_commander2.default.command('subtract ').description('Subtract time to a task. Example: "1h2m3s"').alias('sub').action(function (key, stringTime) { manager.modifyTask('subtract', key, stringTime); manager.sumarize(key, manager.search(key), false); EXEC = true; }); -_commander2.default.command('report [tasks] [rate]').description('Report time of the tasks, searched by key. Can pass a rate (1h).').alias('r').action(function (tasks, rate) { +_commander2.default.command('report [task_string] [rate]').description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).').alias('r').action(function (tasks, rate) { tasks = tasks ? tasks : 'all'; manager.sumarize(tasks, rate); EXEC = true; @@ -109,9 +109,30 @@ _commander2.default.command('export').description('Export the tasks in a JSON'). EXEC = true; }); +_commander2.default.command('delete [task_string]').description('Remove tasks from the list. Empty for select all tasks').alias('del').action(function (string) { + string = string ? string : 'all'; + manager.delete(string); + EXEC = true; +}); + +_commander2.default.command('configure ').description('Configure the value of the config passing a key').action(function (key, value) { + manager.configure(key, value); + EXEC = true; +}); + +_commander2.default.command('configuration').description('Output configuration').action(function (string) { + (0, _output.outputConfig)(manager.getConfig()); + EXEC = true; +}); + _commander2.default.parse(process.argv); -if (_commander2.default.args.length === 0 || !EXEC) { +if (_commander2.default.updateDB) { + manager.update(); + EXEC = true; +} + +if (!EXEC) { (0, _output.cliError)('You must use a valid command.'); _commander2.default.outputHelp(); process.exit(1); diff --git a/lib/index.js.map b/lib/index.js.map index 11dae2e..17aa3c9 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","parse","argv","args","length","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM',\n 'config.version': '2'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('remove ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [tasks] [rate]')\n .description('Report time of the tasks, searched by key. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\n\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\n EXEC = true\n })\n\nprogram\n .parse(process.argv);\n\nif (program.args.length === 0 || !EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 9f7b673..3b7c6f5 100644 --- a/src/index.js +++ b/src/index.js @@ -136,6 +136,7 @@ program .description('Remove tasks from the list. Empty for select all tasks') .alias('del') .action(function(string) { + string = (string) ? string : 'all' manager.delete(string) EXEC = true }) From 1fe6aaf0fbac5f3c460b1d3134cd2ef616515c3b Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Wed, 25 Jan 2017 17:03:11 +0100 Subject: [PATCH 11/51] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5adfbb6..21eb1c4 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Usage: timer [options] [command] -h, --help output usage information -V, --version output the version number - --updateDB Bool to update the db + --updateDB Update the db if its neccesary ``` - To start a task run: @@ -115,6 +115,10 @@ If you open you should see: } ``` +## Notes +To use the autocomplete run `timer --setupCLI` +If you have the version 1.x and you want to conserve the DB, run `timer --updateDB` to update the DB to version 2.x + ## Development Run ```npm install;npm run dev``` to watch the proyect, and compile the code automatically. From facf18e96486e991eb4e779a810a7a82a1fd5edd Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Wed, 25 Jan 2017 17:08:00 +0100 Subject: [PATCH 12/51] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 21eb1c4..adf1ad6 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,17 @@ [![Dependency Status](https://img.shields.io/bithound/dependencies/github/danibram/time-tracker-cli.svg?style=flat-square)](https://www.bithound.io/github/danibram/time-tracker-cli) [![Support link][paypal-badge]][paypal-link] +## Installation + +``` +npm install -g time-tracker-cli +``` +or +``` +yarn global add time-tracker-cli +``` +Now you can start to call `timer`command + ## Usage [![asciicast](https://asciinema.org/a/100679.png)](https://asciinema.org/a/100679) From 91119276a83907c96b24484cccafbc5494d4ac54 Mon Sep 17 00:00:00 2001 From: RyanZim Date: Tue, 11 Apr 2017 09:53:44 -0400 Subject: [PATCH 13/51] Fix capitalization --- lib/core/Task.js | 4 ++-- lib/core/Task.js.map | 2 +- src/core/Task.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/core/Task.js b/lib/core/Task.js index 4c1680b..585ff5d 100644 --- a/lib/core/Task.js +++ b/lib/core/Task.js @@ -13,7 +13,7 @@ var _moment2 = _interopRequireDefault(_moment); var _constants = require('./constants'); -var _Utils = require('./Utils'); +var _utils = require('./utils'); var _output = require('./output'); @@ -174,7 +174,7 @@ var Task = function () { var _this5 = this; return new Promise(function (resolve, reject) { - var parsed = (0, _Utils.recognizeModifierTiming)(stringTime); + var parsed = (0, _utils.recognizeModifierTiming)(stringTime); try { parsed.map(function (t) { diff --git a/lib/core/Task.js.map b/lib/core/Task.js.map index 4aae470..5fe4467 100644 --- a/lib/core/Task.js.map +++ b/lib/core/Task.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './Utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file diff --git a/src/core/Task.js b/src/core/Task.js index 1bea713..4399b76 100644 --- a/src/core/Task.js +++ b/src/core/Task.js @@ -1,7 +1,7 @@ import moment from 'moment' import { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants' -import { recognizeModifierTiming } from './Utils' +import { recognizeModifierTiming } from './utils' import { cliError } from './output' From 6fa6d06f3ae37f917b0dc849f0f57811351433c9 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Tue, 18 Apr 2017 06:40:04 +0200 Subject: [PATCH 14/51] Update dependencies and version up --- package.json | 6 +- yarn.lock | 2128 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2131 insertions(+), 3 deletions(-) create mode 100644 yarn.lock diff --git a/package.json b/package.json index 02c4a84..be115cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.0.0", + "version": "2.0.2", "description": "Tiny time tracker", "keywords": [ "time", @@ -40,11 +40,11 @@ "chalk": "^1.1.3", "cli-table": "^0.3.1", "commander": "^2.9.0", - "configstore": "^2.1.0", + "configstore": "^3.0.0", "flat": "^2.0.0", "inquirer": "^3.0.1", "moment": "^2.11.2", "omelette": "^0.3.1", - "update-notifier": "^1.0.3" + "update-notifier": "^2.1.0" } } diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..e22e2d9 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2128 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +ajv@^4.9.1: + version "4.11.7" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ansi-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" + dependencies: + string-width "^1.0.1" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +aproba@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-cli@^6.22.2: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" + dependencies: + babel-core "^6.24.1" + babel-polyfill "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-do-expressions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-function-bind@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators-legacy@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" + dependencies: + babel-plugin-syntax-decorators "^6.1.18" + babel-runtime "^6.2.0" + babel-template "^6.3.0" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-do-expressions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" + dependencies: + babel-plugin-syntax-do-expressions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-function-bind@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" + dependencies: + babel-plugin-syntax-function-bind "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.22.0, babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-stage-0@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" + dependencies: + babel-plugin-transform-do-expressions "^6.22.0" + babel-plugin-transform-function-bind "^6.22.0" + babel-preset-stage-1 "^6.24.1" + +babel-preset-stage-1@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.24.1, babel-template@^6.3.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.19.0, babel-types@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babel@^6.3.26: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" + +babylon@^6.11.0, babylon@^6.15.0: + version "6.16.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boxen@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.0.0.tgz#b2694baf1f605f708ff0177c12193b22f29aaaab" + dependencies: + ansi-align "^1.1.0" + camelcase "^4.0.0" + chalk "^1.1.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^0.1.0" + widest-line "^1.0.0" + +brace-expansion@^1.0.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.8.1, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.0.0.tgz#e1b8669c1803ccc50b545e92f8e6e79aa80e0196" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + unique-string "^1.0.0" + write-file-atomic "^1.1.2" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn-async@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.1.1, debug@^2.2.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" + dependencies: + ms "0.7.2" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +dot-prop@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +execa@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" + dependencies: + cross-spawn-async "^2.1.1" + is-stream "^1.1.0" + npm-run-path "^1.0.0" + object-assign "^4.0.1" + path-key "^1.0.0" + strip-eof "^1.0.0" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +external-editor@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.1.tgz#4c597c6c88fa6410e41dbbaa7b1be2336aa31095" + dependencies: + tmp "^0.0.31" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +flat@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat/-/flat-2.0.1.tgz#70e29188a74be0c3c89409eed1fa9577907ae32f" + dependencies: + is-buffer "~1.1.2" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.0, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2, is-buffer@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lazy-req@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" + +lodash@^4.2.0, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimatch@^3.0.0, minimatch@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +moment@^2.11.2: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +node-pre-gyp@^0.6.29: + version "0.6.34" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-run-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" + dependencies: + path-key "^1.0.0" + +npmlog@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +omelette@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.3.2.tgz#68c1b3c57ced778b4e67d8637d2559b2c1b3ec26" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-key@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +pseudomap@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.4: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.2.tgz#1b9e51a185c930da34a9894b12a52ea998f1adaf" + dependencies: + rc "^1.1.6" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.14" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" + dependencies: + source-map "^0.5.6" + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +sshpk@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + +string_decoder@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" + dependencies: + buffer-shims "~1.0.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +term-size@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" + dependencies: + execa "^0.4.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +update-notifier@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + lazy-req "^2.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.10: + version "2.0.12" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.12.tgz#73235d9f7176f8e8833fb286795445f7938d84e5" + dependencies: + user-home "^1.1.1" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +which@^1.2.8: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +yallist@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From e055950335451fc6bf7b914933ede36d5f5fe55a Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Tue, 18 Apr 2017 06:41:35 +0200 Subject: [PATCH 15/51] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f42d4c..eabc967 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## [v2.0.2] - Apr 18, 2017 + +- Update dependencies +- Fix typo (Thanks @RyanZim) + ## [v2.0.0] - Jan 25, 2017 - Internal Rework, now you use commands in a git style From 058d20a04e2ad5320068a3bfc60f201e759739c4 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Tue, 18 Apr 2017 06:42:29 +0200 Subject: [PATCH 16/51] Add missing link --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eabc967..e33a13a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,3 +32,4 @@ [v1.1.1]: https://github.com/danibram/time-tracker-cli/compare/v1.1.0...v1.1.1 [v1.1.2]: https://github.com/danibram/time-tracker-cli/compare/v1.1.1...v1.1.2 [v2.0.0]: https://github.com/danibram/time-tracker-cli/compare/v1.1.2...v2.0.0 +[v2.0.2]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.2 \ No newline at end of file From d3d5c94108dc6f6a45b298d2cada101be55d729e Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 25 Apr 2017 05:42:21 +0000 Subject: [PATCH 17/51] docs(readme): add Greenkeeper badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index adf1ad6..d589363 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # Tiny Time tracker + +[![Greenkeeper badge](https://badges.greenkeeper.io/danibram/time-tracker-cli.svg)](https://greenkeeper.io/) [![NPM](https://nodei.co/npm/time-tracker-cli.png?downloads=true)][npm-home-module] [![npm version](https://img.shields.io/npm/v/time-tracker-cli.svg?style=flat-square)](https://github.com/danibram/time-tracker-cli) From 609b5b792d8bdc2206646dd4eda8825c11762971 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 26 Apr 2017 00:48:22 +0000 Subject: [PATCH 18/51] fix(package): update omelette to version 0.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index be115cb..2fe78d5 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "flat": "^2.0.0", "inquirer": "^3.0.1", "moment": "^2.11.2", - "omelette": "^0.3.1", + "omelette": "^0.4.0", "update-notifier": "^2.1.0" } } From aed75c31a4eb9e00fd02a7826fde518d461caf19 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Sat, 6 May 2017 14:21:05 +0200 Subject: [PATCH 19/51] Update deps --- CHANGELOG.md | 4 ++-- package.json | 2 +- yarn.lock | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e33a13a..e0b0761 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## [v2.0.2] - Apr 18, 2017 +## [v2.0.3] - Apr 18, 2017 - Update dependencies - Fix typo (Thanks @RyanZim) @@ -32,4 +32,4 @@ [v1.1.1]: https://github.com/danibram/time-tracker-cli/compare/v1.1.0...v1.1.1 [v1.1.2]: https://github.com/danibram/time-tracker-cli/compare/v1.1.1...v1.1.2 [v2.0.0]: https://github.com/danibram/time-tracker-cli/compare/v1.1.2...v2.0.0 -[v2.0.2]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.2 \ No newline at end of file +[v2.0.3]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.3 \ No newline at end of file diff --git a/package.json b/package.json index 2fe78d5..b81957c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.0.2", + "version": "2.0.3", "description": "Tiny time tracker", "keywords": [ "time", diff --git a/yarn.lock b/yarn.lock index e22e2d9..4243c59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1604,9 +1604,9 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -omelette@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.3.2.tgz#68c1b3c57ced778b4e67d8637d2559b2c1b3ec26" +omelette@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.0.tgz#2401df7d32abda575d17bac652e57487d3b1150d" once@^1.3.0, once@^1.3.3: version "1.4.0" From bd791f38d5c0ff5166e1c8d778c1388d0ad0d4f0 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Sat, 6 May 2017 14:57:26 +0200 Subject: [PATCH 20/51] new version solve autocomplete --- CHANGELOG.md | 5 +++-- lib/autocomplete.js | 42 ++++++++++++++++++++++++++--------------- lib/autocomplete.js.map | 2 +- lib/index.js | 2 +- lib/index.js.map | 2 +- package.json | 2 +- src/autocomplete.js | 38 ++++++++++++++++++++----------------- src/index.js | 2 +- 8 files changed, 56 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0b0761..3dc6377 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ -## [v2.0.3] - Apr 18, 2017 +## [v2.0.7] - Apr 18, 2017 - Update dependencies - Fix typo (Thanks @RyanZim) +- Fix autocomplete ## [v2.0.0] - Jan 25, 2017 @@ -32,4 +33,4 @@ [v1.1.1]: https://github.com/danibram/time-tracker-cli/compare/v1.1.0...v1.1.1 [v1.1.2]: https://github.com/danibram/time-tracker-cli/compare/v1.1.1...v1.1.2 [v2.0.0]: https://github.com/danibram/time-tracker-cli/compare/v1.1.2...v2.0.0 -[v2.0.3]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.3 \ No newline at end of file +[v2.0.7]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.7 \ No newline at end of file diff --git a/lib/autocomplete.js b/lib/autocomplete.js index 01cb0a8..5aa624a 100644 --- a/lib/autocomplete.js +++ b/lib/autocomplete.js @@ -4,38 +4,50 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _templateObject = _taggedTemplateLiteral(['\n timer\n ', '\n ', '\n '], ['\n timer\n ', '\n ', '\n ']); + var _omelette = require('omelette'); var _omelette2 = _interopRequireDefault(_omelette); var _constants = require('./core/constants'); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _package = require('../package.json'); -var autocomplete = function autocomplete(config) { +var _package2 = _interopRequireDefault(_package); - var complete = (0, _omelette2.default)("timer "); +var _configstore = require('configstore'); - var allTaskKeys = function allTaskKeys() { - this.reply(Object.keys(config.all.tasks)); - }; +var _configstore2 = _interopRequireDefault(_configstore); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - complete.on("cmd", function () { - this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]); - }); +function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } + +var config = new _configstore2.default(_package2.default.name, { + tasks: {}, + config: { + 'format.output': 'DD/MM' + } +}); + +var autocomplete = function autocomplete() { + var key = function key(_ref) { + var reply = _ref.reply, + before = _ref.before; - complete.on("key", function (cmd) { var keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']; - if (keyTasks.indexOf(cmd) > -1) { - this.reply(Object.keys(config.all.tasks)); + if (keyTasks.indexOf(before) > -1) { + reply(Object.keys(config.all.tasks)); } - if (cmd === 'configure') { - this.reply(_constants.configElements); + if (before === 'configure') { + reply(_constants.configElements); } - }); + }; + var complete = (0, _omelette2.default)(_templateObject, ["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"], key); complete.init(); if (~process.argv.indexOf('--setupCLI')) { diff --git a/lib/autocomplete.js.map b/lib/autocomplete.js.map index 09e4110..dba55ac 100644 --- a/lib/autocomplete.js.map +++ b/lib/autocomplete.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","complete","allTaskKeys","reply","Object","keys","all","tasks","on","cmd","keyTasks","indexOf","init","process","argv","setupShellInitFile"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAgB;;AAEjC,QAAMC,WAAW,wBAAS,mBAAT,CAAjB;;AAEA,QAAIC,cAAc,SAAdA,WAAc,GAAW;AACzB,aAAKC,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH,KAFD;;AAIAN,aAASO,EAAT,CAAY,KAAZ,EAAmB,YAAW;AAC1B,aAAKL,KAAL,CAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAAX;AACH,KAFD;;AAIAF,aAASO,EAAT,CAAY,KAAZ,EAAmB,UAASC,GAAT,EAAc;AAC7B,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,GAAjB,IAAwB,CAAC,CAA7B,EAA+B;AAC3B,iBAAKN,KAAL,CAAWC,OAAOC,IAAP,CAAYL,OAAOM,GAAP,CAAWC,KAAvB,CAAX;AACH;;AAED,YAAIE,QAAQ,WAAZ,EAAyB;AACrB,iBAAKN,KAAL;AACH;AACJ,KAVD;;AAYAF,aAASW,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaH,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCV,iBAASc,kBAAT;AACH;AAEJ,CA9BD;;kBAgCehB,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport { configElements } from './core/constants'\n\nconst autocomplete = function(config){\n\n const complete = omelette(\"timer \")\n\n let allTaskKeys = function() {\n this.reply(Object.keys(config.all.tasks));\n }\n\n complete.on(\"cmd\", function() {\n this.reply([\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"])\n });\n\n complete.on(\"key\", function(cmd) {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(cmd) > -1){\n this.reply(Object.keys(config.all.tasks));\n }\n\n if (cmd === 'configure' ){\n this.reply(configElements);\n }\n });\n\n complete.init();\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile();\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file +{"version":3,"sources":["../src/autocomplete.js"],"names":["config","name","tasks","autocomplete","key","reply","before","keyTasks","indexOf","Object","keys","all","complete","init","process","argv","setupShellInitFile"],"mappings":";;;;;;;;AAAA;;;;AACA;;AAEA;;;;AACA;;;;;;;;AAEA,IAAMA,SAAS,0BAAgB,kBAAIC,IAApB,EAA0B;AACrCC,WAAM,EAD+B;AAErCF,YAAO;AACH,yBAAiB;AADd;AAF8B,CAA1B,CAAf;;AAOA,IAAMG,eAAe,SAAfA,YAAe,GAAU;AAC3B,QAAIC,MAAM,SAANA,GAAM,OAAqB;AAAA,YAAnBC,KAAmB,QAAnBA,KAAmB;AAAA,YAAZC,MAAY,QAAZA,MAAY;;AAC3B,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,MAAjB,IAA2B,CAAC,CAAhC,EAAkC;AAC9BD,kBAAMI,OAAOC,IAAP,CAAYV,OAAOW,GAAP,CAAWT,KAAvB,CAAN;AACH;;AAED,YAAII,WAAW,WAAf,EAA4B;AACxBD;AACH;AACJ,KAVD;;AAYA,QAAMO,oDAEA,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAFA,EAGAR,GAHA,CAAN;AAKAQ,aAASC,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaP,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCI,iBAASI,kBAAT;AACH;AAEJ,CAxBD;;kBA0Beb,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport { configElements } from './core/constants'\n\nimport pkg from '../package.json'\nimport Configstore from 'configstore'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nconst autocomplete = function(){\n let key = ({reply, before}) => {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(before) > -1){\n reply(Object.keys(config.all.tasks))\n }\n\n if (before === 'configure' ){\n reply(configElements)\n }\n }\n\n const complete = omelette`\n timer\n ${[\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"]}\n ${key}\n `\n complete.init()\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile()\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 7093506..568a222 100644 --- a/lib/index.js +++ b/lib/index.js @@ -42,7 +42,7 @@ var config = new _configstore2.default(_package2.default.name, { (0, _updateNotifier2.default)({ pkg: _package2.default }).notify(); var manager = new _Manager2.default(config); -(0, _autocomplete2.default)(config); +(0, _autocomplete2.default)(); //Exec var EXEC = false; diff --git a/lib/index.js.map b/lib/index.js.map index 17aa3c9..e963d42 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete()\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file diff --git a/package.json b/package.json index b81957c..9fa6876 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.0.3", + "version": "2.0.7", "description": "Tiny time tracker", "keywords": [ "time", diff --git a/src/autocomplete.js b/src/autocomplete.js index 18fad3d..f5574b5 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -1,34 +1,38 @@ import omelette from 'omelette' import { configElements } from './core/constants' -const autocomplete = function(config){ +import pkg from '../package.json' +import Configstore from 'configstore' - const complete = omelette("timer ") - - let allTaskKeys = function() { - this.reply(Object.keys(config.all.tasks)); +const config = new Configstore(pkg.name, { + tasks:{}, + config:{ + 'format.output': 'DD/MM' } +}) - complete.on("cmd", function() { - this.reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]) - }); - - complete.on("key", function(cmd) { +const autocomplete = function(){ + let key = ({reply, before}) => { let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove'] - if (keyTasks.indexOf(cmd) > -1){ - this.reply(Object.keys(config.all.tasks)); + if (keyTasks.indexOf(before) > -1){ + reply(Object.keys(config.all.tasks)) } - if (cmd === 'configure' ){ - this.reply(configElements); + if (before === 'configure' ){ + reply(configElements) } - }); + } - complete.init(); + const complete = omelette` + timer + ${["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]} + ${key} + ` + complete.init() if (~process.argv.indexOf('--setupCLI')) { - complete.setupShellInitFile(); + complete.setupShellInitFile() } } diff --git a/src/index.js b/src/index.js index 3b7c6f5..2b6dde6 100644 --- a/src/index.js +++ b/src/index.js @@ -21,7 +21,7 @@ const config = new Configstore(pkg.name, { updateNotifier({ pkg }).notify() const manager = new Manager(config) -autocomplete(config) +autocomplete() //Exec let EXEC = false From 9a26558a4c30a7e8247f7591604023717ef9ea6f Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Sun, 7 May 2017 21:56:15 +0200 Subject: [PATCH 21/51] fix and updates --- CHANGELOG.md | 4 ++-- lib/autocomplete.js | 24 +++++------------------- lib/autocomplete.js.map | 2 +- lib/index.js | 2 +- lib/index.js.map | 2 +- package.json | 4 ++-- src/autocomplete.js | 18 +++++------------- src/index.js | 2 +- yarn.lock | 6 +++--- 9 files changed, 21 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3dc6377..bf2e594 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## [v2.0.7] - Apr 18, 2017 +## [v2.0.14] - Apr 18, 2017 - Update dependencies - Fix typo (Thanks @RyanZim) @@ -33,4 +33,4 @@ [v1.1.1]: https://github.com/danibram/time-tracker-cli/compare/v1.1.0...v1.1.1 [v1.1.2]: https://github.com/danibram/time-tracker-cli/compare/v1.1.1...v1.1.2 [v2.0.0]: https://github.com/danibram/time-tracker-cli/compare/v1.1.2...v2.0.0 -[v2.0.7]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.7 \ No newline at end of file +[v2.0.14]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.14 \ No newline at end of file diff --git a/lib/autocomplete.js b/lib/autocomplete.js index 5aa624a..52cf404 100644 --- a/lib/autocomplete.js +++ b/lib/autocomplete.js @@ -12,38 +12,24 @@ var _omelette2 = _interopRequireDefault(_omelette); var _constants = require('./core/constants'); -var _package = require('../package.json'); - -var _package2 = _interopRequireDefault(_package); - -var _configstore = require('configstore'); - -var _configstore2 = _interopRequireDefault(_configstore); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } -var config = new _configstore2.default(_package2.default.name, { - tasks: {}, - config: { - 'format.output': 'DD/MM' - } -}); +var autocomplete = function autocomplete(config) { + var tasks = Object.keys(config.all.tasks); -var autocomplete = function autocomplete() { var key = function key(_ref) { - var reply = _ref.reply, - before = _ref.before; + var before = _ref.before; var keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']; if (keyTasks.indexOf(before) > -1) { - reply(Object.keys(config.all.tasks)); + return tasks; } if (before === 'configure') { - reply(_constants.configElements); + return _constants.configElements; } }; diff --git a/lib/autocomplete.js.map b/lib/autocomplete.js.map index dba55ac..d88ad62 100644 --- a/lib/autocomplete.js.map +++ b/lib/autocomplete.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/autocomplete.js"],"names":["config","name","tasks","autocomplete","key","reply","before","keyTasks","indexOf","Object","keys","all","complete","init","process","argv","setupShellInitFile"],"mappings":";;;;;;;;AAAA;;;;AACA;;AAEA;;;;AACA;;;;;;;;AAEA,IAAMA,SAAS,0BAAgB,kBAAIC,IAApB,EAA0B;AACrCC,WAAM,EAD+B;AAErCF,YAAO;AACH,yBAAiB;AADd;AAF8B,CAA1B,CAAf;;AAOA,IAAMG,eAAe,SAAfA,YAAe,GAAU;AAC3B,QAAIC,MAAM,SAANA,GAAM,OAAqB;AAAA,YAAnBC,KAAmB,QAAnBA,KAAmB;AAAA,YAAZC,MAAY,QAAZA,MAAY;;AAC3B,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,MAAjB,IAA2B,CAAC,CAAhC,EAAkC;AAC9BD,kBAAMI,OAAOC,IAAP,CAAYV,OAAOW,GAAP,CAAWT,KAAvB,CAAN;AACH;;AAED,YAAII,WAAW,WAAf,EAA4B;AACxBD;AACH;AACJ,KAVD;;AAYA,QAAMO,oDAEA,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAFA,EAGAR,GAHA,CAAN;AAKAQ,aAASC,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaP,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCI,iBAASI,kBAAT;AACH;AAEJ,CAxBD;;kBA0Beb,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport { configElements } from './core/constants'\n\nimport pkg from '../package.json'\nimport Configstore from 'configstore'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nconst autocomplete = function(){\n let key = ({reply, before}) => {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(before) > -1){\n reply(Object.keys(config.all.tasks))\n }\n\n if (before === 'configure' ){\n reply(configElements)\n }\n }\n\n const complete = omelette`\n timer\n ${[\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"]}\n ${key}\n `\n complete.init()\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile()\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file +{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","tasks","Object","keys","all","key","before","keyTasks","indexOf","complete","init","process","argv","setupShellInitFile"],"mappings":";;;;;;;;AAAA;;;;AACA;;;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAgB;AACjC,QAAMC,QAAQC,OAAOC,IAAP,CAAYH,OAAOI,GAAP,CAAWH,KAAvB,CAAd;;AAEA,QAAII,MAAM,SAANA,GAAM,OAAc;AAAA,YAAZC,MAAY,QAAZA,MAAY;;AACpB,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,MAAjB,IAA2B,CAAC,CAAhC,EAAkC;AAC9B,mBAAOL,KAAP;AACH;;AAED,YAAIK,WAAW,WAAf,EAA4B;AACxB;AACH;AACJ,KAVD;;AAYA,QAAMG,oDAEA,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAFA,EAGAJ,GAHA,CAAN;AAKAI,aAASC,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaJ,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCC,iBAASI,kBAAT;AACH;AAEJ,CA1BD;;kBA4Bed,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport { configElements } from './core/constants'\n\nconst autocomplete = function(config){\n const tasks = Object.keys(config.all.tasks)\n\n let key = ({before}) => {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(before) > -1){\n return tasks\n }\n\n if (before === 'configure' ){\n return configElements\n }\n }\n\n const complete = omelette`\n timer\n ${[\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"]}\n ${key}\n `\n complete.init()\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile()\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 568a222..7093506 100644 --- a/lib/index.js +++ b/lib/index.js @@ -42,7 +42,7 @@ var config = new _configstore2.default(_package2.default.name, { (0, _updateNotifier2.default)({ pkg: _package2.default }).notify(); var manager = new _Manager2.default(config); -(0, _autocomplete2.default)(); +(0, _autocomplete2.default)(config); //Exec var EXEC = false; diff --git a/lib/index.js.map b/lib/index.js.map index e963d42..17aa3c9 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":";;AAAA;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA;;;;AACA;;AACA;;AAEA;;;;;;AAEA,IAAMA,SAAS,0BAAgB,kBAAIC,IAApB,EAA0B;AACrCC,WAAM,EAD+B;AAErCF,YAAO;AACH,yBAAiB;AADd;AAF8B,CAA1B,CAAf;;AAOA,8BAAe,EAAEG,sBAAF,EAAf,EAAwBC,MAAxB;;AAEA,IAAMC,UAAU,sBAAYL,MAAZ,CAAhB;AACA;;AAEA;AACA,IAAIM,OAAO,KAAX;;AAEA,oBACKC,OADL,CACa,kBAAIA,OADjB,EAEKC,WAFL,CAEiB,gCAFjB,EAGKC,MAHL,CAGY,YAHZ,EAG0B,uBAH1B;;AAKA,oBACKC,OADL,CACa,gCADb,EAEKF,WAFL,CAEiB,gCAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAcL,WAAd,EAA2B;AAC/BA,kBAAeA,WAAD,GAAgBM,MAAMC,OAAN,CAAcP,WAAd,IAA6BA,YAAYQ,IAAZ,CAAiB,GAAjB,CAA7B,GAAqDR,WAArE,GAAmF,IAAjG;AACAH,YAAQY,SAAR,CAAkBJ,GAAlB,EAAuBL,WAAvB;AACAF,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,kBADb,EAEKF,WAFL,CAEiB,YAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAc;AAClBR,YAAQa,SAAR,CAAkBL,GAAlB;AACAP,WAAO,IAAP;AACH,CAPL;;AASA,oBACKI,OADL,CACa,oBADb,EAEKF,WAFL,CAEiB,cAFjB,EAGKG,KAHL,CAGW,IAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAc;AAClBR,YAAQc,WAAR,CAAoBN,GAApB;AACAP,WAAO,IAAP;AACH,CAPL;;AAUA,oBACKI,OADL,CACa,iCADb,EAEKF,WAFL,CAEiB,sCAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAcL,WAAd,EAA2B;AAC/BA,kBAAeA,WAAD,GAAgBM,MAAMC,OAAN,CAAcP,WAAd,IAA6BA,YAAYQ,IAAZ,CAAiB,GAAjB,CAA7B,GAAqDR,WAArE,GAAmF,IAAjG;AACAH,YAAQe,QAAR,CAAiBP,GAAjB,EAAsBL,WAAtB;AACAF,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,6CADb,EAEKF,WAFL,CAEiB,+BAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAcQ,IAAd,EAAoB;AACxBA,WAAOP,MAAMC,OAAN,CAAcM,IAAd,IAAsBA,KAAKL,IAAL,CAAU,GAAV,CAAtB,GAAuCK,IAA9C;AACAhB,YAAQiB,cAAR,CAAuBT,GAAvB,EAA4BQ,IAA5B;AACAf,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,6BADb,EAEKF,WAFL,CAEiB,wCAFjB,EAGKI,MAHL,CAGY,UAASC,GAAT,EAAcU,UAAd,EAA0B;AAC9BlB,YAAQmB,UAAR,CAAmB,KAAnB,EAA0BX,GAA1B,EAA+BU,UAA/B;AACAlB,YAAQoB,QAAR,CAAiBZ,GAAjB,EAAsBR,QAAQqB,MAAR,CAAeb,GAAf,CAAtB,EAA2C,KAA3C;AACAP,WAAO,IAAP;AACH,CAPL;;AASA,oBACKI,OADL,CACa,kCADb,EAEKF,WAFL,CAEiB,4CAFjB,EAGKG,KAHL,CAGW,KAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAcU,UAAd,EAA0B;AAC9BlB,YAAQmB,UAAR,CAAmB,UAAnB,EAA+BX,GAA/B,EAAoCU,UAApC;AACAlB,YAAQoB,QAAR,CAAiBZ,GAAjB,EAAsBR,QAAQqB,MAAR,CAAeb,GAAf,CAAtB,EAA2C,KAA3C;AACAP,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,6BADb,EAEKF,WAFL,CAEiB,6EAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASV,KAAT,EAAgByB,IAAhB,EAAsB;AAC1BzB,YAASA,KAAD,GAAUA,KAAV,GAAkB,KAA1B;AACAG,YAAQoB,QAAR,CAAiBvB,KAAjB,EAAwByB,IAAxB;AACArB,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,gBADb,EAEKF,WAFL,CAEiB,4BAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAc;AAClBe,gBAAY,YAAM;AACd,YAAIP,OAAO,4BAAe,OAAf,EAAwBR,GAAxB,EAA6B,2BAAeR,QAAQwB,OAAR,CAAgBhB,GAAhB,CAAf,CAA7B,CAAX;AACAiB,gBAAQC,MAAR,CAAeC,KAAf,CAAqBX,IAArB;AACAS,gBAAQC,MAAR,CAAeE,UAAf,CAA0B,CAA1B,EAA4B,CAAC,CAA7B;AACH,KAJD,EAIG,IAJH;AAKA3B,WAAO,IAAP;AACH,CAXL;;AAaA,oBACKI,OADL,CACa,QADb,EAEKF,WAFL,CAEiB,4BAFjB,EAGKG,KAHL,CAGW,GAHX,EAIKC,MAJL,CAIY,UAASC,GAAT,EAAc;AAClBqB,YAAQC,GAAR,CAAYC,KAAKC,SAAL,CAAehC,QAAQiC,YAAR,EAAf,EAAuC,IAAvC,EAA6C,CAA7C,CAAZ;AACAhC,WAAO,IAAP;AACH,CAPL;;AASA,oBACKI,OADL,CACa,sBADb,EAEKF,WAFL,CAEiB,wDAFjB,EAGKG,KAHL,CAGW,KAHX,EAIKC,MAJL,CAIY,UAAS2B,MAAT,EAAiB;AACrBA,aAAUA,MAAD,GAAWA,MAAX,GAAoB,KAA7B;AACAlC,YAAQmC,MAAR,CAAeD,MAAf;AACAjC,WAAO,IAAP;AACH,CARL;;AAUA,oBACKI,OADL,CACa,yBADb,EAEKF,WAFL,CAEiB,iDAFjB,EAGKI,MAHL,CAGY,UAASC,GAAT,EAAc4B,KAAd,EAAqB;AACzBpC,YAAQqC,SAAR,CAAkB7B,GAAlB,EAAuB4B,KAAvB;AACAnC,WAAO,IAAP;AACH,CANL;;AAQA,oBACKI,OADL,CACa,eADb,EAEKF,WAFL,CAEiB,sBAFjB,EAGKI,MAHL,CAGY,UAAS2B,MAAT,EAAiB;AACrB,8BAAalC,QAAQsC,SAAR,EAAb;AACArC,WAAO,IAAP;AACH,CANL;;AAQA,oBACKsC,KADL,CACWd,QAAQe,IADnB;;AAIA,IAAI,oBAAQC,QAAZ,EAAsB;AAClBzC,YAAQ0C,MAAR;AACAzC,WAAO,IAAP;AACH;;AAED,IAAI,CAACA,IAAL,EAAW;AACP,0BAAS,+BAAT;AACA,wBAAQ0C,UAAR;AACAlB,YAAQmB,IAAR,CAAa,CAAb;AACH","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete()\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 9fa6876..7b2376d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.0.7", + "version": "2.0.14", "description": "Tiny time tracker", "keywords": [ "time", @@ -44,7 +44,7 @@ "flat": "^2.0.0", "inquirer": "^3.0.1", "moment": "^2.11.2", - "omelette": "^0.4.0", + "omelette": "^0.4.2", "update-notifier": "^2.1.0" } } diff --git a/src/autocomplete.js b/src/autocomplete.js index f5574b5..6e79265 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -1,26 +1,18 @@ import omelette from 'omelette' import { configElements } from './core/constants' -import pkg from '../package.json' -import Configstore from 'configstore' +const autocomplete = function(config){ + const tasks = Object.keys(config.all.tasks) -const config = new Configstore(pkg.name, { - tasks:{}, - config:{ - 'format.output': 'DD/MM' - } -}) - -const autocomplete = function(){ - let key = ({reply, before}) => { + let key = ({before}) => { let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove'] if (keyTasks.indexOf(before) > -1){ - reply(Object.keys(config.all.tasks)) + return tasks } if (before === 'configure' ){ - reply(configElements) + return configElements } } diff --git a/src/index.js b/src/index.js index 2b6dde6..3b7c6f5 100644 --- a/src/index.js +++ b/src/index.js @@ -21,7 +21,7 @@ const config = new Configstore(pkg.name, { updateNotifier({ pkg }).notify() const manager = new Manager(config) -autocomplete() +autocomplete(config) //Exec let EXEC = false diff --git a/yarn.lock b/yarn.lock index 4243c59..185eb8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1604,9 +1604,9 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -omelette@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.0.tgz#2401df7d32abda575d17bac652e57487d3b1150d" +omelette@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.2.tgz#7675617a4ec8056926208a84f8050817059f2d0c" once@^1.3.0, once@^1.3.3: version "1.4.0" From b9a566fa5772e36b67fa7a7372660f0748ce4912 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 9 May 2017 06:57:11 +0000 Subject: [PATCH 22/51] chore(package): update omelette to version 0.4.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7b2376d..0682952 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "flat": "^2.0.0", "inquirer": "^3.0.1", "moment": "^2.11.2", - "omelette": "^0.4.2", + "omelette": "^0.4.4", "update-notifier": "^2.1.0" } } From 8beb83f63cead1e56e32038e5800962bd3726e37 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 10 May 2017 12:11:20 +0000 Subject: [PATCH 23/51] chore(package): update configstore to version 3.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0682952..56f2353 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "chalk": "^1.1.3", "cli-table": "^0.3.1", "commander": "^2.9.0", - "configstore": "^3.0.0", + "configstore": "^3.1.0", "flat": "^2.0.0", "inquirer": "^3.0.1", "moment": "^2.11.2", From ae2d7f5857ca13202ed5616a385181b765112c21 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Wed, 10 May 2017 16:38:51 +0200 Subject: [PATCH 24/51] multiple fixes --- CHANGELOG.md | 6 +- lib/autocomplete.js | 30 +++++---- lib/autocomplete.js.map | 2 +- package.json | 2 +- src/autocomplete.js | 26 ++++---- yarn.lock | 141 ++++++++++++++++++++++------------------ 6 files changed, 110 insertions(+), 97 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf2e594..da72e4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,10 @@ -## [v2.0.14] - Apr 18, 2017 +## [v2.0.22] - Apr 18, 2017 - Update dependencies - Fix typo (Thanks @RyanZim) - Fix autocomplete +- Add command to install completions +- Only completion for commands not for tasks ## [v2.0.0] - Jan 25, 2017 @@ -33,4 +35,4 @@ [v1.1.1]: https://github.com/danibram/time-tracker-cli/compare/v1.1.0...v1.1.1 [v1.1.2]: https://github.com/danibram/time-tracker-cli/compare/v1.1.1...v1.1.2 [v2.0.0]: https://github.com/danibram/time-tracker-cli/compare/v1.1.2...v2.0.0 -[v2.0.14]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.14 \ No newline at end of file +[v2.0.22]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.22 \ No newline at end of file diff --git a/lib/autocomplete.js b/lib/autocomplete.js index 52cf404..32763c8 100644 --- a/lib/autocomplete.js +++ b/lib/autocomplete.js @@ -4,8 +4,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _templateObject = _taggedTemplateLiteral(['\n timer\n ', '\n ', '\n '], ['\n timer\n ', '\n ', '\n ']); - var _omelette = require('omelette'); var _omelette2 = _interopRequireDefault(_omelette); @@ -14,26 +12,30 @@ var _constants = require('./core/constants'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } - var autocomplete = function autocomplete(config) { - var tasks = Object.keys(config.all.tasks); + var taskKeys = Object.keys(config.all.tasks); + + var complete = (0, _omelette2.default)('timer '); + + complete.on("action", function (_ref) { + var reply = _ref.reply; - var key = function key(_ref) { - var before = _ref.before; + reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]); + }); + + complete.on("tasks", function (_ref2) { + var reply = _ref2.reply, + before = _ref2.before; var keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']; if (keyTasks.indexOf(before) > -1) { - return tasks; - } - - if (before === 'configure') { - return _constants.configElements; + reply(taskKeys); + } else if (before === 'configure') { + reply(_constants.configElements); } - }; + }); - var complete = (0, _omelette2.default)(_templateObject, ["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"], key); complete.init(); if (~process.argv.indexOf('--setupCLI')) { diff --git a/lib/autocomplete.js.map b/lib/autocomplete.js.map index d88ad62..0589ef9 100644 --- a/lib/autocomplete.js.map +++ b/lib/autocomplete.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","tasks","Object","keys","all","key","before","keyTasks","indexOf","complete","init","process","argv","setupShellInitFile"],"mappings":";;;;;;;;AAAA;;;;AACA;;;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAgB;AACjC,QAAMC,QAAQC,OAAOC,IAAP,CAAYH,OAAOI,GAAP,CAAWH,KAAvB,CAAd;;AAEA,QAAII,MAAM,SAANA,GAAM,OAAc;AAAA,YAAZC,MAAY,QAAZA,MAAY;;AACpB,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,MAAjB,IAA2B,CAAC,CAAhC,EAAkC;AAC9B,mBAAOL,KAAP;AACH;;AAED,YAAIK,WAAW,WAAf,EAA4B;AACxB;AACH;AACJ,KAVD;;AAYA,QAAMG,oDAEA,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAFA,EAGAJ,GAHA,CAAN;AAKAI,aAASC,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaJ,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCC,iBAASI,kBAAT;AACH;AAEJ,CA1BD;;kBA4Bed,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport { configElements } from './core/constants'\n\nconst autocomplete = function(config){\n const tasks = Object.keys(config.all.tasks)\n\n let key = ({before}) => {\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(before) > -1){\n return tasks\n }\n\n if (before === 'configure' ){\n return configElements\n }\n }\n\n const complete = omelette`\n timer\n ${[\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"]}\n ${key}\n `\n complete.init()\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile()\n }\n\n}\n\nexport default autocomplete\n"]} \ No newline at end of file +{"version":3,"sources":["../src/autocomplete.js"],"names":["autocomplete","config","taskKeys","Object","keys","all","tasks","complete","on","reply","before","keyTasks","indexOf","init","process","argv","setupShellInitFile"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA,IAAMA,eAAe,SAAfA,YAAe,CAASC,MAAT,EAAgB;AACjC,QAAIC,WAAWC,OAAOC,IAAP,CAAYH,OAAOI,GAAP,CAAWC,KAAvB,CAAf;;AAEA,QAAMC,WAAW,wBAAS,wBAAT,CAAjB;;AAEAA,aAASC,EAAT,CAAY,QAAZ,EAAqB,gBAAe;AAAA,YAAZC,KAAY,QAAZA,KAAY;;AAChCA,cAAM,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,aAAxC,EAAuD,KAAvD,EAA8D,UAA9D,EAA0E,QAA1E,EAAoF,KAApF,EAA2F,QAA3F,EAAqG,QAArG,EAA+G,eAA/G,EAAgI,WAAhI,CAAN;AACH,KAFD;;AAIAF,aAASC,EAAT,CAAY,OAAZ,EAAqB,iBAAsB;AAAA,YAAnBC,KAAmB,SAAnBA,KAAmB;AAAA,YAAZC,MAAY,SAAZA,MAAY;;AACvC,YAAIC,WAAW,CAAC,OAAD,EAAU,OAAV,EAAmB,SAAnB,EAA8B,QAA9B,EAAwC,KAAxC,EAA+C,aAA/C,EAA8D,KAA9D,EAAqE,QAArE,CAAf;;AAEA,YAAIA,SAASC,OAAT,CAAiBF,MAAjB,IAA2B,CAAC,CAAhC,EAAkC;AAC9BD,kBAAMP,QAAN;AACH,SAFD,MAEO,IAAIQ,WAAW,WAAf,EAA4B;AAC/BD;AACH;AACJ,KARD;;AAUAF,aAASM,IAAT;;AAEA,QAAI,CAACC,QAAQC,IAAR,CAAaH,OAAb,CAAqB,YAArB,CAAL,EAAyC;AACrCL,iBAASS,kBAAT;AACH;AACJ,CAxBD;;kBA0BehB,Y","file":"autocomplete.js","sourcesContent":["import omelette from 'omelette'\nimport { configElements } from './core/constants'\n\nconst autocomplete = function(config){\n let taskKeys = Object.keys(config.all.tasks)\n\n const complete = omelette('timer ')\n\n complete.on(\"action\",({ reply }) => {\n reply([\"start\", \"pause\", \"unpause\", \"finish\", \"description\", \"add\", \"subtract\", \"report\", \"log\", \"export\", \"delete\", \"configuration\", \"configure\"]);\n });\n\n complete.on(\"tasks\", ({ reply, before }) =>{\n let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove']\n\n if (keyTasks.indexOf(before) > -1){\n reply(taskKeys)\n } else if (before === 'configure' ){\n reply(configElements)\n }\n })\n\n complete.init()\n\n if (~process.argv.indexOf('--setupCLI')) {\n complete.setupShellInitFile()\n }\n}\n\nexport default autocomplete\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 56f2353..819eed1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.0.14", + "version": "2.0.22", "description": "Tiny time tracker", "keywords": [ "time", diff --git a/src/autocomplete.js b/src/autocomplete.js index 6e79265..c0ef19a 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -2,31 +2,29 @@ import omelette from 'omelette' import { configElements } from './core/constants' const autocomplete = function(config){ - const tasks = Object.keys(config.all.tasks) + let taskKeys = Object.keys(config.all.tasks) - let key = ({before}) => { + const complete = omelette('timer ') + + complete.on("action",({ reply }) => { + reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]); + }); + + complete.on("tasks", ({ reply, before }) =>{ let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove'] if (keyTasks.indexOf(before) > -1){ - return tasks - } - - if (before === 'configure' ){ - return configElements + reply(taskKeys) + } else if (before === 'configure' ){ + reply(configElements) } - } + }) - const complete = omelette` - timer - ${["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]} - ${key} - ` complete.init() if (~process.argv.indexOf('--setupCLI')) { complete.setupShellInitFile() } - } export default autocomplete diff --git a/yarn.lock b/yarn.lock index 185eb8c..fcff953 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,17 +7,17 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" ajv@^4.9.1: - version "4.11.7" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" -ansi-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" dependencies: - string-width "^1.0.1" + string-width "^2.0.0" ansi-escapes@^1.1.0: version "1.4.0" @@ -43,11 +43,11 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" dependencies: delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" + readable-stream "^2.0.6" arr-diff@^2.0.0: version "2.0.0" @@ -736,8 +736,8 @@ babel@^6.3.26: resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" babylon@^6.11.0, babylon@^6.15.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" + version "6.17.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" balanced-match@^0.4.1: version "0.4.2" @@ -766,10 +766,10 @@ boom@2.x.x: hoek "2.x.x" boxen@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.0.0.tgz#b2694baf1f605f708ff0177c12193b22f29aaaab" + version "1.1.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102" dependencies: - ansi-align "^1.1.0" + ansi-align "^2.0.0" camelcase "^4.0.0" chalk "^1.1.1" cli-boxes "^1.0.0" @@ -777,7 +777,7 @@ boxen@^1.0.0: term-size "^0.1.0" widest-line "^1.0.0" -brace-expansion@^1.0.0: +brace-expansion@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" dependencies: @@ -819,8 +819,8 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: supports-color "^2.0.0" chokidar@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -881,15 +881,15 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -configstore@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.0.0.tgz#e1b8669c1803ccc50b545e92f8e6e79aa80e0196" +configstore@^3.0.0, configstore@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" - mkdirp "^0.5.0" + make-dir "^1.0.0" unique-string "^1.0.0" - write-file-atomic "^1.1.2" + write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" console-control-strings@^1.0.0, console-control-strings@~1.1.0: @@ -938,10 +938,10 @@ dashdash@^1.12.0: assert-plus "^1.0.0" debug@^2.1.1, debug@^2.2.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" + version "2.6.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a" dependencies: - ms "0.7.2" + ms "0.7.3" deep-extend@~0.4.0: version "0.4.1" @@ -1009,8 +1009,8 @@ expand-range@^1.8.1: fill-range "^2.1.0" extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" external-editor@^2.0.1: version "2.0.1" @@ -1035,8 +1035,8 @@ figures@^2.0.0: escape-string-regexp "^1.0.5" filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" fill-range@^2.1.0: version "2.2.3" @@ -1108,9 +1108,9 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" -gauge@~2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -1126,8 +1126,8 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" @@ -1281,7 +1281,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.0.2, is-buffer@~1.1.2: +is-buffer@^1.1.5, is-buffer@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" @@ -1439,10 +1439,10 @@ jsprim@^1.2.2: verror "1.3.6" kind-of@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + version "3.2.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" dependencies: - is-buffer "^1.0.2" + is-buffer "^1.1.5" latest-version@^3.0.0: version "3.1.0" @@ -1475,6 +1475,12 @@ lru-cache@^4.0.0: pseudomap "^1.0.1" yallist "^2.0.0" +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" @@ -1508,10 +1514,10 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" minimatch@^3.0.0, minimatch@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: - brace-expansion "^1.0.0" + brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" @@ -1521,7 +1527,7 @@ minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -1531,9 +1537,9 @@ moment@^2.11.2: version "2.18.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" +ms@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" mute-stream@0.0.7: version "0.0.7" @@ -1577,12 +1583,12 @@ npm-run-path@^1.0.0: path-key "^1.0.0" npmlog@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + version "4.1.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" - gauge "~2.7.1" + gauge "~2.7.3" set-blocking "~2.0.0" number-is-nan@^1.0.0: @@ -1604,9 +1610,9 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -omelette@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.2.tgz#7675617a4ec8056926208a84f8050817059f2d0c" +omelette@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.4.tgz#e8fa98cb08eeec0e402c49561fc0670c75120c89" once@^1.3.0, once@^1.3.3: version "1.4.0" @@ -1673,6 +1679,10 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -1717,7 +1727,7 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.4: +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: version "2.2.9" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" dependencies: @@ -1743,8 +1753,8 @@ regenerate@^1.2.1: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" regenerator-runtime@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" regenerator-transform@0.9.11: version "0.9.11" @@ -1770,10 +1780,11 @@ regexpu-core@^2.0.0: regjsparser "^0.1.4" registry-auth-token@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.2.tgz#1b9e51a185c930da34a9894b12a52ea998f1adaf" + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" dependencies: rc "^1.1.6" + safe-buffer "^5.0.1" registry-url@^3.0.3: version "3.1.0" @@ -1900,8 +1911,8 @@ sntp@1.x.x: hoek "2.x.x" source-map-support@^0.4.2: - version "0.4.14" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" dependencies: source-map "^0.5.6" @@ -2009,8 +2020,8 @@ tmp@^0.0.31: os-tmpdir "~1.0.1" to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" tough-cookie@~2.3.0: version "2.3.2" @@ -2078,8 +2089,8 @@ uuid@^3.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" v8flags@^2.0.10: - version "2.0.12" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.12.tgz#73235d9f7176f8e8833fb286795445f7938d84e5" + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" dependencies: user-home "^1.1.1" @@ -2111,9 +2122,9 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^1.1.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" +write-file-atomic@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.0.0.tgz#bb99a5440d0d31dd860a68da392bffeef66251a1" dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" From f0b435d6fed17373333a6f9fd051dbe46b858d39 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 29 Jun 2017 23:59:08 +0000 Subject: [PATCH 25/51] fix(package): update chalk to version 2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56f2353..ebe7fb2 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ }, "dependencies": { "babel-polyfill": "^6.22.0", - "chalk": "^1.1.3", + "chalk": "^2.0.0", "cli-table": "^0.3.1", "commander": "^2.9.0", "configstore": "^3.1.0", From 6989ccefae9aa2895df5adab75149f75e91cb6c1 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sun, 23 Jul 2017 06:46:31 +0000 Subject: [PATCH 26/51] fix(package): update flat to version 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56f2353..89310ea 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "cli-table": "^0.3.1", "commander": "^2.9.0", "configstore": "^3.1.0", - "flat": "^2.0.0", + "flat": "^3.0.0", "inquirer": "^3.0.1", "moment": "^2.11.2", "omelette": "^0.4.4", From 306bdc6a66493b53e26fab47d1cbb455343ab01d Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Tue, 5 Sep 2017 21:17:25 +0800 Subject: [PATCH 27/51] update dependencies --- package.json | 17 +- yarn.lock | 802 ++++++++++++++++++++++++++++----------------------- 2 files changed, 447 insertions(+), 372 deletions(-) diff --git a/package.json b/package.json index 819eed1..9262c13 100644 --- a/package.json +++ b/package.json @@ -30,21 +30,20 @@ "license": "ISC", "devDependencies": { "babel": "^6.3.26", - "babel-cli": "^6.22.2", + "babel-cli": "^6.26.0", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-preset-es2015": "^6.22.0", "babel-preset-stage-0": "^6.22.0" }, "dependencies": { - "babel-polyfill": "^6.22.0", - "chalk": "^1.1.3", - "cli-table": "^0.3.1", - "commander": "^2.9.0", - "configstore": "^3.1.0", - "flat": "^2.0.0", - "inquirer": "^3.0.1", + "babel-polyfill": "^6.26.0", + "cli-table2": "^0.2.0", + "commander": "^2.11.0", + "configstore": "^3.1.1", + "flat": "^4.0.0", + "inquirer": "^3.2.3", "moment": "^2.11.2", "omelette": "^0.4.4", - "update-notifier": "^2.1.0" + "update-notifier": "^2.2.0" } } diff --git a/yarn.lock b/yarn.lock index fcff953..fe4a12b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,28 +19,38 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" dependencies: - arrify "^1.0.0" micromatch "^2.1.5" + normalize-path "^2.0.0" aproba@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" are-we-there-yet@~1.1.2: version "1.1.4" @@ -56,17 +66,13 @@ arr-diff@^2.0.0: arr-flatten "^1.0.1" arr-flatten@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -95,70 +101,70 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-cli@^6.22.2: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" dependencies: - babel-core "^6.24.1" - babel-polyfill "^6.23.0" - babel-register "^6.24.1" - babel-runtime "^6.22.0" - commander "^2.8.1" - convert-source-map "^1.1.0" + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" fs-readdir-recursive "^1.0.0" - glob "^7.0.0" - lodash "^4.2.0" - output-file-sync "^1.1.0" - path-is-absolute "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" slash "^1.0.0" - source-map "^0.5.0" - v8flags "^2.0.10" + source-map "^0.5.6" + v8flags "^2.1.1" optionalDependencies: chokidar "^1.6.1" -babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - chalk "^1.1.0" + chalk "^1.1.3" esutils "^2.0.2" - js-tokens "^3.0.0" + js-tokens "^3.0.2" -babel-core@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" +babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: - babel-code-frame "^6.22.0" - babel-generator "^6.24.1" + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" babel-helpers "^6.24.1" babel-messages "^6.23.0" - babel-register "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" slash "^1.0.0" - source-map "^0.5.0" + source-map "^0.5.6" -babel-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" dependencies: babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" detect-indent "^4.0.0" jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" + lodash "^4.17.4" + source-map "^0.5.6" trim-right "^1.0.1" babel-helper-bindify-decorators@^6.24.1: @@ -187,13 +193,13 @@ babel-helper-call-delegate@^6.24.1: babel-types "^6.24.1" babel-helper-define-map@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" dependencies: babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" @@ -244,12 +250,12 @@ babel-helper-optimise-call-expression@^6.24.1: babel-types "^6.24.1" babel-helper-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" @@ -410,14 +416,14 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-plugin-transform-es2015-classes@^6.24.1: version "6.24.1" @@ -482,13 +488,13 @@ babel-plugin-transform-es2015-modules-amd@^6.24.1: babel-template "^6.24.1" babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" dependencies: babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" babel-plugin-transform-es2015-modules-systemjs@^6.24.1: version "6.24.1" @@ -588,17 +594,17 @@ babel-plugin-transform-function-bind@^6.22.0: babel-runtime "^6.22.0" babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.22.0" + babel-runtime "^6.26.0" babel-plugin-transform-regenerator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: - regenerator-transform "0.9.11" + regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" @@ -607,13 +613,13 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.22.0, babel-polyfill@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" dependencies: - babel-runtime "^6.22.0" - core-js "^2.4.0" - regenerator-runtime "^0.10.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" babel-preset-es2015@^6.22.0: version "6.24.1" @@ -679,69 +685,69 @@ babel-preset-stage-3@^6.24.1: babel-plugin-transform-exponentiation-operator "^6.24.1" babel-plugin-transform-object-rest-spread "^6.22.0" -babel-register@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: - babel-core "^6.24.1" - babel-runtime "^6.22.0" - core-js "^2.4.0" + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" home-or-tmp "^2.0.0" - lodash "^4.2.0" + lodash "^4.17.4" mkdirp "^0.5.1" - source-map-support "^0.4.2" + source-map-support "^0.4.15" -babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" +babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" - regenerator-runtime "^0.10.0" + regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.3.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" +babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babylon "^6.11.0" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" -babel-traverse@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: - babel-code-frame "^6.22.0" + babel-code-frame "^6.26.0" babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - babylon "^6.15.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.19.0, babel-types@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" - dependencies: - babel-runtime "^6.22.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" + lodash "^4.17.4" + to-fast-properties "^1.0.3" babel@^6.3.26: version "6.23.0" resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" -babylon@^6.11.0, babylon@^6.15.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" bcrypt-pbkdf@^1.0.0: version "1.0.1" @@ -750,8 +756,8 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" block-stream@*: version "0.0.9" @@ -766,22 +772,22 @@ boom@2.x.x: hoek "2.x.x" boxen@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102" + version "1.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" dependencies: ansi-align "^2.0.0" camelcase "^4.0.0" - chalk "^1.1.1" + chalk "^2.0.1" cli-boxes "^1.0.0" string-width "^2.0.0" - term-size "^0.1.0" + term-size "^1.2.0" widest-line "^1.0.0" brace-expansion@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: - balanced-match "^0.4.1" + balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: @@ -792,10 +798,6 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -buffer-shims@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - camelcase@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -808,7 +810,7 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -818,6 +820,14 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + chokidar@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -843,15 +853,18 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" +cli-table2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" dependencies: - colors "1.0.3" + lodash "^3.10.1" + string-width "^1.0.1" + optionalDependencies: + colors "^1.1.2" cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" co@^4.6.0: version "4.6.0" @@ -861,9 +874,19 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" +color-convert@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" @@ -871,19 +894,17 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@^2.8.1, commander@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" +commander@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -configstore@^3.0.0, configstore@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" +configstore@^3.0.0, configstore@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -896,15 +917,15 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -convert-source-map@^1.1.0: +convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -914,12 +935,13 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" -cross-spawn-async@^2.1.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: - lru-cache "^4.0.0" - which "^1.2.8" + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" cryptiles@2.x.x: version "2.0.5" @@ -937,15 +959,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@^2.1.1, debug@^2.2.0: - version "2.6.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a" +debug@^2.2.0, debug@^2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: - ms "0.7.3" + ms "2.0.0" deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" delayed-stream@~1.0.0: version "1.0.0" @@ -962,8 +984,8 @@ detect-indent@^4.0.0: repeating "^2.0.0" dot-prop@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: is-obj "^1.0.0" @@ -985,15 +1007,16 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -execa@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" dependencies: - cross-spawn-async "^2.1.1" + cross-spawn "^5.0.1" + get-stream "^3.0.0" is-stream "^1.1.0" - npm-run-path "^1.0.0" - object-assign "^4.0.1" - path-key "^1.0.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" strip-eof "^1.0.0" expand-brackets@^0.1.4: @@ -1012,10 +1035,12 @@ extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -external-editor@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.1.tgz#4c597c6c88fa6410e41dbbaa7b1be2336aa31095" +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" tmp "^0.0.31" extglob@^0.3.1: @@ -1024,9 +1049,9 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" figures@^2.0.0: version "2.0.0" @@ -1048,11 +1073,11 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" -flat@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-2.0.1.tgz#70e29188a74be0c3c89409eed1fa9577907ae32f" +flat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.0.0.tgz#3abc7f3b588e64ce77dc42fd59aa35806622fea8" dependencies: - is-buffer "~1.1.2" + is-buffer "~1.1.5" for-in@^1.0.1: version "1.0.2" @@ -1085,11 +1110,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.29" + node-pre-gyp "^0.6.36" fstream-ignore@^1.0.5: version "1.0.5" @@ -1144,20 +1169,20 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^7.0.0, glob@^7.0.5: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" +glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.2" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.0.0: - version "9.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" got@^6.7.1: version "6.7.1" @@ -1179,10 +1204,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -1200,6 +1221,10 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -1232,6 +1257,14 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +iconv-lite@^0.4.17: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -1243,7 +1276,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -1251,25 +1284,26 @@ ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" +inquirer@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" + ansi-escapes "^2.0.0" + chalk "^2.0.0" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^2.0.1" + external-editor "^2.0.4" figures "^2.0.0" lodash "^4.3.0" mute-stream "0.0.7" run-async "^2.2.0" - rx "^4.1.0" - string-width "^2.0.0" - strip-ansi "^3.0.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" through "^2.3.6" -invariant@^2.2.0: +invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: @@ -1281,13 +1315,13 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5, is-buffer@~1.1.2: +is-buffer@^1.1.5, is-buffer@~1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" is-equal-shallow@^0.1.3: version "0.1.3" @@ -1329,12 +1363,18 @@ is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" -is-number@^2.0.2, is-number@^2.1.0: +is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" dependencies: kind-of "^3.0.2" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -1385,20 +1425,18 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - -js-tokens@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jschardet@^1.4.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -1421,7 +1459,7 @@ json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json5@^0.5.0: +json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -1430,17 +1468,23 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" jsprim@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" dependencies: assert-plus "1.0.0" - extsprintf "1.0.2" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" kind-of@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" dependencies: is-buffer "^1.1.5" @@ -1450,11 +1494,11 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" -lazy-req@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" +lodash@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.17.4, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -1468,12 +1512,12 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" -lru-cache@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" + pseudomap "^1.0.2" + yallist "^2.1.2" make-dir@^1.0.0: version "1.0.0" @@ -1499,21 +1543,21 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.15" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: - mime-db "~1.27.0" + mime-db "~1.30.0" mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" -minimatch@^3.0.0, minimatch@^3.0.2: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -1537,21 +1581,21 @@ moment@^2.11.2: version "2.18.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" -ms@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.3.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" -node-pre-gyp@^0.6.29: - version "0.6.34" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" dependencies: mkdirp "^0.5.1" nopt "^4.0.1" @@ -1570,21 +1614,21 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: remove-trailing-separator "^1.0.1" -npm-run-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" dependencies: - path-key "^1.0.0" + path-key "^2.0.0" npmlog@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -1599,7 +1643,7 @@ oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -1641,7 +1685,7 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.0: +output-file-sync@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" dependencies: @@ -1649,6 +1693,10 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -1667,13 +1715,13 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-key@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" performance-now@^0.2.0: version "0.2.0" @@ -1691,7 +1739,7 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6: +private@^0.1.6, private@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -1699,7 +1747,7 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -pseudomap@^1.0.1: +pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -1712,11 +1760,11 @@ qs@~6.4.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" randomatic@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" + is-number "^3.0.0" + kind-of "^4.0.0" rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: version "1.2.1" @@ -1728,15 +1776,15 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: strip-json-comments "~2.0.1" readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: - version "2.2.9" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: - buffer-shims "~1.0.0" core-util-is "~1.0.0" - inherits "~2.0.1" + inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~1.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" util-deprecate "~1.0.1" readdirp@^2.0.0: @@ -1752,24 +1800,27 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator-runtime@^0.10.0: +regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" -regenerator-transform@0.9.11: - version "0.9.11" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" private "^0.1.6" regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" regexpu-core@^2.0.0: version "2.0.0" @@ -1803,8 +1854,8 @@ regjsparser@^0.1.4: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: version "1.1.2" @@ -1866,13 +1917,19 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" semver-diff@^2.0.0: version "2.1.0" @@ -1881,8 +1938,8 @@ semver-diff@^2.0.0: semver "^5.0.3" semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" set-blocking@~2.0.0: version "2.0.0" @@ -1892,6 +1949,16 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -1900,29 +1967,25 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" dependencies: hoek "2.x.x" -source-map-support@^0.4.2: - version "0.4.15" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" +source-map-support@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.17.tgz#6f2150553e6375375d0ccb3180502b78c18ba430" dependencies: source-map "^0.5.6" -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" sshpk@^1.7.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -1931,11 +1994,10 @@ sshpk@^1.7.0: optionalDependencies: bcrypt-pbkdf "^1.0.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" jsbn "~0.1.0" tweetnacl "~0.14.0" -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: @@ -1943,18 +2005,18 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" +string-width@^2.0.0, string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" + strip-ansi "^4.0.0" -string_decoder@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" dependencies: - buffer-shims "~1.0.0" + safe-buffer "~5.1.0" stringstream@~0.0.4: version "0.0.5" @@ -1966,6 +2028,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -1978,6 +2046,12 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +supports-color@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + tar-pack@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" @@ -1999,11 +2073,11 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" -term-size@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" dependencies: - execa "^0.4.0" + execa "^0.7.0" through@^2.3.6: version "2.3.8" @@ -2019,7 +2093,7 @@ tmp@^0.0.31: dependencies: os-tmpdir "~1.0.1" -to-fast-properties@^1.0.1: +to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -2057,16 +2131,16 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -update-notifier@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" +update-notifier@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" dependencies: boxen "^1.0.0" chalk "^1.0.0" configstore "^3.0.0" + import-lazy "^2.1.0" is-npm "^1.0.0" latest-version "^3.0.0" - lazy-req "^2.0.0" semver-diff "^2.0.0" xdg-basedir "^3.0.0" @@ -2085,32 +2159,34 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" uuid@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" -v8flags@^2.0.10: +v8flags@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" dependencies: user-home "^1.1.1" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" dependencies: - extsprintf "1.0.2" + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" -which@^1.2.8: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" +which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: - string-width "^1.0.1" + string-width "^1.0.2" widest-line@^1.0.0: version "1.0.0" @@ -2123,17 +2199,17 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" write-file-atomic@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.0.0.tgz#bb99a5440d0d31dd860a68da392bffeef66251a1" + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" - slide "^1.1.5" + signal-exit "^3.0.2" xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" -yallist@^2.0.0: +yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From 0c0bcd035b36d82925d799aafcaa7aee0cf1c811 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Tue, 5 Sep 2017 21:18:12 +0800 Subject: [PATCH 28/51] update output --- src/core/Task.js | 4 ++++ src/core/output.js | 60 +++++++++++++++++++++++++++++++++------------- src/core/utils.js | 8 +++---- 3 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/core/Task.js b/src/core/Task.js index 4399b76..1d923be 100644 --- a/src/core/Task.js +++ b/src/core/Task.js @@ -125,6 +125,10 @@ export default class Task { this.task.log.push(`${operation}#${moment().toISOString()}`) } + description(){ + return this.task.description + } + setDescription(text){ this.task.description = (text) ? text : (this.task.description) ? this.task.description : '' } diff --git a/src/core/output.js b/src/core/output.js index d571d92..b1e9585 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -1,50 +1,76 @@ import moment from 'moment' -import Table from 'cli-table' -import chalk from 'chalk' +import Table from 'cli-table2' +import colors from 'colors' import { humanParseDiff, calcRate } from './utils' export const sumarize = function(search, tasks, rate, full, format) { let table = new Table({ head: ['Duration', 'Dates', 'Task'], - chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, colAligns: ['right', 'center', 'left'], + chars: { + 'top': '═' + , 'top-mid': '╤' + , 'top-left': '╔' + , 'top-right': '╗' + , 'bottom': '═' + , 'bottom-mid': '╧' + , 'bottom-left': '╚' + , 'bottom-right': '╝' + , 'left': '║' + , 'left-mid': '╟' + , 'right': '║' + , 'right-mid': '╢' + }, style: { head: ['green'] } }); let total = 0 let head= `Search: ${search} \n` tasks.forEach((task, index) => { - let name = task.name task = task.task let duration = task.getSeconds() total += duration - table.push([humanParseDiff(duration), moment(task.getStartDate()).format(format), name]) - }) + let description = (task.description() && task.description() !== '') + ? task.description() + : task.name - console.log(table.toString()); + table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)]) + }) if (full){ - let table2 = new Table() - table2.push( - { 'Search': ['\"' + search + '\"'] }, - { 'Total time': [humanParseDiff(total)] } + table.push([]) + table.push( + [{ rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)] ) if (rate){ - table2.push({ 'Rate': [calcRate(rate, total)] }) + table.push([ colors.red('Rate'), calcRate(rate, total)]) } - - console.log(table2.toString()); } + + console.log(table.toString()); } export const outputConfig = function (config){ let table = new Table({ head: ['Key', 'value'], - chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''}, + chars: { + 'top': '═' + , 'top-mid': '╤' + , 'top-left': '╔' + , 'top-right': '╗' + , 'bottom': '═' + , 'bottom-mid': '╧' + , 'bottom-left': '╚' + , 'bottom-right': '╝' + , 'left': '║' + , 'left-mid': '╟' + , 'right': '║' + , 'right-mid': '╢' + }, colAligns: ['center', 'center'], style: { head: ['green'] } }); @@ -65,9 +91,9 @@ export const outputVertical = function (...args){ } export const cliError = function(err) { - console.error(chalk.red(`Error: ${err}`)) + console.error(colors.red(`Error: ${err}`)) } export const cliSuccess = function(err) { - console.log(chalk.green(err)) + console.log(colors.green(err)) } diff --git a/src/core/utils.js b/src/core/utils.js index a9103b2..413b528 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -36,8 +36,8 @@ export const humanParseDiff = function(secs) { let hours = Math.floor(secs / 3600) let minutes = Math.floor((secs - (hours * 3600)) / 60) let seconds = secs - (hours * 3600) - (minutes * 60) - hours = (hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h') - minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm') - seconds = (seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's') - return hours + minutes + seconds + hours = (hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h') + minutes = ((minutes == 0 && hours == '') ? '00m' : (minutes < 10 ? '0' + minutes : minutes) + 'm') + seconds = (seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's') + return `${hours} ${minutes} ${seconds}` } From ea61e0bdc42d2efe93414b26c37d97b225d748eb Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Tue, 5 Sep 2017 21:18:35 +0800 Subject: [PATCH 29/51] new build up --- lib/core/Task.js | 5 ++++ lib/core/Task.js.map | 2 +- lib/core/output.js | 57 ++++++++++++++++++++++++++++++------------ lib/core/output.js.map | 2 +- lib/core/utils.js | 8 +++--- lib/core/utils.js.map | 2 +- package.json | 2 +- 7 files changed, 54 insertions(+), 24 deletions(-) diff --git a/lib/core/Task.js b/lib/core/Task.js index 585ff5d..1068196 100644 --- a/lib/core/Task.js +++ b/lib/core/Task.js @@ -158,6 +158,11 @@ var Task = function () { this.task.log.push(operation + '#' + (0, _moment2.default)().toISOString()); } + }, { + key: 'description', + value: function description() { + return this.task.description; + } }, { key: 'setDescription', value: function setDescription(text) { diff --git a/lib/core/Task.js.map b/lib/core/Task.js.map index 5fe4467..4f83a0b 100644 --- a/lib/core/Task.js.map +++ b/lib/core/Task.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n description(){\n return this.task.description\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/output.js b/lib/core/output.js index 3b9e401..37d0449 100644 --- a/lib/core/output.js +++ b/lib/core/output.js @@ -9,13 +9,13 @@ var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); -var _cliTable = require('cli-table'); +var _cliTable = require('cli-table2'); var _cliTable2 = _interopRequireDefault(_cliTable); -var _chalk = require('chalk'); +var _colors = require('colors'); -var _chalk2 = _interopRequireDefault(_chalk); +var _colors2 = _interopRequireDefault(_colors); var _utils = require('./utils'); @@ -26,41 +26,66 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, format) { var table = new _cliTable2.default({ head: ['Duration', 'Dates', 'Task'], - chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, colAligns: ['right', 'center', 'left'], + chars: { + 'top': '═', + 'top-mid': '╤', + 'top-left': '╔', + 'top-right': '╗', + 'bottom': '═', + 'bottom-mid': '╧', + 'bottom-left': '╚', + 'bottom-right': '╝', + 'left': '║', + 'left-mid': '╟', + 'right': '║', + 'right-mid': '╢' + }, style: { head: ['green'] } }); var total = 0; var head = 'Search: ' + search + ' \n'; tasks.forEach(function (task, index) { - var name = task.name; task = task.task; var duration = task.getSeconds(); total += duration; - table.push([(0, _utils.humanParseDiff)(duration), (0, _moment2.default)(task.getStartDate()).format(format), name]); - }); + var description = task.description() && task.description() !== '' ? task.description() : task.name; - console.log(table.toString()); + table.push([description, (0, _moment2.default)(task.getStartDate()).format(format), (0, _utils.humanParseDiff)(duration)]); + }); if (full) { - var table2 = new _cliTable2.default(); - table2.push({ 'Search': ['\"' + search + '\"'] }, { 'Total time': [(0, _utils.humanParseDiff)(total)] }); + table.push([]); + table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, _colors2.default.red('Total time'), (0, _utils.humanParseDiff)(total)]); if (rate) { - table2.push({ 'Rate': [(0, _utils.calcRate)(rate, total)] }); + table.push([_colors2.default.red('Rate'), (0, _utils.calcRate)(rate, total)]); } - - console.log(table2.toString()); } + + console.log(table.toString()); }; var outputConfig = exports.outputConfig = function outputConfig(config) { var table = new _cliTable2.default({ head: ['Key', 'value'], - chars: { 'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '' }, + chars: { + 'top': '═', + 'top-mid': '╤', + 'top-left': '╔', + 'top-right': '╗', + 'bottom': '═', + 'bottom-mid': '╧', + 'bottom-left': '╚', + 'bottom-right': '╝', + 'left': '║', + 'left-mid': '╟', + 'right': '║', + 'right-mid': '╢' + }, colAligns: ['center', 'center'], style: { head: ['green'] } }); @@ -85,10 +110,10 @@ var outputVertical = exports.outputVertical = function outputVertical() { }; var cliError = exports.cliError = function cliError(err) { - console.error(_chalk2.default.red('Error: ' + err)); + console.error(_colors2.default.red('Error: ' + err)); }; var cliSuccess = exports.cliSuccess = function cliSuccess(err) { - console.log(_chalk2.default.green(err)); + console.log(_colors2.default.green(err)); }; //# sourceMappingURL=output.js.map \ No newline at end of file diff --git a/lib/core/output.js.map b/lib/core/output.js.map index 2df6e59..e5bc2bb 100644 --- a/lib/core/output.js.map +++ b/lib/core/output.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","chars","colAligns","style","total","forEach","task","index","name","duration","getSeconds","push","getStartDate","console","log","toString","table2","outputConfig","config","Object","keys","map","e","outputVertical","args","key","splice","cliError","err","error","red","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table'\nimport chalk from 'chalk'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['right', 'center', 'left'],\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n table.push([humanParseDiff(duration), moment(task.getStartDate()).format(format), name])\n })\n\n console.log(table.toString());\n\n if (full){\n let table2 = new Table()\n table2.push(\n { 'Search': ['\\\"' + search + '\\\"'] },\n { 'Total time': [humanParseDiff(total)] }\n )\n\n if (rate){\n table2.push({ 'Rate': [calcRate(rate, total)] })\n }\n\n console.log(table2.toString());\n }\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(chalk.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(chalk.green(err))\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","duration","getSeconds","description","name","push","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n colAligns: ['right', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n let description = (task.description() && task.description() !== '')\n ? task.description()\n : task.name\n\n table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)]\n )\n\n if (rate){\n table.push([ colors.red('Rate'), calcRate(rate, total)])\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file diff --git a/lib/core/utils.js b/lib/core/utils.js index 5c2110f..da2943d 100644 --- a/lib/core/utils.js +++ b/lib/core/utils.js @@ -41,9 +41,9 @@ var humanParseDiff = exports.humanParseDiff = function humanParseDiff(secs) { var hours = Math.floor(secs / 3600); var minutes = Math.floor((secs - hours * 3600) / 60); var seconds = secs - hours * 3600 - minutes * 60; - hours = hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h'; - minutes = minutes == 0 && hours == '' ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm'; - seconds = seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's'; - return hours + minutes + seconds; + hours = hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h'; + minutes = minutes == 0 && hours == '' ? '00m' : (minutes < 10 ? '0' + minutes : minutes) + 'm'; + seconds = seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's'; + return hours + ' ' + minutes + ' ' + seconds; }; //# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/lib/core/utils.js.map b/lib/core/utils.js.map index 883deb8..5c21888 100644 --- a/lib/core/utils.js.map +++ b/lib/core/utils.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/utils.js"],"names":["recognizeModifierTiming","string","r","arr","res","exec","push","value","momentKey","calcRate","rate","total","amount","mod","substr","length","slice","parseFloat","toFixed","humanParseDiff","secs","hours","Math","floor","minutes","seconds"],"mappings":";;;;;AAAO,IAAMA,4DAA0B,SAA1BA,uBAA0B,CAAUC,MAAV,EAAiB;AACpD,QAAIC,IAAI,kBAAR;AACA,QAAIC,YAAJ;AACA,QAAIC,MAAM,EAAV;AACA,WAAO,CAACD,MAAMD,EAAEG,IAAF,CAAOJ,MAAP,CAAP,MAA2B,IAAlC,EAAwC;AACpCG,YAAIE,IAAJ,CAAS;AACLC,mBAAOJ,IAAI,CAAJ,CADF;AAELK,uBAAWL,IAAI,CAAJ;AAFN,SAAT;AAIH;;AAED,WAAOC,GAAP;AACH,CAZM;;AAcA,IAAMK,8BAAW,SAAXA,QAAW,CAAUC,IAAV,EAAgBC,KAAhB,EAAsB;AAC1C,QAAIC,eAAJ;AACA,QAAIC,MAAMH,KAAKI,MAAL,CAAYJ,KAAKK,MAAL,GAAc,CAA1B,CAAV;AACA,QAAIR,QAAQG,KAAKM,KAAL,CAAW,CAAX,EAAcN,KAAKK,MAAL,GAAc,CAA5B,CAAZ;;AAEA,YAAQF,GAAR;AACI,aAAK,GAAL;AACID,qBAAUD,QAAM,EAAN,GAAS,EAAV,GAAcM,WAAWV,KAAX,CAAvB;AACA;AACJ,aAAK,GAAL;AACIK,qBAAUD,QAAM,EAAP,GAAWM,WAAWV,KAAX,CAApB;AACA;AACJ,aAAK,GAAL;AACIK,qBAASD,QAAMM,WAAWV,KAAX,CAAf;AACA;AATR;;AAYA,WAAOK,OAAOM,OAAP,CAAe,CAAf,CAAP;AACH,CAlBM;;AAoBA,IAAMC,0CAAiB,SAAjBA,cAAiB,CAASC,IAAT,EAAe;AACzC,QAAIC,QAAUC,KAAKC,KAAL,CAAWH,OAAO,IAAlB,CAAd;AACA,QAAII,UAAUF,KAAKC,KAAL,CAAW,CAACH,OAAQC,QAAQ,IAAjB,IAA0B,EAArC,CAAd;AACA,QAAII,UAAUL,OAAQC,QAAQ,IAAhB,GAAyBG,UAAU,EAAjD;AACAH,YAASA,SAAS,CAAT,GAAa,EAAb,GAAkB,CAACA,QAAQ,EAAR,GAAa,MAAMA,KAAnB,GAA2BA,KAA5B,IAAqC,GAAhE;AACAG,cAAYA,WAAW,CAAX,IAAgBH,SAAS,EAA1B,GAAgC,EAAhC,GAAqC,CAACG,UAAU,EAAV,GAAe,MAAMA,OAArB,GAA+BA,OAAhC,IAA2C,GAA3F;AACAC,cAAWA,WAAW,CAAX,GAAe,EAAf,GAAoB,CAACA,UAAW,EAAX,GAAgB,MAAMA,OAAtB,GAAgCA,OAAjC,IAA4C,GAA3E;AACA,WAAOJ,QAAQG,OAAR,GAAkBC,OAAzB;AACH,CARM","file":"utils.js","sourcesContent":["export const recognizeModifierTiming = function (string){\n let r = /(\\d{1,})([hms])/g\n let arr\n let res = []\n while ((arr = r.exec(string)) !== null) {\n res.push({\n value: arr[1],\n momentKey: arr[2]\n })\n }\n\n return res\n}\n\nexport const calcRate = function (rate, total){\n let amount\n let mod = rate.substr(rate.length - 1)\n let value = rate.slice(0, rate.length - 1)\n\n switch (mod) {\n case 'h':\n amount = (total/60/60)*parseFloat(value)\n break;\n case 'm':\n amount = (total/60)*parseFloat(value)\n break;\n case 's':\n amount = total*parseFloat(value)\n break;\n }\n\n return amount.toFixed(2)\n}\n\nexport const humanParseDiff = function(secs) {\n let hours = Math.floor(secs / 3600)\n let minutes = Math.floor((secs - (hours * 3600)) / 60)\n let seconds = secs - (hours * 3600) - (minutes * 60)\n hours = (hours == 0 ? '' : (hours < 10 ? '0' + hours : hours) + 'h')\n minutes = ((minutes == 0 && hours == '') ? '' : (minutes < 10 ? '0' + minutes : minutes) + 'm')\n seconds = (seconds == 0 ? '' : (seconds < 10 ? '0' + seconds : seconds) + 's')\n return hours + minutes + seconds\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/utils.js"],"names":["recognizeModifierTiming","string","r","arr","res","exec","push","value","momentKey","calcRate","rate","total","amount","mod","substr","length","slice","parseFloat","toFixed","humanParseDiff","secs","hours","Math","floor","minutes","seconds"],"mappings":";;;;;AAAO,IAAMA,4DAA0B,SAA1BA,uBAA0B,CAAUC,MAAV,EAAiB;AACpD,QAAIC,IAAI,kBAAR;AACA,QAAIC,YAAJ;AACA,QAAIC,MAAM,EAAV;AACA,WAAO,CAACD,MAAMD,EAAEG,IAAF,CAAOJ,MAAP,CAAP,MAA2B,IAAlC,EAAwC;AACpCG,YAAIE,IAAJ,CAAS;AACLC,mBAAOJ,IAAI,CAAJ,CADF;AAELK,uBAAWL,IAAI,CAAJ;AAFN,SAAT;AAIH;;AAED,WAAOC,GAAP;AACH,CAZM;;AAcA,IAAMK,8BAAW,SAAXA,QAAW,CAAUC,IAAV,EAAgBC,KAAhB,EAAsB;AAC1C,QAAIC,eAAJ;AACA,QAAIC,MAAMH,KAAKI,MAAL,CAAYJ,KAAKK,MAAL,GAAc,CAA1B,CAAV;AACA,QAAIR,QAAQG,KAAKM,KAAL,CAAW,CAAX,EAAcN,KAAKK,MAAL,GAAc,CAA5B,CAAZ;;AAEA,YAAQF,GAAR;AACI,aAAK,GAAL;AACID,qBAAUD,QAAM,EAAN,GAAS,EAAV,GAAcM,WAAWV,KAAX,CAAvB;AACA;AACJ,aAAK,GAAL;AACIK,qBAAUD,QAAM,EAAP,GAAWM,WAAWV,KAAX,CAApB;AACA;AACJ,aAAK,GAAL;AACIK,qBAASD,QAAMM,WAAWV,KAAX,CAAf;AACA;AATR;;AAYA,WAAOK,OAAOM,OAAP,CAAe,CAAf,CAAP;AACH,CAlBM;;AAoBA,IAAMC,0CAAiB,SAAjBA,cAAiB,CAASC,IAAT,EAAe;AACzC,QAAIC,QAAUC,KAAKC,KAAL,CAAWH,OAAO,IAAlB,CAAd;AACA,QAAII,UAAUF,KAAKC,KAAL,CAAW,CAACH,OAAQC,QAAQ,IAAjB,IAA0B,EAArC,CAAd;AACA,QAAII,UAAUL,OAAQC,QAAQ,IAAhB,GAAyBG,UAAU,EAAjD;AACAH,YAASA,SAAS,CAAT,GAAa,KAAb,GAAqB,CAACA,QAAQ,EAAR,GAAa,MAAMA,KAAnB,GAA2BA,KAA5B,IAAqC,GAAnE;AACAG,cAAYA,WAAW,CAAX,IAAgBH,SAAS,EAA1B,GAAgC,KAAhC,GAAwC,CAACG,UAAU,EAAV,GAAe,MAAMA,OAArB,GAA+BA,OAAhC,IAA2C,GAA9F;AACAC,cAAWA,WAAW,CAAX,GAAe,KAAf,GAAuB,CAACA,UAAW,EAAX,GAAgB,MAAMA,OAAtB,GAAgCA,OAAjC,IAA4C,GAA9E;AACA,WAAUJ,KAAV,SAAmBG,OAAnB,SAA8BC,OAA9B;AACH,CARM","file":"utils.js","sourcesContent":["export const recognizeModifierTiming = function (string){\n let r = /(\\d{1,})([hms])/g\n let arr\n let res = []\n while ((arr = r.exec(string)) !== null) {\n res.push({\n value: arr[1],\n momentKey: arr[2]\n })\n }\n\n return res\n}\n\nexport const calcRate = function (rate, total){\n let amount\n let mod = rate.substr(rate.length - 1)\n let value = rate.slice(0, rate.length - 1)\n\n switch (mod) {\n case 'h':\n amount = (total/60/60)*parseFloat(value)\n break;\n case 'm':\n amount = (total/60)*parseFloat(value)\n break;\n case 's':\n amount = total*parseFloat(value)\n break;\n }\n\n return amount.toFixed(2)\n}\n\nexport const humanParseDiff = function(secs) {\n let hours = Math.floor(secs / 3600)\n let minutes = Math.floor((secs - (hours * 3600)) / 60)\n let seconds = secs - (hours * 3600) - (minutes * 60)\n hours = (hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h')\n minutes = ((minutes == 0 && hours == '') ? '00m' : (minutes < 10 ? '0' + minutes : minutes) + 'm')\n seconds = (seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's')\n return `${hours} ${minutes} ${seconds}`\n}\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 9262c13..767411e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.0.22", + "version": "2.1.0", "description": "Tiny time tracker", "keywords": [ "time", From afa73750341569fd0437474007d3c6decac48ccf Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Tue, 5 Sep 2017 21:21:59 +0800 Subject: [PATCH 30/51] new deps lock --- yarn.lock | 2215 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2215 insertions(+) create mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..fe4a12b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2215 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-do-expressions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-function-bind@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators-legacy@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" + dependencies: + babel-plugin-syntax-decorators "^6.1.18" + babel-runtime "^6.2.0" + babel-template "^6.3.0" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-do-expressions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" + dependencies: + babel-plugin-syntax-do-expressions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-function-bind@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" + dependencies: + babel-plugin-syntax-function-bind "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-es2015@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-stage-0@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" + dependencies: + babel-plugin-transform-do-expressions "^6.22.0" + babel-plugin-transform-function-bind "^6.22.0" + babel-preset-stage-1 "^6.24.1" + +babel-preset-stage-1@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babel@^6.3.26: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boxen@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^1.0.0" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-table2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" + dependencies: + lodash "^3.10.1" + string-width "^1.0.1" + optionalDependencies: + colors "^1.1.2" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^3.0.0, configstore@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +convert-source-map@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.2.0, debug@^2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +flat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.0.0.tgz#3abc7f3b588e64ce77dc42fd59aa35806622fea8" + dependencies: + is-buffer "~1.1.5" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@^0.4.17: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" + dependencies: + ansi-escapes "^2.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5, is-buffer@~1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jschardet@^1.4.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lodash@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.17.4, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +moment@^2.11.2: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.3.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" + +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +omelette@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.4.tgz#e8fa98cb08eeec0e402c49561fc0670c75120c89" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6, private@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.17.tgz#6f2150553e6375375d0ccb3180502b78c18ba430" + dependencies: + source-map "^0.5.6" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +update-notifier@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From 077185c55ce0f6e07cc451dae379f10ae5f03563 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Tue, 5 Sep 2017 23:47:01 +0800 Subject: [PATCH 31/51] fix 2.1 error --- CHANGELOG.md | 6 ++++++ lib/core/output.js | 5 +++-- lib/core/output.js.map | 2 +- package.json | 3 ++- src/core/output.js | 17 +++++++++++++---- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da72e4a..5ba9bdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## [v2.2.0] - Sep 5, 2017 + +- Update output +- Update all deps to last version +- Fix output v2.1 error + ## [v2.0.22] - Apr 18, 2017 - Update dependencies diff --git a/lib/core/output.js b/lib/core/output.js index 37d0449..a586d80 100644 --- a/lib/core/output.js +++ b/lib/core/output.js @@ -59,10 +59,11 @@ var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, f if (full) { table.push([]); - table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, _colors2.default.red('Total time'), (0, _utils.humanParseDiff)(total)]); if (rate) { - table.push([_colors2.default.red('Rate'), (0, _utils.calcRate)(rate, total)]); + table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, _colors2.default.red('Total time'), (0, _utils.humanParseDiff)(total)], [_colors2.default.red('Rate'), (0, _utils.calcRate)(rate, total)]); + } else { + table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, { rowSpan: 2, content: _colors2.default.red('Total time'), vAlign: 'center' }, { rowSpan: 2, content: (0, _utils.humanParseDiff)(total), vAlign: 'center' }], []); } } diff --git a/lib/core/output.js.map b/lib/core/output.js.map index e5bc2bb..732b4e0 100644 --- a/lib/core/output.js.map +++ b/lib/core/output.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","duration","getSeconds","description","name","push","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n colAligns: ['right', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n let description = (task.description() && task.description() !== '')\n ? task.description()\n : task.name\n\n table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)]\n )\n\n if (rate){\n table.push([ colors.red('Rate'), calcRate(rate, total)])\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","duration","getSeconds","description","name","push","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n colAligns: ['right', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n let description = (task.description() && task.description() !== '')\n ? task.description()\n : task.name\n\n table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 767411e..3bdde40 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.1.0", + "version": "2.2.0", "description": "Tiny time tracker", "keywords": [ "time", @@ -38,6 +38,7 @@ "dependencies": { "babel-polyfill": "^6.26.0", "cli-table2": "^0.2.0", + "colors": "^1.1.2", "commander": "^2.11.0", "configstore": "^3.1.1", "flat": "^4.0.0", diff --git a/src/core/output.js b/src/core/output.js index b1e9585..f639ec9 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -42,12 +42,21 @@ export const sumarize = function(search, tasks, rate, full, format) { if (full){ table.push([]) - table.push( - [{ rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)] - ) if (rate){ - table.push([ colors.red('Rate'), calcRate(rate, total)]) + table.push( + [{ rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)], + [ colors.red('Rate'), calcRate(rate, total)] + ) + } else { + table.push( + [ + { rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center' }, + { rowSpan:2, content: colors.red('Total time'), vAlign:'center' }, + { rowSpan:2, content: humanParseDiff(total), vAlign:'center' } + ], + [] + ) } } From 62afc0b2a2f05b73a84ea7284990d94ce0502e07 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Thu, 14 Sep 2017 01:30:26 +0800 Subject: [PATCH 32/51] Add a export point to be used externally --- CHANGELOG.md | 8 +++++++- lib/exports.js | 31 +++++++++++++++++++++++++++++++ lib/exports.js.map | 1 + package.json | 4 ++-- src/exports.js | 15 +++++++++++++++ 5 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 lib/exports.js create mode 100644 lib/exports.js.map create mode 100644 src/exports.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ba9bdb..2a954cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [v2.3.0] - Sep 14, 2017 + +- Add a manager export point + ## [v2.2.0] - Sep 5, 2017 - Update output @@ -41,4 +45,6 @@ [v1.1.1]: https://github.com/danibram/time-tracker-cli/compare/v1.1.0...v1.1.1 [v1.1.2]: https://github.com/danibram/time-tracker-cli/compare/v1.1.1...v1.1.2 [v2.0.0]: https://github.com/danibram/time-tracker-cli/compare/v1.1.2...v2.0.0 -[v2.0.22]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.22 \ No newline at end of file +[v2.0.22]: https://github.com/danibram/time-tracker-cli/compare/v2.0.0...v2.0.22 +[v2.2.0]: https://github.com/danibram/time-tracker-cli/compare/v2.0.22...v2.2.0 +[v2.3.0]: https://github.com/danibram/time-tracker-cli/compare/v2.2.0...v2.3.0 \ No newline at end of file diff --git a/lib/exports.js b/lib/exports.js new file mode 100644 index 0000000..1f5e3e5 --- /dev/null +++ b/lib/exports.js @@ -0,0 +1,31 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Manager = require('./core/Manager'); + +var _Manager2 = _interopRequireDefault(_Manager); + +var _configstore = require('configstore'); + +var _configstore2 = _interopRequireDefault(_configstore); + +var _package = require('../package.json'); + +var _package2 = _interopRequireDefault(_package); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var config = new _configstore2.default(_package2.default.name, { + tasks: {}, + config: { + 'format.output': 'DD/MM' + } +}); + +exports.default = function () { + return new _Manager2.default(config); +}; +//# sourceMappingURL=exports.js.map \ No newline at end of file diff --git a/lib/exports.js.map b/lib/exports.js.map new file mode 100644 index 0000000..e33ba3a --- /dev/null +++ b/lib/exports.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/exports.js"],"names":["config","name","tasks"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA;;;;;;AAEA,IAAMA,SAAS,0BAAgB,kBAAIC,IAApB,EAA0B;AACrCC,WAAM,EAD+B;AAErCF,YAAO;AACH,yBAAiB;AADd;AAF8B,CAA1B,CAAf;;kBAOe,YAAM;AACjB,WAAO,sBAAYA,MAAZ,CAAP;AACH,C","file":"exports.js","sourcesContent":["import Manager from './core/Manager'\nimport Configstore from 'configstore'\n\nimport pkg from '../package.json'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nexport default () => {\n return new Manager(config)\n}\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 3bdde40..994ba5c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.2.0", + "version": "2.3.0", "description": "Tiny time tracker", "keywords": [ "time", @@ -14,7 +14,7 @@ "bin": { "timer": "./bin/timer" }, - "main": "./lib", + "main": "./lib/exports", "scripts": { "build": "node_modules/.bin/babel -s -d lib src", "dev": "npm run build -- -w", diff --git a/src/exports.js b/src/exports.js new file mode 100644 index 0000000..5ac49c9 --- /dev/null +++ b/src/exports.js @@ -0,0 +1,15 @@ +import Manager from './core/Manager' +import Configstore from 'configstore' + +import pkg from '../package.json' + +const config = new Configstore(pkg.name, { + tasks:{}, + config:{ + 'format.output': 'DD/MM' + } +}) + +export default () => { + return new Manager(config) +} From 4d194de74af45e6257998eb53de56ca6a61cb732 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Sun, 15 Oct 2017 20:25:27 +0800 Subject: [PATCH 33/51] v2.3.1 --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 994ba5c..b83a85a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker-cli", - "version": "2.3.0", + "version": "2.3.1", "description": "Tiny time tracker", "keywords": [ "time", @@ -42,9 +42,9 @@ "commander": "^2.11.0", "configstore": "^3.1.1", "flat": "^4.0.0", - "inquirer": "^3.2.3", - "moment": "^2.11.2", - "omelette": "^0.4.4", - "update-notifier": "^2.2.0" + "inquirer": "^3.3.0", + "moment": "^2.19.1", + "omelette": "^0.4.5", + "update-notifier": "^2.3.0" } } From d011a7291edb16550d22376645cdc2f5d353de3b Mon Sep 17 00:00:00 2001 From: Daniel Biedma Ramos Date: Sun, 15 Oct 2017 20:26:27 +0800 Subject: [PATCH 34/51] Update changelog --- CHANGELOG.md | 4 ++++ yarn.lock | 66 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a954cc..119b087 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [v2.3.1] - Sep 14, 2017 + +- Update dependencies + ## [v2.3.0] - Sep 14, 2017 - Add a manager export point diff --git a/yarn.lock b/yarn.lock index fe4a12b..dfd4d16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,9 +19,9 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-escapes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" ansi-regex@^2.0.0: version "2.1.1" @@ -771,7 +771,7 @@ boom@2.x.x: dependencies: hoek "2.x.x" -boxen@^1.0.0: +boxen@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" dependencies: @@ -810,7 +810,7 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -chalk@^1.0.0, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1180,6 +1180,12 @@ glob@^7.0.5, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" + dependencies: + ini "^1.3.4" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -1280,15 +1286,15 @@ inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" +inquirer@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" dependencies: - ansi-escapes "^2.0.0" + ansi-escapes "^3.0.0" chalk "^2.0.0" cli-cursor "^2.1.0" cli-width "^2.0.0" @@ -1359,6 +1365,13 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -1379,6 +1392,12 @@ is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -1577,9 +1596,9 @@ minimist@^1.2.0: dependencies: minimist "0.0.8" -moment@^2.11.2: - version "2.18.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" +moment@^2.19.1: + version "2.19.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" ms@2.0.0: version "2.0.0" @@ -1654,9 +1673,9 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -omelette@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.4.tgz#e8fa98cb08eeec0e402c49561fc0670c75120c89" +omelette@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.5.tgz#f16bc477b7e263b59796a65661964e4762e9ae74" once@^1.3.0, once@^1.3.3: version "1.4.0" @@ -1719,6 +1738,10 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -2131,14 +2154,15 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -update-notifier@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" +update-notifier@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" dependencies: - boxen "^1.0.0" - chalk "^1.0.0" + boxen "^1.2.1" + chalk "^2.0.1" configstore "^3.0.0" import-lazy "^2.1.0" + is-installed-globally "^0.1.0" is-npm "^1.0.0" latest-version "^3.0.0" semver-diff "^2.0.0" From 374be334e781776c23d1608ae1916ed1efce281e Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Thu, 19 Oct 2017 15:23:48 -0500 Subject: [PATCH 35/51] Create new file --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dd1ae01 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Daniel Biedma + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 433589820e842dd7407d5680932e406b5c239d51 Mon Sep 17 00:00:00 2001 From: mlndz28 Date: Tue, 5 Dec 2017 14:28:48 -0500 Subject: [PATCH 36/51] Markdown output A table is created with the times object from the export json. --- lib/core/Manager.js | 54 +++++++++++++++++++++++++++++++++++++---- lib/core/Manager.js.map | 2 +- lib/index.js | 16 ++++++++++-- lib/index.js.map | 2 +- src/core/Manager.js | 41 ++++++++++++++++++++++++++++--- src/index.js | 18 +++++++++++--- 6 files changed, 118 insertions(+), 15 deletions(-) diff --git a/lib/core/Manager.js b/lib/core/Manager.js index 7db44ce..d371214 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -179,8 +179,52 @@ var Manager = function () { } }, { key: 'getTasksJson', - value: function getTasksJson() { - return _flat2.default.unflatten(this.tasks); + value: function getTasksJson(key) { + return _flat2.default.unflatten(key ? this.tasks[key] : this.tasks); + } + }, { + key: 'getTasksMd', + value: function getTasksMd(key) { + var _this8 = this; + + var timings = this.tasks[key].timings; + var body = "| Inicio | Fin | Horas | Subtotal |\n"; + body += "| ----- | --- | -----:| -------: |\n"; + var total = 0; + timings.forEach(function (k) { + var start = new Date(k.start); + var stop = new Date(k.stop); + total += stop - start; + body += "|" + _this8.dateFormat(start) + "|" + _this8.dateFormat(stop) + "|" + _this8.hourFormat(stop - start) + "|" + _this8.hourFormat(total) + "|\n"; + }); + body += "| | |\n"; + body += "| Total | | " + this.hourFormat(total) + " | |\n"; + + return body; + } + }, { + key: 'dateFormat', + value: function dateFormat(d) { + var date = d.getFullYear() + "/"; + var twoDigits = function twoDigits(n) { + return n < 10 ? "0" + n : n; + }; + date += twoDigits(d.getMonth() + 1) + "/"; + date += twoDigits(d.getDate()) + " "; + date += twoDigits(d.getHours()) + ":"; + date += twoDigits(d.getMinutes()) + ":"; + date += twoDigits(d.getSeconds()); + return date; + } + }, { + key: 'hourFormat', + value: function hourFormat(d) { + var date = new Date(d); + var twoDigits = function twoDigits(n) { + return n < 10 ? "0" + n : n; + }; + + return Math.round(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()); } }, { key: 'getConfig', @@ -205,7 +249,7 @@ var Manager = function () { }, { key: 'update', value: function update() { - var _this8 = this; + var _this9 = this; if (!this.config || this.config && this.config['config.version'] !== '2') { console.log('DB: Need to be updated'); @@ -217,8 +261,8 @@ var Manager = function () { }); return newTasks; }).then(function (migratedTasks) { - _this8.cfg.set('tasks', migratedTasks); - _this8.cfg.set('config', Object.assign(_this8.config, { + _this9.cfg.set('tasks', migratedTasks); + _this9.cfg.set('config', Object.assign(_this9.config, { 'config.version': '2' })); diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map index 82f745f..14eaf6a 100644 --- a/lib/core/Manager.js.map +++ b/lib/core/Manager.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson() {\n return flat.unflatten(this.tasks)\n }\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","timings","body","total","Date","dateFormat","hourFormat","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","round","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key) {\n\t\tlet timings = this.tasks[key].timings\n\t\tlet body = \t\"| Inicio | Fin | Horas | Subtotal |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: |\\n\"\n\t\tlet total = 0;\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = new Date(k.stop)\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | |\\n\"\n\n return body\n }\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\n\t\treturn Math.round(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 7093506..8783545 100644 --- a/lib/index.js +++ b/lib/index.js @@ -104,8 +104,20 @@ _commander2.default.command('log ').description('Logs the time of the EXEC = true; }); -_commander2.default.command('export').description('Export the tasks in a JSON').alias('e').action(function (key) { - console.log(JSON.stringify(manager.getTasksJson(), null, 4)); +_commander2.default.command('export [task_string]').description('Export the tasks in a JSON').alias('e').option('-f --format [format]').option('-s --start [start date]').option('-e --end [end date]').action(function (key, options) { + //console.log("Key: "+ key) + //console.log("Format: /" + options.format+ "/") + //console.log("Options: "+ JSON.stringify(options.start)) + switch (options.format ? options.format.toLowerCase() : undefined) { + case "json":case undefined: + console.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4)); + break; + case "markdown":case "md": + console.log(manager.getTasksMd(key, options.start, options.end)); + break; + default: + console.log("Format not supported"); + } EXEC = true; }); diff --git a/lib/index.js.map b/lib/index.js.map index 17aa3c9..f9147a5 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","console","log","JSON","stringify","getTasksJson","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export')\n .description('Export the tasks in a JSON')\n .alias('e')\n .action(function(key) {\n console.log(JSON.stringify(manager.getTasksJson(), null, 4))\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","options","format","toLowerCase","undefined","console","log","JSON","stringify","getTasksJson","start","end","getTasksMd","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export [task_string]')\n .description('Export the tasks in a JSON')\n .alias('e')\n .option('-f --format [format]')\n .option('-s --start [start date]')\n .option('-e --end [end date]')\n .action(function(key, options) {\n\t\t//console.log(\"Key: \"+ key)\n\t\t//console.log(\"Format: /\" + options.format+ \"/\")\n\t\t//console.log(\"Options: \"+ JSON.stringify(options.start))\n\t\tswitch (options.format ? options.format.toLowerCase() : undefined){\n\t\t\tcase \"json\": case undefined:\n\t\t\t\tconsole.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4))\n\t\t\t\tbreak\n\t\t\tcase \"markdown\": case \"md\":\n\t\t\t\tconsole.log(manager.getTasksMd(key, options.start, options.end))\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tconsole.log(\"Format not supported\")\n\t\t}\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file diff --git a/src/core/Manager.js b/src/core/Manager.js index 93e91bf..8d39847 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -141,9 +141,44 @@ export default class Manager { .catch(cliError) } - getTasksJson() { - return flat.unflatten(this.tasks) - } + getTasksJson(key) { + return flat.unflatten(key ? this.tasks[key]: this.tasks) + } + + getTasksMd(key) { + let timings = this.tasks[key].timings + let body = "| Start | End | Hours | Subtotal |\n" + body += "| ----- | --- | -----:| -------: |\n" + let total = 0; + timings.forEach( k => { + let start = new Date(k.start) + let stop = new Date(k.stop) + total += stop - start + body += "|" + this.dateFormat(start)+ "|" + this.dateFormat(stop)+ "|"+ this.hourFormat(stop - start)+ "|"+ this.hourFormat(total)+ "|\n" + }) + body += "| | |\n" + body += "| Total | | " + this.hourFormat(total)+ " | |\n" + + return body + } + + dateFormat(d){ + let date = d.getFullYear() + "/" + let twoDigits = n => n < 10 ? "0" + n : n + date += twoDigits(d.getMonth()+1) + "/" + date += twoDigits(d.getDate()) + " " + date += twoDigits(d.getHours()) + ":" + date += twoDigits(d.getMinutes()) + ":" + date += twoDigits(d.getSeconds()) + return date + } + + hourFormat(d){ + let date = new Date(d) + let twoDigits = n => n < 10 ? "0" + n : n + + return Math.round(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()) + } getConfig(){ return this.config diff --git a/src/index.js b/src/index.js index 3b7c6f5..efd870b 100644 --- a/src/index.js +++ b/src/index.js @@ -123,11 +123,23 @@ program }) program - .command('export') + .command('export [task_string]') .description('Export the tasks in a JSON') .alias('e') - .action(function(key) { - console.log(JSON.stringify(manager.getTasksJson(), null, 4)) + .option('-f --format [format]') + .option('-s --start [start date]') + .option('-e --end [end date]') + .action(function(key, options) { + switch (options.format ? options.format.toLowerCase() : undefined){ + case "json": case undefined: + console.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4)) + break + case "markdown": case "md": + console.log(manager.getTasksMd(key, options.start, options.end)) + break + default: + console.log("Format not supported") + } EXEC = true }) From b0ef292d3c5c774e464811ca7f308eb6f8e5a2de Mon Sep 17 00:00:00 2001 From: mlndz28 Date: Thu, 22 Feb 2018 19:56:39 -0800 Subject: [PATCH 37/51] Report bug fix 'report' wasn't working when any of the tasks had an empty task.timings (caused by deleting or substracting time). Also the task name wasn't showing when there was no description and the column titles were placed wrong. --- lib/core/Task.js | 4 +++- lib/core/Task.js.map | 2 +- lib/core/output.js | 5 ++--- lib/core/output.js.map | 2 +- src/core/Task.js | 2 +- src/core/output.js | 9 ++++----- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/core/Task.js b/lib/core/Task.js index 1068196..f86b78b 100644 --- a/lib/core/Task.js +++ b/lib/core/Task.js @@ -219,7 +219,9 @@ var Task = function () { }, { key: 'getStartDate', value: function getStartDate() { - if (this.task.timings) { + console.log(this.task.timings); + console.log("----------"); + if (this.task.timings && this.task.timings[0]) { return this.task.timings[0].start; } else { return this.task.start; diff --git a/lib/core/Task.js.map b/lib/core/Task.js.map index 4f83a0b..4ac5dc9 100644 --- a/lib/core/Task.js.map +++ b/lib/core/Task.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n description(){\n return this.task.description\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n description(){\n return this.task.description\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n\t\tconsole.log(this.task.timings)\n\t\tconsole.log(\"----------\")\n if (this.task.timings && this.task.timings[0]){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/output.js b/lib/core/output.js index a586d80..0dcaec7 100644 --- a/lib/core/output.js +++ b/lib/core/output.js @@ -25,7 +25,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, format) { var table = new _cliTable2.default({ - head: ['Duration', 'Dates', 'Task'], + head: ['Task', 'Dates', 'Duration'], colAligns: ['right', 'center', 'left'], chars: { 'top': '═', @@ -47,13 +47,12 @@ var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, f var head = 'Search: ' + search + ' \n'; tasks.forEach(function (task, index) { + var description = task.task.description() && task.task.description() !== '' ? task.task.description() : task.name; task = task.task; var duration = task.getSeconds(); total += duration; - var description = task.description() && task.description() !== '' ? task.description() : task.name; - table.push([description, (0, _moment2.default)(task.getStartDate()).format(format), (0, _utils.humanParseDiff)(duration)]); }); diff --git a/lib/core/output.js.map b/lib/core/output.js.map index 732b4e0..061aa82 100644 --- a/lib/core/output.js.map +++ b/lib/core/output.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","duration","getSeconds","description","name","push","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Duration', 'Dates', 'Task'],\n colAligns: ['right', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n let description = (task.description() && task.description() !== '')\n ? task.description()\n : task.name\n\n table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","description","name","duration","getSeconds","push","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Task', 'Dates', 'Duration'],\n colAligns: ['right', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n\t\tlet description = (task.task.description() && task.task.description() !== '')\n\t\t? task.task.description()\n\t\t: task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file diff --git a/src/core/Task.js b/src/core/Task.js index 1d923be..b7b08b2 100644 --- a/src/core/Task.js +++ b/src/core/Task.js @@ -174,7 +174,7 @@ export default class Task { } getStartDate(){ - if (this.task.timings){ + if (this.task.timings && this.task.timings[0]){ return this.task.timings[0].start } else { return this.task.start diff --git a/src/core/output.js b/src/core/output.js index f639ec9..e445039 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -6,7 +6,7 @@ import { humanParseDiff, calcRate } from './utils' export const sumarize = function(search, tasks, rate, full, format) { let table = new Table({ - head: ['Duration', 'Dates', 'Task'], + head: ['Task', 'Dates', 'Duration'], colAligns: ['right', 'center', 'left'], chars: { 'top': '═' @@ -28,15 +28,14 @@ export const sumarize = function(search, tasks, rate, full, format) { let head= `Search: ${search} \n` tasks.forEach((task, index) => { + let description = (task.task.description() && task.task.description() !== '') + ? task.task.description() + : task.name task = task.task let duration = task.getSeconds() total += duration - let description = (task.description() && task.description() !== '') - ? task.description() - : task.name - table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)]) }) From 8dcdd41129c2c66d7441d6da00d2a39efb157870 Mon Sep 17 00:00:00 2001 From: mlndz28 Date: Thu, 22 Feb 2018 20:01:49 -0800 Subject: [PATCH 38/51] Markdown: descriptions and date filter Descriptions added to markdown export, as well as an option to filter the results by dates. --- lib/core/Manager.js | 60 ++++++++++++++++++++++++++++++++++++----- lib/core/Manager.js.map | 2 +- lib/core/Task.js | 2 -- lib/core/Task.js.map | 2 +- lib/index.js | 5 +--- lib/index.js.map | 2 +- src/core/Manager.js | 57 ++++++++++++++++++++++++++++++++++----- src/index.js | 6 ++--- 8 files changed, 110 insertions(+), 26 deletions(-) diff --git a/lib/core/Manager.js b/lib/core/Manager.js index d371214..2b86c15 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -184,24 +184,70 @@ var Manager = function () { } }, { key: 'getTasksMd', - value: function getTasksMd(key) { + value: function getTasksMd(key, start, end) { var _this8 = this; - var timings = this.tasks[key].timings; - var body = "| Inicio | Fin | Horas | Subtotal |\n"; - body += "| ----- | --- | -----:| -------: |\n"; + var timings = void 0; + if (key) { + timings = this.tasks[key].timings; + } else { + timings = this.unflatTasks(this.tasks); + } + var body = "| Start | End | Hours | Subtotal | Description |\n"; + body += "| ----- | --- | -----:| -------: | ----------- | \n"; var total = 0; + + timings = start || end ? this.filterDates(timings, start, end) : timings; timings.forEach(function (k) { var start = new Date(k.start); var stop = new Date(k.stop); total += stop - start; - body += "|" + _this8.dateFormat(start) + "|" + _this8.dateFormat(stop) + "|" + _this8.hourFormat(stop - start) + "|" + _this8.hourFormat(total) + "|\n"; + body += "|" + _this8.dateFormat(start) + "|" + _this8.dateFormat(stop) + "|" + _this8.hourFormat(stop - start) + "|" + _this8.hourFormat(total) + "|" + k.name + "|\n"; }); - body += "| | |\n"; - body += "| Total | | " + this.hourFormat(total) + " | |\n"; + body += "| | | |\n"; + body += "| Total | | " + this.hourFormat(total) + " | | |\n"; return body; } + }, { + key: 'filterDates', + value: function filterDates(timings, start, end) { + var filterStart = function filterStart(timings) { + var filtered = []; + for (var i = 0; i < timings.length; i++) { + if (new Date(start) < new Date(timings[i].start)) { + filtered.push(timings[i]); + } + } + return filtered; + }; + var filterEnd = function filterEnd(timings) { + var filtered = []; + for (var i = 0; i < timings.length; i++) { + if (new Date(end) > new Date(timings[i].start)) { + filtered.push(timings[i]); + } + } + return filtered; + }; + + return start && end ? filterStart(filterEnd(timings)) : start ? filterStart(timings) : filterEnd(timings); + } + }, { + key: 'unflatTasks', + value: function unflatTasks(tasks) { + var keys = Object.keys(tasks); + var unflattened = []; + for (var i1 = 0; i1 < keys.length; i1++) { + for (var i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++) { + var timing = tasks[keys[i1]].timings[i2]; + timing.name = keys[i1]; + timing.description = tasks[keys[i1]].description; + unflattened.push(timing); + } + } + return unflattened; + } }, { key: 'dateFormat', value: function dateFormat(d) { diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map index 14eaf6a..1d74445 100644 --- a/lib/core/Manager.js.map +++ b/lib/core/Manager.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","timings","body","total","Date","dateFormat","hourFormat","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","round","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key) {\n\t\tlet timings = this.tasks[key].timings\n\t\tlet body = \t\"| Inicio | Fin | Horas | Subtotal |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: |\\n\"\n\t\tlet total = 0;\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = new Date(k.stop)\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | |\\n\"\n\n return body\n }\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\n\t\treturn Math.round(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","timings","unflatTasks","body","total","filterDates","Date","dateFormat","hourFormat","filterStart","filtered","i","filterEnd","unflattened","i1","i2","timing","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","round","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key, start, end) {\n\t\tlet timings\n\t\tif(key){\n\t\t\ttimings = this.tasks[key].timings\n\t\t}else{\n\t\t\ttimings = this.unflatTasks(this.tasks)\n\t\t}\n\t\tlet body = \t\"| Start | End | Hours | Subtotal | Description |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: | ----------- | \\n\"\n\t\tlet total = 0;\n\n\t\ttimings = start || end ? this.filterDates(timings, start, end) : timings\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = new Date(k.stop)\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\" + k.name+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | | |\\n\"\n\n return body\n }\n\n\tfilterDates(timings, start, end){\n\t\tlet filterStart = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(start) < new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\t\tlet filterEnd = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(end) > new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\n\t\treturn start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings))\n\t}\n\tunflatTasks(tasks){\n\t\tlet keys = Object.keys(tasks)\n\t\tlet unflattened = []\n\t\tfor(let i1 = 0; i1 < keys.length; i1++){\n\t\t\tfor(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){\n\t\t\t\tlet timing = tasks[keys[i1]].timings[i2]\n\t\t\t\ttiming.name = keys[i1]\n\t\t\t\ttiming.description = tasks[keys[i1]].description\n\t\t\t\tunflattened.push(timing)\n\t\t\t}\n\t\t}\n\t\treturn unflattened\n\t}\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\n\t\treturn Math.round(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/Task.js b/lib/core/Task.js index f86b78b..65f178b 100644 --- a/lib/core/Task.js +++ b/lib/core/Task.js @@ -219,8 +219,6 @@ var Task = function () { }, { key: 'getStartDate', value: function getStartDate() { - console.log(this.task.timings); - console.log("----------"); if (this.task.timings && this.task.timings[0]) { return this.task.timings[0].start; } else { diff --git a/lib/core/Task.js.map b/lib/core/Task.js.map index 4ac5dc9..d6350fc 100644 --- a/lib/core/Task.js.map +++ b/lib/core/Task.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n description(){\n return this.task.description\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n\t\tconsole.log(this.task.timings)\n\t\tconsole.log(\"----------\")\n if (this.task.timings && this.task.timings[0]){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n description(){\n return this.task.description\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings && this.task.timings[0]){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 8783545..6718539 100644 --- a/lib/index.js +++ b/lib/index.js @@ -104,10 +104,7 @@ _commander2.default.command('log ').description('Logs the time of the EXEC = true; }); -_commander2.default.command('export [task_string]').description('Export the tasks in a JSON').alias('e').option('-f --format [format]').option('-s --start [start date]').option('-e --end [end date]').action(function (key, options) { - //console.log("Key: "+ key) - //console.log("Format: /" + options.format+ "/") - //console.log("Options: "+ JSON.stringify(options.start)) +_commander2.default.command('export [task_string]').description('Export the tasks in json (default) or md format').alias('e').option('-f --format [format]').option('-s --start [start date. Example: "2017/05/28"]').option('-e --end [end date. Example: "2018/05/28"]').action(function (key, options) { switch (options.format ? options.format.toLowerCase() : undefined) { case "json":case undefined: console.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4)); diff --git a/lib/index.js.map b/lib/index.js.map index f9147a5..137a7b0 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","options","format","toLowerCase","undefined","console","log","JSON","stringify","getTasksJson","start","end","getTasksMd","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export [task_string]')\n .description('Export the tasks in a JSON')\n .alias('e')\n .option('-f --format [format]')\n .option('-s --start [start date]')\n .option('-e --end [end date]')\n .action(function(key, options) {\n\t\t//console.log(\"Key: \"+ key)\n\t\t//console.log(\"Format: /\" + options.format+ \"/\")\n\t\t//console.log(\"Options: \"+ JSON.stringify(options.start))\n\t\tswitch (options.format ? options.format.toLowerCase() : undefined){\n\t\t\tcase \"json\": case undefined:\n\t\t\t\tconsole.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4))\n\t\t\t\tbreak\n\t\t\tcase \"markdown\": case \"md\":\n\t\t\t\tconsole.log(manager.getTasksMd(key, options.start, options.end))\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tconsole.log(\"Format not supported\")\n\t\t}\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","options","format","toLowerCase","undefined","console","log","JSON","stringify","getTasksJson","start","end","getTasksMd","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export [task_string]')\n .description('Export the tasks in json (default) or md format')\n .alias('e')\n .option('-f --format [format]')\n .option('-s --start [start date. Example: \"2017/05/28\"]')\n .option('-e --end [end date. Example: \"2018/05/28\"]')\n .action(function(key, options) {\n\t\tswitch (options.format ? options.format.toLowerCase() : undefined){\n\t\t\tcase \"json\": case undefined:\n\t\t\t\tconsole.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4))\n\t\t\t\tbreak\n\t\t\tcase \"markdown\": case \"md\":\n\t\t\t\tconsole.log(manager.getTasksMd(key, options.start, options.end))\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tconsole.log(\"Format not supported\")\n\t\t}\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file diff --git a/src/core/Manager.js b/src/core/Manager.js index 8d39847..b31bf0d 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -145,23 +145,66 @@ export default class Manager { return flat.unflatten(key ? this.tasks[key]: this.tasks) } - getTasksMd(key) { - let timings = this.tasks[key].timings - let body = "| Start | End | Hours | Subtotal |\n" - body += "| ----- | --- | -----:| -------: |\n" + getTasksMd(key, start, end) { + let timings + if(key){ + timings = this.tasks[key].timings + }else{ + timings = this.unflatTasks(this.tasks) + } + let body = "| Start | End | Hours | Subtotal | Description |\n" + body += "| ----- | --- | -----:| -------: | ----------- | \n" let total = 0; + + timings = start || end ? this.filterDates(timings, start, end) : timings timings.forEach( k => { let start = new Date(k.start) let stop = new Date(k.stop) total += stop - start - body += "|" + this.dateFormat(start)+ "|" + this.dateFormat(stop)+ "|"+ this.hourFormat(stop - start)+ "|"+ this.hourFormat(total)+ "|\n" + body += "|" + this.dateFormat(start)+ "|" + this.dateFormat(stop)+ "|"+ this.hourFormat(stop - start)+ "|"+ this.hourFormat(total)+ "|" + k.name+ "|\n" }) - body += "| | |\n" - body += "| Total | | " + this.hourFormat(total)+ " | |\n" + body += "| | | |\n" + body += "| Total | | " + this.hourFormat(total)+ " | | |\n" return body } + filterDates(timings, start, end){ + let filterStart = function(timings){ + let filtered = [] + for(let i = 0; i < timings.length; i++){ + if(new Date(start) < new Date(timings[i].start)){ + filtered.push(timings[i]) + } + } + return filtered + } + let filterEnd = function(timings){ + let filtered = [] + for(let i = 0; i < timings.length; i++){ + if(new Date(end) > new Date(timings[i].start)){ + filtered.push(timings[i]) + } + } + return filtered + } + + return start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings)) + } + unflatTasks(tasks){ + let keys = Object.keys(tasks) + let unflattened = [] + for(let i1 = 0; i1 < keys.length; i1++){ + for(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){ + let timing = tasks[keys[i1]].timings[i2] + timing.name = keys[i1] + timing.description = tasks[keys[i1]].description + unflattened.push(timing) + } + } + return unflattened + } + dateFormat(d){ let date = d.getFullYear() + "/" let twoDigits = n => n < 10 ? "0" + n : n diff --git a/src/index.js b/src/index.js index efd870b..b1ddd58 100644 --- a/src/index.js +++ b/src/index.js @@ -124,11 +124,11 @@ program program .command('export [task_string]') - .description('Export the tasks in a JSON') + .description('Export the tasks in json (default) or md format') .alias('e') .option('-f --format [format]') - .option('-s --start [start date]') - .option('-e --end [end date]') + .option('-s --start [start date. Example: "2017/05/28"]') + .option('-e --end [end date. Example: "2018/05/28"]') .action(function(key, options) { switch (options.format ? options.format.toLowerCase() : undefined){ case "json": case undefined: From 92e76d8a92525c5950c7fe7d76052d4809cd2044 Mon Sep 17 00:00:00 2001 From: Marcello Date: Sat, 24 Feb 2018 15:27:57 -0600 Subject: [PATCH 39/51] report keys sorted. name value added to report. better description fitting in output --- lib/core/Manager.js | 3 + lib/core/Manager.js.map | 2 +- lib/core/output.js | 28 +- lib/core/output.js.map | 2 +- package-lock.json | 3576 +++++++++++++++++++++++++++++++++++++++ src/core/Manager.js | 1 + src/core/output.js | 27 +- 7 files changed, 3628 insertions(+), 11 deletions(-) create mode 100644 package-lock.json diff --git a/lib/core/Manager.js b/lib/core/Manager.js index 2b86c15..f6002b7 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -324,6 +324,9 @@ var Manager = function () { var full = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var tasks = this.search(key); + tasks.sort(function (a, b) { + return a.name > b.name; + }); (0, _output.sumarize)(key, tasks, rate, full, this.config['format.output']); } }]); diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map index 1d74445..9ddaecb 100644 --- a/lib/core/Manager.js.map +++ b/lib/core/Manager.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","timings","unflatTasks","body","total","filterDates","Date","dateFormat","hourFormat","filterStart","filtered","i","filterEnd","unflattened","i1","i2","timing","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","round","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key, start, end) {\n\t\tlet timings\n\t\tif(key){\n\t\t\ttimings = this.tasks[key].timings\n\t\t}else{\n\t\t\ttimings = this.unflatTasks(this.tasks)\n\t\t}\n\t\tlet body = \t\"| Start | End | Hours | Subtotal | Description |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: | ----------- | \\n\"\n\t\tlet total = 0;\n\n\t\ttimings = start || end ? this.filterDates(timings, start, end) : timings\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = new Date(k.stop)\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\" + k.name+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | | |\\n\"\n\n return body\n }\n\n\tfilterDates(timings, start, end){\n\t\tlet filterStart = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(start) < new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\t\tlet filterEnd = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(end) > new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\n\t\treturn start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings))\n\t}\n\tunflatTasks(tasks){\n\t\tlet keys = Object.keys(tasks)\n\t\tlet unflattened = []\n\t\tfor(let i1 = 0; i1 < keys.length; i1++){\n\t\t\tfor(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){\n\t\t\t\tlet timing = tasks[keys[i1]].timings[i2]\n\t\t\t\ttiming.name = keys[i1]\n\t\t\t\ttiming.description = tasks[keys[i1]].description\n\t\t\t\tunflattened.push(timing)\n\t\t\t}\n\t\t}\n\t\treturn unflattened\n\t}\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\n\t\treturn Math.round(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","timings","unflatTasks","body","total","filterDates","Date","dateFormat","hourFormat","filterStart","filtered","i","filterEnd","unflattened","i1","i2","timing","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","round","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full","sort","a","b"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key, start, end) {\n\t\tlet timings\n\t\tif(key){\n\t\t\ttimings = this.tasks[key].timings\n\t\t}else{\n\t\t\ttimings = this.unflatTasks(this.tasks)\n\t\t}\n\t\tlet body = \t\"| Start | End | Hours | Subtotal | Description |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: | ----------- | \\n\"\n\t\tlet total = 0;\n\n\t\ttimings = start || end ? this.filterDates(timings, start, end) : timings\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = new Date(k.stop)\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\" + k.name+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | | |\\n\"\n\n return body\n }\n\n\tfilterDates(timings, start, end){\n\t\tlet filterStart = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(start) < new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\t\tlet filterEnd = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(end) > new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\n\t\treturn start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings))\n\t}\n\tunflatTasks(tasks){\n\t\tlet keys = Object.keys(tasks)\n\t\tlet unflattened = []\n\t\tfor(let i1 = 0; i1 < keys.length; i1++){\n\t\t\tfor(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){\n\t\t\t\tlet timing = tasks[keys[i1]].timings[i2]\n\t\t\t\ttiming.name = keys[i1]\n\t\t\t\ttiming.description = tasks[keys[i1]].description\n\t\t\t\tunflattened.push(timing)\n\t\t\t}\n\t\t}\n\t\treturn unflattened\n\t}\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\n\t\treturn Math.round(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n const tasks = this.search(key)\n tasks.sort((a,b) => { return a.name > b.name })\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/output.js b/lib/core/output.js index 0dcaec7..81e0ee7 100644 --- a/lib/core/output.js +++ b/lib/core/output.js @@ -25,8 +25,8 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, format) { var table = new _cliTable2.default({ - head: ['Task', 'Dates', 'Duration'], - colAligns: ['right', 'center', 'left'], + head: ['Name', 'Description', 'Dates', 'Duration'], + colAligns: ['left', 'center', 'center', 'left'], chars: { 'top': '═', 'top-mid': '╤', @@ -47,13 +47,31 @@ var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, f var head = 'Search: ' + search + ' \n'; tasks.forEach(function (task, index) { - var description = task.task.description() && task.task.description() !== '' ? task.task.description() : task.name; + var description = task.task.description() && task.task.description() !== '' ? task.task.description() : '-'; + var name = task.name; task = task.task; var duration = task.getSeconds(); total += duration; - table.push([description, (0, _moment2.default)(task.getStartDate()).format(format), (0, _utils.humanParseDiff)(duration)]); + // Avoid excesive width for proper console fit + var splitWidth = function splitWidth(str, len) { + var arr = []; + while (str != '') { + if (str.length > len) { + arr.push(str.substring(0, len)); + str = str.substring(len); + } else { + arr.push(str); + break; + } + } + return arr.join('\n'); + }; + description = splitWidth(description, 51); + name = splitWidth(name, 40); + + table.push([name, description, (0, _moment2.default)(task.getStartDate()).format(format), (0, _utils.humanParseDiff)(duration)]); }); if (full) { @@ -62,7 +80,7 @@ var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, f if (rate) { table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, _colors2.default.red('Total time'), (0, _utils.humanParseDiff)(total)], [_colors2.default.red('Rate'), (0, _utils.calcRate)(rate, total)]); } else { - table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, { rowSpan: 2, content: _colors2.default.red('Total time'), vAlign: 'center' }, { rowSpan: 2, content: (0, _utils.humanParseDiff)(total), vAlign: 'center' }], []); + table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, { rowSpan: 2, content: '', vAlign: 'center' }, { rowSpan: 2, content: _colors2.default.red('Total time'), vAlign: 'center' }, { rowSpan: 2, content: (0, _utils.humanParseDiff)(total), vAlign: 'center' }], []); } } diff --git a/lib/core/output.js.map b/lib/core/output.js.map index 061aa82..de42523 100644 --- a/lib/core/output.js.map +++ b/lib/core/output.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","description","name","duration","getSeconds","push","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Task', 'Dates', 'Duration'],\n colAligns: ['right', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n\t\tlet description = (task.task.description() && task.task.description() !== '')\n\t\t? task.task.description()\n\t\t: task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","description","name","duration","getSeconds","splitWidth","str","len","arr","length","push","substring","join","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Name','Description', 'Dates', 'Duration'],\n colAligns: ['left', 'center', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n\t\tlet description = (task.task.description() && task.task.description() !== '')\n\t\t? task.task.description()\n\t\t: '-'\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n // Avoid excesive width for proper console fit\n let splitWidth = function(str, len){\n let arr = []\n while (str != '') {\n if (str.length > len) {\n arr.push(str.substring(0,len))\n str = str.substring(len);\n } else {\n arr.push(str)\n break\n }\n }\n return arr.join('\\n')\n }\n description = splitWidth(description, 51)\n name = splitWidth(name, 40)\n\n table.push([name, description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: '', vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..11962b1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3576 @@ +{ + "name": "time-tracker-cli", + "version": "2.3.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "optional": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "optional": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true, + "optional": true + }, + "babel": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz", + "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=", + "dev": true + }, + "babel-cli": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", + "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-polyfill": "6.26.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "chokidar": "1.7.0", + "commander": "2.14.1", + "convert-source-map": "1.5.1", + "fs-readdir-recursive": "1.1.0", + "glob": "7.1.2", + "lodash": "4.17.5", + "output-file-sync": "1.1.2", + "path-is-absolute": "1.0.1", + "slash": "1.0.0", + "source-map": "0.5.7", + "v8flags": "2.1.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-do-expressions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", + "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-function-bind": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", + "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", + "dev": true, + "requires": { + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-do-expressions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", + "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", + "dev": true, + "requires": { + "babel-plugin-syntax-do-expressions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-function-bind": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", + "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", + "dev": true, + "requires": { + "babel-plugin-syntax-function-bind": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "regenerator-runtime": "0.10.5" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-preset-stage-0": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", + "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", + "dev": true, + "requires": { + "babel-plugin-transform-do-expressions": "6.22.0", + "babel-plugin-transform-function-bind": "6.22.0", + "babel-preset-stage-1": "6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "home-or-tmp": "2.0.0", + "lodash": "4.17.5", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.3", + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true, + "optional": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "optional": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "optional": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-table2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cli-table2/-/cli-table2-0.2.0.tgz", + "integrity": "sha1-LR738hig54biFFQFYtS9F3/jLZc=", + "requires": { + "colors": "1.1.2", + "lodash": "3.10.1", + "string-width": "1.0.2" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "optional": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "optional": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "flat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.0.0.tgz", + "integrity": "sha512-ji/WMv2jdsE+LaznpkIF9Haax0sdpTBozrz/Dtg4qSRMfbs8oVg4ypJunIRYPiMLvH/ed6OflXbnbTIKJhtgeg==", + "requires": { + "is-buffer": "1.1.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "optional": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "optional": true, + "requires": { + "for-in": "1.0.2" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.9.2", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "optional": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "1.3.5" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.5", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", + "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true, + "optional": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "optional": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "optional": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true, + "optional": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true, + "optional": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "requires": { + "isarray": "1.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "4.0.1" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "requires": { + "pify": "3.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "moment": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", + "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", + "dev": true, + "optional": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "optional": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "omelette": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/omelette/-/omelette-0.4.5.tgz", + "integrity": "sha512-b0k9uqwF60u15KmVkneVw96VYRtZu2QCbXUQ26SgdyVUgMBzctzIfhNPKAWl4oqJEKpe52CzBYSS+HIKtiK8sw==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.2.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "optional": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "optional": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "optional": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "optional": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "rc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", + "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "readable-stream": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.4", + "set-immediate-shim": "1.0.1" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "optional": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "requires": { + "rc": "1.2.5", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "1.2.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "5.5.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true, + "optional": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "requires": { + "has-flag": "3.0.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "requires": { + "boxen": "1.3.0", + "chalk": "2.3.1", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } +} diff --git a/src/core/Manager.js b/src/core/Manager.js index b31bf0d..bd1e79e 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -269,6 +269,7 @@ export default class Manager { sumarize(key, rate, full=true){ let tasks = this.search(key) + tasks.sort((a,b) => { return a.name > b.name }) sumarize(key, tasks, rate, full, this.config['format.output']) } } diff --git a/src/core/output.js b/src/core/output.js index e445039..0e6b801 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -6,8 +6,8 @@ import { humanParseDiff, calcRate } from './utils' export const sumarize = function(search, tasks, rate, full, format) { let table = new Table({ - head: ['Task', 'Dates', 'Duration'], - colAligns: ['right', 'center', 'left'], + head: ['Name','Description', 'Dates', 'Duration'], + colAligns: ['left', 'center', 'center', 'left'], chars: { 'top': '═' , 'top-mid': '╤' @@ -30,13 +30,31 @@ export const sumarize = function(search, tasks, rate, full, format) { tasks.forEach((task, index) => { let description = (task.task.description() && task.task.description() !== '') ? task.task.description() - : task.name + : '-' + let name = task.name task = task.task let duration = task.getSeconds() total += duration - table.push([description, moment(task.getStartDate()).format(format), humanParseDiff(duration)]) + // Avoid excesive width for proper console fit + let splitWidth = function(str, len){ + let arr = [] + while (str != '') { + if (str.length > len) { + arr.push(str.substring(0,len)) + str = str.substring(len); + } else { + arr.push(str) + break + } + } + return arr.join('\n') + } + description = splitWidth(description, 51) + name = splitWidth(name, 40) + + table.push([name, description, moment(task.getStartDate()).format(format), humanParseDiff(duration)]) }) if (full){ @@ -51,6 +69,7 @@ export const sumarize = function(search, tasks, rate, full, format) { table.push( [ { rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center' }, + { rowSpan:2, content: '', vAlign:'center' }, { rowSpan:2, content: colors.red('Total time'), vAlign:'center' }, { rowSpan:2, content: humanParseDiff(total), vAlign:'center' } ], From 3d6b78448517c4758403fb7328d3d8e2d70e4ef3 Mon Sep 17 00:00:00 2001 From: Marcello Date: Sat, 24 Feb 2018 17:53:10 -0600 Subject: [PATCH 40/51] NaN handling. round->floor bc caused ocasional phantom hour added --- lib/core/Manager.js | 7 +++---- lib/core/Manager.js.map | 2 +- src/core/Manager.js | 7 +++---- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/core/Manager.js b/lib/core/Manager.js index f6002b7..2abf5e0 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -194,13 +194,13 @@ var Manager = function () { timings = this.unflatTasks(this.tasks); } var body = "| Start | End | Hours | Subtotal | Description |\n"; - body += "| ----- | --- | -----:| -------: | ----------- | \n"; + body += "| ----- | --- | -----:| -------: | ----------- |\n"; var total = 0; timings = start || end ? this.filterDates(timings, start, end) : timings; timings.forEach(function (k) { var start = new Date(k.start); - var stop = new Date(k.stop); + var stop = k.stop ? new Date(k.stop) : new Date(); total += stop - start; body += "|" + _this8.dateFormat(start) + "|" + _this8.dateFormat(stop) + "|" + _this8.hourFormat(stop - start) + "|" + _this8.hourFormat(total) + "|" + k.name + "|\n"; }); @@ -269,8 +269,7 @@ var Manager = function () { var twoDigits = function twoDigits(n) { return n < 10 ? "0" + n : n; }; - - return Math.round(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()); + return Math.floor(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()); } }, { key: 'getConfig', diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map index 9ddaecb..568df2b 100644 --- a/lib/core/Manager.js.map +++ b/lib/core/Manager.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","timings","unflatTasks","body","total","filterDates","Date","dateFormat","hourFormat","filterStart","filtered","i","filterEnd","unflattened","i1","i2","timing","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","round","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full","sort","a","b"],"mappings":";;;;;;;;;AAAA;;;;AACA;;;;AACA;;;;AAEA;;;;AACA;;AACA;;AACA;;AACA;;;;;;;;IAEqBA,O;AAIjB,qBAAYC,GAAZ,EAAiB;AAAA;;AAAA,aAFjBC,YAEiB,GAFF,CAAC,OAAD,EAAU,QAAV,CAEE;;AACb,aAAKD,GAAL,GAAWA,GAAX;AACA,aAAKE,KAAL,GAAaF,IAAIG,GAAJ,CAAQD,KAArB;AACA,aAAKE,MAAL,GAAeJ,IAAIG,GAAJ,CAAQC,MAAT,GAAmBJ,IAAIG,GAAJ,CAAQC,MAA3B,GAAoC,EAAlD;AACH;;;;gCAEOC,G,EAAK;AACT,gBAAIC,OAAQ,KAAKJ,KAAL,CAAWG,GAAX,CAAD,GAAoB,KAAKH,KAAL,CAAWG,GAAX,CAApB,GAAsC,IAAjD;AACA,mBAAO,mBAASC,IAAT,CAAP;AACH;;;kCAESD,G,EAAKC,I,EAAK;AAChB,gBAAIC,SAAS,EAAb;AACAA,mBAAOF,GAAP,IAAcC,KAAKE,GAAL,EAAd;AACA,iBAAKN,KAAL,GAAaO,OAAOC,MAAP,CAAc,EAAd,EAAkB,KAAKR,KAAvB,EAA8BK,MAA9B,CAAb;AACA,iBAAKP,GAAL,CAASW,GAAT,CAAa,OAAb,EAAsB,KAAKT,KAA3B;AACH;;;kCAESG,G,EAAKO,W,EAAa;AAAA;;AACxB,gBAAIC,IAAI,KAAKC,OAAL,CAAaT,GAAb,CAAR;AACAQ,cAAEE,KAAF,CAAQH,WAAR,EACKI,IADL,CACU,YAAM;AACR,sBAAKC,SAAL,CAAeZ,GAAf,EAAoBQ,CAApB;AACAK,wBAAQC,GAAR,CACI,4BAAe,OAAf,EAAwBd,GAAxB,sBAAsC,wBAASe,WAAT,EAAtC,CADJ;AAGH,aANL,oBAOKC,KAPL;AAQH;;;kCAEShB,G,EAAI;AAAA;;AACV,gBAAIQ,IAAI,KAAKC,OAAL,CAAaT,GAAb,CAAR;AACAQ,cAAES,KAAF,GACKN,IADL,CACU,YAAI;AACN,uBAAKC,SAAL,CAAeZ,GAAf,EAAoBQ,CAApB;AACAK,wBAAQC,GAAR,CACI,4BAAe,OAAf,EAAwBd,GAAxB,qBAAqC,wBAASe,WAAT,EAArC,CADJ;AAGH,aANL,oBAOKC,KAPL;AAQH;;;oCAEWhB,G,EAAI;AAAA;;AACZ,gBAAIQ,IAAI,KAAKC,OAAL,CAAaT,GAAb,CAAR;AACAQ,cAAEU,OAAF,GACKP,IADL,CACU,YAAI;AACN,uBAAKC,SAAL,CAAeZ,GAAf,EAAoBQ,CAApB;AACAK,wBAAQC,GAAR,CACI,4BAAe,OAAf,EAAwBd,GAAxB,uBAAuC,wBAASe,WAAT,EAAvC,CADJ;AAGH,aANL,oBAOKC,KAPL;AAQH;;;iCAEQhB,G,EAAKO,W,EAAa;AAAA;;AACvB,gBAAIC,IAAI,KAAKC,OAAL,CAAaT,GAAb,CAAR;AACAQ,cAAEW,IAAF,CAAOZ,WAAP,EACKI,IADL,CACU,YAAI;AACN,uBAAKC,SAAL,CAAeZ,GAAf,EAAoBQ,CAApB;AACAK,wBAAQC,GAAR,CACI,4BAAe,OAAf,EAAwBd,GAAxB,uBAAuC,wBAASe,WAAT,EAAvC,CADJ;AAGH,aANL,oBAOKC,KAPL;AAQH;;;uCAEchB,G,EAAKoB,I,EAAK;AACrB,gBAAIZ,IAAI,KAAKC,OAAL,CAAaT,GAAb,CAAR;AACAQ,cAAEa,cAAF,CAAiBD,IAAjB;AACA,iBAAKR,SAAL,CAAeZ,GAAf,EAAoBQ,CAApB;AACH;;;gCAEOc,I,EAAM;AACV,gBAAId,IAAI,KAAKC,OAAL,CAAaa,IAAb,CAAR;AACA,mBAAOd,EAAEe,UAAF,EAAP;AACH;;;mCAEUC,S,EAAWF,I,EAAMG,U,EAAW;AAAA;;AACnC,gBAAIjB,IAAI,KAAKC,OAAL,CAAaa,IAAb,CAAR;AACAd,cAAEkB,qBAAF,CAAwBF,SAAxB,EAAmCC,UAAnC,EACKd,IADL,CACU,YAAI;AACN,uBAAKC,SAAL,CAAeU,IAAf,EAAqBd,CAArB;AACH,aAHL,oBAIKQ,KAJL;AAKH;;;+BAEMW,M,EAAQ;AAAA;;AACX,gBAAIC,OAAOxB,OAAOwB,IAAP,CAAY,KAAK/B,KAAjB,CAAX;AACA,gBAAIA,QAAQ,EAAZ;AACA+B,iBAAKC,OAAL,CAAa,UAAC7B,GAAD,EAAO;AAChB,oBAAI2B,WAAW,KAAX,IAAoB3B,IAAI8B,OAAJ,CAAYH,MAAZ,IAAsB,CAAC,CAA/C,EAAiD;AAC7C9B,0BAAMkC,IAAN,CAAW;AACPT,8BAAMtB,GADC;AAEPC,8BAAM,mBAAS,OAAKJ,KAAL,CAAWG,GAAX,CAAT;AAFC,qBAAX;AAIH;AACJ,aAPD;AAQA,mBAAOH,KAAP;AACH;;;gCAEM8B,M,EAAQ;AAAA;;AACX,gBAAI9B,QAAQ,KAAKmC,MAAL,CAAYL,MAAZ,CAAZ;;AAEAd,oBAAQC,GAAR,CACIjB,MAAMoC,GAAN,CAAU;AAAA,uBAAQC,EAAEZ,IAAV;AAAA,aAAV,EAA+Ba,IAA/B,CAAoC,EAApC,CADJ;;AAIA,gBAAItC,MAAMuC,MAAN,KAAiB,CAArB,EAAwB;AACpB,wCAAW,2BAAX;AACA;AACH;;AAED,+BAASC,MAAT,CAAgB,CAAC;AACbC,sBAAM,SADO;AAEbhB,sBAAM,KAFO;AAGbiB,sEAHa;AAIbC,yBAAS;AAJI,aAAD,CAAhB,EAKI7B,IALJ,CAKS,UAAC8B,OAAD,EAAa;AAClB,oBAAIA,QAAQC,GAAZ,EAAgB;AACZ7C,0BAAMgC,OAAN,CAAc,aAAK;AACf,+BAAO,OAAKhC,KAAL,CAAWqC,EAAEZ,IAAb,CAAP;AACA,+BAAK3B,GAAL,CAASW,GAAT,CAAa,OAAb,EAAsB,OAAKT,KAA3B;AACH,qBAHD;AAIA,4CAAW,gBAAX;AACH;AACJ,aAbD,EAcCmB,KAdD;AAeH;;;qCAEYhB,G,EAAK;AACd,mBAAO,eAAK2C,SAAL,CAAe3C,MAAM,KAAKH,KAAL,CAAWG,GAAX,CAAN,GAAuB,KAAKH,KAA3C,CAAP;AACH;;;mCAEOG,G,EAAKU,K,EAAOkC,G,EAAK;AAAA;;AAC3B,gBAAIC,gBAAJ;AACA,gBAAG7C,GAAH,EAAO;AACN6C,0BAAU,KAAKhD,KAAL,CAAWG,GAAX,EAAgB6C,OAA1B;AACA,aAFD,MAEK;AACJA,0BAAU,KAAKC,WAAL,CAAiB,KAAKjD,KAAtB,CAAV;AACA;AACD,gBAAIkD,OAAQ,oDAAZ;AACAA,oBAAS,qDAAT;AACA,gBAAIC,QAAQ,CAAZ;;AAEAH,sBAAUnC,SAASkC,GAAT,GAAe,KAAKK,WAAL,CAAiBJ,OAAjB,EAA0BnC,KAA1B,EAAiCkC,GAAjC,CAAf,GAAuDC,OAAjE;AACAA,oBAAQhB,OAAR,CAAiB,aAAK;AACrB,oBAAInB,QAAQ,IAAIwC,IAAJ,CAAShB,EAAExB,KAAX,CAAZ;AACA,oBAAIS,OAAO,IAAI+B,IAAJ,CAAShB,EAAEf,IAAX,CAAX;AACA6B,yBAAS7B,OAAOT,KAAhB;AACAqC,wBAAQ,MAAM,OAAKI,UAAL,CAAgBzC,KAAhB,CAAN,GAA8B,GAA9B,GAAoC,OAAKyC,UAAL,CAAgBhC,IAAhB,CAApC,GAA2D,GAA3D,GAAgE,OAAKiC,UAAL,CAAgBjC,OAAOT,KAAvB,CAAhE,GAA+F,GAA/F,GAAoG,OAAK0C,UAAL,CAAgBJ,KAAhB,CAApG,GAA4H,GAA5H,GAAkId,EAAEZ,IAApI,GAA0I,KAAlJ;AACA,aALD;AAMAyB,oBAAS,WAAT;AACAA,oBAAS,iBAAiB,KAAKK,UAAL,CAAgBJ,KAAhB,CAAjB,GAAyC,UAAlD;;AAEM,mBAAOD,IAAP;AACH;;;oCAEQF,O,EAASnC,K,EAAOkC,G,EAAI;AAC/B,gBAAIS,cAAc,SAAdA,WAAc,CAASR,OAAT,EAAiB;AAClC,oBAAIS,WAAW,EAAf;AACA,qBAAI,IAAIC,IAAI,CAAZ,EAAeA,IAAIV,QAAQT,MAA3B,EAAmCmB,GAAnC,EAAuC;AACtC,wBAAG,IAAIL,IAAJ,CAASxC,KAAT,IAAkB,IAAIwC,IAAJ,CAASL,QAAQU,CAAR,EAAW7C,KAApB,CAArB,EAAgD;AAC/C4C,iCAASvB,IAAT,CAAcc,QAAQU,CAAR,CAAd;AACA;AACD;AACD,uBAAOD,QAAP;AACA,aARD;AASA,gBAAIE,YAAY,SAAZA,SAAY,CAASX,OAAT,EAAiB;AAChC,oBAAIS,WAAW,EAAf;AACA,qBAAI,IAAIC,IAAI,CAAZ,EAAeA,IAAIV,QAAQT,MAA3B,EAAmCmB,GAAnC,EAAuC;AACtC,wBAAG,IAAIL,IAAJ,CAASN,GAAT,IAAgB,IAAIM,IAAJ,CAASL,QAAQU,CAAR,EAAW7C,KAApB,CAAnB,EAA8C;AAC7C4C,iCAASvB,IAAT,CAAcc,QAAQU,CAAR,CAAd;AACA;AACD;AACD,uBAAOD,QAAP;AACA,aARD;;AAUA,mBAAO5C,SAASkC,GAAT,GAAeS,YAAYG,UAAUX,OAAV,CAAZ,CAAf,GAAkDnC,QAAQ2C,YAAYR,OAAZ,CAAR,GAA+BW,UAAUX,OAAV,CAAxF;AACA;;;oCACWhD,K,EAAM;AACjB,gBAAI+B,OAAOxB,OAAOwB,IAAP,CAAY/B,KAAZ,CAAX;AACA,gBAAI4D,cAAc,EAAlB;AACA,iBAAI,IAAIC,KAAK,CAAb,EAAgBA,KAAK9B,KAAKQ,MAA1B,EAAkCsB,IAAlC,EAAuC;AACtC,qBAAI,IAAIC,KAAK,CAAb,EAAgBA,KAAK9D,MAAM+B,KAAK8B,EAAL,CAAN,EAAgBb,OAAhB,CAAwBT,MAA7C,EAAqDuB,IAArD,EAA0D;AACzD,wBAAIC,SAAS/D,MAAM+B,KAAK8B,EAAL,CAAN,EAAgBb,OAAhB,CAAwBc,EAAxB,CAAb;AACAC,2BAAOtC,IAAP,GAAcM,KAAK8B,EAAL,CAAd;AACAE,2BAAOrD,WAAP,GAAqBV,MAAM+B,KAAK8B,EAAL,CAAN,EAAgBnD,WAArC;AACAkD,gCAAY1B,IAAZ,CAAiB6B,MAAjB;AACA;AACD;AACD,mBAAOH,WAAP;AACA;;;mCAEUI,C,EAAE;AACZ,gBAAIC,OAAOD,EAAEE,WAAF,KAAkB,GAA7B;AACA,gBAAIC,YAAY,SAAZA,SAAY;AAAA,uBAAKC,IAAI,EAAJ,GAAS,MAAMA,CAAf,GAAmBA,CAAxB;AAAA,aAAhB;AACAH,oBAAQE,UAAUH,EAAEK,QAAF,KAAa,CAAvB,IAA4B,GAApC;AACAJ,oBAAQE,UAAUH,EAAEM,OAAF,EAAV,IAAyB,GAAjC;AACAL,oBAAQE,UAAUH,EAAEO,QAAF,EAAV,IAA0B,OAAlC;AACAN,oBAAQE,UAAUH,EAAEQ,UAAF,EAAV,IAA4B,OAApC;AACAP,oBAAQE,UAAUH,EAAEtC,UAAF,EAAV,CAAR;AACA,mBAAOuC,IAAP;AACA;;;mCAEUD,C,EAAE;AACZ,gBAAIC,OAAO,IAAIZ,IAAJ,CAASW,CAAT,CAAX;AACA,gBAAIG,YAAY,SAAZA,SAAY;AAAA,uBAAKC,IAAI,EAAJ,GAAS,MAAMA,CAAf,GAAmBA,CAAxB;AAAA,aAAhB;;AAEA,mBAAOK,KAAKC,KAAL,CAAWV,IAAI,IAAf,IAAuB,OAAvB,GAAiCG,UAAUF,KAAKO,UAAL,EAAV,CAAjC,GAAgE,OAAhE,GAA0EL,UAAUF,KAAKvC,UAAL,EAAV,CAAjF;AACA;;;oCAEa;AACP,mBAAO,KAAKxB,MAAZ;AACH;;;kCAESyE,O,EAASC,K,EAAM;;AAErB,gBAAI,0BAAe3C,OAAf,CAAuB0C,OAAvB,IAAkC,CAAtC,EAAwC;AACpC,uBAAO,uCAAwBA,OAAxB,qCAA+D,KAAKE,cAAL,CAAoBC,QAApB,EAA/D,OAAP;AACH;;AAED,gBAAIC,6BACCJ,OADD,EACWC,KADX,CAAJ;;AAIA,iBAAK1E,MAAL,GAAcK,OAAOC,MAAP,CAAc,EAAd,EAAkB,KAAKN,MAAvB,EAA+B6E,MAA/B,CAAd;AACA,iBAAKjF,GAAL,CAASW,GAAT,CAAa,QAAb,EAAuB,KAAKP,MAA5B;;AAEA,mBAAO,KAAKA,MAAZ;AACH;;;iCAEQ;AAAA;;AACL,gBAAI,CAAC,KAAKA,MAAN,IAAiB,KAAKA,MAAL,IAAe,KAAKA,MAAL,CAAY,gBAAZ,MAAkC,GAAtE,EAA4E;AACxEc,wBAAQC,GAAR,CAAY,wBAAZ;;AAEA,+CAAY,KAAKjB,KAAjB,EACKc,IADL,CACU,iBAAS;AACX,wBAAIkE,WAAW,EAAf;AACAhF,0BAAMgC,OAAN,CAAc;AAAA,+BAAKgD,SAASrE,EAAER,GAAX,IAAkBQ,EAAEP,IAAzB;AAAA,qBAAd;AACA,2BAAO4E,QAAP;AACH,iBALL,EAMKlE,IANL,CAMU,yBAAiB;AACnB,2BAAKhB,GAAL,CAASW,GAAT,CAAa,OAAb,EAAsBwE,aAAtB;AACA,2BAAKnF,GAAL,CAASW,GAAT,CAAa,QAAb,EAAuBF,OAAOC,MAAP,CAAc,OAAKN,MAAnB,EAA2B;AAC9C,0CAAkB;AAD4B,qBAA3B,CAAvB;;AAIA,4CAAW,sCAAX;AACH,iBAbL,oBAcKiB,KAdL;AAeH,aAlBD,MAkBO;AACH,wCAAW,2BAAX;AACH;AACJ;;;iCAEQhB,G,EAAK+E,I,EAAgB;AAAA,gBAAVC,IAAU,uEAAL,IAAK;;AAC1B,gBAAMnF,QAAQ,KAAKmC,MAAL,CAAYhC,GAAZ,CAAd;AACAH,kBAAMoF,IAAN,CAAW,UAACC,CAAD,EAAGC,CAAH,EAAS;AAAE,uBAAOD,EAAE5D,IAAF,GAAS6D,EAAE7D,IAAlB;AAAwB,aAA9C;AACA,kCAAStB,GAAT,EAAcH,KAAd,EAAqBkF,IAArB,EAA2BC,IAA3B,EAAiC,KAAKjF,MAAL,CAAY,eAAZ,CAAjC;AACH;;;;;;kBAvQgBL,O","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key, start, end) {\n\t\tlet timings\n\t\tif(key){\n\t\t\ttimings = this.tasks[key].timings\n\t\t}else{\n\t\t\ttimings = this.unflatTasks(this.tasks)\n\t\t}\n\t\tlet body = \t\"| Start | End | Hours | Subtotal | Description |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: | ----------- | \\n\"\n\t\tlet total = 0;\n\n\t\ttimings = start || end ? this.filterDates(timings, start, end) : timings\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = new Date(k.stop)\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\" + k.name+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | | |\\n\"\n\n return body\n }\n\n\tfilterDates(timings, start, end){\n\t\tlet filterStart = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(start) < new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\t\tlet filterEnd = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(end) > new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\n\t\treturn start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings))\n\t}\n\tunflatTasks(tasks){\n\t\tlet keys = Object.keys(tasks)\n\t\tlet unflattened = []\n\t\tfor(let i1 = 0; i1 < keys.length; i1++){\n\t\t\tfor(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){\n\t\t\t\tlet timing = tasks[keys[i1]].timings[i2]\n\t\t\t\ttiming.name = keys[i1]\n\t\t\t\ttiming.description = tasks[keys[i1]].description\n\t\t\t\tunflattened.push(timing)\n\t\t\t}\n\t\t}\n\t\treturn unflattened\n\t}\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\n\t\treturn Math.round(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n const tasks = this.search(key)\n tasks.sort((a,b) => { return a.name > b.name })\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","timings","unflatTasks","body","total","filterDates","Date","dateFormat","hourFormat","filterStart","filtered","i","filterEnd","unflattened","i1","i2","timing","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","floor","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full","sort","a","b"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key, start, end) {\n\t\tlet timings\n\t\tif(key){\n\t\t\ttimings = this.tasks[key].timings\n\t\t}else{\n\t\t\ttimings = this.unflatTasks(this.tasks)\n\t\t}\n\t\tlet body = \t\"| Start | End | Hours | Subtotal | Description |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: | ----------- |\\n\"\n\t\tlet total = 0;\n\n\t\ttimings = start || end ? this.filterDates(timings, start, end) : timings\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = k.stop ? new Date(k.stop) : new Date()\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\" + k.name+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | | |\\n\"\n\n return body\n }\n\n\tfilterDates(timings, start, end){\n\t\tlet filterStart = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(start) < new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\t\tlet filterEnd = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(end) > new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\n\t\treturn start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings))\n\t}\n\tunflatTasks(tasks){\n\t\tlet keys = Object.keys(tasks)\n\t\tlet unflattened = []\n\t\tfor(let i1 = 0; i1 < keys.length; i1++){\n\t\t\tfor(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){\n\t\t\t\tlet timing = tasks[keys[i1]].timings[i2]\n\t\t\t\ttiming.name = keys[i1]\n\t\t\t\ttiming.description = tasks[keys[i1]].description\n\t\t\t\tunflattened.push(timing)\n\t\t\t}\n\t\t}\n\t\treturn unflattened\n\t}\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\treturn Math.floor(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n tasks.sort((a,b) => { return a.name > b.name })\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file diff --git a/src/core/Manager.js b/src/core/Manager.js index bd1e79e..e628fd1 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -153,13 +153,13 @@ export default class Manager { timings = this.unflatTasks(this.tasks) } let body = "| Start | End | Hours | Subtotal | Description |\n" - body += "| ----- | --- | -----:| -------: | ----------- | \n" + body += "| ----- | --- | -----:| -------: | ----------- |\n" let total = 0; timings = start || end ? this.filterDates(timings, start, end) : timings timings.forEach( k => { let start = new Date(k.start) - let stop = new Date(k.stop) + let stop = k.stop ? new Date(k.stop) : new Date() total += stop - start body += "|" + this.dateFormat(start)+ "|" + this.dateFormat(stop)+ "|"+ this.hourFormat(stop - start)+ "|"+ this.hourFormat(total)+ "|" + k.name+ "|\n" }) @@ -219,8 +219,7 @@ export default class Manager { hourFormat(d){ let date = new Date(d) let twoDigits = n => n < 10 ? "0" + n : n - - return Math.round(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()) + return Math.floor(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()) } getConfig(){ From e21c41a0cde34a7d2ef8dd7b6e70fe2c95c828f2 Mon Sep 17 00:00:00 2001 From: Marcello Date: Sat, 24 Feb 2018 18:32:16 -0600 Subject: [PATCH 41/51] smallfix --- lib/core/output.js.map | 2 +- src/core/output.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/output.js.map b/lib/core/output.js.map index de42523..03ce1d5 100644 --- a/lib/core/output.js.map +++ b/lib/core/output.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","description","name","duration","getSeconds","splitWidth","str","len","arr","length","push","substring","join","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Name','Description', 'Dates', 'Duration'],\n colAligns: ['left', 'center', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n\t\tlet description = (task.task.description() && task.task.description() !== '')\n\t\t? task.task.description()\n\t\t: '-'\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n // Avoid excesive width for proper console fit\n let splitWidth = function(str, len){\n let arr = []\n while (str != '') {\n if (str.length > len) {\n arr.push(str.substring(0,len))\n str = str.substring(len);\n } else {\n arr.push(str)\n break\n }\n }\n return arr.join('\\n')\n }\n description = splitWidth(description, 51)\n name = splitWidth(name, 40)\n\n table.push([name, description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: '', vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","description","name","duration","getSeconds","splitWidth","str","len","arr","length","push","substring","join","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Name','Description', 'Dates', 'Duration'],\n colAligns: ['left', 'center', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n\t\tlet description = (task.task.description() && task.task.description() !== '')\n\t\t? task.task.description()\n\t\t: '-'\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n // Avoid excesive width for proper console fit\n let splitWidth = (str, len) => {\n let arr = []\n while (str != '') {\n if (str.length > len) {\n arr.push(str.substring(0,len))\n str = str.substring(len);\n } else {\n arr.push(str)\n break\n }\n }\n return arr.join('\\n')\n }\n description = splitWidth(description, 51)\n name = splitWidth(name, 40)\n\n table.push([name, description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: '', vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file diff --git a/src/core/output.js b/src/core/output.js index 0e6b801..f7d8477 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -38,7 +38,7 @@ export const sumarize = function(search, tasks, rate, full, format) { total += duration // Avoid excesive width for proper console fit - let splitWidth = function(str, len){ + let splitWidth = (str, len) => { let arr = [] while (str != '') { if (str.length > len) { From 3fe4f95d642d9117d0221049795bd713f893b8a4 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:05:29 +0800 Subject: [PATCH 42/51] formated with prettier, added prettier --- .gitignore | 4 +- .jscsrc | 77 -------------------------------- .prettierrc | 13 ++++++ package.json | 96 ++++++++++++++++++++-------------------- src/autocomplete.js | 41 +++++++++++++---- src/core/dbMigrations.js | 44 +++++++++--------- src/exports.js | 4 +- yarn.lock | 14 ++++-- 8 files changed, 131 insertions(+), 162 deletions(-) delete mode 100644 .jscsrc create mode 100644 .prettierrc diff --git a/.gitignore b/.gitignore index b512c09..92424d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -node_modules \ No newline at end of file +node_modules +backup.json +test.md diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index 018e9d5..0000000 --- a/.jscsrc +++ /dev/null @@ -1,77 +0,0 @@ -{ - "esnext": true, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInAnonymousFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunctionDeclaration": { - "beforeOpeningRoundBrace": true - }, - "disallowEmptyBlocks": true, - "disallowSpacesInCallExpression": true, - "disallowSpacesInsideArrayBrackets": true, - "disallowSpacesInsideParentheses": true, - "disallowQuotedKeysInObjects": true, - "disallowSpaceAfterObjectKeys": true, - "disallowSpaceAfterPrefixUnaryOperators": true, - "disallowSpaceBeforePostfixUnaryOperators": true, - "disallowSpaceBeforeBinaryOperators": [ - "," - ], - "disallowMixedSpacesAndTabs": true, - "disallowTrailingWhitespace": true, - "disallowYodaConditions": true, - "disallowKeywords": [ - "with" - ], - "disallowKeywordsOnNewLine": [ - "else" - ], - "disallowMultipleLineBreaks": true, - "disallowMultipleLineStrings": true, - "disallowMultipleVarDecl": true, - "disallowSpaceBeforeComma": true, - "disallowSpaceBeforeSemicolon": true, - "requireSpaceBeforeBlockStatements": true, - "requireParenthesesAroundIIFE": true, - "requireSpacesInConditionalExpression": true, - "requireBlocksOnNewline": 1, - "requireCommaBeforeLineBreak": true, - "requireSpaceBeforeBinaryOperators": true, - "requireSpaceAfterBinaryOperators": true, - "requireCamelCaseOrUpperCaseIdentifiers": true, - "requireLineFeedAtFileEnd": true, - "requireCapitalizedConstructors": true, - "requireDotNotation": true, - "requireSpacesInForStatement": true, - "requireSpaceBetweenArguments": true, - "requireCurlyBraces": [ - "do" - ], - "requireSpaceAfterKeywords": [ - "if", - "else", - "for", - "while", - "do", - "switch", - "case", - "return", - "try", - "catch", - "typeof" - ], - "requirePaddingNewLinesBeforeLineComments": { - "allExcept": "firstAfterCurly" - }, - "requirePaddingNewLinesAfterBlocks": true, - "disallowSemicolons": true, - "safeContextKeyword": "_this", - "validateQuoteMarks": "'", - "validateIndentation": 4 -} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..4bada0e --- /dev/null +++ b/.prettierrc @@ -0,0 +1,13 @@ +{ + "tabWidth": 4, + "singleQuote": true, + "semi": false, + "overrides": [ + { + "files": "*.json", + "options": { + "printWidth": 99999999999999999 + } + } + ] +} diff --git a/package.json b/package.json index b83a85a..8e502cf 100644 --- a/package.json +++ b/package.json @@ -1,50 +1,50 @@ { - "name": "time-tracker-cli", - "version": "2.3.1", - "description": "Tiny time tracker", - "keywords": [ - "time", - "tracker", - "timer", - "cli", - "time log", - "time logger", - "logger" - ], - "bin": { - "timer": "./bin/timer" - }, - "main": "./lib/exports", - "scripts": { - "build": "node_modules/.bin/babel -s -d lib src", - "dev": "npm run build -- -w", - "test": "mocha -R spec --require source-map-support/register lib/__test__/*.spec.js ", - "test:dev": "npm run test -- -w", - "postinstall": "timer --updateDB" - }, - "repository": { - "type": "git", - "url": "https://github.com/danibram/time-tracker-cli" - }, - "author": "Daniel Biedma ", - "license": "ISC", - "devDependencies": { - "babel": "^6.3.26", - "babel-cli": "^6.26.0", - "babel-plugin-transform-decorators-legacy": "^1.3.4", - "babel-preset-es2015": "^6.22.0", - "babel-preset-stage-0": "^6.22.0" - }, - "dependencies": { - "babel-polyfill": "^6.26.0", - "cli-table2": "^0.2.0", - "colors": "^1.1.2", - "commander": "^2.11.0", - "configstore": "^3.1.1", - "flat": "^4.0.0", - "inquirer": "^3.3.0", - "moment": "^2.19.1", - "omelette": "^0.4.5", - "update-notifier": "^2.3.0" - } + "name": "time-tracker-cli", + "version": "2.5.0", + "description": "Tiny time tracker", + "keywords": [ + "time", + "tracker", + "timer", + "cli", + "time log", + "time logger", + "logger" + ], + "bin": { + "timer": "./bin/timer" + }, + "main": "./lib/exports", + "scripts": { + "build": "node_modules/.bin/babel -s -d lib src", + "dev": "npm run build -- -w", + "test": "mocha -R spec --require source-map-support/register lib/__test__/*.spec.js ", + "test:dev": "npm run test -- -w" + }, + "repository": { + "type": "git", + "url": "https://github.com/danibram/time-tracker" + }, + "author": "Daniel Biedma ", + "license": "ISC", + "devDependencies": { + "babel": "^6.3.26", + "babel-cli": "^6.26.0", + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-preset-es2015": "^6.22.0", + "babel-preset-stage-0": "^6.22.0", + "prettier": "^1.10.2" + }, + "dependencies": { + "babel-polyfill": "^6.26.0", + "cli-table2": "^0.2.0", + "colors": "^1.1.2", + "commander": "^2.14.1", + "configstore": "^3.1.1", + "flat": "^4.0.0", + "inquirer": "^3.3.0", + "moment": "^2.20.1", + "omelette": "^0.4.5", + "update-notifier": "^2.3.0" + } } diff --git a/src/autocomplete.js b/src/autocomplete.js index c0ef19a..835c272 100644 --- a/src/autocomplete.js +++ b/src/autocomplete.js @@ -1,21 +1,44 @@ import omelette from 'omelette' import { configElements } from './core/constants' -const autocomplete = function(config){ +const autocomplete = function(config) { let taskKeys = Object.keys(config.all.tasks) const complete = omelette('timer ') - complete.on("action",({ reply }) => { - reply(["start", "pause", "unpause", "finish", "description", "add", "subtract", "report", "log", "export", "delete", "configuration", "configure"]); - }); - - complete.on("tasks", ({ reply, before }) =>{ - let keyTasks = ['start', 'pause', 'unpause', 'finish', 'log', 'description', 'add', 'remove'] + complete.on('action', ({ reply }) => { + reply([ + 'start', + 'pause', + 'unpause', + 'finish', + 'description', + 'add', + 'subtract', + 'report', + 'log', + 'export', + 'delete', + 'configuration', + 'configure' + ]) + }) - if (keyTasks.indexOf(before) > -1){ + complete.on('tasks', ({ reply, before }) => { + let keyTasks = [ + 'start', + 'pause', + 'unpause', + 'finish', + 'log', + 'description', + 'add', + 'remove' + ] + + if (keyTasks.indexOf(before) > -1) { reply(taskKeys) - } else if (before === 'configure' ){ + } else if (before === 'configure') { reply(configElements) } }) diff --git a/src/core/dbMigrations.js b/src/core/dbMigrations.js index 020b5fe..3f245b7 100644 --- a/src/core/dbMigrations.js +++ b/src/core/dbMigrations.js @@ -1,32 +1,32 @@ -export const migrateToV2 = function (tasks){ +export const migrateToV2 = function(tasks) { let promises = [] - let migrate = (key, task) => new Promise((resolve, reject) => { + let migrate = (key, task) => + new Promise((resolve, reject) => { + let timing = {} + let update = false - let timing = {} - let update = false + if (task.start) { + update = true + timing.start = task.start + delete task.start + } - if (task.start) { - update = true - timing.start = task.start - delete task.start - } + if (task.stop) { + timing.stop = task.stop + delete task.stop + } - if (task.stop) { - timing.stop = task.stop - delete task.stop - } + if (update) { + task.timings = [timing] + } - if (update) { - task.timings = [timing] - } - - resolve({ - key, - task + resolve({ + key, + task + }) }) - }) - Object.keys(tasks).forEach(k => promises.push( migrate(k, tasks[k]) )) + Object.keys(tasks).forEach(k => promises.push(migrate(k, tasks[k]))) return Promise.all(promises) } diff --git a/src/exports.js b/src/exports.js index 5ac49c9..9964cd0 100644 --- a/src/exports.js +++ b/src/exports.js @@ -4,8 +4,8 @@ import Configstore from 'configstore' import pkg from '../package.json' const config = new Configstore(pkg.name, { - tasks:{}, - config:{ + tasks: {}, + config: { 'format.output': 'DD/MM' } }) diff --git a/yarn.lock b/yarn.lock index dfd4d16..5b5867b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -898,6 +898,10 @@ commander@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1596,9 +1600,9 @@ minimist@^1.2.0: dependencies: minimist "0.0.8" -moment@^2.19.1: - version "2.19.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" +moment@^2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" ms@2.0.0: version "2.0.0" @@ -1762,6 +1766,10 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" +prettier@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.10.2.tgz#1af8356d1842276a99a5b5529c82dd9e9ad3cc93" + private@^0.1.6, private@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" From 1766ffa13617dc8ac8609ce12c359e995329dd7e Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:05:53 +0800 Subject: [PATCH 43/51] move markdoen to outputs, and added expanded option --- src/core/output.js | 180 ++++++++++++++++++++++++++++++++------------- 1 file changed, 127 insertions(+), 53 deletions(-) diff --git a/src/core/output.js b/src/core/output.js index f7d8477..4971edd 100644 --- a/src/core/output.js +++ b/src/core/output.js @@ -2,35 +2,36 @@ import moment from 'moment' import Table from 'cli-table2' import colors from 'colors' -import { humanParseDiff, calcRate } from './utils' +import { humanParseDiff, calcRate, getSeconds } from './utils' export const sumarize = function(search, tasks, rate, full, format) { let table = new Table({ - head: ['Name','Description', 'Dates', 'Duration'], + head: ['Name', 'Description', 'Dates', 'Duration'], colAligns: ['left', 'center', 'center', 'left'], chars: { - 'top': '═' - , 'top-mid': '╤' - , 'top-left': '╔' - , 'top-right': '╗' - , 'bottom': '═' - , 'bottom-mid': '╧' - , 'bottom-left': '╚' - , 'bottom-right': '╝' - , 'left': '║' - , 'left-mid': '╟' - , 'right': '║' - , 'right-mid': '╢' - }, + top: '═', + 'top-mid': '╤', + 'top-left': '╔', + 'top-right': '╗', + bottom: '═', + 'bottom-mid': '╧', + 'bottom-left': '╚', + 'bottom-right': '╝', + left: '║', + 'left-mid': '╟', + right: '║', + 'right-mid': '╢' + }, style: { head: ['green'] } - }); + }) let total = 0 - let head= `Search: ${search} \n` + let head = `Search: ${search} \n` tasks.forEach((task, index) => { - let description = (task.task.description() && task.task.description() !== '') - ? task.task.description() - : '-' + let description = + task.task.description() && task.task.description() !== '' + ? task.task.description() + : '-' let name = task.name task = task.task @@ -42,8 +43,8 @@ export const sumarize = function(search, tasks, rate, full, format) { let arr = [] while (str != '') { if (str.length > len) { - arr.push(str.substring(0,len)) - str = str.substring(len); + arr.push(str.substring(0, len)) + str = str.substring(len) } else { arr.push(str) break @@ -54,67 +55,90 @@ export const sumarize = function(search, tasks, rate, full, format) { description = splitWidth(description, 51) name = splitWidth(name, 40) - table.push([name, description, moment(task.getStartDate()).format(format), humanParseDiff(duration)]) + table.push([ + name, + description, + moment(task.getStartDate()).format(format), + humanParseDiff(duration) + ]) }) - if (full){ + if (full) { table.push([]) - if (rate){ + if (rate) { table.push( - [{ rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)], - [ colors.red('Rate'), calcRate(rate, total)] + [ + { + rowSpan: 2, + content: `${colors.red('Search:')} "${search}"`, + vAlign: 'center' + }, + colors.red('Total time'), + humanParseDiff(total) + ], + [colors.red('Rate'), calcRate(rate, total)] ) } else { table.push( [ - { rowSpan:2, content: `${colors.red('Search:')} "${search}"`, vAlign:'center' }, - { rowSpan:2, content: '', vAlign:'center' }, - { rowSpan:2, content: colors.red('Total time'), vAlign:'center' }, - { rowSpan:2, content: humanParseDiff(total), vAlign:'center' } + { + rowSpan: 2, + content: `${colors.red('Search:')} "${search}"`, + vAlign: 'center' + }, + { rowSpan: 2, content: '', vAlign: 'center' }, + { + rowSpan: 2, + content: colors.red('Total time'), + vAlign: 'center' + }, + { + rowSpan: 2, + content: humanParseDiff(total), + vAlign: 'center' + } ], [] ) } } - console.log(table.toString()); + console.log(table.toString()) } -export const outputConfig = function (config){ +export const outputConfig = function(config) { let table = new Table({ head: ['Key', 'value'], chars: { - 'top': '═' - , 'top-mid': '╤' - , 'top-left': '╔' - , 'top-right': '╗' - , 'bottom': '═' - , 'bottom-mid': '╧' - , 'bottom-left': '╚' - , 'bottom-right': '╝' - , 'left': '║' - , 'left-mid': '╟' - , 'right': '║' - , 'right-mid': '╢' + top: '═', + 'top-mid': '╤', + 'top-left': '╔', + 'top-right': '╗', + bottom: '═', + 'bottom-mid': '╧', + 'bottom-left': '╚', + 'bottom-right': '╝', + left: '║', + 'left-mid': '╟', + right: '║', + 'right-mid': '╢' }, colAligns: ['center', 'center'], style: { head: ['green'] } - }); + }) Object.keys(config).map(e => table.push([e, config[e]])) - console.log(table.toString()); + console.log(table.toString()) } -export const outputVertical = function (...args){ +export const outputVertical = function(...args) { let table2 = new Table() - let key = args.splice(0, 1) - table2.push( - { [key]: args }, - ) + let key = args.splice(0, 1) + table2.push({ [key]: args }) - return table2.toString() + return table2.toString() } export const cliError = function(err) { @@ -124,3 +148,53 @@ export const cliError = function(err) { export const cliSuccess = function(err) { console.log(colors.green(err)) } + +export const markdown = function(tasks, expanded = false) { + let body = '| Start | End | Hours | Subtotal | Description |\n' + body += '| ----- | --- | -----:| -------: | ----------- |\n' + let total = 0 + + //tasks = start || end ? this.filterDates(tasks, start, end) : tasks; + tasks.forEach(task => { + let name = task.name + task = task.task + + if (!task.filtered) { + let duration = task.getSeconds() + total += duration + + if (expanded && task.task.timings.length > 1) { + let subtotal = 0 + let times = 0 + + task.task.timings.forEach(timing => { + let secs = getSeconds(timing) + subtotal += secs + times += 1 + body += + `|${moment(timing.start).format('YYYY/MM/DD kk:mm')}` + + `|${moment(timing.stop).format('YYYY/MM/DD kk:mm')}` + + `|${humanParseDiff(secs)}` + + `|${humanParseDiff(subtotal)}` + + `|${name} (part ${times})` + + `|\n` + }) + } else { + let start = task.getStartDate() + let stop = task.getEndDate() + + body += + `|${moment(start).format('YYYY/MM/DD kk:mm')}` + + `|${moment(stop).format('YYYY/MM/DD kk:mm')}` + + `|${humanParseDiff(duration)}` + + `|${humanParseDiff(total)}` + + `|${name}` + + `|\n` + } + } + }) + body += '| | | |\n' + body += `| Total | | ${humanParseDiff(total)} | | |\n` + + return body +} From 36b3ad45cfd608afdfc85d4467ac79ad7426c5a4 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:06:11 +0800 Subject: [PATCH 44/51] added new expanded options on export --- src/index.js | 69 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/src/index.js b/src/index.js index b1ddd58..5823c41 100644 --- a/src/index.js +++ b/src/index.js @@ -12,8 +12,8 @@ import { outputVertical, cliError, outputConfig } from './core/output' import autocomplete from './autocomplete' const config = new Configstore(pkg.name, { - tasks:{}, - config:{ + tasks: {}, + config: { 'format.output': 'DD/MM' } }) @@ -36,7 +36,9 @@ program .description('Start task with a description.') .alias('s') .action(function(key, description) { - description = (description) ? Array.isArray(description) ? description.join(' ') : description : null + description = description + ? Array.isArray(description) ? description.join(' ') : description + : null manager.startTask(key, description) EXEC = true }) @@ -59,13 +61,14 @@ program EXEC = true }) - program .command('finish [description]') .description('Stop task, you can add a description') .alias('f') .action(function(key, description) { - description = (description) ? Array.isArray(description) ? description.join(' ') : description : null + description = description + ? Array.isArray(description) ? description.join(' ') : description + : null manager.stopTask(key, description) EXEC = true }) @@ -101,10 +104,12 @@ program program .command('report [task_string] [rate]') - .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).') + .description( + 'Report time of the tasks, empty for select all tasks. Can pass a rate (1h).' + ) .alias('r') .action(function(tasks, rate) { - tasks = (tasks) ? tasks : 'all' + tasks = tasks ? tasks : 'all' manager.sumarize(tasks, rate) EXEC = true }) @@ -115,9 +120,13 @@ program .alias('l') .action(function(key) { setInterval(() => { - let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key))) + let text = outputVertical( + 'Task:', + key, + humanParseDiff(manager.getTime(key)) + ) process.stdout.write(text) - process.stdout.moveCursor(0,-2) + process.stdout.moveCursor(0, -2) }, 1000) EXEC = true }) @@ -129,17 +138,33 @@ program .option('-f --format [format]') .option('-s --start [start date. Example: "2017/05/28"]') .option('-e --end [end date. Example: "2018/05/28"]') + .option('-x --expanded [You want to see all timings for a task.]') .action(function(key, options) { - switch (options.format ? options.format.toLowerCase() : undefined){ - case "json": case undefined: - console.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4)) - break - case "markdown": case "md": - console.log(manager.getTasksMd(key, options.start, options.end)) - break - default: - console.log("Format not supported") - } + switch (options.format ? options.format.toLowerCase() : undefined) { + case 'json': + case undefined: + console.log( + JSON.stringify( + manager.getTasksJson(key, options.start, options.end), + null, + 4 + ) + ) + break + case 'markdown': + case 'md': + console.log( + manager.getTasksMd( + key, + options.start, + options.end, + options.expanded + ) + ) + break + default: + console.log('Format not supported') + } EXEC = true }) @@ -148,7 +173,7 @@ program .description('Remove tasks from the list. Empty for select all tasks') .alias('del') .action(function(string) { - string = (string) ? string : 'all' + string = string ? string : 'all' manager.delete(string) EXEC = true }) @@ -169,9 +194,7 @@ program EXEC = true }) -program - .parse(process.argv) - +program.parse(process.argv) if (program.updateDB) { manager.update() From 39dcef942770991443d7d8ece8e2970b7e53f82a Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:07:08 +0800 Subject: [PATCH 45/51] Some tweaks and rework on filtering --- src/core/Task.js | 150 +++++++++++++++++++++++++++++++---------------- 1 file changed, 101 insertions(+), 49 deletions(-) diff --git a/src/core/Task.js b/src/core/Task.js index b7b08b2..473e676 100644 --- a/src/core/Task.js +++ b/src/core/Task.js @@ -1,45 +1,40 @@ import moment from 'moment' import { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants' -import { recognizeModifierTiming } from './utils' +import { recognizeModifierTiming, inPeriod, getSeconds } from './utils' import { cliError } from './output' - +import { EINPROGRESS } from 'constants' export default class Task { - constructor(task){ - this.task = (task) ? task : { - description: '', - timings: [] - } + constructor(task) { + this.task = task + ? task + : { + description: '', + timings: [] + } + this.filtered = false } - _calcTime(t){ - if (t.stop) { - return moment(t.stop).diff(moment(t.start), 'seconds') - } else { - return moment().diff(moment(t.start), 'seconds') - } - } - - _modifyTiming(time, operation){ + _modifyTiming(time, operation) { let timing = this.task.timings[this.task.timings.length - 1] - if (!timing){ - throw (`This task is not started, start it.`) + if (!timing) { + throw `This task is not started, start it.` } let newStop = moment(timing.stop) newStop = newStop[operation](time.value, time.momentKey) - if (operation === 'subtract' && newStop.isBefore(timing.start)){ - throw('You cant subtract more time') + if (operation === 'subtract' && newStop.isBefore(timing.start)) { + throw 'You cant subtract more time' return } this.task.timings[this.task.timings.length - 1].stop = newStop } - start(description){ - return new Promise((resolve, reject)=>{ + start(description) { + return new Promise((resolve, reject) => { let started = false let timing = this.task.timings[this.task.timings.length - 1] @@ -59,11 +54,11 @@ export default class Task { }) } - pause(){ - return new Promise((resolve, reject)=>{ + pause() { + return new Promise((resolve, reject) => { let timing = this.task.timings[this.task.timings.length - 1] - if (!timing){ + if (!timing) { reject(this.error(`This task is not started, start it.`)) } @@ -71,17 +66,19 @@ export default class Task { reject(this.error(`This task are ended/paused, unpaused it.`)) } - this.task.timings[this.task.timings.length - 1].stop = moment().toDate() + this.task.timings[ + this.task.timings.length - 1 + ].stop = moment().toDate() this.setStatus(PAUSED) this.log('pause') resolve() }) } - unpause(){ - return new Promise((resolve, reject)=>{ + unpause() { + return new Promise((resolve, reject) => { let timing = this.task.timings[this.task.timings.length - 1] - if (!timing){ + if (!timing) { reject(this.error(`This task is not started, start it`)) } @@ -98,10 +95,10 @@ export default class Task { }) } - stop (description){ - return new Promise((resolve, reject)=>{ + stop(description) { + return new Promise((resolve, reject) => { let timing = this.task.timings[this.task.timings.length - 1] - if (!timing || timing && !timing.start){ + if (!timing || (timing && !timing.start)) { reject(this.error(`This task is not started, start it`)) } @@ -109,7 +106,9 @@ export default class Task { reject(this.error(`This task already ended, start/unpause it.`)) } - this.task.timings[this.task.timings.length - 1].stop = moment().toDate() + this.task.timings[ + this.task.timings.length - 1 + ].stop = moment().toDate() this.setDescription(description) this.setStatus(FINISHED) this.log('stop') @@ -117,23 +116,25 @@ export default class Task { }) } - log(operation){ - if (!this.task.log){ + log(operation) { + if (!this.task.log) { this.task.log = [] } this.task.log.push(`${operation}#${moment().toISOString()}`) } - description(){ + description() { return this.task.description } - setDescription(text){ - this.task.description = (text) ? text : (this.task.description) ? this.task.description : '' + setDescription(text) { + this.task.description = text + ? text + : this.task.description ? this.task.description : '' } - setStatus(status){ + setStatus(status) { this.task.status = status } @@ -142,10 +143,10 @@ export default class Task { let parsed = recognizeModifierTiming(stringTime) try { - parsed.map((t)=>{ + parsed.map(t => { this._modifyTiming(t, operation) }) - } catch(err){ + } catch (err) { console.error(err) reject(this.error(`Error trying to ${operation} time to task`)) } @@ -155,33 +156,84 @@ export default class Task { }) } - get(){ + get() { return this.task } - getSeconds(){ + filterByDates(start, end) { + if (this.task.timings) { + if (start && end) { + this.task.timings = this._filterTimingsByDate(start, end) + } else if (start) { + end = moment().format('YYYY/MM/DD') + this.task.timings = this._filterTimingsByDate(start, end) + } else if (end) { + start = moment(0).format('YYYY/MM/DD') + this.task.timings = this._filterTimingsByDate(start, end) + } + + if (this.task.timings.length === 0) { + this.filtered = true + } + } else { + let t = inPeriod(this.task.start, this.task.stop, start, end) + if (t.isBetween) { + this.task.start = t.start + this.task.stop = t.stop + } else { + this.filtered = true + } + } + + return this + } + + _filterTimingsByDate(start, end) { + return this.task.timings.reduce((acc, val) => { + let t = inPeriod(val.start, val.stop, start, end) + if (t.isBetween) { + acc.push({ + start: t.start, + stop: t.stop + }) + } + return acc + }, []) + } + + getSeconds() { let duration = 0 - if (this.task.timings){ + if (this.task.timings) { this.task.timings.forEach(timing => { - duration += this._calcTime(timing) + duration += getSeconds(timing) }) } else { - duration = this._calcTime(this.task) + duration = getSeconds(this.task) } return duration } - getStartDate(){ - if (this.task.timings && this.task.timings[0]){ + getStartDate() { + if (this.task.timings && this.task.timings[0]) { return this.task.timings[0].start } else { return this.task.start } } - error(err){ + getEndDate() { + if (this.task.timings) { + return this.task.timings[this.task.timings.length - 1].stop + } else if (this.task.stop) { + return this.task.stop + } else { + return moment().toDate() + } + } + + error(err) { return err //+ ` \n Task: ${JSON.stringify(this.task)}` } } From d9a6247381684a1b2798564103e61192f29bac96 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:07:30 +0800 Subject: [PATCH 46/51] remove unflattered tasks in favour to use search --- src/core/Manager.js | 244 +++++++++++++++++++++----------------------- 1 file changed, 114 insertions(+), 130 deletions(-) diff --git a/src/core/Manager.js b/src/core/Manager.js index e628fd1..2ef3d1c 100644 --- a/src/core/Manager.js +++ b/src/core/Manager.js @@ -3,27 +3,39 @@ import moment from 'moment' import inquirer from 'inquirer' import Task from './Task' -import { recognizeModifierTiming } from './utils' -import { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants' -import { sumarize, outputVertical, cliError, cliSuccess } from './output' +import { recognizeModifierTiming, humanParseDiff, getSeconds } from './utils' +import { + STARTED, + PAUSED, + UNPAUSED, + IN_PROGRESS, + FINISHED, + configElements +} from './constants' +import { + sumarize, + outputVertical, + cliError, + cliSuccess, + markdown +} from './output' import { migrateToV2 } from './dbMigrations' export default class Manager { - repositories = ['tasks', 'config'] constructor(cfg) { this.cfg = cfg this.tasks = cfg.all.tasks - this.config = (cfg.all.config) ? cfg.all.config : {} + this.config = cfg.all.config ? cfg.all.config : {} } getTask(key) { - let task = (this.tasks[key]) ? this.tasks[key] : null + let task = this.tasks[key] ? this.tasks[key] : null return new Task(task) } - storeTask(key, task){ + storeTask(key, task) { let update = {} update[key] = task.get() this.tasks = Object.assign({}, this.tasks, update) @@ -32,20 +44,27 @@ export default class Manager { startTask(key, description) { let t = this.getTask(key) - t.start(description) + t + .start(description) .then(() => { this.storeTask(key, t) console.log( - outputVertical('Task:', key, STARTED, moment().toISOString()) + outputVertical( + 'Task:', + key, + STARTED, + moment().toISOString() + ) ) }, cliError) .catch(cliError) } - pauseTask(key){ + pauseTask(key) { let t = this.getTask(key) - t.pause() - .then(()=>{ + t + .pause() + .then(() => { this.storeTask(key, t) console.log( outputVertical('Task:', key, PAUSED, moment().toISOString()) @@ -54,13 +73,19 @@ export default class Manager { .catch(cliError) } - unpauseTask(key){ + unpauseTask(key) { let t = this.getTask(key) - t.unpause() - .then(()=>{ + t + .unpause() + .then(() => { this.storeTask(key, t) console.log( - outputVertical('Task:', key, UNPAUSED, moment().toISOString()) + outputVertical( + 'Task:', + key, + UNPAUSED, + moment().toISOString() + ) ) }, cliError) .catch(cliError) @@ -68,17 +93,23 @@ export default class Manager { stopTask(key, description) { let t = this.getTask(key) - t.stop(description) - .then(()=>{ + t + .stop(description) + .then(() => { this.storeTask(key, t) console.log( - outputVertical('Task:', key, FINISHED, moment().toISOString()) + outputVertical( + 'Task:', + key, + FINISHED, + moment().toISOString() + ) ) }, cliError) .catch(cliError) } - addDescription(key, text){ + addDescription(key, text) { let t = this.getTask(key) t.setDescription(text) this.storeTask(key, t) @@ -89,20 +120,21 @@ export default class Manager { return t.getSeconds() } - modifyTask(operation, name, stringTime){ + modifyTask(operation, name, stringTime) { let t = this.getTask(name) - t.makeOperationOverTime(operation, stringTime) - .then(()=>{ + t + .makeOperationOverTime(operation, stringTime) + .then(() => { this.storeTask(name, t) }, cliError) .catch(cliError) } - search(string) { + search(string = 'all') { let keys = Object.keys(this.tasks) let tasks = [] - keys.forEach((key)=>{ - if (string === 'all' || key.indexOf(string) > -1){ + keys.forEach(key => { + if (string === 'all' || key.indexOf(string) > -1) { tasks.push({ name: key, task: new Task(this.tasks[key]) @@ -115,121 +147,65 @@ export default class Manager { delete(string) { let tasks = this.search(string) - console.log( - tasks.map(k => `${k.name} \n`).join('') - ) + console.log(tasks.map(k => `${k.name} \n`).join('')) if (tasks.length === 0) { cliSuccess('No tasks found to delete.') return } - inquirer.prompt([{ - type: 'confirm', - name: 'cls', - message: `Are you sure you want to delete this tasks?`, - default: false - }]).then((answers) => { - if (answers.cls){ - tasks.forEach(k => { - delete this.tasks[k.name] - this.cfg.set('tasks', this.tasks) - }) - cliSuccess('Tasks deleted.') - } - }) - .catch(cliError) + inquirer + .prompt([ + { + type: 'confirm', + name: 'cls', + message: `Are you sure you want to delete this tasks?`, + default: false + } + ]) + .then(answers => { + if (answers.cls) { + tasks.forEach(k => { + delete this.tasks[k.name] + this.cfg.set('tasks', this.tasks) + }) + cliSuccess('Tasks deleted.') + } + }) + .catch(cliError) } getTasksJson(key) { - return flat.unflatten(key ? this.tasks[key]: this.tasks) + return flat.unflatten(key ? this.tasks[key] : this.tasks) } - getTasksMd(key, start, end) { - let timings - if(key){ - timings = this.tasks[key].timings - }else{ - timings = this.unflatTasks(this.tasks) - } - let body = "| Start | End | Hours | Subtotal | Description |\n" - body += "| ----- | --- | -----:| -------: | ----------- |\n" - let total = 0; + getTasksMd(key, start, end, expanded) { + let tasks + if (key) { + tasks = this.search(key) + } else { + tasks = this.search() + } - timings = start || end ? this.filterDates(timings, start, end) : timings - timings.forEach( k => { - let start = new Date(k.start) - let stop = k.stop ? new Date(k.stop) : new Date() - total += stop - start - body += "|" + this.dateFormat(start)+ "|" + this.dateFormat(stop)+ "|"+ this.hourFormat(stop - start)+ "|"+ this.hourFormat(total)+ "|" + k.name+ "|\n" - }) - body += "| | | |\n" - body += "| Total | | " + this.hourFormat(total)+ " | | |\n" + tasks.map(task => { + if (start || end) { + task = task.task.filterByDates(start, end) + } + return task + }) - return body + return markdown(tasks, expanded) } - filterDates(timings, start, end){ - let filterStart = function(timings){ - let filtered = [] - for(let i = 0; i < timings.length; i++){ - if(new Date(start) < new Date(timings[i].start)){ - filtered.push(timings[i]) - } - } - return filtered - } - let filterEnd = function(timings){ - let filtered = [] - for(let i = 0; i < timings.length; i++){ - if(new Date(end) > new Date(timings[i].start)){ - filtered.push(timings[i]) - } - } - return filtered - } - - return start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings)) - } - unflatTasks(tasks){ - let keys = Object.keys(tasks) - let unflattened = [] - for(let i1 = 0; i1 < keys.length; i1++){ - for(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){ - let timing = tasks[keys[i1]].timings[i2] - timing.name = keys[i1] - timing.description = tasks[keys[i1]].description - unflattened.push(timing) - } - } - return unflattened - } - - dateFormat(d){ - let date = d.getFullYear() + "/" - let twoDigits = n => n < 10 ? "0" + n : n - date += twoDigits(d.getMonth()+1) + "/" - date += twoDigits(d.getDate()) + " " - date += twoDigits(d.getHours()) + ":" - date += twoDigits(d.getMinutes()) + ":" - date += twoDigits(d.getSeconds()) - return date - } - - hourFormat(d){ - let date = new Date(d) - let twoDigits = n => n < 10 ? "0" + n : n - return Math.floor(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()) - } - - getConfig(){ + getConfig() { return this.config } - configure(element, value){ - - if (configElements.indexOf(element) < 0){ - return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `) + configure(element, value) { + if (configElements.indexOf(element) < 0) { + return cliError( + `Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} ` + ) } let newCfg = { @@ -243,20 +219,26 @@ export default class Manager { } update() { - if (!this.config || (this.config && this.config['config.version'] !== '2') ){ + if ( + !this.config || + (this.config && this.config['config.version'] !== '2') + ) { console.log('DB: Need to be updated') migrateToV2(this.tasks) .then(tasks => { let newTasks = {} - tasks.forEach(t => newTasks[t.key] = t.task) + tasks.forEach(t => (newTasks[t.key] = t.task)) return newTasks }) .then(migratedTasks => { this.cfg.set('tasks', migratedTasks) - this.cfg.set('config', Object.assign(this.config, { - 'config.version': '2' - })) + this.cfg.set( + 'config', + Object.assign(this.config, { + 'config.version': '2' + }) + ) cliSuccess('Configuration migrated to version 2.') }, cliError) @@ -266,9 +248,11 @@ export default class Manager { } } - sumarize(key, rate, full=true){ + sumarize(key, rate, full = true) { let tasks = this.search(key) - tasks.sort((a,b) => { return a.name > b.name }) + tasks.sort((a, b) => { + return a.name > b.name + }) sumarize(key, tasks, rate, full, this.config['format.output']) } } From 78970b165bee69b6e4add259006db532576974fa Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:07:56 +0800 Subject: [PATCH 47/51] rework on filtering using moment, this can be changed in the future --- src/core/utils.js | 70 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/src/core/utils.js b/src/core/utils.js index 413b528..35dbb67 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -1,4 +1,6 @@ -export const recognizeModifierTiming = function (string){ +import moment from 'moment' + +export const recognizeModifierTiming = function(string) { let r = /(\d{1,})([hms])/g let arr let res = [] @@ -12,32 +14,72 @@ export const recognizeModifierTiming = function (string){ return res } -export const calcRate = function (rate, total){ +export const calcRate = function(rate, total) { let amount let mod = rate.substr(rate.length - 1) let value = rate.slice(0, rate.length - 1) switch (mod) { case 'h': - amount = (total/60/60)*parseFloat(value) - break; + amount = total / 60 / 60 * parseFloat(value) + break case 'm': - amount = (total/60)*parseFloat(value) - break; + amount = total / 60 * parseFloat(value) + break case 's': - amount = total*parseFloat(value) - break; + amount = total * parseFloat(value) + break } return amount.toFixed(2) } export const humanParseDiff = function(secs) { - let hours = Math.floor(secs / 3600) - let minutes = Math.floor((secs - (hours * 3600)) / 60) - let seconds = secs - (hours * 3600) - (minutes * 60) - hours = (hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h') - minutes = ((minutes == 0 && hours == '') ? '00m' : (minutes < 10 ? '0' + minutes : minutes) + 'm') - seconds = (seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's') + let hours = Math.floor(secs / 3600) + let minutes = Math.floor((secs - hours * 3600) / 60) + let seconds = secs - hours * 3600 - minutes * 60 + hours = hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h' + minutes = + minutes == 0 && hours == '' + ? '00m' + : (minutes < 10 ? '0' + minutes : minutes) + 'm' + seconds = + seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's' return `${hours} ${minutes} ${seconds}` } + +export const inPeriod = function(start, stop, fstart, fstop) { + fstart = moment(fstart, 'YYYY/MM/DD') + fstop = moment(fstop, 'YYYY/MM/DD') + + if ( + moment(start).isBetween(fstart, fstop, null, '[]') && + moment(stop).isBetween(fstart, fstop, null, '[]') + ) { + return { isBetween: true, start, stop } + } + + if ( + !moment(start).isBetween(fstart, fstop, null, '[]') && + moment(stop).isBetween(fstart, fstop, null, '[]') + ) { + return { isBetween: true, start: fstart, stop } + } + + if ( + moment(start).isBetween(fstart, fstop, null, '[]') && + !moment(stop).isBetween(fstart, fstop, null, '[]') + ) { + return { isBetween: true, start, stop: fstop } + } + + return { isBetween: false, start, stop } +} + +export const getSeconds = ({ start, stop }) => { + if (stop) { + return moment(stop).diff(moment(start), 'seconds') + } else { + return moment().diff(moment(start), 'seconds') + } +} From 5801e1cee9bd19b631082fc530637d794c6791e9 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:08:04 +0800 Subject: [PATCH 48/51] new release --- lib/core/Manager.js | 101 +++++++--------------------------------- lib/core/Manager.js.map | 2 +- lib/core/Task.js | 74 +++++++++++++++++++++++------ lib/core/Task.js.map | 2 +- lib/core/output.js | 70 +++++++++++++++++++++++----- lib/core/output.js.map | 2 +- lib/core/utils.js | 43 +++++++++++++++++ lib/core/utils.js.map | 2 +- lib/index.js | 12 +++-- lib/index.js.map | 2 +- 10 files changed, 191 insertions(+), 119 deletions(-) diff --git a/lib/core/Manager.js b/lib/core/Manager.js index 2abf5e0..64048e4 100644 --- a/lib/core/Manager.js +++ b/lib/core/Manager.js @@ -131,9 +131,11 @@ var Manager = function () { } }, { key: 'search', - value: function search(string) { + value: function search() { var _this6 = this; + var string = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'all'; + var keys = Object.keys(this.tasks); var tasks = []; keys.forEach(function (key) { @@ -184,92 +186,22 @@ var Manager = function () { } }, { key: 'getTasksMd', - value: function getTasksMd(key, start, end) { - var _this8 = this; - - var timings = void 0; + value: function getTasksMd(key, start, end, expanded) { + var tasks = void 0; if (key) { - timings = this.tasks[key].timings; + tasks = this.search(key); } else { - timings = this.unflatTasks(this.tasks); + tasks = this.search(); } - var body = "| Start | End | Hours | Subtotal | Description |\n"; - body += "| ----- | --- | -----:| -------: | ----------- |\n"; - var total = 0; - - timings = start || end ? this.filterDates(timings, start, end) : timings; - timings.forEach(function (k) { - var start = new Date(k.start); - var stop = k.stop ? new Date(k.stop) : new Date(); - total += stop - start; - body += "|" + _this8.dateFormat(start) + "|" + _this8.dateFormat(stop) + "|" + _this8.hourFormat(stop - start) + "|" + _this8.hourFormat(total) + "|" + k.name + "|\n"; - }); - body += "| | | |\n"; - body += "| Total | | " + this.hourFormat(total) + " | | |\n"; - return body; - } - }, { - key: 'filterDates', - value: function filterDates(timings, start, end) { - var filterStart = function filterStart(timings) { - var filtered = []; - for (var i = 0; i < timings.length; i++) { - if (new Date(start) < new Date(timings[i].start)) { - filtered.push(timings[i]); - } - } - return filtered; - }; - var filterEnd = function filterEnd(timings) { - var filtered = []; - for (var i = 0; i < timings.length; i++) { - if (new Date(end) > new Date(timings[i].start)) { - filtered.push(timings[i]); - } + tasks.map(function (task) { + if (start || end) { + task = task.task.filterByDates(start, end); } - return filtered; - }; + return task; + }); - return start && end ? filterStart(filterEnd(timings)) : start ? filterStart(timings) : filterEnd(timings); - } - }, { - key: 'unflatTasks', - value: function unflatTasks(tasks) { - var keys = Object.keys(tasks); - var unflattened = []; - for (var i1 = 0; i1 < keys.length; i1++) { - for (var i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++) { - var timing = tasks[keys[i1]].timings[i2]; - timing.name = keys[i1]; - timing.description = tasks[keys[i1]].description; - unflattened.push(timing); - } - } - return unflattened; - } - }, { - key: 'dateFormat', - value: function dateFormat(d) { - var date = d.getFullYear() + "/"; - var twoDigits = function twoDigits(n) { - return n < 10 ? "0" + n : n; - }; - date += twoDigits(d.getMonth() + 1) + "/"; - date += twoDigits(d.getDate()) + " "; - date += twoDigits(d.getHours()) + ":"; - date += twoDigits(d.getMinutes()) + ":"; - date += twoDigits(d.getSeconds()); - return date; - } - }, { - key: 'hourFormat', - value: function hourFormat(d) { - var date = new Date(d); - var twoDigits = function twoDigits(n) { - return n < 10 ? "0" + n : n; - }; - return Math.floor(d / 36e5) + ":" + twoDigits(date.getMinutes()) + ":" + twoDigits(date.getSeconds()); + return (0, _output.markdown)(tasks, expanded); } }, { key: 'getConfig', @@ -279,7 +211,6 @@ var Manager = function () { }, { key: 'configure', value: function configure(element, value) { - if (_constants.configElements.indexOf(element) < 0) { return (0, _output.cliError)('Config key (' + element + ') not allowed, allowed keys: ' + this.configElements.toString() + ' '); } @@ -294,7 +225,7 @@ var Manager = function () { }, { key: 'update', value: function update() { - var _this9 = this; + var _this8 = this; if (!this.config || this.config && this.config['config.version'] !== '2') { console.log('DB: Need to be updated'); @@ -306,8 +237,8 @@ var Manager = function () { }); return newTasks; }).then(function (migratedTasks) { - _this9.cfg.set('tasks', migratedTasks); - _this9.cfg.set('config', Object.assign(_this9.config, { + _this8.cfg.set('tasks', migratedTasks); + _this8.cfg.set('config', Object.assign(_this8.config, { 'config.version': '2' })); diff --git a/lib/core/Manager.js.map b/lib/core/Manager.js.map index 568df2b..0c463f8 100644 --- a/lib/core/Manager.js.map +++ b/lib/core/Manager.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","timings","unflatTasks","body","total","filterDates","Date","dateFormat","hourFormat","filterStart","filtered","i","filterEnd","unflattened","i1","i2","timing","d","date","getFullYear","twoDigits","n","getMonth","getDate","getHours","getMinutes","Math","floor","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full","sort","a","b"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat'\nimport moment from 'moment'\nimport inquirer from 'inquirer'\n\nimport Task from './Task'\nimport { recognizeModifierTiming } from './utils'\nimport { STARTED, PAUSED, UNPAUSED, IN_PROGRESS, FINISHED, configElements } from './constants'\nimport { sumarize, outputVertical, cliError, cliSuccess } from './output'\nimport { migrateToV2 } from './dbMigrations'\n\nexport default class Manager {\n\n repositories = ['tasks', 'config']\n\n constructor(cfg) {\n this.cfg = cfg\n this.tasks = cfg.all.tasks\n this.config = (cfg.all.config) ? cfg.all.config : {}\n }\n\n getTask(key) {\n let task = (this.tasks[key]) ? this.tasks[key] : null\n return new Task(task)\n }\n\n storeTask(key, task){\n let update = {}\n update[key] = task.get()\n this.tasks = Object.assign({}, this.tasks, update)\n this.cfg.set('tasks', this.tasks)\n }\n\n startTask(key, description) {\n let t = this.getTask(key)\n t.start(description)\n .then(() => {\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n pauseTask(key){\n let t = this.getTask(key)\n t.pause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, PAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n unpauseTask(key){\n let t = this.getTask(key)\n t.unpause()\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n stopTask(key, description) {\n let t = this.getTask(key)\n t.stop(description)\n .then(()=>{\n this.storeTask(key, t)\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n )\n }, cliError)\n .catch(cliError)\n }\n\n addDescription(key, text){\n let t = this.getTask(key)\n t.setDescription(text)\n this.storeTask(key, t)\n }\n\n getTime(name) {\n let t = this.getTask(name)\n return t.getSeconds()\n }\n\n modifyTask(operation, name, stringTime){\n let t = this.getTask(name)\n t.makeOperationOverTime(operation, stringTime)\n .then(()=>{\n this.storeTask(name, t)\n }, cliError)\n .catch(cliError)\n }\n\n search(string) {\n let keys = Object.keys(this.tasks)\n let tasks = []\n keys.forEach((key)=>{\n if (string === 'all' || key.indexOf(string) > -1){\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n })\n }\n })\n return tasks\n }\n\n delete(string) {\n let tasks = this.search(string)\n\n console.log(\n tasks.map(k => `${k.name} \\n`).join('')\n )\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.')\n return\n }\n\n inquirer.prompt([{\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }]).then((answers) => {\n if (answers.cls){\n tasks.forEach(k => {\n delete this.tasks[k.name]\n this.cfg.set('tasks', this.tasks)\n })\n cliSuccess('Tasks deleted.')\n }\n })\n .catch(cliError)\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key]: this.tasks)\n }\n\n\tgetTasksMd(key, start, end) {\n\t\tlet timings\n\t\tif(key){\n\t\t\ttimings = this.tasks[key].timings\n\t\t}else{\n\t\t\ttimings = this.unflatTasks(this.tasks)\n\t\t}\n\t\tlet body = \t\"| Start | End | Hours | Subtotal | Description |\\n\"\n\t\tbody += \t\"| ----- | --- | -----:| -------: | ----------- |\\n\"\n\t\tlet total = 0;\n\n\t\ttimings = start || end ? this.filterDates(timings, start, end) : timings\n\t\ttimings.forEach( k => {\n\t\t\tlet start = new Date(k.start)\n\t\t\tlet stop = k.stop ? new Date(k.stop) : new Date()\n\t\t\ttotal += stop - start\n\t\t\tbody += \"|\" + this.dateFormat(start)+ \"|\" + this.dateFormat(stop)+ \"|\"+ this.hourFormat(stop - start)+ \"|\"+ this.hourFormat(total)+ \"|\" + k.name+ \"|\\n\"\n\t\t})\n\t\tbody += \t\"| | | |\\n\"\n\t\tbody += \t\"| Total | | \" + this.hourFormat(total)+ \" | | |\\n\"\n\n return body\n }\n\n\tfilterDates(timings, start, end){\n\t\tlet filterStart = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(start) < new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\t\tlet filterEnd = function(timings){\n\t\t\tlet filtered = []\n\t\t\tfor(let i = 0; i < timings.length; i++){\n\t\t\t\tif(new Date(end) > new Date(timings[i].start)){\n\t\t\t\t\tfiltered.push(timings[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered\n\t\t}\n\n\t\treturn start && end ? filterStart(filterEnd(timings)) : (start ? filterStart(timings) : filterEnd(timings))\n\t}\n\tunflatTasks(tasks){\n\t\tlet keys = Object.keys(tasks)\n\t\tlet unflattened = []\n\t\tfor(let i1 = 0; i1 < keys.length; i1++){\n\t\t\tfor(let i2 = 0; i2 < tasks[keys[i1]].timings.length; i2++){\n\t\t\t\tlet timing = tasks[keys[i1]].timings[i2]\n\t\t\t\ttiming.name = keys[i1]\n\t\t\t\ttiming.description = tasks[keys[i1]].description\n\t\t\t\tunflattened.push(timing)\n\t\t\t}\n\t\t}\n\t\treturn unflattened\n\t}\n\n\tdateFormat(d){\n\t\tlet date = d.getFullYear() + \"/\"\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\tdate += twoDigits(d.getMonth()+1) + \"/\"\n\t\tdate += twoDigits(d.getDate()) + \" \"\n\t\tdate += twoDigits(d.getHours()) + \":\"\n\t\tdate += twoDigits(d.getMinutes()) + \":\"\n\t\tdate += twoDigits(d.getSeconds())\n\t\treturn date\n\t}\n\n\thourFormat(d){\n\t\tlet date = new Date(d)\n\t\tlet twoDigits = n => n < 10 ? \"0\" + n : n\n\t\treturn Math.floor(d / 36e5) + \":\" + twoDigits(date.getMinutes()) + \":\" + twoDigits(date.getSeconds())\n\t}\n\n getConfig(){\n return this.config\n }\n\n configure(element, value){\n\n if (configElements.indexOf(element) < 0){\n return cliError(`Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `)\n }\n\n let newCfg = {\n [element]: value\n }\n\n this.config = Object.assign({}, this.config, newCfg)\n this.cfg.set('config', this.config)\n\n return this.config\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2') ){\n console.log('DB: Need to be updated')\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {}\n tasks.forEach(t => newTasks[t.key] = t.task)\n return newTasks\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks)\n this.cfg.set('config', Object.assign(this.config, {\n 'config.version': '2'\n }))\n\n cliSuccess('Configuration migrated to version 2.')\n }, cliError)\n .catch(cliError)\n } else {\n cliSuccess('No need to update the DB.')\n }\n }\n\n sumarize(key, rate, full=true){\n let tasks = this.search(key)\n tasks.sort((a,b) => { return a.name > b.name })\n sumarize(key, tasks, rate, full, this.config['format.output'])\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Manager.js"],"names":["Manager","cfg","repositories","tasks","all","config","key","task","update","get","Object","assign","set","description","t","getTask","start","then","storeTask","console","log","toISOString","catch","pause","unpause","stop","text","setDescription","name","getSeconds","operation","stringTime","makeOperationOverTime","string","keys","forEach","indexOf","push","search","map","k","join","length","prompt","type","message","default","answers","cls","unflatten","end","expanded","filterByDates","element","value","configElements","toString","newCfg","newTasks","migratedTasks","rate","full","sort","a","b"],"mappings":"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","file":"Manager.js","sourcesContent":["import flat from 'flat';\nimport moment from 'moment';\nimport inquirer from 'inquirer';\n\nimport Task from './Task';\nimport { recognizeModifierTiming, humanParseDiff, getSeconds } from './utils';\nimport {\n STARTED,\n PAUSED,\n UNPAUSED,\n IN_PROGRESS,\n FINISHED,\n configElements\n} from './constants';\nimport { sumarize, outputVertical, cliError, cliSuccess, markdown } from './output';\nimport { migrateToV2 } from './dbMigrations';\n\nexport default class Manager {\n repositories = ['tasks', 'config'];\n\n constructor(cfg) {\n this.cfg = cfg;\n this.tasks = cfg.all.tasks;\n this.config = cfg.all.config ? cfg.all.config : {};\n }\n\n getTask(key) {\n let task = this.tasks[key] ? this.tasks[key] : null;\n return new Task(task);\n }\n\n storeTask(key, task) {\n let update = {};\n update[key] = task.get();\n this.tasks = Object.assign({}, this.tasks, update);\n this.cfg.set('tasks', this.tasks);\n }\n\n startTask(key, description) {\n let t = this.getTask(key);\n t\n .start(description)\n .then(() => {\n this.storeTask(key, t);\n console.log(\n outputVertical('Task:', key, STARTED, moment().toISOString())\n );\n }, cliError)\n .catch(cliError);\n }\n\n pauseTask(key) {\n let t = this.getTask(key);\n t\n .pause()\n .then(() => {\n this.storeTask(key, t);\n console.log(outputVertical('Task:', key, PAUSED, moment().toISOString()));\n }, cliError)\n .catch(cliError);\n }\n\n unpauseTask(key) {\n let t = this.getTask(key);\n t\n .unpause()\n .then(() => {\n this.storeTask(key, t);\n console.log(\n outputVertical('Task:', key, UNPAUSED, moment().toISOString())\n );\n }, cliError)\n .catch(cliError);\n }\n\n stopTask(key, description) {\n let t = this.getTask(key);\n t\n .stop(description)\n .then(() => {\n this.storeTask(key, t);\n console.log(\n outputVertical('Task:', key, FINISHED, moment().toISOString())\n );\n }, cliError)\n .catch(cliError);\n }\n\n addDescription(key, text) {\n let t = this.getTask(key);\n t.setDescription(text);\n this.storeTask(key, t);\n }\n\n getTime(name) {\n let t = this.getTask(name);\n return t.getSeconds();\n }\n\n modifyTask(operation, name, stringTime) {\n let t = this.getTask(name);\n t\n .makeOperationOverTime(operation, stringTime)\n .then(() => {\n this.storeTask(name, t);\n }, cliError)\n .catch(cliError);\n }\n\n search(string = 'all') {\n let keys = Object.keys(this.tasks);\n let tasks = [];\n keys.forEach(key => {\n if (string === 'all' || key.indexOf(string) > -1) {\n tasks.push({\n name: key,\n task: new Task(this.tasks[key])\n });\n }\n });\n return tasks;\n }\n\n delete(string) {\n let tasks = this.search(string);\n\n console.log(tasks.map(k => `${k.name} \\n`).join(''));\n\n if (tasks.length === 0) {\n cliSuccess('No tasks found to delete.');\n return;\n }\n\n inquirer\n .prompt([\n {\n type: 'confirm',\n name: 'cls',\n message: `Are you sure you want to delete this tasks?`,\n default: false\n }\n ])\n .then(answers => {\n if (answers.cls) {\n tasks.forEach(k => {\n delete this.tasks[k.name];\n this.cfg.set('tasks', this.tasks);\n });\n cliSuccess('Tasks deleted.');\n }\n })\n .catch(cliError);\n }\n\n getTasksJson(key) {\n return flat.unflatten(key ? this.tasks[key] : this.tasks);\n }\n\n getTasksMd(key, start, end, expanded) {\n let tasks;\n if (key) {\n tasks = this.search(key);\n } else {\n tasks = this.search();\n }\n\n tasks.map(task => {\n if (start || end) {\n task = task.task.filterByDates(start, end);\n }\n return task;\n });\n\n return markdown(tasks, expanded);\n }\n\n getConfig() {\n return this.config;\n }\n\n configure(element, value) {\n if (configElements.indexOf(element) < 0) {\n return cliError(\n `Config key (${element}) not allowed, allowed keys: ${this.configElements.toString()} `\n );\n }\n\n let newCfg = {\n [element]: value\n };\n\n this.config = Object.assign({}, this.config, newCfg);\n this.cfg.set('config', this.config);\n\n return this.config;\n }\n\n update() {\n if (!this.config || (this.config && this.config['config.version'] !== '2')) {\n console.log('DB: Need to be updated');\n\n migrateToV2(this.tasks)\n .then(tasks => {\n let newTasks = {};\n tasks.forEach(t => (newTasks[t.key] = t.task));\n return newTasks;\n })\n .then(migratedTasks => {\n this.cfg.set('tasks', migratedTasks);\n this.cfg.set(\n 'config',\n Object.assign(this.config, {\n 'config.version': '2'\n })\n );\n\n cliSuccess('Configuration migrated to version 2.');\n }, cliError)\n .catch(cliError);\n } else {\n cliSuccess('No need to update the DB.');\n }\n }\n\n sumarize(key, rate, full = true) {\n let tasks = this.search(key);\n tasks.sort((a, b) => {\n return a.name > b.name;\n });\n sumarize(key, tasks, rate, full, this.config['format.output']);\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/Task.js b/lib/core/Task.js index 65f178b..009d525 100644 --- a/lib/core/Task.js +++ b/lib/core/Task.js @@ -17,6 +17,8 @@ var _utils = require('./utils'); var _output = require('./output'); +var _constants2 = require('constants'); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -29,18 +31,10 @@ var Task = function () { description: '', timings: [] }; + this.filtered = false; } _createClass(Task, [{ - key: '_calcTime', - value: function _calcTime(t) { - if (t.stop) { - return (0, _moment2.default)(t.stop).diff((0, _moment2.default)(t.start), 'seconds'); - } else { - return (0, _moment2.default)().diff((0, _moment2.default)(t.start), 'seconds'); - } - } - }, { key: '_modifyTiming', value: function _modifyTiming(time, operation) { var timing = this.task.timings[this.task.timings.length - 1]; @@ -199,19 +193,62 @@ var Task = function () { value: function get() { return this.task; } + }, { + key: 'filterByDates', + value: function filterByDates(start, end) { + if (this.task.timings) { + if (start && end) { + this.task.timings = this._filterTimingsByDate(start, end); + } else if (start) { + end = (0, _moment2.default)().format('YYYY/MM/DD'); + this.task.timings = this._filterTimingsByDate(start, end); + } else if (end) { + start = (0, _moment2.default)(0).format('YYYY/MM/DD'); + this.task.timings = this._filterTimingsByDate(start, end); + } + + if (this.task.timings.length === 0) { + this.filtered = true; + } + } else { + var t = (0, _utils.inPeriod)(this.task.start, this.task.stop, start, end); + if (t.isBetween) { + this.task.start = t.start; + this.task.stop = t.stop; + } else { + this.filtered = true; + } + } + + return this; + } + }, { + key: '_filterTimingsByDate', + value: function _filterTimingsByDate(start, end) { + return this.task.timings.reduce(function (acc, val) { + console.log(val); + var t = (0, _utils.inPeriod)(val.start, val.stop, start, end); + console.log(t); + if (t.isBetween) { + acc.push({ + start: t.start, + stop: t.stop + }); + } + return acc; + }, []); + } }, { key: 'getSeconds', value: function getSeconds() { - var _this6 = this; - var duration = 0; if (this.task.timings) { this.task.timings.forEach(function (timing) { - duration += _this6._calcTime(timing); + duration += (0, _utils.getSeconds)(timing); }); } else { - duration = this._calcTime(this.task); + duration = (0, _utils.getSeconds)(this.task); } return duration; @@ -225,6 +262,17 @@ var Task = function () { return this.task.start; } } + }, { + key: 'getEndDate', + value: function getEndDate() { + if (this.task.timings) { + return this.task.timings[this.task.timings.length - 1].stop; + } else if (this.task.stop) { + return this.task.stop; + } else { + return (0, _moment2.default)().toDate(); + } + } }, { key: 'error', value: function error(err) { diff --git a/lib/core/Task.js.map b/lib/core/Task.js.map index d6350fc..c2da4aa 100644 --- a/lib/core/Task.js.map +++ b/lib/core/Task.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","t","stop","diff","start","time","operation","timing","length","newStop","value","momentKey","isBefore","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","err","console","duration","forEach","_calcTime"],"mappings":"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","file":"Task.js","sourcesContent":["import moment from 'moment'\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants'\nimport { recognizeModifierTiming } from './utils'\nimport { cliError } from './output'\n\n\nexport default class Task {\n constructor(task){\n this.task = (task) ? task : {\n description: '',\n timings: []\n }\n }\n\n _calcTime(t){\n if (t.stop) {\n return moment(t.stop).diff(moment(t.start), 'seconds')\n } else {\n return moment().diff(moment(t.start), 'seconds')\n }\n }\n\n _modifyTiming(time, operation){\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n throw (`This task is not started, start it.`)\n }\n\n let newStop = moment(timing.stop)\n newStop = newStop[operation](time.value, time.momentKey)\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)){\n throw('You cant subtract more time')\n return\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop\n }\n\n start(description){\n return new Promise((resolve, reject)=>{\n let started = false\n\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n\n this.setDescription(description)\n this.setStatus(IN_PROGRESS)\n this.log('start')\n resolve()\n })\n }\n\n pause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n\n if (!timing){\n reject(this.error(`This task is not started, start it.`))\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setStatus(PAUSED)\n this.log('pause')\n resolve()\n })\n }\n\n unpause(){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`))\n }\n\n this.task.timings.push({\n start: moment().toDate()\n })\n this.setStatus(IN_PROGRESS)\n this.log('unpause')\n resolve()\n })\n }\n\n stop (description){\n return new Promise((resolve, reject)=>{\n let timing = this.task.timings[this.task.timings.length - 1]\n if (!timing || timing && !timing.start){\n reject(this.error(`This task is not started, start it`))\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`))\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate()\n this.setDescription(description)\n this.setStatus(FINISHED)\n this.log('stop')\n resolve()\n })\n }\n\n log(operation){\n if (!this.task.log){\n this.task.log = []\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`)\n }\n\n description(){\n return this.task.description\n }\n\n setDescription(text){\n this.task.description = (text) ? text : (this.task.description) ? this.task.description : ''\n }\n\n setStatus(status){\n this.task.status = status\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime)\n\n try {\n parsed.map((t)=>{\n this._modifyTiming(t, operation)\n })\n } catch(err){\n console.error(err)\n reject(this.error(`Error trying to ${operation} time to task`))\n }\n this.log(`${operation}:${stringTime}`)\n\n resolve()\n })\n }\n\n get(){\n return this.task\n }\n\n getSeconds(){\n let duration = 0\n\n if (this.task.timings){\n this.task.timings.forEach(timing => {\n duration += this._calcTime(timing)\n })\n } else {\n duration = this._calcTime(this.task)\n }\n\n return duration\n }\n\n getStartDate(){\n if (this.task.timings && this.task.timings[0]){\n return this.task.timings[0].start\n } else {\n return this.task.start\n }\n }\n\n error(err){\n return err //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/Task.js"],"names":["Task","task","description","timings","filtered","time","operation","timing","length","newStop","stop","value","momentKey","isBefore","start","Promise","resolve","reject","started","error","push","toDate","setDescription","setStatus","log","toISOString","text","status","stringTime","parsed","map","_modifyTiming","t","err","console","end","_filterTimingsByDate","format","isBetween","reduce","acc","val","duration","forEach"],"mappings":";;;;;;;;;AAAA;;;;AAEA;;AACA;;AACA;;AACA;;;;;;IAEqBA,I;AACjB,kBAAYC,IAAZ,EAAkB;AAAA;;AACd,aAAKA,IAAL,GAAYA,OACNA,IADM,GAEN;AACIC,yBAAa,EADjB;AAEIC,qBAAS;AAFb,SAFN;AAMA,aAAKC,QAAL,GAAgB,KAAhB;AACH;;;;sCAEaC,I,EAAMC,S,EAAW;AAC3B,gBAAIC,SAAS,KAAKN,IAAL,CAAUE,OAAV,CAAkB,KAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,CAAb;AACA,gBAAI,CAACD,MAAL,EAAa;AACT;AACH;;AAED,gBAAIE,UAAU,sBAAOF,OAAOG,IAAd,CAAd;AACAD,sBAAUA,QAAQH,SAAR,EAAmBD,KAAKM,KAAxB,EAA+BN,KAAKO,SAApC,CAAV;;AAEA,gBAAIN,cAAc,UAAd,IAA4BG,QAAQI,QAAR,CAAiBN,OAAOO,KAAxB,CAAhC,EAAgE;AAC5D,sBAAM,6BAAN;AACA;AACH;;AAED,iBAAKb,IAAL,CAAUE,OAAV,CAAkB,KAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,EAAgDE,IAAhD,GAAuDD,OAAvD;AACH;;;8BAEKP,W,EAAa;AAAA;;AACf,mBAAO,IAAIa,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACpC,oBAAIC,UAAU,KAAd;;AAEA,oBAAIX,SAAS,MAAKN,IAAL,CAAUE,OAAV,CAAkB,MAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,CAAb;;AAEA,oBAAID,UAAUA,OAAOO,KAAjB,IAA0B,CAACP,OAAOG,IAAtC,EAA4C;AACxCO,2BAAO,MAAKE,KAAL,8BAAP;AACH;;AAED,sBAAKlB,IAAL,CAAUE,OAAV,CAAkBiB,IAAlB,CAAuB;AACnBN,2BAAO,wBAASO,MAAT;AADY,iBAAvB;;AAIA,sBAAKC,cAAL,CAAoBpB,WAApB;AACA,sBAAKqB,SAAL;AACA,sBAAKC,GAAL,CAAS,OAAT;AACAR;AACH,aAjBM,CAAP;AAkBH;;;gCAEO;AAAA;;AACJ,mBAAO,IAAID,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACpC,oBAAIV,SAAS,OAAKN,IAAL,CAAUE,OAAV,CAAkB,OAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,CAAb;;AAEA,oBAAI,CAACD,MAAL,EAAa;AACTU,2BAAO,OAAKE,KAAL,uCAAP;AACH;;AAED,oBAAIZ,UAAUA,OAAOO,KAAjB,IAA0BP,OAAOG,IAArC,EAA2C;AACvCO,2BAAO,OAAKE,KAAL,4CAAP;AACH;;AAED,uBAAKlB,IAAL,CAAUE,OAAV,CAAkB,OAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,EAAgDE,IAAhD,GAAuD,wBAASW,MAAT,EAAvD;AACA,uBAAKE,SAAL;AACA,uBAAKC,GAAL,CAAS,OAAT;AACAR;AACH,aAfM,CAAP;AAgBH;;;kCAES;AAAA;;AACN,mBAAO,IAAID,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACpC,oBAAIV,SAAS,OAAKN,IAAL,CAAUE,OAAV,CAAkB,OAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,CAAb;AACA,oBAAI,CAACD,MAAL,EAAa;AACTU,2BAAO,OAAKE,KAAL,sCAAP;AACH;;AAED,oBAAIZ,UAAUA,OAAOO,KAAjB,IAA0B,CAACP,OAAOG,IAAtC,EAA4C;AACxCO,2BAAO,OAAKE,KAAL,0CAAP;AACH;;AAED,uBAAKlB,IAAL,CAAUE,OAAV,CAAkBiB,IAAlB,CAAuB;AACnBN,2BAAO,wBAASO,MAAT;AADY,iBAAvB;AAGA,uBAAKE,SAAL;AACA,uBAAKC,GAAL,CAAS,SAAT;AACAR;AACH,aAhBM,CAAP;AAiBH;;;6BAEId,W,EAAa;AAAA;;AACd,mBAAO,IAAIa,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACpC,oBAAIV,SAAS,OAAKN,IAAL,CAAUE,OAAV,CAAkB,OAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,CAAb;AACA,oBAAI,CAACD,MAAD,IAAYA,UAAU,CAACA,OAAOO,KAAlC,EAA0C;AACtCG,2BAAO,OAAKE,KAAL,sCAAP;AACH;;AAED,oBAAIZ,OAAOO,KAAP,IAAgBP,OAAOG,IAA3B,EAAiC;AAC7BO,2BAAO,OAAKE,KAAL,8CAAP;AACH;;AAED,uBAAKlB,IAAL,CAAUE,OAAV,CAAkB,OAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,EAAgDE,IAAhD,GAAuD,wBAASW,MAAT,EAAvD;AACA,uBAAKC,cAAL,CAAoBpB,WAApB;AACA,uBAAKqB,SAAL;AACA,uBAAKC,GAAL,CAAS,MAAT;AACAR;AACH,aAfM,CAAP;AAgBH;;;4BAEGV,S,EAAW;AACX,gBAAI,CAAC,KAAKL,IAAL,CAAUuB,GAAf,EAAoB;AAChB,qBAAKvB,IAAL,CAAUuB,GAAV,GAAgB,EAAhB;AACH;;AAED,iBAAKvB,IAAL,CAAUuB,GAAV,CAAcJ,IAAd,CAAsBd,SAAtB,SAAmC,wBAASmB,WAAT,EAAnC;AACH;;;sCAEa;AACV,mBAAO,KAAKxB,IAAL,CAAUC,WAAjB;AACH;;;uCAEcwB,I,EAAM;AACjB,iBAAKzB,IAAL,CAAUC,WAAV,GAAwBwB,OAClBA,IADkB,GAElB,KAAKzB,IAAL,CAAUC,WAAV,GAAwB,KAAKD,IAAL,CAAUC,WAAlC,GAAgD,EAFtD;AAGH;;;kCAESyB,M,EAAQ;AACd,iBAAK1B,IAAL,CAAU0B,MAAV,GAAmBA,MAAnB;AACH;;;8CAEqBrB,S,EAAWsB,U,EAAY;AAAA;;AACzC,mBAAO,IAAIb,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACpC,oBAAIY,SAAS,oCAAwBD,UAAxB,CAAb;;AAEA,oBAAI;AACAC,2BAAOC,GAAP,CAAW,aAAK;AACZ,+BAAKC,aAAL,CAAmBC,CAAnB,EAAsB1B,SAAtB;AACH,qBAFD;AAGH,iBAJD,CAIE,OAAO2B,GAAP,EAAY;AACVC,4BAAQf,KAAR,CAAcc,GAAd;AACAhB,2BAAO,OAAKE,KAAL,sBAA8Bb,SAA9B,mBAAP;AACH;AACD,uBAAKkB,GAAL,CAAYlB,SAAZ,SAAyBsB,UAAzB;;AAEAZ;AACH,aAdM,CAAP;AAeH;;;8BAEK;AACF,mBAAO,KAAKf,IAAZ;AACH;;;sCAEaa,K,EAAOqB,G,EAAK;AACtB,gBAAI,KAAKlC,IAAL,CAAUE,OAAd,EAAuB;AACnB,oBAAIW,SAASqB,GAAb,EAAkB;AACd,yBAAKlC,IAAL,CAAUE,OAAV,GAAoB,KAAKiC,oBAAL,CAA0BtB,KAA1B,EAAiCqB,GAAjC,CAApB;AACH,iBAFD,MAEO,IAAIrB,KAAJ,EAAW;AACdqB,0BAAM,wBAASE,MAAT,CAAgB,YAAhB,CAAN;AACA,yBAAKpC,IAAL,CAAUE,OAAV,GAAoB,KAAKiC,oBAAL,CAA0BtB,KAA1B,EAAiCqB,GAAjC,CAApB;AACH,iBAHM,MAGA,IAAIA,GAAJ,EAAS;AACZrB,4BAAQ,sBAAO,CAAP,EAAUuB,MAAV,CAAiB,YAAjB,CAAR;AACA,yBAAKpC,IAAL,CAAUE,OAAV,GAAoB,KAAKiC,oBAAL,CAA0BtB,KAA1B,EAAiCqB,GAAjC,CAApB;AACH;;AAED,oBAAI,KAAKlC,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,KAA6B,CAAjC,EAAoC;AAChC,yBAAKJ,QAAL,GAAgB,IAAhB;AACH;AACJ,aAdD,MAcO;AACH,oBAAI4B,IAAI,qBAAS,KAAK/B,IAAL,CAAUa,KAAnB,EAA0B,KAAKb,IAAL,CAAUS,IAApC,EAA0CI,KAA1C,EAAiDqB,GAAjD,CAAR;AACA,oBAAIH,EAAEM,SAAN,EAAiB;AACb,yBAAKrC,IAAL,CAAUa,KAAV,GAAkBkB,EAAElB,KAApB;AACA,yBAAKb,IAAL,CAAUS,IAAV,GAAiBsB,EAAEtB,IAAnB;AACH,iBAHD,MAGO;AACH,yBAAKN,QAAL,GAAgB,IAAhB;AACH;AACJ;;AAED,mBAAO,IAAP;AACH;;;6CAEoBU,K,EAAOqB,G,EAAK;AAC7B,mBAAO,KAAKlC,IAAL,CAAUE,OAAV,CAAkBoC,MAAlB,CAAyB,UAACC,GAAD,EAAMC,GAAN,EAAc;AAC1CP,wBAAQV,GAAR,CAAYiB,GAAZ;AACA,oBAAIT,IAAI,qBAASS,IAAI3B,KAAb,EAAoB2B,IAAI/B,IAAxB,EAA8BI,KAA9B,EAAqCqB,GAArC,CAAR;AACAD,wBAAQV,GAAR,CAAYQ,CAAZ;AACA,oBAAIA,EAAEM,SAAN,EAAiB;AACbE,wBAAIpB,IAAJ,CAAS;AACLN,+BAAOkB,EAAElB,KADJ;AAELJ,8BAAMsB,EAAEtB;AAFH,qBAAT;AAIH;AACD,uBAAO8B,GAAP;AACH,aAXM,EAWJ,EAXI,CAAP;AAYH;;;qCAEY;AACT,gBAAIE,WAAW,CAAf;;AAEA,gBAAI,KAAKzC,IAAL,CAAUE,OAAd,EAAuB;AACnB,qBAAKF,IAAL,CAAUE,OAAV,CAAkBwC,OAAlB,CAA0B,kBAAU;AAChCD,gCAAY,uBAAWnC,MAAX,CAAZ;AACH,iBAFD;AAGH,aAJD,MAIO;AACHmC,2BAAW,uBAAW,KAAKzC,IAAhB,CAAX;AACH;;AAED,mBAAOyC,QAAP;AACH;;;uCAEc;AACX,gBAAI,KAAKzC,IAAL,CAAUE,OAAV,IAAqB,KAAKF,IAAL,CAAUE,OAAV,CAAkB,CAAlB,CAAzB,EAA+C;AAC3C,uBAAO,KAAKF,IAAL,CAAUE,OAAV,CAAkB,CAAlB,EAAqBW,KAA5B;AACH,aAFD,MAEO;AACH,uBAAO,KAAKb,IAAL,CAAUa,KAAjB;AACH;AACJ;;;qCAEY;AACT,gBAAI,KAAKb,IAAL,CAAUE,OAAd,EAAuB;AACnB,uBAAO,KAAKF,IAAL,CAAUE,OAAV,CAAkB,KAAKF,IAAL,CAAUE,OAAV,CAAkBK,MAAlB,GAA2B,CAA7C,EAAgDE,IAAvD;AACH,aAFD,MAEO,IAAI,KAAKT,IAAL,CAAUS,IAAd,EAAoB;AACvB,uBAAO,KAAKT,IAAL,CAAUS,IAAjB;AACH,aAFM,MAEA;AACH,uBAAO,wBAASW,MAAT,EAAP;AACH;AACJ;;;8BAEKY,G,EAAK;AACP,mBAAOA,GAAP,CADO,CACK;AACf;;;;;;kBApOgBjC,I","file":"Task.js","sourcesContent":["import moment from 'moment';\n\nimport { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants';\nimport { recognizeModifierTiming, inPeriod, getSeconds } from './utils';\nimport { cliError } from './output';\nimport { EINPROGRESS } from 'constants';\n\nexport default class Task {\n constructor(task) {\n this.task = task\n ? task\n : {\n description: '',\n timings: []\n };\n this.filtered = false;\n }\n\n _modifyTiming(time, operation) {\n let timing = this.task.timings[this.task.timings.length - 1];\n if (!timing) {\n throw `This task is not started, start it.`;\n }\n\n let newStop = moment(timing.stop);\n newStop = newStop[operation](time.value, time.momentKey);\n\n if (operation === 'subtract' && newStop.isBefore(timing.start)) {\n throw 'You cant subtract more time';\n return;\n }\n\n this.task.timings[this.task.timings.length - 1].stop = newStop;\n }\n\n start(description) {\n return new Promise((resolve, reject) => {\n let started = false;\n\n let timing = this.task.timings[this.task.timings.length - 1];\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task already started.`));\n }\n\n this.task.timings.push({\n start: moment().toDate()\n });\n\n this.setDescription(description);\n this.setStatus(IN_PROGRESS);\n this.log('start');\n resolve();\n });\n }\n\n pause() {\n return new Promise((resolve, reject) => {\n let timing = this.task.timings[this.task.timings.length - 1];\n\n if (!timing) {\n reject(this.error(`This task is not started, start it.`));\n }\n\n if (timing && timing.start && timing.stop) {\n reject(this.error(`This task are ended/paused, unpaused it.`));\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate();\n this.setStatus(PAUSED);\n this.log('pause');\n resolve();\n });\n }\n\n unpause() {\n return new Promise((resolve, reject) => {\n let timing = this.task.timings[this.task.timings.length - 1];\n if (!timing) {\n reject(this.error(`This task is not started, start it`));\n }\n\n if (timing && timing.start && !timing.stop) {\n reject(this.error(`This task is started, pause/stop first`));\n }\n\n this.task.timings.push({\n start: moment().toDate()\n });\n this.setStatus(IN_PROGRESS);\n this.log('unpause');\n resolve();\n });\n }\n\n stop(description) {\n return new Promise((resolve, reject) => {\n let timing = this.task.timings[this.task.timings.length - 1];\n if (!timing || (timing && !timing.start)) {\n reject(this.error(`This task is not started, start it`));\n }\n\n if (timing.start && timing.stop) {\n reject(this.error(`This task already ended, start/unpause it.`));\n }\n\n this.task.timings[this.task.timings.length - 1].stop = moment().toDate();\n this.setDescription(description);\n this.setStatus(FINISHED);\n this.log('stop');\n resolve();\n });\n }\n\n log(operation) {\n if (!this.task.log) {\n this.task.log = [];\n }\n\n this.task.log.push(`${operation}#${moment().toISOString()}`);\n }\n\n description() {\n return this.task.description;\n }\n\n setDescription(text) {\n this.task.description = text\n ? text\n : this.task.description ? this.task.description : '';\n }\n\n setStatus(status) {\n this.task.status = status;\n }\n\n makeOperationOverTime(operation, stringTime) {\n return new Promise((resolve, reject) => {\n let parsed = recognizeModifierTiming(stringTime);\n\n try {\n parsed.map(t => {\n this._modifyTiming(t, operation);\n });\n } catch (err) {\n console.error(err);\n reject(this.error(`Error trying to ${operation} time to task`));\n }\n this.log(`${operation}:${stringTime}`);\n\n resolve();\n });\n }\n\n get() {\n return this.task;\n }\n\n filterByDates(start, end) {\n if (this.task.timings) {\n if (start && end) {\n this.task.timings = this._filterTimingsByDate(start, end);\n } else if (start) {\n end = moment().format('YYYY/MM/DD');\n this.task.timings = this._filterTimingsByDate(start, end);\n } else if (end) {\n start = moment(0).format('YYYY/MM/DD');\n this.task.timings = this._filterTimingsByDate(start, end);\n }\n\n if (this.task.timings.length === 0) {\n this.filtered = true;\n }\n } else {\n let t = inPeriod(this.task.start, this.task.stop, start, end);\n if (t.isBetween) {\n this.task.start = t.start;\n this.task.stop = t.stop;\n } else {\n this.filtered = true;\n }\n }\n\n return this;\n }\n\n _filterTimingsByDate(start, end) {\n return this.task.timings.reduce((acc, val) => {\n console.log(val);\n let t = inPeriod(val.start, val.stop, start, end);\n console.log(t);\n if (t.isBetween) {\n acc.push({\n start: t.start,\n stop: t.stop\n });\n }\n return acc;\n }, []);\n }\n\n getSeconds() {\n let duration = 0;\n\n if (this.task.timings) {\n this.task.timings.forEach(timing => {\n duration += getSeconds(timing);\n });\n } else {\n duration = getSeconds(this.task);\n }\n\n return duration;\n }\n\n getStartDate() {\n if (this.task.timings && this.task.timings[0]) {\n return this.task.timings[0].start;\n } else {\n return this.task.start;\n }\n }\n\n getEndDate() {\n if (this.task.timings) {\n return this.task.timings[this.task.timings.length - 1].stop;\n } else if (this.task.stop) {\n return this.task.stop;\n } else {\n return moment().toDate();\n }\n }\n\n error(err) {\n return err; //+ ` \\n Task: ${JSON.stringify(this.task)}`\n }\n}\n"]} \ No newline at end of file diff --git a/lib/core/output.js b/lib/core/output.js index 81e0ee7..77dcd8b 100644 --- a/lib/core/output.js +++ b/lib/core/output.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.cliSuccess = exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; +exports.markdown = exports.cliSuccess = exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; var _moment = require('moment'); @@ -28,17 +28,17 @@ var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, f head: ['Name', 'Description', 'Dates', 'Duration'], colAligns: ['left', 'center', 'center', 'left'], chars: { - 'top': '═', + top: '═', 'top-mid': '╤', 'top-left': '╔', 'top-right': '╗', - 'bottom': '═', + bottom: '═', 'bottom-mid': '╧', 'bottom-left': '╚', 'bottom-right': '╝', - 'left': '║', + left: '║', 'left-mid': '╟', - 'right': '║', + right: '║', 'right-mid': '╢' }, style: { head: ['green'] } @@ -78,9 +78,17 @@ var sumarize = exports.sumarize = function sumarize(search, tasks, rate, full, f table.push([]); if (rate) { - table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, _colors2.default.red('Total time'), (0, _utils.humanParseDiff)(total)], [_colors2.default.red('Rate'), (0, _utils.calcRate)(rate, total)]); + table.push([{ + rowSpan: 2, + content: _colors2.default.red('Search:') + ' "' + search + '"', + vAlign: 'center' + }, _colors2.default.red('Total time'), (0, _utils.humanParseDiff)(total)], [_colors2.default.red('Rate'), (0, _utils.calcRate)(rate, total)]); } else { - table.push([{ rowSpan: 2, content: _colors2.default.red('Search:') + ' "' + search + '"', vAlign: 'center' }, { rowSpan: 2, content: '', vAlign: 'center' }, { rowSpan: 2, content: _colors2.default.red('Total time'), vAlign: 'center' }, { rowSpan: 2, content: (0, _utils.humanParseDiff)(total), vAlign: 'center' }], []); + table.push([{ + rowSpan: 2, + content: _colors2.default.red('Search:') + ' "' + search + '"', + vAlign: 'center' + }, { rowSpan: 2, content: '', vAlign: 'center' }, { rowSpan: 2, content: _colors2.default.red('Total time'), vAlign: 'center' }, { rowSpan: 2, content: (0, _utils.humanParseDiff)(total), vAlign: 'center' }], []); } } @@ -91,17 +99,17 @@ var outputConfig = exports.outputConfig = function outputConfig(config) { var table = new _cliTable2.default({ head: ['Key', 'value'], chars: { - 'top': '═', + top: '═', 'top-mid': '╤', 'top-left': '╔', 'top-right': '╗', - 'bottom': '═', + bottom: '═', 'bottom-mid': '╧', 'bottom-left': '╚', 'bottom-right': '╝', - 'left': '║', + left: '║', 'left-mid': '╟', - 'right': '║', + right: '║', 'right-mid': '╢' }, colAligns: ['center', 'center'], @@ -134,4 +142,44 @@ var cliError = exports.cliError = function cliError(err) { var cliSuccess = exports.cliSuccess = function cliSuccess(err) { console.log(_colors2.default.green(err)); }; + +var markdown = exports.markdown = function markdown(tasks) { + var expanded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var body = '| Start | End | Hours | Subtotal | Description |\n'; + body += '| ----- | --- | -----:| -------: | ----------- |\n'; + var total = 0; + + //tasks = start || end ? this.filterDates(tasks, start, end) : tasks; + tasks.forEach(function (task) { + var name = task.name; + task = task.task; + + if (!task.filtered) { + var duration = task.getSeconds(); + total += duration; + + if (expanded && task.task.timings.length > 1) { + var subtotal = 0; + var times = 0; + + task.task.timings.forEach(function (timing) { + var secs = (0, _utils.getSeconds)(timing); + subtotal += secs; + times += 1; + body += '|' + (0, _moment2.default)(timing.start).format('YYYY/MM/DD kk:mm') + ('|' + (0, _moment2.default)(timing.stop).format('YYYY/MM/DD kk:mm')) + ('|' + (0, _utils.humanParseDiff)(secs)) + ('|' + (0, _utils.humanParseDiff)(subtotal)) + ('|' + name + ' (part ' + times + ')') + '|\n'; + }); + } else { + var start = task.getStartDate(); + var stop = task.getEndDate(); + + body += '|' + (0, _moment2.default)(start).format('YYYY/MM/DD kk:mm') + ('|' + (0, _moment2.default)(stop).format('YYYY/MM/DD kk:mm')) + ('|' + (0, _utils.humanParseDiff)(duration)) + ('|' + (0, _utils.humanParseDiff)(total)) + ('|' + name) + '|\n'; + } + } + }); + body += '| | | |\n'; + body += '| Total | | ' + (0, _utils.humanParseDiff)(total) + ' | | |\n'; + + return body; +}; //# sourceMappingURL=output.js.map \ No newline at end of file diff --git a/lib/core/output.js.map b/lib/core/output.js.map index 03ce1d5..aa0e112 100644 --- a/lib/core/output.js.map +++ b/lib/core/output.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","style","total","forEach","task","index","description","name","duration","getSeconds","splitWidth","str","len","arr","length","push","substring","join","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment'\nimport Table from 'cli-table2'\nimport colors from 'colors'\n\nimport { humanParseDiff, calcRate } from './utils'\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Name','Description', 'Dates', 'Duration'],\n colAligns: ['left', 'center', 'center', 'left'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0\n let head= `Search: ${search} \\n`\n\n tasks.forEach((task, index) => {\n\t\tlet description = (task.task.description() && task.task.description() !== '')\n\t\t? task.task.description()\n\t\t: '-'\n let name = task.name\n task = task.task\n\n let duration = task.getSeconds()\n total += duration\n\n // Avoid excesive width for proper console fit\n let splitWidth = (str, len) => {\n let arr = []\n while (str != '') {\n if (str.length > len) {\n arr.push(str.substring(0,len))\n str = str.substring(len);\n } else {\n arr.push(str)\n break\n }\n }\n return arr.join('\\n')\n }\n description = splitWidth(description, 51)\n name = splitWidth(name, 40)\n\n table.push([name, description, moment(task.getStartDate()).format(format), humanParseDiff(duration)])\n })\n\n if (full){\n table.push([])\n\n if (rate){\n table.push(\n [{ rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center'}, colors.red('Total time'), humanParseDiff(total)],\n [ colors.red('Rate'), calcRate(rate, total)]\n )\n } else {\n table.push(\n [\n { rowSpan:2, content: `${colors.red('Search:')} \"${search}\"`, vAlign:'center' },\n { rowSpan:2, content: '', vAlign:'center' },\n { rowSpan:2, content: colors.red('Total time'), vAlign:'center' },\n { rowSpan:2, content: humanParseDiff(total), vAlign:'center' }\n ],\n []\n )\n }\n }\n\n console.log(table.toString());\n}\n\nexport const outputConfig = function (config){\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n 'top': '═'\n , 'top-mid': '╤'\n , 'top-left': '╔'\n , 'top-right': '╗'\n , 'bottom': '═'\n , 'bottom-mid': '╧'\n , 'bottom-left': '╚'\n , 'bottom-right': '╝'\n , 'left': '║'\n , 'left-mid': '╟'\n , 'right': '║'\n , 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]))\n\n console.log(table.toString());\n}\n\nexport const outputVertical = function (...args){\n let table2 = new Table()\n let key = args.splice(0, 1)\n table2.push(\n { [key]: args },\n )\n\n return table2.toString()\n}\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`))\n}\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err))\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/output.js"],"names":["sumarize","search","tasks","rate","full","format","table","head","colAligns","chars","top","bottom","left","right","style","total","forEach","task","index","description","name","duration","getSeconds","splitWidth","str","len","arr","length","push","substring","join","getStartDate","rowSpan","content","red","vAlign","console","log","toString","outputConfig","config","Object","keys","map","e","outputVertical","args","table2","key","splice","cliError","err","error","cliSuccess","green","markdown","expanded","body","filtered","timings","subtotal","times","secs","timing","start","stop","getEndDate"],"mappings":"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","file":"output.js","sourcesContent":["import moment from 'moment';\nimport Table from 'cli-table2';\nimport colors from 'colors';\n\nimport { humanParseDiff, calcRate, getSeconds } from './utils';\n\nexport const sumarize = function(search, tasks, rate, full, format) {\n let table = new Table({\n head: ['Name', 'Description', 'Dates', 'Duration'],\n colAligns: ['left', 'center', 'center', 'left'],\n chars: {\n top: '═',\n 'top-mid': '╤',\n 'top-left': '╔',\n 'top-right': '╗',\n bottom: '═',\n 'bottom-mid': '╧',\n 'bottom-left': '╚',\n 'bottom-right': '╝',\n left: '║',\n 'left-mid': '╟',\n right: '║',\n 'right-mid': '╢'\n },\n style: { head: ['green'] }\n });\n let total = 0;\n let head = `Search: ${search} \\n`;\n\n tasks.forEach((task, index) => {\n let description =\n task.task.description() && task.task.description() !== ''\n ? task.task.description()\n : '-';\n let name = task.name;\n task = task.task;\n\n let duration = task.getSeconds();\n total += duration;\n\n // Avoid excesive width for proper console fit\n let splitWidth = (str, len) => {\n let arr = [];\n while (str != '') {\n if (str.length > len) {\n arr.push(str.substring(0, len));\n str = str.substring(len);\n } else {\n arr.push(str);\n break;\n }\n }\n return arr.join('\\n');\n };\n description = splitWidth(description, 51);\n name = splitWidth(name, 40);\n\n table.push([\n name,\n description,\n moment(task.getStartDate()).format(format),\n humanParseDiff(duration)\n ]);\n });\n\n if (full) {\n table.push([]);\n\n if (rate) {\n table.push(\n [\n {\n rowSpan: 2,\n content: `${colors.red('Search:')} \"${search}\"`,\n vAlign: 'center'\n },\n colors.red('Total time'),\n humanParseDiff(total)\n ],\n [colors.red('Rate'), calcRate(rate, total)]\n );\n } else {\n table.push(\n [\n {\n rowSpan: 2,\n content: `${colors.red('Search:')} \"${search}\"`,\n vAlign: 'center'\n },\n { rowSpan: 2, content: '', vAlign: 'center' },\n { rowSpan: 2, content: colors.red('Total time'), vAlign: 'center' },\n { rowSpan: 2, content: humanParseDiff(total), vAlign: 'center' }\n ],\n []\n );\n }\n }\n\n console.log(table.toString());\n};\n\nexport const outputConfig = function(config) {\n let table = new Table({\n head: ['Key', 'value'],\n chars: {\n top: '═',\n 'top-mid': '╤',\n 'top-left': '╔',\n 'top-right': '╗',\n bottom: '═',\n 'bottom-mid': '╧',\n 'bottom-left': '╚',\n 'bottom-right': '╝',\n left: '║',\n 'left-mid': '╟',\n right: '║',\n 'right-mid': '╢'\n },\n colAligns: ['center', 'center'],\n style: { head: ['green'] }\n });\n\n Object.keys(config).map(e => table.push([e, config[e]]));\n\n console.log(table.toString());\n};\n\nexport const outputVertical = function(...args) {\n let table2 = new Table();\n let key = args.splice(0, 1);\n table2.push({ [key]: args });\n\n return table2.toString();\n};\n\nexport const cliError = function(err) {\n console.error(colors.red(`Error: ${err}`));\n};\n\nexport const cliSuccess = function(err) {\n console.log(colors.green(err));\n};\n\nexport const markdown = function(tasks, expanded = false) {\n let body = '| Start | End | Hours | Subtotal | Description |\\n';\n body += '| ----- | --- | -----:| -------: | ----------- |\\n';\n let total = 0;\n\n //tasks = start || end ? this.filterDates(tasks, start, end) : tasks;\n tasks.forEach(task => {\n let name = task.name;\n task = task.task;\n\n if (!task.filtered) {\n let duration = task.getSeconds();\n total += duration;\n\n if (expanded && task.task.timings.length > 1) {\n let subtotal = 0;\n let times = 0;\n\n task.task.timings.forEach(timing => {\n let secs = getSeconds(timing);\n subtotal += secs;\n times += 1;\n body +=\n `|${moment(timing.start).format('YYYY/MM/DD kk:mm')}` +\n `|${moment(timing.stop).format('YYYY/MM/DD kk:mm')}` +\n `|${humanParseDiff(secs)}` +\n `|${humanParseDiff(subtotal)}` +\n `|${name} (part ${times})` +\n `|\\n`;\n });\n } else {\n let start = task.getStartDate();\n let stop = task.getEndDate();\n\n body +=\n `|${moment(start).format('YYYY/MM/DD kk:mm')}` +\n `|${moment(stop).format('YYYY/MM/DD kk:mm')}` +\n `|${humanParseDiff(duration)}` +\n `|${humanParseDiff(total)}` +\n `|${name}` +\n `|\\n`;\n }\n }\n });\n body += '| | | |\\n';\n body += `| Total | | ${humanParseDiff(total)} | | |\\n`;\n\n return body;\n};\n"]} \ No newline at end of file diff --git a/lib/core/utils.js b/lib/core/utils.js index da2943d..1041efc 100644 --- a/lib/core/utils.js +++ b/lib/core/utils.js @@ -3,6 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.getSeconds = exports.inPeriod = exports.humanParseDiff = exports.calcRate = exports.recognizeModifierTiming = undefined; + +var _moment = require('moment'); + +var _moment2 = _interopRequireDefault(_moment); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + var recognizeModifierTiming = exports.recognizeModifierTiming = function recognizeModifierTiming(string) { var r = /(\d{1,})([hms])/g; var arr = void 0; @@ -46,4 +54,39 @@ var humanParseDiff = exports.humanParseDiff = function humanParseDiff(secs) { seconds = seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's'; return hours + ' ' + minutes + ' ' + seconds; }; + +var inPeriod = exports.inPeriod = function inPeriod(start, stop, fstart, fstop) { + fstart = (0, _moment2.default)(fstart, 'YYYY/MM/DD'); + fstop = (0, _moment2.default)(fstop, 'YYYY/MM/DD'); + + console.log('fstart', fstart); + console.log('fstop', fstop); + + if ((0, _moment2.default)(start).isBetween(fstart, fstop, null, '[]') && (0, _moment2.default)(stop).isBetween(fstart, fstop, null, '[]')) { + console.log('start', start); + console.log('stop', stop); + return { isBetween: true, start: start, stop: stop }; + } + + if (!(0, _moment2.default)(start).isBetween(fstart, fstop, null, '[]') && (0, _moment2.default)(stop).isBetween(fstart, fstop, null, '[]')) { + return { isBetween: true, start: fstart, stop: stop }; + } + + if ((0, _moment2.default)(start).isBetween(fstart, fstop, null, '[]') && !(0, _moment2.default)(stop).isBetween(fstart, fstop, null, '[]')) { + return { isBetween: true, start: start, stop: fstop }; + } + + return { isBetween: false, start: start, stop: stop }; +}; + +var getSeconds = exports.getSeconds = function getSeconds(_ref) { + var start = _ref.start, + stop = _ref.stop; + + if (stop) { + return (0, _moment2.default)(stop).diff((0, _moment2.default)(start), 'seconds'); + } else { + return (0, _moment2.default)().diff((0, _moment2.default)(start), 'seconds'); + } +}; //# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/lib/core/utils.js.map b/lib/core/utils.js.map index 5c21888..f0fe51b 100644 --- a/lib/core/utils.js.map +++ b/lib/core/utils.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/core/utils.js"],"names":["recognizeModifierTiming","string","r","arr","res","exec","push","value","momentKey","calcRate","rate","total","amount","mod","substr","length","slice","parseFloat","toFixed","humanParseDiff","secs","hours","Math","floor","minutes","seconds"],"mappings":";;;;;AAAO,IAAMA,4DAA0B,SAA1BA,uBAA0B,CAAUC,MAAV,EAAiB;AACpD,QAAIC,IAAI,kBAAR;AACA,QAAIC,YAAJ;AACA,QAAIC,MAAM,EAAV;AACA,WAAO,CAACD,MAAMD,EAAEG,IAAF,CAAOJ,MAAP,CAAP,MAA2B,IAAlC,EAAwC;AACpCG,YAAIE,IAAJ,CAAS;AACLC,mBAAOJ,IAAI,CAAJ,CADF;AAELK,uBAAWL,IAAI,CAAJ;AAFN,SAAT;AAIH;;AAED,WAAOC,GAAP;AACH,CAZM;;AAcA,IAAMK,8BAAW,SAAXA,QAAW,CAAUC,IAAV,EAAgBC,KAAhB,EAAsB;AAC1C,QAAIC,eAAJ;AACA,QAAIC,MAAMH,KAAKI,MAAL,CAAYJ,KAAKK,MAAL,GAAc,CAA1B,CAAV;AACA,QAAIR,QAAQG,KAAKM,KAAL,CAAW,CAAX,EAAcN,KAAKK,MAAL,GAAc,CAA5B,CAAZ;;AAEA,YAAQF,GAAR;AACI,aAAK,GAAL;AACID,qBAAUD,QAAM,EAAN,GAAS,EAAV,GAAcM,WAAWV,KAAX,CAAvB;AACA;AACJ,aAAK,GAAL;AACIK,qBAAUD,QAAM,EAAP,GAAWM,WAAWV,KAAX,CAApB;AACA;AACJ,aAAK,GAAL;AACIK,qBAASD,QAAMM,WAAWV,KAAX,CAAf;AACA;AATR;;AAYA,WAAOK,OAAOM,OAAP,CAAe,CAAf,CAAP;AACH,CAlBM;;AAoBA,IAAMC,0CAAiB,SAAjBA,cAAiB,CAASC,IAAT,EAAe;AACzC,QAAIC,QAAUC,KAAKC,KAAL,CAAWH,OAAO,IAAlB,CAAd;AACA,QAAII,UAAUF,KAAKC,KAAL,CAAW,CAACH,OAAQC,QAAQ,IAAjB,IAA0B,EAArC,CAAd;AACA,QAAII,UAAUL,OAAQC,QAAQ,IAAhB,GAAyBG,UAAU,EAAjD;AACAH,YAASA,SAAS,CAAT,GAAa,KAAb,GAAqB,CAACA,QAAQ,EAAR,GAAa,MAAMA,KAAnB,GAA2BA,KAA5B,IAAqC,GAAnE;AACAG,cAAYA,WAAW,CAAX,IAAgBH,SAAS,EAA1B,GAAgC,KAAhC,GAAwC,CAACG,UAAU,EAAV,GAAe,MAAMA,OAArB,GAA+BA,OAAhC,IAA2C,GAA9F;AACAC,cAAWA,WAAW,CAAX,GAAe,KAAf,GAAuB,CAACA,UAAW,EAAX,GAAgB,MAAMA,OAAtB,GAAgCA,OAAjC,IAA4C,GAA9E;AACA,WAAUJ,KAAV,SAAmBG,OAAnB,SAA8BC,OAA9B;AACH,CARM","file":"utils.js","sourcesContent":["export const recognizeModifierTiming = function (string){\n let r = /(\\d{1,})([hms])/g\n let arr\n let res = []\n while ((arr = r.exec(string)) !== null) {\n res.push({\n value: arr[1],\n momentKey: arr[2]\n })\n }\n\n return res\n}\n\nexport const calcRate = function (rate, total){\n let amount\n let mod = rate.substr(rate.length - 1)\n let value = rate.slice(0, rate.length - 1)\n\n switch (mod) {\n case 'h':\n amount = (total/60/60)*parseFloat(value)\n break;\n case 'm':\n amount = (total/60)*parseFloat(value)\n break;\n case 's':\n amount = total*parseFloat(value)\n break;\n }\n\n return amount.toFixed(2)\n}\n\nexport const humanParseDiff = function(secs) {\n let hours = Math.floor(secs / 3600)\n let minutes = Math.floor((secs - (hours * 3600)) / 60)\n let seconds = secs - (hours * 3600) - (minutes * 60)\n hours = (hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h')\n minutes = ((minutes == 0 && hours == '') ? '00m' : (minutes < 10 ? '0' + minutes : minutes) + 'm')\n seconds = (seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's')\n return `${hours} ${minutes} ${seconds}`\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/core/utils.js"],"names":["recognizeModifierTiming","string","r","arr","res","exec","push","value","momentKey","calcRate","rate","total","amount","mod","substr","length","slice","parseFloat","toFixed","humanParseDiff","secs","hours","Math","floor","minutes","seconds","inPeriod","start","stop","fstart","fstop","console","log","isBetween","getSeconds","diff"],"mappings":"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","file":"utils.js","sourcesContent":["import moment from 'moment';\n\nexport const recognizeModifierTiming = function(string) {\n let r = /(\\d{1,})([hms])/g;\n let arr;\n let res = [];\n while ((arr = r.exec(string)) !== null) {\n res.push({\n value: arr[1],\n momentKey: arr[2]\n });\n }\n\n return res;\n};\n\nexport const calcRate = function(rate, total) {\n let amount;\n let mod = rate.substr(rate.length - 1);\n let value = rate.slice(0, rate.length - 1);\n\n switch (mod) {\n case 'h':\n amount = total / 60 / 60 * parseFloat(value);\n break;\n case 'm':\n amount = total / 60 * parseFloat(value);\n break;\n case 's':\n amount = total * parseFloat(value);\n break;\n }\n\n return amount.toFixed(2);\n};\n\nexport const humanParseDiff = function(secs) {\n let hours = Math.floor(secs / 3600);\n let minutes = Math.floor((secs - hours * 3600) / 60);\n let seconds = secs - hours * 3600 - minutes * 60;\n hours = hours == 0 ? '00h' : (hours < 10 ? '0' + hours : hours) + 'h';\n minutes =\n minutes == 0 && hours == ''\n ? '00m'\n : (minutes < 10 ? '0' + minutes : minutes) + 'm';\n seconds = seconds == 0 ? '00s' : (seconds < 10 ? '0' + seconds : seconds) + 's';\n return `${hours} ${minutes} ${seconds}`;\n};\n\nexport const inPeriod = function(start, stop, fstart, fstop) {\n fstart = moment(fstart, 'YYYY/MM/DD');\n fstop = moment(fstop, 'YYYY/MM/DD');\n\n console.log('fstart', fstart);\n console.log('fstop', fstop);\n\n if (\n moment(start).isBetween(fstart, fstop, null, '[]') &&\n moment(stop).isBetween(fstart, fstop, null, '[]')\n ) {\n console.log('start', start);\n console.log('stop', stop);\n return { isBetween: true, start, stop };\n }\n\n if (\n !moment(start).isBetween(fstart, fstop, null, '[]') &&\n moment(stop).isBetween(fstart, fstop, null, '[]')\n ) {\n return { isBetween: true, start: fstart, stop };\n }\n\n if (\n moment(start).isBetween(fstart, fstop, null, '[]') &&\n !moment(stop).isBetween(fstart, fstop, null, '[]')\n ) {\n return { isBetween: true, start, stop: fstop };\n }\n\n return { isBetween: false, start, stop };\n};\n\nexport const getSeconds = ({ start, stop }) => {\n if (stop) {\n return moment(stop).diff(moment(start), 'seconds');\n } else {\n return moment().diff(moment(start), 'seconds');\n }\n};\n"]} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 6718539..81c9f4b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -104,16 +104,18 @@ _commander2.default.command('log ').description('Logs the time of the EXEC = true; }); -_commander2.default.command('export [task_string]').description('Export the tasks in json (default) or md format').alias('e').option('-f --format [format]').option('-s --start [start date. Example: "2017/05/28"]').option('-e --end [end date. Example: "2018/05/28"]').action(function (key, options) { +_commander2.default.command('export [task_string]').description('Export the tasks in json (default) or md format').alias('e').option('-f --format [format]').option('-s --start [start date. Example: "2017/05/28"]').option('-e --end [end date. Example: "2018/05/28"]').option('-x --expanded [You want to see all timings for a task.]').action(function (key, options) { switch (options.format ? options.format.toLowerCase() : undefined) { - case "json":case undefined: + case 'json': + case undefined: console.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4)); break; - case "markdown":case "md": - console.log(manager.getTasksMd(key, options.start, options.end)); + case 'markdown': + case 'md': + console.log(manager.getTasksMd(key, options.start, options.end, options.expanded)); break; default: - console.log("Format not supported"); + console.log('Format not supported'); } EXEC = true; }); diff --git a/lib/index.js.map b/lib/index.js.map index 137a7b0..79788c7 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","options","format","toLowerCase","undefined","console","log","JSON","stringify","getTasksJson","start","end","getTasksMd","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill'\n\nimport program from 'commander'\nimport updateNotifier from 'update-notifier'\nimport Configstore from 'configstore'\nimport pkg from '../package.json'\n\nimport Manager from './core/Manager'\nimport { humanParseDiff } from './core/utils'\nimport { outputVertical, cliError, outputConfig } from './core/output'\n\nimport autocomplete from './autocomplete'\n\nconst config = new Configstore(pkg.name, {\n tasks:{},\n config:{\n 'format.output': 'DD/MM'\n }\n})\n\nupdateNotifier({ pkg }).notify()\n\nconst manager = new Manager(config)\nautocomplete(config)\n\n//Exec\nlet EXEC = false\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db')\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.startTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key)\n EXEC = true\n })\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key)\n EXEC = true\n })\n\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = (description) ? Array.isArray(description) ? description.join(' ') : description : null\n manager.stopTask(key, description)\n EXEC = true\n })\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text\n manager.addDescription(key, text)\n EXEC = true\n })\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime)\n manager.sumarize(key, manager.search(key), false)\n EXEC = true\n })\n\nprogram\n .command('report [task_string] [rate]')\n .description('Report time of the tasks, empty for select all tasks. Can pass a rate (1h).')\n .alias('r')\n .action(function(tasks, rate) {\n tasks = (tasks) ? tasks : 'all'\n manager.sumarize(tasks, rate)\n EXEC = true\n })\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)))\n process.stdout.write(text)\n process.stdout.moveCursor(0,-2)\n }, 1000)\n EXEC = true\n })\n\nprogram\n .command('export [task_string]')\n .description('Export the tasks in json (default) or md format')\n .alias('e')\n .option('-f --format [format]')\n .option('-s --start [start date. Example: \"2017/05/28\"]')\n .option('-e --end [end date. Example: \"2018/05/28\"]')\n .action(function(key, options) {\n\t\tswitch (options.format ? options.format.toLowerCase() : undefined){\n\t\t\tcase \"json\": case undefined:\n\t\t\t\tconsole.log(JSON.stringify(manager.getTasksJson(key, options.start, options.end), null, 4))\n\t\t\t\tbreak\n\t\t\tcase \"markdown\": case \"md\":\n\t\t\t\tconsole.log(manager.getTasksMd(key, options.start, options.end))\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tconsole.log(\"Format not supported\")\n\t\t}\n EXEC = true\n })\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = (string) ? string : 'all'\n manager.delete(string)\n EXEC = true\n })\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value)\n EXEC = true\n })\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig())\n EXEC = true\n })\n\nprogram\n .parse(process.argv)\n\n\nif (program.updateDB) {\n manager.update()\n EXEC = true\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.')\n program.outputHelp()\n process.exit(1)\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["config","name","tasks","pkg","notify","manager","EXEC","version","description","option","command","alias","action","key","Array","isArray","join","startTask","pauseTask","unpauseTask","stopTask","text","addDescription","stringTime","modifyTask","sumarize","search","rate","setInterval","getTime","process","stdout","write","moveCursor","options","format","toLowerCase","undefined","console","log","JSON","stringify","getTasksJson","start","end","getTasksMd","expanded","string","delete","value","configure","getConfig","parse","argv","updateDB","update","outputHelp","exit"],"mappings":"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","file":"index.js","sourcesContent":["import 'babel-polyfill';\n\nimport program from 'commander';\nimport updateNotifier from 'update-notifier';\nimport Configstore from 'configstore';\nimport pkg from '../package.json';\n\nimport Manager from './core/Manager';\nimport { humanParseDiff } from './core/utils';\nimport { outputVertical, cliError, outputConfig } from './core/output';\n\nimport autocomplete from './autocomplete';\n\nconst config = new Configstore(pkg.name, {\n tasks: {},\n config: {\n 'format.output': 'DD/MM'\n }\n});\n\nupdateNotifier({ pkg }).notify();\n\nconst manager = new Manager(config);\nautocomplete(config);\n\n//Exec\nlet EXEC = false;\n\nprogram\n .version(pkg.version)\n .description('Tiny time tracker for projects')\n .option('--updateDB', 'Bool to update the db');\n\nprogram\n .command('start [description]')\n .description('Start task with a description.')\n .alias('s')\n .action(function(key, description) {\n description = description\n ? Array.isArray(description) ? description.join(' ') : description\n : null;\n manager.startTask(key, description);\n EXEC = true;\n });\n\nprogram\n .command('pause ')\n .description('Pause task')\n .alias('p')\n .action(function(key) {\n manager.pauseTask(key);\n EXEC = true;\n });\n\nprogram\n .command('unpause ')\n .description('Unpause task')\n .alias('up')\n .action(function(key) {\n manager.unpauseTask(key);\n EXEC = true;\n });\n\nprogram\n .command('finish [description]')\n .description('Stop task, you can add a description')\n .alias('f')\n .action(function(key, description) {\n description = description\n ? Array.isArray(description) ? description.join(' ') : description\n : null;\n manager.stopTask(key, description);\n EXEC = true;\n });\n\nprogram\n .command('description ')\n .description('Add description to your task.')\n .alias('d')\n .action(function(key, text) {\n text = Array.isArray(text) ? text.join(' ') : text;\n manager.addDescription(key, text);\n EXEC = true;\n });\n\nprogram\n .command('add ')\n .description('Adds time to a task. Example: \"1h2m3s\"')\n .action(function(key, stringTime) {\n manager.modifyTask('add', key, stringTime);\n manager.sumarize(key, manager.search(key), false);\n EXEC = true;\n });\n\nprogram\n .command('subtract ')\n .description('Subtract time to a task. Example: \"1h2m3s\"')\n .alias('sub')\n .action(function(key, stringTime) {\n manager.modifyTask('subtract', key, stringTime);\n manager.sumarize(key, manager.search(key), false);\n EXEC = true;\n });\n\nprogram\n .command('report [task_string] [rate]')\n .description(\n 'Report time of the tasks, empty for select all tasks. Can pass a rate (1h).'\n )\n .alias('r')\n .action(function(tasks, rate) {\n tasks = tasks ? tasks : 'all';\n manager.sumarize(tasks, rate);\n EXEC = true;\n });\n\nprogram\n .command('log ')\n .description('Logs the time of the task')\n .alias('l')\n .action(function(key) {\n setInterval(() => {\n let text = outputVertical('Task:', key, humanParseDiff(manager.getTime(key)));\n process.stdout.write(text);\n process.stdout.moveCursor(0, -2);\n }, 1000);\n EXEC = true;\n });\n\nprogram\n .command('export [task_string]')\n .description('Export the tasks in json (default) or md format')\n .alias('e')\n .option('-f --format [format]')\n .option('-s --start [start date. Example: \"2017/05/28\"]')\n .option('-e --end [end date. Example: \"2018/05/28\"]')\n .option('-x --expanded [You want to see all timings for a task.]')\n .action(function(key, options) {\n switch (options.format ? options.format.toLowerCase() : undefined) {\n case 'json':\n case undefined:\n console.log(\n JSON.stringify(\n manager.getTasksJson(key, options.start, options.end),\n null,\n 4\n )\n );\n break;\n case 'markdown':\n case 'md':\n console.log(\n manager.getTasksMd(key, options.start, options.end, options.expanded)\n );\n break;\n default:\n console.log('Format not supported');\n }\n EXEC = true;\n });\n\nprogram\n .command('delete [task_string]')\n .description('Remove tasks from the list. Empty for select all tasks')\n .alias('del')\n .action(function(string) {\n string = string ? string : 'all';\n manager.delete(string);\n EXEC = true;\n });\n\nprogram\n .command('configure ')\n .description('Configure the value of the config passing a key')\n .action(function(key, value) {\n manager.configure(key, value);\n EXEC = true;\n });\n\nprogram\n .command('configuration')\n .description('Output configuration')\n .action(function(string) {\n outputConfig(manager.getConfig());\n EXEC = true;\n });\n\nprogram.parse(process.argv);\n\nif (program.updateDB) {\n manager.update();\n EXEC = true;\n}\n\nif (!EXEC) {\n cliError('You must use a valid command.');\n program.outputHelp();\n process.exit(1);\n}\n"]} \ No newline at end of file From 7ddadee713a4d85b93e98690ef38502cb222e55c Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:38:05 +0800 Subject: [PATCH 49/51] Updates on Readme --- README.md | 190 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 172 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d589363..83c62b2 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,13 @@ ``` npm install -g time-tracker-cli ``` + or + ``` yarn global add time-tracker-cli ``` + Now you can start to call `timer`command ## Usage @@ -26,7 +29,16 @@ Now you can start to call `timer`command ``` └┘#! timer -Usage: timer [options] [command] + Usage: timer [options] [command] + + Tiny time tracker for projects + + + Options: + + -V, --version output the version number + --updateDB Bool to update the db + -h, --help output usage information Commands: @@ -39,39 +51,39 @@ Usage: timer [options] [command] add Adds time to a task. Example: "1h2m3s" subtract|sub Subtract time to a task. Example: "1h2m3s" report|r [task_string] [rate] Report time of the tasks, empty for select all tasks. Can pass a rate (1h). - log|l Logs the time of the task - export|e Export the tasks in a JSON + log|l Logs the time of the task + export|e [options] [task_string] Export the tasks in json (default) or md format delete|del [task_string] Remove tasks from the list. Empty for select all tasks configure Configure the value of the config passing a key configuration Output configuration - - Tiny time tracker for projects - - Options: - - -h, --help output usage information - -V, --version output the version number - --updateDB Update the db if its neccesary ``` -- To start a task run: +* To start a task run: + ``` $ timer start ``` -- To finish a task run: + +* To finish a task run: + ``` $ timer finish ``` -- You can add a description adding: + +* You can add a description adding: + ``` $ timer description ``` -- You can also see the timer running: + +* You can also see the timer running: + ``` $ timer log ``` ## How it works + The data are stored inside ~/.config/time-tracker-cli.json The config need to be updated if you have the 1.x to the 2.x to do that, to update config run timer --updateDB If you open you should see: @@ -128,19 +140,161 @@ If you open you should see: } ``` +## Method + +### Start (start|s) + +Start a new task. + +``` +$ timer start +``` + +### Pause (pause|p) + +Pause a task + +``` +$ timer pause +$ timer p +``` + +### Unpause (unpause|up) + +Unpause a task + +``` +$ timer unpause +$ timer up +``` + +### Finish (finish|f) + +Stop a task, also can add a description + +``` +$ timer finish +``` + +### Description (description|d) + +Add a description to the task + +``` +$ timer description +$ timer d +``` + +### Add (add) + +Add time to the task selected + +``` +$ timer add +$ timer add 1h2m3s +``` + +### Subtract (subtract|sub) + +Subtract time to the task selected + +``` +$ timer subtract +$ timer sub +$ timer subtract 1h2m3s +$ timer sub 1h2m3s +``` + +### Report (report|r) + +This method outputs via cli a table. Some examples: + +``` +$ timer report +$ timer r -f md +$ timer r -f markdown +$ timer r -f markdown > report.md +$ timer r -f md > report.md +$ timer r > report.json +$ timer export +$ timer r -f md +$ timer r -f markdown +$ timer r -f markdown > report.md +$ timer r -f md > report.md +$ timer r > report.json +``` + +### Log (log|l) + +log|l Logs the time of the task + +### Export (export|e) + +This method output a json or markdown with all the tasks or all the selected tasks. + +Options: + +* -f --format: define the format (default is json). Ex. json|markdown|md +* -s --start: filter by start date. Ex. 2017/05/28 +* -e --end: filter by start date. Ex. 2017/05/28 +* -x --expanded: If you have mutiple days in a task, expands shows this as a independant entry on the table. Default is false + +In 2.5.0 its included an export option that has json and markdown as valid outputs, this are some examples: + +``` +$ timer export +$ timer e -f md +$ timer e -f markdown +$ timer e -f markdown > report.md +$ timer e -f md > report.md +$ timer e > report.json +$ timer export +$ timer e -f md +$ timer e -f markdown +$ timer e -f markdown > report.md +$ timer e -f md > report.md +$ timer e > report.json +$ timer e -f md -x -e 2017/08/26 +$ timer e -f md -x -s 2017/08/26 +$ timer e -f md -e 2017/08/26 +$ timer e -f md -s 2017/08/26 +``` + +Thanks [@MarAvFe][maravfe] and [@mlndz28][mlndz28] for its contribution. + +### Delete (delete|del) + +delete|del [task_string] Remove tasks from the list. Empty for select all tasks + +### Configure (configure) + +configure Configure the value of the config passing a key + +### Configure (configure) + +configuration + ## Notes + To use the autocomplete run `timer --setupCLI` If you have the version 1.x and you want to conserve the DB, run `timer --updateDB` to update the DB to version 2.x ## Development -Run ```npm install;npm run dev``` to watch the proyect, and compile the code automatically. -Run ```npm build``` to build the module. +Run `npm install;npm run dev` to watch the proyect, and compile the code automatically. +Run `npm build` to build the module. + +## Contributors + +* [@MarAvFe][maravfe] +* [@mlndz28][mlndz28] ## License -Licensed under the MIT license. 2015 +Licensed under the MIT license. 2015 [paypal-badge]: https://img.shields.io/badge/❤%20support-paypal-blue.svg?style=flat-square [paypal-link]: https://www.paypal.me/danibram [npm-home-module]: https://www.npmjs.com/package/time-tracker-cli +[maravfe]: https://github.com/MarAvFe +[mlndz28]: https://github.com/mlndz28 From 956b06fdb45ff08324cf8373f63c41171a968714 Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:40:49 +0800 Subject: [PATCH 50/51] fix Readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 83c62b2..f0af4c5 100644 --- a/README.md +++ b/README.md @@ -226,7 +226,11 @@ $ timer r > report.json ### Log (log|l) -log|l Logs the time of the task +Log a task if you want to have the real timer on one console. + +``` +$ timer log +``` ### Export (export|e) From 512cd05117de0139de595992f5d4b82c5b9695fe Mon Sep 17 00:00:00 2001 From: Daniel Biedma Date: Mon, 26 Feb 2018 18:43:11 +0800 Subject: [PATCH 51/51] update contributors --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f0af4c5..849f1a3 100644 --- a/README.md +++ b/README.md @@ -292,6 +292,8 @@ Run `npm build` to build the module. * [@MarAvFe][maravfe] * [@mlndz28][mlndz28] +* [@RyanZim][ryanzim] +* [@kohei-takata][kohei-takata] ## License @@ -302,3 +304,5 @@ Licensed under the MIT license. 2015 [npm-home-module]: https://www.npmjs.com/package/time-tracker-cli [maravfe]: https://github.com/MarAvFe [mlndz28]: https://github.com/mlndz28 +[ryanzim]: https://github.com/RyanZim +[kohei-takata]: https://github.com/kohei-takata