syncpack
syncpack copied to clipboard
`syncpack format` orders dependencies differently than npm does
Description
syncpack format orders dependencies differently than npm does, so package.json can easily become "unformatted" every time you install a new package (npm likes to re-sort things). This is most noticeable if a dependency begins with a number (e.g. 5to6-codemod); syncpack will sort it before any scoped deps (presumably because of this), whereas npm puts scoped deps first (since it uses localeCompare when sorting).
Basic repro:
npm i 5to6-codemod @babel/register- Note that
@babel/registerappears before5to6-codemodin package.json npx syncpack format- Note that
@babel/registernow appears after5to6-codemod npm i @babel/types- Note that
@babel/*again appears before5to6-codemod npx syncpack lintfails linting
While you can mostly work around this by running syncpack format in a pre-commit hook, this isn't always feasible (e.g. if you have automated processes that are updating packages ... in that case those also need to explicitly run syncpack format)
Suggested Solution
syncpack should sort dependencies the same way that npm does (using a localeCompare-based sort, rather than a vanilla sort)
Great spot @jenseng, thanks a lot.
Syncpack is just doing a completely basic .sort() which I wrongly thought would be enough, thanks for pointing this out.
https://github.com/JamieMason/syncpack/blob/db2b31ccdb1a28fdbe0c42d27ce956ea5c6c543a/src/bin-format/format.ts#L120-L126
Released in 12.4.0