{
  "version": 3,
  "sources": ["../../../../src/packages/headless/linkHoistedModules.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport { calcDepState, type DepsStateCache } from '../calc-dep-state/index.ts';\nimport {\n  progressLogger,\n  removalLogger,\n  statsLogger,\n} from '../core-loggers/index.ts';\nimport type {\n  DepHierarchy,\n  DependenciesGraph,\n} from '../deps.graph-builder/index.ts';\nimport { linkBins } from '../link-bins/index.ts';\nimport { logger } from '../logger/index.ts';\nimport type {\n  PackageResponse,\n  StoreController,\n} from '../store-controller-types/index.ts';\nimport pLimit from 'p-limit';\nimport difference from 'ramda/src/difference';\nimport isEmpty from 'ramda/src/isEmpty';\nimport rimraf from '@zkochan/rimraf';\nimport type { PackageFilesResponse } from '../cafs-types/index.ts';\nimport type { ModulesDir } from '../types/project.ts';\n\nconst limitLinking = pLimit(16);\n\nexport async function linkHoistedModules(\n  storeController: StoreController<\n    PackageResponse,\n    PackageResponse,\n    {\n      importMethod?: string | undefined;\n      isBuilt: boolean;\n    }\n  >,\n  graph: DependenciesGraph,\n  prevGraph: DependenciesGraph,\n  hierarchy: DepHierarchy,\n  opts: {\n    allowBuild?: ((pkgName: string) => boolean) | undefined;\n    depsStateCache: DepsStateCache;\n    disableRelinkLocalDirDeps?: boolean | undefined;\n    force: boolean;\n    ignoreScripts: boolean;\n    lockfileDir: string;\n    preferSymlinkedExecutables?: boolean | undefined;\n    sideEffectsCacheRead: boolean;\n  }\n): Promise<void> {\n  // TODO: remove nested node modules first\n  const dirsToRemove = difference.default(\n    Object.keys(prevGraph),\n    Object.keys(graph)\n  );\n\n  statsLogger.debug({\n    prefix: opts.lockfileDir,\n    removed: dirsToRemove.length,\n  });\n\n  // We should avoid removing unnecessary directories while simultaneously adding new ones.\n  // Doing so can sometimes lead to a race condition when linking commands to `node_modules/.bin`.\n  await Promise.all(dirsToRemove.map((dir) => tryRemoveDir(dir)));\n\n  await Promise.all(\n    Object.entries(hierarchy).map(([parentDir, depsHierarchy]) => {\n      function warn(message: string): void {\n        logger.info({\n          message,\n          prefix: parentDir,\n        });\n      }\n\n      return linkAllPkgsInOrder(\n        storeController,\n        graph,\n        depsHierarchy,\n        parentDir,\n        {\n          ...opts,\n          warn,\n        }\n      );\n    })\n  );\n}\n\nasync function tryRemoveDir(dir: string): Promise<void> {\n  removalLogger.debug(dir);\n  try {\n    await rimraf(dir);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars\n  } catch (_err: any) {\n    /* Just ignoring for now. Not even logging.\n    logger.warn({\n      error: err,\n      message: `Failed to remove \"${pathToRemove}\"`,\n      prefix: lockfileDir,\n    })\n    */\n  }\n}\n\nasync function linkAllPkgsInOrder<R>(\n  storeController: StoreController<\n    PackageResponse,\n    PackageResponse,\n    {\n      importMethod?: string | undefined;\n      isBuilt: boolean;\n    }\n  >,\n  graph: DependenciesGraph,\n  hierarchy: DepHierarchy,\n  parentDir: string,\n  opts: {\n    allowBuild?: ((pkgName: string) => boolean) | undefined;\n    depsStateCache: DepsStateCache;\n    disableRelinkLocalDirDeps?: boolean | undefined;\n    force: boolean;\n    ignoreScripts: boolean;\n    lockfileDir: string;\n    preferSymlinkedExecutables?: boolean | undefined;\n    sideEffectsCacheRead: boolean;\n    warn: (message: string) => void;\n  }\n): Promise<void> {\n  const _calcDepState = calcDepState.bind(null, graph, opts.depsStateCache);\n\n  await Promise.all(\n    Object.entries(hierarchy).map(\n      async ([dir, deps]: [string, DepHierarchy]): Promise<void> => {\n        const depNode = graph[dir];\n\n        if (typeof depNode?.fetching === 'function') {\n          let filesResponse!: PackageFilesResponse;\n\n          try {\n            filesResponse = (await depNode.fetching()).files;\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          } catch (err: any) {\n            if (depNode.optional) {\n              return;\n            }\n\n            throw err;\n          }\n\n          depNode.requiresBuild = filesResponse.requiresBuild;\n\n          let sideEffectsCacheKey: string | undefined;\n\n          if (\n            opts.sideEffectsCacheRead &&\n            filesResponse.sideEffects &&\n            !isEmpty.default(filesResponse.sideEffects)\n          ) {\n            if (opts.allowBuild?.(depNode.name) !== false) {\n              sideEffectsCacheKey = _calcDepState(dir, {\n                isBuilt: !opts.ignoreScripts && depNode.requiresBuild,\n                patchFileHash: depNode.patch?.file.hash,\n              });\n            }\n          }\n\n          // Limiting the concurrency here fixes an out of memory error.\n          // It is not clear why it helps as importing is also limited inside fs.indexed-pkg-importer.\n          // The out of memory error was reproduced on the teambit/bit repository with the \"rootComponents\" feature turned on\n          await limitLinking(async (): Promise<void> => {\n            const { importMethod, isBuilt } =\n              await storeController.importPackage(depNode.dir, {\n                filesResponse,\n                force: true,\n                disableRelinkLocalDirDeps: opts.disableRelinkLocalDirDeps,\n                keepModulesDir: true,\n                requiresBuild: depNode.patch != null || depNode.requiresBuild,\n                sideEffectsCacheKey,\n              });\n\n            if (typeof importMethod !== 'undefined') {\n              progressLogger.debug({\n                method: importMethod,\n                requester: opts.lockfileDir,\n                status: 'imported',\n                to: depNode.dir,\n              });\n            }\n\n            depNode.isBuilt = isBuilt;\n          });\n        }\n\n        return linkAllPkgsInOrder<R>(storeController, graph, deps, dir, opts);\n      }\n    )\n  );\n\n  const modulesDir: ModulesDir = path.join(\n    parentDir,\n    'node_modules'\n  ) as ModulesDir;\n\n  const binsDir = path.join(modulesDir, '.bin');\n\n  await linkBins(modulesDir, binsDir, {\n    allowExoticManifests: true,\n    preferSymlinkedExecutables: opts.preferSymlinkedExecutables,\n    warn: opts.warn,\n  });\n}\n"],
  "mappings": "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",
  "names": []
}
