diff --git a/lib/snippets.ts b/lib/snippets.ts index b3177c6..40aaa4c 100644 --- a/lib/snippets.ts +++ b/lib/snippets.ts @@ -16,83 +16,91 @@ export interface Snippet { export type GroupedSnippets = Record>; -const basePath = "snippets"; +const basePath = join(process.cwd(), "snippets"); export async function getSnippet( language: string, category: string, name: string, ): Promise<(Omit & { snippet: string }) | null> { - const path = join(basePath, language, category, `${name}.mdx`); - - const exists = existsSync(path); - - if (!exists) { + try { + const path = join(basePath, language, category, `${name}.mdx`); + + const exists = existsSync(path); + + if (!exists) { + return null; + } + + const content = readFileSync(path, "utf-8"); + + if (!content) { + return null; + } + + const snippet = content.replace( + /export\s+const\s+metadata\s*=\s*\{[^}]*\};(\r\n){2}|```\w*\r\n/g, + "", + ); + + return { + language, + category, + name, + metadata: parseMetadata(content), + snippet, + }; + } catch { return null; } - - const content = readFileSync(path, "utf-8"); - - if (!content) { - return null; - } - - const snippet = content.replace( - /export\s+const\s+metadata\s*=\s*\{[^}]*\};(\r\n){2}|```\w*\r\n/g, - "", - ); - - return { - language, - category, - name, - metadata: parseMetadata(content), - snippet, - }; } export const getGroupedSnippets: () => Promise = cache( async () => { - const files = readdirSync(basePath, { recursive: true }) as string[]; - - const snippets = files - .filter((file) => file.endsWith(".mdx")) - .map((file) => { - const relativePath = file.replace(`${basePath}/`, ""); - const path = join("./", basePath, file); - - const parts = relativePath.split("\\"); - const language = parts[0]; - const category = parts[1]; - const name = parts[2].replace(".mdx", ""); - - const metadata = parseMetadata(readFileSync(path, "utf-8")); - - return { language, category, name, metadata, path }; - }); - - const groupedSnippets = snippets.reduce((acc, snippet) => { - const { language, category, name, metadata, path } = snippet; - - if (!acc[language]) { - acc[language] = {}; - } - - if (!acc[language][category]) { - acc[language][category] = []; - } - - acc[language][category].push({ - language, - category, - name, - metadata, - path, - }); - - return acc; - }, {} as GroupedSnippets); - - return groupedSnippets; + try { + const files = readdirSync(basePath, { recursive: true }) as string[]; + + const snippets = files + .filter((file) => file.endsWith(".mdx")) + .map((file) => { + const relativePath = file.replace(`${basePath}/`, ""); + const path = join("./", basePath, file); + + const parts = relativePath.split("\\"); + const language = parts[0]; + const category = parts[1]; + const name = parts[2].replace(".mdx", ""); + + const metadata = parseMetadata(readFileSync(path, "utf-8")); + + return { language, category, name, metadata, path }; + }); + + const groupedSnippets = snippets.reduce((acc, snippet) => { + const { language, category, name, metadata, path } = snippet; + + if (!acc[language]) { + acc[language] = {}; + } + + if (!acc[language][category]) { + acc[language][category] = []; + } + + acc[language][category].push({ + language, + category, + name, + metadata, + path, + }); + + return acc; + }, {} as GroupedSnippets); + + return groupedSnippets; + } catch (e) { + return {}; + } }, );