UNPKG

@compositor/gen

Version:

Compositor JSX static site generator

71 lines (60 loc) 1.85 kB
const fs = require('fs') const path = require('path') const { promisify } = require('util') const loadJSON = require('load-json-file') const matter = require('gray-matter') const readdir = promisify(fs.readdir) const readFile = promisify(fs.readFile) const getContent = async dirname => { let theme = {} let lab = { components: [] } try { theme = await loadJSON(path.join(dirname, 'theme.json')) } catch (err) { // console.log('no theme.json found') } try { lab = await loadJSON(path.join(dirname, 'lab.json')) } catch (err) { // console.log('no lab.json found') } const allFiles = await readdir(dirname) const filenames = allFiles.filter(name => !/^\./.test(name)) const jsxFilenames = filenames.filter(name => /\.jsx$/.test(name)) const mdFilenames = filenames.filter(name => /\.md/.test(name)) const contentFiles = [ ...jsxFilenames, ...mdFilenames ] const promises = contentFiles.map(getPage(dirname)) const pages = await Promise.all(promises) const withLayouts = pages.map(getLayout(pages)) return { dirname, theme, lab, pages: withLayouts } } const getPage = dirname => async filename => { const ext = path.extname(filename) const name = path.basename(filename, ext) // const raw = await readFile(path.join(dirname, filename), 'utf8') const raw = fs.readFileSync(path.join(dirname, filename), 'utf8') const { data, content } = matter(raw) return { filename, name, ext, raw, data, content, } } const getLayout = pages => page => { if (page.ext !== '.md') return page if (!page.data.layout) return page const layout = pages.find(p => p.name === page.data.layout) if (!layout) return page page.data = Object.assign({}, layout.data, page.data) page.layoutJSX = layout.content return page } module.exports = getContent