From 9b6a89ec54f7e610497d5844f0d7af55cd0843c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miku=E3=81=AE=E9=AC=86?= Date: Sat, 2 Nov 2024 22:09:08 +0800 Subject: [PATCH] new:Set Orama Search for doc --- .github/workflows/deploy.yml | 3 +++ .gitignore | 3 ++- app/api/search/route.ts | 44 ++++++++++++++++++++++++++++---- app/components/provider.tsx | 18 ++++++++++++++ app/components/search.tsx | 14 +++++++++++ app/layout.tsx | 12 ++++----- app/static.json/route.ts | 25 +++++++++++++++++++ bun.lockb | Bin 192927 -> 219977 bytes components/ToGitHub.tsx | 16 ------------ package.json | 6 ++++- sync-index.mjs | 47 +++++++++++++++++++++++++++++++++++ 11 files changed, 159 insertions(+), 29 deletions(-) create mode 100644 app/components/provider.tsx create mode 100644 app/components/search.tsx create mode 100644 app/static.json/route.ts delete mode 100644 components/ToGitHub.tsx create mode 100644 sync-index.mjs diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 25c016b..82d958d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -29,6 +29,9 @@ jobs: run: | bun install bun run build + - name: Sync search index + run: | + bun run sync-search - name: Add CNAME run: | echo "mx-space.js.org" > out/CNAME diff --git a/.gitignore b/.gitignore index 55a12ae..71092db 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,5 @@ yarn-error.log* # others .env*.local .vercel -next-env.d.ts \ No newline at end of file +next-env.d.ts +.env diff --git a/app/api/search/route.ts b/app/api/search/route.ts index bfcd688..fab05ba 100644 --- a/app/api/search/route.ts +++ b/app/api/search/route.ts @@ -1,7 +1,41 @@ -import { source } from '@/lib/source'; -import { createFromSource } from 'fumadocs-core/search/server'; +import { sync } from 'fumadocs-core/search/orama-cloud'; +import * as fs from 'node:fs/promises'; +import { CloudManager } from '@oramacloud/client'; -// it should be cached forever -export const revalidate = false; +export const dynamic = 'force-static'; -export const { staticGET: GET } = createFromSource(source); \ No newline at end of file +const updateSearchIndexes = async (): Promise => { + const apiKey = process.env.ORAMA_PRIVATE_API_KEY; + const indexId = 'k2hnq39jnt7u8l41bfv0ezhd'; + + if (!apiKey) { + console.log('未找到 Orama 私钥, 跳过索引更新'); + return; + } + + try { + const content = await fs.readFile('.next/server/app/static.json.body'); + const records = JSON.parse(content.toString()); + + const manager = new CloudManager({ api_key: apiKey }); + + await sync(manager, { + index: indexId, + documents: records, + }); + + console.log(`搜索索引更新完成: ${records.length} 条记录`); + } catch (error) { + console.error('更新搜索索引时发生错误:', error); + } +} + +void updateSearchIndexes(); + +export async function GET(request: Request) { + // ... GET处理逻辑 ... +} + +export async function POST(request: Request) { + // ... POST处理逻辑 ... +} \ No newline at end of file diff --git a/app/components/provider.tsx b/app/components/provider.tsx new file mode 100644 index 0000000..8276ec2 --- /dev/null +++ b/app/components/provider.tsx @@ -0,0 +1,18 @@ +'use client'; +import { RootProvider } from 'fumadocs-ui/provider'; +import dynamic from 'next/dynamic'; +import type { ReactNode } from 'react'; + +const SearchDialog = dynamic(() => import('@/app/components/search')); // lazy load + +export function Provider({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} \ No newline at end of file diff --git a/app/components/search.tsx b/app/components/search.tsx new file mode 100644 index 0000000..dcfdb4b --- /dev/null +++ b/app/components/search.tsx @@ -0,0 +1,14 @@ +'use client'; + +import { OramaClient } from '@oramacloud/client'; +import type { SharedProps } from 'fumadocs-ui/components/dialog/search'; +import SearchDialog from 'fumadocs-ui/components/dialog/search-orama'; + +const client = new OramaClient({ + endpoint: 'https://cloud.orama.run/v1/indexes/mxspace-no50lj', + api_key: 'HHIpRwosmxFfAs7l2gsJv5m5A3ew2PRB', +}); + +export default function CustomSearchDialog(props: SharedProps) { + return ; +} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index dbc4b48..61e9911 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,5 +1,5 @@ import './global.css'; -import { RootProvider } from 'fumadocs-ui/provider'; +import { Provider } from './components/provider'; import { Inter } from 'next/font/google'; import type { ReactNode } from 'react'; @@ -10,16 +10,16 @@ const inter = Inter({ export default function Layout({ children }: { children: ReactNode }) { return ( - - + {children} - + ); diff --git a/app/static.json/route.ts b/app/static.json/route.ts new file mode 100644 index 0000000..f7d450f --- /dev/null +++ b/app/static.json/route.ts @@ -0,0 +1,25 @@ +import { NextResponse } from 'next/server'; +import { source } from '@/lib/source'; +import type { OramaDocument } from 'fumadocs-core/search/orama-cloud'; + +export const revalidate = false; + +export async function GET(): Promise { + const pages = source.getPages(); + const results = await Promise.all( + pages.map(async (page) => { + const { structuredData } = await page.data; + + return { + id: page.url, + structured: structuredData, + tag: page.slugs[0], + url: page.url, + title: page.data.title, + description: page.data.description, + } satisfies OramaDocument; + }), + ); + + return NextResponse.json(results); +} \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 6dd60f81ef8034eae007ca1c359f5d5c61633b15..ff06ab245e3603a53ebd36327d8040950f64749c 100644 GIT binary patch delta 44600 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ཱྀEg;td_Pis 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 PFF43L25|fuuLu7J$eaUL delta 28536 zcmeHwd0Z7o)^>NpRT@RXpopM|;)2R9TomNGf})_P7>TItiXteBiW?W#;Eru9H?Tmk)0-q~lRp=On2hKV1)fi*F}MvgT)|rWYbS1p@WKUjnMYFrcH6?w4IK8pV

