Files
portfolio/astro.config.ts
patrick d21806dfd1
All checks were successful
Generate a build and push to Cloudflare Pages / Build and Deploy to Cloudflare Pages (push) Successful in 1m24s
initial commit
2026-03-25 18:53:21 -04:00

164 lines
4.4 KiB
TypeScript

import { defineConfig } from 'astro/config'
import mdx from '@astrojs/mdx'
import icon from 'astro-icon'
import expressiveCode from 'astro-expressive-code'
import { rehypeHeadingIds } from '@astrojs/markdown-remark'
import rehypeExternalLinks from 'rehype-external-links'
import rehypePrettyCode from 'rehype-pretty-code'
import rehypeAutolinkHeadings from 'rehype-autolink-headings'
import remarkEmoji from 'remark-emoji'
import remarkMath from 'remark-math'
import remarkSectionize from 'remark-sectionize'
import rehypeDocument from 'rehype-document'
import { pluginCollapsibleSections } from '@expressive-code/plugin-collapsible-sections'
import { pluginLineNumbers } from '@expressive-code/plugin-line-numbers'
import tailwindcss from "@tailwindcss/vite";
import Icons from 'unplugin-icons/vite';
import svelte from '@astrojs/svelte';
import { fileURLToPath } from 'url';
import path from 'path';
function rehypeDemoteH1AndStripTitle() {
return (tree: any) => {
const walk = (node: any, parent: any | null, indexInParent: number | null) => {
if (!node) return
const isElement = node.type === 'element'
if (isElement) {
if (node.tagName === 'title') {
if (parent && Array.isArray(parent.children) && indexInParent !== null && indexInParent > -1) {
parent.children.splice(indexInParent, 1)
return
}
}
if (node.tagName === 'h1') {
node.tagName = 'h2'
}
}
if (Array.isArray(node.children)) {
for (let i = node.children.length - 1; i >= 0; i--) {
walk(node.children[i], node, i)
}
}
}
walk(tree, null, null)
}
}
export default defineConfig({
site: 'https://patrick.jaroszew.ski',
integrations: [expressiveCode({
themes: ['catppuccin-latte', 'ayu-dark'],
plugins: [pluginCollapsibleSections(), pluginLineNumbers()],
useDarkModeMediaQuery: true,
defaultProps: {
wrap: true,
collapseStyle: 'collapsible-auto',
overridesByLang: {
'ansi,bat,bash,batch,cmd,console,powershell,ps,ps1,psd1,psm1,sh,shell,shellscript,shellsession,text,zsh':
{
showLineNumbers: true,
},
},
},
}), svelte(), mdx(), icon()],
vite: {
plugins: [
tailwindcss() as any,
Icons({ compiler: 'svelte' }),
],
resolve: {
alias: {
'@': path.resolve(path.dirname(fileURLToPath(import.meta.url)), './src'),
'$lib': path.resolve(path.dirname(fileURLToPath(import.meta.url)), './src/lib')
}
},
optimizeDeps: {
exclude: ["satori", "satori-html"],
include: ["clsx"]
},
},
server: {
port: 3000,
host: true,
},
devToolbar: {
enabled: false,
},
markdown: {
syntaxHighlight: false,
rehypePlugins: [
rehypeDocument,
[
rehypeExternalLinks,
{
target: '_blank',
ariaLabel: 'External link'
},
],
rehypeDemoteH1AndStripTitle,
rehypeHeadingIds,
[
rehypeAutolinkHeadings,
{
behavior: 'append',
properties: {
className: ['heading-anchor'],
ariaLabel: 'Link to this section',
},
content: {
type: 'element',
tagName: 'svg',
properties: {
className: ['anchor-icon'],
xmlns: 'http://www.w3.org/2000/svg',
width: '16',
height: '16',
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
strokeWidth: '2',
strokeLinecap: 'round',
strokeLinejoin: 'round'
},
children: [
{
type: 'element',
tagName: 'path',
properties: {
d: 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71'
}
},
{
type: 'element',
tagName: 'path',
properties: {
d: 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'
}
}
]
}
}
],
[
rehypePrettyCode,
{
theme: {
light: 'catppuccin-latte',
dark: 'ayu-dark',
},
},
],
],
remarkPlugins: [remarkMath, remarkEmoji, remarkSectionize],
},
})