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.
picocolors
).Benchmarks running time for 10 file:
$ node bench/running-time/index.js
- lint-staged 1.394 ms
+ nano-staged 0.968 ms
The space in node_modules including sub-dependencies:
$ node bench/size/index.js
Data from packagephobia.com
- lint-staged 6688 kB
+ nano-staged 47 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
Install nano-staged
:
npm install --save-dev nano-staged
or
yarn add nano-staged -D
Add the nano-staged
section and the commands to your package.json
:
For example:
"nano-staged": {
"*.{js,ts}": "prettier --write",
"*.css": ["stylelint", "eslint --fix"]
},
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 before every commit.
Nano Staged supports multiple ways to define config.
nano-staged
section in package.json
:
"nano-staged": {
"*": "your-cmd",
"*.ext": ["your-cmd", "your-cmd"]
}
or a separate .nano-staged.json
, nano-staged.json
or .nanostagedrc
config file:
{
"*": "your-cmd",
"*.ext": ["your-cmd", "your-cmd"]
}
or a more flexible .nano-staged.cjs
or nano-staged.cjs
config file to CommonJS modules:
module.exports = {
'*': 'your-cmd',
'*.ext': ['your-cmd', 'your-cmd'],
}
or a more flexible .nano-staged.mjs
or nano-staged.mjs
config file to ECMAScript modules:
export default {
'*': 'your-cmd',
'*.ext': ['your-cmd', 'your-cmd'],
}
or a more flexible .nano-staged.js
or nano-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
.nanostagedrc
package.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
--config [<path>]
or -c [<path>]
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.
--unstaged
or -u
Run commands from the config only for git unstaged files. Nano Staged by default uses only staged git files.
--diff [<ref1> <ref2>]
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).
--allow-empty
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.