UNPKG

@braindb/astro

Version:
150 lines (148 loc) 4.53 kB
// src/index.ts import { defineIntegration } from "astro-integration-kit"; import { slug as githubSlug } from "github-slugger"; import path from "node:path"; import process from "node:process"; import { BrainDB as BrainDB2 } from "@braindb/core"; // src/remarkWikiLink.ts import "@braindb/core"; import { visit, SKIP } from "unist-util-visit"; var remarkWikiLink = ({ bdb }) => { return (ast, _file) => { visit(ast, "wikiLink", (node) => { const slug = node.value; const alias = node.data.alias; const [slugWithoutAnchor, anchor] = slug.split("#"); if (slugWithoutAnchor) { const doc = bdb.documentsSync({ slug: slugWithoutAnchor })[0]; if (doc) { if (!doc.frontmatter().draft || import.meta.env && import.meta.env.DEV) { node.data = { hName: "a", hProperties: { href: anchor ? `${doc.url()}#${anchor}` : doc.url(), class: doc.frontmatter().draft ? "draft-link" : "" }, hChildren: [ { type: "text", value: alias == null ? doc.frontmatter().title : alias } ] }; } return SKIP; } } node.data = { hName: "span", hProperties: { class: "broken-link", title: `Can't resolve link to ${slug}` }, hChildren: [{ type: "text", value: alias || slug }] }; return SKIP; }); }; }; // src/index.ts import { z } from "astro/zod"; import wikiLinkPlugin from "@braindb/remark-wiki-link"; var brainDBOptionsIn = z.object({ dbPath: z.string(), cache: z.boolean(), url: z.function( z.tuple([z.string(), z.record(z.string(), z.any())]), z.string() ), slug: z.function( z.tuple([z.string(), z.record(z.string(), z.any())]), z.string() ), root: z.string(), source: z.string(), git: z.boolean(), storeMarkdown: z.boolean(), // need to pass false in order to disable built-in remarkWikiLink plugin remarkWikiLink: z.boolean() }).partial(); var generateSlug = (filePath) => { const withoutFileExt = filePath.replace( new RegExp(path.extname(filePath) + "$"), "" ); const rawSlugSegments = withoutFileExt.split(path.sep); const slug = rawSlugSegments.map((segment) => githubSlug(segment)).join("/").replace(/\/index$/, ""); return slug; }; var slugToUrl = (slug) => { if (!slug.startsWith("/")) slug = `/${slug}`; if (!slug.endsWith("/")) slug = `${slug}/`; return slug; }; var defaultBrainDBOptions = { root: path.resolve(process.cwd(), "src/content/docs"), url: (filePath, frontmatter) => frontmatter.url ? String(frontmatter.url) : slugToUrl( frontmatter.slug ? String(frontmatter.slug) : generateSlug(filePath) ), git: true }; var bdbInstance = new BrainDB2(defaultBrainDBOptions); function getBrainDb() { try { bdbInstance.start(true); } catch { } return bdbInstance; } var brainDbAstro = defineIntegration({ name: "@braindb/astro", optionsSchema: brainDBOptionsIn.optional(), setup({ options }) { if (options) { bdbInstance.stop(); bdbInstance = new BrainDB2({ ...defaultBrainDBOptions, ...options }); } return { hooks: { "astro:config:setup": async ({ config, updateConfig }) => { await getBrainDb().ready(); const newConfig = { markdown: { remarkPlugins: options?.remarkWikiLink === false ? config.markdown.remarkPlugins : [ ...config.markdown.remarkPlugins || [], // I had to use wikiLinkPlugin without resolver // and puted resolver in separate plugin using visit // to support wikilinks in remark-dataview output wikiLinkPlugin, [remarkWikiLink, { bdb: getBrainDb() }] ] }, vite: { // https://github.com/vitejs/vite/issues/14289 optimizeDeps: { exclude: [ ...config.vite.optimizeDeps?.exclude || [], "@braindb" // "fsevents", // "@node-rs", // "@napi-rs", ] } } }; updateConfig(newConfig); } } }; } }); var index_default = brainDbAstro; export { brainDbAstro, index_default as default, generateSlug, getBrainDb }; //# sourceMappingURL=index.js.map