You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.8 KiB
68 lines
1.8 KiB
'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;
|
|
|