eleventy.config.js

import util from 'util';
import fsImport from 'fs';
import childProcess from 'child_process'
import darcsConfig from './darcsconfig.js'
const exec = util.promisify(childProcess.exec);
const fs = fsImport.promises
import { getDiffsFromPatchText } from './helpers.js'
import { EleventyRenderPlugin } from "@11ty/eleventy";
import reposFunc from './_data/repos.js'
import pluginRss from '@11ty/eleventy-plugin-rss'

const repos = await reposFunc()

export default (eleventyConfig) => {
	eleventyConfig.addPlugin(EleventyRenderPlugin);

  const passthroughs = {
    "main.css": "main.css",
    "prism.js": "prism.js",
    "prism.css": "prism.css",
    "prism_dark.css": "prism_dark.css",
  }
  Object.keys(darcsConfig.repos).forEach((repoName) => {
    Object.keys(darcsConfig.repos[repoName].branches).forEach((branchName) => {
      passthroughs[`${darcsConfig.repos[repoName].branches[branchName].location}/_darcs`] = `repos/${eleventyConfig.getFilter("slugify")(repoName)}/branches/${branchName}/_darcs`
    })
  })
  eleventyConfig.addPassthroughCopy(passthroughs);

  eleventyConfig.addFilter("keys", data => Object.keys(data))

  eleventyConfig.addFilter("languageExtension", (filename, repoName) => {
    let extension = filename.split(".")
    extension = extension[extension.length - 1]
    return darcsConfig.repos[repoName].languageExtensions[extension] || extension
  })
  eleventyConfig.addFilter("jsonStringify", data => JSON.stringify(data))

  eleventyConfig.addFilter("pagesJustForBranch", (pages, repoName, branchName) => {
    return pages.filter(page => page.repoName === repoName && page.branchName === branchName)
  })

  eleventyConfig.addAsyncFilter("getReadMe", async (repoName, branchName) => {
    const res = await exec(`(cd ${darcsConfig.repos[repoName].branches[branchName].location}; darcs show contents README.md)`)
    return res.stdout
  })

  eleventyConfig.addFilter("date", (dateString) => {
    return new Date(dateString).toDateString()
  })

  eleventyConfig.addFilter("dateForRss", (dateString) => {
    return new Date(dateString).toUTCString()
  })

  eleventyConfig.addAsyncFilter("isDirectory", async(repo, branch, filename) => {
    try {
      const fileInfo = await fs.stat(`${darcsConfig.repos[repo].branches[branch].location}/${filename}`)
      return fileInfo ? fileInfo.isDirectory() : false
    }
    catch {
      return false // this can happen if a file is deleted and we're generating the
                   // site before recording the patch, so it's still trying to find
                   // all of the files in `darcs show files`.
    }
  })

  eleventyConfig.addFilter("getDirectoryContents", (repo, branch, dirPath) => {
    return repos[repo][branch].files.filter(file => file.startsWith(dirPath) && file !== dirPath)
  })

  eleventyConfig.addFilter("getRelativePath", (currentDir, fullFilePath) => {
    return fullFilePath.replace(`${currentDir}/`, "")
  })

  eleventyConfig.addAsyncFilter("getFileContents", async (repo, branch, filename) => {
    const res = await exec(`(cd ${darcsConfig.repos[repo].branches[branch].location}; darcs show contents ${filename})`)
    return res.stdout
  })

  eleventyConfig.addFilter("topLevelFilesOnly", (files) => {
    const onlyUnique = (value, index, array) => {
      return array.indexOf(value) === index;
    }

    const topLevels = files.map((file) => {
      const parts = file.split("/").filter(part => part !== ".")
      return parts[0]
    }).filter(onlyUnique)

    return topLevels
  })

  eleventyConfig.addFilter("getFileName", (filePath) => {
    const pathParts = filePath.split("/")
    return pathParts[pathParts.length - 1]
  })

  eleventyConfig.addPlugin(pluginRss)
}