{
  "version": 3,
  "sources": ["../../../../src/packages/lifecycle/runLifecycleHooksConcurrently.ts"],
  "sourcesContent": ["import fs from 'node:fs';\nimport { linkBins } from '../link-bins/index.ts';\nimport { logger } from '../logger/index.ts';\nimport path from 'node:path';\nimport { fetchFromDir } from '../directory-fetcher/index.ts';\nimport type {\n  PackageResponse,\n  StoreController,\n} from '../store-controller-types/index.ts';\nimport type {\n  GlobalPkgDir,\n  LockFileDir,\n  ModulesDir,\n  ProjectManifest,\n  ProjectRootDir,\n  ProjectRootDirRealPath,\n  WorkspaceDir,\n} from '../types/index.ts';\nimport runGroups from 'run-groups';\nimport {\n  runLifecycleHook,\n  type RunLifecycleHookOptions,\n} from './runLifecycleHook.ts';\n\nexport type RunLifecycleHooksConcurrentlyOptions = Omit<\n  RunLifecycleHookOptions,\n  'depPath' | 'pkgRoot' | 'rootModulesDir'\n> & {\n  resolveSymlinksInInjectedDirs?: boolean | undefined;\n  storeController: StoreController<\n    PackageResponse,\n    PackageResponse,\n    {\n      isBuilt: boolean;\n      importMethod?: string | undefined;\n    }\n  >;\n  extraNodePaths?: string[] | undefined;\n  preferSymlinkedExecutables?: boolean | undefined;\n};\n\nexport interface Importer {\n  buildIndex?: number | undefined;\n  manifest?: ProjectManifest | undefined;\n  rootDir:\n    | ProjectRootDir\n    | ProjectRootDirRealPath\n    | GlobalPkgDir\n    | WorkspaceDir\n    | LockFileDir;\n  modulesDir?: ModulesDir | undefined;\n  stages?: string[] | undefined;\n  targetDirs?: string[] | undefined;\n}\n\nexport async function runLifecycleHooksConcurrently(\n  stages: string[],\n  importers: Importer[],\n  childConcurrency: number,\n  opts: RunLifecycleHooksConcurrentlyOptions\n): Promise<void> {\n  const importersByBuildIndex = new Map<number, Importer[]>();\n\n  for (const importer of importers) {\n    if (typeof importer.buildIndex === 'number') {\n      if (importersByBuildIndex.has(importer.buildIndex)) {\n        importersByBuildIndex.get(importer.buildIndex)?.push(importer);\n      } else {\n        importersByBuildIndex.set(importer.buildIndex, [importer]);\n      }\n    }\n  }\n\n  const sortedBuildIndexes = Array.from(importersByBuildIndex.keys()).sort(\n    (a: number, b: number): number => {\n      return a - b;\n    }\n  );\n\n  const groups = sortedBuildIndexes.map(\n    (buildIndex: number): Array<() => Promise<void>> => {\n      const importers = importersByBuildIndex.get(buildIndex);\n\n      return (\n        importers?.map(\n          ({\n            manifest,\n            modulesDir,\n            rootDir,\n            stages: importerStages,\n            targetDirs,\n          }: Importer): (() => Promise<void>) => {\n            return async (): Promise<void> => {\n              // We are linking the bin files, in case they were created by lifecycle scripts of other workspace packages.\n              await linkBins(\n                modulesDir ?? ('node_modules' as ModulesDir),\n                path.join(modulesDir ?? '', '.bin'),\n                {\n                  extraNodePaths: opts.extraNodePaths,\n                  allowExoticManifests: true,\n                  preferSymlinkedExecutables: opts.preferSymlinkedExecutables,\n                  projectManifest: manifest,\n                  warn: (message: string): void => {\n                    logger.warn({ message, prefix: rootDir });\n                  },\n                }\n              );\n\n              const runLifecycleHookOpts: RunLifecycleHookOptions = {\n                ...opts,\n                depPath: rootDir,\n                pkgRoot: rootDir,\n                rootModulesDir: modulesDir,\n              };\n\n              let isBuilt = false;\n\n              for (const stage of importerStages ?? stages) {\n                if (\n                  typeof manifest !== 'undefined' &&\n                  (await runLifecycleHook(\n                    stage,\n                    manifest,\n                    runLifecycleHookOpts\n                  ))\n                ) {\n                  isBuilt = true;\n                }\n              }\n\n              if (targetDirs == null || targetDirs.length === 0 || !isBuilt) {\n                return;\n              }\n\n              const filesResponse = await fetchFromDir(rootDir, {\n                resolveSymlinks: opts.resolveSymlinksInInjectedDirs,\n              });\n\n              await Promise.all(\n                targetDirs.map(async (targetDir) => {\n                  const targetModulesDir = path.join(\n                    targetDir,\n                    'node_modules'\n                  ) as ModulesDir;\n\n                  const nodeModulesIndex = {};\n\n                  if (fs.existsSync(targetModulesDir)) {\n                    // If the target directory contains a node_modules directory\n                    // (it may happen when the hoisted node linker is used)\n                    // then we need to preserve this node_modules.\n                    // So we scan this node_modules directory and  pass it as part of the new package.\n                    await scanDir(\n                      'node_modules',\n                      targetModulesDir,\n                      targetModulesDir,\n                      nodeModulesIndex\n                    );\n                  }\n\n                  return opts.storeController.importPackage(targetDir, {\n                    filesResponse: {\n                      unprocessed: false,\n                      resolvedFrom: 'local-dir',\n                      ...filesResponse,\n                      filesIndex: {\n                        ...filesResponse.filesIndex,\n                        ...nodeModulesIndex,\n                      },\n                    },\n                    force: false,\n                  });\n                })\n              );\n            };\n          }\n        ) ?? []\n      );\n    }\n  );\n\n  await runGroups.default(childConcurrency, groups);\n}\n\nasync function scanDir(\n  prefix: string,\n  modulesDir: ModulesDir,\n  currentDir: string,\n  index: Record<string, string>\n): Promise<void> {\n  const files = await fs.promises.readdir(currentDir);\n\n  await Promise.all(\n    files.map(async (file: string): Promise<void> => {\n      const fullPath = path.join(currentDir, file);\n\n      const stat = await fs.promises.stat(fullPath);\n\n      if (stat.isDirectory()) {\n        return scanDir(prefix, modulesDir, fullPath, index);\n      }\n\n      if (stat.isFile()) {\n        const relativePath = path.relative(modulesDir, fullPath);\n\n        index[path.join(prefix, relativePath)] = fullPath;\n      }\n    })\n  );\n}\n"],
  "mappings": "AAAA,OAAO,QAAQ;AACf,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAc7B,OAAO,eAAe;AACtB;AAAA,EACE;AAAA,OAEK;AAiCP,eAAsB,8BACpB,QACA,WACA,kBACA,MACe;AACf,QAAM,wBAAwB,oBAAI,IAAwB;AAE1D,aAAW,YAAY,WAAW;AAChC,QAAI,OAAO,SAAS,eAAe,UAAU;AAC3C,UAAI,sBAAsB,IAAI,SAAS,UAAU,GAAG;AAClD,8BAAsB,IAAI,SAAS,UAAU,GAAG,KAAK,QAAQ;AAAA,MAC/D,OAAO;AACL,8BAAsB,IAAI,SAAS,YAAY,CAAC,QAAQ,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM,KAAK,sBAAsB,KAAK,CAAC,EAAE;AAAA,IAClE,CAAC,GAAW,MAAsB;AAChC,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AAEA,QAAM,SAAS,mBAAmB;AAAA,IAChC,CAAC,eAAmD;AAClD,YAAMA,aAAY,sBAAsB,IAAI,UAAU;AAEtD,aACEA,YAAW;AAAA,QACT,CAAC;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF,MAAuC;AACrC,iBAAO,YAA2B;AAEhC,kBAAM;AAAA,cACJ,cAAe;AAAA,cACf,KAAK,KAAK,cAAc,IAAI,MAAM;AAAA,cAClC;AAAA,gBACE,gBAAgB,KAAK;AAAA,gBACrB,sBAAsB;AAAA,gBACtB,4BAA4B,KAAK;AAAA,gBACjC,iBAAiB;AAAA,gBACjB,MAAM,CAAC,YAA0B;AAC/B,yBAAO,KAAK,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAAA,gBAC1C;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,uBAAgD;AAAA,cACpD,GAAG;AAAA,cACH,SAAS;AAAA,cACT,SAAS;AAAA,cACT,gBAAgB;AAAA,YAClB;AAEA,gBAAI,UAAU;AAEd,uBAAW,SAAS,kBAAkB,QAAQ;AAC5C,kBACE,OAAO,aAAa,eACnB,MAAM;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,GACA;AACA,0BAAU;AAAA,cACZ;AAAA,YACF;AAEA,gBAAI,cAAc,QAAQ,WAAW,WAAW,KAAK,CAAC,SAAS;AAC7D;AAAA,YACF;AAEA,kBAAM,gBAAgB,MAAM,aAAa,SAAS;AAAA,cAChD,iBAAiB,KAAK;AAAA,YACxB,CAAC;AAED,kBAAM,QAAQ;AAAA,cACZ,WAAW,IAAI,OAAO,cAAc;AAClC,sBAAM,mBAAmB,KAAK;AAAA,kBAC5B;AAAA,kBACA;AAAA,gBACF;AAEA,sBAAM,mBAAmB,CAAC;AAE1B,oBAAI,GAAG,WAAW,gBAAgB,GAAG;AAKnC,wBAAM;AAAA,oBACJ;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAEA,uBAAO,KAAK,gBAAgB,cAAc,WAAW;AAAA,kBACnD,eAAe;AAAA,oBACb,aAAa;AAAA,oBACb,cAAc;AAAA,oBACd,GAAG;AAAA,oBACH,YAAY;AAAA,sBACV,GAAG,cAAc;AAAA,sBACjB,GAAG;AAAA,oBACL;AAAA,kBACF;AAAA,kBACA,OAAO;AAAA,gBACT,CAAC;AAAA,cACH,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF,KAAK,CAAC;AAAA,IAEV;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,kBAAkB,MAAM;AAClD;AAEA,eAAe,QACb,QACA,YACA,YACA,OACe;AACf,QAAM,QAAQ,MAAM,GAAG,SAAS,QAAQ,UAAU;AAElD,QAAM,QAAQ;AAAA,IACZ,MAAM,IAAI,OAAO,SAAgC;AAC/C,YAAM,WAAW,KAAK,KAAK,YAAY,IAAI;AAE3C,YAAM,OAAO,MAAM,GAAG,SAAS,KAAK,QAAQ;AAE5C,UAAI,KAAK,YAAY,GAAG;AACtB,eAAO,QAAQ,QAAQ,YAAY,UAAU,KAAK;AAAA,MACpD;AAEA,UAAI,KAAK,OAAO,GAAG;AACjB,cAAM,eAAe,KAAK,SAAS,YAAY,QAAQ;AAEvD,cAAM,KAAK,KAAK,QAAQ,YAAY,CAAC,IAAI;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
  "names": ["importers"]
}
