@braindb/astro
Version:
BrainDB Astro integration
150 lines (148 loc) • 4.53 kB
JavaScript
// 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