Tiny tool to run commands for modified, staged, and committed git files.
It help speeding up the run tests, linters, scripts, and more
- 📦 Small: 41kB (160x+ lighter than lint-staged).
- 🥇 Single dependency (
picocolors
). - ☯️ Support multiple file states like staged, unstaged, last-commit, changed etc
Benchmarks running time for 10 file:
$ node bench/running-time/index.js
- lint-staged 1.357 ms
+ nano-staged 0.928 ms
The space in node_modules including sub-dependencies:
$ node bench/size/index.js
Data from packagephobia.com
- lint-staged 6615 kB
+ nano-staged 41 kB
The performance results were generated on a MBP Late 2013, 2,3 GHz Intel Core i7 by running npm run bench
in the library folder. See bench/running-time/index.js
-
First, install
nano-staged
:npm install --save-dev nano-staged
-
Add the
nano-staged
section and the commands to yourpackage.json
:For example:
"nano-staged": { "*.js": "prettier --write", "*.css": ["stylelint", "eslint --fix"] },
-
Now, run commands with Nano Staged:
./node_modules/.bin/nano-staged
Nano Staged by default to run commands from the config for staged files.
You can use Nano Staged with a pre-commit tools to run it automatically after every commit.
Simple Git Hooks
-
Install
simple-git-hooks
as a dev dependency:npm install simple-git-hooks --save-dev
-
Add the
simple-git-hooks
section to yourpackage.json
and fill in thepre-commit
:For example:
"simple-git-hooks": { "pre-commit": "./node_modules/.bin/nano-staged" }
-
Run the CLI script to update the git hooks with the commands from the config:
npx simple-git-hooks
-
To automatically have Git hooks enabled after install, edit
package.json
:"scripts": { "postinstall": "npx simple-git-hooks" }
Husky
-
Install
husky
as a dev dependency:npm install husky --save-dev
-
Enable Git hooks:
npx husky install
-
Add a command to a hook:
npx husky add .husky/pre-commit "./node_modules/.bin/nano-staged"
-
To automatically have Git hooks enabled after install, edit
package.json
:"scripts": { "postinstall": "npx husky install" }
Nano Staged supports multiple ways to define config.
-
nano-staged
section inpackage.json
:"nano-staged": { "*": "your-cmd", "*.ext": ["your-cmd", "your-cmd"] }
-
or a separate
.nano-staged.json
ornano-staged.json
config file:{ "*": "your-cmd", "*.ext": ["your-cmd", "your-cmd"] }
-
or a more flexible
.nano-staged.cjs
ornano-staged.cjs
config file to CommonJS modules:module.exports = { '*': 'your-cmd', '*.ext': ['your-cmd', 'your-cmd'], }
-
or a more flexible
.nano-staged.mjs
ornano-staged.mjs
config file to ECMAScript modules:export default { '*': 'your-cmd', '*.ext': ['your-cmd', 'your-cmd'], }
-
or a more flexible
.nano-staged.js
ornano-staged.js
config file:// package.json => "type": "module" export default { '*': 'your-cmd', '*.ext': ['your-cmd', 'your-cmd'], } // package.json => "type": "commonjs" module.exports = { '*': 'your-cmd', '*.ext': ['your-cmd', 'your-cmd'], }
If there are multiple configuration files in the same directory, Nano Staged will only use one. The priority order is as follows:
.nano-staged.js
nano-staged.js
.nano-staged.cjs
nano-staged.cjs
.nano-staged.mjs
nano-staged.mjs
.nano-staged.json
nano-staged.json
package.json
JS config files may export export either a single function or an object:
export default (api) => {
const jsFiles = api.files.filter((file) => path.extname(file) === '.js')
return [`eslint --fix ${jsFiles.join(' ')}`, `prettier --write ${jsFiles.join(' ')}`]
}
export default {
'*.js': (api) => `eslint --fix ${api.files.join(' ')}`,
}
Path to file that contains your configuration object. The path should be either absolute or relative to the directory that your process is running from.
Run commands from the config for only git unstaged files. Nano Staged by default use only staged git files.
Run commands to changed files between the working tree and the index or a tree, to changed files between the index and a tree, to changed files between two trees, or to changed files between two index.
Will allow creating an empty commit.
Special thanks to lint-staged. Some codes was borrowed from it.