add pre-commit hook to automatically format staged files (#80)

This PR:
- fixes the prettier config (the `-astro` plugin must be explicitly registered with pnpm)
- adds [`pretty-quick`](https://github.com/azz/pretty-quick) to be able to format the staged changes
- add [ `husky`](https://typicode.github.io/husky/) to easily add a pre-commit hook which calls `pretty-quick` on commit

I updated the README to document the added commands:
- `pnpm run prepare` to add the pre-commit hook
- `pnpm run format-staged` to format the staged files

Co-authored-by: oliverpool <git@olivier.pfad.fr>
Reviewed-on: https://codeberg.org/forgejo/website/pulls/80
This commit is contained in:
oliverpool 2023-02-02 09:26:59 +00:00
parent 829a12bc9d
commit 31f0b7cae1
6 changed files with 136 additions and 35 deletions

4
.husky/pre-commit Executable file
View file

@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm run format-staged

View file

@ -1,4 +1,5 @@
dist
node_modules
.github
.changeset
.changeset
pnpm-lock.yaml

View file

@ -12,5 +12,6 @@
"useTabs": false
}
}
]
],
"plugins": ["prettier-plugin-astro"]
}

View file

@ -66,20 +66,20 @@ There's nothing special about `src/components/`, but that's where we like to put
Any static assets, like images, can be placed in the `public/` directory if they do not require any transformation or in the `assets/` directory if they are imported directly.
### Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :-------------------- | :------------------------------------------------- |
| `pnpm install` | Installs dependencies |
| `pnpm run dev` | Starts local dev server at `localhost:3000` |
| `pnpm run build` | Build your production site to `./dist/` |
| `pnpm run preview` | Preview your build locally, before deploying |
| `pnpm run format` | Format codes with Prettier |
| `pnpm run lint:eslint` | Run Eslint |
| `pnpm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
| Command | Action |
| :----------------------- | :------------------------------------------------- |
| `pnpm install` | Installs dependencies |
| `pnpm run prepare` | Install git pre-commit hook |
| `pnpm run dev` | Starts local dev server at `localhost:3000` |
| `pnpm run build` | Build your production site to `./dist/` |
| `pnpm run preview` | Preview your build locally, before deploying |
| `pnpm run format` | Format codes with Prettier |
| `pnpm run format-staged` | Format staged files with Prettier |
| `pnpm run lint:eslint` | Run Eslint |
| `pnpm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
See the [AstroWind docs](https://github.com/onwidget/astrowind) for more information.

View file

@ -8,7 +8,9 @@
"build": "astro build",
"preview": "astro build && astro preview",
"astro": "astro",
"prepare": "husky install",
"format": "prettier -w .",
"format-staged": "pretty-quick --staged",
"lint:eslint": "eslint . --ext .js,.ts,.astro"
},
"devDependencies": {
@ -27,9 +29,11 @@
"eslint": "^8.32.0",
"eslint-plugin-astro": "^0.21.1",
"eslint-plugin-jsx-a11y": "^6.7.1",
"husky": "^8.0.3",
"marked": "^4.2.12",
"prettier": "^2.8.3",
"prettier-plugin-astro": "^0.7.2",
"pretty-quick": "^3.1.3",
"sanitize-html": "^2.8.1",
"sharp": "^0.31.3",
"slug": "^8.2.2",

135
pnpm-lock.yaml generated
View file

@ -16,9 +16,11 @@ specifiers:
eslint: ^8.32.0
eslint-plugin-astro: ^0.21.1
eslint-plugin-jsx-a11y: ^6.7.1
husky: ^8.0.3
marked: ^4.2.12
prettier: ^2.8.3
prettier-plugin-astro: ^0.7.2
pretty-quick: ^3.1.3
sanitize-html: ^2.8.1
sharp: ^0.31.3
slug: ^8.2.2
@ -27,7 +29,7 @@ specifiers:
devDependencies:
'@astrojs/image': 0.12.1_sharp@0.31.3
'@astrojs/mdx': 0.14.0_rollup@3.10.1
'@astrojs/mdx': 0.14.0
'@astrojs/rss': 2.0.0
'@astrojs/sitemap': 1.0.0
'@astrojs/tailwind': 2.1.3_tailwindcss@3.2.4
@ -41,13 +43,15 @@ devDependencies:
eslint: 8.32.0
eslint-plugin-astro: 0.21.1_eslint@8.32.0
eslint-plugin-jsx-a11y: 6.7.1_eslint@8.32.0
husky: 8.0.3
marked: 4.2.12
prettier: 2.8.3
prettier-plugin-astro: 0.7.2
pretty-quick: 3.1.3_prettier@2.8.3
sanitize-html: 2.8.1
sharp: 0.31.3
slug: 8.2.2
tailwindcss: 3.2.4_postcss@8.4.21
tailwindcss: 3.2.4
typescript: 4.9.4
packages:
@ -140,14 +144,14 @@ packages:
- supports-color
dev: true
/@astrojs/mdx/0.14.0_rollup@3.10.1:
/@astrojs/mdx/0.14.0:
resolution: {integrity: sha512-lmNh/7CeQmdZ0OCbnDnoDxQTKWleFdlT5YkjsutGIOhabY0xgCcWwb1Rbs/9m4vvTdCkp9zsZdRzUKEPFPbcsA==}
engines: {node: ^14.18.0 || >=16.12.0}
dependencies:
'@astrojs/markdown-remark': 1.2.0
'@astrojs/prism': 1.0.2
'@mdx-js/mdx': 2.2.1
'@mdx-js/rollup': 2.2.1_rollup@3.10.1
'@mdx-js/rollup': 2.2.1
acorn: 8.8.2
es-module-lexer: 0.10.5
estree-util-visit: 1.2.1
@ -208,7 +212,7 @@ packages:
'@proload/core': 0.3.3
autoprefixer: 10.4.13_postcss@8.4.21
postcss: 8.4.21
tailwindcss: 3.2.4_postcss@8.4.21
tailwindcss: 3.2.4
dev: true
/@astrojs/telemetry/1.0.1:
@ -620,14 +624,13 @@ packages:
- supports-color
dev: true
/@mdx-js/rollup/2.2.1_rollup@3.10.1:
/@mdx-js/rollup/2.2.1:
resolution: {integrity: sha512-wpGeK9iO7gPEIyC/ZTiggLY/MkEWDj5IWSsjlpkefgjb5RbmUukXU6/D2rHA+VAopxigS3NlaIL2ctpYBi4fmg==}
peerDependencies:
rollup: '>=2'
dependencies:
'@mdx-js/mdx': 2.2.1
'@rollup/pluginutils': 5.0.2_rollup@3.10.1
rollup: 3.10.1
'@rollup/pluginutils': 5.0.2
source-map: 0.7.4
vfile: 5.3.6
transitivePeerDependencies:
@ -687,7 +690,7 @@ packages:
tsm: 2.3.0
dev: true
/@rollup/pluginutils/5.0.2_rollup@3.10.1:
/@rollup/pluginutils/5.0.2:
resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
engines: {node: '>=14.0.0'}
peerDependencies:
@ -699,7 +702,6 @@ packages:
'@types/estree': 1.0.0
estree-walker: 2.0.2
picomatch: 2.3.1
rollup: 3.10.1
dev: true
/@tailwindcss/typography/0.5.9_tailwindcss@3.2.4:
@ -711,7 +713,7 @@ packages:
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
postcss-selector-parser: 6.0.10
tailwindcss: 3.2.4_postcss@8.4.21
tailwindcss: 3.2.4
dev: true
/@trysound/sax/0.2.0:
@ -804,6 +806,10 @@ packages:
resolution: {integrity: sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==}
dev: true
/@types/minimatch/3.0.5:
resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==}
dev: true
/@types/ms/0.7.31:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: true
@ -1092,6 +1098,11 @@ packages:
deep-equal: 2.2.0
dev: true
/array-differ/3.0.0:
resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==}
engines: {node: '>=8'}
dev: true
/array-includes/3.1.6:
resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
engines: {node: '>= 0.4'}
@ -1122,6 +1133,11 @@ packages:
es-shim-unscopables: 1.0.0
dev: true
/arrify/2.0.1:
resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
engines: {node: '>=8'}
dev: true
/ast-types-flow/0.0.7:
resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
dev: true
@ -1415,6 +1431,14 @@ packages:
supports-color: 5.5.0
dev: true
/chalk/3.0.0:
resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
engines: {node: '>=8'}
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
dev: true
/chalk/4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@ -2380,6 +2404,21 @@ packages:
engines: {node: '>=0.8.x'}
dev: true
/execa/4.1.0:
resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
engines: {node: '>=10'}
dependencies:
cross-spawn: 7.0.3
get-stream: 5.2.0
human-signals: 1.1.1
is-stream: 2.0.1
merge-stream: 2.0.0
npm-run-path: 4.0.1
onetime: 5.1.2
signal-exit: 3.0.7
strip-final-newline: 2.0.0
dev: true
/execa/6.1.0:
resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -2579,6 +2618,13 @@ packages:
has-symbols: 1.0.3
dev: true
/get-stream/5.2.0:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
dependencies:
pump: 3.0.0
dev: true
/get-stream/6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
@ -2876,11 +2922,22 @@ packages:
resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==}
dev: true
/human-signals/1.1.1:
resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
engines: {node: '>=8.12.0'}
dev: true
/human-signals/3.0.1:
resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
engines: {node: '>=12.20.0'}
dev: true
/husky/8.0.3:
resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
engines: {node: '>=14'}
hasBin: true
dev: true
/ieee754/1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: true
@ -3125,6 +3182,11 @@ packages:
call-bind: 1.0.2
dev: true
/is-stream/2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
dev: true
/is-stream/3.0.0:
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -3996,6 +4058,17 @@ packages:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
dev: true
/multimatch/4.0.0:
resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==}
engines: {node: '>=8'}
dependencies:
'@types/minimatch': 3.0.5
array-differ: 3.0.0
array-union: 2.1.0
arrify: 2.0.1
minimatch: 3.1.2
dev: true
/nanoid/3.3.4:
resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -4059,6 +4132,13 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/npm-run-path/4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
dependencies:
path-key: 3.1.1
dev: true
/npm-run-path/5.1.0:
resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -4445,6 +4525,22 @@ packages:
hasBin: true
dev: true
/pretty-quick/3.1.3_prettier@2.8.3:
resolution: {integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==}
engines: {node: '>=10.13'}
hasBin: true
peerDependencies:
prettier: '>=2.0.0'
dependencies:
chalk: 3.0.0
execa: 4.1.0
find-up: 4.1.0
ignore: 5.2.4
mri: 1.2.0
multimatch: 4.0.0
prettier: 2.8.3
dev: true
/prismjs/1.29.0:
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
engines: {node: '>=6'}
@ -4741,14 +4837,6 @@ packages:
fsevents: 2.3.2
dev: true
/rollup/3.10.1:
resolution: {integrity: sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
fsevents: 2.3.2
dev: true
/run-parallel/1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
@ -5055,6 +5143,11 @@ packages:
engines: {node: '>=8'}
dev: true
/strip-final-newline/2.0.0:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
dev: true
/strip-final-newline/3.0.0:
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
engines: {node: '>=12'}
@ -5133,12 +5226,10 @@ packages:
tslib: 2.4.1
dev: true
/tailwindcss/3.2.4_postcss@8.4.21:
/tailwindcss/3.2.4:
resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==}
engines: {node: '>=12.13.0'}
hasBin: true
peerDependencies:
postcss: ^8.0.9
dependencies:
arg: 5.0.2
chokidar: 3.5.3