From d977d67c585cfb5c367fa81f911cd4c25378b730 Mon Sep 17 00:00:00 2001 From: Valentyne Stigloher Date: Sun, 14 Jul 2024 20:32:17 +0200 Subject: [PATCH] (nuxt) migrate middleware/atom.js --- middleware/atom.global.ts | 55 +++++++++++++++++++++++++++++++++++++++ middleware/atom.js | 49 ---------------------------------- nuxt.config.ts | 1 - server/express/blog.ts | 2 +- 4 files changed, 56 insertions(+), 51 deletions(-) create mode 100644 middleware/atom.global.ts delete mode 100644 middleware/atom.js diff --git a/middleware/atom.global.ts b/middleware/atom.global.ts new file mode 100644 index 000000000..28ac59c0a --- /dev/null +++ b/middleware/atom.global.ts @@ -0,0 +1,55 @@ +import { Feed } from 'feed'; +import { defineNuxtRouteMiddleware, useNuxtApp, useRuntimeConfig } from 'nuxt/app'; +import parseMarkdown from '~/src/parseMarkdown.ts'; +import useConfig from '~/composables/useConfig.ts'; +import type { Post } from '~/server/express/blog.ts'; + +export default defineNuxtRouteMiddleware(async (to) => { + const { $translator: translator, ssrContext } = useNuxtApp(); + const res = ssrContext?.event.node.res; + + if (!res || to.path !== '/blog.atom') { + return; + } + + const config = useConfig(); + const runtimeConfig = useRuntimeConfig(); + + const posts = await $fetch('/api/blog'); + + const feed = new Feed({ + title: `${translator.translate('title')} • ${translator.translate('links.blog')}`, + description: translator.translate('description'), + id: runtimeConfig.public.baseUrl, + link: `${runtimeConfig.public.baseUrl}/blog.atom`, + language: config.locale, + image: `${runtimeConfig.public.baseUrl}/icon.png`, + favicon: `${runtimeConfig.public.baseUrl}/icon.png`, + updated: new Date(posts[0].date), + copyright: '', + }); + + for (const post of posts) { + const markdown = (await import(`../data/blog/${post.slug}.md`)).default; + const parsed = await parseMarkdown(markdown, translator); + + feed.addItem({ + title: post.title, + id: `${runtimeConfig.public.baseUrl}/${config.links.blogRoute}/${post.slug}`, + link: `${runtimeConfig.public.baseUrl}/${config.links.blogRoute}/${post.slug}`, + description: parsed.intro ?? undefined, + content: parsed.content ?? undefined, + author: post.authors.map((author) => ({ + name: author, + link: author.startsWith('@') ? `${runtimeConfig.public.baseUrl}/${author}` : undefined, + })), + date: new Date(post.date), + image: post.hero ? `${runtimeConfig.public.baseUrl}${post.hero.src}` : undefined, + }); + } + + res.setHeader('Content-Type', 'application/rss+xml; charset=utf-8'); + res.end(feed.atom1()); + + return new Promise(() => {}); // halt execution +}); diff --git a/middleware/atom.js b/middleware/atom.js deleted file mode 100644 index 56390e312..000000000 --- a/middleware/atom.js +++ /dev/null @@ -1,49 +0,0 @@ -import { Feed } from 'feed'; -import parseMarkdown from '../src/parseMarkdown.ts'; -import fetch from 'node-fetch'; - -export default async function ({ app, route, res }) { - if (!process.server || route.path !== '/blog.atom') { - return; - } - - const posts = await (await fetch(`${process.env.BASE_URL}/api/blog`)).json(); - - const feed = new Feed({ - title: `${app.$t('title')} • ${app.$t('links.blog')}`, - description: app.$t('description'), - id: process.env.BASE_URL, - link: `${process.env.BASE_URL}/blog.atom`, - language: app.$config.locale, - image: `${process.env.BASE_URL}/icon.png`, - favicon: `${process.env.BASE_URL}/icon.png`, - updated: new Date(posts[0].date), - }); - - for (const post of posts) { - const parsed = await parseMarkdown( - (await import(`../locale/${app.$config.locale}/blog/${post.slug}.md`)).default, - app.$translator, - ); - - feed.addItem({ - title: post.title, - id: `${process.env.BASE_URL}/${app.$config.links.blogRoute}/${post.slug}`, - link: `${process.env.BASE_URL}/${app.$config.links.blogRoute}/${post.slug}`, - description: parsed.intro, - content: parsed.content, - author: post.authors.map((author) => ({ - name: author, - link: author.startsWith('@') ? `${process.env.BASE_URL}/${author}` : undefined, - })), - date: new Date(post.date), - image: post.hero ? `${process.env.BASE_URL}${post.hero.src}` : undefined, - }); - } - - - res.setHeader('Content-Type', 'application/rss+xml; charset=utf-8'); - res.end(feed.atom1()); - - return new Promise(() => {}); // halt execution -} diff --git a/nuxt.config.ts b/nuxt.config.ts index 448913d34..2c72652e0 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -534,7 +534,6 @@ exports.randomFillSync = randomFillSync`], } }, }, - middleware: 'atom', loadingIndicator: { name: 'views/loading.html', }, diff --git a/server/express/blog.ts b/server/express/blog.ts index 44fde8b2a..299fc9344 100644 --- a/server/express/blog.ts +++ b/server/express/blog.ts @@ -4,7 +4,7 @@ import { handleErrorAsync } from '../../src/helpers.ts'; import fs from 'fs'; import { caches } from '../../src/cache.ts'; -interface Post { +export interface Post { slug: string; title: string; date: string;