This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| lint-staged | ^16.2.3 → ^17.6.0 | ||||
| lint-staged | ^16.2.7 → ^17.6.0 |
Release Notes
lint-staged/lint-staged (lint-staged)
v17.6.0
Minor Changes
#1850
938d3f4- Task functions like{ title, task }can now use a logger functionlog()to emit output while the task runs. By default, the output will only be visible if the task fails, unless the--verboseoption was used. Additionally, when the task rejects, the error will be shown in the output.import { defineConfig } from 'lint-staged/config' export default defineConfig({ '*': { title: 'Fail if PDF files are committed', task: async (filepaths, { log }) => { const pdfFiles = filepaths.filter((f) => f.toLowerCase().endsWith('.pdf')) if (pdfFiles.length > 0) { log('PDF files should not be committed: %s', pdfFiles) throw new Error('Failed') } }, }, })#1854
30562bc- lint-staged now stages changes to all tracked files modified by tasks, including files that weren’t originally staged or didn’t match the configured globs. This can happen when your task has side-effects, or it's a function that ignores the staged files like() => "prettier --write .".If you have unstaged changes in a file and the task also edits that file, your unstaged changes will be staged too. Use
--hide-unstagedto hide your changes while tasks run.
Patch Changes
#1860
4296532- The assignment of staged files to lint-staged configuration files (when using multiple, for example in a monorepo) has been rewritten to be more efficient. As a reminder, each staged file is assigned to exactly one configuration (the closest one), even if that config doesn't match the file in its globs.#1861
c45f28a- Fix running parallel tasks for a single glob, when tasks are created by a function. Nesting one level of arrays inside an array of tasks will result in the inner tasks running in parallel. This behavior should now be consistent when creating tasks using functions. In the following exampleeslintandprettierwill run in parallel (for all files, when any JS files are staged):import { defineConfig } from 'lint-staged/config' export default defineConfig({ '*.js': () => [['eslint --max-warnings=0 .', 'prettier --list-different .']], })#1859
f0ea69d- Various performance improvements from skipping redundant internal Git calls.#1856
69d7d17- Partially staged changes are hidden in a uniquely-named patch file to avoid multiple invocations of lint-staged overwriting it. This makes it safer to run lint-staged in multiple worktrees at the same time.
v17.5.1
Patch Changes
#1852
bfcca94- Fix TypeScript issueTS1254fromdefineConfig()by changing the signature fromconstto afunction:A 'const' initializer in an ambient context must be a string or numeric literal or literal enum reference.
v17.5.0
Minor Changes
- #1847
f9063b7- Lint-staged now refuses to run when files were staged with--intent-to-add, because Git stash doesn't support them. Previously this was an unhandled error.
Patch Changes
#1848
d718ccc- Lint-staged now handles color support better in non-TTY streams, and honors theFORCE_COLORenvironment variable.#1845
7e5ece8- Updatetinyexec@1.3.1so that local binaries fromnode_modules/.binare resolved starting from the directory of each lint-staged configuration file (in monorepo setups). This behavior was broken inlint-staged@16.3.0where they were only resolved from the current working directory and up.#1845
eb8a4e3- Do not try to restore untracked files when using--hide-alland there is no initial commit yet.
v17.4.1
Patch Changes
- #1840
efe5b63- This is a version-bump-only release because the previous version17.4.0was not published to npmjs.com due to problems with GitHub Actions and Changesets.
v17.3.0
Minor Changes
#1825
16b3f74- It is now possible to run multiple tasks in parallel for a single glob by configuring it with an array of tasks (which run sequentially), and then placing another array inside it (where the tasks will run in parallel). The following demonstrates the order tasks will start in:{ "*.ts": ["first", "second", ["third", "third"], "fourth"] }As a concrete example, lint-staged's own configuration is:
/** @type {import('./lib/index.js').Configuration} */ export default { '*': [ ['oxfmt --check --no-error-on-unmatched-pattern', 'oxlint --no-error-on-unmatched-pattern'], ], '*.ts': () => 'tsc', }which means:
- for all staged files, run the two commands in parallel with staged filenames appended, for example:
oxfmt --check --no-error-on-unmatched-pattern lib/index.jsoxlint --no-error-on-unmatched-pattern lib/index.js
- additionally, if any
*.tsfiles are staged, runtscwithout appending any arguments - The two sets of commands also run in parallel
- for all staged files, run the two commands in parallel with staged filenames appended, for example:
Patch Changes
- #1829
15f7e53- During an in-progress merge, files that are unchanged from the branch being merged are now skipped. Technically, files are only included if there are staged changes against bothHEADandMERGE_HEAD.
v17.2.0
Minor Changes
#1823
ee156cc- The chunking of tasks based on maximum command line argument length has been re-implemented to be more precise. Now the chunking happens based on the final generated command string, instead of just the list of staged files like previously. This benefits mainly Windows platforms and function commands like:/** @type {import('lint-staged').Configuration} */ export default { '*.ts': () => 'tsc', // Run "tsc" when any TS file is changed (for entire project) }Where the spawned command is literally
"tsc"without any extra arguments. Previously, this was still chunked when a lot of files were staged. Now, it probably won't be chunked because the length of the command is just three letters.Also, native JavaScript/Node.js function tasks won't be chunked at all, when previously they were run multiple times when chunked:
/** @type {import('lint-staged').Configuration} */ export default { '*.js': { title: 'Log staged JS files to console', task: async (files) => { console.log('Staged JS files:', files) }, }, }
v17.1.1
Patch Changes
- #1820
a626a9f- It's now possible to set--max-arg-length=Infinityto effectively disable chunking of tasks based on the number of staged files. The parsing and validation of the numeric CLI options--max-arg-lengthand--concurrencyhas been improved.
v17.1.0
Minor Changes
#1816
7568d4f- The console output of lint-staged has been simplified so that there's less interactive spinners and more explicit messages like "Started…" -> "Done!". The primary purpose of this was to removeListr2, a very large dependency.Before:
Size of
node_modules/after installing:1561.7 kBwith 29 packages.Fancy interactive spinners, but output dynamically changes:
✔ Backed up original state in git stash (0b191303) ✔ Running tasks for staged files... ✔ Staging changes from tasks... ✔ Cleaning up temporary files...After:
Size of
node_modules/after installing:974.0 kBwith 5 packages (37.6 % smaller, 82.7 % less transitive dependencies).Simpler but more explicit output:
⋯ Backing up original state… ✔ Done backing up original state (35b38ed1)! ⋯ Running tasks for staged files… *.js — 1 file ⋯ oxlint --fix *.{json,md} — 1 file ⋯ oxfmt --write ✔ oxfmt --write ✔ oxlint --fix ✔ Done running tasks for staged files! ⋯ Staging changes from tasks… ✔ Done staging changes from tasks! ⋯ Cleaning up temporary files… ✔ Done cleaning up temporary files!
Patch Changes
#1816
c19079d- Try to restore hidden unstaged changes when using--no-revert.#1818
efb23a2- Console output colors are enabled/disabled more consistently.#1818
26112a1- Failed JS function tasks now properly kill other tasks, unless--continue-on-erroris used. Previously their failure didn't affect other tasks.
v17.0.8
Patch Changes
#1809
179b437- Fix lint-staged discarding the ongoing merge conflict status (.git/MERGE_HEAD) when using the--hide-unstagedor--hide-alloptions.#1811
3d0b2c0- Fix issues with Git commands that are successful but also emit warnings tostderr, by ignoring thestderroutput completely when the process exits with code 0. This was the behavior when usingnano-spawnandexeca, but when switching totinyexecin 16.3.0 bothstdoutandstderrwere used as interleaved output.
v17.0.7
Patch Changes
v17.0.6
Patch Changes
#1803
bdf2770- Run all tests with Deno, in addition to Node.js and Bun.#1796
7508272- Fix performance regression of lint-staged v17 by going back to usinggit addto stage task modifications. This was changed togit update-index --againin v17 for less manual work, but unfortunately theupdate-indexcommand gets slower in very large Git repos.#1797
7b2505a- This version of lint-staged uses the new staged publishing for npm packages feature. Releases are already published from GitHub Actions with trusted publishing, but now an additional approval with two-factor authentication is also required.#1802
321b0a9- Downgrade dependencytinyexec@1.2.2to avoid issues in version 1.2.3.
v17.0.5
Patch Changes
- #1792
1f67271- Correctly set the--max-arg-lengthdefault value based on the running platform. This controls how very long lists of staged files are split into multiple chunks.
v17.0.4
Patch Changes
#1788
f95c1f8- Another fix for making sure lint-staged adds task modifications correctly to the commit in the following cases:- after editing
<file>it is staged withgit add <file>, and then committed withgit commit - after editing
<file>it is committed withgit commit --allwithout explicitgit add - after editing
<file>it is committed withgit commit <pathspec>without explicitgit add
There's new test cases which actually setup the Git
pre_commithook to run lint-staged and verify them. These issues started in v17.0.0 when trying to improve support for committig without having explicitly staged files.- after editing
v17.0.3
Patch Changes
- #1782
06813f9Thanks @iiroj! - Fix lint-staged behavior when implicitly committing files without usinggit addby either:git commit -am "my commit message"where-a(--all) means to automatically stage all tracked modified and deleted filesgit commit -m "my commit message" .where.is an example of a pathspec where matching files will be staged
v17.0.2
Patch Changes
v17.0.1
Patch Changes
- #1776
4a5664bThanks @iiroj! - Adjust GitHub Actions workflow so that automatic publishing works with signed commits.
v17.0.0
Major Changes
#1745
e244adfThanks @iiroj! - Node.js v20 is no longer supported, and the oldest supported version is now22.22.1, which is an active LTS version at the time of this release. Node.js 20 will be EOL after April 2026. Please upgrade your Node.js version!#1676
0584e0bThanks @outslept! - Lint-staged now tries to verify the installed Git version is at least2.32.0, released in 2021. If you're using an even older Git version, you need to upgrade it before running lint-staged!#1745
2dcc40aThanks @iiroj! - The dependencyyamlis now marked as optional and probably won't be installed by default. If you're using a YAML configuration file you should install the package separately:npm install --development yamlIf you're using
.lintstagedrcas the config file name (without a file extension), it will be treated as a YAML file. If the content is JSON, consider renaming it to.lintstagedrc.jsonto avoid needing to installyaml.
Minor Changes
#1748
809d5efThanks @iiroj! - Add new option--hide-allfor hiding all unstaged changes and untracked files, before running tasks. This makes it easier to run tools like Knip which check for unused code. Untracked files are included in the backup stash and restored automatically after running.#1759
f13045aThanks @iiroj! - Update dependencies, includingtinyexec@1.1.1to fix the following issues:- When using a Node.js version manager with multiple versions installed (nvm, n, for example), scripts with the
#!/usr/bin/env nodeshebang (Prettier, ESLint, for example) were previously spawned using the default Node.js version configured by the version manager (the onewhich nodepoints to) on POSIX systems. Now, they will be spawned with the same version that lint-staged itself was started with.- For example, if your default Node.js version is 24.14.1 but lint-staged is run with the latest version 25.9.0, the tasks spawned by lint-staged will now also use version 25.9.0. Previously they were spawned using 24.14.1.
- When installing Node.js from the Ubuntu App Center (Snap store), the
nodeexecutable available inPATHis a symlink pointing to Snap itself. The sandboxing features of Snap prevented lint-staged from spawning scripts with the#!/usr/bin/env nodeshebang, because it meant lint-staged tried to spawn Snap via the symlink. This resulted in anENOENTerror when trying to runprettier, for example. Now, since the realnodeexecutable's directory is available in thePATH, lint-staged will instead spawn the script with the realnodebinary succesfully.
- When using a Node.js version manager with multiple versions installed (nvm, n, for example), scripts with the
#1761
d3251b1Thanks @iiroj! - Lint-staged now runsgit update-index --againafter running tasks, instead ofgit add <originally staged files>. This should improve compatibility when using non-default indexes, for example when committing with a pathspecgit commit -m "message" .instead of adding files to the index.#1745
a9585acThanks @iiroj! - Removecommanderas a dependency and use the built-inparseArgsfromnode:utilto parse CLI flags.
Patch Changes
#1755
c82d30bThanks @iiroj! - All tests now pass on the Bun runtime (latest).#1750
a401818Thanks @iiroj! - Remove manual handling forgit stash --keep-indexresurrecting deleted files, because the issue was fixed in Git2.23.0and lint-staged requires at least Git2.32.0.#1771
c4b8936Thanks @iiroj! - Fix documentation about multiple config files and the--cwdoption. When using it, all tasks will be run in the specified directory. For example, to run everything in the actualprocess.cwd(), uselint-staged --cwd=".".
v16.4.0
Minor Changes
- #1739
687fc90Thanks @hyperz111! - Replacemicromatchwithpicomatchto reduce dependencies.
v16.3.4
Patch Changes
- #1742
9d6e827Thanks @iiroj! - Update dependencies, includingtinyexec@1.0.4to make sure localnode_modules/.binare preferred to global locations (released intinyexec@1.0.3).
v16.3.3
Patch Changes
- #1740
0109e8dThanks @iiroj! - Make sure Git's warning about CRLF line-endings doesn't interfere with creating initial backup stash.
v16.3.2
Patch Changes
- #1735
2adaf6cThanks @iiroj! - Hide the extracmdwindow on Windows by spawning tasks without thedetachedoption.
v16.3.1
Patch Changes
- #1729
cd5d762Thanks @iiroj! - Removenano-spawnas a dependency frompackage.jsonas it was replaced withtinyexecand is no longer used.
v16.3.0
Minor Changes
#1698
feda37aThanks @iiroj! - Run external processes withtinyexecinstead ofnano-spawn.nano-spawnreplacedexecain lint-staged version 16 to limit the amount of npm dependencies required, but caused some unknown issues related to spawning tasks. Let's hopetinyexecimproves the situation.#1699
1346d16Thanks @iiroj! - Removepidtreeas a dependency. When a task fails, its sub-processes are killed more efficiently via the process group on Unix systems, and thetaskkillcommand on Windows.
Patch Changes
- #1726
87467aaThanks @iiroj! - Incorrect brace expansions like*.{js}(nothing to expand) are detected exhaustively, instead of just a single pass.
v16.2.7
Patch Changes
- #1711
ef74c8dThanks @iiroj! - Do not display a "failed to spawn" error message when a task fails normally. This message is reserved for when the task didn't run because spawning it failed.
v16.2.6
Patch Changes
- #1693
33d4502Thanks @Adrian-Baran-GY! - Fix problems with--continue-on-erroroption, where tasks might have still been killed (SIGINT) when one of them failed.
v16.2.5
Patch Changes
- #1687
9e02d9dThanks @iiroj! - Fix unhandled promise rejection when spawning tasks (instead of the tasks themselves failing). Previously when a task failed to spawn, lint-staged also failed and the backup stash might not have been automatically restored.
v16.2.4
Patch Changes
Configuration
📅 Schedule: (UTC)
- Branch creation
- At any time (no schedule defined)
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.