/**
* 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'
}
};
}