// HTML minification const htmlmin = require("html-minifier"); // CSS minification const CleanCSS = require("clean-css"); // JS minification const { minify } = require("terser"); // Navigation const eleventyNavigationPlugin = require("@11ty/eleventy-navigation"); // Start Eleventy Configuration module.exports = function (eleventyConfig) { eleventyConfig.addTransform("htmlmin", function (content, outputPath) { if (outputPath && outputPath.endsWith(".html")) { let minified = htmlmin.minify(content, { useShortDoctype: true, removeComments: true, collapseWhitespace: true, }); return minified; } return content; }); eleventyConfig.addFilter("cssmin", function (code) { return new CleanCSS({}).minify(code).styles; }); eleventyConfig.addNunjucksAsyncFilter( "jsmin", async function (code, callback) { try { const minified = await minify(code); callback(null, minified.code); } catch (err) { console.error("Terser error: ", err); // Fail gracefully. callback(null, code); } }, ); eleventyConfig.addPlugin(eleventyNavigationPlugin); eleventyConfig.addPassthroughCopy("src/img"); eleventyConfig.addPassthroughCopy("src/apple"); eleventyConfig.addPassthroughCopy("src/favicon.ico"); eleventyConfig.addPassthroughCopy("src/robots.txt"); eleventyConfig.addPassthroughCopy("static"); eleventyConfig.addPassthroughCopy({ "static/ads.txt": "./ads.txt", }); return { dir: { input: "src", output: "_site", data: "_data", }, templateFormats: ["html", "njk", "md", "11ty.js"], markdownTemplateEngine: "njk", htmlTemplateEngine: "njk", dataTemplateEngine: false, }; };