import node from '@astrojs/node' import solid from '@astrojs/solid-js' import { Graphviz } from '@hpcc-js/wasm-graphviz' import { defineConfig } from 'astro/config' import browserslist from 'browserslist' import { browserslistToTargets } from 'lightningcss' import { toString } from 'mdast-util-to-string' import getReadingTime from 'reading-time' import { visit } from 'unist-util-visit' import UnoCSS from 'unocss/astro' function remarkReadingTime() { return function (tree, { data }) { const textOnPage = toString(tree) const readingTime = getReadingTime(textOnPage) data.astro.frontmatter.minutesRead = readingTime.text } } function remarkGraphvizSvg() { return async function (tree) { const graphviz = await Graphviz.load() const instances = [] visit(tree, { type: 'code', lang: 'dot' }, (node, index, parent) => { instances.push([node.value, index, parent]) }) for (const [dot, index, parent] of instances) { const svg = graphviz.dot(dot, 'svg') parent.children.splice(index, 1, { type: 'html', value: `
${svg}
`, }) } } } // https://astro.build/config export default defineConfig({ output: 'server', site: 'https://tei.su', integrations: [ solid(), UnoCSS({ injectReset: true, }), ], markdown: { remarkPlugins: [ remarkReadingTime, remarkGraphvizSvg, ], smartypants: false, shikiConfig: { themes: { dark: 'catppuccin-mocha', light: 'catppuccin-latte', }, }, }, vite: { esbuild: { jsx: 'automatic' }, define: { 'import.meta.env.VITE_BUILD_DATE': JSON.stringify(new Date().toISOString().split('T')[0]), }, css: { transformer: 'lightningcss', lightningcss: { targets: browserslistToTargets(browserslist('>= 0.25%')), }, }, build: { cssMinify: 'lightningcss', }, }, adapter: node({ mode: 'standalone', }), server: { host: true, }, })