diff --git a/packages/docs/scripts/generate-plugin-docs.ts b/packages/docs/scripts/generate-plugin-docs.ts index 25a680ee3..9b2d40245 100644 --- a/packages/docs/scripts/generate-plugin-docs.ts +++ b/packages/docs/scripts/generate-plugin-docs.ts @@ -93,7 +93,21 @@ for await (const dir of directories) { ] : []; - const argsText = args ? parseFragment('## Shell commands\n\nThis plugin enables argument parsing') : []; + const argsText = args + ? [ + ...parseFragment( + `## Shell commands\n\nThis plugin adds argument parsing for the ${args.binaries ? args.binaries.join(' and ') : pluginName} binary. Configuration:` + ), + ...parseFragment( + `\`\`\`\n${Object.entries(args) + .filter(([key]) => key !== 'binaries') + .map( + ([key, value]) => `${key}: ${typeof value === 'function' ? value.toString() : JSON.stringify(value)}` + ) + .join('\n')}\n\`\`\`` + ), + ] + : []; const tree = u('root', [ frontmatter, diff --git a/packages/docs/src/content/docs/blog/two-years.mdx b/packages/docs/src/content/docs/blog/two-years.mdx index 6685d4831..719d3f7ee 100644 --- a/packages/docs/src/content/docs/blog/two-years.mdx +++ b/packages/docs/src/content/docs/blog/two-years.mdx @@ -96,7 +96,7 @@ And eh.. gotta take my chances: how about [joining this awesome club][6]? ## Acknowledgements -Thanks to Joshua Goldberg for [emoji-blast](https://www.emojiblast.dev)! 🎉 +Thanks to Joshua Goldberg for [emoji-blast][7]! 🎉 [1]: https://www.npmjs.com/package/exportman/v/0.0.1 [2]: /cow-with-orange-scissors-van-gogh-style.webp @@ -104,3 +104,4 @@ Thanks to Joshua Goldberg for [emoji-blast](https://www.emojiblast.dev)! 🎉 [4]: ../features/auto-fix.md [5]: https://github.com/unjs/jiti [6]: /sponsors +[7]: https://www.emojiblast.dev diff --git a/packages/docs/src/content/docs/explanations/plugins.md b/packages/docs/src/content/docs/explanations/plugins.md index 29b3843d1..54d6774bc 100644 --- a/packages/docs/src/content/docs/explanations/plugins.md +++ b/packages/docs/src/content/docs/explanations/plugins.md @@ -7,27 +7,32 @@ sidebar: This page describes why Knip uses plugins and the difference between `config` and `entry` files. -Knip has an extensive and growing [list of built-in plugins][1]. Currently it's -not possible to add custom plugins, but feel free to [request a plugin][2] or -even [write a plugin][3] so others can benefit too. +Knip has an extensive and growing [list of built-in plugins][1]. Feel free to +[request a plugin][2] or even [write a plugin][3] so others can benefit too! -## Enabled +## What does a plugin do? Plugins are enabled if the related package is listed in the list of dependencies in `package.json`. For instance, if `astro` is listed in `dependencies` or -`devDependencies`, then the Astro plugin is enabled. +`devDependencies`, then the Astro plugin is enabled. And this means that this +plugin will: + +- Handle [configuration files][4] like `astro.config.mjs` +- Add [entry files][5] such as `src/pages/**/*.astro` ## Configuration files -Knip uses [entry files][4] as starting points to scan your source code and +Knip uses [entry files][6] as starting points to scan your source code and resolve other internal files and external dependencies. The dependency graph can be statically resolved through the `require` and `import` statements in those source files. However, configuration files reference external dependencies in various ways. Knip uses a plugin for each tool to parse configuration files and find those dependencies. -In this example we look at [Knip's ESLint plugin][5]. The default `config` file -patterns include `.eslintrc.json`. Here's a minimal example: +### Example: ESLint + +In the first example we look at [the ESLint plugin][7]. The default `config` +file patterns include `.eslintrc.json`. Here's a minimal example: ```json title=".eslintrc.json" { @@ -39,12 +44,44 @@ patterns include `.eslintrc.json`. Here's a minimal example: Configuration files like this don't `import` or `require` anything, but they do require the referenced dependencies to be installed. -In this case, the plugin will return the `eslint-config-airbnb`, -`eslint-config-prettier` and `@typescript-eslint/eslint-plugin` dependencies, so -Knip knows they should be listed in `package.json`. +In this case, the plugin will return three dependencies: + +- `eslint-config-airbnb` +- `eslint-config-prettier` +- `@typescript-eslint/eslint-plugin` + +Knip will then look for missing dependencies in `package.json` and report those +as unlisted. And vice versa, if there are any ESLint plugins listed in +`package.json`, but unused, those will be reported as well. + +### Example: Vitest + +The second example uses [the Vitest plugin][7]. Here's a minimal example of a +Vitest configuration file: + +```ts title="vitest.config.ts" +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + coverage: { + provider: 'istanbul', + }, + environment: 'happy-dom', + }, +}); +``` + +The Vitest plugin reads this configuration and return two dependencies: + +- `@vitest/coverage-istanbul` +- `vitest-environment-happy-dom` + +Knip will look for missing and unused dependencies in `package.json` and report +accordingly. Some tools allow configuration to be stored in `package.json`, that's why some -of the relevant plugins contain `package.json` in the list of `config` files. +plugins contain `package.json` in the list of `config` files. :::tip[Summary] @@ -135,7 +172,8 @@ The Angular plugin parses the Angular configuration file. Here's a fragment: "builder": "@angular-devkit/build-angular:browser", "options": { "outputPath": "dist/knip-angular-example", - "main": "src/main.ts" + "main": "src/main.ts", + "tsConfig": "tsconfig.app.json" } } } @@ -147,6 +185,9 @@ The Angular plugin parses the Angular configuration file. Here's a fragment: This will result in `src/main.ts` being added as an entry file (and `@angular-devkit/build-angular` as a referenced dependency). +Additionally, the Angular plugin returns `tsconfig.app.json` as a configuration +file for the TypeScript plugin. + ### GitHub Actions This plugin parses workflow YAML files. This fragment contains three `run` @@ -160,12 +201,17 @@ jobs: - run: npm install - run: node scripts/build.js - run: node --loader tsx scripts/deploy.ts + - run: playwright test -c playwright.web.config.ts + working-dir: e2e ``` From these scripts, the `scripts/build.js` and `scripts/deploy.ts` files will be added as entry files by the GitHub Actions plugin. -Read more about this in [Script Parser][6]. +Additionally, the file `e2e/playwright.web.config.ts` is detected and will be +handed over as a Playwright configuration file. + +Read more about this in [Script Parser][8]. ### webpack @@ -251,6 +297,8 @@ Plugins are configured with two distinct types of files: [1]: ../reference/plugins.md [2]: https://github.com/webpro-nl/knip/issues/483 [3]: ../guides/writing-a-plugin.md -[4]: ./entry-files.md -[5]: ../reference/plugins/eslint.md -[6]: ../features/script-parser.md +[4]: #configuration-files +[5]: #entry-files +[6]: ./entry-files.md +[7]: ../reference/plugins/eslint.md +[8]: ../features/script-parser.md diff --git a/packages/docs/src/content/docs/explanations/why-use-knip.md b/packages/docs/src/content/docs/explanations/why-use-knip.md index ccae58ac8..3143c754f 100644 --- a/packages/docs/src/content/docs/explanations/why-use-knip.md +++ b/packages/docs/src/content/docs/explanations/why-use-knip.md @@ -13,10 +13,14 @@ in complexity and size, automated and comprehensive tooling becomes critical. Knip finds and fixes unused files, exports and dependencies. Deep analysis from [fine-grained entry points][1] based on the actual frameworks -and tooling in your [(mono)repo][2] with [custom module resolution][3], -[configuration file parsers][4], [compilers][5], a [shell script parser][6] and -additional heuristics to maximize coverage for comprehensive and actionable -results. +and tooling in your [(mono)repo][2] for accurate and actionable results. +Advanced features for maximum coverage: + +- [Custom module resolution][3] +- [Configuration file parsers][4] +- [Advanced shell script parser][5] +- [Built-in and custom compilers][6] +- [Auto-fix many issues][7] ::: @@ -38,9 +42,9 @@ code": the same for files, dependencies and exports that you forgot to delete. - Keeping dead code around has a negative value on readability, as it can be misleading and distracting. Even if it serves no purpose it will need to be - maintained (source: [Safe dead code removal → YAGNI][7]). -- Also see [Why are unused dependencies a problem?][8] and [Why are unused - exports a problem?][9]. + maintained (source: [Safe dead code removal → YAGNI][8]). +- Also see [Why are unused dependencies a problem?][9] and [Why are unused + exports a problem?][10]. ## Automation @@ -53,7 +57,7 @@ times better and faster than trying to do it manually. :::tip -Knip not only finds clutter, it can also [clean it][10]! +Knip not only finds clutter, it can also [clean it][7]! Use Knip next to a linter like ESLint or Biome: after removing unused variables inside files, Knip might find even more unused code. Rinse and repeat! @@ -116,10 +120,10 @@ so you can get rid of false positives? A variety of reasons: [2]: ../features/monorepos-and-workspaces.md [3]: ../reference/faq.md#why-doesnt-knip-use-an-existing-module-resolver [4]: ./plugins.md#configuration-files -[5]: ../features/compilers.md -[6]: ../features/script-parser.md -[7]: https://jfmengels.net/safe-dead-code-removal/#yagni-you-arent-gonna-need-it -[8]: ../typescript/unused-dependencies.md#why-are-unused-dependencies-a-problem -[9]: ../typescript/unused-exports.md#why-are-unused-exports-a-problem -[10]: ../features/auto-fix.mdx +[5]: ../features/script-parser.md +[6]: ../features/compilers.md +[7]: ../features/auto-fix.mdx +[8]: https://jfmengels.net/safe-dead-code-removal/#yagni-you-arent-gonna-need-it +[9]: ../typescript/unused-dependencies.md#why-are-unused-dependencies-a-problem +[10]: ../typescript/unused-exports.md#why-are-unused-exports-a-problem [11]: ../reference/jsdoc-tsdoc-tags.md diff --git a/packages/docs/src/content/docs/features/auto-fix.mdx b/packages/docs/src/content/docs/features/auto-fix.mdx index 950171db9..3e4672b09 100644 --- a/packages/docs/src/content/docs/features/auto-fix.mdx +++ b/packages/docs/src/content/docs/features/auto-fix.mdx @@ -210,7 +210,6 @@ Also across any chain of re-exports: ``` - ### Export assignments diff --git a/packages/docs/src/content/docs/features/script-parser.md b/packages/docs/src/content/docs/features/script-parser.md index 9f6e3b0d4..8801adf4b 100644 --- a/packages/docs/src/content/docs/features/script-parser.md +++ b/packages/docs/src/content/docs/features/script-parser.md @@ -2,14 +2,14 @@ title: Script Parser --- -Knip parses shell commands and scripts to find additional dependencies and entry -files in various places: +Knip parses shell commands and scripts to find additional dependencies, entry +files and configuration files in various places: - In [`package.json`][1] - In specific [`config` files][2] - In [source code][3] -Shell scripts can be read and statically analyzed, but not executed. +Shell scripts can be read and statically analyzed, but they're not executed. ## package.json @@ -56,14 +56,17 @@ or parsed by Knip. ### Scripts parsing -When parsing the `scripts` entries of `package.json`, `knip` also detect -dependencies of `-r`, `--require`, `--loader` or `--import` arguments. Example: +When parsing the `scripts` entries of `package.json`, Knip detects dependencies +of `-r`, `--require`, `--loader` or `--import` arguments. It also recognizes +configuration files. Example: ```json { "name": "my-lib", "scripts": { - "start": "node --import tsx/esm run.ts" + "start": "node --import tsx/esm run.ts", + "bundle": "tsup -c tsup.lib.config.ts", + "type-check": "tsc -p tsconfig.app.json" } } ``` @@ -71,6 +74,11 @@ dependencies of `-r`, `--require`, `--loader` or `--import` arguments. Example: This will have `tsx` marked as a referenced dependency, and adds `run.ts` as an entry file. +The following files are also detected as configuration files: + +- `tsup.lib.config.ts` - to be handled by the tsup plugin +- `tsconfig.app.json` - to be handled by the TypeScript plugin + ## Plugins Some plugins also use the script parser to extract entry files and dependencies diff --git a/packages/docs/src/content/docs/index.mdx b/packages/docs/src/content/docs/index.mdx index 6f708bdce..36ddbb2aa 100644 --- a/packages/docs/src/content/docs/index.mdx +++ b/packages/docs/src/content/docs/index.mdx @@ -14,10 +14,6 @@ hero: link: ./overview/getting-started icon: right-arrow variant: primary - - text: 'NEW! Two Years' - link: /blog/two-years - icon: star - variant: secondary - text: View on GitHub link: https://github.com/webpro-nl/knip icon: external @@ -44,9 +40,14 @@ import Contributors from '../../components/Contributors.astro'; Deep analysis from fine-grained entry points based on the actual frameworks - and tooling in your (mono)repo with custom module resolution, configuration - file parsers, compilers, a shell script parser and additional heuristics to - maximize coverage for comprehensive and actionable results. + and tooling in your (mono)repo for accurate and actionable results. + Advanced features for maximum coverage: + + * Custom module resolution + * Configuration file parsers + * Advanced shell script parser + * Built-in and custom ompilers + * Auto-fix many issues @@ -116,19 +117,19 @@ Special thanks to the wonderful people who have contributed to this project: Most recent article first: -- Anthony Pena: - [Knip: l'ultime outil pour faire le ménage dans vos projets!](https://k49.fr.nf/knip-l-ultime-outil-pour-faire-le-menage-dans-vos-projets/) +- [มาทำความสะอาด Project โค้ดของเราด้วย Knip กัน][6] (2024-10-22/Thai) +- Anthony Pena: [Knip: l'ultime outil pour faire le ménage dans vos projets!][7] (2024-10-08/French) -- Taro: [Introducing Knip, a tool for removing unnecessary code from - TypeScript/JavaScript][10] (2024-07-25/Japanese) -- Maddy Miller: [Using Knip to find dead code in a high-traffic git repo][8] +- Taro: [TypeScript/JavaScriptの不要なコードを削除するツール「Knip」の紹介][8] + (2024-07-25/Japanese) +- Maddy Miller: [Using Knip to find dead code in a high-traffic git repo][9] (2023-09-17) -- Josh Goldberg: [Speeding Up Centered Part 4: Unused Code Bloat][9] +- Josh Goldberg: [Speeding Up Centered Part 4: Unused Code Bloat][10] (2023-08-21) - Smashing Magazine: [Knip: An Automated Tool For Finding Unused Files, Exports, - And Dependencies][6] (2023-08-14) + And Dependencies][11] (2023-08-14) - Effective TypeScript: [Recommendation Update: ✂️ Use knip to detect dead code - and types][7] (2023-07-29) + and types][12] (2023-07-29) ## 🧡 Testimonials @@ -136,8 +137,8 @@ Most recent article first: ## Read More -- [Unused dependencies][11] -- [Unused exports][12] +- [Unused dependencies][13] +- [Unused exports][14] [1]: ./explanations/why-use-knip.md [2]: ./sponsors @@ -145,11 +146,15 @@ Most recent article first: [4]: ./guides/troubleshooting.md [5]: https://www.jamesshopland.com [6]: - https://www.smashingmagazine.com/2023/08/knip-automated-tool-find-unused-files-exports-dependencies/ -[7]: https://effectivetypescript.com/2023/07/29/knip/ -[8]: https://madelinemiller.dev/blog/knip-dead-code/ -[9]: + https://engineering.thinknet.co.th/%E0%B8%A1%E0%B8%B2%E0%B8%97%E0%B8%B3%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%AA%E0%B8%B0%E0%B8%AD%E0%B8%B2%E0%B8%94-project-%E0%B9%82%E0%B8%84%E0%B9%89%E0%B8%94%E0%B8%82%E0%B8%AD%E0%B8%87%E0%B9%80%E0%B8%A3%E0%B8%B2%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-knip-%E0%B8%81%E0%B8%B1%E0%B8%99-20dbd65f6b58 +[7]: + https://k49.fr.nf/knip-l-ultime-outil-pour-faire-le-menage-dans-vos-projets/ +[8]: https://tech.basemachina.jp/entry/introduction-knip +[9]: https://madelinemiller.dev/blog/knip-dead-code/ +[10]: https://www.joshuakgoldberg.com/blog/speeding-up-centered-part-4-unused-code-bloat/ -[10]: https://tech.basemachina.jp/entry/introduction-knip -[11]: ./typescript/unused-dependencies.md -[12]: ./typescript/unused-exports.md +[11]: + https://www.smashingmagazine.com/2023/08/knip-automated-tool-find-unused-files-exports-dependencies/ +[12]: https://effectivetypescript.com/2023/07/29/knip/ +[13]: ./typescript/unused-dependencies.md +[14]: ./typescript/unused-exports.md diff --git a/packages/docs/src/content/docs/reference/known-issues.md b/packages/docs/src/content/docs/reference/known-issues.md index 95e943fe5..496fe0017 100644 --- a/packages/docs/src/content/docs/reference/known-issues.md +++ b/packages/docs/src/content/docs/reference/known-issues.md @@ -40,14 +40,14 @@ the target values are not arrays). Potential workarounds: - Rewrite the import in the configuration file to a relative import. -- Use Bun with [knip-bun][6]. -- [Disable the plugin][7] (not recommended, try the other options first). +- Use Bun with [knip-bun][5]. +- [Disable the plugin][6] (not recommended, try the other options first). ## False positives with external libs Knip may report false positives when exports are consumed by external libraries. -Please see [external libs][12]. +Please see [external libs][7]. ## Definitely Typed packages in `dependencies` @@ -72,14 +72,10 @@ similar to how standard ES Modules work. ## `unplugin-icons` imports -[unplugin-icons](https://github.com/antfu/unplugin-icons) uses virtual imports -to import icons from icon sets as components. Knip cannot resolve these imports -and will report them as unused. - -To fix this, you can use the [`paths` configuration option][13] to tell Knip -where to find the icon types. - -For example: +[unplugin-icons][8] uses aliased imports to import icons from icon sets as +components. Knip cannot resolve these imports and will report them as unused. +Use the [`paths` configuration option][9] to tell Knip where to find the icon +types. For example: ```json title="knip.json" { @@ -89,20 +85,16 @@ For example: } ``` -where `[framework]` is the name of the framework you're using (see [this -list][14] for available types). +Where `[framework]` is the name of the framework you're using (see [available +types][10]). [1]: #exceptions-from-config-files [2]: #false-positives-with-external-libs [3]: #definitely-typed-packages-in-dependencies [4]: #extensionless-imports -[5]: https://github.com/unjs/jiti -[6]: ./cli.md#knip-bun -[7]: ./configuration.md#plugins -[8]: https://github.com/unjs/jiti/issues/72 -[9]: https://github.com/unjs/jiti/issues/194 -[10]: https://github.com/unjs/jiti/issues/174 -[11]: https://github.com/webpro-nl/knip/issues/565 -[12]: ../guides/handling-issues.mdx#external-libraries -[13]: ./configuration.md#paths -[14]: https://github.com/unplugin/unplugin-icons/tree/main/types +[5]: ./cli.md#knip-bun +[6]: ./configuration.md#plugins +[7]: ../guides/handling-issues.mdx#external-libraries +[8]: https://github.com/antfu/unplugin-icons +[9]: ./configuration.md#paths +[10]: https://github.com/unplugin/unplugin-icons/tree/main/types diff --git a/packages/docs/src/content/docs/reference/plugins.md b/packages/docs/src/content/docs/reference/plugins.md index 986b22bf3..5cb9d2e8e 100644 --- a/packages/docs/src/content/docs/reference/plugins.md +++ b/packages/docs/src/content/docs/reference/plugins.md @@ -1,5 +1,5 @@ --- -title: Plugins (76) +title: Plugins (84) tableOfContents: false --- @@ -9,78 +9,86 @@ tableOfContents: false - [Astro][2] - [Ava][3] - [Babel][4] -- [Capacitor][5] -- [Changesets][6] -- [Commitizen][7] -- [commitlint][8] -- [CSpell][9] -- [Cucumber][10] -- [Cypress][11] -- [Drizzle][12] -- [Eleventy][13] -- [ESLint][14] -- [Gatsby][15] -- [GitHub Actions][16] -- [GraphQL Codegen][17] -- [husky][18] -- [Jest][19] -- [Ladle][20] -- [Lefthook][21] -- [lint-staged][22] -- [LintHTML][23] -- [lockfile-lint][24] -- [Lost Pixel][25] -- [markdownlint][26] -- [Mocha][27] -- [moonrepo][28] -- [Mock Service Worker][29] -- [Nest][30] -- [Netlify][31] -- [Next.js][32] -- [Node.js Test Runner][33] -- [npm-package-json-lint][34] -- [Nuxt][35] -- [Nx][36] -- [nyc][37] -- [oclif][38] -- [Playwright][39] -- [Playwright for components][40] -- [PostCSS][41] -- [Preconstruct][42] -- [Prettier][43] -- [React Cosmos][44] -- [Release It!][45] -- [Remark][46] -- [Remix][47] -- [Rollup][48] -- [Rsbuild][49] -- [Rspack][50] -- [Semantic Release][51] -- [Sentry][52] -- [simple-git-hooks][53] -- [size-limit][54] -- [Storybook][55] -- [Stryker][56] -- [Stylelint][57] -- [Svelte][58] -- [Syncpack][59] -- [Tailwind][60] -- [tsup][61] -- [TypeDoc][62] -- [TypeScript][63] -- [unbuild][64] -- [UnoCSS][65] -- [Vercel OG][66] -- [Vike][67] -- [Vite][68] -- [Vitest][69] -- [Vue][70] -- [WebdriverIO][71] -- [Webpack][72] -- [Wireit][73] -- [Wrangler][74] -- [xo][75] -- [yorkie][76] +- [c8][5] +- [Capacitor][6] +- [Changesets][7] +- [Commitizen][8] +- [commitlint][9] +- [CSpell][10] +- [Cucumber][11] +- [Cypress][12] +- [dotenv][13] +- [Drizzle][14] +- [Eleventy][15] +- [ESLint][16] +- [Gatsby][17] +- [GitHub Actions][18] +- [GraphQL Codegen][19] +- [husky][20] +- [Jest][21] +- [Ladle][22] +- [Lefthook][23] +- [lint-staged][24] +- [LintHTML][25] +- [lockfile-lint][26] +- [Lost Pixel][27] +- [markdownlint][28] +- [Mocha][29] +- [moonrepo][30] +- [Mock Service Worker][31] +- [Nest][32] +- [Netlify][33] +- [Next.js][34] +- [Node.js][35] +- [Node.js Test Runner][36] +- [nodemon][37] +- [npm-package-json-lint][38] +- [Nuxt][39] +- [Nx][40] +- [nyc][41] +- [oclif][42] +- [Playwright][43] +- [Playwright for components][44] +- [playwright-test][45] +- [PostCSS][46] +- [Preconstruct][47] +- [Prettier][48] +- [React Cosmos][49] +- [Release It!][50] +- [Remark][51] +- [Remix][52] +- [Rollup][53] +- [Rsbuild][54] +- [Rspack][55] +- [Semantic Release][56] +- [Sentry][57] +- [simple-git-hooks][58] +- [size-limit][59] +- [Storybook][60] +- [Stryker][61] +- [Stylelint][62] +- [Svelte][63] +- [Syncpack][64] +- [Tailwind][65] +- [Travis CI][66] +- [ts-node][67] +- [tsup][68] +- [tsx][69] +- [TypeDoc][70] +- [TypeScript][71] +- [unbuild][72] +- [UnoCSS][73] +- [Vercel OG][74] +- [Vike][75] +- [Vite][76] +- [Vitest][77] +- [Vue][78] +- [WebdriverIO][79] +- [Webpack][80] +- [Wireit][81] +- [Wrangler][82] +- [xo][83] +- [yorkie][84] ::: @@ -88,75 +96,83 @@ tableOfContents: false [2]: /reference/plugins/astro 'Astro' [3]: /reference/plugins/ava 'Ava' [4]: /reference/plugins/babel 'Babel' -[5]: /reference/plugins/capacitor 'Capacitor' -[6]: /reference/plugins/changesets 'Changesets' -[7]: /reference/plugins/commitizen 'Commitizen' -[8]: /reference/plugins/commitlint 'commitlint' -[9]: /reference/plugins/cspell 'CSpell' -[10]: /reference/plugins/cucumber 'Cucumber' -[11]: /reference/plugins/cypress 'Cypress' -[12]: /reference/plugins/drizzle 'Drizzle' -[13]: /reference/plugins/eleventy 'Eleventy' -[14]: /reference/plugins/eslint 'ESLint' -[15]: /reference/plugins/gatsby 'Gatsby' -[16]: /reference/plugins/github-actions 'GitHub Actions' -[17]: /reference/plugins/graphql-codegen 'GraphQL Codegen' -[18]: /reference/plugins/husky 'husky' -[19]: /reference/plugins/jest 'Jest' -[20]: /reference/plugins/ladle 'Ladle' -[21]: /reference/plugins/lefthook 'Lefthook' -[22]: /reference/plugins/lint-staged 'lint-staged' -[23]: /reference/plugins/linthtml 'LintHTML' -[24]: /reference/plugins/lockfile-lint 'lockfile-lint' -[25]: /reference/plugins/lost-pixel 'Lost Pixel' -[26]: /reference/plugins/markdownlint 'markdownlint' -[27]: /reference/plugins/mocha 'Mocha' -[28]: /reference/plugins/moonrepo 'moonrepo' -[29]: /reference/plugins/msw 'Mock Service Worker' -[30]: /reference/plugins/nest 'Nest' -[31]: /reference/plugins/netlify 'Netlify' -[32]: /reference/plugins/next 'Next.js' -[33]: /reference/plugins/node-test-runner 'Node.js Test Runner' -[34]: /reference/plugins/npm-package-json-lint 'npm-package-json-lint' -[35]: /reference/plugins/nuxt 'Nuxt' -[36]: /reference/plugins/nx 'Nx' -[37]: /reference/plugins/nyc 'nyc' -[38]: /reference/plugins/oclif 'oclif' -[39]: /reference/plugins/playwright 'Playwright' -[40]: /reference/plugins/playwright-ct 'Playwright for components' -[41]: /reference/plugins/postcss 'PostCSS' -[42]: /reference/plugins/preconstruct 'Preconstruct' -[43]: /reference/plugins/prettier 'Prettier' -[44]: /reference/plugins/react-cosmos 'React Cosmos' -[45]: /reference/plugins/release-it 'Release It!' -[46]: /reference/plugins/remark 'Remark' -[47]: /reference/plugins/remix 'Remix' -[48]: /reference/plugins/rollup 'Rollup' -[49]: /reference/plugins/rsbuild 'Rsbuild' -[50]: /reference/plugins/rspack 'Rspack' -[51]: /reference/plugins/semantic-release 'Semantic Release' -[52]: /reference/plugins/sentry 'Sentry' -[53]: /reference/plugins/simple-git-hooks 'simple-git-hooks' -[54]: /reference/plugins/size-limit 'size-limit' -[55]: /reference/plugins/storybook 'Storybook' -[56]: /reference/plugins/stryker 'Stryker' -[57]: /reference/plugins/stylelint 'Stylelint' -[58]: /reference/plugins/svelte 'Svelte' -[59]: /reference/plugins/syncpack 'Syncpack' -[60]: /reference/plugins/tailwind 'Tailwind' -[61]: /reference/plugins/tsup 'tsup' -[62]: /reference/plugins/typedoc 'TypeDoc' -[63]: /reference/plugins/typescript 'TypeScript' -[64]: /reference/plugins/unbuild 'unbuild' -[65]: /reference/plugins/unocss 'UnoCSS' -[66]: /reference/plugins/vercel-og 'Vercel OG' -[67]: /reference/plugins/vike 'Vike' -[68]: /reference/plugins/vite 'Vite' -[69]: /reference/plugins/vitest 'Vitest' -[70]: /reference/plugins/vue 'Vue' -[71]: /reference/plugins/webdriver-io 'WebdriverIO' -[72]: /reference/plugins/webpack 'Webpack' -[73]: /reference/plugins/wireit 'Wireit' -[74]: /reference/plugins/wrangler 'Wrangler' -[75]: /reference/plugins/xo 'xo' -[76]: /reference/plugins/yorkie 'yorkie' +[5]: /reference/plugins/c8 'c8' +[6]: /reference/plugins/capacitor 'Capacitor' +[7]: /reference/plugins/changesets 'Changesets' +[8]: /reference/plugins/commitizen 'Commitizen' +[9]: /reference/plugins/commitlint 'commitlint' +[10]: /reference/plugins/cspell 'CSpell' +[11]: /reference/plugins/cucumber 'Cucumber' +[12]: /reference/plugins/cypress 'Cypress' +[13]: /reference/plugins/dotenv 'dotenv' +[14]: /reference/plugins/drizzle 'Drizzle' +[15]: /reference/plugins/eleventy 'Eleventy' +[16]: /reference/plugins/eslint 'ESLint' +[17]: /reference/plugins/gatsby 'Gatsby' +[18]: /reference/plugins/github-actions 'GitHub Actions' +[19]: /reference/plugins/graphql-codegen 'GraphQL Codegen' +[20]: /reference/plugins/husky 'husky' +[21]: /reference/plugins/jest 'Jest' +[22]: /reference/plugins/ladle 'Ladle' +[23]: /reference/plugins/lefthook 'Lefthook' +[24]: /reference/plugins/lint-staged 'lint-staged' +[25]: /reference/plugins/linthtml 'LintHTML' +[26]: /reference/plugins/lockfile-lint 'lockfile-lint' +[27]: /reference/plugins/lost-pixel 'Lost Pixel' +[28]: /reference/plugins/markdownlint 'markdownlint' +[29]: /reference/plugins/mocha 'Mocha' +[30]: /reference/plugins/moonrepo 'moonrepo' +[31]: /reference/plugins/msw 'Mock Service Worker' +[32]: /reference/plugins/nest 'Nest' +[33]: /reference/plugins/netlify 'Netlify' +[34]: /reference/plugins/next 'Next.js' +[35]: /reference/plugins/node 'Node.js' +[36]: /reference/plugins/node-test-runner 'Node.js Test Runner' +[37]: /reference/plugins/nodemon 'nodemon' +[38]: /reference/plugins/npm-package-json-lint 'npm-package-json-lint' +[39]: /reference/plugins/nuxt 'Nuxt' +[40]: /reference/plugins/nx 'Nx' +[41]: /reference/plugins/nyc 'nyc' +[42]: /reference/plugins/oclif 'oclif' +[43]: /reference/plugins/playwright 'Playwright' +[44]: /reference/plugins/playwright-ct 'Playwright for components' +[45]: /reference/plugins/playwright-test 'playwright-test' +[46]: /reference/plugins/postcss 'PostCSS' +[47]: /reference/plugins/preconstruct 'Preconstruct' +[48]: /reference/plugins/prettier 'Prettier' +[49]: /reference/plugins/react-cosmos 'React Cosmos' +[50]: /reference/plugins/release-it 'Release It!' +[51]: /reference/plugins/remark 'Remark' +[52]: /reference/plugins/remix 'Remix' +[53]: /reference/plugins/rollup 'Rollup' +[54]: /reference/plugins/rsbuild 'Rsbuild' +[55]: /reference/plugins/rspack 'Rspack' +[56]: /reference/plugins/semantic-release 'Semantic Release' +[57]: /reference/plugins/sentry 'Sentry' +[58]: /reference/plugins/simple-git-hooks 'simple-git-hooks' +[59]: /reference/plugins/size-limit 'size-limit' +[60]: /reference/plugins/storybook 'Storybook' +[61]: /reference/plugins/stryker 'Stryker' +[62]: /reference/plugins/stylelint 'Stylelint' +[63]: /reference/plugins/svelte 'Svelte' +[64]: /reference/plugins/syncpack 'Syncpack' +[65]: /reference/plugins/tailwind 'Tailwind' +[66]: /reference/plugins/travis 'Travis CI' +[67]: /reference/plugins/ts-node 'ts-node' +[68]: /reference/plugins/tsup 'tsup' +[69]: /reference/plugins/tsx 'tsx' +[70]: /reference/plugins/typedoc 'TypeDoc' +[71]: /reference/plugins/typescript 'TypeScript' +[72]: /reference/plugins/unbuild 'unbuild' +[73]: /reference/plugins/unocss 'UnoCSS' +[74]: /reference/plugins/vercel-og 'Vercel OG' +[75]: /reference/plugins/vike 'Vike' +[76]: /reference/plugins/vite 'Vite' +[77]: /reference/plugins/vitest 'Vitest' +[78]: /reference/plugins/vue 'Vue' +[79]: /reference/plugins/webdriver-io 'WebdriverIO' +[80]: /reference/plugins/webpack 'Webpack' +[81]: /reference/plugins/wireit 'Wireit' +[82]: /reference/plugins/wrangler 'Wrangler' +[83]: /reference/plugins/xo 'xo' +[84]: /reference/plugins/yorkie 'yorkie'