mirror of
https://github.com/pnpm/pnpm.git
synced 2025-12-31 19:18:19 -05:00
47 lines
1.8 KiB
TypeScript
47 lines
1.8 KiB
TypeScript
import fs from 'fs'
|
|
import path from 'path'
|
|
import fastGlob from 'fast-glob'
|
|
import { getIndexFilePathInCafs } from '@pnpm/store.cafs'
|
|
import { type PackageMeta } from '@pnpm/npm-resolver'
|
|
import getRegistryName from 'encode-registry'
|
|
|
|
interface CachedVersions {
|
|
cachedVersions: string[]
|
|
nonCachedVersions: string[]
|
|
cachedAt?: string
|
|
distTags: Record<string, string>
|
|
}
|
|
|
|
export async function cacheView (opts: { cacheDir: string, storeDir: string, registry?: string }, packageName: string): Promise<string> {
|
|
const prefix = opts.registry ? `${getRegistryName(opts.registry)}` : '*'
|
|
const metaFilePaths = (await fastGlob(`${prefix}/${packageName}.json`, {
|
|
cwd: opts.cacheDir,
|
|
})).sort()
|
|
const metaFilesByPath: Record<string, CachedVersions> = {}
|
|
for (const filePath of metaFilePaths) {
|
|
const metaObject = JSON.parse(fs.readFileSync(path.join(opts.cacheDir, filePath), 'utf8')) as PackageMeta
|
|
const cachedVersions: string[] = []
|
|
const nonCachedVersions: string[] = []
|
|
for (const [version, manifest] of Object.entries(metaObject.versions)) {
|
|
if (!manifest.dist.integrity) continue
|
|
const indexFilePath = getIndexFilePathInCafs(opts.storeDir, manifest.dist.integrity, `${manifest.name}@${manifest.version}`)
|
|
if (fs.existsSync(indexFilePath)) {
|
|
cachedVersions.push(version)
|
|
} else {
|
|
nonCachedVersions.push(version)
|
|
}
|
|
}
|
|
let registryName = filePath
|
|
while (path.dirname(registryName) !== '.') {
|
|
registryName = path.dirname(registryName)
|
|
}
|
|
metaFilesByPath[registryName.replaceAll('+', ':')] = {
|
|
cachedVersions,
|
|
nonCachedVersions,
|
|
cachedAt: metaObject.cachedAt ? new Date(metaObject.cachedAt).toString() : undefined,
|
|
distTags: metaObject['dist-tags'],
|
|
}
|
|
}
|
|
return JSON.stringify(metaFilesByPath, null, 2)
|
|
}
|