UNPKG

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
"use strict"; 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); }; }();