UNPKG

dependency-cruiser

Version:

Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.

91 lines (84 loc) 2.73 kB
// @ts-check import { readFile, mkdir, writeFile } from "node:fs/promises"; import { join } from "node:path"; import { scannableExtensions } from "../extract/transpile/meta.mjs"; import { bus } from "../utl/bus.mjs"; import { optionsAreCompatible } from "./options-compatible.mjs"; import MetadataStrategy from "./metadata-strategy.mjs"; import ContentStrategy from "./content-strategy.mjs"; const CACHE_FILE_NAME = "cache.json"; export default class Cache { /** * @param {import("../../types/cache-options.js").cacheStrategyType=} pCacheStrategy */ constructor(pCacheStrategy) { this.revisionData = null; this.cacheStrategy = pCacheStrategy === "content" ? new ContentStrategy() : new MetadataStrategy(); } /** * @param {import("../../types/strict-options.js").IStrictCruiseOptions} pCruiseOptions * @param {import("../../types/dependency-cruiser.js").ICruiseResult} pCachedCruiseResult * @param {import("../../types/dependency-cruiser.js").IRevisionData=} pRevisionData * @returns {Promise<boolean>} */ async canServeFromCache(pCruiseOptions, pCachedCruiseResult, pRevisionData) { this.revisionData = pRevisionData ?? (await this.cacheStrategy.getRevisionData( ".", pCachedCruiseResult, pCruiseOptions, { extensions: new Set( scannableExtensions.concat(pCruiseOptions.extraExtensionsToScan) ), } )); bus.debug("cache: - comparing"); return ( this.cacheStrategy.revisionDataEqual( pCachedCruiseResult.revisionData, this.revisionData ) && optionsAreCompatible( pCachedCruiseResult.summary.optionsUsed, pCruiseOptions ) ); } /** * @param {string} pCacheFolder * @returns {Promise<import("../../types/dependency-cruiser.js").ICruiseResult>} */ async read(pCacheFolder) { try { return JSON.parse( await readFile(join(pCacheFolder, CACHE_FILE_NAME), "utf8") ); } catch (pError) { return { modules: [], summary: {} }; } } /** * @param {string} pCacheFolder * @param {import("../../types/dependency-cruiser.js").ICruiseResult} pCruiseResult * @param {import("../../types/dependency-cruiser.js").IRevisionData=} pRevisionData */ async write(pCacheFolder, pCruiseResult, pRevisionData) { const lRevisionData = pRevisionData ?? this.revisionData; await mkdir(pCacheFolder, { recursive: true }); await writeFile( join(pCacheFolder, CACHE_FILE_NAME), JSON.stringify( this.cacheStrategy.prepareRevisionDataForSaving( pCruiseResult, lRevisionData ) ), "utf8" ); } }