const fs = require('fs'); const path = require('path'); const inquirer = require('inquirer'); const dedent = require('dedent'); const root = process.cwd(); const getAuthors = () => { const authorPath = path.join(root, 'data', 'authors'); const authorList = fs .readdirSync(authorPath) .map((filename) => path.parse(filename).name); return authorList; }; const getLayouts = () => { const layoutPath = path.join(root, 'layouts'); const layoutList = fs .readdirSync(layoutPath) .map((filename) => path.parse(filename).name) .filter((file) => file.toLowerCase().includes('post')); return layoutList; }; const genFrontMatter = (answers) => { let d = new Date(); const date = [ d.getFullYear(), ('0' + (d.getMonth() + 1)).slice(-2), ('0' + d.getDate()).slice(-2), ].join('-'); const tagArray = answers.tags.split(','); tagArray.forEach((tag, index) => (tagArray[index] = tag.trim())); const tags = "'" + tagArray.join("','") + "'"; const authorArray = answers.authors.length > 0 ? "'" + answers.authors.join("','") + "'" : ''; let frontMatter = dedent`--- title: ${answers.title ? answers.title : 'Untitled'} date: '${date}' tags: [${answers.tags ? tags : ''}] draft: ${answers.draft === 'yes' ? true : false} summary: ${answers.summary ? answers.summary : ' '} images: [] layout: ${answers.layout} canonicalUrl: ${answers.canonicalUrl} `; if (answers.authors.length > 0) { frontMatter = frontMatter + '\n' + `authors: [${authorArray}]`; } frontMatter = frontMatter + '\n---'; return frontMatter; }; inquirer .prompt([ { name: 'title', message: 'Enter post title:', type: 'input', }, { name: 'extension', message: 'Choose post extension:', type: 'list', choices: ['mdx', 'md'], }, { name: 'authors', message: 'Choose authors:', type: 'checkbox', choices: getAuthors, }, { name: 'summary', message: 'Enter post summary:', type: 'input', }, { name: 'draft', message: 'Set post as draft?', type: 'list', choices: ['yes', 'no'], }, { name: 'tags', message: 'Any Tags? Separate them with , or leave empty if no tags.', type: 'input', }, { name: 'layout', message: 'Select layout', type: 'list', choices: getLayouts, }, { name: 'canonicalUrl', message: 'Enter canonical url:', type: 'input', }, ]) .then((answers) => { // Remove special characters and replace space with - const fileName = answers.title .toLowerCase() .replace(/[^a-zA-Z0-9 ]/g, '') .replace(/ /g, '-') .replace(/-+/g, '-'); const frontMatter = genFrontMatter(answers); if (!fs.existsSync('data/blog')) fs.mkdirSync('data/blog', { recursive: true }); const filePath = `data/blog/${fileName ? fileName : 'untitled'}.${ answers.extension ? answers.extension : 'md' }`; fs.writeFile(filePath, frontMatter, { flag: 'wx' }, (err) => { if (err) { throw err; } else { console.log(`Blog post generated successfully at ${filePath}`); } }); }) .catch((error) => { if (error.isTtyError) { console.log("Prompt couldn't be rendered in the current environment"); } else { console.log('Something went wrong, sorry!'); } });