42 lines
1.7 KiB
TypeScript
42 lines
1.7 KiB
TypeScript
import { source } from '@/lib/source';
|
|
import { createFromSource } from 'fumadocs-core/search/server';
|
|
import { createTokenizer as createMandarinTokenizer } from '@orama/tokenizers/mandarin';
|
|
import { createTokenizer as createJapaneseTokenizer } from '@orama/tokenizers/japanese';
|
|
import { ORAMA_TOKENIZER, type OramaTokenizer } from '@/lib/locales.mjs';
|
|
|
|
// Static export build: the Orama index is generated at build time and written
|
|
// to /docs/static.json (basePath '/docs' + this route). The client downloads it
|
|
// and runs search fully in-browser, so no Node search server is needed.
|
|
export const revalidate = false;
|
|
|
|
// Map our per-locale tokenizer discriminator (single source: lib/locales.mjs)
|
|
// to the Orama config used to BUILD each locale's index. CJK locales need a
|
|
// custom tokenizer (Chinese/Japanese have no spaces, so the default whitespace
|
|
// tokenizer would index a whole doc as one token). The client query side in
|
|
// components/search-dialog.tsx maps the SAME discriminator the SAME way, so the
|
|
// built index and the query agree.
|
|
function oramaConfig(tokenizer: OramaTokenizer) {
|
|
switch (tokenizer) {
|
|
case 'mandarin':
|
|
return { components: { tokenizer: createMandarinTokenizer() } };
|
|
case 'japanese':
|
|
return { components: { tokenizer: createJapaneseTokenizer() } };
|
|
default:
|
|
// Orama built-in language ('english' | 'russian' | 'arabic').
|
|
return tokenizer;
|
|
}
|
|
}
|
|
|
|
const localeMap = Object.fromEntries(
|
|
Object.entries(ORAMA_TOKENIZER).map(([locale, tokenizer]) => [
|
|
locale,
|
|
oramaConfig(tokenizer),
|
|
]),
|
|
);
|
|
|
|
const server = createFromSource(source, { localeMap });
|
|
|
|
export async function GET() {
|
|
return server.staticGET();
|
|
}
|