Notion
notion() ソースで Notion データベースをインポートします。行はページに、プロパティはフロントマターに、ブロックは Blume コンポーネントになります。
組み込みの notion() アダプターは、Notion データベースをコレクションに変換します。各行がページになり、そのプロパティがフロントマターに、ブロックツリーが MDX になります。コールアウト、トグル、カラム、コードブロックはそれぞれ対応する Blume コンポーネントに変換されます。Notion で入力したテキストは入力したとおりに表示されます。ページ内の {、<、Markdown の記号は、MDX、JSX、書式として解釈されずにエスケープされます。動画ブロックは、YouTube のリンクを含む場合は <YouTube> 埋め込みになり、それ以外の場合は <video> プレーヤーになります。どちらの場合も、ブロックのキャプションは <Frame> のキャプションになります。メディアファイルではなく動画ページへのリンク(たとえば Vimeo や Loom の URL)はビルド時に警告が出ます。その場合、<video> プレーヤーは再生できないページを指したままになるため、代わりに本文からその動画にリンクしてください。アダプターは @notionhq/client(v5 以降)をランタイム依存関係として宣言しています。これはオプションのピア依存関係です。Blume はデータベースを最初のデータソース経由で読み取ります。
import { defineConfig } from "blume";
import { filesystem, notion } from "blume/sources";
export default defineConfig({
content: {
sources: [
filesystem({ root: "docs" }),
notion({
prefix: "handbook",
database: "8f2c1e0a4b7d4f3c9e6a5d2b1c0f9e8d", // the id in the database URL
// Property names default to the title-typed prop / Description / Slug / Order / Status
// Pages whose Status isn't publishedValue (default "Published") import as drafts
publishedValue: "Done",
}),
],
},
});
インテグレーショントークンは NOTION_TOKEN 環境変数から読み込まれます(データベースをインテグレーションと共有しておいてください)。アダプターがこの環境変数を宣言しているため、設定されていない状態でビルドすると警告が表示されます。
Status プロパティは、デフォルトで公開可否を判定するために使われます。Status(ステータスまたはセレクトプロパティ)の値が publishedValue(デフォルトは Published)以外のページは draft: true としてインポートされ、本番ビルドではドラフトが除外されます。Status に値がないページは公開され、このプロパティを持たないデータベースではすべてのページが公開されます。Notion のデフォルトのステータスオプションは Not started、In progress、Done です。これらを使うデータベースには Published という値がないため、publishedValue: "Done"(または公開を意味するオプション)を設定するまで何も公開されません。別の名前のプロパティを使う場合は、properties.status でそのプロパティ名を指定します。ステータスに関係なくすべてのページをインポートするには、データベースに存在しないプロパティを指定してください。
Notion の画像と動画の URL は署名付きで、有効期限があります。そのため、アダプターはビルド時にそれらをサイトのアセットとしてダウンロードし、参照を書き換えます。これにより、CMS のアセットが静的ビルドの中でリンク切れになることはありません。保存されるのは、サーバーが画像または動画として報告したファイルだけです(レスポンスで種類が示されない場合は、URL に画像または動画の拡張子を含むファイル)。それ以外のファイルは元の URL のまま残り、ビルド時に警告が出ます。そのため、サイトのオリジンから配信されるのはメディアだけです。API 呼び出しは小さなリクエストプールを通じて、同時に 3 件までに抑えて送信されます。これは Notion のインテグレーションごとのレート制限に合わせた値です。そのため、数百ページあるデータベースでも 429 レスポンスを受けずにインポートできます。同時実行数を調整するには、ソースで concurrency を設定してください。