import { IdAttributePlugin, EleventyHtmlBasePlugin, RenderPlugin, InputPathToUrlTransformPlugin } from '@11ty/eleventy'; import syntaxHighlightPlugin from "@11ty/eleventy-plugin-syntaxhighlight"; import { feedPlugin } from "@11ty/eleventy-plugin-rss"; import eleventyNavigationPlugin from "@11ty/eleventy-navigation"; import directoryOutputPlugin from "@11ty/eleventy-plugin-directory-output"; import { eleventyImageTransformPlugin } from "@11ty/eleventy-img" import pluginWebc from "@11ty/eleventy-plugin-webc"; import { readFile } from 'node:fs/promises'; import { DateTime } from "luxon"; import htmlmin from "html-minifier-terser"; import mdAbbr from 'markdown-it-abbr'; import mdContainer from 'markdown-it-container'; import postcss from 'postcss'; import cssnano from 'cssnano'; import metadata from './data/metadata.js'; /** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */ export default async function(eleventyConfig) { eleventyConfig.addPlugin(EleventyHtmlBasePlugin); eleventyConfig.addPlugin(RenderPlugin); eleventyConfig.addPlugin(InputPathToUrlTransformPlugin); eleventyConfig.addPlugin(IdAttributePlugin); eleventyConfig.addPlugin(syntaxHighlightPlugin); eleventyConfig.addPlugin(feedPlugin, { type: "atom", outputPath: "/atom.xml", collection: { name: "post" }, stylesheet: "atom.xsl", metadata: { language: metadata.language, title: metadata.title, subtitle: metadata.description, base: metadata.url.href, author: metadata.author, } }); eleventyConfig.addPlugin(eleventyNavigationPlugin); eleventyConfig.addPlugin(directoryOutputPlugin); eleventyConfig.addPlugin(pluginWebc, { components: [ "npm:@11ty/eleventy-plugin-syntaxhighlight/*.webc", ], bundlePluginOptions: { transforms: [ async function(content) { if (this.type == 'css') { const result = await postcss([ cssnano({ preset: ['default', { discardComments: { removeAll: true, }, }] }), ]).process(content, { from: this.page.inputPath, to: null, }) return result.css } return content; } ], } }); eleventyConfig.addPassthroughCopy({ "public/": "/", }); eleventyConfig.addPlugin(eleventyImageTransformPlugin, { extensions: "html", formats: ["webp", "jpeg", "svg", "avif", "auto", "png"], widths: [128, 256, 512, 1024, "auto"], defaultAttributes: { sizes: "auto", decoding: "async", loading: "lazy" }, }); eleventyConfig.amendLibrary("md", mdLib => { mdLib.use(mdAbbr).use(mdContainer, "aside"); }); eleventyConfig.setServerPassthroughCopyBehavior("passthrough"); eleventyConfig.addFilter("readableDate", (dateObj, format, zone) => { return DateTime.fromJSDate(dateObj, { zone: zone || "utc" }).toFormat(format || "dd LLLL yyyy") }); eleventyConfig.addFilter('htmlDateString', dateObj => DateTime.fromJSDate(dateObj, { zone: 'utc' }).toFormat('yyyy-LL-dd')); eleventyConfig.addShortcode('schema', type => (type instanceof URL ? type : new URL(type, "http://schema.org/")).href); eleventyConfig.addAsyncFilter('embed', path => readFile(path, { encoding: 'utf8' })); eleventyConfig.setQuietMode(true); eleventyConfig.setDynamicPermalinks(false); eleventyConfig.addTransform("htmlmin", function(content) { if ((this.page.outputPath || "").endsWith(".html")) { let minified = htmlmin.minify(content, { useShortDoctype: true, removeComments: true, collapseWhitespace: true, }); return minified; } // If not an HTML output, return content as-is return content; }); return { markdownTemplateEngine: "njk", htmlTemplateEngine: "webc", dir: { output: "dist", input: "src", includes: "../includes", data: "../data", components: "components", } }; }