1
0
Fork 0

Proof of concept CLI tool, cleanup needed

This commit is contained in:
Joe Wroten 2018-10-18 13:52:15 -05:00
parent 302e7ace4c
commit ce0554228c
3 changed files with 138 additions and 0 deletions

103
index.js Normal file
View file

@ -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();

32
package-lock.json generated Normal file
View file

@ -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=="
}
}
}

View file

@ -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_.", "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", "main": "index.js",
"scripts": { "scripts": {
"start": "node ./index.js",
"build": "npm run vendor && babel src --out-dir dist", "build": "npm run vendor && babel src --out-dir dist",
"watch": "npm run vendor && babel src --watch --out-dir dist --source-maps inline", "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", "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": { "dependencies": {
"marked": "^0.3.6", "marked": "^0.3.6",
"node-fetch": "^2.2.0",
"prompts": "^1.1.1",
"skeleton-css": "^2.0.4", "skeleton-css": "^2.0.4",
"vue": "^2.0.1", "vue": "^2.0.1",
"whatwg-fetch": "^1.0.0" "whatwg-fetch": "^1.0.0"