{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-store-inspecting/findHash.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport fs from 'node:fs';\nimport chalk from 'chalk';\n\nimport type { Config } from '../config/index.ts';\nimport { PnpmError } from '../error/index.ts';\nimport { getStorePath } from '../store-path/index.ts';\nimport type { PackageFilesIndex } from '../store.cafs/index.ts';\n\nimport { loadJsonFileSync } from 'load-json-file';\nimport renderHelp from 'render-help';\n\nexport const PACKAGE_INFO_CLR = chalk.greenBright;\nexport const INDEX_PATH_CLR = chalk.hex('#078487');\n\nexport const skipPackageManagerCheck = true;\n\nexport const commandNames = ['find-hash'];\n\nexport const rcOptionsTypes = cliOptionsTypes;\n\nexport function cliOptionsTypes(): Record<string, unknown> {\n  return {};\n}\n\nexport function help(): string {\n  return renderHelp({\n    description:\n      'Experimental! Lists the packages that include the file with the specified hash.',\n    descriptionLists: [],\n    usages: ['pnpm find-hash <hash>'],\n  });\n}\n\nexport type FindHashCommandOptions = Pick<Config, 'storeDir' | 'pnpmHomeDir'>;\n\nexport type FindHashResult = {\n  name: string;\n  version: string;\n  filesIndexFile: string;\n};\n\nexport async function handler(\n  opts: FindHashCommandOptions,\n  params: string[]\n): Promise<string> {\n  if (params.length === 0) {\n    throw new PnpmError('MISSING_HASH', '`pnpm find-hash` requires the hash');\n  }\n\n  const hash = params[0];\n\n  const storeDir = await getStorePath({\n    pkgRoot: process.cwd(),\n    storePath: opts.storeDir,\n    pnpmHomeDir: opts.pnpmHomeDir,\n  });\n\n  const indexDir = path.join(storeDir, 'index');\n\n  const cafsChildrenDirs = fs\n    .readdirSync(indexDir, { withFileTypes: true })\n    .filter((file: fs.Dirent): boolean => {\n      return file.isDirectory();\n    });\n\n  const indexFiles: string[] = [];\n\n  const result: FindHashResult[] = [];\n\n  for (const { name: dirName } of cafsChildrenDirs) {\n    const dirIndexFiles = fs\n      .readdirSync(`${indexDir}/${dirName}`)\n      .filter((fileName: string): boolean => {\n        return fileName.includes('.json');\n      })\n      .map((fileName: string): string => {\n        return `${indexDir}/${dirName}/${fileName}`;\n      });\n\n    indexFiles.push(...dirIndexFiles);\n  }\n\n  for (const filesIndexFile of indexFiles) {\n    const pkgFilesIndex = loadJsonFileSync<PackageFilesIndex>(filesIndexFile);\n\n    for (const [, file] of Object.entries(pkgFilesIndex.files)) {\n      if (file.integrity === hash) {\n        result.push({\n          name: pkgFilesIndex.name ?? 'unknown',\n          version: pkgFilesIndex.version ?? 'unknown',\n          filesIndexFile: filesIndexFile.replace(indexDir, ''),\n        });\n\n        // a package is only found once.\n        // continue;\n      }\n    }\n\n    if (pkgFilesIndex.sideEffects) {\n      for (const { added } of Object.values(pkgFilesIndex.sideEffects)) {\n        if (!added) {\n          continue;\n        }\n\n        for (const file of Object.values(added)) {\n          if (file.integrity === hash) {\n            result.push({\n              name: pkgFilesIndex.name ?? 'unknown',\n              version: pkgFilesIndex.version ?? 'unknown',\n              filesIndexFile: filesIndexFile.replace(indexDir, ''),\n            });\n\n            // a package is only found once.\n            // continue;\n          }\n        }\n      }\n    }\n  }\n\n  if (!result.length) {\n    throw new PnpmError(\n      'INVALID_FILE_HASH',\n      'No package or index file matching this hash was found.'\n    );\n  }\n\n  let acc = '';\n\n  for (const { name, version, filesIndexFile } of result) {\n    acc += `${PACKAGE_INFO_CLR(name)}@${PACKAGE_INFO_CLR(version)}  ${INDEX_PATH_CLR(filesIndexFile)}\\n`;\n  }\n\n  return acc;\n}\n"],
  "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,WAAW;AAGlB,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAG7B,SAAS,wBAAwB;AACjC,OAAO,gBAAgB;AAEhB,MAAM,mBAAmB,MAAM;AAC/B,MAAM,iBAAiB,MAAM,IAAI,SAAS;AAE1C,MAAM,0BAA0B;AAEhC,MAAM,eAAe,CAAC,WAAW;AAEjC,MAAM,iBAAiB;AAEvB,SAAS,kBAA2C;AACzD,SAAO,CAAC;AACV;AAEO,SAAS,OAAe;AAC7B,SAAO,WAAW;AAAA,IAChB,aACE;AAAA,IACF,kBAAkB,CAAC;AAAA,IACnB,QAAQ,CAAC,uBAAuB;AAAA,EAClC,CAAC;AACH;AAUA,eAAsB,QACpB,MACA,QACiB;AACjB,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,UAAU,gBAAgB,oCAAoC;AAAA,EAC1E;AAEA,QAAM,OAAO,OAAO,CAAC;AAErB,QAAM,WAAW,MAAM,aAAa;AAAA,IAClC,SAAS,QAAQ,IAAI;AAAA,IACrB,WAAW,KAAK;AAAA,IAChB,aAAa,KAAK;AAAA,EACpB,CAAC;AAED,QAAM,WAAW,KAAK,KAAK,UAAU,OAAO;AAE5C,QAAM,mBAAmB,GACtB,YAAY,UAAU,EAAE,eAAe,KAAK,CAAC,EAC7C,OAAO,CAAC,SAA6B;AACpC,WAAO,KAAK,YAAY;AAAA,EAC1B,CAAC;AAEH,QAAM,aAAuB,CAAC;AAE9B,QAAM,SAA2B,CAAC;AAElC,aAAW,EAAE,MAAM,QAAQ,KAAK,kBAAkB;AAChD,UAAM,gBAAgB,GACnB,YAAY,GAAG,QAAQ,IAAI,OAAO,EAAE,EACpC,OAAO,CAAC,aAA8B;AACrC,aAAO,SAAS,SAAS,OAAO;AAAA,IAClC,CAAC,EACA,IAAI,CAAC,aAA6B;AACjC,aAAO,GAAG,QAAQ,IAAI,OAAO,IAAI,QAAQ;AAAA,IAC3C,CAAC;AAEH,eAAW,KAAK,GAAG,aAAa;AAAA,EAClC;AAEA,aAAW,kBAAkB,YAAY;AACvC,UAAM,gBAAgB,iBAAoC,cAAc;AAExE,eAAW,CAAC,EAAE,IAAI,KAAK,OAAO,QAAQ,cAAc,KAAK,GAAG;AAC1D,UAAI,KAAK,cAAc,MAAM;AAC3B,eAAO,KAAK;AAAA,UACV,MAAM,cAAc,QAAQ;AAAA,UAC5B,SAAS,cAAc,WAAW;AAAA,UAClC,gBAAgB,eAAe,QAAQ,UAAU,EAAE;AAAA,QACrD,CAAC;AAAA,MAIH;AAAA,IACF;AAEA,QAAI,cAAc,aAAa;AAC7B,iBAAW,EAAE,MAAM,KAAK,OAAO,OAAO,cAAc,WAAW,GAAG;AAChE,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AAEA,mBAAW,QAAQ,OAAO,OAAO,KAAK,GAAG;AACvC,cAAI,KAAK,cAAc,MAAM;AAC3B,mBAAO,KAAK;AAAA,cACV,MAAM,cAAc,QAAQ;AAAA,cAC5B,SAAS,cAAc,WAAW;AAAA,cAClC,gBAAgB,eAAe,QAAQ,UAAU,EAAE;AAAA,YACrD,CAAC;AAAA,UAIH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM;AAEV,aAAW,EAAE,MAAM,SAAS,eAAe,KAAK,QAAQ;AACtD,WAAO,GAAG,iBAAiB,IAAI,CAAC,IAAI,iBAAiB,OAAO,CAAC,KAAK,eAAe,cAAc,CAAC;AAAA;AAAA,EAClG;AAEA,SAAO;AACT;",
  "names": []
}
