UNPKG

fomoapp

Version:

Get the latest tech news right into your CLI

68 lines (57 loc) 1.78 kB
const axios = require("axios") const chalk = require("chalk") const link = require("terminal-link") const { fallbackLinkFormatter } = require("../utils/link") const API_URL = "https://hacker-news.firebaseio.com" const fetchTypes = { BEST: "best", TOP: "top", NEW: "new", ASK: "ask", SHOW: "show", JOBS: "jobs" } async function getStories(numOfStories, type) { const storiesIds = await _getStoriesIdsByType(type) const topXIds = storiesIds.slice(0, numOfStories) const storiesPromises = topXIds.map((id) => axios.get(`${API_URL}/v0/item/${id}.json`) ) const rawResponse = await Promise.all(storiesPromises) return rawResponse.map((story) => { const data = story.data return { id: data.id, score: data.score, date: new Date(data.time * 1000).toISOString(), title: data.title, url: data.url || `https://news.ycombinator.com/item?id=${data.id}` } }) } async function _getStoriesIdsByType(type) { const typeToUrlMap = { [fetchTypes.BEST]: "v0/beststories.json", [fetchTypes.TOP]: "v0/topstories.json", [fetchTypes.NEW]: "v0/newstories.json", [fetchTypes.ASK]: "v0/askstories.json", [fetchTypes.SHOW]: "v0/showstories.json", [fetchTypes.JOBS]: "v0/jobstories.json" } const getIdsUrl = typeToUrlMap[type] const response = await axios.get(`${API_URL}/${getIdsUrl}`) return response.data } function formatStory(story) { return `${link(chalk.green.bold(story.title), story.url, { fallback: fallbackLinkFormatter })} ${chalk.grey(`(${story.date}, score: ${story.score})`)}` } module.exports = { fetchTypes, defaultFetchType: fetchTypes.BEST, details: { name: "Hacker News", id: "hn" }, getItems: getStories, formatter: formatStory, defaultCacheTTL: 10 }