@mintlify/prebuild
Version:
Helpful functions for Mintlify's prebuild step
83 lines (82 loc) • 2.94 kB
JavaScript
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,
},
};
}