aboutsummaryrefslogtreecommitdiff
path: root/astro.config.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'astro.config.mjs')
-rw-r--r--astro.config.mjs41
1 files changed, 39 insertions, 2 deletions
diff --git a/astro.config.mjs b/astro.config.mjs
index bbf2ac0..fab0838 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -1,17 +1,54 @@
import { defineConfig } from "astro/config";
+import { globbySync } from "globby";
+import fs from "node:fs";
+import matter from "gray-matter";
+import path from "node:path";
+import rehypeExternalLinks from "rehype-external-links";
+import sitemap from "@astrojs/sitemap";
+
import { remarkReadingTime } from "./src/plugins/remarkReadingTime";
import ogImages from "./src/integrations/ogImages";
-import sitemap from "@astrojs/sitemap";
+import rehypeLazyImages from "./src/plugins/rehypeLazyImages";
+
+const blogDir = path.resolve("./src/content/blog");
+
+const lastmodBySlug = Object.fromEntries(
+ globbySync("*.md", { cwd: blogDir }).map((file) => {
+ const slug = file.replace(/\.md$/, "");
+ const { data } = matter(fs.readFileSync(path.join(blogDir, file), "utf8"));
+ const date = data.dateModified ?? data.datePublished;
+ return [slug, new Date(date).toISOString()];
+ })
+);
+
+const buildLastmod = new Date().toISOString();
export default defineConfig({
site: "https://popov.link",
output: "static",
- integrations: [sitemap(), ogImages()],
+ integrations: [
+ sitemap({
+ serialize(item) {
+ const url = new URL(item.url);
+ const match = url.pathname.match(/^\/blog\/([^/]+)\/?$/);
+
+ if (match && lastmodBySlug[match[1]]) {
+ item.lastmod = lastmodBySlug[match[1]];
+ } else {
+ item.lastmod = buildLastmod;
+ }
+
+ return item;
+ },
+ }),
+ ogImages(),
+ ],
build: {
inlineStylesheets: "always",
},
markdown: {
remarkPlugins: [remarkReadingTime],
+ rehypePlugins: [[rehypeExternalLinks, { target: "_blank", rel: ["noopener", "noreferrer"] }], rehypeLazyImages],
shikiConfig: {
theme: "vitesse-dark",
},