[READ-ONLY] Mirror of https://github.com/danielroe/roe.dev. This is the code and content for my personal website, built in Nuxt.
roe.dev
1import { addServerHandler, createResolver, defineNuxtModule, useNuxt } from 'nuxt/kit'
2import { pageMeta } from './shared/page-meta'
3
4export default defineNuxtModule({
5 meta: {
6 name: 'md-routes',
7 },
8 setup () {
9 const nuxt = useNuxt()
10 const resolver = createResolver(import.meta.url)
11
12 // Expose page meta as a virtual module for server routes
13 nuxt.options.nitro.virtual ||= {}
14 nuxt.options.nitro.virtual['#md-page-meta.json'] = () =>
15 `export const pageMeta = ${JSON.stringify(pageMeta)}`
16
17 const mdPages = [
18 '/',
19 '/ai',
20 '/bio',
21 '/talks',
22 '/uses',
23 '/projects',
24 '/blog',
25 ]
26
27 // Register blog post .md handlers once we know all the slugs
28 nuxt.hook('markdown:blog-entries', entries => {
29 for (const entry of entries) {
30 const route = `${entry.path}.md`
31
32 addServerHandler({
33 route,
34 handler: resolver.resolve('./md-routes/runtime/server/blog-md.get'),
35 })
36
37 mdPages.push(entry.path)
38 }
39
40 // Now that all pages are known, expose them for the middleware
41 nuxt.options.nitro.virtual!['#md-pages.json'] = () =>
42 `export const mdPages = new Set(${JSON.stringify(mdPages)})`
43 })
44
45 nuxt.options.nitro.externals ||= {}
46 nuxt.options.nitro.externals.inline ||= []
47 nuxt.options.nitro.externals.inline.push('#md-page-meta.json', '#md-pages.json')
48 },
49})