RSS Git Download  Clone
Raw Blame History
const verdaccioCli = require('../')
const program = require('commander')
const pkg = verdaccioCli.pkg;

const fs = require('fs').promises
const path = require('path')
const fsExtra = require('fs-extra')

const parseConfig = async (opts) => {
    const yaml = require('js-yaml')
    //console.warn(opts)
    const yamlString = (await fs.readFile(opts.config)).toString()
    const yamlConfig = yaml.load(yamlString)
    //console.warn(yamlConfig)
    return yamlConfig
}

const availableCacheRoutine = [
    'clean'
]

const start = async() => {


    program
        .version(pkg.version)
        .option('-c, --config <config>', 'This is required to provide the Verdaccio configuration.')
        .option('-d, --dry', 'Do not actually clean the cache, just print some info.')

    program
        .command('cache <routine>')
        .description(`Help to manage the Verdaccio cache.`)
        .action(async (routine, options) => {

            try {
                if (!availableCacheRoutine.includes(routine)) {
                    return console.error(`The cache <routine> is not available '${routine}, the available routines are ${availableCacheRoutine.join(',')}`)
                }

                //console.warn(options)
                const configPath = path.dirname(program.config)

                const config = await parseConfig({
                    config: program.config
                })
                const storagePath = path.resolve(configPath, config.storage)
                const db = require(path.resolve(storagePath, '.sinopia-db.json'))

                const packageFolders = await fs.readdir(storagePath)
                //console.warn(packageFolders)

                if (program.dry === true) {
                    console.info(`
Own packages: ${db.list.join(',')}
Own packages count: ${db.list.length}

Total of package count without own packages: ${packageFolders.length - db.list.length}
`)
                    return
                }
                const packageFoldersWithoutOwn = []

                const packageFolderPathStatAwaitable = []

                for(let packageFolderPath of packageFolders) {
                    packageFolderPathStatAwaitable.push(
                        fs.stat(path.resolve(storagePath, packageFolderPath))
                    )
                }

                const packageFolderPathStatAwaitableResult = await Promise.all(packageFolderPathStatAwaitable)

                for(let statIndex in packageFolderPathStatAwaitableResult) {
                    const stat = packageFolderPathStatAwaitableResult[statIndex]
                    //console.warn(stat)
                    const packagePath = packageFolders[statIndex]
                    if (stat.isDirectory() && !db.list.includes(packagePath)) {
                        packageFoldersWithoutOwn.push(packagePath)
                    }
                }


                const removablePathAwaitable = []
                for(let packagePath of packageFoldersWithoutOwn) {
                    removablePathAwaitable.push(
                        fsExtra.remove(path.resolve(storagePath, packagePath))
                    )
                }
                await Promise.all(removablePathAwaitable)

                console.info('Removed all cached packages and kept all own packages.')

                //console.warn(packageFoldersWithoutOwn.length, packageFolders.length)

            } catch(e) {
                console.error(e)
                process.exit(-1)
            }

        })

    program.parse(process.argv);



    if (!process.argv.slice(2).length) {
        program.outputHelp();
    } else if (program.config === undefined) {
        return console.error(`The ${pkg.name} program's first argument should be like '--config=/verdaccio/path/config.yaml' and should present.`)
    }




}

start();