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/CHANGELOG.md b/CHANGELOG.md index 6638936..119b087 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,33 @@ +## [v2.3.1] - Sep 14, 2017 + +- Update dependencies + +## [v2.3.0] - Sep 14, 2017 + +- Add a manager export point + +## [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 +- Fix typo (Thanks @RyanZim) +- Fix autocomplete +- Add command to install completions +- Only completion for commands not for tasks + +## [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 +48,7 @@ [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 +[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/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. diff --git a/README.md b/README.md index 65319a2..849f1a3 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,308 @@ # Tiny Time tracker -[![NPM](https://nodei.co/npm/time-tracker-cli.png?downloads=true)](https://nodei.co/npm/time-tracker-cli/) -[![npm version](https://img.shields.io/npm/v/time-tracker-cli.svg?style=flat-square)](https://github.com/danibram/time-tracker-cli) +[![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] -[![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] +[![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://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/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] + Tiny time tracker for projects - Tiny time tracker for projects - Options: + Options: - -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 mulpitly by 20 - -e, --export Prints the json of all tasks. + -V, --version output the version number + --updateDB Bool to update the db + -h, --help output usage information + + + Commands: + + 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 [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 ``` -- To start a task run: +* To start a task run: + ``` -$ timer -s -d +$ timer start ``` -- To finish a task run: + +* To finish a task run: + ``` -$ timer -s -d +$ timer finish ``` -- You can add a description adding: + +* You can add a description adding: + ``` -$ timer -s -d -$ timer -h -d +$ timer description ``` -- You can also see the timer running: + +* 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. +## 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 a task if you want to have the real timer on one console. + +``` +$ timer log +``` + +### 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] +* [@RyanZim][ryanzim] +* [@kohei-takata][kohei-takata] ## 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 +[ryanzim]: https://github.com/RyanZim +[kohei-takata]: https://github.com/kohei-takata 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/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 b/lib/Utils.js deleted file mode 100644 index 57458f7..0000000 --- a/lib/Utils.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var recognizeModifierTiming = exports.recognizeModifierTiming = function recognizeModifierTiming(string) { - var r = /(\d{1,})([hms])/g; - var arr = undefined; - var res = []; - while ((arr = r.exec(string)) !== null) { - res.push({ - value: arr[1], - momentKey: arr[2] - }); - } - return res; -}; - -var calcRate = exports.calcRate = function calcRate(rate, total) { - var amount = undefined; - var mod = rate.substr(rate.length - 1); - var value = rate.slice(0, rate.length - 1); - - switch (mod) { - case 'h': - amount = total / 60 / 60 * parseFloat(value); - break; - case 'm': - amount = total / 60 * parseFloat(value); - break; - case 's': - amount = total * parseFloat(value); - break; - } - - return amount.toFixed(2); -}; - -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; -}; -//# sourceMappingURL=Utils.js.map \ 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..32763c8 --- /dev/null +++ b/lib/autocomplete.js @@ -0,0 +1,47 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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) { + var taskKeys = Object.keys(config.all.tasks); + + var complete = (0, _omelette2.default)('timer '); + + complete.on("action", function (_ref) { + var reply = _ref.reply; + + 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) { + reply(taskKeys); + } else if (before === 'configure') { + reply(_constants.configElements); + } + }); + + 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..0589ef9 --- /dev/null +++ b/lib/autocomplete.js.map @@ -0,0 +1 @@ +{"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/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..64048e4 --- /dev/null +++ b/lib/core/Manager.js @@ -0,0 +1,268 @@ +'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 _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; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Manager = function () { + function Manager(cfg) { + _classCallCheck(this, Manager); + + this.repositories = ['tasks', 'config']; + + this.cfg = cfg; + this.tasks = cfg.all.tasks; + this.config = cfg.all.config ? cfg.all.config : {}; + } + + _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 _this = this; + + var t = this.getTask(key); + t.start(description).then(function () { + _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 _this2 = this; + + var t = this.getTask(key); + t.pause().then(function () { + _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 _this3 = this; + + var t = this.getTask(key); + t.unpause().then(function () { + _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 _this4 = this; + + var t = this.getTask(key); + t.stop(description).then(function () { + _this4.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 _this5 = this; + + var t = this.getTask(name); + t.makeOperationOverTime(operation, stringTime).then(function () { + _this5.storeTask(name, t); + }, _output.cliError).catch(_output.cliError); + } + }, { + key: 'search', + 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) { + if (string === 'all' || key.indexOf(string) > -1) { + tasks.push({ + name: 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(key) { + return _flat2.default.unflatten(key ? this.tasks[key] : this.tasks); + } + }, { + key: 'getTasksMd', + value: function getTasksMd(key, start, end, expanded) { + var tasks = void 0; + if (key) { + tasks = this.search(key); + } else { + tasks = this.search(); + } + + tasks.map(function (task) { + if (start || end) { + task = task.task.filterByDates(start, end); + } + return task; + }); + + return (0, _output.markdown)(tasks, expanded); + } + }, { + key: 'getConfig', + value: function getConfig() { + return this.config; + } + }, { + 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() + ' '); + } + + var newCfg = _defineProperty({}, element, value); + + this.config = Object.assign({}, this.config, newCfg); + this.cfg.set('config', this.config); + + return this.config; + } + }, { + 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', + value: function sumarize(key, rate) { + 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']); + } + }]); + + 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..0c463f8 --- /dev/null +++ b/lib/core/Manager.js.map @@ -0,0 +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","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 new file mode 100644 index 0000000..009d525 --- /dev/null +++ b/lib/core/Task.js @@ -0,0 +1,287 @@ +'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'); + +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"); } } + +var Task = function () { + function Task(task) { + _classCallCheck(this, Task); + + this.task = task ? task : { + description: '', + timings: [] + }; + this.filtered = false; + } + + _createClass(Task, [{ + 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: 'description', + value: function description() { + return this.task.description; + } + }, { + 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: '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 duration = 0; + + if (this.task.timings) { + this.task.timings.forEach(function (timing) { + duration += (0, _utils.getSeconds)(timing); + }); + } else { + duration = (0, _utils.getSeconds)(this.task); + } + + return duration; + } + }, { + key: 'getStartDate', + value: function getStartDate() { + if (this.task.timings && this.task.timings[0]) { + return this.task.timings[0].start; + } else { + 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) { + 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..c2da4aa --- /dev/null +++ b/lib/core/Task.js.map @@ -0,0 +1 @@ +{"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":"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","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/constants.js b/lib/core/constants.js new file mode 100644 index 0000000..0cef4a4 --- /dev/null +++ b/lib/core/constants.js @@ -0,0 +1,12 @@ +'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'; +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 new file mode 100644 index 0000000..a4ab00c --- /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","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 new file mode 100644 index 0000000..77dcd8b --- /dev/null +++ b/lib/core/output.js @@ -0,0 +1,185 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.markdown = exports.cliSuccess = exports.cliError = exports.outputVertical = exports.outputConfig = exports.sumarize = undefined; + +var _moment = require('moment'); + +var _moment2 = _interopRequireDefault(_moment); + +var _cliTable = require('cli-table2'); + +var _cliTable2 = _interopRequireDefault(_cliTable); + +var _colors = require('colors'); + +var _colors2 = _interopRequireDefault(_colors); + +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: ['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': '╢' + }, + style: { head: ['green'] } + }); + var total = 0; + var head = 'Search: ' + search + ' \n'; + + tasks.forEach(function (task, index) { + var description = task.task.description() && task.task.description() !== '' ? task.task.description() : '-'; + var name = task.name; + task = task.task; + + var duration = task.getSeconds(); + total += 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) { + 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)]); + } 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' }], []); + } + } + + console.log(table.toString()); +}; + +var outputConfig = exports.outputConfig = function outputConfig(config) { + var table = new _cliTable2.default({ + head: ['Key', 'value'], + 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'] } + }); + + 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.error(_colors2.default.red('Error: ' + 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 new file mode 100644 index 0000000..aa0e112 --- /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","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 new file mode 100644 index 0000000..1041efc --- /dev/null +++ b/lib/core/utils.js @@ -0,0 +1,92 @@ +'use strict'; + +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; + var res = []; + while ((arr = r.exec(string)) !== null) { + res.push({ + value: arr[1], + momentKey: arr[2] + }); + } + + return res; +}; + +var calcRate = exports.calcRate = function calcRate(rate, total) { + var amount = void 0; + var mod = rate.substr(rate.length - 1); + var value = rate.slice(0, rate.length - 1); + + switch (mod) { + case 'h': + amount = total / 60 / 60 * parseFloat(value); + break; + case 'm': + amount = total / 60 * parseFloat(value); + break; + case 's': + amount = total * parseFloat(value); + break; + } + + return amount.toFixed(2); +}; + +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 ? '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; +}; + +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 new file mode 100644 index 0000000..f0fe51b --- /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","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/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/lib/index.js b/lib/index.js index d2a9417..81c9f4b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -10,53 +10,142 @@ 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' + } +}); + (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').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; + 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) { + description = description ? Array.isArray(description) ? description.join(' ') : description : null; + 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('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 [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; +}); + +_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 [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: + 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; +}); + +_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.updateDB) { + manager.update(); + EXEC = true; +} + +if (!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..79788c7 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","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 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 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/package.json b/package.json index f186bd1..8e502cf 100644 --- a/package.json +++ b/package.json @@ -1,48 +1,50 @@ { - "name": "time-tracker-cli", - "version": "1.1.2", - "description": "Tiny time tracker", - "keywords":[ - "time", - "tracker", - "timer", - "cli", - "time log", - "time logger", - "logger" - ], - "bin": { - "timer": "./bin/timer" - }, - "main": "./lib", - "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-cli" - }, - "author": "Daniel Biedma ", - "license": "ISC", - "devDependencies": { - "babel": "^6.3.26", - "babel-cli": "^6.4.0", - "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" - }, - "dependencies": { - "babel-polyfill": "^6.3.14", - "cli-table": "^0.3.1", - "commander": "^2.9.0", - "configstore": "^1.4.0", - "flat": "^2.0.0", - "moment": "^2.11.2", - "update-notifier": "^0.6.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/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/Utils.js b/src/Utils.js deleted file mode 100644 index 838b748..0000000 --- a/src/Utils.js +++ /dev/null @@ -1,42 +0,0 @@ -export const recognizeModifierTiming = function (string){ - let r = /(\d{1,})([hms])/g - let arr - let res = [] - while ((arr = r.exec(string)) !== null) { - res.push({ - value: arr[1], - momentKey: arr[2] - }) - } - return res -} - -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; - case 'm': - amount = (total/60)*parseFloat(value) - break; - case 's': - 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 ? '' : (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/__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..835c272 --- /dev/null +++ b/src/autocomplete.js @@ -0,0 +1,53 @@ +import omelette from 'omelette' +import { configElements } from './core/constants' + +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' + ] + + if (keyTasks.indexOf(before) > -1) { + reply(taskKeys) + } else if (before === 'configure') { + reply(configElements) + } + }) + + 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..2ef3d1c --- /dev/null +++ b/src/core/Manager.js @@ -0,0 +1,258 @@ +import flat from 'flat' +import moment from 'moment' +import inquirer from 'inquirer' + +import Task from './Task' +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 : {} + } + + 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 = 'all') { + 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 + } + + 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(key) { + return flat.unflatten(key ? this.tasks[key] : this.tasks) + } + + getTasksMd(key, start, end, expanded) { + let tasks + if (key) { + tasks = this.search(key) + } else { + tasks = this.search() + } + + tasks.map(task => { + if (start || end) { + task = task.task.filterByDates(start, end) + } + return task + }) + + return markdown(tasks, expanded) + } + + getConfig() { + return this.config + } + + configure(element, value) { + if (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 + } + + update() { + 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)) + 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) { + 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/Task.js b/src/core/Task.js new file mode 100644 index 0000000..473e676 --- /dev/null +++ b/src/core/Task.js @@ -0,0 +1,239 @@ +import moment from 'moment' + +import { STARTED, PAUSED, IN_PROGRESS, FINISHED } from './constants' +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: [] + } + this.filtered = false + } + + _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()}`) + } + + description() { + return this.task.description + } + + 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 + } + + 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) { + this.task.timings.forEach(timing => { + duration += getSeconds(timing) + }) + } else { + duration = getSeconds(this.task) + } + + return duration + } + + getStartDate() { + if (this.task.timings && this.task.timings[0]) { + return this.task.timings[0].start + } else { + return this.task.start + } + } + + 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)}` + } +} diff --git a/src/core/constants.js b/src/core/constants.js new file mode 100644 index 0000000..80f9a57 --- /dev/null +++ b/src/core/constants.js @@ -0,0 +1,6 @@ +export const STARTED = 'STARTED' +export const PAUSED = 'PAUSED' +export const UNPAUSED = 'UNPAUSED' +export const IN_PROGRESS = 'IN_PROGRESS' +export const FINISHED = 'FINISHED' +export const configElements = ['format.output'] diff --git a/src/core/dbMigrations.js b/src/core/dbMigrations.js new file mode 100644 index 0000000..3f245b7 --- /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 new file mode 100644 index 0000000..4971edd --- /dev/null +++ b/src/core/output.js @@ -0,0 +1,200 @@ +import moment from 'moment' +import Table from 'cli-table2' +import colors from 'colors' + +import { humanParseDiff, calcRate, getSeconds } from './utils' + +export const sumarize = function(search, tasks, rate, full, format) { + let table = new Table({ + 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': '╢' + }, + style: { head: ['green'] } + }) + let total = 0 + let head = `Search: ${search} \n` + + tasks.forEach((task, index) => { + let description = + task.task.description() && task.task.description() !== '' + ? task.task.description() + : '-' + let name = task.name + task = task.task + + let duration = task.getSeconds() + total += duration + + // Avoid excesive width for proper console fit + let splitWidth = (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) { + table.push([]) + + 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)] + ) + } 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' + } + ], + [] + ) + } + } + + console.log(table.toString()) +} + +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': '╢' + }, + 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.error(colors.red(`Error: ${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 +} diff --git a/src/core/utils.js b/src/core/utils.js new file mode 100644 index 0000000..35dbb67 --- /dev/null +++ b/src/core/utils.js @@ -0,0 +1,85 @@ +import moment from 'moment' + +export const recognizeModifierTiming = function(string) { + let r = /(\d{1,})([hms])/g + let arr + let res = [] + while ((arr = r.exec(string)) !== null) { + res.push({ + value: arr[1], + momentKey: arr[2] + }) + } + + return res +} + +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 + case 'm': + amount = total / 60 * parseFloat(value) + break + case 's': + 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' + 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') + } +} diff --git a/src/exports.js b/src/exports.js new file mode 100644 index 0000000..9964cd0 --- /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) +} diff --git a/src/index.js b/src/index.js index 14cd0e4..5823c41 100644 --- a/src/index.js +++ b/src/index.js @@ -2,58 +2,207 @@ 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, outputConfig } 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' } +}) + +updateNotifier({ pkg }).notify() + +const manager = new Manager(config) +autocomplete(config) + +//Exec +let EXEC = false + +program + .version(pkg.version) + .description('Tiny time tracker for projects') + .option('--updateDB', 'Bool to update the db') + +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) { + description = description + ? Array.isArray(description) ? description.join(' ') : description + : null + 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('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 + }) + +program + .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 + }) + +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 [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: + 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 + }) + +program + .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 + }) + +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) + +if (program.updateDB) { + manager.update() + EXEC = true +} +if (!EXEC) { + cliError('You must use a valid command.') + program.outputHelp() + process.exit(1) } diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..5b5867b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2247 @@ +# 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@^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" + 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.2.1: + 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.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" + +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" + +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" + +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" + +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.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.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-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" + +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-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" + +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.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" + 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.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" + 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-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" + +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" + +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" + +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.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + dependencies: + 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" + 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"