import rssPlugin from '@11ty/eleventy-plugin-rss'; import syntaxHighlight from '@11ty/eleventy-plugin-syntaxhighlight'; import fs from 'fs'; import util from 'util'; // Import filters import dateFilter from './src/filters/date-filter.js'; import markdownFilter from './src/filters/markdown-filter.js'; import w3DateFilter from './src/filters/w3-date-filter.js'; // Import transforms import htmlMinTransform from './src/transforms/html-min-transform.js'; import parseTransform from './src/transforms/parse-transform.js'; // Import data files import {createRequire} from 'node:module'; const require = createRequire(import.meta.url); // need this because of issue when using ESM : https://github.com/11ty/eleventy-dependency-tree-esm/issues/2 // This will get soon resolved const site = require('./src/_data/site.json'); export default function(config) { // Filters config.addFilter('dateFilter', dateFilter); config.addFilter('markdownFilter', markdownFilter); config.addFilter('w3DateFilter', w3DateFilter); config.addFilter('dump', obj => { return util.inspect(obj); }); // Layout aliases config.addLayoutAlias('home', 'layouts/home.njk'); // Transforms config.addTransform('htmlmin', htmlMinTransform); config.addTransform('parse', parseTransform); // Passthrough copy config.addPassthroughCopy('src/fonts'); config.addPassthroughCopy('src/images'); config.addPassthroughCopy('src/js'); config.addPassthroughCopy('src/admin/config.yml'); config.addPassthroughCopy('src/admin/previews.js'); config.addPassthroughCopy('node_modules/nunjucks/browser/nunjucks-slim.js'); config.addPassthroughCopy('src/robots.txt'); config.addPassthroughCopy('src/.htaccess'); config.addPassthroughCopy('src/form'); const now = new Date(); // Custom collections const livePosts = post => post.date <= now && !post.data.draft; const newsPosts = post => post.data.type === 'news'; const eventPosts = post => post.data.type === 'event'; config.addCollection('posts', collection => { return [...collection.getFilteredByGlob('./src/posts/*.md')].reverse(); }); config.addCollection('news', collection => { return [ ...collection.getFilteredByGlob('./src/posts/*.md').filter(newsPosts) ].reverse(); }); config.addCollection('events', collection => { return [ ...collection.getFilteredByGlob('./src/posts/*.md').filter(eventPosts) ].reverse(); }); config.addCollection('newsFeed', collection => { return [...collection.getFilteredByGlob('./src/posts/*.md').filter(livePosts)] .reverse() .slice(0, site.maxNewsPerPage); }); config.addCollection('members', collection => { return [...collection.getFilteredByGlob('./src/members/*.md')]; }); config.addCollection('profiles', collection => { return [...collection.getFilteredByGlob('./src/members/*.md')] .reverse() .slice(0, site.maxProfilePreview); }); config.addCollection('tagsList', function(collectionApi) { const tagsList = new Set(); collectionApi.getAll().map(item => { if (item.data.tags) { // handle pages that don't have tags item.data.tags.map(tag => tagsList.add(tag)); } }); return tagsList; }); config.addCollection('skillsList', function(collectionApi) { const skillsList = new Set(); collectionApi.getFilteredByGlob('./src/members/*.md').map(item => { if (item.data.tags) { // handle pages that don't have skills item.data.tags.map(skill => { // exclude non related tags if (['post', 'news', 'event'].indexOf(skill) == -1) { skillsList.add(skill); } }); } }); return skillsList; }); config.addCollection('membersLocations', function(collectionApi) { return collectionApi .getFilteredByGlob('./src/members/*.md') .filter(item => typeof item.data.location !== 'undefined') .map(member => { return { name: member.data.name, url: member.data.url, location: member.data.location }; }); }); config.addCollection('customers', collection => { return [...collection.getFilteredByGlob('./src/customers/*.md')] .reverse() .slice(0, site.maxCustomerPerPage); }); config.addCollection('partners', collection => { return [...collection.getFilteredByGlob('./src/partners/*.md')] .reverse() .slice(0, site.maxPartnerPerPage); }); // Plugins config.addPlugin(rssPlugin); config.addPlugin(syntaxHighlight); // 404 config.setBrowserSyncConfig({ callbacks: { ready: function(err, browserSync) { const content_404 = fs.readFileSync('dist/404.html'); browserSync.addMiddleware('*', (req, res) => { // Provides the 404 content without redirect. res.write(content_404); res.end(); }); } } }); return { dir: { input: 'src', output: 'dist' }, passthroughFileCopy: true }; }