@realfavicongenerator/generate-favicon
Version:
Generate a favicon
68 lines (67 loc) • 3.82 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateDesktopFaviconFiles = exports.generateDesktopFaviconHtml = exports.IcoFaviconFileName = exports.SvgFaviconFileName = exports.PngFaviconFileName = exports.IcoFaviconSizes = exports.PngFaviconFileSize = void 0;
const _1 = require(".");
const helper_1 = require("../icon/helper");
const desktop_1 = require("../svg/desktop");
const ico_1 = require("../icon/ico");
const helper_2 = require("../helper");
const svg_1 = require("../svg");
exports.PngFaviconFileSize = 96;
// Order matters: when given in asc order (16, 32, 48), the icon is corrupted when opend in Chrome.
exports.IcoFaviconSizes = [48, 32, 16];
exports.PngFaviconFileName = `favicon-${exports.PngFaviconFileSize}x${exports.PngFaviconFileSize}.png`;
exports.SvgFaviconFileName = "favicon.svg";
exports.IcoFaviconFileName = "favicon.ico";
function blobToBuffer(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => resolve(Buffer.from(reader.result));
reader.onerror = reject;
reader.readAsArrayBuffer(blob);
});
}
const generateDesktopFaviconHtml = (faviconPath, transformer = _1.identityFaviconAssetPathTransformer) => {
return {
markups: [
`<link rel="icon" type="image/png" href="${transformer(`${faviconPath}${exports.PngFaviconFileName}`, true, false)}" sizes="${exports.PngFaviconFileSize}x${exports.PngFaviconFileSize}" />`,
`<link rel="icon" type="image/svg+xml" href="${transformer(`${faviconPath}${exports.SvgFaviconFileName}`, true, false)}" />`,
`<link rel="shortcut icon" href="${transformer(`${faviconPath}${exports.IcoFaviconFileName}`, true, false)}" />`
],
cssSelectors: [
`link[rel="icon"][type="image/png"]`,
`link[rel="icon"][type="image/svg\\+xml"]`,
`link[rel="shortcut icon"]`
]
};
};
exports.generateDesktopFaviconHtml = generateDesktopFaviconHtml;
const generateDesktopFaviconFiles = (masterIcon, settings, imageAdapter) => __awaiter(void 0, void 0, void 0, function* () {
const transformedRegularSvg = (0, helper_1.transformSvg)(masterIcon.icon, settings.regularIconTransformation, imageAdapter, 128);
const regularIcon = yield imageAdapter.convertSvgToPng((0, svg_1.scaleSvg)(transformedRegularSvg, exports.PngFaviconFileSize, imageAdapter));
const theSvg = (0, desktop_1.createDesktopSvgIcon)(masterIcon, settings, imageAdapter);
const pics = yield Promise.all(exports.IcoFaviconSizes.map((size) => __awaiter(void 0, void 0, void 0, function* () {
const data = yield imageAdapter.getImageData((0, helper_2.convertSvgToDataUrl)(theSvg), size);
return {
data,
width: size,
height: size
};
})));
const ico = (0, ico_1.imagesToIco)(pics);
return {
[exports.SvgFaviconFileName]: theSvg.svg(),
[exports.PngFaviconFileName]: regularIcon,
[exports.IcoFaviconFileName]: ico
};
});
exports.generateDesktopFaviconFiles = generateDesktopFaviconFiles;