/** * Most adjustments must be made in `./src/_config/*` * * Hint VS Code for eleventyConfig autocompletion. * © Henry Desroches - https://gist.github.com/xdesro/69583b25d281d055cd12b144381123bf * @param {import("@11ty/eleventy/src/UserConfig")} eleventyConfig - * @returns {Object} - */ // register dotenv for process.env.* variables to pickup import dotenv from 'dotenv'; dotenv.config(); // add yaml support import yaml from 'js-yaml'; // config import import {getAllPosts, showInSitemap, tagList, goPages, tracksByProject} from './src/_config/collections.js'; import events from './src/_config/events.js'; import filters from './src/_config/filters.js'; import plugins from './src/_config/plugins.js'; import shortcodes from './src/_config/shortcodes.js'; export default async function (eleventyConfig) { // --------------------- Events: before build eleventyConfig.on('eleventy.before', async () => { await events.buildAllCss(); await events.buildAllJs(); }); // --------------------- custom wtach targets eleventyConfig.addWatchTarget('./src/assets/**/*.{css,js,svg,png,jpeg}'); eleventyConfig.addWatchTarget('./src/_includes/**/*.{webc}'); // --------------------- layout aliases eleventyConfig.addLayoutAlias('base', 'base.njk'); eleventyConfig.addLayoutAlias('page', 'page.njk'); eleventyConfig.addLayoutAlias('post', 'post.njk'); eleventyConfig.addLayoutAlias('tags', 'tags.njk'); // --------------------- Collections eleventyConfig.addCollection('allPosts', getAllPosts); eleventyConfig.addCollection('showInSitemap', showInSitemap); eleventyConfig.addCollection('tagList', tagList); eleventyConfig.addCollection('goPages', goPages); eleventyConfig.addCollection('tracksByProject', tracksByProject); // --------------------- Plugins eleventyConfig.addPlugin(plugins.htmlConfig); eleventyConfig.addPlugin(plugins.drafts); eleventyConfig.addPlugin(plugins.EleventyRenderPlugin); eleventyConfig.addPlugin(plugins.rss); eleventyConfig.addPlugin(plugins.syntaxHighlight); eleventyConfig.addPlugin(plugins.webc, { components: ['./src/_includes/webc/**/*.webc'], useTransform: true }); eleventyConfig.addPlugin(plugins.eleventyImageTransformPlugin, { formats: ['webp', 'jpeg'], widths: ['auto'], htmlOptions: { imgAttributes: { loading: 'lazy', decoding: 'async', sizes: 'auto' }, pictureAttributes: {} } }); eleventyConfig.addPlugin(plugins.EleventyNavigationPlugin); // --------------------- bundle eleventyConfig.addBundle('css', {hoist: true}); // --------------------- Library and Data eleventyConfig.setLibrary('md', plugins.markdownLib); eleventyConfig.addDataExtension('yaml', contents => yaml.load(contents)); // --------------------- Filters eleventyConfig.addFilter('toIsoString', filters.toISOString); eleventyConfig.addFilter('formatDate', filters.formatDate); eleventyConfig.addFilter('formatDateUTC', filters.formatDateUTC); eleventyConfig.addFilter('markdownFormat', filters.markdownFormat); eleventyConfig.addFilter('splitlines', filters.splitlines); eleventyConfig.addFilter('striptags', filters.striptags); eleventyConfig.addFilter('shuffle', filters.shuffleArray); eleventyConfig.addFilter('alphabetic', filters.sortAlphabetically); eleventyConfig.addFilter('slugify', filters.slugifyString); eleventyConfig.addFilter('padNumber', filters.padNumber); // --------------------- Shortcodes eleventyConfig.addShortcode('svg', shortcodes.svgShortcode); eleventyConfig.addShortcode('image', shortcodes.imageShortcode); eleventyConfig.addShortcode('imageKeys', shortcodes.imageKeysShortcode); eleventyConfig.addShortcode('animateText', shortcodes.animateText); eleventyConfig.addPairedShortcode('gsapScrollAnim', shortcodes.gsapScrollAnim); eleventyConfig.addShortcode('year', () => `${new Date().getFullYear()}`); eleventyConfig.addShortcode("umami", function () { // Only insert tracking on production builds if (process.env.ELEVENTY_ENV === "production" || process.env.NODE_ENV === "production") { return ``; } return ""; // No script in dev builds }); // Custom shortcode for the post feature image to add pagefind attribute eleventyConfig.addAsyncShortcode('featureImage', async (src, alt, credit) => { // call the original image shortcode with arguments for a feature image const imageHtml = await shortcodes.imageShortcode(src, alt, credit, 'eager', 'feature'); if (imageHtml) { // inject the pagefind attribute into the tag return imageHtml.replace(' eleventyConfig.addPassthroughCopy(path) ); eleventyConfig.addPassthroughCopy({ // -- to root 'src/assets/images/favicon/*': '/', // -- node_modules 'node_modules/lite-youtube-embed/src/lite-yt-embed.{css,js}': `assets/components/`, 'node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js': `assets/components/turbo.js` }); // ---------------------- ignore test files if (process.env.ELEVENTY_ENV != 'test') { eleventyConfig.ignores.add('src/common/pa11y.njk'); } // --------------------- general config return { markdownTemplateEngine: 'njk', dir: { output: 'dist', input: 'src', includes: '_includes', layouts: '_layouts' } }; }