@realfavicongenerator/check-favicon
Version:
Check the favicon of a website
108 lines (107 loc) • 5.28 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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkGoogleFavicon = exports.checkGoogleFaviconFromDesktopReport = exports.checkRobotsFile = exports.getRobotsFileUrl = exports.GoogleImageBot = exports.GoogleBot = void 0;
const robots_parser_1 = __importDefault(require("robots-parser"));
const desktop_1 = require("./desktop/desktop");
const helper_1 = require("./helper");
const types_1 = require("./types");
exports.GoogleBot = 'Googlebot';
exports.GoogleImageBot = 'Googlebot-Image';
const getRobotsFileUrl = (baseUrl) => {
try {
const url = new URL(baseUrl);
url.pathname = '/robots.txt';
return url.toString();
}
catch (error) {
throw new Error(`Invalid URL ${baseUrl}`);
}
};
exports.getRobotsFileUrl = getRobotsFileUrl;
const checkRobotsFile = (baseUrl_1, iconUrls_1, ...args_1) => __awaiter(void 0, [baseUrl_1, iconUrls_1, ...args_1], void 0, function* (baseUrl, iconUrls, fetcher = helper_1.fetchFetcher) {
const robotsUrl = (0, exports.getRobotsFileUrl)(baseUrl);
const robotsResponse = yield fetcher(robotsUrl);
const messages = [];
if (robotsResponse.status === 200) {
messages.push({
status: types_1.CheckerStatus.Ok,
text: `robots.txt file found at ${robotsUrl}`,
id: types_1.MessageId.googleRobotsFileFound
});
const robotsFile = robotsResponse.readableStream ? yield (0, helper_1.readableStreamToString)(robotsResponse.readableStream) : '';
const robots = (0, robots_parser_1.default)(robotsUrl, robotsFile);
iconUrls.forEach(url => {
if (url) {
if (robots.isAllowed(url, exports.GoogleImageBot)) {
messages.push({
status: types_1.CheckerStatus.Ok,
text: `Access to \`${url}\` is allowed for \`${exports.GoogleImageBot}\``,
id: types_1.MessageId.googlePngIconAllowedByRobots
});
}
else {
const line = robots.getMatchingLineNumber(url, exports.GoogleImageBot);
messages.push({
status: types_1.CheckerStatus.Error,
text: `Access to \`${url}\` is blocked for \`${exports.GoogleImageBot}\` (\`${robotsUrl}\`, line ${line})`,
id: types_1.MessageId.googlePngIconBlockedByRobots
});
}
}
});
}
else {
messages.push({
status: types_1.CheckerStatus.Ok,
text: `No \`robots.txt\` file found at \`${robotsUrl}\`. Also this is not a recommanded setup, at least Google is not restricted from accessing favicon assets.`,
id: types_1.MessageId.googleNoRobotsFile
});
}
return messages;
});
exports.checkRobotsFile = checkRobotsFile;
const checkGoogleFaviconFromDesktopReport = (baseUrl_2, desktopReport_1, ...args_2) => __awaiter(void 0, [baseUrl_2, desktopReport_1, ...args_2], void 0, function* (baseUrl, desktopReport, fetcher = helper_1.fetchFetcher) {
const allIcons = [
desktopReport.icons.png,
desktopReport.icons.ico,
desktopReport.icons.svg
].filter((i) => !!i);
const allIconUrls = allIcons.map(i => i.url).filter((i) => !!i);
const robotsMessages = yield (0, exports.checkRobotsFile)(baseUrl, allIconUrls, fetcher);
const messages = [...desktopReport.messages, ...robotsMessages];
let finalIcon = null;
let icons = [];
let maxWidth = 0;
allIcons.forEach(icon => {
if (icon.content && icon.width && icon.height && icon.url) {
icons.push(icon);
if (icon.width > maxWidth) {
finalIcon = icon.content;
maxWidth = icon.width;
}
}
});
return {
messages,
icon: finalIcon,
icons
};
});
exports.checkGoogleFaviconFromDesktopReport = checkGoogleFaviconFromDesktopReport;
const checkGoogleFavicon = (baseUrl_3, head_1, ...args_3) => __awaiter(void 0, [baseUrl_3, head_1, ...args_3], void 0, function* (baseUrl, head, fetcher = helper_1.fetchFetcher) {
const desktopReport = yield (0, desktop_1.checkDesktopFavicon)(baseUrl, head, fetcher);
return (0, exports.checkGoogleFaviconFromDesktopReport)(baseUrl, desktopReport, fetcher);
});
exports.checkGoogleFavicon = checkGoogleFavicon;