/* @flow */ "use strict"; const debug = require("debug")("stylelint:file-cache"); const fileEntryCache = require("file-entry-cache"); const getCacheFile = require("./getCacheFile"); const path = require("path"); const DEFAULT_CACHE_LOCATION = "./.stylelintcache"; const DEFAULT_HASH = ""; function FileCache(cacheLocation /*: ?string */, hashOfConfig /*: ?string */) { const cacheFile = path.resolve( getCacheFile(cacheLocation || DEFAULT_CACHE_LOCATION, process.cwd()) ); debug(`Cache file is created at ${cacheFile}`); this._fileCache = fileEntryCache.create(cacheFile); this._hashOfConfig = hashOfConfig || DEFAULT_HASH; } FileCache.prototype.hasFileChanged = function(absoluteFilepath) { // Get file descriptor compares current metadata against cached // one and stores the result to "changed" prop.w const descriptor = this._fileCache.getFileDescriptor(absoluteFilepath); const meta = descriptor.meta || {}; const changed = descriptor.changed || meta.hashOfConfig !== this._hashOfConfig; if (!changed) { debug(`Skip linting ${absoluteFilepath}. File hasn't changed.`); } // Mutate file descriptor object and store config hash to each file. // Running lint with different config should invalidate the cache. if (meta.hashOfConfig !== this._hashOfConfig) { meta.hashOfConfig = this._hashOfConfig; } return changed; }; FileCache.prototype.reconcile = function() { this._fileCache.reconcile(); }; FileCache.prototype.destroy = function() { this._fileCache.destroy(); }; FileCache.prototype.removeEntry = function(absoluteFilepath) { this._fileCache.removeEntry(absoluteFilepath); }; module.exports = FileCache;