/** * I try to keep the `eleventy.config.js` file clean and uncluttered. Most adjustments must be made in: * - `./config/collections/index.js` * - `./config/filters/index.js` * - `./config/plugins/index.js` * - `./config/shortcodes/index.js` * - `./config/transforms/index.js` */ // JSDoc comment: Hint VS Code for eleventyConfig autocompletion. © Henry Desroches - https://gist.github.com/xdesro/69583b25d281d055cd12b144381123bf /** * @param {import("@11ty/eleventy/src/UserConfig")} eleventyConfig */ // module import filters const { toISOString, formatDate, toAbsoluteUrl, stripHtml, minifyCss, minifyJs, splitlines } = require('./config/filters/index.js'); // module import shortcodes const {imageShortcode, includeRaw, liteYoutube} = require('./config/shortcodes/index.js'); // module import collections const {getAllPosts} = require('./config/collections/index.js'); const {onlyMarkdown} = require('./config/collections/index.js'); const {tagList} = require('./config/collections/index.js'); // module import events const {svgToJpeg} = require('./config/events/index.js'); // plugins const {EleventyRenderPlugin} = require('@11ty/eleventy'); const pluginRss = require('@11ty/eleventy-plugin-rss'); const inclusiveLangPlugin = require('@11ty/eleventy-plugin-inclusive-language'); const bundlerPlugin = require('@11ty/eleventy-plugin-bundle'); const syntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight'); const markdownLib = require('./config/plugins/markdown.js'); const {slugifyString} = require('./config/utils/index.js'); const yaml = require('js-yaml'); module.exports = eleventyConfig => { // --------------------- Custom Watch Targets ----------------------- eleventyConfig.addWatchTarget('./src/assets'); eleventyConfig.addWatchTarget('./utils/*.js'); // --------------------- layout aliases ----------------------- eleventyConfig.addLayoutAlias('base', 'base.njk'); eleventyConfig.addLayoutAlias('home', 'home.njk'); eleventyConfig.addLayoutAlias('page', 'page.njk'); eleventyConfig.addLayoutAlias('blog', 'blog.njk'); eleventyConfig.addLayoutAlias('post', 'post.njk'); eleventyConfig.addLayoutAlias('tags', 'tags.njk'); // --------------------- Custom filters ----------------------- eleventyConfig.addFilter('toIsoString', toISOString); eleventyConfig.addFilter('formatDate', formatDate); eleventyConfig.addFilter('toAbsoluteUrl', toAbsoluteUrl); eleventyConfig.addFilter('stripHtml', stripHtml); eleventyConfig.addFilter('slugify', slugifyString); eleventyConfig.addFilter('splitlines', splitlines); eleventyConfig.addFilter('cssmin', minifyCss); eleventyConfig.addNunjucksAsyncFilter('jsmin', minifyJs); eleventyConfig.addFilter('toJson', JSON.stringify); eleventyConfig.addFilter('fromJson', JSON.parse); eleventyConfig.addFilter('keys', Object.keys); eleventyConfig.addFilter('values', Object.values); eleventyConfig.addFilter('entries', Object.entries); // --------------------- Custom shortcodes --------------------- eleventyConfig.addNunjucksAsyncShortcode('eleventyImage', imageShortcode); eleventyConfig.addShortcode('youtube', liteYoutube); eleventyConfig.addShortcode('include_raw', includeRaw); eleventyConfig.addShortcode('year', () => `${new Date().getFullYear()}`); // current year, by stephanie eckles // --------------------- Custom transforms --------------------- eleventyConfig.addPlugin(require('./config/transforms/html-config.js')); // --------------------- Custom Template Languages --------------------- eleventyConfig.addPlugin(require('./config/template-languages/css-config.js')); eleventyConfig.addPlugin(require('./config/template-languages/js-config.js')); // --------------------- Custom collections ----------------------- eleventyConfig.addCollection('posts', getAllPosts); eleventyConfig.addCollection('onlyMarkdown', onlyMarkdown); eleventyConfig.addCollection('tagList', tagList); // --------------------- Events --------------------- if (process.env.ELEVENTY_RUN_MODE === 'serve') { // this only runs in development, on your machine, so og images get installed fonts. eleventyConfig.on('eleventy.after', svgToJpeg); } // --------------------- Plugins --------------------- eleventyConfig.addPlugin(EleventyRenderPlugin); eleventyConfig.addPlugin(syntaxHighlight); eleventyConfig.addPlugin(pluginRss); eleventyConfig.addPlugin(inclusiveLangPlugin); eleventyConfig.addPlugin(bundlerPlugin); eleventyConfig.setLibrary('md', markdownLib); // Add support for YAML data files with .yaml extension eleventyConfig.addDataExtension('yaml', contents => yaml.load(contents)); // --------------------- Passthrough File Copy ----------------------- // same path ['src/assets/fonts/', 'src/assets/images/template', 'src/assets/og-images'].forEach( path => eleventyConfig.addPassthroughCopy(path) ); // to root eleventyConfig.addPassthroughCopy({ 'src/assets/images/favicon/*': '/' }); // --------------------- general config ----------------------- return { // Pre-process *.md, *.html and global data files files with: (default: `liquid`) markdownTemplateEngine: 'njk', htmlTemplateEngine: 'njk', dataTemplateEngine: 'njk', // Optional (default is set): If your site deploys to a subdirectory, change `pathPrefix`, for example with with GitHub pages pathPrefix: '/', dir: { output: 'dist', input: 'src', includes: '_includes', layouts: '_layouts' } }; };