Eigene Quellen
Binde mit custom() ein beliebiges Backend in Blume ein – übergib ein Objekt, das das ContentSource-Interface implementiert, oder eine eingebaute Engine mit eigenen Serializern.
Jedes Objekt, das das ContentSource-Interface implementiert, kannst du an custom() übergeben. Auf diesem Weg bindest du einen Adapter mit eigenen Serializern oder jedes andere nicht eingebaute Backend ein, ohne dass dessen SDK in der Kerninstallation landet:
import { defineConfig } from "blume";
import { custom, filesystem } from "blume/sources";
import { sanitySource } from "blume/sources/sanity.ts";
export default defineConfig({
content: {
sources: [
filesystem({ root: "docs" }),
custom(
sanitySource({
name: "guides",
prefix: "guides",
projectId: "abc123",
dataset: "production",
query: `*[_type == "guide"]`,
// Map custom Portable Text blocks to Blume components
serializers: {
callout: (block) => `<Callout>${block.text}</Callout>`,
},
})
),
],
},
});
Eine Quelle, die du mit einer von Blumes Engine-Factories erstellst, wie sanitySource oben, wird auf dem Kontext des laufenden Befehls neu aufgebaut. Dadurch liest sie unter --preview Entwürfe und legt ihren Snapshot in .blume/cache ab, genau wie der eingebaute Adapter. Eine selbst geschriebene Quelle kann dasselbe leisten: Implementiere dafür withContext(ctx) und gib die Quelle neu aufgebaut auf diesem Kontext zurück.
custom() nimmt eine ContentSource-Instanz statt eines Options-Objekts entgegen. Daher gibt es keine Stelle, an der du die gemeinsamen Optionen prefix oder pollInterval übergeben könntest. Die Quelle setzt ihre prefix-Eigenschaft selbst, und wie sie Daten erneut abruft, bestimmt ihre watch-Methode. Weil sie eine Live-Instanz statt reiner Daten enthält, deklariert sie keine eigene Laufzeitabhängigkeit und kein eigenes Secret. Darum kümmert sich die Instanz selbst.
Wenn deine eigene Quelle lokale Dateien liest, sollte sie sourcePath für jeden Eintrag und contentRoot für die Quelle selbst setzen. sourcePath nennt die Datei in Diagnosemeldungen und sorgt dafür, dass relative Bilder relativ zu dieser Datei aufgelöst werden. contentRoot begrenzt das git-log, aus dem die Datumsangaben der Seiten stammen. Ohne contentRoot bekommen die Seiten der Quelle kein aus git abgeleitetes „Zuletzt aktualisiert“-Datum.