Files
pnpm/lockfile/fs
Dipan Chakraborty 6e93f350a9 fix(lockfile): support CRLF line endings in env lockfiles (#11654)
* fix(lockfile): support CRLF line endings in env lockfiles

Normalize CRLF line endings before parsing YAML document
separators in streamed env lockfile reads.

Previously the parser assumed LF-only separators (`\n---\n`),
which caused pnpm to report ERR_PNPM_BROKEN_LOCKFILE or outdated
lockfile errors when configDependencies lockfiles were checked
out with CRLF line endings on Windows.

Fixes #11612

* test(lockfile): cover CRLF normalization and clean up yamlDocuments

Add CRLF-handling tests for streamReadFirstYamlDocument (CRLF and
BOM+CRLF) and extractMainDocument (CRLF in combined file and CRLF
in content without separator). Hoist the duplicated CRLF replace
in Phase 1 out of the if/else, drop two stray semicolons and a
couple of blank lines.

* chore: include pnpm in changeset

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
2026-05-15 08:15:42 +00:00
..
2026-05-14 13:31:53 +02:00
2026-05-14 13:31:53 +02:00

@pnpm/lockfile.fs

Read/write pnpm-lock.yaml files

Reads and writes the wanted (pnpm-lock.yaml) and current (node_modules/.pnpm-lock.yaml) lockfile files of pnpm. Lockfile files are the state files of the node_modules installed via pnpm. They are like the package-lock.json of npm or the yarn.lock of Yarn.

Install

pnpm add @pnpm/lockfile.fs

API

readWantedLockfile(pkgPath, opts) => Promise<Lockfile>

Reads the pnpm-lock.yaml file from the root of the package.

Arguments

  • pkgPath - Path - the path to the project
  • opts.ignoreIncompatible - Boolean - false by default. If true, throws an error if the lockfile file format is not compatible with the current library.

readCurrentLockfile(virtualStoreDir, opts) => Promise<Lockfile>

Reads the lockfile file from <virtualStoreDir>/lock.yaml.

existsNonEmptyWantedLockfile(pkgPath) => Promise<Boolean>

Returns true if a pnpm-lock.yaml exists in the root of the package.

writeLockfiles(opts) => Promise<void>

Writes the wanted/current lockfile files. When they are empty, removes them.

Arguments

  • opts.wantedLockfile
  • opts.wantedLockfileDir
  • opts.currentLockfile
  • opts.currentLockfileDir
  • [opts.forceSharedFormat]

writeWantedLockfile(pkgPath, wantedLockfile) => Promise<void>

Writes the wanted lockfile file only. Sometimes it is needed just to update the wanted lockfile without touching node_modules.

writeCurrentLockfile(virtualStoreDir, currentLockfile) => Promise<void>

Writes the current lockfile file only.

License

MIT