gatsby-plugin-prefetch-google-fonts
Version:
A Gatsby plugin to download and prefetch [Google Fonts](https://fonts.google.com/). Can increase performance as opposed to loading webfonts from Google's external stylesheet.
116 lines (89 loc) • 3.56 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _require = require("fs-extra"),
readFile = _require.readFile,
pathExists = _require.pathExists,
ensureDir = _require.ensureDir,
outputFile = _require.outputFile;
var _require2 = require("url"),
parse = _require2.parse;
var getUrls = require("get-urls");
var download = require("download");
var path = require("path");
module.exports =
/*#__PURE__*/
function () {
var _ref = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee(config) {
var cachedPath, filePath, cssData, fontLinks, domains, fontPaths, i, url, _parse, pathname, protocol, hostname, origin, dirPath, rootPath;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
cachedPath = path.join("./.cache/google-fonts/", config.pathPrefix);
filePath = path.join(cachedPath, "google-fonts.css"); // Extract URLs from CSS
_context.next = 4;
return readFile(filePath, "utf8");
case 4:
cssData = _context.sent;
fontLinks = (0, _toConsumableArray2.default)(getUrls(cssData)); // Download font files
domains = [];
fontPaths = [];
i = fontLinks.length;
case 9:
if (!i--) {
_context.next = 28;
break;
}
url = fontLinks[i].split(")")[0];
_parse = parse(url), pathname = _parse.pathname, protocol = _parse.protocol, hostname = _parse.hostname;
origin = "".concat(protocol, "//").concat(hostname);
if (domains.indexOf(origin) === -1) {
domains.push(origin);
}
if (fontPaths.indexOf(pathname) === -1) {
fontPaths.push(pathname);
}
_context.next = 17;
return pathExists("".concat(cachedPath, "/fonts").concat(pathname));
case 17:
if (_context.sent) {
_context.next = 26;
break;
}
dirPath = pathname.split(/[\/\\]/);
dirPath.pop();
dirPath = dirPath.join("/");
dirPath = "".concat(cachedPath, "/fonts").concat(dirPath);
_context.next = 24;
return ensureDir(dirPath);
case 24:
_context.next = 26;
return download(url, dirPath);
case 26:
_context.next = 9;
break;
case 28:
rootPath = "".concat(config.pathPrefix.replace(/\/$/, ""), "/google-fonts"); // Replace domains with relative paths in CSS
domains.forEach(function (domain) {
while (cssData.indexOf(domain) !== -1) {
cssData = cssData.replace(domain, rootPath).replace(/\\/g, "/");
}
});
_context.next = 32;
return outputFile(filePath, cssData);
case 32:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return function (_x) {
return _ref.apply(this, arguments);
};
}();