From c7f284162592d6584ea4323b5edd30cf996e88ef Mon Sep 17 00:00:00 2001 From: Ricardo Date: Mon, 23 Feb 2026 12:31:44 +0100 Subject: [PATCH] fix: auto-convert stale /content/ permalinks in data cascade MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Posts published between Jan 19 – Feb 6 2026 (pre-beta.37 preset) had permalink: /content/TYPE/YYYY-MM-DD-SLUG/ in frontmatter. The data cascade trusted these values, causing Eleventy to generate pages at /content/ paths instead of canonical URLs. This left 86 posts (including articles like collecteur-de-flux-rss) returning 404 at their canonical URLs. The markdown files were fixed on the server (permalink lines removed), but this adds a safety net: any remaining or future /content/ permalinks are auto-converted to /TYPE/YYYY/MM/DD/SLUG/ format. --- _data/eleventyComputed.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/_data/eleventyComputed.js b/_data/eleventyComputed.js index d895107..d428e56 100644 --- a/_data/eleventyComputed.js +++ b/_data/eleventyComputed.js @@ -20,10 +20,20 @@ export default { // Compute permalink from file path for posts without explicit frontmatter permalink. // Pattern: content/{type}/{yyyy}-{MM}-{dd}-{slug}.md → /{type}/{yyyy}/{MM}/{dd}/{slug}/ permalink: (data) => { - // If frontmatter already has permalink, use it (new posts from preset) - if (data.permalink) return data.permalink; + // Convert stale /content/ permalinks from pre-beta.37 posts to canonical format + if (data.permalink && typeof data.permalink === "string") { + const contentMatch = data.permalink.match( + /^\/content\/([^/]+)\/(\d{4})-(\d{2})-(\d{2})-(.+?)\/?$/ + ); + if (contentMatch) { + const [, type, year, month, day, slug] = contentMatch; + return `/${type}/${year}/${month}/${day}/${slug}/`; + } + // Valid non-/content/ permalink — use as-is + return data.permalink; + } - // Only compute for files matching the dated post pattern + // No frontmatter permalink — compute from file path const inputPath = data.page?.inputPath || ""; const match = inputPath.match( /content\/([^/]+)\/(\d{4})-(\d{2})-(\d{2})-(.+)\.md$/ @@ -33,7 +43,7 @@ export default { return `/${type}/${year}/${month}/${day}/${slug}/`; } - // For non-matching files (pages, root files), preserve existing permalink or let Eleventy decide + // For non-matching files (pages, root files), let Eleventy decide return data.permalink; },