const { DateTime } = require('luxon') const markdownItAnchor = require('markdown-it-anchor') const postcss = require('postcss') const tailwindcss = require('tailwindcss') const autoprefixer = require('autoprefixer') const util = require('util') const pluginRss = require('@11ty/eleventy-plugin-rss') const pluginSyntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight') const pluginBundle = require('@11ty/eleventy-plugin-bundle') const pluginNavigation = require('@11ty/eleventy-navigation') const { EleventyHtmlBasePlugin } = require('@11ty/eleventy') const pluginDrafts = require('./eleventy.config.drafts.js') const pluginImages = require('./eleventy.config.images.js') module.exports = function (eleventyConfig) { // Copy the contents of the `public` folder to the output folder // For example, `./public/css/` ends up in `_site/css/` eleventyConfig.addPassthroughCopy({ './public/': '/', }) eleventyConfig.addNunjucksAsyncFilter('postcss', (cssCode, done) => { postcss([tailwindcss(require('./tailwind.config.js')), autoprefixer()]) .process(cssCode) .then( (r) => done(null, r.css), (e) => done(e, null), ) }) eleventyConfig.addWatchTarget('styles/**/*.css') // Run Eleventy when these files change: // https://www.11ty.dev/docs/watch-serve/#add-your-own-watch-targets // Watch content images for the image pipeline. eleventyConfig.addWatchTarget('content/**/*.{svg,webp,png,jpeg}') // App plugins eleventyConfig.addPlugin(pluginDrafts) eleventyConfig.addPlugin(pluginImages) // Official plugins eleventyConfig.addPlugin(pluginRss) eleventyConfig.addPlugin(pluginSyntaxHighlight, { preAttributes: { tabindex: 0 }, }) eleventyConfig.addPlugin(pluginNavigation) eleventyConfig.addPlugin(EleventyHtmlBasePlugin) eleventyConfig.addPlugin(pluginBundle) // Filters eleventyConfig.addFilter('readableDate', (dateObj, format, zone) => { // Formatting tokens for Luxon: https://moment.github.io/luxon/#/formatting?id=table-of-tokens return DateTime.fromJSDate(dateObj, { zone: zone || 'utc' }).toFormat( format || 'dd LLLL yyyy', ) }) eleventyConfig.addFilter('htmlDateString', (dateObj) => { // dateObj input: https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string return DateTime.fromJSDate(dateObj, { zone: 'utc' }).toFormat('yyyy-LL-dd') }) // Get the first `n` elements of a collection. eleventyConfig.addFilter('head', (array, n) => { if (!Array.isArray(array) || array.length === 0) { return [] } if (n < 0) { return array.slice(n) } return array.slice(0, n) }) // Return the smallest number argument eleventyConfig.addFilter('min', (...numbers) => { return Math.min.apply(null, numbers) }) // Return all the tags used in a collection eleventyConfig.addFilter('getAllTags', (collection) => { let tagSet = new Set() for (let item of collection) { ;(item.data.tags || []).forEach((tag) => tagSet.add(tag)) } return Array.from(tagSet) }) eleventyConfig.addFilter('filterTagList', function filterTagList(tags) { return (tags || []).filter( (tag) => ['all', 'nav', 'post', 'posts'].indexOf(tag) === -1, ) }) eleventyConfig.addFilter('console', function (value) { const str = util.inspect(value) return `