Jalankan linter terhadap file git yang dipentaskan dan jangan biarkan ? masuk ke basis kode Anda!
npm install --save-dev lint-staged # requires further setup
$ git commit
✔ Preparing lint-staged...
❯ Running tasks for staged files...
❯ packages/frontend/.lintstagedrc.json — 1 file
↓ *.js — no files [SKIPPED]
❯ *.{json,md} — 1 file
⠹ prettier --write
↓ packages/backend/.lintstagedrc.json — 2 files
❯ *.js — 2 files
⠼ eslint --fix
↓ *.{json,md} — no files [SKIPPED]
◼ Applying modifications from tasks...
◼ Cleaning up temporary files...
Linting lebih masuk akal ketika dijalankan sebelum melakukan kode Anda. Dengan melakukan itu, Anda dapat memastikan tidak ada kesalahan yang masuk ke dalam repositori dan menerapkan gaya kode. Namun menjalankan proses lint pada keseluruhan proyek berjalan lambat, dan hasil linting mungkin tidak relevan. Pada akhirnya Anda hanya ingin lint file yang akan dikomit.
Proyek ini berisi skrip yang akan menjalankan tugas shell arbitrer dengan daftar file bertahap sebagai argumen, difilter berdasarkan pola glob tertentu.
dotnet-format
dan lint-staged
Jika Anda sudah menulisnya, kirimkan PR dengan link ke sana!
Untuk menginstal lint-staged dengan cara yang disarankan, Anda perlu:
npm install --save-dev lint-staged
pre-commit
untuk menjalankan lint-staged{ "*.js": "eslint" }
untuk menjalankan ESLint untuk semua file JS yang dipentaskan Jangan lupa untuk melakukan perubahan pada package.json
dan .husky
untuk membagikan pengaturan ini dengan tim Anda!
Sekarang ubah beberapa file, git add
atau git add --patch
beberapa di antaranya ke komit Anda, dan coba git commit
.
Lihat contoh dan konfigurasi untuk informasi lebih lanjut.
Lihat Rilis.
v15.0.0
lint-staged tidak lagi mendukung Node.js 16. Harap tingkatkan versi Node.js Anda setidaknya ke 18.12.0
. v14.0.0
lint-staged tidak lagi mendukung Node.js 14. Harap tingkatkan versi Node.js Anda setidaknya ke 16.14.0
. v13.0.0
lint-staged tidak lagi mendukung Node.js 12. Harap tingkatkan versi Node.js Anda ke setidaknya 14.13.1
, atau 16.0.0
dan seterusnya.v13.3.0
dirilis secara tidak benar termasuk kode versi v14.0.0
. Ini berarti perubahan yang dapat menyebabkan gangguan pada v14
juga disertakan dalam v13.3.0
, versi v13
terakhir yang dirilis v12.0.0
lint-staged adalah modul ESM murni, pastikan versi Node.js Anda setidaknya 12.20.0
, 14.13.1
, atau 16.0.0
. Baca lebih lanjut tentang modul ESM dari situs resmi Dokumentasi Node.js di sini. v10.0.0
dan seterusnya, setiap modifikasi baru pada file yang awalnya dipentaskan akan secara otomatis ditambahkan ke penerapan. Jika tugas Anda sebelumnya berisi langkah git add
, harap hapus ini. Perilaku otomatis memastikan kondisi balapan lebih sedikit, karena mencoba menjalankan beberapa operasi git secara bersamaan biasanya menghasilkan kesalahan.v10.0.0
dan seterusnya, lint-staged menggunakan git stashes untuk meningkatkan kecepatan dan menyediakan cadangan saat berjalan. Karena git stashes memerlukan setidaknya penerapan awal, Anda tidak boleh menjalankan lint-staged di repo kosong.v10.0.0
dan seterusnya, lint-staged memerlukan Node.js versi 10.13.0 atau lebih baru.v10.0.0
dan seterusnya, lint-staged akan membatalkan penerapan jika tugas linter membatalkan semua perubahan bertahap. Untuk mengizinkan pembuatan komit kosong, silakan gunakan opsi --allow-empty
. ❯ npx lint-staged --help
Usage: lint-staged [options]
Options:
-V, --version output the version number
--allow-empty allow empty commits when tasks revert all staged changes (default: false)
-p, --concurrent <number|boolean> the number of tasks to run concurrently, or false for serial (default: true)
-c, --config [path] path to configuration file, or - to read from stdin
--cwd [path] run all tasks in specific directory, instead of the current
-d, --debug print additional debug information (default: false)
--diff [string] override the default "--staged" flag of "git diff" to get list of files. Implies
"--no-stash".
--diff-filter [string] override the default "--diff-filter=ACMR" flag of "git diff" to get list of files
--max-arg-length [number] maximum length of the command-line argument string (default: 0)
--no-stash disable the backup stash, and do not revert in case of errors. Implies
"--no-hide-partially-staged".
--no-hide-partially-staged disable hiding unstaged changes from partially staged files
-q, --quiet disable lint-staged’s own console output (default: false)
-r, --relative pass relative filepaths to tasks (default: false)
-x, --shell [path] skip parsing of tasks for better shell support (default: false)
-v, --verbose show task output even when tasks succeed; by default only failed output is shown
(default: false)
-h, --help display help for command
--allow-empty
: Secara default, ketika tugas linter membatalkan semua perubahan bertahap, lint-staged akan keluar dengan kesalahan dan membatalkan penerapan. Gunakan tanda ini untuk mengizinkan pembuatan git commit kosong.--concurrent [number|boolean]
: Mengontrol konkurensi tugas yang dijalankan oleh lint-staged. CATATAN : Ini TIDAK mempengaruhi konkurensi subtugas (subtugas akan selalu dijalankan secara berurutan). Nilai yang mungkin adalah:false
: Jalankan semua tugas secara serialtrue
(default): Konkurensi tak terbatas . Menjalankan sebanyak mungkin tugas secara paralel.{number}
: Jalankan sejumlah tugas tertentu secara paralel, dengan 1
setara dengan false
.--config [path]
: Tentukan secara manual path ke file konfigurasi atau nama paket npm. Catatan: saat digunakan, lint-staged tidak akan melakukan pencarian file konfigurasi dan akan mencetak kesalahan jika file yang ditentukan tidak dapat ditemukan. Jika '-' diberikan sebagai nama file maka konfigurasi akan dibaca dari stdin, memungkinkan pemipaan dalam konfigurasi seperti cat my-config.json | npx lint-staged --config -
.--cwd [path]
: Secara default, tugas dijalankan di direktori kerja saat ini. Gunakan --cwd some/directory
untuk menimpanya. Jalurnya bisa absolut atau relatif terhadap direktori kerja saat ini.--debug
: Jalankan dalam mode debug. Saat disetel, ia melakukan hal berikut:$DEBUG
ke lint-staged*
.verbose
untuk listr2
; hal ini menyebabkan keluaran serial dan tidak berwarna ke terminal, bukan keluaran default (dipercantik, dinamis). (perender verbose
juga dapat diaktifkan dengan mengatur variabel lingkungan TERM=dumb
atau NODE_ENV=test
)--diff
: Secara default linter difilter terhadap semua file yang dipentaskan di git, dihasilkan dari git diff --staged
. Opsi ini memungkinkan Anda mengganti flag --staged
dengan revisi sewenang-wenang. Misalnya untuk mendapatkan daftar file yang diubah antara dua cabang, gunakan --diff="branch1...branch2"
. Anda juga dapat membaca lebih lanjut tentang git diff dan gitrevisions. Opsi ini juga menyiratkan --no-stash
.--diff-filter
: Secara default hanya file yang ditambahkan , disalin , diubah , atau diganti namanya yang disertakan. Gunakan tanda ini untuk mengganti nilai ACMR
default dengan sesuatu yang lain: ditambahkan ( A
), disalin ( C
), dihapus ( D
), dimodifikasi ( M
), diganti namanya ( R
), ketik diubah ( T
), tidak digabungkan ( U
), tidak diketahui ( X
), atau pasangan putus ( B
). Lihat juga dokumen git diff
untuk --diff-filter.--max-arg-length
: perintah panjang (banyak file) secara otomatis dibagi menjadi beberapa bagian ketika mendeteksi bahwa shell saat ini tidak dapat menanganinya. Gunakan tanda ini untuk mengganti panjang maksimum string perintah yang dihasilkan.--no-stash
: Secara default, simpanan cadangan akan dibuat sebelum menjalankan tugas, dan semua modifikasi tugas akan dikembalikan jika terjadi kesalahan. Opsi ini akan menonaktifkan pembuatan simpanan, dan sebagai gantinya membiarkan semua modifikasi dalam indeks saat membatalkan penerapan. Dapat diaktifkan kembali dengan --stash
. Opsi ini juga menyiratkan --no-hide-partially-staged
.--no-hide-partially-staged
: Secara default, perubahan yang tidak dipentaskan dari file yang dipentaskan sebagian akan disembunyikan. Opsi ini akan menonaktifkan perilaku ini dan menyertakan semua perubahan yang tidak dipentaskan dalam file yang dipentaskan sebagian. Dapat diaktifkan kembali dengan --hide-partially-staged
--quiet
: Menekan semua keluaran CLI, kecuali dari tugas.--relative
: Meneruskan jalur file yang berhubungan dengan process.cwd()
(di mana lint-staged
dijalankan) ke tugas. Standarnya false
.--shell
: Secara default, perintah linter akan diurai untuk kecepatan dan keamanan. Hal ini mempunyai efek samping yaitu skrip shell biasa mungkin tidak berfungsi seperti yang diharapkan. Anda dapat melewati penguraian perintah dengan opsi ini. Untuk menggunakan shell tertentu, gunakan jalur seperti --shell "/bin/bash"
.--verbose
: Menampilkan keluaran tugas bahkan ketika tugas berhasil. Secara default, hanya keluaran gagal yang ditampilkan. Lint-staged dapat dikonfigurasi dengan berbagai cara:
lint-staged
di package.json
, atau package.yaml
Anda.lintstagedrc
dalam format JSON atau YML, atau Anda bisa secara eksplisit dengan ekstensi file:.lintstagedrc.json
.lintstagedrc.yaml
.lintstagedrc.yml
.lintstagedrc.mjs
atau lint-staged.config.mjs
dalam format ESMexport default { ... }
.lintstagedrc.cjs
atau lint-staged.config.cjs
dalam format CommonJSmodule.exports = { ... }
lint-staged.config.js
atau .lintstagedrc.js
dalam format ESM atau CommonJS, bergantung pada apakah package.json proyek Anda berisi opsi "type": "module"
atau tidak.--config
atau -c
Konfigurasi harus berupa objek yang setiap nilainya merupakan perintah untuk dijalankan dan kuncinya adalah pola glob yang digunakan untuk perintah ini. Paket ini menggunakan micromatch untuk pola glob. File JavaScript juga dapat mengekspor konfigurasi lanjutan sebagai suatu fungsi. Lihat Menggunakan file konfigurasi JS untuk info selengkapnya.
Anda juga dapat menempatkan beberapa file konfigurasi di direktori berbeda di dalam sebuah proyek. Untuk file bertahap tertentu, file konfigurasi terdekat akan selalu digunakan. Lihat "Bagaimana cara menggunakan lint-staged
dalam monorepo multi-paket?" untuk info lebih lanjut dan contoh.
package.json
: {
"lint-staged" : {
"*" : " your-cmd "
}
}
.lintstagedrc
{
"*" : " your-cmd "
}
Konfigurasi ini akan mengeksekusi your-cmd
dengan daftar file yang sedang dipentaskan yang diteruskan sebagai argumen.
Jadi, mengingat Anda melakukan git add file1.ext file2.ext
, lint-staged akan menjalankan perintah berikut:
your-cmd file1.ext file2.ext
Secara default, lint-staged akan menjalankan tugas yang dikonfigurasi secara bersamaan. Ini berarti bahwa untuk setiap glob, semua perintah akan dimulai pada waktu yang sama. Dengan konfigurasi berikut, eslint
dan prettier
akan berjalan secara bersamaan:
{
"*.ts" : " eslint " ,
"*.md" : " prettier --list-different "
}
Hal ini biasanya tidak menjadi masalah karena gumpalan tidak tumpang tindih, dan perintah tidak membuat perubahan pada file, tetapi hanya melaporkan kemungkinan kesalahan (membatalkan git commit). Jika Anda ingin menjalankan beberapa perintah untuk kumpulan file yang sama, Anda dapat menggunakan sintaksis array untuk memastikan perintah dijalankan secara berurutan. Dalam contoh berikut, prettier
akan dijalankan untuk kedua glob, dan sebagai tambahan, eslint
akan dijalankan untuk file *.ts
setelahnya . Kedua rangkaian perintah (untuk setiap glob) masih dimulai pada waktu yang sama (tetapi tidak tumpang tindih).
{
"*.ts" : [ " prettier --list-different " , " eslint " ],
"*.md" : " prettier --list-different "
}
Berikan perhatian ekstra ketika gumpalan yang dikonfigurasi tumpang tindih, dan tugas melakukan pengeditan pada file. Misalnya, dalam konfigurasi ini prettier
dan eslint
mungkin mencoba membuat perubahan pada file *.ts
yang sama pada saat yang sama, sehingga menyebabkan kondisi balapan :
{
"*" : " prettier --write " ,
"*.ts" : " eslint --fix "
}
Anda dapat menyelesaikannya menggunakan pola negasi dan sintaksis array:
{
"!(*.ts)" : " prettier --write " ,
"*.ts" : [ " eslint --fix " , " prettier --write " ]
}
Contoh lain di mana tugas melakukan pengeditan pada file dan gumpalan cocok dengan beberapa file tetapi tidak tumpang tindih:
{
"*.css" : [ " stylelint --fix " , " prettier --write " ],
"*.{js,jsx}" : [ " eslint --fix " , " prettier --write " ],
"!(*.css|*.js|*.jsx)" : [ " prettier --write " ]
}
Atau, jika perlu, Anda dapat membatasi konkurensi menggunakan --concurrent <number>
atau menonaktifkannya sepenuhnya dengan --concurrent false
.
Perintah Linter bekerja pada subset dari semua file yang dipentaskan, yang ditentukan oleh pola glob . lint-staged menggunakan micromatch untuk mencocokkan file dengan aturan berikut:
/
), opsi matchBase
micromatch akan diaktifkan, sehingga glob cocok dengan nama dasar file apa pun direktorinya:"*.js"
akan cocok dengan semua file JS, seperti /test.js
dan /foo/bar/test.js
"!(*test).js"
akan cocok dengan semua file JS, kecuali yang diakhiri dengan test.js
, jadi foo.js
tetapi tidak foo.test.js
"!(*.css|*.js)"
akan cocok dengan semua file kecuali file CSS dan JS/
), pola tersebut juga akan cocok dengan jalurnya:"./*.js"
akan cocok dengan semua file JS di root repo git, jadi /test.js
tetapi tidak /foo/bar/test.js
"foo/**/*.js"
akan cocok dengan semua file JS di dalam direktori /foo
, jadi /foo/bar/test.js
tetapi tidak /test.js
Saat mencocokkan, lint-staged akan melakukan hal berikut
CATATAN: lint-staged
akan meneruskan jalur absolut ke linter untuk menghindari kebingungan jika dijalankan di direktori kerja yang berbeda (yaitu ketika direktori .git
Anda tidak sama dengan direktori package.json
Anda).
Lihat juga Bagaimana cara menggunakan lint-staged
dalam monorepo multi-paket?
Konsep lint-staged
adalah menjalankan tugas linter yang dikonfigurasi (atau tugas lainnya) pada file yang dipentaskan di git. lint-staged
akan selalu meneruskan daftar semua file yang dipentaskan ke tugas, dan mengabaikan file apa pun harus dikonfigurasi dalam tugas itu sendiri.
Pertimbangkan proyek yang menggunakan prettier
untuk menjaga format kode tetap konsisten di semua file. Proyek ini juga menyimpan perpustakaan vendor pihak ketiga yang diperkecil di direktori vendor/
. Agar prettier
tidak menimbulkan kesalahan pada file-file ini, direktori vendor harus ditambahkan ke konfigurasi pengabaian yang lebih cantik, file .prettierignore
. Menjalankan npx prettier .
akan mengabaikan seluruh direktori vendor, tidak menimbulkan kesalahan. Saat lint-staged
ditambahkan ke proyek dan dikonfigurasi agar berjalan lebih cantik, semua file yang diubah dan dipentaskan dalam direktori vendor akan diabaikan oleh prettier, meskipun ia menerimanya sebagai masukan.
Dalam skenario tingkat lanjut, ketika tidak mungkin mengonfigurasi tugas linter itu sendiri untuk mengabaikan file, namun beberapa file bertahap tetap harus diabaikan oleh lint-staged
, jalur file dapat difilter sebelum meneruskannya ke tugas menggunakan sintaks fungsi. Lihat Contoh: Abaikan file dari kecocokan.
Yang didukung adalah semua executable yang diinstal secara lokal atau global melalui npm
serta semua executable dari $PATH Anda.
Tidak disarankan menggunakan skrip yang diinstal secara global, karena lint-staged mungkin tidak berfungsi untuk seseorang yang belum menginstalnya.
lint-staged
menggunakan execa untuk menemukan skrip yang dipasang secara lokal. Jadi di .lintstagedrc
Anda dapat menulis:
{
"*.js" : " eslint --fix "
}
Hal ini akan mengakibatkan eslint --fix file-1.js file-2.js
berjalan secara lint-staged , ketika Anda telah mengatur file file-1.js
, file-2.js
dan README.md
.
Berikan argumen ke perintah Anda dengan dipisahkan oleh spasi seperti yang Anda lakukan di shell. Lihat contoh di bawah.
Anda dapat menjalankan beberapa perintah secara berurutan di setiap glob. Untuk melakukannya, berikan serangkaian perintah, bukan satu perintah saja. Ini berguna untuk menjalankan alat pemformatan otomatis seperti eslint --fix
atau stylefmt
tetapi dapat digunakan untuk urutan sembarang.
Misalnya:
{
"*.js" : [ " eslint " , " prettier --write " ]
}
akan mengeksekusi eslint
dan jika keluar dengan kode 0
, ia akan mengeksekusi prettier --write
pada semua file *.js
yang dipentaskan.
Ini akan menghasilkan eslint file-1.js file-2.js
yang berjalan secara lint-staged , ketika Anda memiliki file file-1.js
, file-2.js
dan README.md
yang dipentaskan, dan jika lolos, prettier --write file-1.js file-2.js
.
Menulis file konfigurasi dalam JavaScript adalah cara paling ampuh untuk mengonfigurasi lint-staged ( lint-staged.config.js
, serupa, atau diteruskan melalui --config
). Dari file konfigurasi, Anda dapat mengekspor satu fungsi atau objek.
Jika nilai exports
adalah sebuah fungsi, ia akan menerima array dari semua nama file yang dipentaskan. Anda kemudian dapat membuat pencocokan Anda sendiri untuk file tersebut dan mengembalikan string perintah atau larik string perintah. String ini dianggap lengkap dan harus menyertakan argumen nama file, jika diinginkan.
Jika nilai exports
adalah sebuah objek, kuncinya harus cocok dengan glob (seperti dalam format konfigurasi non-js normal). Nilainya bisa seperti pada konfigurasi normal atau fungsi individual seperti dijelaskan di atas. Alih-alih menerima semua file yang cocok, fungsi dalam objek yang diekspor hanya akan menerima file bertahap yang cocok dengan kunci glob terkait.
Ringkasnya, secara default lint-staged secara otomatis menambahkan daftar file bertahap yang cocok ke perintah Anda, namun saat membuat perintah menggunakan fungsi JS, hal ini diharapkan dilakukan secara manual. Misalnya:
export default {
'*.js' : ( stagedFiles ) => [ `eslint .` , `prettier --write ${ stagedFiles . join ( ' ' ) } ` ] ,
}
Ini akan menghasilkan eslint .
yang dijalankan pertama kali dengan lint-staged . (mencocokkan semua file), dan jika lolos, prettier --write file-1.js file-2.js
, ketika Anda telah mementaskan file file-1.js
, file-2.js
dan README.md
.
Fungsinya juga bisa async:
( filenames : string [ ] ) => string | string [ ] | Promise < string | string [ ] >
// lint-staged.config.js
import micromatch from 'micromatch'
export default ( allStagedFiles ) => {
const shFiles = micromatch ( allStagedFiles , [ '**/src/**/*.sh' ] )
if ( shFiles . length ) {
return `printf '%sn' "Script files aren't allowed in src directory" >&2`
}
const codeFiles = micromatch ( allStagedFiles , [ '**/*.js' , '**/*.ts' ] )
const docFiles = micromatch ( allStagedFiles , [ '**/*.md' ] )
return [ `eslint ${ codeFiles . join ( ' ' ) } ` , `mdl ${ docFiles . join ( ' ' ) } ` ]
}
// .lintstagedrc.js
export default {
'**/*.js?(x)' : ( filenames ) => filenames . map ( ( filename ) => `prettier --write ' ${ filename } '` ) ,
}
tsc
pada perubahan pada file TypeScript, tetapi jangan berikan argumen nama file apa pun // lint-staged.config.js
export default {
'**/*.ts?(x)' : ( ) => 'tsc -p tsconfig.json --noEmit' ,
}
// .lintstagedrc.js
export default {
'**/*.js?(x)' : ( filenames ) =>
filenames . length > 10 ? 'eslint .' : `eslint ${ filenames . join ( ' ' ) } ` ,
}
Lebih baik menggunakan konfigurasi berbasis fungsi (lihat di atas), jika kasus penggunaan Anda adalah ini.
// lint-staged.config.js
import micromatch from 'micromatch'
export default {
'*' : ( allFiles ) => {
const codeFiles = micromatch ( allFiles , [ '**/*.js' , '**/*.ts' ] )
const docFiles = micromatch ( allFiles , [ '**/*.md' ] )
return [ `eslint ${ codeFiles . join ( ' ' ) } ` , `mdl ${ docFiles . join ( ' ' ) } ` ]
} ,
}
Jika karena alasan tertentu Anda ingin mengabaikan file dari pencocokan glob, Anda dapat menggunakan micromatch.not()
:
// lint-staged.config.js
import micromatch from 'micromatch'
export default {
'*.js' : ( files ) => {
// from `files` filter those _NOT_ matching `*test.js`
const match = micromatch . not ( files , '*test.js' )
return `eslint ${ match . join ( ' ' ) } `
} ,
}
Harap dicatat bahwa untuk sebagian besar kasus, gumpalan dapat mencapai efek yang sama. Untuk contoh di atas, glob yang cocok adalah !(*test).js
.
import path from 'path'
export default {
'*.ts' : ( absolutePaths ) => {
const cwd = process . cwd ( )
const relativePaths = absolutePaths . map ( ( file ) => path . relative ( cwd , file ) )
return `ng lint myProjectName --files ${ relativePaths . join ( ' ' ) } `
} ,
}
Alat seperti Prettier, ESLint/TSLint, atau stylelint dapat memformat ulang kode Anda sesuai dengan konfigurasi yang sesuai dengan menjalankan prettier --write
/ eslint --fix
/ tslint --fix
/ stylelint --fix
. Lint-staged akan secara otomatis menambahkan modifikasi apa pun pada penerapan selama tidak ada kesalahan.
{
"*.js" : " prettier --write "
}
Sebelum versi 10, tugas harus menyertakan git add
secara manual sebagai langkah terakhir. Perilaku ini telah diintegrasikan ke dalam lint-staged itu sendiri untuk mencegah kondisi balapan dengan banyak tugas yang mengedit file yang sama. Jika lint-staged mendeteksi git add
dalam konfigurasi tugas, peringatan akan ditampilkan di konsol. Harap hapus git add
dari konfigurasi Anda setelah memutakhirkan.
Semua contoh mengasumsikan Anda telah menyiapkan lint-staged di file package.json
dan husky di file konfigurasinya sendiri.
{
"name" : " My project " ,
"version" : " 0.1.0 " ,
"scripts" : {
"my-custom-script" : " linter --arg1 --arg2 "
},
"lint-staged" : {}
}
Di .husky/pre-commit
# .husky/pre-commit
npx lint-staged
Catatan: kami tidak memberikan jalur sebagai argumen bagi pelari. Ini penting karena lint-staged akan melakukan ini untuk Anda.
*.js
dan *.jsx
dijalankan sebagai hook pra-komit{
"*.{js,jsx}" : " eslint "
}
--fix
dan tambahkan untuk melakukan{
"*.js" : " eslint --fix "
}
Ini akan menjalankan eslint --fix
dan secara otomatis menambahkan perubahan pada komit.
Jika Anda ingin menggunakan kembali skrip npm yang ditentukan di package.json Anda:
{
"*.js" : " npm run my-custom-script -- "
}
Berikut ini setara:
{
"*.js" : " linter --arg1 --arg2 "
}
Perintah linting tidak mendukung konvensi shell untuk memperluas variabel lingkungan. Untuk mengaktifkan konvensi itu sendiri, gunakan alat seperti cross-env
.
Misalnya, berikut adalah jest
yang berjalan pada semua file .js
dengan variabel NODE_ENV
disetel ke "test"
:
{
"*.js" : [ " cross-env NODE_ENV=test jest --bail --findRelatedTests " ]
}
prettier
untuk format apa pun yang didukung Lebih Cantik{
"*" : " prettier --ignore-unknown --write "
}
prettier
untuk JavaScript, TypeScript, Markdown, HTML, atau CSS{
"*.{js,jsx,ts,tsx,md,html,css}" : " prettier --write "
}
{
"*.css" : " stylelint " ,
"*.scss" : " stylelint --syntax=scss "
}
{
"*.scss" : [ " postcss --config path/to/your/config --replace " , " stylelint " ]
}
{
"*.{png,jpeg,jpg,gif,svg}" : " imagemin-lint-staged "
}
imagemin-lint-staged
imagemin-lint-staged adalah alat CLI yang dirancang untuk penggunaan lint-staged dengan default yang masuk akal.
Lihat selengkapnya di postingan blog ini untuk mengetahui manfaat pendekatan ini.
{
"*.{js,jsx}" : " flow focus-check "
}
// .lintstagedrc.js
// See https://nextjs.org/docs/basic-features/eslint#lint-staged for details
const path = require ( 'path' )
const buildEslintCommand = ( filenames ) =>
`next lint --fix --file ${ filenames . map ( ( f ) => path . relative ( process . cwd ( ) , f ) ) . join ( ' --file ' ) } `
module . exports = {
'*.{js,jsx,ts,tsx}' : [ buildEslintCommand ] ,
}
Git 2.36.0 memperkenalkan perubahan pada hook yang tidak lagi dijalankan di TTY asli. Ini telah diperbaiki di 2.37.0:
https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.37.0.txt
- Di Git 2.36 kami mengubah cara pemanggilan hook. Salah satu perubahan yang terlihat oleh pengguna akhir adalah keluaran dari sebuah hook tidak lagi terhubung langsung ke keluaran standar "git" yang memunculkan hook, yang terlihat setelah rilis. Hal ini sedang diperbaiki. (gabungkan a082345372 ab/hooks-regression-fix nanti untuk memelihara).
Jika memperbarui Git tidak membantu, Anda dapat mencoba mengalihkan output di hook Git Anda secara manual; Misalnya:
# .husky/pre-commit
if sh -c " : >/dev/tty " > /dev/null 2> /dev/null ; then exec > /dev/tty 2>&1 ; fi
npx lint-staged
Sumber: typicode/husky#968 (komentar)
lint-staged
melalui node?Ya!
import lintStaged from 'lint-staged'
try {
const success = await lintStaged ( )
console . log ( success ? 'Linting was successful!' : 'Linting failed!' )
} catch ( e ) {
// Failed to load configuration
console . error ( e )
}
Parameter untuk lintStaged
setara dengan parameter CLI-nya:
const success = await lintStaged ( {
allowEmpty : false ,
c