UNPKG

@mintlify/prebuild

Version:

Helpful functions for Mintlify's prebuild step

83 lines (82 loc) 2.94 kB
import favicons from 'favicons'; import { readFile } from 'fs/promises'; import { join } from 'path'; import sharp from 'sharp'; import { sharpsFromIco } from 'sharp-ico'; export const getImageBuf = async (path) => { if (path.endsWith('.ico')) { const icoFaviconBuffer = await readFile(path); const sharps = sharpsFromIco(icoFaviconBuffer); const icos = await Promise.all(sharps.map(async (ico) => { const buf = 'data' in ico ? await sharp(ico.data).png().toBuffer() : await ico.png().toBuffer(); return { buf, len: buf.length }; })); icos.sort((a, b) => b.len - a.len); return icos[0]?.buf ?? null; } else { const faviconBuffer = await readFile(path); return faviconBuffer; } }; export async function generateFavicons(config, contentDirectoryPath) { if (config.favicon == null) return; const faviconsConfig = getFaviconsConfig(config.name); try { if (typeof config.favicon === 'string') { const favicon = await getImageBuf(join(contentDirectoryPath, config.favicon)); if (!favicon) return; const icons = await favicons(favicon, faviconsConfig); return [icons]; } else { const lightPath = join(contentDirectoryPath, config.favicon.light); const darkPath = join(contentDirectoryPath, config.favicon.dark); const lightFavicon = await getImageBuf(lightPath); const darkFavicon = await getImageBuf(darkPath); if (!lightFavicon || !darkFavicon) return; const [lightIcons, darkIcons] = await Promise.all([ favicons(lightFavicon, faviconsConfig), favicons(darkFavicon, { ...faviconsConfig, path: '/favicons-dark' }), ]); return [lightIcons, darkIcons]; } } catch (err) { if (err instanceof Error) { console.log('Error generating favicons: ', err.message); } } } export function getFaviconsConfig(name) { return { path: '/favicons', appName: name, appShortName: name, dir: 'auto', lang: 'en-US', background: 'transparent', theme_color: 'transparent', appleStatusBarStyle: 'black-translucent', display: 'standalone', orientation: 'any', scope: '/', start_url: '/?homescreen=1', preferRelatedApplications: false, version: '1.0', pixel_art: false, loadManifestWithCredentials: true, manifestMaskable: false, icons: { android: ['android-chrome-192x192.png', 'android-chrome-256x256.png'], appleIcon: ['apple-touch-icon.png'], appleStartup: false, favicons: true, windows: ['mstile-150x150.png'], yandex: false, }, }; }