{
  "version": 3,
  "sources": ["../../../../src/packages/directory-fetcher/index.ts"],
  "sourcesContent": ["import { promises as fs, type Stats } from 'node:fs';\nimport path from 'node:path';\nimport util from 'node:util';\nimport { pkgRequiresBuild } from '../exec.pkg-requires-build/index.ts';\nimport type {\n  DirectoryFetcher,\n  DirectoryFetcherOptions,\n} from '../fetcher-base/index.ts';\nimport { logger } from '../logger/index.ts';\nimport { packlist } from '../fs.packlist/index.ts';\nimport { safeReadProjectManifestOnly } from '../read-project-manifest/index.ts';\nimport type { DependencyManifest } from '../types/index.ts';\nimport type { Cafs } from '../cafs-types/index.ts';\nimport type { DirectoryResolution } from '../resolver-base/index.ts';\n\nconst directoryFetcherLogger = logger('directory-fetcher');\n\nexport type CreateDirectoryFetcherOptions = {\n  includeOnlyPackageFiles?: boolean | undefined;\n  resolveSymlinks?: boolean | undefined;\n};\n\nexport function createDirectoryFetcher(\n  opts?: CreateDirectoryFetcherOptions | undefined\n): {\n  directory: DirectoryFetcher;\n} {\n  const readFileStat: ReadFileStat =\n    opts?.resolveSymlinks === true ? realFileStat : fileStat;\n\n  const fetchFromDir =\n    opts?.includeOnlyPackageFiles === true\n      ? fetchPackageFilesFromDir\n      : fetchAllFilesFromDir.bind(null, readFileStat);\n\n  const directoryFetcher: DirectoryFetcher = (\n    _cafs: Cafs,\n    resolution: DirectoryResolution,\n    opts: DirectoryFetcherOptions\n  ): Promise<FetchResult> => {\n    const dir = path.join(opts.lockfileDir, resolution.directory);\n\n    return fetchFromDir(dir);\n  };\n\n  return {\n    directory: directoryFetcher,\n  };\n}\n\nexport type FetchFromDirOptions = Omit<DirectoryFetcherOptions, 'lockfileDir'> &\n  CreateDirectoryFetcherOptions;\n\nexport type FetchResult = {\n  local: true;\n  filesIndex: Record<string, string>;\n  filesStats?: Record<string, Stats | null> | undefined;\n  packageImportMethod?:\n    | 'auto'\n    | 'hardlink'\n    | 'clone-or-copy'\n    | 'copy'\n    | 'clone'\n    | undefined;\n  manifest?: DependencyManifest | undefined;\n  requiresBuild: boolean;\n};\n\nexport async function fetchFromDir(\n  dir: string,\n  opts: FetchFromDirOptions\n): Promise<FetchResult> {\n  if (opts.includeOnlyPackageFiles === true) {\n    return fetchPackageFilesFromDir(dir);\n  }\n  const readFileStat: ReadFileStat =\n    opts.resolveSymlinks === true ? realFileStat : fileStat;\n  return fetchAllFilesFromDir(readFileStat, dir);\n}\n\nasync function fetchAllFilesFromDir(\n  readFileStat: ReadFileStat,\n  dir: string\n): Promise<FetchResult> {\n  const { filesIndex, filesStats } = await _fetchAllFilesFromDir(\n    readFileStat,\n    dir\n  );\n  // In a regular pnpm workspace it will probably never happen that a dependency has no package.json file.\n  // Safe read was added to support the Bit workspace in which the components have no package.json files.\n  // Related PR in Bit: https://github.com/teambit/bit/pull/5251\n  const manifest = (await safeReadProjectManifestOnly(dir)) ?? undefined;\n  const requiresBuild = pkgRequiresBuild(manifest, filesIndex);\n\n  return {\n    local: true,\n    filesIndex,\n    filesStats,\n    packageImportMethod: 'hardlink',\n    manifest,\n    requiresBuild,\n  };\n}\n\nasync function _fetchAllFilesFromDir(\n  readFileStat: ReadFileStat,\n  dir: string,\n  relativeDir = ''\n): Promise<Pick<FetchResult, 'filesIndex' | 'filesStats'>> {\n  const filesIndex: Record<string, string> = {};\n  const filesStats: Record<string, Stats | null> = {};\n  const files = await fs.readdir(dir);\n  await Promise.all(\n    files\n      .filter((file) => file !== 'node_modules')\n      .map(async (file) => {\n        const fileStatResult = await readFileStat(path.join(dir, file));\n        if (!fileStatResult) return;\n        const { filePath, stat } = fileStatResult;\n        const relativeSubdir = `${relativeDir}${relativeDir ? '/' : ''}${file}`;\n        if (stat.isDirectory()) {\n          const subFetchResult = await _fetchAllFilesFromDir(\n            readFileStat,\n            filePath,\n            relativeSubdir\n          );\n          Object.assign(filesIndex, subFetchResult.filesIndex);\n          Object.assign(filesStats, subFetchResult.filesStats);\n        } else {\n          filesIndex[relativeSubdir] = filePath;\n          filesStats[relativeSubdir] = fileStatResult.stat;\n        }\n      })\n  );\n  return { filesIndex, filesStats };\n}\n\ntype FileStatResult = {\n  filePath: string;\n  stat: Stats;\n};\n\ntype ReadFileStat = (filePath: string) => Promise<FileStatResult | null>;\n\nasync function realFileStat(filePath: string): Promise<FileStatResult | null> {\n  let stat = await fs.lstat(filePath);\n\n  if (!stat.isSymbolicLink()) {\n    return { filePath, stat };\n  }\n\n  let newFilePath = filePath;\n\n  try {\n    newFilePath = await fs.realpath(newFilePath);\n    stat = await fs.stat(newFilePath);\n    return { filePath: newFilePath, stat };\n  } catch (err: unknown) {\n    // Broken symlinks are skipped\n    if (\n      util.types.isNativeError(err) &&\n      'code' in err &&\n      err.code === 'ENOENT'\n    ) {\n      directoryFetcherLogger.debug({ brokenSymlink: newFilePath });\n      return null;\n    }\n\n    throw err;\n  }\n}\n\nasync function fileStat(filePath: string): Promise<FileStatResult | null> {\n  try {\n    return {\n      filePath,\n      stat: await fs.stat(filePath),\n    };\n  } catch (err: unknown) {\n    // Broken symlinks are skipped\n    if (\n      util.types.isNativeError(err) &&\n      'code' in err &&\n      err.code === 'ENOENT'\n    ) {\n      directoryFetcherLogger.debug({ brokenSymlink: filePath });\n      return null;\n    }\n    throw err;\n  }\n}\n\nasync function fetchPackageFilesFromDir(dir: string): Promise<FetchResult> {\n  const files = await packlist(dir);\n  const filesIndex: Record<string, string> = Object.fromEntries(\n    files.map((file) => [file, path.join(dir, file)])\n  );\n  // In a regular pnpm workspace it will probably never happen that a dependency has no package.json file.\n  // Safe read was added to support the Bit workspace in which the components have no package.json files.\n  // Related PR in Bit: https://github.com/teambit/bit/pull/5251\n  const manifest = (await safeReadProjectManifestOnly(dir)) ?? undefined;\n  const requiresBuild = pkgRequiresBuild(manifest, filesIndex);\n  return {\n    local: true,\n    filesIndex,\n    packageImportMethod: 'hardlink',\n    manifest,\n    requiresBuild,\n  };\n}\n"],
  "mappings": "AAAA,SAAS,YAAY,UAAsB;AAC3C,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,wBAAwB;AAKjC,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,mCAAmC;AAK5C,MAAM,yBAAyB,OAAO,mBAAmB;AAOlD,SAAS,uBACd,MAGA;AACA,QAAM,eACJ,MAAM,oBAAoB,OAAO,eAAe;AAElD,QAAMA,gBACJ,MAAM,4BAA4B,OAC9B,2BACA,qBAAqB,KAAK,MAAM,YAAY;AAElD,QAAM,mBAAqC,CACzC,OACA,YACAC,UACyB;AACzB,UAAM,MAAM,KAAK,KAAKA,MAAK,aAAa,WAAW,SAAS;AAE5D,WAAOD,cAAa,GAAG;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,EACb;AACF;AAoBA,eAAsB,aACpB,KACA,MACsB;AACtB,MAAI,KAAK,4BAA4B,MAAM;AACzC,WAAO,yBAAyB,GAAG;AAAA,EACrC;AACA,QAAM,eACJ,KAAK,oBAAoB,OAAO,eAAe;AACjD,SAAO,qBAAqB,cAAc,GAAG;AAC/C;AAEA,eAAe,qBACb,cACA,KACsB;AACtB,QAAM,EAAE,YAAY,WAAW,IAAI,MAAM;AAAA,IACvC;AAAA,IACA;AAAA,EACF;AAIA,QAAM,WAAY,MAAM,4BAA4B,GAAG,KAAM;AAC7D,QAAM,gBAAgB,iBAAiB,UAAU,UAAU;AAE3D,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,sBACb,cACA,KACA,cAAc,IAC2C;AACzD,QAAM,aAAqC,CAAC;AAC5C,QAAM,aAA2C,CAAC;AAClD,QAAM,QAAQ,MAAM,GAAG,QAAQ,GAAG;AAClC,QAAM,QAAQ;AAAA,IACZ,MACG,OAAO,CAAC,SAAS,SAAS,cAAc,EACxC,IAAI,OAAO,SAAS;AACnB,YAAM,iBAAiB,MAAM,aAAa,KAAK,KAAK,KAAK,IAAI,CAAC;AAC9D,UAAI,CAAC,eAAgB;AACrB,YAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,YAAM,iBAAiB,GAAG,WAAW,GAAG,cAAc,MAAM,EAAE,GAAG,IAAI;AACrE,UAAI,KAAK,YAAY,GAAG;AACtB,cAAM,iBAAiB,MAAM;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,eAAO,OAAO,YAAY,eAAe,UAAU;AACnD,eAAO,OAAO,YAAY,eAAe,UAAU;AAAA,MACrD,OAAO;AACL,mBAAW,cAAc,IAAI;AAC7B,mBAAW,cAAc,IAAI,eAAe;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACL;AACA,SAAO,EAAE,YAAY,WAAW;AAClC;AASA,eAAe,aAAa,UAAkD;AAC5E,MAAI,OAAO,MAAM,GAAG,MAAM,QAAQ;AAElC,MAAI,CAAC,KAAK,eAAe,GAAG;AAC1B,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAEA,MAAI,cAAc;AAElB,MAAI;AACF,kBAAc,MAAM,GAAG,SAAS,WAAW;AAC3C,WAAO,MAAM,GAAG,KAAK,WAAW;AAChC,WAAO,EAAE,UAAU,aAAa,KAAK;AAAA,EACvC,SAAS,KAAc;AAErB,QACE,KAAK,MAAM,cAAc,GAAG,KAC5B,UAAU,OACV,IAAI,SAAS,UACb;AACA,6BAAuB,MAAM,EAAE,eAAe,YAAY,CAAC;AAC3D,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,SAAS,UAAkD;AACxE,MAAI;AACF,WAAO;AAAA,MACL;AAAA,MACA,MAAM,MAAM,GAAG,KAAK,QAAQ;AAAA,IAC9B;AAAA,EACF,SAAS,KAAc;AAErB,QACE,KAAK,MAAM,cAAc,GAAG,KAC5B,UAAU,OACV,IAAI,SAAS,UACb;AACA,6BAAuB,MAAM,EAAE,eAAe,SAAS,CAAC;AACxD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,yBAAyB,KAAmC;AACzE,QAAM,QAAQ,MAAM,SAAS,GAAG;AAChC,QAAM,aAAqC,OAAO;AAAA,IAChD,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AAAA,EAClD;AAIA,QAAM,WAAY,MAAM,4BAA4B,GAAG,KAAM;AAC7D,QAAM,gBAAgB,iBAAiB,UAAU,UAAU;AAC3D,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF;",
  "names": ["fetchFromDir", "opts"]
}
