From 9e58857746b74ef3e122139f7db09509435bebc8 Mon Sep 17 00:00:00 2001
From: dralagen <dralagen@dralagen.fr>
Date: Sat, 26 Apr 2025 18:06:59 +0000
Subject: [PATCH] feat(favicon): add plugin to expose favicon from icon.png (#1942)

---
 quartz/plugins/emitters/favicon.ts |   16 ++++++++++++++++
 quartz/plugins/emitters/index.ts   |    1 +
 quartz.config.ts                   |    1 +
 3 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/quartz.config.ts b/quartz.config.ts
index efe9648..b3db3d6 100644
--- a/quartz.config.ts
+++ b/quartz.config.ts
@@ -86,6 +86,7 @@
       }),
       Plugin.Assets(),
       Plugin.Static(),
+      Plugin.Favicon(),
       Plugin.NotFoundPage(),
       // Comment out CustomOgImages to speed up build time
       Plugin.CustomOgImages(),
diff --git a/quartz/plugins/emitters/favicon.ts b/quartz/plugins/emitters/favicon.ts
new file mode 100644
index 0000000..c58322c
--- /dev/null
+++ b/quartz/plugins/emitters/favicon.ts
@@ -0,0 +1,16 @@
+import sharp from "sharp"
+import { joinSegments, QUARTZ, FilePath } from "../../util/path"
+import { QuartzEmitterPlugin } from "../types"
+
+export const Favicon: QuartzEmitterPlugin = () => ({
+  name: "Favicon",
+  async *emit({ argv }) {
+    const iconPath = joinSegments(QUARTZ, "static", "icon.png")
+    const dest = joinSegments(argv.output, "favicon.ico") as FilePath
+
+    await sharp(iconPath).resize(48, 48).toFormat("png").toFile(dest)
+
+    yield dest
+  },
+  async *partialEmit() {},
+})
diff --git a/quartz/plugins/emitters/index.ts b/quartz/plugins/emitters/index.ts
index 842ffb0..d2de2ed 100644
--- a/quartz/plugins/emitters/index.ts
+++ b/quartz/plugins/emitters/index.ts
@@ -5,6 +5,7 @@
 export { AliasRedirects } from "./aliases"
 export { Assets } from "./assets"
 export { Static } from "./static"
+export { Favicon } from "./favicon"
 export { ComponentResources } from "./componentResources"
 export { NotFoundPage } from "./404"
 export { CNAME } from "./cname"

--
Gitblit v1.10.0