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",
}
};
}