1export const BRAND_ASSET_PATHS = {
2 developmentIconComposerProject: "assets/knife/app-icon.icon",
3 developmentIosIconPng: "assets/knife/icon-1024.png",
4 developmentUniversalIconPng: "assets/knife/icon-1024.png",
5 productionIconComposerProject: "assets/knife/app-icon.icon",
6 productionIosIconPng: "assets/knife/icon-1024.png",
7 productionMacIconPng: "assets/knife/macos-1024.png",
8 productionLinuxIconPng: "assets/knife/icon-1024.png",
9 productionWindowsIconIco: "assets/knife/icon.ico",
10 productionWebFaviconIco: "assets/knife/icon.ico",
11 productionWebFavicon16Png: "assets/knife/favicon-16x16.png",
12 productionWebFavicon32Png: "assets/knife/favicon-32x32.png",
13 productionWebAppleTouchIconPng: "assets/knife/apple-touch-180.png",
14 nightlyIconComposerProject: "assets/knife/app-icon.icon",
15 nightlyIosIconPng: "assets/knife/icon-1024.png",
16 nightlyMacIconPng: "assets/knife/macos-1024.png",
17 nightlyLinuxIconPng: "assets/knife/icon-1024.png",
18 nightlyWindowsIconIco: "assets/knife/icon.ico",
19 nightlyWebFaviconIco: "assets/knife/icon.ico",
20 nightlyWebFavicon16Png: "assets/knife/favicon-16x16.png",
21 nightlyWebFavicon32Png: "assets/knife/favicon-32x32.png",
22 nightlyWebAppleTouchIconPng: "assets/knife/apple-touch-180.png",
23 developmentDesktopIconPng: "assets/knife/macos-1024.png",
24 developmentWindowsIconIco: "assets/knife/icon.ico",
25 developmentWebFaviconIco: "assets/knife/icon.ico",
26 developmentWebFavicon16Png: "assets/knife/favicon-16x16.png",
27 developmentWebFavicon32Png: "assets/knife/favicon-32x32.png",
28 developmentWebAppleTouchIconPng: "assets/knife/apple-touch-180.png",
29} as const;
30
31export type WebAssetBrand = "development" | "nightly" | "production";
32
33export const WEB_ASSET_CHANNELS = ["latest", "nightly"] as const;
34
35export type WebAssetChannel = (typeof WEB_ASSET_CHANNELS)[number];
36
37export function resolveWebAssetBrandForChannel(channel: WebAssetChannel): WebAssetBrand {
38 return channel === "nightly" ? "nightly" : "production";
39}
40
41export function resolveWebAssetBrandForPackageVersion(version: string): WebAssetBrand {
42 return /^[^-+]+-(?:nightly|preview)\./.test(version) ? "nightly" : "production";
43}
44
45export interface IconOverride {
46 readonly sourceRelativePath: string;
47 readonly targetRelativePath: string;
48}
49
50const WEB_ICON_TARGET_FILENAMES = {
51 faviconIco: "favicon.ico",
52 favicon16Png: "favicon-16x16.png",
53 favicon32Png: "favicon-32x32.png",
54 appleTouchIconPng: "apple-touch-icon.png",
55} as const;
56
57const WEB_ICON_SOURCE_PATHS_BY_BRAND = {
58 development: {
59 faviconIco: BRAND_ASSET_PATHS.developmentWebFaviconIco,
60 favicon16Png: BRAND_ASSET_PATHS.developmentWebFavicon16Png,
61 favicon32Png: BRAND_ASSET_PATHS.developmentWebFavicon32Png,
62 appleTouchIconPng: BRAND_ASSET_PATHS.developmentWebAppleTouchIconPng,
63 },
64 nightly: {
65 faviconIco: BRAND_ASSET_PATHS.nightlyWebFaviconIco,
66 favicon16Png: BRAND_ASSET_PATHS.nightlyWebFavicon16Png,
67 favicon32Png: BRAND_ASSET_PATHS.nightlyWebFavicon32Png,
68 appleTouchIconPng: BRAND_ASSET_PATHS.nightlyWebAppleTouchIconPng,
69 },
70 production: {
71 faviconIco: BRAND_ASSET_PATHS.productionWebFaviconIco,
72 favicon16Png: BRAND_ASSET_PATHS.productionWebFavicon16Png,
73 favicon32Png: BRAND_ASSET_PATHS.productionWebFavicon32Png,
74 appleTouchIconPng: BRAND_ASSET_PATHS.productionWebAppleTouchIconPng,
75 },
76} as const satisfies Record<WebAssetBrand, Record<keyof typeof WEB_ICON_TARGET_FILENAMES, string>>;
77
78export function resolveWebIconOverrides(
79 brand: WebAssetBrand,
80 targetDirectory: string,
81): ReadonlyArray<IconOverride> {
82 const sourcePaths = WEB_ICON_SOURCE_PATHS_BY_BRAND[brand];
83 return [
84 {
85 sourceRelativePath: sourcePaths.faviconIco,
86 targetRelativePath: `${targetDirectory}/${WEB_ICON_TARGET_FILENAMES.faviconIco}`,
87 },
88 {
89 sourceRelativePath: sourcePaths.favicon16Png,
90 targetRelativePath: `${targetDirectory}/${WEB_ICON_TARGET_FILENAMES.favicon16Png}`,
91 },
92 {
93 sourceRelativePath: sourcePaths.favicon32Png,
94 targetRelativePath: `${targetDirectory}/${WEB_ICON_TARGET_FILENAMES.favicon32Png}`,
95 },
96 {
97 sourceRelativePath: sourcePaths.appleTouchIconPng,
98 targetRelativePath: `${targetDirectory}/${WEB_ICON_TARGET_FILENAMES.appleTouchIconPng}`,
99 },
100 ];
101}
102
103export const DEVELOPMENT_ICON_OVERRIDES = resolveWebIconOverrides("development", "dist/client");
104
105export const DEVELOPMENT_PUBLIC_ICON_OVERRIDES = resolveWebIconOverrides(
106 "development",
107 "apps/web/public",
108);