| '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 = ''; |
| |
| /** @typedef {import('file-entry-cache').FileDescriptor["meta"] & { hashOfConfig?: string }} CacheMetadata */ |
| |
| /** |
| * @param {string} [cacheLocation] |
| * @param {string} [hashOfConfig] |
| * @constructor |
| */ |
| class FileCache { |
| constructor(cacheLocation = DEFAULT_CACHE_LOCATION, hashOfConfig = DEFAULT_HASH) { |
| const cacheFile = path.resolve(getCacheFile(cacheLocation, process.cwd())); |
| |
| debug(`Cache file is created at ${cacheFile}`); |
| this._fileCache = fileEntryCache.create(cacheFile); |
| this._hashOfConfig = hashOfConfig; |
| } |
| |
| /** |
| * @param {string} absoluteFilepath |
| * @return {boolean} |
| */ |
| hasFileChanged(absoluteFilepath) { |
| // Get file descriptor compares current metadata against cached |
| // one and stores the result to "changed" prop.w |
| const descriptor = this._fileCache.getFileDescriptor(absoluteFilepath); |
| /** @type {CacheMetadata} */ |
| 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; |
| } |
| |
| reconcile() { |
| this._fileCache.reconcile(); |
| } |
| |
| destroy() { |
| this._fileCache.destroy(); |
| } |
| |
| /** |
| * @param {string} absoluteFilepath |
| */ |
| removeEntry(absoluteFilepath) { |
| this._fileCache.removeEntry(absoluteFilepath); |
| } |
| } |
| |
| module.exports = FileCache; |