{
  "version": 3,
  "sources": ["../../../../src/packages/lockfile.fs/write.ts"],
  "sourcesContent": ["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type {\n  LockfileObject,\n  LockfileFile,\n  ProjectSnapshot,\n} from '../lockfile.types/index.ts';\nimport { WANTED_LOCKFILE } from '../constants/index.ts';\nimport rimraf from '@zkochan/rimraf';\nimport yaml from 'js-yaml';\nimport isEmpty from 'ramda/src/isEmpty';\nimport writeFileAtomicCB from 'write-file-atomic';\nimport { lockfileLogger as logger } from './logger.ts';\nimport { sortLockfileKeys } from './sortLockfileKeys.ts';\nimport { getWantedLockfileName } from './lockfileName.ts';\nimport { convertToLockfileFile } from './lockfileFormatConverters.ts';\n\nasync function writeFileAtomic(filename: string, data: string): Promise<void> {\n  return new Promise<void>((resolve, reject) => {\n    writeFileAtomicCB(filename, data, {}, (err?: Error): void => {\n      // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n      err != null ? reject(err) : resolve();\n    });\n  });\n}\n\nconst LOCKFILE_YAML_FORMAT = {\n  blankLines: true,\n  lineWidth: -1, // This is setting line width to never wrap\n  noCompatMode: true,\n  noRefs: true,\n  sortKeys: false,\n};\n\nexport async function writeWantedLockfile(\n  pkgPath: string,\n  wantedLockfile: LockfileObject,\n  opts?:\n    | {\n        useGitBranchLockfile?: boolean | undefined;\n        mergeGitBranchLockfiles?: boolean | undefined;\n      }\n    | undefined\n): Promise<void> {\n  const wantedLockfileName: string = await getWantedLockfileName(opts);\n\n  return writeLockfile(wantedLockfileName, pkgPath, wantedLockfile);\n}\n\nexport async function writeCurrentLockfile(\n  virtualStoreDir: string,\n  currentLockfile: LockfileObject\n): Promise<void> {\n  // empty lockfile is not saved\n  if (isEmptyLockfile(currentLockfile)) {\n    await rimraf(path.join(virtualStoreDir, 'lock.yaml'));\n\n    return;\n  }\n\n  await fs.mkdir(virtualStoreDir, { recursive: true });\n\n  return writeLockfile('lock.yaml', virtualStoreDir, currentLockfile);\n}\n\nasync function writeLockfile(\n  lockfileFilename: string,\n  pkgPath: string,\n  wantedLockfile: LockfileObject\n): Promise<void> {\n  const lockfilePath = path.join(pkgPath, lockfileFilename);\n\n  const lockfileToStringify = convertToLockfileFile(wantedLockfile);\n\n  return writeLockfileFile(lockfilePath, lockfileToStringify);\n}\n\nexport function writeLockfileFile(\n  lockfilePath: string,\n  wantedLockfile: LockfileFile\n): Promise<void> {\n  const yamlDoc = yamlStringify(wantedLockfile);\n\n  return writeFileAtomic(lockfilePath, yamlDoc);\n}\n\nfunction yamlStringify(lockfile: LockfileFile): string {\n  const sortedLockfile = sortLockfileKeys(lockfile as LockfileFile);\n\n  return yaml.dump(sortedLockfile, LOCKFILE_YAML_FORMAT);\n}\n\nexport function isEmptyLockfile(lockfile: LockfileObject): boolean {\n  return Object.values(lockfile.importers ?? {}).every(\n    (importer: ProjectSnapshot): boolean => {\n      return (\n        isEmpty.default(importer.specifiers) &&\n        isEmpty.default(importer.dependencies ?? {})\n      );\n    }\n  );\n}\n\nexport async function writeLockfiles(opts: {\n  wantedLockfile: LockfileObject;\n  wantedLockfileDir: string;\n  currentLockfile: LockfileObject;\n  currentLockfileDir: string;\n  useGitBranchLockfile?: boolean | undefined;\n  mergeGitBranchLockfiles?: boolean | undefined;\n}): Promise<void> {\n  const wantedLockfileName: string = await getWantedLockfileName(opts);\n\n  const wantedLockfilePath = path.join(\n    opts.wantedLockfileDir,\n    wantedLockfileName\n  );\n\n  const currentLockfilePath = path.join(opts.currentLockfileDir, 'lock.yaml');\n\n  const wantedLockfileToStringify = convertToLockfileFile(opts.wantedLockfile);\n\n  const yamlDoc = yamlStringify(wantedLockfileToStringify);\n\n  // in most cases the `pnpm-lock.yaml` and `node_modules/.pnpm-lock.yaml` are equal\n  // in those cases the YAML document can be stringified only once for both files\n  // which is more efficient\n  if (opts.wantedLockfile === opts.currentLockfile) {\n    await Promise.all([\n      writeFileAtomic(wantedLockfilePath, yamlDoc),\n      (async (): Promise<void> => {\n        if (isEmptyLockfile(opts.wantedLockfile)) {\n          await rimraf(currentLockfilePath);\n        } else {\n          await fs.mkdir(path.dirname(currentLockfilePath), {\n            recursive: true,\n          });\n\n          await writeFileAtomic(currentLockfilePath, yamlDoc);\n        }\n      })(),\n    ]);\n\n    return;\n  }\n\n  logger.debug({\n    message: `\\`${WANTED_LOCKFILE}\\` differs from \\`${path.relative(opts.wantedLockfileDir, currentLockfilePath)}\\``,\n    prefix: opts.wantedLockfileDir,\n  });\n\n  const currentLockfileToStringify = convertToLockfileFile(\n    opts.currentLockfile\n  );\n\n  const currentYamlDoc = yamlStringify(currentLockfileToStringify);\n\n  await Promise.all([\n    writeFileAtomic(wantedLockfilePath, yamlDoc),\n    (async (): Promise<void> => {\n      if (isEmptyLockfile(opts.wantedLockfile)) {\n        await rimraf(currentLockfilePath);\n      } else {\n        await fs.mkdir(path.dirname(currentLockfilePath), { recursive: true });\n\n        await writeFileAtomic(currentLockfilePath, currentYamlDoc);\n      }\n    })(),\n  ]);\n}\n"],
  "mappings": "AAAA,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AAMjB,SAAS,uBAAuB;AAChC,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,OAAO,uBAAuB;AAC9B,SAAS,kBAAkB,cAAc;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,6BAA6B;AAEtC,eAAe,gBAAgB,UAAkB,MAA6B;AAC5E,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,sBAAkB,UAAU,MAAM,CAAC,GAAG,CAAC,QAAsB;AAE3D,aAAO,OAAO,OAAO,GAAG,IAAI,QAAQ;AAAA,IACtC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,MAAM,uBAAuB;AAAA,EAC3B,YAAY;AAAA,EACZ,WAAW;AAAA;AAAA,EACX,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,eAAsB,oBACpB,SACA,gBACA,MAMe;AACf,QAAM,qBAA6B,MAAM,sBAAsB,IAAI;AAEnE,SAAO,cAAc,oBAAoB,SAAS,cAAc;AAClE;AAEA,eAAsB,qBACpB,iBACA,iBACe;AAEf,MAAI,gBAAgB,eAAe,GAAG;AACpC,UAAM,OAAO,KAAK,KAAK,iBAAiB,WAAW,CAAC;AAEpD;AAAA,EACF;AAEA,QAAM,GAAG,MAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAEnD,SAAO,cAAc,aAAa,iBAAiB,eAAe;AACpE;AAEA,eAAe,cACb,kBACA,SACA,gBACe;AACf,QAAM,eAAe,KAAK,KAAK,SAAS,gBAAgB;AAExD,QAAM,sBAAsB,sBAAsB,cAAc;AAEhE,SAAO,kBAAkB,cAAc,mBAAmB;AAC5D;AAEO,SAAS,kBACd,cACA,gBACe;AACf,QAAM,UAAU,cAAc,cAAc;AAE5C,SAAO,gBAAgB,cAAc,OAAO;AAC9C;AAEA,SAAS,cAAc,UAAgC;AACrD,QAAM,iBAAiB,iBAAiB,QAAwB;AAEhE,SAAO,KAAK,KAAK,gBAAgB,oBAAoB;AACvD;AAEO,SAAS,gBAAgB,UAAmC;AACjE,SAAO,OAAO,OAAO,SAAS,aAAa,CAAC,CAAC,EAAE;AAAA,IAC7C,CAAC,aAAuC;AACtC,aACE,QAAQ,QAAQ,SAAS,UAAU,KACnC,QAAQ,QAAQ,SAAS,gBAAgB,CAAC,CAAC;AAAA,IAE/C;AAAA,EACF;AACF;AAEA,eAAsB,eAAe,MAOnB;AAChB,QAAM,qBAA6B,MAAM,sBAAsB,IAAI;AAEnE,QAAM,qBAAqB,KAAK;AAAA,IAC9B,KAAK;AAAA,IACL;AAAA,EACF;AAEA,QAAM,sBAAsB,KAAK,KAAK,KAAK,oBAAoB,WAAW;AAE1E,QAAM,4BAA4B,sBAAsB,KAAK,cAAc;AAE3E,QAAM,UAAU,cAAc,yBAAyB;AAKvD,MAAI,KAAK,mBAAmB,KAAK,iBAAiB;AAChD,UAAM,QAAQ,IAAI;AAAA,MAChB,gBAAgB,oBAAoB,OAAO;AAAA,OAC1C,YAA2B;AAC1B,YAAI,gBAAgB,KAAK,cAAc,GAAG;AACxC,gBAAM,OAAO,mBAAmB;AAAA,QAClC,OAAO;AACL,gBAAM,GAAG,MAAM,KAAK,QAAQ,mBAAmB,GAAG;AAAA,YAChD,WAAW;AAAA,UACb,CAAC;AAED,gBAAM,gBAAgB,qBAAqB,OAAO;AAAA,QACpD;AAAA,MACF,GAAG;AAAA,IACL,CAAC;AAED;AAAA,EACF;AAEA,SAAO,MAAM;AAAA,IACX,SAAS,KAAK,eAAe,qBAAqB,KAAK,SAAS,KAAK,mBAAmB,mBAAmB,CAAC;AAAA,IAC5G,QAAQ,KAAK;AAAA,EACf,CAAC;AAED,QAAM,6BAA6B;AAAA,IACjC,KAAK;AAAA,EACP;AAEA,QAAM,iBAAiB,cAAc,0BAA0B;AAE/D,QAAM,QAAQ,IAAI;AAAA,IAChB,gBAAgB,oBAAoB,OAAO;AAAA,KAC1C,YAA2B;AAC1B,UAAI,gBAAgB,KAAK,cAAc,GAAG;AACxC,cAAM,OAAO,mBAAmB;AAAA,MAClC,OAAO;AACL,cAAM,GAAG,MAAM,KAAK,QAAQ,mBAAmB,GAAG,EAAE,WAAW,KAAK,CAAC;AAErE,cAAM,gBAAgB,qBAAqB,cAAc;AAAA,MAC3D;AAAA,IACF,GAAG;AAAA,EACL,CAAC;AACH;",
  "names": []
}
