feat(favicon): serve project favicon reusing the header envelope logo

Serve an inline SVG icon at /favicon.svg and /favicon.ico and link it
from the shared Layout and the standalone entry view, so the admin UI,
status page, and entry pages stop emitting /favicon.ico 404s. Doubles
as the fallback for the upcoming per-feed favicon feature.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Julien Herr
2026-05-23 13:13:44 +02:00
parent a67baa71f4
commit d299c8891d
7 changed files with 89 additions and 7 deletions
+29
View File
@@ -0,0 +1,29 @@
import { describe, it, expect } from "vitest";
import worker from "../index";
import { createMockEnv } from "../test/setup";
import type { Env } from "../types";
function req(path: string): Request {
return new Request(`https://test.getmynews.app${path}`);
}
describe("project favicon", () => {
it("serves an SVG favicon at /favicon.svg", async () => {
const env = createMockEnv() as unknown as Env;
const res = await worker.fetch(req("/favicon.svg"), env);
expect(res.status).toBe(200);
expect(res.headers.get("Content-Type")).toMatch(/^image\/svg\+xml/);
expect(res.headers.get("Cache-Control")).toContain("max-age");
const body = await res.text();
expect(body).toContain("<svg");
});
it("serves the same icon at /favicon.ico", async () => {
const env = createMockEnv() as unknown as Env;
const res = await worker.fetch(req("/favicon.ico"), env);
expect(res.status).toBe(200);
expect(res.headers.get("Content-Type")).toMatch(/^image\/svg\+xml/);
const body = await res.text();
expect(body).toContain("<svg");
});
});