{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-publishing/recursivePublish.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport { createResolver } from '../client/index.ts';\nimport type { Config } from '../config/index.ts';\nimport { logger } from '../logger/index.ts';\nimport { pickRegistryForPackage } from '../pick-registry-for-package/index.ts';\nimport type { ResolveFunction } from '../resolver-base/index.ts';\nimport { sortPackages } from '../sort-packages/index.ts';\nimport type {\n  Registries,\n  ProjectRootDir,\n  Project,\n  WorkspaceDir,\n  LockFileDir,\n} from '../types/index.ts';\nimport pFilter from 'p-filter';\nimport pick from 'ramda/src/pick';\nimport { writeJsonFile } from 'write-json-file';\nimport { publish } from './publish.ts';\n\nexport type PublishRecursiveOpts = Required<\n  Pick<\n    Config,\n    | 'bin'\n    | 'cacheDir'\n    | 'cliOptions'\n    | 'dir'\n    | 'pnpmHomeDir'\n    | 'rawConfig'\n    | 'registries'\n    | 'workspaceDir'\n  >\n> &\n  Partial<\n    Pick<\n      Config,\n      | 'tag'\n      | 'ca'\n      | 'catalogs'\n      | 'cert'\n      | 'fetchTimeout'\n      | 'force'\n      | 'dryRun'\n      | 'extraBinPaths'\n      | 'extraEnv'\n      | 'fetchRetries'\n      | 'fetchRetryFactor'\n      | 'fetchRetryMaxtimeout'\n      | 'fetchRetryMintimeout'\n      | 'key'\n      | 'httpProxy'\n      | 'httpsProxy'\n      | 'localAddress'\n      | 'lockfileDir'\n      | 'noProxy'\n      | 'npmPath'\n      | 'offline'\n      | 'selectedProjectsGraph'\n      | 'strictSsl'\n      | 'sslConfigs'\n      | 'unsafePerm'\n      | 'userAgent'\n      | 'userConfig'\n      | 'verifyStoreIntegrity'\n    >\n  > & {\n    access?: 'public' | 'restricted';\n    argv: {\n      original: string[];\n    };\n    reportSummary?: boolean;\n  };\n\nexport async function recursivePublish(\n  opts: PublishRecursiveOpts & Required<Pick<Config, 'selectedProjectsGraph'>>\n): Promise<{ exitCode: number }> {\n  const pkgs = Object.values(opts.selectedProjectsGraph ?? {}).map(\n    (wsPkg: {\n      dependencies: ProjectRootDir[];\n      package: Project;\n    }): Project => {\n      return wsPkg.package;\n    }\n  );\n\n  const { resolve } = createResolver({\n    ...opts,\n    authConfig: opts.rawConfig,\n    userConfig: opts.userConfig,\n    retry: {\n      factor: opts.fetchRetryFactor ?? 0,\n      maxTimeout: opts.fetchRetryMaxtimeout ?? 60_000,\n      minTimeout: opts.fetchRetryMintimeout ?? 10_000,\n      retries: opts.fetchRetries ?? 3,\n    },\n    timeout: opts.fetchTimeout,\n  });\n\n  const pkgsToPublish = await pFilter(pkgs, async (pkg) => {\n    if (\n      !pkg.manifest.name ||\n      !pkg.manifest.version ||\n      pkg.manifest.private === true\n    ) {\n      return false;\n    }\n\n    if (opts.force === true) {\n      return true;\n    }\n\n    return !(await isAlreadyPublished(\n      {\n        dir: pkg.rootDir,\n        lockfileDir:\n          opts.lockfileDir ?? (pkg.rootDir as unknown as LockFileDir),\n        registries: opts.registries,\n        resolve,\n      },\n      pkg.manifest.name,\n      pkg.manifest.version\n    ));\n  });\n\n  const publishedPkgDirs = new Set<ProjectRootDir>(\n    pkgsToPublish.map(({ rootDir }: Project): ProjectRootDir => {\n      return rootDir;\n    })\n  );\n\n  const publishedPackages: Array<{ name?: string; version?: string }> = [];\n\n  if (publishedPkgDirs.size === 0) {\n    logger.info({\n      message: 'There are no new packages that should be published',\n      prefix: opts.dir,\n    });\n  } else {\n    const appendedArgs: string[] = [];\n\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (opts.cliOptions.access) {\n      appendedArgs.push(`--access=${opts.cliOptions.access as string}`);\n    }\n\n    if (opts.dryRun === true) {\n      appendedArgs.push('--dry-run');\n    }\n\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (opts.cliOptions.otp) {\n      appendedArgs.push(`--otp=${opts.cliOptions.otp as string}`);\n    }\n\n    const chunks = sortPackages(opts.selectedProjectsGraph ?? {});\n\n    const tag = opts.tag ?? 'latest';\n\n    for (const chunk of chunks) {\n      // NOTE: It should be possible to publish these packages concurrently.\n      // However, looks like that requires too much resources for some CI envs.\n      // See related issue: https://github.com/pnpm/pnpm/issues/6968\n      for (const pkgDir of chunk) {\n        if (!publishedPkgDirs.has(pkgDir)) {\n          continue;\n        }\n\n        const pkg = opts.selectedProjectsGraph?.[pkgDir]?.package;\n\n        if (typeof pkg === 'undefined') {\n          continue;\n        }\n\n        const registry =\n          pkg.manifest.publishConfig?.registry ??\n          pickRegistryForPackage(opts.registries, pkg.manifest.name);\n\n        const publishResult = await publish(\n          {\n            ...opts,\n            storeDir: '',\n            workspaceDir: opts.workspaceDir ?? (opts.dir as WorkspaceDir),\n            dir: pkg.rootDir,\n            argv: {\n              original: [\n                'publish',\n                '--tag',\n                tag,\n                '--registry',\n                registry,\n                ...appendedArgs,\n              ],\n            },\n            gitChecks: false,\n            recursive: false,\n          },\n          [pkg.rootDir]\n        );\n\n        if (publishResult.manifest != null) {\n          publishedPackages.push(\n            pick.default(['name', 'version'], publishResult.manifest)\n          );\n        } else if (typeof publishResult.exitCode === 'number') {\n          return { exitCode: publishResult.exitCode };\n        }\n      }\n    }\n  }\n\n  if (opts.reportSummary === true) {\n    await writeJsonFile(\n      path.join(opts.lockfileDir ?? opts.dir, 'pnpm-publish-summary.json'),\n      { publishedPackages }\n    );\n  }\n\n  return { exitCode: 0 };\n}\n\nasync function isAlreadyPublished(\n  opts: {\n    dir: string;\n    lockfileDir: LockFileDir;\n    registries: Registries;\n    resolve: ResolveFunction;\n  },\n  pkgName: string,\n  pkgVersion: string\n): Promise<boolean> {\n  try {\n    await opts.resolve(\n      { alias: pkgName, pref: pkgVersion },\n      {\n        lockfileDir: opts.lockfileDir,\n        preferredVersions: {},\n        projectDir: opts.dir,\n        registry: pickRegistryForPackage(opts.registries, pkgName, pkgVersion),\n      }\n    );\n    return true;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars\n  } catch (_err: any) {\n    return false;\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
