UNPKG

@realfavicongenerator/check-favicon

Version:
108 lines (107 loc) 5.28 kB
"use strict"; 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;