@realfavicongenerator/generate-favicon
Version:
Generate a favicon
93 lines (85 loc) • 3.18 kB
text/typescript
import { Svg } from "@svgdotjs/svg.js";
import { DesktopIconSettings, initDesktopIconSettings } from "./desktop";
import { TouchIconSettings, initTouchIconSettings } from "./ios";
import { WebAppManifestSettings, initWebAppManifestSettings } from "./web-app-manifest";
import { IconTransformation, MasterIcon } from "./helper";
import { generateDesktopFaviconFiles, generateDesktopFaviconHtml } from "../generation/desktop";
import { generateTouchIconFiles, generateTouchIconHtml } from "../generation/touch-icon";
import { generateWebAppManifestHtml, generateWebAppManifestIconFiles } from "../generation/web-app-manifest";
import { ImageAdapter } from "../svg/adapter";
import { FaviconAssetFileNameTransformer, FaviconAssetPathTransformer, FaviconFiles, FaviconMarkups, identityFaviconAssetFileNameTransformer, identityFaviconAssetPathTransformer } from "../generation";
export type FaviconIconSettings = {
desktop: DesktopIconSettings,
touch: TouchIconSettings,
webAppManifest: WebAppManifestSettings,
}
export type FaviconSettings = {
icon: FaviconIconSettings,
path: string,
skipMetadataInjection?: boolean,
version?: string,
}
export type EditedIcon = {
icon?: Svg,
transformation: IconTransformation
}
export const initFaviconIconSettings = (): FaviconIconSettings => {
return {
desktop: initDesktopIconSettings(),
touch: initTouchIconSettings(),
webAppManifest: initWebAppManifestSettings()
};
}
export const generateFaviconFiles = async (
masterIcon: MasterIcon,
settings: FaviconSettings,
imageAdapter: ImageAdapter,
pathTransformer: FaviconAssetPathTransformer = identityFaviconAssetPathTransformer,
fileNameTransformer: FaviconAssetFileNameTransformer = identityFaviconAssetFileNameTransformer,
): Promise<FaviconFiles> => (
Object.assign(
{},
await generateDesktopFaviconFiles(
masterIcon,
settings.icon.desktop,
imageAdapter,
settings.skipMetadataInjection
),
await generateTouchIconFiles(
masterIcon,
settings.icon.touch,
imageAdapter,
settings.skipMetadataInjection
),
await generateWebAppManifestIconFiles(
masterIcon,
settings.icon.webAppManifest,
settings.path,
imageAdapter,
pathTransformer,
fileNameTransformer,
settings.skipMetadataInjection,
settings.version
)
)
);
export const generateFaviconHtml = (
settings: FaviconSettings,
transformer: FaviconAssetPathTransformer = identityFaviconAssetPathTransformer
): FaviconMarkups => {
const desktop = generateDesktopFaviconHtml(settings.path, transformer, settings.version);
const touch = generateTouchIconHtml(settings.path, settings.icon.touch.appTitle, transformer, settings.version);
const webAppManifest = generateWebAppManifestHtml(settings.path, transformer, settings.version);
return {
markups: [
...desktop.markups,
...touch.markups,
...webAppManifest.markups
],
cssSelectors: [
...desktop.cssSelectors,
...touch.cssSelectors,
...webAppManifest.cssSelectors
]
}
};