{
  "version": 3,
  "sources": ["../../../../src/packages/config/checkGlobalBinDir.ts"],
  "sourcesContent": ["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport util from 'node:util';\nimport { PnpmError } from '../error/index.ts';\nimport { sync as canWriteToDir } from 'can-write-to-dir';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport PATH from 'path-name';\n\nexport async function checkGlobalBinDir(\n  globalBinDir: string,\n  {\n    env,\n    shouldAllowWrite,\n  }: {\n    env: Record<string, string | undefined>;\n    shouldAllowWrite?: boolean | undefined;\n  }\n): Promise<void> {\n  if (typeof env[PATH] === 'undefined') {\n    throw new PnpmError(\n      'NO_PATH_ENV',\n      `Couldn't find a global directory for executables because the \"${PATH}\" environment variable is not set.`\n    );\n  }\n\n  if (!(await globalBinDirIsInPath(globalBinDir, env))) {\n    throw new PnpmError(\n      'GLOBAL_BIN_DIR_NOT_IN_PATH',\n      `The configured global bin directory \"${globalBinDir}\" is not in PATH`\n    );\n  }\n\n  if (shouldAllowWrite === true && !canWriteToDirAndExists(globalBinDir)) {\n    throw new PnpmError(\n      'PNPM_DIR_NOT_WRITABLE',\n      `The CLI has no write access to the pnpm home directory at ${globalBinDir}`\n    );\n  }\n}\n\nasync function globalBinDirIsInPath(\n  globalBinDir: string,\n  env: Record<string, string | undefined>\n): Promise<boolean> {\n  const dirs = env[PATH]?.split(path.delimiter) ?? [];\n\n  if (dirs.some((dir) => areDirsEqual(globalBinDir, dir))) {\n    return true;\n  }\n\n  const realGlobalBinDir = await fs.realpath(globalBinDir);\n\n  return dirs.some((dir) => areDirsEqual(realGlobalBinDir, dir));\n}\n\nfunction areDirsEqual(dir1: string, dir2: string): boolean {\n  return path.relative(dir1, dir2) === '';\n}\n\nfunction canWriteToDirAndExists(dir: string): boolean {\n  try {\n    return canWriteToDir(dir);\n  } catch (err: unknown) {\n    if (\n      util.types.isNativeError(err) &&\n      'code' in err &&\n      err.code === 'ENOENT'\n    ) {\n      return false;\n    }\n\n    throw err;\n  }\n}\n"],
  "mappings": "AAAA,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,QAAQ,qBAAqB;AAGtC,OAAO,UAAU;AAEjB,eAAsB,kBACpB,cACA;AAAA,EACE;AAAA,EACA;AACF,GAIe;AACf,MAAI,OAAO,IAAI,IAAI,MAAM,aAAa;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,iEAAiE,IAAI;AAAA,IACvE;AAAA,EACF;AAEA,MAAI,CAAE,MAAM,qBAAqB,cAAc,GAAG,GAAI;AACpD,UAAM,IAAI;AAAA,MACR;AAAA,MACA,wCAAwC,YAAY;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,qBAAqB,QAAQ,CAAC,uBAAuB,YAAY,GAAG;AACtE,UAAM,IAAI;AAAA,MACR;AAAA,MACA,6DAA6D,YAAY;AAAA,IAC3E;AAAA,EACF;AACF;AAEA,eAAe,qBACb,cACA,KACkB;AAClB,QAAM,OAAO,IAAI,IAAI,GAAG,MAAM,KAAK,SAAS,KAAK,CAAC;AAElD,MAAI,KAAK,KAAK,CAAC,QAAQ,aAAa,cAAc,GAAG,CAAC,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,MAAM,GAAG,SAAS,YAAY;AAEvD,SAAO,KAAK,KAAK,CAAC,QAAQ,aAAa,kBAAkB,GAAG,CAAC;AAC/D;AAEA,SAAS,aAAa,MAAc,MAAuB;AACzD,SAAO,KAAK,SAAS,MAAM,IAAI,MAAM;AACvC;AAEA,SAAS,uBAAuB,KAAsB;AACpD,MAAI;AACF,WAAO,cAAc,GAAG;AAAA,EAC1B,SAAS,KAAc;AACrB,QACE,KAAK,MAAM,cAAc,GAAG,KAC5B,UAAU,OACV,IAAI,SAAS,UACb;AACA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;",
  "names": []
}
