{
  "version": 3,
  "sources": ["../../../../src/packages/link-bins/index.ts"],
  "sourcesContent": ["import { promises as fs, existsSync } from 'node:fs';\nimport Module from 'node:module';\nimport path from 'node:path';\nimport { PnpmError } from '../error/index.ts';\nimport { logger, globalWarn } from '../logger/index.ts';\nimport { getAllDependenciesFromManifest } from '../manifest-utils/index.ts';\nimport {\n  type Command,\n  getBinsFromPackageManifest,\n} from '../package-bins/index.ts';\nimport { readModulesDir } from '../read-modules-dir/index.ts';\nimport { readPackageJsonFromDir } from '../read-package-json/index.ts';\nimport { safeReadProjectManifestOnly } from '../read-project-manifest/index.ts';\nimport type {\n  DependencyManifest,\n  ModulesDir,\n  ProjectManifest,\n} from '../types/index.ts';\nimport cmdShim from '@zkochan/cmd-shim';\nimport rimraf from '@zkochan/rimraf';\nimport isSubdir from 'is-subdir';\nimport isWindows from 'is-windows';\nimport normalizePath from 'normalize-path';\nimport pSettle from 'p-settle';\nimport isEmpty from 'ramda/src/isEmpty';\nimport unnest from 'ramda/src/unnest';\nimport groupBy from 'ramda/src/groupBy';\nimport partition from 'ramda/src/partition';\nimport semver from 'semver';\nimport symlinkDir from 'symlink-dir';\nimport process from 'node:process';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport fixBin from 'bin-links/lib/fix-bin';\nimport type { BundledManifest } from '../package-store/index.ts';\n\nconst binsConflictLogger = logger('bins-conflict');\nconst IS_WINDOWS = isWindows();\nconst EXECUTABLE_SHEBANG_SUPPORTED = !IS_WINDOWS;\nconst POWER_SHELL_IS_SUPPORTED = IS_WINDOWS;\n\nexport type WarningCode = 'BINARIES_CONFLICT' | 'EMPTY_BIN';\n\nexport type WarnFunction = (msg: string, code: WarningCode) => void;\n\nexport async function linkBins(\n  modulesDir: ModulesDir,\n  binsDir: string,\n  opts: LinkBinOptions & {\n    allowExoticManifests?: boolean | undefined;\n    nodeExecPathByAlias?: Record<string, string> | undefined;\n    projectManifest?: ProjectManifest | undefined;\n    warn: WarnFunction;\n  }\n): Promise<string[]> {\n  const allDeps = await readModulesDir(modulesDir);\n\n  // If the modules dir does not exist, do nothing\n  if (allDeps === null) {\n    return [];\n  }\n\n  return linkBinsOfPkgsByAliases(allDeps, binsDir, {\n    ...opts,\n    modulesDir,\n  });\n}\n\nexport async function linkBinsOfPkgsByAliases(\n  depsAliases: string[],\n  binsDir: string,\n  opts: LinkBinOptions & {\n    modulesDir: ModulesDir;\n    allowExoticManifests?: boolean | undefined;\n    nodeExecPathByAlias?: Record<string, string> | undefined;\n    projectManifest?: ProjectManifest | undefined;\n    warn: WarnFunction;\n  }\n): Promise<string[]> {\n  const pkgBinOpts = {\n    allowExoticManifests: false,\n    ...opts,\n  };\n\n  const directDependencies =\n    opts.projectManifest == null\n      ? undefined\n      : new Set(\n          Object.keys(getAllDependenciesFromManifest(opts.projectManifest))\n        );\n\n  const allCmds = unnest.default(\n    (\n      await Promise.all(\n        depsAliases\n          .map((alias) => ({\n            depDir: path.resolve(opts.modulesDir, alias),\n            isDirectDependency: directDependencies?.has(alias),\n            nodeExecPath: opts.nodeExecPathByAlias?.[alias],\n          }))\n          .filter(({ depDir }) => !isSubdir(depDir, binsDir)) // Don't link own bins\n          .map(async ({ depDir, isDirectDependency, nodeExecPath }) => {\n            const target = normalizePath(depDir);\n            const cmds = await getPackageBins(pkgBinOpts, target, nodeExecPath);\n            return cmds.map((cmd) => ({ ...cmd, isDirectDependency }));\n          })\n      )\n    ).filter((cmds: Command[]) => cmds.length)\n  );\n\n  const cmdsToLink =\n    directDependencies != null ? preferDirectCmds(allCmds) : allCmds;\n  return _linkBins(cmdsToLink, binsDir, opts);\n}\n\nfunction preferDirectCmds(\n  allCmds: Array<CommandInfo & { isDirectDependency?: boolean | undefined }>\n): Array<\n  CommandInfo & {\n    isDirectDependency?: boolean | undefined;\n  }\n> {\n  const [directCmds, hoistedCmds] = partition.default(\n    (cmd) => cmd.isDirectDependency === true,\n    allCmds\n  );\n\n  const usedDirectCmds = new Set(directCmds.map((directCmd) => directCmd.name));\n\n  return [\n    ...directCmds,\n    ...hoistedCmds.filter(({ name }) => !usedDirectCmds.has(name)),\n  ];\n}\n\nexport async function linkBinsOfPackages(\n  pkgs: Array<{\n    manifest: BundledManifest;\n    nodeExecPath?: string | undefined;\n    location: string;\n  }>,\n  binsTarget: string,\n  opts: LinkBinOptions = {}\n): Promise<string[]> {\n  if (pkgs.length === 0) {\n    return [];\n  }\n\n  const allCmds = unnest.default(\n    (\n      await Promise.all(\n        pkgs.map(\n          async (pkg: {\n            manifest: BundledManifest;\n            nodeExecPath?: string | undefined;\n            location: string;\n          }): Promise<CommandInfo[]> => {\n            return getPackageBinsFromManifest(\n              pkg.manifest,\n              pkg.location,\n              pkg.nodeExecPath\n            );\n          }\n        )\n      )\n    ).filter((cmds: Command[]): boolean => {\n      return cmds.length > 0;\n    })\n  );\n\n  return _linkBins(allCmds, binsTarget, opts);\n}\n\ninterface CommandInfo extends Command {\n  ownName: boolean;\n  pkgName: string;\n  pkgVersion: string;\n  makePowerShellShim: boolean;\n  nodeExecPath?: string | undefined;\n}\n\nasync function _linkBins(\n  allCmds: CommandInfo[],\n  binsDir: string,\n  opts: LinkBinOptions\n): Promise<string[]> {\n  if (allCmds.length === 0) return [] as string[];\n\n  // deduplicate bin names to prevent race conditions (multiple writers for the same file)\n  const dedupedAllCmds = deduplicateCommands(allCmds, binsDir);\n\n  await fs.mkdir(binsDir, { recursive: true });\n\n  const results = await pSettle(\n    dedupedAllCmds.map(async (cmd) => linkBin(cmd, binsDir, opts))\n  );\n\n  // We want to create all commands that we can create before throwing an exception\n  for (const result of results) {\n    if (result.isRejected) {\n      throw result.reason;\n    }\n  }\n\n  return dedupedAllCmds.map((cmd) => cmd.pkgName);\n}\n\nfunction deduplicateCommands(\n  commands: CommandInfo[],\n  binsDir: string\n): CommandInfo[] {\n  const cmdGroups = groupBy.default((cmd) => cmd.name, commands);\n\n  return Object.values(cmdGroups)\n    .filter((group): group is CommandInfo[] => {\n      return group !== undefined && group.length !== 0;\n    })\n    .map((group: CommandInfo[]): CommandInfo => {\n      return resolveCommandConflicts(group, binsDir);\n    });\n}\n\nfunction resolveCommandConflicts(\n  group: CommandInfo[],\n  binsDir: string\n): CommandInfo {\n  return group.reduce((a: CommandInfo, b: CommandInfo): CommandInfo => {\n    const [chosen, skipped] =\n      compareCommandsInConflict(a, b) >= 0 ? [a, b] : [b, a];\n\n    logCommandConflict(chosen, skipped, binsDir);\n\n    return chosen;\n  });\n}\n\nfunction compareCommandsInConflict(a: CommandInfo, b: CommandInfo): number {\n  if (a.ownName && !b.ownName) {\n    return 1;\n  }\n\n  if (!a.ownName && b.ownName) {\n    return -1;\n  }\n\n  if (a.pkgName !== b.pkgName) {\n    // it's pointless to compare versions of 2 different package\n    return a.pkgName.localeCompare(b.pkgName);\n  }\n\n  return semver.compare(a.pkgVersion, b.pkgVersion);\n}\n\nfunction logCommandConflict(\n  chosen: CommandInfo,\n  skipped: CommandInfo,\n  binsDir: string\n): void {\n  binsConflictLogger.debug({\n    binaryName: skipped.name,\n    binsDir,\n    linkedPkgName: chosen.pkgName,\n    linkedPkgVersion: chosen.pkgVersion,\n    skippedPkgName: skipped.pkgName,\n    skippedPkgVersion: skipped.pkgVersion,\n  });\n}\n\nasync function isFromModules(filename: string): Promise<boolean> {\n  const real = await fs.realpath(filename);\n  return normalizePath(real).includes('/node_modules/');\n}\n\nasync function getPackageBins(\n  opts: {\n    allowExoticManifests?: boolean | undefined;\n    warn: WarnFunction;\n  },\n  target: string,\n  nodeExecPath?: string | undefined\n): Promise<CommandInfo[]> {\n  const manifest =\n    opts.allowExoticManifests === true\n      ? ((await safeReadProjectManifestOnly(target)) as DependencyManifest)\n      : await safeReadPkgJson(target);\n\n  if (manifest == null) {\n    // There's a directory in node_modules without package.json: ${target}.\n    // This used to be a warning but it didn't really cause any issues.\n    return [];\n  }\n\n  if (isEmpty.default(manifest.bin) && !(await isFromModules(target))) {\n    opts.warn(\n      `Package in ${target} must have a non-empty bin field to get bin linked.`,\n      'EMPTY_BIN'\n    );\n  }\n\n  if (typeof manifest.bin === 'string' && !manifest.name) {\n    throw new PnpmError(\n      'INVALID_PACKAGE_NAME',\n      `Package in ${target} must have a name to get bin linked.`\n    );\n  }\n\n  return getPackageBinsFromManifest(manifest, target, nodeExecPath);\n}\n\nasync function getPackageBinsFromManifest(\n  manifest: DependencyManifest,\n  pkgDir: string,\n  nodeExecPath?: string\n): Promise<CommandInfo[]> {\n  const cmds = await getBinsFromPackageManifest(manifest, pkgDir);\n\n  return cmds.map((cmd) => ({\n    ...cmd,\n    ownName: cmd.name === manifest.name,\n    pkgName: manifest.name,\n    pkgVersion: manifest.version,\n    makePowerShellShim: POWER_SHELL_IS_SUPPORTED && manifest.name !== 'pnpm',\n    nodeExecPath,\n  }));\n}\n\nexport interface LinkBinOptions {\n  extraNodePaths?: string[] | undefined;\n  preferSymlinkedExecutables?: boolean | undefined;\n}\n\nasync function linkBin(\n  cmd: CommandInfo,\n  binsDir: string,\n  opts?: LinkBinOptions | undefined\n): Promise<void> {\n  const externalBinPath = path.join(binsDir, cmd.name);\n\n  if (IS_WINDOWS) {\n    const exePath = path.join(binsDir, `${cmd.name}${getExeExtension()}`);\n\n    if (existsSync(exePath)) {\n      globalWarn(\n        `The target bin directory already contains an exe called ${cmd.name}, so removing ${exePath}`\n      );\n      await rimraf(exePath);\n    }\n  }\n\n  if (\n    opts?.preferSymlinkedExecutables === true &&\n    !IS_WINDOWS &&\n    cmd.nodeExecPath == null\n  ) {\n    try {\n      await symlinkDir(cmd.path, externalBinPath);\n\n      await fixBin(cmd.path, 0o755);\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (err: any) {\n      if (err.code !== 'ENOENT') {\n        throw err;\n      }\n\n      globalWarn(\n        `Failed to create bin at ${externalBinPath}. ${err.message as string}`\n      );\n    }\n\n    return;\n  }\n\n  try {\n    let nodePath: string[] = [];\n\n    if (typeof opts?.extraNodePaths?.length === 'number') {\n      nodePath = [];\n\n      for (const modulesPath of await getBinNodePaths(cmd.path)) {\n        if (opts.extraNodePaths.includes(modulesPath)) break;\n\n        nodePath.push(modulesPath);\n      }\n\n      nodePath.push(...opts.extraNodePaths);\n    }\n\n    await cmdShim(cmd.path, externalBinPath, {\n      createPwshFile: cmd.makePowerShellShim,\n      nodePath,\n      nodeExecPath: cmd.nodeExecPath ?? '',\n    });\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } catch (err: any) {\n    if (err.code !== 'ENOENT') {\n      throw err;\n    }\n\n    globalWarn(\n      `Failed to create bin at ${externalBinPath}. ${err.message as string}`\n    );\n\n    return;\n  }\n\n  // ensure that bin are executable and not containing\n  // windows line-endings(CRLF) on the hashbang line\n  if (EXECUTABLE_SHEBANG_SUPPORTED) {\n    await fixBin(cmd.path, 0o7_5_5);\n  }\n}\n\nfunction getExeExtension(): string {\n  let cmdExtension: string | undefined;\n\n  if (typeof process.env.PATHEXT === 'string') {\n    cmdExtension = process.env.PATHEXT.split(path.delimiter).find(\n      (ext) => ext.toUpperCase() === '.EXE'\n    );\n  }\n\n  return cmdExtension ?? '.exe';\n}\n\nasync function getBinNodePaths(target: string): Promise<string[]> {\n  const targetDir = path.dirname(target);\n\n  try {\n    const targetRealPath = await fs.realpath(targetDir);\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-expect-error\n\n    return Module['_nodeModulePaths'](targetRealPath);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } catch (err: any) {\n    if (err.code !== 'ENOENT') {\n      throw err;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-expect-error\n    return Module['_nodeModulePaths'](targetDir);\n  }\n}\n\nasync function safeReadPkgJson(\n  pkgDir: string\n): Promise<DependencyManifest | null> {\n  try {\n    return await readPackageJsonFromDir(pkgDir);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } catch (err: any) {\n    if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n      return null;\n    }\n\n    throw err;\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
