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 `
${unescape(str)}
;` }) // Customize Markdown library settings: eleventyConfig.amendLibrary('md', (mdLib) => { mdLib.use(markdownItAnchor, { permalink: markdownItAnchor.permalink.ariaHidden({ placement: 'after', class: 'header-anchor no-underline text-xs', symbol: '🔗', ariaHidden: false, }), level: [1, 2, 3, 4], slugify: eleventyConfig.getFilter('slugify'), }) }) // Features to make your build faster (when you need them) // If your passthrough copy gets heavy and cumbersome, add this line // to emulate the file copy on the dev server. Learn more: // https://www.11ty.dev/docs/copy/#emulate-passthrough-copy-during-serve // eleventyConfig.setServerPassthroughCopyBehavior("passthrough"); return { // Control which files Eleventy will process // e.g.: *.md, *.njk, *.html, *.liquid templateFormats: ['md', 'njk', 'html', 'liquid'], // Pre-process *.md files with: (default: `liquid`) markdownTemplateEngine: 'njk', // Pre-process *.html files with: (default: `liquid`) htmlTemplateEngine: 'njk', // These are all optional: dir: { input: 'content', // default: "." includes: '../_includes', // default: "_includes" data: '../_data', // default: "_data" output: '../../dist/lander', }, // ----------------------------------------------------------------- // Optional items: // ----------------------------------------------------------------- // If your site deploys to a subdirectory, change `pathPrefix`. // Read more: https://www.11ty.dev/docs/config/#deploy-to-a-subdirectory-with-a-path-prefix // When paired with the HTML plugin https://www.11ty.dev/docs/plugins/html-base/ // it will transform any absolute URLs in your HTML to include this // folder name and does **not** affect where things go in the output folder. pathPrefix: '/', } }