UNPKG

gatsby-core-utils

Version:

A collection of gatsby utils used in different gatsby packages

78 lines (77 loc) 4.42 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.getServices = exports.getService = exports.createServiceLock = void 0; var _path = _interopRequireDefault(require("path")); var _tmp = _interopRequireDefault(require("tmp")); var _fsExtra = _interopRequireDefault(require("fs-extra")); var _xdgBasedir = _interopRequireDefault(require("xdg-basedir")); var _createContentDigest = require("./create-content-digest"); var _ci = require("./ci"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const globalConfigPath = _xdgBasedir.default.config || _tmp.default.fileSync().name; const getSiteDir = programPath => { const hash = (0, _createContentDigest.createContentDigest)(programPath); return _path.default.join(globalConfigPath, `gatsby`, `sites`, hash); }; const DATA_FILE_EXTENSION = `.json`; const getDataFilePath = (siteDir, serviceName) => _path.default.join(siteDir, `${serviceName}${DATA_FILE_EXTENSION}`); const lockfileOptions = { // Use the minimum stale duration stale: 5000 }; // proper-lockfile has a side-effect that we only want to set when needed function getLockFileInstance() { return Promise.resolve().then(() => _interopRequireWildcard(require(`proper-lockfile`))); } const memoryServices = {}; const createServiceLock = async (programPath, serviceName, content) => { // NOTE(@mxstbr): In CI, we cannot reliably access the global config dir and do not need cross-process coordination anyway // so we fall back to storing the services in memory instead! if ((0, _ci.isCI)()) { if (memoryServices[serviceName]) return null; memoryServices[serviceName] = content; return async () => { delete memoryServices[serviceName]; }; } const siteDir = getSiteDir(programPath); await _fsExtra.default.ensureDir(siteDir); const serviceDataFile = getDataFilePath(siteDir, serviceName); try { await _fsExtra.default.writeFile(serviceDataFile, JSON.stringify(content)); const lockfile = await getLockFileInstance(); const unlock = await lockfile.lock(serviceDataFile, lockfileOptions); return unlock; } catch (err) { return null; } }; exports.createServiceLock = createServiceLock; const getService = async (programPath, serviceName, ignoreLockfile = false) => { if ((0, _ci.isCI)()) return memoryServices[serviceName] || null; const siteDir = getSiteDir(programPath); const serviceDataFile = getDataFilePath(siteDir, serviceName); try { const lockfile = await getLockFileInstance(); if (ignoreLockfile || (await lockfile.check(serviceDataFile, lockfileOptions))) { return JSON.parse(await _fsExtra.default.readFile(serviceDataFile, `utf8`).catch(() => `null`)); } return null; } catch (err) { return null; } }; exports.getService = getService; const getServices = async programPath => { if ((0, _ci.isCI)()) return memoryServices; const siteDir = getSiteDir(programPath); const serviceNames = (await _fsExtra.default.readdir(siteDir)).filter(file => file.endsWith(DATA_FILE_EXTENSION)).map(file => file.replace(DATA_FILE_EXTENSION, ``)); const services = {}; await Promise.all(serviceNames.map(async service => { services[service] = await getService(programPath, service, true); })); return services; }; exports.getServices = getServices;