Fix npm audit vulnerabilities and broken image build
Build and copy to prod / build-and-copy (push) Successful in 4m15s

Eleventy Image v7 removed its synchronous stats API, which broke the
build. Rather than downgrade (older versions bundle a vulnerable sharp),
adapt to v7 and clear out the remaining vulnerable dependencies:

- Make the `image` shortcode async
- Replace the unmaintained markdown-it-eleventy-img with a local plugin
  that pre-loads image metadata in eleventy.before, so markdown (and
  feed) images keep rendering as <picture> elements
- Upgrade @11ty/eleventy-fetch to v6
- Swap npm-run-all for the maintained npm-run-all2 fork
- Override eleventy-plugin-og-image's satori (and its pinned fflate) to
  patched versions, and set explicit heading weights in the OG template
  so newer satori doesn't synthesise bold text
This commit is contained in:
Lewis Dale committed 2026-11-03 13:39:36 +00:00
1 parent 13d0b244e5
commit f45b6308f9
6 files changed
+284 -2427

No files matched your search

+20 -16
View File
@@ -9,12 +9,29 @@ import { full as markdownItEmoji } from 'markdown-it-emoji';
import markdownItFootnote from 'markdown-it-footnote';
import markdownitMark from 'markdown-it-mark';
import markdownitAbbr from 'markdown-it-abbr';
import markdownItEleventyImg from 'markdown-it-eleventy-img';
import markdownItCallouts from 'markdown-it-obsidian-callouts';
import { slugifyString } from '../utils.js';
import { createMarkdownImages } from './markdown-it-image.js';
const icons = JSON.parse(fs.readFileSync('./config/plugins/icons.json'), 'utf-8');
const markdownImages = createMarkdownImages({
imageDir: path.join("src", "images"),
imgOptions: {
widths: [300, 600, 1000, 1440],
urlPath: "/img/",
outputDir: path.join("_site", "img"),
formats: ["avif", "webp", "jpeg"]
},
globalAttributes: {
sizes: `(max-width: 300px) 300px,
(max-width: 600px) 600px,
(max-width: 1000px) 1000px,
(max-width: 1440px) 1440px,
100%`
}
});
const markdownLib = markdownIt({
html: true,
breaks: true,
@@ -53,27 +70,14 @@ const markdownLib = markdownIt({
.use(markdownitMark)
.use(markdownitAbbr)
.use(markdownItCallouts)
.use(markdownItEleventyImg, {
imgOptions: {
widths: [300, 600, 1000, 1440],
urlPath: "/img/",
outputDir: path.join("_site", "img"),
formats: ["avif", "webp", "jpeg"]
},
globalAttributes: {
sizes: `(max-width: 300px) 300px,
(max-width: 600px) 600px,
(max-width: 1000px) 1000px,
(max-width: 1440px) 1440px,
100%`
}
});
.use(markdownImages.markdownItPlugin);
markdownLib.renderer.rules.emoji = function(token, idx) {
return `<span class="fa-li"><i class="fa-solid fa-${token[idx].markup}" aria-hidden="true"></i></span>`;
};
export default function(eleventyConfig) {
eleventyConfig.addPlugin(markdownImages.eleventyPlugin);
eleventyConfig.addFilter('md', content => content ? markdownLib.render(content) : "");
eleventyConfig.setLibrary('md', markdownLib);
}