UNPKG

@gigsboat/cli

Version:

Do you have a boatload of speaking gigs? Use this CLI to manage them all!

131 lines (106 loc) 3.41 kB
import path from 'path' import marked from 'marked' import DebugLogger from 'debug' import { getAllFiles } from './utils/fs.js' import { convertToJson } from './utils/yaml-parser.js' import { getEventsMd, formatToMarkdown, getStatsBadges } from './utils/md-formatter.js' import { createYearBuckets, getEventsStats } from './utils/content-manager.js' import { getJsonFormat } from './utils/json-parser.js' import { writeFile } from 'fs/promises' export { formatToMarkdown, generateGigs, generateDocument } const debug = DebugLogger('gigsboat:app') async function generateDocument({ sourceDirectory, preContent, postContent }) { let markdownOutputPreContent = '' let markdownOutputPostContent = '' let document = '' const { entriesForYearMarkdown, entriesByBucket } = await generateGigs({ sourceDirectory }) const gigsJsonData = await getJsonFormat({ gigsData: entriesByBucket }) gigsJsonData.generatedAt = new Date().toISOString() await writeFile('README.json', JSON.stringify(gigsJsonData, null, 2)) if (preContent) { markdownOutputPreContent = processCustomContent({ contents: preContent }) } if (postContent) { markdownOutputPostContent = processCustomContent({ contents: postContent }) } const statsHeader = `<div align='center'>${marked.parse( getStatsBadges(entriesByBucket) )}</div> ` const currentDate = new Date().toISOString() let footer = '' if (!process.env.TEST_E2E) { footer += `*page updated on ${currentDate}*\n\n` } footer += `powered by [gigsboat/cli](https://github.com/gigsboat/cli)` document += statsHeader + markdownOutputPreContent + '\n' + entriesForYearMarkdown + '\n' + markdownOutputPostContent + '\n' + footer return document } function processCustomContent({ contents }) { let markdownContent = '' for (const content of contents) { if (content.hasOwnProperty('raw')) { markdownContent += content.raw + '\n' } if (content.hasOwnProperty('format')) { markdownContent += formatToMarkdown(content.format) + '\n' } } return markdownContent } async function generateGigs({ sourceDirectory }) { let directoryPath = path.join(process.cwd(), sourceDirectory) if (path.isAbsolute(sourceDirectory)) { debug('detected absolute path for source directory') directoryPath = sourceDirectory } const allFilesFlatList = await getAllFiles(directoryPath) const entries = [] for (const filePath of allFilesFlatList) { const json = await convertToJson(filePath) // push the relative path to the file as part of the data object let fileDirectoryPath = path.relative(directoryPath, filePath) if (!path.isAbsolute(sourceDirectory)) { fileDirectoryPath = path.join(sourceDirectory, fileDirectoryPath) } json.fileRelativePath = fileDirectoryPath entries.push(json) } const entriesByBucket = await getEntriesByBuckets(entries) const entriesForYearMarkdown = await getEventsMd( entriesByBucket.bucketsByYear ) return { entriesForYearMarkdown, entriesByBucket } } async function getEntriesByBuckets(entries) { // @TODO these buckets: // const bucketsLanguage = {} // const bucketsCountry = {} const bucketsByYear = createYearBuckets(entries) const statsTotal = getEventsStats(entries) return { bucketsByYear, stats: statsTotal } }