// .eleventy.js
+const { DateTime } = require("luxon");
+
+const DEFAULT_LOCALE = "en-GB";
+const DEFAULT_DISPLAY = "DATE_FULL";
+
module.exports = function(eleventyConfig) {
- // --- Passthroughs (copy as-is to output) ---
- eleventyConfig.addPassthroughCopy({ "site/public": "/" }); // favicons, manifest, etc.
- eleventyConfig.addPassthroughCopy({ "site/assets": "assets" }); // /assets/*
+ // Passthroughs
+ eleventyConfig.addPassthroughCopy({ "site/public": "/" });
+ eleventyConfig.addPassthroughCopy({ "site/assets": "assets" });
- // --- Collections ---
+ // Collections
eleventyConfig.addCollection("blog", (api) =>
api.getFilteredByGlob("site/blog/*.md").sort((a, b) => b.date - a.date)
);
- // --- Filters ---
- // year (simple)
+ // Filters
eleventyConfig.addFilter("year", () => new Date().getFullYear());
- // date formatter (use a new name to avoid Liquid’s built-in 'date' behavior)
- function ymd(value, fmt = "yyyy-MM-dd") {
+ // Simple date filter using only Luxon built-ins
+ eleventyConfig.addFilter("date", (value) => {
if (!value) return "";
- const d = value instanceof Date ? value : new Date(value);
- const pad = (n) => String(n).padStart(2, "0");
- const map = {
- yyyy: d.getFullYear(),
- MM: pad(d.getMonth() + 1),
- dd: pad(d.getDate()),
- HH: pad(d.getHours()),
- mm: pad(d.getMinutes()),
- };
- return fmt.replace(/yyyy|MM|dd|HH|mm/g, (t) => map[t]);
- }
- eleventyConfig.addFilter("ymd", ymd); // universal
- eleventyConfig.addNunjucksFilter("ymd", ymd); // explicit for Nunjucks
- eleventyConfig.addLiquidFilter("ymd", ymd); // explicit for Liquid
+ return DateTime.fromJSDate(new Date(value))
+ .setLocale(DEFAULT_LOCALE)
+ .toLocaleString(DateTime[DEFAULT_DISPLAY]);
+ });
- // --- Engines + dirs ---
return {
- dir: {
- input: "site",
- includes: "_includes",
- data: "_data",
- output: "dist",
- },
+ dir: { input: "site", includes: "_includes", data: "_data", output: "dist" },
htmlTemplateEngine: "njk",
markdownTemplateEngine: "njk",
};