From 1985bd6669276718f2e366ecb90f2e94bf868334 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 6 Mar 2026 23:09:40 +0700 Subject: [PATCH] feat(server): add Phoenix priv/static to project icon search directories --- .../server/src/utils/project-icon.test.ts | 20 +++++++++++++++++++ packages/server/src/utils/project-icon.ts | 11 ++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/packages/server/src/utils/project-icon.test.ts b/packages/server/src/utils/project-icon.test.ts index ca158eac1..cd87340f6 100644 --- a/packages/server/src/utils/project-icon.test.ts +++ b/packages/server/src/utils/project-icon.test.ts @@ -44,6 +44,10 @@ describe("findProjectIcon", () => { expect(PRIORITY_DIRS).toContain("static"); expect(PRIORITY_DIRS).toContain("assets"); }); + + it("includes Phoenix static assets directory", () => { + expect(PRIORITY_DIRS).toContain("priv/static"); + }); }); describe("IGNORED_DIRS", () => { @@ -97,6 +101,14 @@ describe("findProjectIcon", () => { expect(result).toBe(join(tempDir, "static", "favicon.svg")); }); + it("finds icon in Phoenix priv/static directory", async () => { + mkdirSync(join(tempDir, "priv", "static"), { recursive: true }); + writeFileSync(join(tempDir, "priv", "static", "favicon.ico"), "icon content"); + + const result = await findProjectIcon(tempDir); + expect(result).toBe(join(tempDir, "priv", "static", "favicon.ico")); + }); + it("finds icon in assets directory (priority dir)", async () => { mkdirSync(join(tempDir, "assets")); writeFileSync(join(tempDir, "assets", "logo.png"), "icon content"); @@ -208,6 +220,14 @@ describe("findProjectIcon", () => { expect(result).toBe(join(tempDir, "packages", "ui", "logo.svg")); }); + it("finds icon in Phoenix app priv/static directory inside monorepo", async () => { + mkdirSync(join(tempDir, "apps", "api", "priv", "static"), { recursive: true }); + writeFileSync(join(tempDir, "apps", "api", "priv", "static", "favicon.ico"), "icon"); + + const result = await findProjectIcon(tempDir); + expect(result).toBe(join(tempDir, "apps", "api", "priv", "static", "favicon.ico")); + }); + it("prioritizes root priority dirs over monorepo dirs", async () => { mkdirSync(join(tempDir, "public"), { recursive: true }); mkdirSync(join(tempDir, "packages", "app", "public"), { recursive: true }); diff --git a/packages/server/src/utils/project-icon.ts b/packages/server/src/utils/project-icon.ts index 754a166f5..9cb1bd872 100644 --- a/packages/server/src/utils/project-icon.ts +++ b/packages/server/src/utils/project-icon.ts @@ -23,9 +23,16 @@ export const ICON_PATTERNS = [ ]; /** - * Directories to search first (in priority order). + * Directories or directory paths to search first (in priority order). */ -export const PRIORITY_DIRS = ["public", "static", "assets", "images", "img"]; +export const PRIORITY_DIRS = [ + "public", + "static", + "priv/static", + "assets", + "images", + "img", +]; /** * Monorepo package directory patterns to scan (e.g., packages/app, apps/web).