Files
indiekit-server/scripts/patch-webmention-sender-content-scope.mjs
Sven b6bf84dcd4 fix: patch webmention-sender scope.find crash when post has no h-entry
Replace `contentRoot ?? $` with `contentRoot ?? $.root()` in webmention.js.
When a post has no .h-entry, <article>, or <main>, contentRoot is null and
`$` is a Cheerio constructor function — not a Cheerio object — so .find()
throws "scope.find is not a function". $.root() returns the document root
as a proper Cheerio object that supports .find().

Rewrites patch-webmention-sender-content-scope.mjs for the new 1.0.7 package
shape (content-scope logic already baked in, only the $.root() fix needed)
and registers it in postinstall + serve.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 23:23:46 +01:00

50 lines
1.5 KiB
JavaScript

/**
* Patch @rmdes/indiekit-endpoint-webmention-sender webmention.js:
*
* Fix `scope.find is not a function` crash when a post has no .h-entry,
* <article>, or <main> element. In that case contentRoot is null and
* `scope = contentRoot ?? $` sets scope to the Cheerio constructor function
* which has no .find() method. Using $.root() instead returns a proper
* Cheerio document object that supports .find().
*/
import { access, readFile, writeFile } from "node:fs/promises";
const filePath =
"node_modules/@rmdes/indiekit-endpoint-webmention-sender/lib/webmention.js";
const patchMarker = "// [patched:scope-root]";
const oldLine = " const scope = contentRoot ?? $;";
const newLine = " const scope = contentRoot ?? $.root(); // [patched:scope-root]";
async function exists(p) {
try {
await access(p);
return true;
} catch {
return false;
}
}
if (!(await exists(filePath))) {
console.log("[postinstall] patch-webmention-sender-content-scope: file not found, skipping");
process.exit(0);
}
const source = await readFile(filePath, "utf8");
if (source.includes(patchMarker)) {
console.log("[postinstall] patch-webmention-sender-content-scope: already patched");
process.exit(0);
}
if (!source.includes(oldLine)) {
console.warn(
"[postinstall] patch-webmention-sender-content-scope: target line not found — skipping"
);
process.exit(0);
}
await writeFile(filePath, source.replace(oldLine, newLine), "utf8");
console.log("[postinstall] patch-webmention-sender-content-scope: patched $.root() fix");