{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-script-runners/runRecursive.ts"],
  "sourcesContent": ["import assert from 'node:assert';\nimport path from 'node:path';\nimport util from 'node:util';\nimport {\n  throwOnCommandFail,\n  type RecursiveSummary,\n} from '../cli-utils/index.ts';\nimport type { Config } from '../config/index.ts';\nimport { prepareExecutionEnv } from '../plugin-commands-env/index.ts';\nimport { PnpmError } from '../error/index.ts';\nimport {\n  makeNodeRequireOption,\n  type RunLifecycleHookOptions,\n} from '../lifecycle/index.ts';\nimport { logger } from '../logger/index.ts';\nimport { groupStart } from '@pnpm/log.group';\nimport { sortPackages } from '../sort-packages/index.ts';\nimport pLimit from 'p-limit';\nimport realpathMissing from 'realpath-missing';\nimport { existsInDir } from './existsInDir.ts';\nimport {\n  createEmptyRecursiveSummary,\n  getExecutionDuration,\n  getResumedPackageChunks,\n  writeRecursiveSummary,\n} from './exec.ts';\nimport { type RunScriptOptions, runScript } from './run.ts';\nimport { tryBuildRegExpFromCommand } from './regexpCommand.ts';\nimport type {\n  PackageScripts,\n  Project,\n  ProjectRootDir,\n} from '../types/index.ts';\nimport process from 'node:process';\n\nexport type RecursiveRunOpts = Pick<\n  Config,\n  | 'bin'\n  | 'enablePrePostScripts'\n  | 'unsafePerm'\n  | 'pnpmHomeDir'\n  | 'rawConfig'\n  | 'rootProjectManifest'\n  | 'scriptsPrependNodePath'\n  | 'scriptShell'\n  | 'shellEmulator'\n  | 'stream'\n  | 'syncInjectedDepsAfterScripts'\n  | 'workspaceDir'\n  | 'storeDir'\n> &\n  Required<\n    Pick<\n      Config,\n      'allProjects' | 'selectedProjectsGraph' | 'workspaceDir' | 'dir'\n    >\n  > &\n  Partial<\n    Pick<\n      Config,\n      | 'extraBinPaths'\n      | 'extraEnv'\n      | 'bail'\n      | 'reporter'\n      | 'reverse'\n      | 'sort'\n      | 'workspaceConcurrency'\n    >\n  > & {\n    ifPresent?: boolean | undefined;\n    resumeFrom?: string | undefined;\n    reportSummary?: boolean | undefined;\n  };\n\nexport async function runRecursive(\n  params: string[],\n  opts: RecursiveRunOpts\n): Promise<void> {\n  const [scriptName, ...passedThruArgs] = params;\n\n  if (typeof scriptName === 'undefined') {\n    throw new PnpmError(\n      'SCRIPT_NAME_IS_REQUIRED',\n      'You must specify the script you want to run'\n    );\n  }\n\n  let hasCommand = 0;\n\n  const sortedPackageChunks =\n    opts.sort === true\n      ? sortPackages(opts.selectedProjectsGraph ?? {})\n      : [Object.keys(opts.selectedProjectsGraph ?? {}).sort()];\n\n  let packageChunks: ProjectRootDir[][] =\n    opts.reverse === true\n      ? (sortedPackageChunks.reverse() as ProjectRootDir[][])\n      : (sortedPackageChunks as ProjectRootDir[][]);\n\n  if (typeof opts.resumeFrom === 'string') {\n    packageChunks = getResumedPackageChunks({\n      resumeFrom: opts.resumeFrom,\n      chunks: packageChunks,\n      selectedProjectsGraph: opts.selectedProjectsGraph ?? {},\n    });\n  }\n\n  const limitRun = pLimit(opts.workspaceConcurrency ?? 4);\n\n  const stdio =\n    opts.stream !== true &&\n    (opts.workspaceConcurrency === 1 ||\n      (packageChunks.length === 1 && packageChunks[0]?.length === 1))\n      ? 'inherit'\n      : 'pipe';\n\n  const existsPnp = existsInDir.bind(null, '.pnp.cjs');\n\n  const workspacePnpPath =\n    typeof opts.workspaceDir === 'string' && existsPnp(opts.workspaceDir);\n\n  const requiredScripts = opts.rootProjectManifest?.pnpm?.requiredScripts ?? [];\n\n  if (requiredScripts.includes(scriptName)) {\n    const missingScriptPackages: string[] = packageChunks\n      .flat()\n      .map(\n        (\n          prefix: ProjectRootDir\n        ):\n          | {\n              dependencies: ProjectRootDir[];\n              package: Project;\n            }\n          | undefined => {\n          return opts.selectedProjectsGraph?.[prefix];\n        }\n      )\n      .filter(Boolean)\n      .filter(\n        (pkg: {\n          dependencies: ProjectRootDir[];\n          package: Project;\n        }): boolean => {\n          return (\n            getSpecifiedScripts(pkg.package.manifest.scripts ?? {}, scriptName)\n              .length < 1\n          );\n        }\n      )\n      .map(\n        (pkg: {\n          dependencies: ProjectRootDir[];\n          package: Project;\n        }): string => {\n          return pkg.package.manifest.name || pkg.package.rootDir;\n        }\n      );\n    if (missingScriptPackages.length) {\n      throw new PnpmError(\n        'RECURSIVE_RUN_NO_SCRIPT',\n        `Missing script \"${scriptName}\" in packages: ${missingScriptPackages.join(', ')}`\n      );\n    }\n  }\n\n  const result: RecursiveSummary = createEmptyRecursiveSummary(packageChunks);\n\n  for (const chunk of packageChunks) {\n    const selectedScripts = chunk.flatMap(\n      (\n        prefix: ProjectRootDir\n      ): {\n        prefix: ProjectRootDir;\n        scriptName: string;\n      }[] => {\n        const pkg = opts.selectedProjectsGraph?.[prefix];\n\n        if (typeof pkg === 'undefined') {\n          return [];\n        }\n\n        const specifiedScripts = getSpecifiedScripts(\n          pkg.package.manifest.scripts ?? {},\n          scriptName\n        );\n\n        if (\n          specifiedScripts.length === 0 &&\n          typeof result[prefix] !== 'undefined'\n        ) {\n          result[prefix].status = 'skipped';\n        }\n\n        return specifiedScripts.map(\n          (\n            script: string\n          ): {\n            prefix: ProjectRootDir;\n            scriptName: string;\n          } => {\n            return { prefix, scriptName: script };\n          }\n        );\n      }\n    );\n\n    await Promise.all(\n      selectedScripts.map(\n        async ({\n          prefix,\n          scriptName,\n        }: {\n          prefix: ProjectRootDir;\n          scriptName: string;\n        }): Promise<void> => {\n          return limitRun(async (): Promise<void> => {\n            const pkg = opts.selectedProjectsGraph?.[prefix];\n\n            if (typeof pkg === 'undefined') {\n              return;\n            }\n\n            if (\n              typeof pkg.package.manifest.scripts?.[scriptName] ===\n                'undefined' ||\n              (process.env.npm_lifecycle_event === scriptName &&\n                process.env.PNPM_SCRIPT_SRC_DIR === prefix)\n            ) {\n              return;\n            }\n\n            if (typeof result[prefix] !== 'undefined') {\n              result[prefix].status = 'running';\n            }\n\n            const startTime = process.hrtime();\n\n            hasCommand++;\n\n            try {\n              const lifecycleOpts: RunLifecycleHookOptions = {\n                depPath: prefix,\n                extraBinPaths: opts.extraBinPaths,\n                extraEnv: opts.extraEnv,\n                pkgRoot: prefix,\n                rawConfig: opts.rawConfig,\n                rootModulesDir: await realpathMissing(\n                  path.join(prefix, 'node_modules')\n                ),\n                scriptsPrependNodePath: opts.scriptsPrependNodePath,\n                scriptShell: opts.scriptShell,\n                silent: opts.reporter === 'silent',\n                shellEmulator: opts.shellEmulator,\n                stdio,\n                unsafePerm: true, // when running scripts explicitly, assume that they're trusted.\n              };\n\n              const { executionEnv } = pkg.package.manifest.pnpm ?? {};\n\n              if (executionEnv != null) {\n                lifecycleOpts.extraBinPaths = (\n                  await prepareExecutionEnv(opts, { executionEnv })\n                ).extraBinPaths;\n              }\n\n              const pnpPath = workspacePnpPath ?? existsPnp(prefix);\n\n              if (typeof pnpPath === 'string') {\n                lifecycleOpts.extraEnv = {\n                  ...lifecycleOpts.extraEnv,\n                  ...makeNodeRequireOption(pnpPath),\n                };\n              }\n\n              const runScriptOptions: RunScriptOptions = {\n                enablePrePostScripts: opts.enablePrePostScripts ?? false,\n                syncInjectedDepsAfterScripts: opts.syncInjectedDepsAfterScripts,\n                workspaceDir: opts.workspaceDir,\n              };\n\n              const _runScript = runScript.bind(null, {\n                manifest: pkg.package.manifest,\n                lifecycleOpts,\n                runScriptOptions,\n                passedThruArgs,\n              });\n\n              const groupEnd =\n                (opts.workspaceConcurrency ?? 4) > 1\n                  ? undefined\n                  : groupStart(\n                      formatSectionName({\n                        name: pkg.package.manifest.name,\n                        script: scriptName,\n                        version: pkg.package.manifest.version,\n                        prefix: path.normalize(\n                          path.relative(\n                            opts.workspaceDir ?? process.cwd(),\n                            prefix\n                          )\n                        ),\n                      })\n                    );\n\n              await _runScript(scriptName);\n\n              groupEnd?.();\n\n              if (typeof result[prefix] !== 'undefined') {\n                result[prefix].status = 'passed';\n\n                result[prefix].duration = getExecutionDuration(startTime);\n              }\n            } catch (err: unknown) {\n              assert(util.types.isNativeError(err));\n\n              result[prefix] = {\n                status: 'failure',\n                duration: getExecutionDuration(startTime),\n                error: err,\n                message: err.message,\n                prefix,\n              };\n\n              if (opts.bail !== true) {\n                return;\n              }\n\n              Object.assign(err, {\n                code: 'ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL',\n                prefix,\n              });\n\n              if (opts.reportSummary === true) {\n                await writeRecursiveSummary({\n                  dir: opts.workspaceDir ?? opts.dir,\n                  summary: result,\n                });\n              }\n\n              throw err;\n            }\n          });\n        }\n      )\n    );\n  }\n\n  if (scriptName !== 'test' && !hasCommand && opts.ifPresent !== true) {\n    const allPackagesAreSelected =\n      Object.keys(opts.selectedProjectsGraph ?? {}).length ===\n      opts.allProjects?.length;\n\n    if (allPackagesAreSelected) {\n      throw new PnpmError(\n        'RECURSIVE_RUN_NO_SCRIPT',\n        `None of the packages has a \"${scriptName}\" script`\n      );\n    }\n\n    logger.info({\n      message: `None of the selected packages has a \"${scriptName}\" script`,\n      prefix: opts.workspaceDir,\n    });\n  }\n\n  if (opts.reportSummary === true) {\n    await writeRecursiveSummary({\n      dir: opts.workspaceDir ?? opts.dir,\n      summary: result,\n    });\n  }\n\n  throwOnCommandFail('pnpm recursive run', result);\n}\n\nfunction formatSectionName({\n  script,\n  name,\n  version,\n  prefix,\n}: {\n  script?: string | undefined;\n  name?: string | undefined;\n  version?: string | undefined;\n  prefix: string;\n}): string {\n  return `${name ?? 'unknown'}${typeof version === 'string' ? `@${version}` : ''} ${typeof script === 'string' ? `: ${script}` : ''} ${prefix}`;\n}\n\nexport function getSpecifiedScripts(\n  scripts: PackageScripts,\n  scriptName: string\n): string[] {\n  // if scripts in package.json has script which is equal to scriptName a user passes, return it.\n  if (typeof scripts[scriptName] !== 'undefined') {\n    return [scriptName];\n  }\n\n  const scriptSelector = tryBuildRegExpFromCommand(scriptName);\n\n  // if scriptName which a user passes is RegExp (like /build:.*/), multiple scripts to execute will be selected with RegExp\n  if (scriptSelector) {\n    const scriptKeys = Object.keys(scripts);\n    return scriptKeys.filter((script) => script.match(scriptSelector));\n  }\n\n  return [];\n}\n"],
  "mappings": "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",
  "names": ["scriptName"]
}
