1
0
Fork 0
oh-i-use/dist/app.js
2016-10-06 21:58:16 -05:00

92 lines
No EOL
2.9 KiB
JavaScript

'use strict';
Array.prototype.random = function () {
return this[Math.floor(Math.random() * this.length)];
};
var defaultWordThemes = ['candy', 'coffee', 'speed', 'liquor', 'facial hair'];
var defaultHowManyWords = 3;
var suffixes = ['', 'JS', 'Script', '.js', '.io', 'DB'];
var 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.']
};
var app = new Vue({
el: '#app',
data: {
loading: true,
stack: '',
defaultWordThemes: defaultWordThemes,
wordThemes: defaultWordThemes,
howManyWords: defaultHowManyWords
},
computed: {
stackMarkdown: function stackMarkdown() {
return marked(this.stack, { sanitize: true });
},
validSettings: function validSettings() {
return this.wordThemes.length && this.howManyWords > 0;
}
},
methods: {
newStack: function newStack() {
var _this = this;
ga('send', 'event', 'UI', 'button', 'Generate Stack');
this.loading = true;
this.stack = generateStack().then(function (stack) {
_this.loading = false;
_this.stack = stack;
}).catch(function (e) {
_this.loading = false;
_this.stack = 'Uhoh! There was a problem generating a silly tech stack. Most likely we have hit our API limit for the month. Hang in there!';
});
}
}
});
app.newStack(); // Fire off a new stack request on load
function generateStack() {
return Promise.all(app.wordThemes.map(function (w) {
return getWordsRelatedTo(w);
})).then(function (data) {
data = data.map(function (d) {
return d.hasTypes;
});
return [].concat.apply([], data);
}).then(wordsToStack);
}
function getWordsRelatedTo(word) {
return fetch('https://wt-sharpshark28-gmail_com-0.run.webtask.io/oh-i-use-backend?word=' + word).then(function (r) {
return r.json();
});
}
function wordsToStack(allWords) {
var stack = stackPhrases.intros.random();
for (var i = 1; i <= app.howManyWords; i++) {
var techWord = wordToTechTerm(allWords.random());
var variety = stackPhrases.toolVarieties.random();
var connection = stackPhrases.toolConnections.random();
var outro = stackPhrases.outros.random();
var end = i < app.howManyWords ? connection : outro;
stack += ' **' + techWord + '** ' + variety + ' ' + end;
}
return stack;
}
function wordToTechTerm(word) {
word = word.split(' ').map(function (word) {
return word.charAt(0).toUpperCase() + word.slice(1);
}); // Capitalize each word
return word.join('') + suffixes.random();
}