{
  "version": 3,
  "sources": ["../../../../src/packages/cache.api/cacheView.ts"],
  "sourcesContent": ["import fs from 'node:fs';\nimport path from 'node:path';\nimport { glob } from 'tinyglobby';\nimport { getIndexFilePathInCafs } from '../store.cafs/index.ts';\nimport getRegistryName from 'encode-registry';\nimport type { PackageMeta } from '../default-resolver/index.ts';\n\ntype CachedVersions = {\n  cachedVersions: string[];\n  nonCachedVersions: string[];\n  cachedAt?: string | undefined;\n  distTags: Record<string, string>;\n};\n\nexport async function cacheView(\n  opts: { cacheDir: string; storeDir: string; registry?: string | undefined },\n  packageName: string\n): Promise<string> {\n  const prefix =\n    typeof opts.registry === 'string'\n      ? `${getRegistryName(opts.registry)}`\n      : '*';\n\n  const metaFilePaths = (\n    await glob(`${prefix}/${packageName}.json`, {\n      cwd: opts.cacheDir,\n      expandDirectories: false,\n    })\n  ).sort();\n\n  const metaFilesByPath: Record<string, CachedVersions> = {};\n\n  for (const filePath of metaFilePaths) {\n    // TODO: validate with valibot\n    const metaObject: PackageMeta = JSON.parse(\n      fs.readFileSync(path.join(opts.cacheDir, filePath), 'utf8')\n    ) as PackageMeta;\n\n    const cachedVersions: string[] = [];\n\n    const nonCachedVersions: string[] = [];\n\n    for (const [version, manifest] of Object.entries(\n      metaObject.versions ?? {}\n    )) {\n      if (typeof manifest.dist.integrity === 'undefined') {\n        continue;\n      }\n\n      const indexFilePath = getIndexFilePathInCafs(\n        opts.storeDir,\n        manifest.dist.integrity,\n        `${manifest.name}@${manifest.version}`\n      );\n\n      if (fs.existsSync(indexFilePath)) {\n        cachedVersions.push(version);\n      } else {\n        nonCachedVersions.push(version);\n      }\n    }\n\n    let registryName = filePath;\n\n    while (path.dirname(registryName) !== '.') {\n      registryName = path.dirname(registryName);\n    }\n\n    metaFilesByPath[registryName.replaceAll('+', ':')] = {\n      cachedVersions,\n      nonCachedVersions,\n      cachedAt:\n        typeof metaObject.cachedAt === 'number'\n          ? new Date(metaObject.cachedAt).toString()\n          : undefined,\n      distTags: metaObject['dist-tags'],\n    };\n  }\n\n  return JSON.stringify(metaFilesByPath, null, 2);\n}\n"],
  "mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,YAAY;AACrB,SAAS,8BAA8B;AACvC,OAAO,qBAAqB;AAU5B,eAAsB,UACpB,MACA,aACiB;AACjB,QAAM,SACJ,OAAO,KAAK,aAAa,WACrB,GAAG,gBAAgB,KAAK,QAAQ,CAAC,KACjC;AAEN,QAAM,iBACJ,MAAM,KAAK,GAAG,MAAM,IAAI,WAAW,SAAS;AAAA,IAC1C,KAAK,KAAK;AAAA,IACV,mBAAmB;AAAA,EACrB,CAAC,GACD,KAAK;AAEP,QAAM,kBAAkD,CAAC;AAEzD,aAAW,YAAY,eAAe;AAEpC,UAAM,aAA0B,KAAK;AAAA,MACnC,GAAG,aAAa,KAAK,KAAK,KAAK,UAAU,QAAQ,GAAG,MAAM;AAAA,IAC5D;AAEA,UAAM,iBAA2B,CAAC;AAElC,UAAM,oBAA8B,CAAC;AAErC,eAAW,CAAC,SAAS,QAAQ,KAAK,OAAO;AAAA,MACvC,WAAW,YAAY,CAAC;AAAA,IAC1B,GAAG;AACD,UAAI,OAAO,SAAS,KAAK,cAAc,aAAa;AAClD;AAAA,MACF;AAEA,YAAM,gBAAgB;AAAA,QACpB,KAAK;AAAA,QACL,SAAS,KAAK;AAAA,QACd,GAAG,SAAS,IAAI,IAAI,SAAS,OAAO;AAAA,MACtC;AAEA,UAAI,GAAG,WAAW,aAAa,GAAG;AAChC,uBAAe,KAAK,OAAO;AAAA,MAC7B,OAAO;AACL,0BAAkB,KAAK,OAAO;AAAA,MAChC;AAAA,IACF;AAEA,QAAI,eAAe;AAEnB,WAAO,KAAK,QAAQ,YAAY,MAAM,KAAK;AACzC,qBAAe,KAAK,QAAQ,YAAY;AAAA,IAC1C;AAEA,oBAAgB,aAAa,WAAW,KAAK,GAAG,CAAC,IAAI;AAAA,MACnD;AAAA,MACA;AAAA,MACA,UACE,OAAO,WAAW,aAAa,WAC3B,IAAI,KAAK,WAAW,QAAQ,EAAE,SAAS,IACvC;AAAA,MACN,UAAU,WAAW,WAAW;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAChD;",
  "names": []
}
