diff --git a/bin/axolemma b/bin/axolemma index 897f262..118542b 100644 --- a/bin/axolemma +++ b/bin/axolemma @@ -1,40 +1,109 @@ #!/usr/bin/env node - const cli = require('commander') const inquirer = require('inquirer') const semver = require('semver') -const {Subject} = require('rxjs') +const requiresNode = require('requires-node-version') const {bold, green, blue, red} = require('chalk') -if (semver.lt(process.version,'8.0.0')) { - console.log(red(`Axolemma supports Node ${bold('v8.0.0')} or higher.`)) - console.log(red(`You are currently using ${bold(process.version)}.`)) - return process.exit(1) -} +requiresNode('8.0.0') const {version} = require('../package.json') const ax = require('../') -const {isAlphanumeric} = require('./validation') - - +const {isAlphanumeric, isNumber} = require('./validation') -cli.version('0.1.0') +cli.version(version) cli.on('--help', () => { console.log(blue(`Type ${bold(green('axolemma'))} to start creating.`)) }) -const prompts = new Subject() -inquirer.prompt(prompts).ui.process.subscribe(console.log, console.log, function(answers){ - console.log(answers) - ax.generate(answers) // Eventually this will be done during the prompts, and user will be prompted to approve of the generated map. -}) +const {Separator} = inquirer + +const questions = [ + + /** General area metadata **/ + { + type: 'input', + name: 'areaTitle', + message: blue('What would you like to title this area?'), + validate: isAlphanumeric, + }, + { + type: 'confirm', + name: 'customizeAreaInfo', + message(answers) { + const {areaTitle = 'this area'} = answers + return blue(`Would you like to further customize ${areaTitle}? (e.g., the default mob respawn rate)`) + } + }, + { + type: 'input', + name: 'respawnTime', + message(answers) { + const {areaTitle = 'this area'} = answers + return blue(`What should the default respawn rate be for ${areaTitle}? (in seconds)`) + }, + when(answers) { + return Boolean(answers.customizeAreaInfo) + }, + validate: isNumber, + default: 60 + }, + + /** Area generation algo. input **/ + { + type: 'input', + name: 'width', + message(answers) { + const {areaTitle = 'this area'} = answers + return blue(`What is the maximum width (x coordinate) of ${areaTitle}?`); + }, + validate: isNumber, + default: 10 + }, + { + type: 'input', + name: 'height', + message(answers) { + const {areaTitle = 'this area'} = answers + return blue(`What is the maximum height (y coordinate) of ${areaTitle}?`); + }, + validate: isNumber, + default: 10 + }, + { + type: 'input', + name: 'depth', + message(answers) { + const {areaTitle = 'this area'} = answers + return blue(`What is the maximum depth (z coordinate) of ${areaTitle}?`); + }, + validate: isNumber, + default: 10, + when: false // Not supported yet. + }, + { + type: 'list', + name: 'type', + message: blue('What generation algorithm would you like to use?'), + choices: [ + new Separator('-- Mazes --'), + 'DividedMaze', + 'IceyMaze', + 'EllerMaze', + new Separator('-- Dungeons --'), + 'Digger', + 'Uniform', + 'Rogue', + new Separator('-- Other --'), + 'Arena', + 'Cellular' + ] + } +] + +inquirer.prompt(questions) + .then(console.log) + .catch(console.error) -prompts.next({ - type: 'input', - name: 'areaTitle', - message: blue('What would you like to title this area?'), - validate: isAlphanumeric, -}) -prompts.complete() diff --git a/bin/validation.js b/bin/validation.js index 6591086..2b69124 100644 --- a/bin/validation.js +++ b/bin/validation.js @@ -1,6 +1,9 @@ module.exports = { isAlphanumeric(input) { const alphanumeric = /^[0-9a-zA-Z]+$/ - return input.match(alphanumeric) + return Boolean(input.match(alphanumeric)) || 'Please enter an alphanumeric string.' + }, + isNumber(input) { + return !isNaN(parseInt(input, 10)) || 'Please enter a number.' } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f5a1ceb..f787058 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "integrity": "sha1-7D6LTp+AZPwCw6ybZfHCdb2o75I=", "dev": true }, "ansi-regex": { @@ -215,8 +215,7 @@ "chalk": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", - "dev": true, + "integrity": "sha1-Uj/iZ4rsewToBBkJKS/osXBZt5Y=", "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", @@ -226,8 +225,7 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", "requires": { "color-convert": "1.9.1" } @@ -235,14 +233,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", - "dev": true, + "integrity": "sha1-sNUzOxGE3TZmy+WqC0XFrHrBeko=", "requires": { "has-flag": "3.0.0" } @@ -291,8 +287,7 @@ "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, + "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", "requires": { "color-name": "1.1.3" } @@ -300,8 +295,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "commander": { "version": "2.11.0", @@ -489,8 +483,7 @@ "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=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { "version": "4.18.1", @@ -731,7 +724,7 @@ "external-editor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "integrity": "sha1-PQJqIbf5W1cmOH1CAKwWDTcsO0g=", "dev": true, "requires": { "chardet": "0.4.2", @@ -1207,6 +1200,11 @@ "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" + }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", @@ -1229,7 +1227,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==", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", "dev": true }, "minimatch": { @@ -1641,6 +1639,15 @@ "resolve-from": "1.0.1" } }, + "requires-node-version": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-node-version/-/requires-node-version-1.0.0.tgz", + "integrity": "sha512-8F5fsZZztaQB5ozAz9QvRqGpoyyLhw+tnlr9E7yzKZmRB8GU5fEJ7l+2773dtJ4BjhlbPiLHThLf0blvaAT5Xg==", + "requires": { + "chalk": "2.3.1", + "semver": "5.5.0" + } + }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", @@ -1710,6 +1717,14 @@ "rx-lite": "4.0.8" } }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "requires": { + "symbol-observable": "1.0.1" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -1719,8 +1734,7 @@ "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=" }, "setimmediate": { "version": "1.0.5", @@ -1878,6 +1892,11 @@ "has-flag": "2.0.0" } }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, "table": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", @@ -1920,7 +1939,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "1.0.2" diff --git a/package.json b/package.json index 4c60c3f..d20d6bb 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,10 @@ "dashify": "^1.0.0", "find-config": "^1.0.0", "js-yaml": "^3.10.0", - "rot-js": "^0.6.5" + "loglevel": "^1.6.1", + "requires-node-version": "^1.0.0", + "rot-js": "^0.6.5", + "rxjs": "^5.5.6" }, "devDependencies": { "chai": "^4.1.2",