{
  "version": 3,
  "sources": ["../../../../src/packages/prepare-package/index.ts"],
  "sourcesContent": ["import assert from 'node:assert';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport util from 'node:util';\nimport { PnpmError } from '../error/index.ts';\nimport {\n  runLifecycleHook,\n  type RunLifecycleHookOptions,\n} from '../lifecycle/index.ts';\nimport { safeReadPackageJsonFromDir } from '../read-package-json/index.ts';\nimport type { PackageManifest } from '../types/index.ts';\nimport rimraf from '@zkochan/rimraf';\nimport preferredPM from 'preferred-pm';\nimport omit from 'ramda/src/omit';\n\n// We don't run prepublishOnly to prepare the dependency.\n// This might be counterintuitive as prepublishOnly is where a lot of packages put their build scripts.\n// However, neither npm nor Yarn run prepublishOnly of git-hosted dependencies (checked on npm v10 and Yarn v3).\nconst PREPUBLISH_SCRIPTS = ['prepublish', 'prepack', 'publish'];\n\nexport type PreparePackageOptions = {\n  ignoreScripts?: boolean | undefined;\n  rawConfig: Record<string, unknown>;\n  unsafePerm?: boolean | undefined;\n};\n\nexport async function preparePackage(\n  opts: PreparePackageOptions,\n  gitRootDir: string,\n  subDir: string\n): Promise<{ shouldBeBuilt: boolean; pkgDir: string }> {\n  const pkgDir = safeJoinPath(gitRootDir, subDir);\n\n  const manifest = await safeReadPackageJsonFromDir(pkgDir);\n\n  if (manifest?.scripts == null || !packageShouldBeBuilt(manifest, pkgDir)) {\n    return { shouldBeBuilt: false, pkgDir };\n  }\n\n  if (opts.ignoreScripts === true) {\n    return { shouldBeBuilt: true, pkgDir };\n  }\n\n  const pm = (await preferredPM(gitRootDir))?.name ?? 'npm';\n\n  const execOpts: RunLifecycleHookOptions = {\n    depPath: `${manifest.name}@${manifest.version}`,\n    pkgRoot: pkgDir,\n    // We can't prepare a package without running its lifecycle scripts.\n    // An alternative solution could be to throw an exception.\n    rawConfig: omit.default(['ignore-scripts'], opts.rawConfig),\n    rootModulesDir: pkgDir, // We don't need this property but there is currently no way to not set it.\n    unsafePerm: Boolean(opts.unsafePerm),\n  };\n\n  try {\n    const installScriptName = `${pm}-install`;\n\n    manifest.scripts[installScriptName] = `${pm} install`;\n\n    await runLifecycleHook(installScriptName, manifest, execOpts);\n\n    for (const scriptName of PREPUBLISH_SCRIPTS) {\n      if (\n        manifest.scripts[scriptName] == null ||\n        manifest.scripts[scriptName] === ''\n      ) {\n        continue;\n      }\n\n      let newScriptName: string;\n\n      if (pm !== 'pnpm') {\n        newScriptName = `${pm}-run-${scriptName}`;\n        manifest.scripts[newScriptName] = `${pm} run ${scriptName}`;\n      } else {\n        newScriptName = scriptName;\n      }\n\n      await runLifecycleHook(newScriptName, manifest, execOpts);\n    }\n  } catch (err: unknown) {\n    assert(util.types.isNativeError(err));\n\n    Object.assign(err, {\n      code: 'ERR_PNPM_PREPARE_PACKAGE',\n    });\n\n    throw err;\n  }\n\n  await rimraf(path.join(pkgDir, 'node_modules'));\n\n  return { shouldBeBuilt: true, pkgDir };\n}\n\nfunction packageShouldBeBuilt(\n  manifest: PackageManifest,\n  pkgDir: string\n): boolean {\n  if (manifest.scripts == null) return false;\n  const scripts = manifest.scripts;\n  if (scripts.prepare != null && scripts.prepare !== '') return true;\n  const hasPrepublishScript = PREPUBLISH_SCRIPTS.some(\n    (scriptName) => scripts[scriptName] != null && scripts[scriptName] !== ''\n  );\n  if (!hasPrepublishScript) return false;\n  const mainFile = manifest.main ?? 'index.js';\n  return !fs.existsSync(path.join(pkgDir, mainFile));\n}\n\nfunction safeJoinPath(root: string, sub: string): string {\n  const joined = path.join(root, sub);\n  // prevent the dir traversal attack\n  const relative = path.relative(root, joined);\n  if (relative.startsWith('..')) {\n    throw new PnpmError(\n      'INVALID_PATH',\n      `Path \"${sub}\" should be a sub directory`\n    );\n  }\n  if (!fs.existsSync(joined) || !fs.lstatSync(joined).isDirectory()) {\n    throw new PnpmError('INVALID_PATH', `Path \"${sub}\" is not a directory`);\n  }\n  return joined;\n}\n"],
  "mappings": "AAAA,OAAO,YAAY;AACnB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,OAEK;AACP,SAAS,kCAAkC;AAE3C,OAAO,YAAY;AACnB,OAAO,iBAAiB;AACxB,OAAO,UAAU;AAKjB,MAAM,qBAAqB,CAAC,cAAc,WAAW,SAAS;AAQ9D,eAAsB,eACpB,MACA,YACA,QACqD;AACrD,QAAM,SAAS,aAAa,YAAY,MAAM;AAE9C,QAAM,WAAW,MAAM,2BAA2B,MAAM;AAExD,MAAI,UAAU,WAAW,QAAQ,CAAC,qBAAqB,UAAU,MAAM,GAAG;AACxE,WAAO,EAAE,eAAe,OAAO,OAAO;AAAA,EACxC;AAEA,MAAI,KAAK,kBAAkB,MAAM;AAC/B,WAAO,EAAE,eAAe,MAAM,OAAO;AAAA,EACvC;AAEA,QAAM,MAAM,MAAM,YAAY,UAAU,IAAI,QAAQ;AAEpD,QAAM,WAAoC;AAAA,IACxC,SAAS,GAAG,SAAS,IAAI,IAAI,SAAS,OAAO;AAAA,IAC7C,SAAS;AAAA;AAAA;AAAA,IAGT,WAAW,KAAK,QAAQ,CAAC,gBAAgB,GAAG,KAAK,SAAS;AAAA,IAC1D,gBAAgB;AAAA;AAAA,IAChB,YAAY,QAAQ,KAAK,UAAU;AAAA,EACrC;AAEA,MAAI;AACF,UAAM,oBAAoB,GAAG,EAAE;AAE/B,aAAS,QAAQ,iBAAiB,IAAI,GAAG,EAAE;AAE3C,UAAM,iBAAiB,mBAAmB,UAAU,QAAQ;AAE5D,eAAW,cAAc,oBAAoB;AAC3C,UACE,SAAS,QAAQ,UAAU,KAAK,QAChC,SAAS,QAAQ,UAAU,MAAM,IACjC;AACA;AAAA,MACF;AAEA,UAAI;AAEJ,UAAI,OAAO,QAAQ;AACjB,wBAAgB,GAAG,EAAE,QAAQ,UAAU;AACvC,iBAAS,QAAQ,aAAa,IAAI,GAAG,EAAE,QAAQ,UAAU;AAAA,MAC3D,OAAO;AACL,wBAAgB;AAAA,MAClB;AAEA,YAAM,iBAAiB,eAAe,UAAU,QAAQ;AAAA,IAC1D;AAAA,EACF,SAAS,KAAc;AACrB,WAAO,KAAK,MAAM,cAAc,GAAG,CAAC;AAEpC,WAAO,OAAO,KAAK;AAAA,MACjB,MAAM;AAAA,IACR,CAAC;AAED,UAAM;AAAA,EACR;AAEA,QAAM,OAAO,KAAK,KAAK,QAAQ,cAAc,CAAC;AAE9C,SAAO,EAAE,eAAe,MAAM,OAAO;AACvC;AAEA,SAAS,qBACP,UACA,QACS;AACT,MAAI,SAAS,WAAW,KAAM,QAAO;AACrC,QAAM,UAAU,SAAS;AACzB,MAAI,QAAQ,WAAW,QAAQ,QAAQ,YAAY,GAAI,QAAO;AAC9D,QAAM,sBAAsB,mBAAmB;AAAA,IAC7C,CAAC,eAAe,QAAQ,UAAU,KAAK,QAAQ,QAAQ,UAAU,MAAM;AAAA,EACzE;AACA,MAAI,CAAC,oBAAqB,QAAO;AACjC,QAAM,WAAW,SAAS,QAAQ;AAClC,SAAO,CAAC,GAAG,WAAW,KAAK,KAAK,QAAQ,QAAQ,CAAC;AACnD;AAEA,SAAS,aAAa,MAAc,KAAqB;AACvD,QAAM,SAAS,KAAK,KAAK,MAAM,GAAG;AAElC,QAAM,WAAW,KAAK,SAAS,MAAM,MAAM;AAC3C,MAAI,SAAS,WAAW,IAAI,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,SAAS,GAAG;AAAA,IACd;AAAA,EACF;AACA,MAAI,CAAC,GAAG,WAAW,MAAM,KAAK,CAAC,GAAG,UAAU,MAAM,EAAE,YAAY,GAAG;AACjE,UAAM,IAAI,UAAU,gBAAgB,SAAS,GAAG,sBAAsB;AAAA,EACxE;AACA,SAAO;AACT;",
  "names": []
}
