UNPKG

knip

Version:

Find and fix unused dependencies, exports and files in your TypeScript and JavaScript projects

78 lines (77 loc) 2.55 kB
import fs from 'node:fs'; import path from 'node:path'; import { createDiskCache } from './disk-cache.js'; const store = createDiskCache('gitignore'); export const initGitignoreCache = store.init; export const isGitignoreCacheEnabled = store.isEnabled; export const flushGitignoreCache = store.flush; const workspaceDirsKey = (workspaceDirs) => { if (!workspaceDirs || workspaceDirs.size === 0) return ''; return [...workspaceDirs].sort().join('\0'); }; const validateEntry = (entry, wsKey, cwd) => { if (entry.workspaceDirsKey !== wsKey) return false; const files = entry.gitignoreFiles; const mtimes = entry.mtimes; for (let i = 0; i < files.length; i++) { const abs = path.isAbsolute(files[i]) ? files[i] : path.resolve(cwd, files[i]); try { if (fs.statSync(abs).mtimeMs !== mtimes[i]) return false; } catch { return false; } } return true; }; export const getCachedGitignore = (cwd, workspaceDirs) => { const entry = store.get(cwd); if (!entry) return undefined; const wsKey = workspaceDirsKey(workspaceDirs); if (!validateEntry(entry, wsKey, cwd)) { store.delete(cwd); return undefined; } const perDirIgnores = new Map(); for (const dir in entry.perDirIgnores) { const data = entry.perDirIgnores[dir]; perDirIgnores.set(dir, { ignores: new Set(data.ignores), unignores: new Set(data.unignores) }); } return { ignores: new Set(entry.ignores), unignores: new Set(entry.unignores), gitignoreFiles: entry.gitignoreFiles, perDirIgnores, }; }; export const setCachedGitignore = (cwd, workspaceDirs, gitignoreFiles, ignores, unignores, perDirIgnores) => { if (!store.isEnabled()) return; const mtimes = []; const validFiles = []; for (const file of gitignoreFiles) { const abs = path.isAbsolute(file) ? file : path.resolve(cwd, file); try { mtimes.push(fs.statSync(abs).mtimeMs); validFiles.push(file); } catch { } } const perDir = {}; for (const [dir, data] of perDirIgnores) { perDir[dir] = { ignores: [...data.ignores], unignores: [...data.unignores] }; } store.set(cwd, { gitignoreFiles: validFiles, mtimes, ignores: [...ignores], unignores: [...unignores], perDirIgnores: perDir, workspaceDirsKey: workspaceDirsKey(workspaceDirs), }); };