From ce0554228c2a54e548da8fd4d1307e59a9180906 Mon Sep 17 00:00:00 2001 From: Joe Wroten Date: Thu, 18 Oct 2018 13:52:15 -0500 Subject: [PATCH] Proof of concept CLI tool, cleanup needed --- index.js | 103 ++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 32 ++++++++++++++ package.json | 3 ++ 3 files changed, 138 insertions(+) create mode 100644 index.js create mode 100644 package-lock.json diff --git a/index.js b/index.js new file mode 100644 index 0000000..81a885b --- /dev/null +++ b/index.js @@ -0,0 +1,103 @@ +#!/usr/bin/env node +'use strict'; + +const prompts = require('prompts'); +const fetch = require('node-fetch'); +let suppliedWordList = process.argv[2]; + +Array.prototype.random = function() { + return this[Math.floor(Math.random() * this.length)]; +} + +const getWord = async () => { + let response = await prompts({ + type: 'list', + name: 'words', + message: 'What word would you like to base this stack on?' + }); + return response.words; +}; + +let suffixes = ['', 'JS', 'Script', '.js', '.io', 'DB']; + +let stackPhrases = { + intros: [ + 'My prefered tech stack is a', + 'I feel the best way to build ambitious apps is with a', + 'An ideal stack would be a', + 'I start off with a' + ], + toolVarieties: [ + '', + 'engine', + 'generator', + 'framework', + 'setup', + 'frontend', + 'backend', + 'library', + 'plugin' + ], + toolConnections: [ + 'powered by a', + 'controlling a', + 'alongside a', + 'integrated with a', + 'plugged into a', + 'synced to a' + ], + outros: [ + 'to build ambitious web apps.', + 'to innovate to the best of my ability.', + 'to inspire the Open Source community of makers.' + ] +}; + +function getWordsRelatedTo(word) { + return fetch('https://wt-sharpshark28-gmail_com-0.run.webtask.io/oh-i-use-backend?word=' + word) + .then(r => r.json()); +} + +async function generateStack(words) { + return Promise.all(words.map(w => getWordsRelatedTo(w))) + .then(data => { + data = data.map(d => d.hasTypes); + return [].concat.apply([], data); + }) + .then(wordsToStack); +} + +function wordsToStack(allWords) { + let stack = stackPhrases.intros.random(); + + let loopTimes = 3; + for (let i = 1; i <= loopTimes; i++) { // Add in dynamic loop length for length of stack + let techWord = wordToTechTerm(allWords.random()); + let variety = stackPhrases.toolVarieties.random(); + let connection = stackPhrases.toolConnections.random(); + let outro = stackPhrases.outros.random(); + let end = i < loopTimes ? connection : outro; + stack += ` **${techWord}** ${variety} ${end}`; + } + + return stack; +} + +function wordToTechTerm(word) { + word = word.split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)); // Capitalize each word + return word.join('') + suffixes.random(); +} + +const init = async () => { + console.log('Welcome'); + + suppliedWordList = suppliedWordList ? suppliedWordList.split(',') : await getWord(); + + console.log('Chosen word list', suppliedWordList); + + let result = await generateStack(suppliedWordList); + console.log('Result: ', result); +}; + +init(); + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..63b6f67 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,32 @@ +{ + "name": "oh-i-use", + "version": "1.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==" + }, + "node-fetch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz", + "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==" + }, + "prompts": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-1.1.1.tgz", + "integrity": "sha512-lC0+ifgWNKhTNF28Wj41TOXE+gEzrHcDqkCRHMbv39afuGT1ClekTgcVF+r2VuSgNr3Fy2hq6Pu3Mlt43u+QlQ==", + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^1.0.0" + } + }, + "sisteransi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", + "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==" + } + } +} diff --git a/package.json b/package.json index a866fde..edb2d88 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Developing Javascript web apps can be convoluted. Become that bleeding edge dev with the coolest sounding tech stack made from _randomly generated fake tool names_.", "main": "index.js", "scripts": { + "start": "node ./index.js", "build": "npm run vendor && babel src --out-dir dist", "watch": "npm run vendor && babel src --watch --out-dir dist --source-maps inline", "vendor": "mkdir -p ./vendor ./vendor/css ./vendor/js ./dist ./dist/favicon && cp -R ./src/favicon ./dist && cp -R ./node_modules/skeleton-css/css/ ./vendor/css && cp ./node_modules/vue/dist/vue.min.js ./vendor/js/vue.min.js && cp ./node_modules/whatwg-fetch/fetch.js ./vendor/js/fetch.js && cp ./node_modules/marked/marked.min.js ./vendor/js/marked.min.js", @@ -17,6 +18,8 @@ }, "dependencies": { "marked": "^0.3.6", + "node-fetch": "^2.2.0", + "prompts": "^1.1.1", "skeleton-css": "^2.0.4", "vue": "^2.0.1", "whatwg-fetch": "^1.0.0"