t3-code-android-nightly/scripts/lib/brand-assets.ts
Julius Marminge eb8f6f42a5
ci(release): build, sign, and publish self-contained CLI archives (#11317)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-09-13 21:24:20 -07:00

111 lines
4.6 KiB
TypeScript

export const BRAND_ASSET_PATHS = {
developmentIconComposerProject: "assets/dev/app-icon.icon",
developmentIosIconPng: "assets/dev/blueprint-ios-1024.png",
developmentUniversalIconPng: "assets/dev/blueprint-universal-1024.png",
productionIconComposerProject: "assets/prod/app-icon.icon",
productionIosIconPng: "assets/prod/black-ios-1024.png",
productionMacIconPng: "assets/prod/black-macos-1024.png",
productionLinuxIconPng: "assets/prod/black-universal-1024.png",
productionWindowsIconIco: "assets/prod/t3-black-windows.ico",
productionWebFaviconIco: "assets/prod/t3-black-web-favicon.ico",
productionWebFavicon16Png: "assets/prod/t3-black-web-favicon-16x16.png",
productionWebFavicon32Png: "assets/prod/t3-black-web-favicon-32x32.png",
productionWebAppleTouchIconPng: "assets/prod/t3-black-web-apple-touch-180.png",
nightlyIconComposerProject: "assets/nightly/app-icon.icon",
nightlyIosIconPng: "assets/nightly/nightly-ios-1024.png",
nightlyMacIconPng: "assets/nightly/nightly-macos-1024.png",
nightlyLinuxIconPng: "assets/nightly/nightly-universal-1024.png",
nightlyWindowsIconIco: "assets/nightly/nightly-windows.ico",
nightlyWebFaviconIco: "assets/nightly/nightly-web-favicon.ico",
nightlyWebFavicon16Png: "assets/nightly/nightly-web-favicon-16x16.png",
nightlyWebFavicon32Png: "assets/nightly/nightly-web-favicon-32x32.png",
nightlyWebAppleTouchIconPng: "assets/nightly/nightly-web-apple-touch-180.png",
developmentDesktopIconPng: "assets/dev/blueprint-macos-1024.png",
developmentWindowsIconIco: "assets/dev/blueprint-windows.ico",
developmentWebFaviconIco: "assets/dev/blueprint-web-favicon.ico",
developmentWebFavicon16Png: "assets/dev/blueprint-web-favicon-16x16.png",
developmentWebFavicon32Png: "assets/dev/blueprint-web-favicon-32x32.png",
developmentWebAppleTouchIconPng: "assets/dev/blueprint-web-apple-touch-180.png",
} as const;
export type WebAssetBrand = "development" | "nightly" | "production";
export const WEB_ASSET_CHANNELS = ["latest", "nightly"] as const;
export type WebAssetChannel = (typeof WEB_ASSET_CHANNELS)[number];
export function resolveWebAssetBrandForChannel(channel: WebAssetChannel): WebAssetBrand {
return channel === "nightly" ? "nightly" : "production";
}
export function resolveWebAssetBrandForPackageVersion(version: string): WebAssetBrand {
return /^[^-+]+-(?:nightly|preview)\./.test(version) ? "nightly" : "production";
}
export interface IconOverride {
readonly sourceRelativePath: string;
readonly targetRelativePath: string;
}
const WEB_ICON_TARGET_FILENAMES = {
faviconIco: "favicon.ico",
favicon16Png: "favicon-16x16.png",
favicon32Png: "favicon-32x32.png",
appleTouchIconPng: "apple-touch-icon.png",
} as const;
const WEB_ICON_SOURCE_PATHS_BY_BRAND = {
development: {
faviconIco: BRAND_ASSET_PATHS.developmentWebFaviconIco,
favicon16Png: BRAND_ASSET_PATHS.developmentWebFavicon16Png,
favicon32Png: BRAND_ASSET_PATHS.developmentWebFavicon32Png,
appleTouchIconPng: BRAND_ASSET_PATHS.developmentWebAppleTouchIconPng,
},
nightly: {
faviconIco: BRAND_ASSET_PATHS.nightlyWebFaviconIco,
favicon16Png: BRAND_ASSET_PATHS.nightlyWebFavicon16Png,
favicon32Png: BRAND_ASSET_PATHS.nightlyWebFavicon32Png,
appleTouchIconPng: BRAND_ASSET_PATHS.nightlyWebAppleTouchIconPng,
},
production: {
faviconIco: BRAND_ASSET_PATHS.productionWebFaviconIco,
favicon16Png: BRAND_ASSET_PATHS.productionWebFavicon16Png,
favicon32Png: BRAND_ASSET_PATHS.productionWebFavicon32Png,
appleTouchIconPng: BRAND_ASSET_PATHS.productionWebAppleTouchIconPng,
},
} as const satisfies Record<WebAssetBrand, Record<keyof typeof WEB_ICON_TARGET_FILENAMES, string>>;
export function resolveWebIconOverrides(
brand: WebAssetBrand,
targetDirectory: string,
): ReadonlyArray<IconOverride> {
const sourcePaths = WEB_ICON_SOURCE_PATHS_BY_BRAND[brand];
return [
{
sourceRelativePath: sourcePaths.faviconIco,
targetRelativePath: `${targetDirectory}/${WEB_ICON_TARGET_FILENAMES.faviconIco}`,
},
{
sourceRelativePath: sourcePaths.favicon16Png,
targetRelativePath: `${targetDirectory}/${WEB_ICON_TARGET_FILENAMES.favicon16Png}`,
},
{
sourceRelativePath: sourcePaths.favicon32Png,
targetRelativePath: `${targetDirectory}/${WEB_ICON_TARGET_FILENAMES.favicon32Png}`,
},
{
sourceRelativePath: sourcePaths.appleTouchIconPng,
targetRelativePath: `${targetDirectory}/${WEB_ICON_TARGET_FILENAMES.appleTouchIconPng}`,
},
];
}
export const DEVELOPMENT_ICON_OVERRIDES = resolveWebIconOverrides("development", "dist/client");
export const DEVELOPMENT_PUBLIC_ICON_OVERRIDES = resolveWebIconOverrides(
"development",
"apps/web/public",
);