blob: 65fd33b2fb92df5ac42063c1ddfb566154d1f600 [file] [log] [blame]
/* @flow */
"use strict";
const fs = require("fs");
const hash = require("./hash");
const path = require("path");
/**
* Return the cacheFile to be used by stylelint, based on whether the provided parameter is
* a directory or looks like a directory (ends in `path.sep`), in which case the file
* name will be `cacheFile/.cache_hashOfCWD`.
*
* If cacheFile points to a file or looks like a file, then it will just use that file.
*
* @param {string} cacheFile - The name of file to be used to store the cache
* @param {string} cwd - Current working directory. Used for tests
* @returns {string} Resolved path to the cache file
*/
module.exports = function getCacheFile(
cacheFile /*: string */,
cwd /*: string */
) /*: string */ {
/*
* Make sure path separators are normalized for environment/os.
* Also, keep trailing path separator if present.
*/
cacheFile = path.normalize(cacheFile);
const resolvedCacheFile = path.resolve(cwd, cacheFile);
// If the last character passed is a path separator, we assume is a directory.
const looksLikeADirectory = cacheFile[cacheFile.length - 1] === path.sep;
/**
* Return the default cache file name when provided parameter is a directory.
* @returns {string} - Resolved path to the cacheFile
*/
function getCacheFileForDirectory() {
return path.join(resolvedCacheFile, `.stylelintcache_${hash(cwd)}`);
}
let fileStats;
try {
fileStats = fs.lstatSync(resolvedCacheFile);
} catch (ex) {
fileStats = null;
}
if (looksLikeADirectory || (fileStats && fileStats.isDirectory())) {
// Return path to provided directory with generated file name.
return getCacheFileForDirectory();
}
// Return normalized path to cache file.
return resolvedCacheFile;
};