{
  "version": 3,
  "sources": ["../../../../src/packages/lockfile.fs/read.ts"],
  "sourcesContent": ["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport util from 'node:util';\nimport { LOCKFILE_VERSION, WANTED_LOCKFILE } from '../constants/index.ts';\nimport { PnpmError } from '../error/index.ts';\nimport { mergeLockfileChanges } from '../lockfile.merger/index.ts';\nimport type { LockfileObject } from '../lockfile.types/index.ts';\nimport type { ProjectId } from '../types/index.ts';\nimport comverToSemver from 'comver-to-semver';\nimport yaml from 'js-yaml';\nimport semver from 'semver';\nimport stripBom from 'strip-bom';\nimport { LockfileBreakingChangeError } from './errors/index.ts';\nimport { autofixMergeConflicts, isDiff } from './gitMergeFile.ts';\nimport { lockfileLogger as logger } from './logger.ts';\nimport { getWantedLockfileName } from './lockfileName.ts';\nimport { getGitBranchLockfileNames } from './gitBranchLockfile.ts';\nimport { convertToLockfileObject } from './lockfileFormatConverters.ts';\n\nexport async function readCurrentLockfile(\n  virtualStoreDir: string,\n  opts: {\n    wantedVersions?: string[];\n    ignoreIncompatible: boolean;\n  }\n): Promise<LockfileObject | null> {\n  const lockfilePath = path.join(virtualStoreDir, 'lock.yaml');\n\n  return (await _read(lockfilePath, virtualStoreDir, opts)).lockfile;\n}\n\nexport async function readWantedLockfileAndAutofixConflicts(\n  pkgPath: string | undefined,\n  opts: {\n    wantedVersions?: string[] | undefined;\n    ignoreIncompatible: boolean;\n    useGitBranchLockfile?: boolean | undefined;\n    mergeGitBranchLockfiles?: boolean | undefined;\n  }\n): Promise<{\n  lockfile: LockfileObject | null;\n  hadConflicts: boolean;\n}> {\n  return _readWantedLockfile(pkgPath, {\n    ...opts,\n    autofixMergeConflicts: true,\n  });\n}\n\nexport async function readWantedLockfile(\n  pkgPath: string | undefined,\n  opts: {\n    wantedVersions?: string[] | undefined;\n    ignoreIncompatible: boolean;\n    useGitBranchLockfile?: boolean | undefined;\n    mergeGitBranchLockfiles?: boolean | undefined;\n  }\n): Promise<LockfileObject | null> {\n  return (await _readWantedLockfile(pkgPath ?? '', opts)).lockfile;\n}\n\nasync function _read(\n  lockfilePath: string,\n  prefix: string, // only for logging\n  opts: {\n    autofixMergeConflicts?: boolean | undefined;\n    wantedVersions?: string[] | undefined;\n    ignoreIncompatible: boolean;\n  }\n): Promise<{\n  lockfile: LockfileObject | null;\n  hadConflicts: boolean;\n}> {\n  let lockfileRawContent: string | undefined;\n\n  try {\n    lockfileRawContent = stripBom(await fs.readFile(lockfilePath, 'utf8'));\n  } catch (err: unknown) {\n    if (\n      !(util.types.isNativeError(err) && 'code' in err && err.code === 'ENOENT')\n    ) {\n      throw err;\n    }\n\n    return {\n      lockfile: null,\n      hadConflicts: false,\n    };\n  }\n\n  let lockfile: LockfileObject | undefined;\n\n  let hadConflicts: boolean;\n\n  try {\n    lockfile = convertToLockfileObject(yaml.load(lockfileRawContent) as any); // eslint-disable-line\n\n    hadConflicts = false;\n  } catch (err: unknown) {\n    if (opts.autofixMergeConflicts !== true || !isDiff(lockfileRawContent)) {\n      throw new PnpmError(\n        'BROKEN_LOCKFILE',\n        `The lockfile at \"${lockfilePath}\" is broken: ${(err as Error).message}`\n      );\n    }\n\n    hadConflicts = true;\n\n    lockfile = autofixMergeConflicts(lockfileRawContent);\n\n    logger.info({\n      message: `Merge conflict detected in ${WANTED_LOCKFILE} and successfully merged`,\n      prefix,\n    });\n  }\n\n  if (typeof lockfile !== 'undefined') {\n    const lockfileSemver = comverToSemver(\n      (lockfile.lockfileVersion || 0).toString()\n    );\n\n    if (\n      !opts.wantedVersions ||\n      opts.wantedVersions.length === 0 ||\n      opts.wantedVersions.some((wantedVersion) => {\n        if (\n          semver.major(lockfileSemver) !==\n          semver.major(comverToSemver(wantedVersion))\n        ) {\n          return false;\n        }\n\n        if (\n          lockfile.lockfileVersion !== '6.1' &&\n          semver.gt(lockfileSemver, comverToSemver(wantedVersion))\n        ) {\n          logger.warn({\n            message:\n              `Your ${WANTED_LOCKFILE} was generated by a newer version of pnpm. ` +\n              `It is a compatible version but it might get downgraded to version ${wantedVersion}`,\n            prefix,\n          });\n        }\n\n        return true;\n      })\n    ) {\n      return { lockfile, hadConflicts };\n    }\n  }\n\n  if (opts.ignoreIncompatible) {\n    logger.warn({\n      message: `Ignoring not compatible lockfile at ${lockfilePath}`,\n      prefix,\n    });\n\n    return { lockfile: null, hadConflicts: false };\n  }\n\n  throw new LockfileBreakingChangeError(lockfilePath);\n}\n\nexport function createLockfileObject(\n  importerIds: ProjectId[],\n  opts: {\n    lockfileVersion: string;\n    autoInstallPeers?: boolean | undefined;\n    excludeLinksFromLockfile?: boolean | undefined;\n    peersSuffixMaxLength?: number | undefined;\n  }\n): LockfileObject {\n  const importers: LockfileObject['importers'] = {};\n\n  for (const importerId of importerIds) {\n    importers[importerId] = {\n      dependencies: {},\n      specifiers: {},\n    };\n  }\n\n  return {\n    importers,\n    lockfileVersion: opts.lockfileVersion || LOCKFILE_VERSION,\n    settings: {\n      autoInstallPeers: opts.autoInstallPeers,\n      excludeLinksFromLockfile: opts.excludeLinksFromLockfile,\n      peersSuffixMaxLength: opts.peersSuffixMaxLength,\n    },\n  };\n}\n\nasync function _readWantedLockfile(\n  pkgPath: string | undefined,\n  opts: {\n    wantedVersions?: string[] | undefined;\n    ignoreIncompatible: boolean;\n    useGitBranchLockfile?: boolean | undefined;\n    mergeGitBranchLockfiles?: boolean | undefined;\n    autofixMergeConflicts?: boolean | undefined;\n  }\n): Promise<{\n  lockfile: LockfileObject | null;\n  hadConflicts: boolean;\n}> {\n  const lockfileNames: string[] = [WANTED_LOCKFILE];\n\n  if (opts.useGitBranchLockfile === true) {\n    const gitBranchLockfileName: string = await getWantedLockfileName(opts);\n\n    if (gitBranchLockfileName !== WANTED_LOCKFILE) {\n      lockfileNames.unshift(gitBranchLockfileName);\n    }\n  }\n\n  let result: { lockfile: LockfileObject | null; hadConflicts: boolean } = {\n    lockfile: null,\n    hadConflicts: false,\n  };\n\n  for (const lockfileName of lockfileNames) {\n    result = await _read(\n      path.join(pkgPath ?? '', lockfileName),\n      pkgPath ?? '',\n      {\n        ...opts,\n        autofixMergeConflicts: true,\n      }\n    );\n\n    if (result.lockfile) {\n      if (opts.mergeGitBranchLockfiles === true) {\n        result.lockfile = await _mergeGitBranchLockfiles(\n          result.lockfile,\n          pkgPath ?? '',\n          pkgPath ?? '',\n          opts\n        );\n      }\n\n      break;\n    }\n  }\n\n  return result;\n}\n\nasync function _mergeGitBranchLockfiles(\n  lockfile: LockfileObject | null,\n  lockfileDir: string,\n  prefix: string,\n  opts: {\n    autofixMergeConflicts?: boolean | undefined;\n    wantedVersions?: string[] | undefined;\n    ignoreIncompatible: boolean;\n  }\n): Promise<LockfileObject | null> {\n  if (lockfile === null) {\n    return lockfile;\n  }\n\n  const gitBranchLockfiles: Array<LockfileObject | null> = (\n    await _readGitBranchLockfiles(lockfileDir, prefix, opts)\n  ).map(({ lockfile }) => lockfile);\n\n  let mergedLockfile: LockfileObject = lockfile;\n\n  for (const gitBranchLockfile of gitBranchLockfiles) {\n    if (!gitBranchLockfile) {\n      continue;\n    }\n    mergedLockfile = mergeLockfileChanges(mergedLockfile, gitBranchLockfile);\n  }\n\n  return mergedLockfile;\n}\n\nasync function _readGitBranchLockfiles(\n  lockfileDir: string,\n  prefix: string,\n  opts: {\n    autofixMergeConflicts?: boolean | undefined;\n    wantedVersions?: string[] | undefined;\n    ignoreIncompatible: boolean;\n  }\n): Promise<\n  Array<{\n    lockfile: LockfileObject | null;\n    hadConflicts: boolean;\n  }>\n> {\n  const files = await getGitBranchLockfileNames(lockfileDir);\n\n  return Promise.all(\n    files.map((file) => _read(path.join(lockfileDir, file), prefix, opts))\n  );\n}\n"],
  "mappings": "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",
  "names": ["lockfile"]
}
