{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-installation/link.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport {\n  docsUrl,\n  tryReadProjectManifest,\n  type ReadProjectManifestOpts,\n} from '../cli-utils/index.ts';\nimport { UNIVERSAL_OPTIONS } from '../common-cli-options-help/index.ts';\nimport { type Config, types as allTypes } from '../config/index.ts';\nimport {\n  DEPENDENCIES_FIELDS,\n  type ProjectManifest,\n  type Project,\n} from '../types/index.ts';\nimport { PnpmError } from '../error/index.ts';\nimport { arrayOfWorkspacePackagesToMap } from '../get-context/index.ts';\nimport { findWorkspacePackages } from '../workspace.find-packages/index.ts';\nimport type { WorkspacePackages } from '../core/index.ts';\nimport { logger } from '../logger/index.ts';\nimport pick from 'ramda/src/pick';\nimport partition from 'ramda/src/partition';\nimport renderHelp from 'render-help';\nimport { createProjectManifestWriter } from './createProjectManifestWriter.ts';\nimport { getSaveType } from './getSaveType.ts';\nimport * as install from './install.ts';\nimport normalize from 'normalize-path';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst isWindows = process.platform === 'win32' || global.FAKE_WINDOWS;\n\n// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\nconst isFilespec = isWindows\n  ? /^(?:[./\\\\]|~\\/|[a-z]:)/i\n  : /^(?:[./]|~\\/|[a-z]:)/i;\n\ntype LinkOpts = Pick<\n  Config,\n  | 'bin'\n  | 'cliOptions'\n  | 'engineStrict'\n  | 'rootProjectManifest'\n  | 'rootProjectManifestDir'\n  | 'saveDev'\n  | 'saveOptional'\n  | 'saveProd'\n  | 'workspaceDir'\n  | 'workspacePackagePatterns'\n  | 'sharedWorkspaceLockfile'\n  | 'globalPkgDir'\n> &\n  Partial<Pick<Config, 'linkWorkspacePackages'>> &\n  install.InstallCommandOptions;\n\nexport const rcOptionsTypes = cliOptionsTypes;\n\nexport function cliOptionsTypes(): Record<string, unknown> {\n  return pick.default(\n    [\n      'global-dir',\n      'global',\n      'only',\n      'package-import-method',\n      'production',\n      'registry',\n      'reporter',\n      'save-dev',\n      'save-exact',\n      'save-optional',\n      'save-prefix',\n      'unsafe-perm',\n    ],\n    allTypes\n  );\n}\n\nexport const commandNames = ['link', 'ln'];\n\nexport function help(): string {\n  return renderHelp({\n    aliases: ['ln'],\n    descriptionLists: [\n      {\n        title: 'Options',\n\n        list: UNIVERSAL_OPTIONS,\n      },\n    ],\n    url: docsUrl('link'),\n    usages: ['pnpm link <dir|pkg name>', 'pnpm link'],\n  });\n}\n\nasync function checkPeerDeps(\n  linkCwdDir: string,\n  opts: LinkOpts\n): Promise<void> {\n  const { manifest } = await tryReadProjectManifest(linkCwdDir, opts);\n\n  if (\n    manifest?.peerDependencies &&\n    Object.keys(manifest.peerDependencies).length > 0\n  ) {\n    const packageName = manifest.name || path.basename(linkCwdDir); // Assuming the name property exists in newManifest\n    const peerDeps = Object.entries(manifest.peerDependencies)\n      .map(([key, value]) => `  - ${key}@${String(value)}`)\n      .join(', ');\n\n    logger.warn({\n      message: `The package ${packageName}, which you have just pnpm linked, has the following peerDependencies specified in its package.json:\n\n${peerDeps}\n\nThe linked in dependency will not resolve the peer dependencies from the target node_modules.\nThis might cause issues in your project. To resolve this, you may use the \"file:\" protocol to reference the local dependency.`,\n      prefix: opts.dir,\n    });\n  }\n}\n\nexport async function handler(\n  opts: LinkOpts,\n  params?: string[]\n): Promise<void> {\n  let workspacePackagesArr: Project[];\n\n  let workspacePackages!: WorkspacePackages;\n\n  if (typeof opts.workspaceDir === 'string') {\n    workspacePackagesArr = await findWorkspacePackages(opts.workspaceDir, {\n      ...opts,\n      patterns: opts.workspacePackagePatterns,\n    });\n\n    workspacePackages = arrayOfWorkspacePackagesToMap(workspacePackagesArr);\n  } else {\n    workspacePackages = new Map();\n  }\n\n  const linkOpts = Object.assign(opts, {\n    targetDependenciesField: getSaveType(opts),\n    workspacePackages,\n    binsDir: opts.bin,\n  });\n\n  if (opts.cliOptions.global === true && opts.bin === '') {\n    throw new PnpmError(\n      'NO_GLOBAL_BIN_DIR',\n      'Unable to find the global bin directory',\n      {\n        hint: 'Run \"pnpm setup\" to create it automatically, or set the global-bin-dir setting, or the PNPM_HOME env variable. The global bin directory should be in the PATH.',\n      }\n    );\n  }\n\n  const writeProjectManifest = await createProjectManifestWriter(\n    opts.rootProjectManifestDir\n  );\n\n  // pnpm link\n  if (params == null || params.length === 0) {\n    const cwd = process.cwd();\n    if (path.relative(linkOpts.dir, cwd) === '') {\n      throw new PnpmError('LINK_BAD_PARAMS', 'You must provide a parameter');\n    }\n\n    await checkPeerDeps(cwd, opts);\n\n    if (typeof opts.rootProjectManifest !== 'undefined') {\n      await addLinkToManifest(\n        opts,\n        opts.rootProjectManifest,\n        cwd,\n        opts.rootProjectManifestDir\n      );\n\n      await writeProjectManifest(opts.rootProjectManifest);\n    }\n\n    await install.handler({\n      ...linkOpts,\n      frozenLockfileIfExists: false,\n      rootProjectManifest: opts.rootProjectManifest,\n    });\n\n    return;\n  }\n\n  const [pkgPaths, pkgNames] = partition.default((inp: string): boolean => {\n    return isFilespec.test(inp);\n  }, params);\n\n  for (const pkgName of pkgNames) {\n    pkgPaths.push(path.join(opts.globalPkgDir, 'node_modules', pkgName));\n  }\n\n  if (typeof opts.rootProjectManifest !== 'undefined') {\n    await Promise.all(\n      pkgPaths.map(async (dir: string): Promise<void> => {\n        if (typeof opts.rootProjectManifest !== 'undefined') {\n          await addLinkToManifest(\n            opts,\n            opts.rootProjectManifest,\n            dir,\n            opts.rootProjectManifestDir\n          );\n        }\n\n        await checkPeerDeps(dir, opts);\n      })\n    );\n\n    await writeProjectManifest(opts.rootProjectManifest);\n  }\n\n  await install.handler({\n    ...linkOpts,\n    frozenLockfileIfExists: false,\n    rootProjectManifest: opts.rootProjectManifest,\n  });\n}\n\nasync function addLinkToManifest(\n  opts: ReadProjectManifestOpts,\n  manifest: ProjectManifest,\n  linkedDepDir: string,\n  manifestDir: string\n): Promise<void> {\n  if (typeof manifest.pnpm === 'undefined') {\n    manifest.pnpm = {\n      overrides: {},\n    };\n  }\n\n  if (typeof manifest.pnpm.overrides === 'undefined') {\n    manifest.pnpm.overrides = {};\n  }\n\n  const { manifest: linkedManifest } = await tryReadProjectManifest(\n    linkedDepDir,\n    opts\n  );\n\n  const linkedPkgName = linkedManifest?.name ?? path.basename(linkedDepDir);\n\n  const linkedPkgSpec = `link:${normalize(path.relative(manifestDir, linkedDepDir))}`;\n\n  manifest.pnpm.overrides[linkedPkgName] = linkedPkgSpec;\n\n  if (\n    DEPENDENCIES_FIELDS.every(\n      (depField) => manifest[depField]?.[linkedPkgName] == null\n    )\n  ) {\n    manifest.dependencies = manifest.dependencies ?? {};\n    manifest.dependencies[linkedPkgName] = linkedPkgSpec;\n  }\n}\n"],
  "mappings": "AAAA,OAAO,UAAU;AACjB;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,yBAAyB;AAClC,SAAsB,SAAS,gBAAgB;AAC/C;AAAA,EACE;AAAA,OAGK;AACP,SAAS,iBAAiB;AAC1B,SAAS,qCAAqC;AAC9C,SAAS,6BAA6B;AAEtC,SAAS,cAAc;AACvB,OAAO,UAAU;AACjB,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,SAAS,mCAAmC;AAC5C,SAAS,mBAAmB;AAC5B,YAAY,aAAa;AACzB,OAAO,eAAe;AAItB,MAAM,YAAY,QAAQ,aAAa,WAAW,OAAO;AAGzD,MAAM,aAAa,YACf,4BACA;AAoBG,MAAM,iBAAiB;AAEvB,SAAS,kBAA2C;AACzD,SAAO,KAAK;AAAA,IACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,eAAe,CAAC,QAAQ,IAAI;AAElC,SAAS,OAAe;AAC7B,SAAO,WAAW;AAAA,IAChB,SAAS,CAAC,IAAI;AAAA,IACd,kBAAkB;AAAA,MAChB;AAAA,QACE,OAAO;AAAA,QAEP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,KAAK,QAAQ,MAAM;AAAA,IACnB,QAAQ,CAAC,4BAA4B,WAAW;AAAA,EAClD,CAAC;AACH;AAEA,eAAe,cACb,YACA,MACe;AACf,QAAM,EAAE,SAAS,IAAI,MAAM,uBAAuB,YAAY,IAAI;AAElE,MACE,UAAU,oBACV,OAAO,KAAK,SAAS,gBAAgB,EAAE,SAAS,GAChD;AACA,UAAM,cAAc,SAAS,QAAQ,KAAK,SAAS,UAAU;AAC7D,UAAM,WAAW,OAAO,QAAQ,SAAS,gBAAgB,EACtD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE,EACnD,KAAK,IAAI;AAEZ,WAAO,KAAK;AAAA,MACV,SAAS,eAAe,WAAW;AAAA;AAAA,EAEvC,QAAQ;AAAA;AAAA;AAAA;AAAA,MAIJ,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,QACpB,MACA,QACe;AACf,MAAI;AAEJ,MAAI;AAEJ,MAAI,OAAO,KAAK,iBAAiB,UAAU;AACzC,2BAAuB,MAAM,sBAAsB,KAAK,cAAc;AAAA,MACpE,GAAG;AAAA,MACH,UAAU,KAAK;AAAA,IACjB,CAAC;AAED,wBAAoB,8BAA8B,oBAAoB;AAAA,EACxE,OAAO;AACL,wBAAoB,oBAAI,IAAI;AAAA,EAC9B;AAEA,QAAM,WAAW,OAAO,OAAO,MAAM;AAAA,IACnC,yBAAyB,YAAY,IAAI;AAAA,IACzC;AAAA,IACA,SAAS,KAAK;AAAA,EAChB,CAAC;AAED,MAAI,KAAK,WAAW,WAAW,QAAQ,KAAK,QAAQ,IAAI;AACtD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuB,MAAM;AAAA,IACjC,KAAK;AAAA,EACP;AAGA,MAAI,UAAU,QAAQ,OAAO,WAAW,GAAG;AACzC,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,KAAK,SAAS,SAAS,KAAK,GAAG,MAAM,IAAI;AAC3C,YAAM,IAAI,UAAU,mBAAmB,8BAA8B;AAAA,IACvE;AAEA,UAAM,cAAc,KAAK,IAAI;AAE7B,QAAI,OAAO,KAAK,wBAAwB,aAAa;AACnD,YAAM;AAAA,QACJ;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,KAAK;AAAA,MACP;AAEA,YAAM,qBAAqB,KAAK,mBAAmB;AAAA,IACrD;AAEA,UAAM,QAAQ,QAAQ;AAAA,MACpB,GAAG;AAAA,MACH,wBAAwB;AAAA,MACxB,qBAAqB,KAAK;AAAA,IAC5B,CAAC;AAED;AAAA,EACF;AAEA,QAAM,CAAC,UAAU,QAAQ,IAAI,UAAU,QAAQ,CAAC,QAAyB;AACvE,WAAO,WAAW,KAAK,GAAG;AAAA,EAC5B,GAAG,MAAM;AAET,aAAW,WAAW,UAAU;AAC9B,aAAS,KAAK,KAAK,KAAK,KAAK,cAAc,gBAAgB,OAAO,CAAC;AAAA,EACrE;AAEA,MAAI,OAAO,KAAK,wBAAwB,aAAa;AACnD,UAAM,QAAQ;AAAA,MACZ,SAAS,IAAI,OAAO,QAA+B;AACjD,YAAI,OAAO,KAAK,wBAAwB,aAAa;AACnD,gBAAM;AAAA,YACJ;AAAA,YACA,KAAK;AAAA,YACL;AAAA,YACA,KAAK;AAAA,UACP;AAAA,QACF;AAEA,cAAM,cAAc,KAAK,IAAI;AAAA,MAC/B,CAAC;AAAA,IACH;AAEA,UAAM,qBAAqB,KAAK,mBAAmB;AAAA,EACrD;AAEA,QAAM,QAAQ,QAAQ;AAAA,IACpB,GAAG;AAAA,IACH,wBAAwB;AAAA,IACxB,qBAAqB,KAAK;AAAA,EAC5B,CAAC;AACH;AAEA,eAAe,kBACb,MACA,UACA,cACA,aACe;AACf,MAAI,OAAO,SAAS,SAAS,aAAa;AACxC,aAAS,OAAO;AAAA,MACd,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,KAAK,cAAc,aAAa;AAClD,aAAS,KAAK,YAAY,CAAC;AAAA,EAC7B;AAEA,QAAM,EAAE,UAAU,eAAe,IAAI,MAAM;AAAA,IACzC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAgB,gBAAgB,QAAQ,KAAK,SAAS,YAAY;AAExE,QAAM,gBAAgB,QAAQ,UAAU,KAAK,SAAS,aAAa,YAAY,CAAC,CAAC;AAEjF,WAAS,KAAK,UAAU,aAAa,IAAI;AAEzC,MACE,oBAAoB;AAAA,IAClB,CAAC,aAAa,SAAS,QAAQ,IAAI,aAAa,KAAK;AAAA,EACvD,GACA;AACA,aAAS,eAAe,SAAS,gBAAgB,CAAC;AAClD,aAAS,aAAa,aAAa,IAAI;AAAA,EACzC;AACF;",
  "names": []
}
