import { createHash } from "node:crypto"; import { readFile } from "node:fs/promises"; import { basename, join } from "node:path"; import { fileURLToPath } from "node:url"; // Legacy fixture keys stay inside test infrastructure. Production imports semantic CSS paths. const sourceStyles: Record = { "about-mobile": "src/styles/pages/about-responsive.css", "about": "src/styles/pages/about.css", "ads": "src/styles/components/advertising-compat.css", "base": "src/styles/foundations/base.css", "dialogAd": "src/styles/components/advertisement-dialog.css", "downloadPop": "src/styles/components/app-download-dialog.css", "eighteen": "src/styles/components/age-gate.css", "feedback": "src/styles/pages/feedback.css", "footer": "src/styles/components/site-footer.css", "header": "src/styles/components/site-header.css", "help": "src/styles/pages/help.css", "index": "src/styles/pages/home.css", "installGuide": "src/styles/components/installation-guide.css", "legal": "src/styles/pages/legal.css", "list": "src/styles/pages/drama-list.css", "mobile-search": "src/styles/pages/mobile-search.css", "mobileTabbar": "src/styles/components/mobile-tabbar.css", "moreList": "src/styles/pages/expanded-list.css", "nav": "src/styles/pages/site-navigation.css", "notFound": "src/styles/pages/not-found.css", "pagination": "src/styles/components/pagination.css", "play": "src/styles/pages/playback.css", "playLinks": "src/styles/components/playback-links.css", "popularRecommend": "src/styles/pages/popular-recommendations.css", "promo-grid": "src/styles/components/promotional-grid.css", "promo": "src/styles/components/promotional-banner.css", "pwa": "src/styles/overrides/pwa-safe-area.css", "rank": "src/styles/pages/rankings.css", "recentlyAdded": "src/styles/pages/recently-added.css", "search": "src/styles/pages/search-results.css", "series": "src/styles/pages/series-list.css", "tags": "src/styles/pages/tag-detail.css", "toast": "src/styles/components/toast.css", "topic": "src/styles/pages/topics.css", "topicDetail": "src/styles/pages/topic-detail.css", "player": "src/styles/components/video-player.css" }; export async function createStyleFixture(keys: readonly string[]) { const root = fileURLToPath(new URL("..", import.meta.url)); const layout = await readFile(join(root, "src/app/layout.tsx"), "utf8"); const order = [...layout.matchAll(/^import ["']@\/([^"']+\.css)["'];/gm)].map((match) => "src/" + match[1]); const files = [...new Set(keys.map((key) => { const file = sourceStyles[key]; if (!file) throw new Error("Unknown fixture stylesheet: " + key); return file; }))].sort((first, second) => order.indexOf(first) - order.indexOf(second)); for (const file of files) { if (!order.includes(file)) throw new Error("Fixture stylesheet is not imported by the root layout: " + file); } const css = (await Promise.all(files.map((file) => readFile(join(root, file), "utf8")))).join("\n"); return { css, href: "/fixture-" + createHash("sha256").update(css).digest("hex").slice(0, 12) + ".css", tokens: files.map((file) => basename(file, ".css")).join(" "), }; }