सामग्री पर जाएँ
Blume
Esc
↑↓नेविगेट↵खोलें⌘Jप्रीव्यू
इस पेज पर

कस्टम सोर्स

custom() के साथ किसी भी बैकएंड को Blume से जोड़ें — ContentSource इंटरफ़ेस को लागू करने वाला कोई ऑब्जेक्ट, या कस्टम सीरियलाइज़र के साथ कोई बिल्ट-इन इंजन पास करें।

ContentSource इंटरफ़ेस को लागू करने वाले किसी भी ऑब्जेक्ट को custom() में पास किया जा सकता है। कस्टम सीरियलाइज़र वाला एडेप्टर, या कोई भी ऐसा बैकएंड जो बिल्ट-इन नहीं है, इसी तरह जुड़ता है। इससे उसका SDK कोर इंस्टॉलेशन को प्रभावित नहीं करता:

import { defineConfig } from "blume";
import { custom, filesystem } from "blume/sources";
import { escapeMarkdownText } from "blume/sources/lower.ts";
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>${escapeMarkdownText(String(block.text ?? ""))}</Callout>`,
          },
        })
      ),
    ],
  },
});

सीरियलाइज़र जो मान लौटाता है, वह बिना किसी बदलाव के MDX के रूप में पेज में लिखा जाता है। इसलिए CMS से लिए गए टेक्स्ट को एस्केप करना आवश्यक है। ऐसा न करने पर, संपादक के टेक्स्ट में मौजूद { एक एक्सप्रेशन के रूप में चलेगा और बिल्ड विफल हो जाएगा, और <b> HTML के रूप में रेंडर होगा। escapeMarkdownText इसे उसी तरह एस्केप करता है जैसे Blume की बिल्ट-इन लोअरिंग करती है, ताकि टेक्स्ट ठीक वैसा ही दिखे जैसा लिखा गया है।

Blume की किसी इंजन फ़ैक्टरी से बना सोर्स, जैसे ऊपर दिया गया sanitySource, चल रहे कमांड के कॉन्टेक्स्ट पर फिर से बनाया जाता है। इसलिए यह --preview में ड्राफ़्ट पढ़ता है और बिल्ट-इन एडेप्टर की तरह अपना स्नैपशॉट .blume/cache में रखता है। आप अपने सोर्स में withContext(ctx) लागू करके भी यही कर सकते हैं। यह मेथड उस कॉन्टेक्स्ट पर फिर से बना सोर्स लौटाती है। बिल्ट-इन एडेप्टर के विपरीत, custom() सोर्स का स्नैपशॉट केवल प्रीव्यू मोड के अनुसार रखा जाता है, ऑप्शन के हर सेट के अनुसार नहीं, क्योंकि Blume को ऑप्शन के बजाय एक इंस्टेंस दिखाई देता है। सोर्स की क्वेरी, फ़ील्ड या सीरियलाइज़र बदलने के बाद भी blume dev वही स्नैपशॉट सर्व करता है, इसलिए नए सिरे से फ़ेच करने के लिए blume sync चलाएँ।

custom() ऑप्शन ऑब्जेक्ट के बजाय एक ContentSource इंस्टेंस लेता है। इसलिए साझा ऑप्शन prefix या pollInterval को पास करने की कोई जगह नहीं है। सोर्स अपनी prefix प्रॉपर्टी स्वयं सेट करता है, और री-फ़ेचिंग उसकी watch मेथड के अनुसार होती है। इसमें सादे डेटा के बजाय एक लाइव इंस्टेंस होता है, इसलिए यह अपनी ओर से कोई रनटाइम डिपेंडेंसी या सीक्रेट घोषित नहीं करता। इंस्टेंस इन्हें स्वयं संभालता है। custom() सोर्स जिस वेरिएबल को पढ़ता है, उसके सेट न होने पर blume dev और blume build कोई चेतावनी नहीं देते। इसके बजाय, जिस इंजन के API को अपना टोकन चाहिए (notionSource, contentfulSource), वह अपने पहले अनुरोध से पहले ही BLUME_MISSING_SECRET के साथ रुक जाता है।

लोकल फ़ाइलें पढ़ने वाले कस्टम सोर्स में हर एंट्री पर sourcePath और सोर्स पर contentRoot सेट होना चाहिए। sourcePath डायग्नोस्टिक्स में फ़ाइल का नाम दिखाता है और उसके बगल में रखी रिलेटिव इमेज को रिज़ॉल्व करता है। contentRoot उस git log का दायरा तय करता है जिससे पेजों की तारीख़ निकाली जाती है। इसके बिना सोर्स के पेजों को git से “अंतिम अपडेट” की तारीख़ नहीं मिलती।

अंतिम अपडेट

क्या यह पेज सहायक था?