Tiny tool to run commands for modified, staged, and committed files in a GIT repository.
It helps speed up running of the tests, linters, scripts, and more.
- 📦 Small: 47kB (142x+ 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.394 ms
+ nano-staged 0.968 msThe space in node_modules including sub-dependencies:
$ node bench/size/index.js
Data from packagephobia.com
- lint-staged 6688 kB
+ nano-staged 47 kBThe 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
-
Install
nano-staged:npm install --save-dev nano-stagedor
yarn add nano-staged -D -
Add the
nano-stagedsection and the commands to yourpackage.json:For example:
"nano-staged": { "*.{js,ts}": "prettier --write", "*.css": ["stylelint", "eslint --fix"] },
-
Run commands with Nano Staged:
./node_modules/.bin/nano-stagedNano 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 before every commit.
Simple Git Hooks
-
Install
simple-git-hooksas a dev dependency:npm install simple-git-hooks --save-dev -
Add the
simple-git-hookssection to yourpackage.jsonand 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
huskyas 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-stagedsection inpackage.json:"nano-staged": { "*": "your-cmd", "*.ext": ["your-cmd", "your-cmd"] }
-
or a separate
.nano-staged.json,nano-staged.jsonor.nanostagedrcconfig file:{ "*": "your-cmd", "*.ext": ["your-cmd", "your-cmd"] } -
or a more flexible
.nano-staged.cjsornano-staged.cjsconfig file to CommonJS modules:module.exports = { '*': 'your-cmd', '*.ext': ['your-cmd', 'your-cmd'], }
-
or a more flexible
.nano-staged.mjsornano-staged.mjsconfig file to ECMAScript modules:export default { '*': 'your-cmd', '*.ext': ['your-cmd', 'your-cmd'], }
-
or a more flexible
.nano-staged.jsornano-staged.jsconfig 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.jsnano-staged.js.nano-staged.cjsnano-staged.cjs.nano-staged.mjsnano-staged.mjs.nano-staged.jsonnano-staged.json.nanostagedrcpackage.json
JS config files may export export either a single function or an object:
export default (api) => {
const jsFiles = api.filenames.filter((file) => path.extname(file) === '.js')
return [`eslint --fix ${jsFiles.join(' ')}`, `prettier --write ${jsFiles.join(' ')}`]
}export default {
'*.js': (api) => `eslint --fix ${api.filenames.join(' ')}`,
}The api object exposes:
api.filenames - working filenames
api.type - run type: staged, unstaged, diff
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 only for git unstaged files. Nano Staged by default uses only staged git files.
Run commands on files changed between the working tree and the index or a tree, on files changed between the index and a tree, files changed between two trees, or on files changed between two indexes (commit hashes).
Will allow creating an empty commit.
Special thanks to lint-staged. Some codes was borrowed from it.
The Nano Staged community can be found on GitHub Discussions, where you can ask questions, voice ideas, and share your projects.