{
  "version": 3,
  "sources": ["../../../../src/packages/build-modules/index.ts"],
  "sourcesContent": ["import assert from 'node:assert';\nimport path from 'node:path';\nimport util from 'node:util';\nimport { calcDepState, type DepsStateCache } from '../calc-dep-state/index.ts';\nimport {\n  skippedOptionalDependencyLogger,\n  ignoredScriptsLogger,\n} from '../core-loggers/index.ts';\nimport { runPostinstallHooks } from '../lifecycle/index.ts';\nimport { linkBins, linkBinsOfPackages } from '../link-bins/index.ts';\nimport { logger } from '../logger/index.ts';\nimport { hardLinkDir } from '../worker/index.ts';\nimport {\n  readPackageJsonFromDir,\n  safeReadPackageJsonFromDir,\n} from '../read-package-json/index.ts';\nimport type {\n  PackageResponse,\n  StoreController,\n} from '../store-controller-types/index.ts';\nimport { applyPatchToDir } from '../patching.apply-patch/index.ts';\nimport pDefer, { type DeferredPromise } from 'p-defer';\nimport pickBy from 'ramda/src/pickBy';\nimport runGroups from 'run-groups';\nimport {\n  buildSequence,\n  type DependenciesGraph,\n  type DependenciesGraphNode,\n} from './buildSequence.ts';\nimport type { ModulesDir, PackageManifest } from '../types/index.ts';\n\nexport type { DepsStateCache };\n\nexport async function buildModules<T extends string, IP>(\n  depGraph: DependenciesGraph<T>,\n  rootDepPaths: T[],\n  opts: {\n    allowBuild?: ((pkgName: string) => boolean) | undefined;\n    ignoredBuiltDependencies?: string[] | undefined;\n    childConcurrency?: number | undefined;\n    depsToBuild?: Set<string> | undefined;\n    depsStateCache: DepsStateCache;\n    extraBinPaths?: string[] | undefined;\n    extraNodePaths?: string[] | undefined;\n    extraEnv?: Record<string, string> | undefined;\n    ignoreScripts?: boolean;\n    lockfileDir: string;\n    optional: boolean;\n    preferSymlinkedExecutables?: boolean | undefined;\n    rawConfig: object;\n    unsafePerm: boolean;\n    userAgent: string;\n    scriptsPrependNodePath?: boolean | 'warn-only' | undefined;\n    scriptShell?: string | undefined;\n    shellEmulator?: boolean | undefined;\n    sideEffectsCacheWrite: boolean;\n    storeController: StoreController<PackageResponse, PackageResponse, IP>;\n    rootModulesDir: string;\n    hoistedLocations?: Record<string, string[]> | undefined;\n  }\n): Promise<{ ignoredBuilds?: string[] | undefined }> {\n  if (!rootDepPaths.length) {\n    return {};\n  }\n\n  function warn(message: string): void {\n    logger.warn({ message, prefix: opts.lockfileDir });\n  }\n\n  // postinstall hooks\n\n  const buildDepOpts = {\n    ...opts,\n    builtHoistedDeps: opts.hoistedLocations ? {} : undefined,\n    warn,\n  };\n\n  const chunks = buildSequence<T>(depGraph, rootDepPaths);\n\n  if (!chunks.length) {\n    return {};\n  }\n\n  const ignoredPkgs = new Set<string>();\n\n  const allowBuild =\n    opts.allowBuild ??\n    ((): boolean => {\n      return true;\n    });\n\n  const groups = chunks.map((chunk: string[]): (() => Promise<void>)[] => {\n    let newChunk = chunk.filter((depPath: string): boolean => {\n      const node = depGraph[depPath as T];\n\n      return (\n        (node.requiresBuild === true || node.patch != null) &&\n        node.isBuilt !== true\n      );\n    });\n\n    if (opts.depsToBuild != null) {\n      newChunk = newChunk.filter((depPath: string): boolean => {\n        return opts.depsToBuild?.has(depPath) === true;\n      });\n    }\n\n    return newChunk.map((depPath: string): (() => Promise<void>) => {\n      return (): Promise<void> => {\n        let ignoreScripts = Boolean(buildDepOpts.ignoreScripts);\n\n        if (!ignoreScripts) {\n          if (\n            depGraph[depPath as T].requiresBuild === true &&\n            !allowBuild(depGraph[depPath as T].name)\n          ) {\n            ignoredPkgs.add(depGraph[depPath as T].name);\n\n            ignoreScripts = true;\n          }\n        }\n\n        return buildDependency(depPath, depGraph, {\n          ...buildDepOpts,\n          ignoreScripts,\n        });\n      };\n    });\n  });\n\n  await runGroups.default(opts.childConcurrency ?? 4, groups);\n\n  if (\n    typeof opts.ignoredBuiltDependencies?.length === 'number' &&\n    opts.ignoredBuiltDependencies.length > 0\n  ) {\n    for (const ignoredBuild of opts.ignoredBuiltDependencies) {\n      // We already ignore the build of this dependency.\n      // No need to report it.\n      ignoredPkgs.delete(ignoredBuild);\n    }\n  }\n\n  const packageNames = Array.from(ignoredPkgs);\n\n  ignoredScriptsLogger.debug({ packageNames });\n\n  return { ignoredBuilds: packageNames };\n}\n\nasync function buildDependency<T extends string, IP>(\n  depPath: T,\n  depGraph: DependenciesGraph<T>,\n  opts: {\n    extraBinPaths?: string[] | undefined;\n    extraNodePaths?: string[] | undefined;\n    extraEnv?: Record<string, string> | undefined;\n    depsStateCache: DepsStateCache;\n    ignoreScripts?: boolean | undefined;\n    lockfileDir: string;\n    optional: boolean;\n    preferSymlinkedExecutables?: boolean | undefined;\n    rawConfig: object;\n    rootModulesDir: string;\n    scriptsPrependNodePath?: boolean | 'warn-only' | undefined;\n    scriptShell?: string | undefined;\n    shellEmulator?: boolean | undefined;\n    sideEffectsCacheWrite: boolean;\n    storeController: StoreController<PackageResponse, PackageResponse, IP>;\n    unsafePerm: boolean;\n    hoistedLocations?: Record<string, string[]> | undefined;\n    builtHoistedDeps?: Record<string, DeferredPromise<void>> | undefined;\n    warn: (message: string) => void;\n  }\n): Promise<void> {\n  const depNode = depGraph[depPath];\n  if (\n    typeof depNode.filesIndexFile === 'undefined' ||\n    depNode.filesIndexFile === ''\n  ) {\n    return;\n  }\n\n  if (opts.builtHoistedDeps) {\n    if (opts.builtHoistedDeps[depNode.depPath]) {\n      await opts.builtHoistedDeps[depNode.depPath]?.promise;\n\n      return;\n    }\n\n    opts.builtHoistedDeps[depNode.depPath] = pDefer();\n  }\n\n  try {\n    await linkBinsOfDependencies(depNode, depGraph, opts);\n\n    let isPatched = false;\n\n    if (depNode.patch) {\n      const { file, strict } = depNode.patch;\n      isPatched = applyPatchToDir({\n        allowFailure: !strict,\n        patchedDir: depNode.dir,\n        patchFilePath: file.path,\n      });\n    }\n\n    const hasSideEffects =\n      opts.ignoreScripts !== true &&\n      (await runPostinstallHooks({\n        depPath,\n        extraBinPaths: opts.extraBinPaths,\n        extraEnv: opts.extraEnv,\n        initCwd: opts.lockfileDir,\n        optional: depNode.optional,\n        pkgRoot: depNode.dir,\n        rawConfig: opts.rawConfig,\n        rootModulesDir: opts.rootModulesDir,\n        scriptsPrependNodePath: opts.scriptsPrependNodePath,\n        scriptShell: opts.scriptShell,\n        shellEmulator: opts.shellEmulator,\n        unsafePerm: opts.unsafePerm || false,\n      }));\n\n    if ((isPatched || hasSideEffects) && opts.sideEffectsCacheWrite) {\n      try {\n        const sideEffectsCacheKey = calcDepState(\n          depGraph,\n          opts.depsStateCache,\n          depPath,\n          {\n            patchFileHash: depNode.patch?.file.hash,\n            isBuilt: hasSideEffects,\n          }\n        );\n\n        await opts.storeController.upload(depNode.dir, {\n          sideEffectsCacheKey,\n          filesIndexFile: depNode.filesIndexFile,\n        });\n      } catch (err: unknown) {\n        assert(util.types.isNativeError(err));\n        if ('statusCode' in err && err.statusCode === 403) {\n          logger.warn({\n            message: `The store server disabled upload requests, could not upload ${depNode.dir}`,\n            prefix: opts.lockfileDir,\n          });\n        } else {\n          logger.warn({\n            error: err,\n            message: `An error occurred while uploading ${depNode.dir}`,\n            prefix: opts.lockfileDir,\n          });\n        }\n      }\n    }\n  } catch (err: unknown) {\n    assert(util.types.isNativeError(err));\n\n    if (depNode.optional === true) {\n      // TODO: add parents field to the log\n      const pkg = await readPackageJsonFromDir(path.join(depNode.dir));\n\n      skippedOptionalDependencyLogger.debug({\n        details: err.toString(),\n        package: {\n          id: depNode.dir,\n          name: pkg.name,\n          version: pkg.version,\n        },\n        prefix: opts.lockfileDir,\n        reason: 'build_failure',\n      });\n\n      return;\n    }\n\n    throw err;\n  } finally {\n    const hoistedLocationsOfDep = opts.hoistedLocations?.[depNode.depPath];\n\n    if (hoistedLocationsOfDep) {\n      // There is no need to build the same package in every location.\n      // We just copy the built package to every location where it is present.\n      const currentHoistedLocation = path.relative(\n        opts.lockfileDir,\n        depNode.dir\n      );\n\n      const nonBuiltHoistedDeps = hoistedLocationsOfDep.filter(\n        (hoistedLocation: string): boolean => {\n          return hoistedLocation !== currentHoistedLocation;\n        }\n      );\n\n      await hardLinkDir(depNode.dir, nonBuiltHoistedDeps);\n    }\n\n    if (opts.builtHoistedDeps) {\n      opts.builtHoistedDeps[depNode.depPath]?.resolve();\n    }\n  }\n}\n\nexport async function linkBinsOfDependencies<T extends string>(\n  depNode: DependenciesGraphNode<T>,\n  depGraph: DependenciesGraph<T>,\n  opts: {\n    extraNodePaths?: string[] | undefined;\n    optional?: boolean | undefined;\n    preferSymlinkedExecutables?: boolean | undefined;\n    warn: (message: string) => void;\n  }\n): Promise<void> {\n  const childrenToLink: Record<string, T> =\n    opts.optional === true\n      ? depNode.children\n      : pickBy.default((_child, childAlias: string): boolean => {\n          return depNode.optionalDependencies.has(childAlias) !== true;\n        }, depNode.children);\n\n  const binPath = path.join(depNode.dir, 'node_modules/.bin');\n\n  const pkgNodes = [\n    ...Object.entries(childrenToLink)\n      .map(\n        ([alias, childDepPath]: [string, T]): {\n          alias: string;\n          dep: DependenciesGraph<T>[T];\n        } => {\n          return { alias, dep: depGraph[childDepPath] };\n        }\n      )\n      .filter(\n        ({\n          alias,\n          dep,\n        }: {\n          alias: string;\n          dep: DependenciesGraph<T>[T];\n        }): boolean => {\n          // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions\n          if (!dep) {\n            // TODO: Try to reproduce this issue with a test in @pnpm/core\n            logger.debug({\n              message: `Failed to link bins of \"${alias}\" to \"${binPath}\". This is probably not an issue.`,\n            });\n\n            return false;\n          }\n\n          return dep.hasBin && dep.installable !== false;\n        }\n      )\n      .map(\n        ({\n          dep,\n        }: {\n          alias: string;\n          dep: DependenciesGraph<T>[T];\n        }): DependenciesGraph<T>[T] => {\n          return dep;\n        }\n      ),\n    depNode,\n  ];\n\n  const pkgs = (\n    await Promise.all(\n      pkgNodes.map(\n        async (\n          dep: DependenciesGraphNode<T>\n        ): Promise<{\n          location: string;\n          manifest?: PackageManifest | undefined;\n        }> => {\n          return {\n            location: dep.dir,\n            manifest:\n              (await dep.fetchingBundledManifest?.()) ??\n              (await safeReadPackageJsonFromDir(dep.dir)) ??\n              undefined,\n          };\n        }\n      )\n    )\n  ).filter((pkg): pkg is { location: string; manifest: PackageManifest } => {\n    return typeof pkg.manifest !== 'undefined';\n  });\n\n  await linkBinsOfPackages(pkgs, binPath, {\n    extraNodePaths: opts.extraNodePaths,\n    preferSymlinkedExecutables: opts.preferSymlinkedExecutables,\n  });\n\n  // link also the bundled dependencies` bins\n  if (depNode.hasBundledDependencies) {\n    const bundledModules = path.join(depNode.dir, 'node_modules') as ModulesDir;\n\n    await linkBins(bundledModules, binPath, {\n      extraNodePaths: opts.extraNodePaths,\n      preferSymlinkedExecutables: opts.preferSymlinkedExecutables,\n      warn: opts.warn,\n    });\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
