import fs , { Stats } from "fs" ; import path from "path" ; import { PackageInfo } from "workspace-tools" ; import { logger } from "../logger" ; import { Config } from "../types/Config" ; import { getWorkspace } from "../workspace/getWorkspace" ; const MS_IN_A_DAY = 1000 * 60 * 60 * 24 ; export async function cache ( cwd , config ) { if ( config . clear ) { logger . info ( "clearing cache, this may take a while" ) ; clearCache ( cwd , config ) ; logger . info ( "done!" ) ; } else if ( config . prune ) { logger . info ( "pruning cache, this may take a while" ) ; pruneCache ( cwd , config ) ; logger . info ( "done!" ) ; } else { logger . info ( "No options given to cache command. Try --clear or --prune" ) ; } } function clearCache ( cwd , config ) { const workspace = getWorkspace ( cwd , config ) ; const { allPackages } = workspace ; for ( const info of Object . values ( allPackages ) ) { const cachePath = getCachePath ( info ) ; if ( fs . existsSync ( cachePath ) ) { const entries = fs . readdirSync ( cachePath ) ; for ( const entry of entries ) { logger . verbose ( `clearing cache for ${ info . name }` ) ; const entryPath = path . join ( cachePath , entry ) ; const entryStat = fs . statSync ( entryPath ) ; remove ( entryPath , entryStat ) ; } } } } function pruneCache ( cwd , config ) { const prunePeriod = parseInt ( config . prune ) || 30 ; const now = new Date ( ) ; const workspace = getWorkspace ( cwd , config ) ; const { allPackages } = workspace ; for ( const info of Object . values ( allPackages ) ) { const cachePath = getCachePath ( info ) ; if ( fs . existsSync ( cachePath ) ) { const entries = fs . readdirSync ( cachePath ) ; for ( const entry of entries ) { const entryPath = path . join ( cachePath , entry ) ; const entryStat = fs . statSync ( entryPath ) ; logger . verbose ( `clearing cache for ${ info . name }` ) ; if ( now . getTime ( ) - entryStat . mtime . getTime ( ) > prunePeriod * MS_IN_A_DAY ) { remove ( entryPath , entryStat ) ; } } } } } function getCachePath ( info ) { return path . join ( info . packageJsonPath , "../node_modules/.cache/backfill" ) ; } function remove ( entryPath , entryStat ) { if ( entryStat . isDirectory ( ) ) { fs . rmdirSync ( entryPath , { recursive : true } ) ; } else { fs . unlinkSync ( entryPath ) ; } }