diff --git a/README.md b/README.md index e6ce632..f8e535a 100644 --- a/README.md +++ b/README.md @@ -21,16 +21,19 @@ $ npm i -g linky-cli ## Usage ```sh -# Basic usage +# Basic usage (interactive) +linky + +# Basic usage (no questions asked) linky (hour|day|month|year) -u -p # Save data to file with -o -linky (hour|day|month|year) -u -p [-o ] +linky -o # Custom time period with -s (start) and -e (end) -linky (hour|day|month|year) -u -p [-s
] [-e
] +linky -s
-e
-# Show help and examples +# Show help and more examples linky --help ``` diff --git a/index.js b/index.js index f29fa43..3da1c83 100644 --- a/index.js +++ b/index.js @@ -5,12 +5,13 @@ const meow = require('meow'); const linky = require('@bokub/linky'); const chalk = require('chalk'); const display = require('./src/display'); +const inquire = require('./src/inquire'); const save = require('./src/save'); const validate = require('./src/validate'); -const cli = meow(` +const c = meow(` Usage - $ linky (hour|day|month|year) -u -p [options] + $ linky [(hour|day|month|year)] [options] Options --user -u Linky client area e-mail @@ -20,9 +21,11 @@ const cli = meow(` --end -e End of the custom time period (DD/MM/YYYY) Examples - $ linky month -u me@example.com -p password123 + $ linky + $ linky year + $ linky month -u me@example.com + $ linky day -s 24/08/2018 -e 06/09/2018 $ linky hour -u me@example.com -p password123 -o ../export/hourly-data.json - $ linky day -u me@example.com -p password123 -s 24/08/2018 -e 06/09/2018 `, { description: false, flags: { @@ -34,7 +37,28 @@ const cli = meow(` } }); -async function main(i) { +main(c).catch(err => { + console.error(chalk.red(err)); + process.exit(1); +}); + +async function main(cli) { + await inquire(cli); + + const validationResult = validate(cli); + if (validationResult.error) { + console.error(chalk.red(validationResult.message)); + cli.showHelp(); + process.exit(1); + } + + const data = await getData(cli); + await save(data, cli.flags.output); + + display(data); +} + +async function getData(i) { const session = await linky.login(i.flags.user, i.flags.password); let data; switch (i.input[0]) { @@ -55,17 +79,3 @@ async function main(i) { } return data; } - -const validationResult = validate(cli); -if (validationResult.error) { - console.error(chalk.red(validationResult.message)); - cli.showHelp(); -} - -main(cli).then(data => { - save(data, cli.flags.output); - display(data); -}).catch(err => { - console.error(chalk.red(err)); - process.exit(1); -}); diff --git a/package-lock.json b/package-lock.json index fa992f7..51bc904 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,16 +83,14 @@ } }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", @@ -385,8 +383,7 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "ci-info": { "version": "1.6.0", @@ -442,7 +439,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -450,8 +446,7 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "collection-visit": { "version": "1.0.0", @@ -1241,7 +1236,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -1355,7 +1349,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -1659,7 +1652,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -1716,10 +1708,9 @@ "dev": true }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", - "dev": true, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", @@ -1732,8 +1723,23 @@ "run-async": "^2.2.0", "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "requires": { + "ansi-regex": "^4.0.0" + } + } } }, "irregular-plurals": { @@ -1849,8 +1855,7 @@ "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=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-get-set-prop": { "version": "1.0.0", @@ -1973,8 +1978,7 @@ "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-proto-prop": { "version": "1.0.1", @@ -2166,8 +2170,7 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash.camelcase": { "version": "4.3.0", @@ -2388,8 +2391,7 @@ "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==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimatch": { "version": "3.0.4", @@ -2468,8 +2470,7 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nanomatch": { "version": "1.2.13", @@ -2596,7 +2597,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -2638,8 +2638,7 @@ "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=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { "version": "1.0.0", @@ -3063,7 +3062,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -3088,7 +3086,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "^2.1.0" } @@ -3097,7 +3094,6 @@ "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -3120,8 +3116,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { "version": "5.6.0", @@ -3413,7 +3408,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -3423,7 +3417,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -3493,9 +3486,8 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "timed-out": { "version": "4.0.1", @@ -3507,7 +3499,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -3570,8 +3561,7 @@ "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "type-check": { "version": "0.3.2", diff --git a/package.json b/package.json index 4cca786..120c62e 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "dependencies": { "@bokub/linky": "^0.1.0", "chalk": "^2.4.1", + "inquirer": "^6.2.1", "joi": "^14.0.6", "joi-date-extensions": "^1.2.0", "meow": "^5.0.0", diff --git a/src/inquire.js b/src/inquire.js new file mode 100644 index 0000000..0a97321 --- /dev/null +++ b/src/inquire.js @@ -0,0 +1,35 @@ +const inquirer = require('inquirer'); + +module.exports = async cli => { + // Inquire step duration + if (cli.input.length === 0) { + const answers = await inquirer.prompt([{ + type: 'list', + name: 'interval', + message: 'Select an step duration', + choices: [{value: 'hour', name: 'hour (actually 30 minutes)'}, 'day', 'month', 'year'] + }]); + cli.input = [answers.interval]; + } + + // Inquire user + if (!cli.flags.hasOwnProperty('user')) { + const answers = await inquirer.prompt([{ + type: 'input', + name: 'user', + message: 'What is your client area e-mail?' + }]); + cli.flags.user = answers.user; + } + + // Inquire password + if (!cli.flags.hasOwnProperty('password')) { + const answers = await inquirer.prompt([{ + type: 'password', + name: 'password', + message: 'What is your client area password?' + }]); + cli.flags.password = answers.password; + } + return cli; +}; diff --git a/src/save.js b/src/save.js index a22795f..ba44693 100644 --- a/src/save.js +++ b/src/save.js @@ -2,9 +2,9 @@ const fs = require('fs'); const getDirName = require('path').dirname; const mkdirp = require('mkdirp'); -module.exports = (data, path) => { +module.exports = async (data, path) => { if (path) { - mkdirp.sync(getDirName(path)); + await mkdirp(getDirName(path)); fs.writeFileSync(path, JSON.stringify(data, null, 2)); } };