u)8 z4)M8}Q%MKuVO>dT3jP|f8Stdw{{nOazedED0^KF4#5w^1S0p?SYyvD8o0>ln1%;zF zif;{U3~U5+0fs}{hQPvtoa{8n-A9wD!W>{r;5R_3I2PCncnV16_yawG?*OSDXJ8Ad zM6yXAf>+yq;81>I+Y+0hn7=BeUwH56Y~lR(+diuliRu%|I&G2dye`M&Mlp$b>t9l&}#< z84AW`kI$x-pxM-dM=%c+@DCu#2OyqIJ+me6lKjjunNuO(1o6 zrjLcAqF)*z-nX@ss|&ic<^`rAf%+y6NL>&i1Se-@=VYSbg>86&Ujd<`wFi)#&kQ6B zc>+CvrR{hZ

-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 { - return ( - - - GitHub - - ); -}; \ No newline at end of file diff --git a/package.json b/package.json index 0d09f75..4db5e41 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,16 @@ "build": "next build", "dev": "next dev --turbo", "start": "next start", - "postinstall": "fumadocs-mdx" + "postinstall": "fumadocs-mdx", + "sync-search": "bun run sync-index.mjs" }, "dependencies": { "@orama/orama": "^3.0.1", + "@orama/react-components": "^0.1.11", "@orama/tokenizers": "^3.0.1", + "@oramacloud/client": "^1.3.19", "copy-to-clipboard": "^3.3.3", + "dotenv": "^16.4.5", "framer-motion": "^11.11.11", "fumadocs-core": "14.2.0", "fumadocs-mdx": "11.1.1", diff --git a/sync-index.mjs b/sync-index.mjs new file mode 100644 index 0000000..47798de --- /dev/null +++ b/sync-index.mjs @@ -0,0 +1,47 @@ +import { sync } from 'fumadocs-core/search/orama-cloud'; +import * as fs from 'node:fs/promises'; +import { CloudManager } from '@oramacloud/client'; +import * as path from 'path'; +import * as dotenv from 'dotenv'; + +// 加载 .env 文件 +dotenv.config(); + +export async function updateSearchIndexes() { + const apiKey = process.env.ORAMA_PRIVATE_API_KEY; + const indexId = 'k2hnq39jnt7u8l41bfv0ezhd'; // 你的索引 ID + + if (!apiKey) { + console.log('未找到 Orama 私钥, 跳过索引更新'); + return; + } + + try { + // 使用绝对路径 + const staticJsonPath = path.join(process.cwd(), '.next/server/app/static.json.body'); + + try { + await fs.access(staticJsonPath); + } catch { + console.error('static.json.body 文件不存在,请先运行 next build'); + process.exit(1); + } + + const content = await fs.readFile(staticJsonPath); + const records = JSON.parse(content.toString()); + + const manager = new CloudManager({ api_key: apiKey }); + + await sync(manager, { + index: indexId, + documents: records, + }); + + console.log(`搜索索引更新完成: ${records.length} 条记录`); + } catch (error) { + console.error('更新搜索索引时发生错误:', error); + process.exit(1); + } +} + +void updateSearchIndexes(); \ No newline at end of file