UNPKG

39.7 kBMarkdownView Raw
1<p style="text-align: center; background: white;">
2 <a href="https://leanupjs.org">
3 <img src="https://leanupjs.org/assets/logo.svg" height="100">
4 </a><br>
5 <h2 style="text-align: center;">
6 <cite><b>Make things pure</b> ... to become lean.</cite>
7 </h2>
8</p>
9<!-- <iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/du_BnIZzEKs" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="true"></iframe> -->
10<hr>
11
12[![downloads][downloads]][downloads-url]
13[![npm][npm]][npm-url]
14[![license][license]][license-url]
15
16[![dependencies][dependencies]][dependencies-url]
17[![devDependencies][devdependencies]][devdependencies-url]
18[![peerDependencies][peerdependencies]][peerdependencies-url]
19[![optionalDependencies][optionaldependencies]][optionaldependencies-url]
20
21[![vulnerabilities][vulnerabilities]][vulnerabilities-url]
22[![install-size][install-size]][install-size-url]
23
24[![lernajs][lernajs]][lernajs-url]
25[![prettier][prettier]][prettier-url]
26
27[leanup]: https://leanupjs.org/assets/logo.svg
28[leanup-url]: https://leanupjs.org
29[downloads]: https://img.shields.io/npm/dt/@leanup/cli.svg
30[downloads-url]: https://npmcharts.com/compare/@leanup/cli
31[npm]: https://img.shields.io/npm/v/@leanup/cli
32[npm-url]: https://www.npmjs.com/package/@leanup/cli
33[license]: https://img.shields.io/npm/l/@leanup/cli
34[license-url]: https://github.com/leanupjs/leanup/blob/master/LICENSE
35[dependencies]: https://status.david-dm.org/gh/leanupjs/leanup.svg?path=packages/cli/core&ref=release/1.2
36[dependencies-url]: https://david-dm.org/leanupjs/leanup?path=packages/cli/core&ref=release/1.2
37[devdependencies]: https://status.david-dm.org/gh/leanupjs/leanup.svg?path=packages/cli/core&ref=release/1.2&type=dev
38[devdependencies-url]: https://david-dm.org/leanupjs/leanup?path=packages/cli/core&ref=release/1.2&type=dev
39[peerdependencies]: https://status.david-dm.org/gh/leanupjs/leanup.svg?path=packages/cli/core&ref=release/1.2&type=peer
40[peerdependencies-url]: https://david-dm.org/leanupjs/leanup?path=packages/cli/core&ref=release/1.2&type=peer
41[optionaldependencies]: https://status.david-dm.org/gh/leanupjs/leanup.svg?path=packages/cli/core&ref=release/1.2&type=optional
42[optionaldependencies-url]: https://david-dm.org/leanupjs/leanup?path=packages/cli/core&ref=release/1.2&type=optional
43[vulnerabilities]: https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli
44[vulnerabilities-url]: https://snyk.io/test/npm/@leanup/cli
45[install-size]: https://packagephobia.now.sh/badge?p=@leanup/cli@next
46[install-size-url]: https://packagephobia.now.sh/result?p=@leanup/cli@next
47[lernajs]: https://img.shields.io/badge/managed%20with-lerna-blueviolet
48[lernajs-url]: https://lerna.js.org
49[prettier]: https://img.shields.io/badge/code_style-prettier-ff69b4.svg
50[prettier-url]: https://prettier.io
51
52<h1>leanup<sup style="color: grey; font-size: 75%"> CLI</sup></h1>
53
54The **`@leanup` CLI** contains all required popular tools in there minimal default, transparent and extensible configuration to develop JavaScript/TypeScript web applications.
55
56- [Motivation](#motivation)
57- [Principles](#principles)
58- [Demo](#demo)
59- [Installation](#installation)
60- [Features](#features)
61- [Structure](#structure)
62 - [Frameworks](#frameworks)
63 - [Extensions](#extensions)
64 - [Thinks](#thinks)
65- [Replaced environment variables](#replaced-environment-variables)
66- [Dependencies](#dependencies)
67- [Peer dependencies](#peer-dependencies)
68- [Optional tools](#optional-tools)
69
70## Motivation
71
72- Learnability
73- Controllability
74- Universality
75- Flexibility
76- Scalability
77- Durability
78- Transparency
79
80## Principles
81
82- convention over configuration
83- pure commands under the hood
84- don't repeat yourself
85- following the generic instead of the influenced way
86- keep the dependencies always up to date
87
88## Demo
89
90There are some working examples:
91
92- [https://github.modevel.de/poc/](https://github.modevel.de/poc/)
93- [PoC - Flexible web application architecture](https://github.com/martinoppitz/poc-flexible-web-application-architecture#readme)
94- [Hello World - Comparison](https://github.com/martinoppitz/hello-world-comparison#readme)
95
96## Installation
97
98To install the **`@leanup` CLI** execute the following command:
99
100> `npm install @leanup/cli typescript --save-dev`
101
102And a non-framework or framework strategy must also be selected:
103
104Non-framework:
105
106> `npm install @leanup/cli-vanilla --save-dev`
107
108Or with framework:
109
110`npm install @leanup/cli-angular --save-dev` or<br>
111`npm install @leanup/cli-angularjs --save-dev` or<br>
112`npm install @leanup/cli-aurelia --save-dev` or<br>
113`npm install @leanup/cli-inferno --save-dev` or<br>
114`npm install @leanup/cli-lit-element --save-dev` or<br>
115`npm install @leanup/cli-preact --save-dev` or<br>
116`npm install @leanup/cli-react --save-dev` or<br>
117`npm install @leanup/cli-svelte --save-dev` or<br>
118`npm install @leanup/cli-vue --save-dev` or<br>
119`npm install @leanup/cli-vue3 --save-dev`
120
121Install the peer dependencies `chromedriver`, `geckodriver` or `selenium-server` in the required version, if you need that features.
122
123- `npm install chromedriver --save-dev`
124- `npm install geckodriver --save-dev`
125- `npm install selenium-server--save-dev`
126
127## Features
128
129| Tool/Technology | Description | Status | Note | Rating |
130| ---------------- | :---------------: | :----: | :------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
131| [TypeScript] | Language | ✔️ | ready | [![typescript](https://snyk.io/advisor/npm-package/typescript/badge.svg)](https://snyk.io/advisor/npm-package/typescript) |
132| [Webpack] | Bundler | ✔️ | ready | [![webpack](https://snyk.io/advisor/npm-package/webpack/badge.svg)](https://snyk.io/advisor/npm-package/webpack) |
133| [Snowpack] | Bundler | ⌛ | in progress | [![webpack](https://snyk.io/advisor/npm-package/snowpack/badge.svg)](https://snyk.io/advisor/npm-package/snowpack) |
134| [Vite] | Bundler | ⌛ | in progress | [![webpack](https://snyk.io/advisor/npm-package/vite/badge.svg)](https://snyk.io/advisor/npm-package/vite) |
135| [ESBuild] | Transpiler | ✔️ | ready | [![esbuild](https://snyk.io/advisor/npm-package/esbuild/badge.svg)](https://snyk.io/advisor/npm-package/esbuild) |
136| [Babel] | Transpiler | ✔️ | ready | [![@babel/core](https://snyk.io/advisor/npm-package/@babel/core/badge.svg)](https://snyk.io/advisor/npm-package/@babel/core) |
137| [Mocha] | Unit-Test-Runner | ✔️ | ready | [![mocha](https://snyk.io/advisor/npm-package/mocha/badge.svg)](https://snyk.io/advisor/npm-package/mocha) |
138| [Chai] | Assertion | ✔️ | ready | [![chai](https://snyk.io/advisor/npm-package/typescript/badge.svg)](https://snyk.io/advisor/npm-package/chai) |
139| [Sinon] | Mocking | ✔️ | ready | [![sinon](https://snyk.io/advisor/npm-package/sinon/badge.svg)](https://snyk.io/advisor/npm-package/sinon) |
140| [NYC] | Code-Coverage | ✔️ | ready | [![nyc](https://snyk.io/advisor/npm-package/nyc/badge.svg)](https://snyk.io/advisor/npm-package/nyc) |
141| [ESLint] | Code-Checker | ✔️ | ready | [![eslint](https://snyk.io/advisor/npm-package/eslint/badge.svg)](https://snyk.io/advisor/npm-package/eslint) |
142| [Nightwatch.js] | E2E-Test-Runner | ✔️ | ready | [![nightwatch](https://snyk.io/advisor/npm-package/nightwatch/badge.svg)](https://snyk.io/advisor/npm-package/nightwatch) |
143| [Allsure] | Report | ✔️ | ready |
144| [Cucumber] | BDD | ✔️ | ready | [![cucumber](https://snyk.io/advisor/npm-package/cucumber/badge.svg)](https://snyk.io/advisor/npm-package/cucumber) |
145| [robotframework] | BDD | ⌛ | will be evaluated | |
146| [Storybook] | Documentation | ⌛ | in progress | [![storybook](https://snyk.io/advisor/npm-package/storybook/badge.svg)](https://snyk.io/advisor/npm-package/storybook) |
147| [OpenAPI] | API | ✔️ | ready | |
148| [GraphQL] | API | ✔️ | ready | [![graphql](https://snyk.io/advisor/npm-package/graphql/badge.svg)](https://snyk.io/advisor/npm-package/graphql) |
149| [Workbox] | PWA | ✔️ | ready | [![workbox](https://snyk.io/advisor/npm-package/workbox/badge.svg)](https://snyk.io/advisor/npm-package/workbox) |
150| [Lerna] | Mono-Repo | ✔️ | ready | [![lerna](https://snyk.io/advisor/npm-package/lerna/badge.svg)](https://snyk.io/advisor/npm-package/lerna) |
151| [Ant-Design] | Design-System | ✔️ | proved | [![antd](https://snyk.io/advisor/npm-package/antd/badge.svg)](https://snyk.io/advisor/npm-package/antd) |
152| [Bootstrap] | Design-System | ✔️ | proved | [![bootstrap](https://snyk.io/advisor/npm-package/bootstrap/badge.svg)](https://snyk.io/advisor/npm-package/bootstrap) |
153| [Material] | Design-System | ✔️ | proved | [![@material/textfield](https://snyk.io/advisor/npm-package/@material/textfield/badge.svg)](https://snyk.io/advisor/npm-package/@material/textfield) |
154| [Tailwindcss] | Design-System | ✔️ | proved | [![tailwindcss](https://snyk.io/advisor/npm-package/tailwindcss/badge.svg)](https://snyk.io/advisor/npm-package/tailwindcss) |
155| [WindiCSS] | Design-System | ✔️ | proved | [![tailwindcss](https://snyk.io/advisor/npm-package/windicss/badge.svg)](https://snyk.io/advisor/npm-package/windicss) |
156| [Nexus IQ] | Vulnerabiliy-Gate | ✔️ | ready | |
157| [Less] | CSS | ✔️ | ready | [![less](https://snyk.io/advisor/npm-package/less/badge.svg)](https://snyk.io/advisor/npm-package/less) |
158| [Sass] | CSS | ✔️ | ready | [![sass](https://snyk.io/advisor/npm-package/sass/badge.svg)](https://snyk.io/advisor/npm-package/sass) |
159| [PostCSS] | CSS | ✔️ | ready | [![postcss](https://snyk.io/advisor/npm-package/postcss/badge.svg)](https://snyk.io/advisor/npm-package/postcss) |
160| [TSArch] | Architecture | ⌛ | in progress | [![hint](https://snyk.io/advisor/npm-package/tsarch/badge.svg)](https://snyk.io/advisor/npm-package/tsarch) |
161| [Webhint] | Webhint | ✔️ | moved \*\*\* | [![hint](https://snyk.io/advisor/npm-package/hint/badge.svg)](https://snyk.io/advisor/npm-package/hint) |
162| [TestCafe] | E2E-Test-Runner | ⌛ | will be evaluated \*\*\*\* | [![testcafe](https://snyk.io/advisor/npm-package/testcafe/badge.svg)](https://snyk.io/advisor/npm-package/typescript) |
163| [TSLint] | Code-Checker | ❌ | removed \*\* | [![tslint](https://snyk.io/advisor/npm-package/tslint/badge.svg)](https://snyk.io/advisor/npm-package/tslint) |
164| [Cypress] | E2E-Test-Runner | ❌ | excluded \* | [![cypress](https://snyk.io/advisor/npm-package/cypress/badge.svg)](https://snyk.io/advisor/npm-package/cypress) |
165
166> \*
167> Arguments agains [Cypress]:
168>
169> - reinvent wheel
170> - detect css selectors
171> - BDD test syntax
172> - principals
173> - large tooling
174> - a lot of binaries
175> - many dependencies
176> - ci integration vs selenium hub
177>
178> It is difficult to keep focus with Cypress as it is more a nice tool than an effective tool. It is expected that a lot of time will be invested to justify the requirements of a project.
179
180> \*\* TSLint is deprecated.
181
182> \*\*\* Webhint is not practical for the development of components, since component tags often have no relation to standard HTML. In addition, the webhint package alone is over 100 MB in size. I have good by using a IDE webhint plugin, like [VSCode webhint](https://marketplace.visualstudio.com/items?itemName=webhint.vscode-webhint).
183
184> \*\*\*\* [TestCafe] The idea that defined TestCafe architecture was that you don't really need an external driver to run end-to-end tests in the browser. That's interesting.
185
186## Structure
187
188Vanilla Java-/TypeScript are supported by default. That means for example custom elements and any plain Java-/TypeScript code.
189
190- [`@leanup/cli`](https://www.npmjs.com/package/@leanup/cli) ✔️
191- [`@leanup/cli-vanilla`](https://www.npmjs.com/package/@leanup/cli-vanilla) (optional) ✔️ [![vulnerabilities of @leanup/cli-vanilla](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-vanilla)](https://snyk.io/test/npm/@leanup/cli-vanilla)
192
193### Frameworks
194
195Vanilla Java-/TypeScript are supported by default. That means for example custom elements and any plain Java-/TypeScript code.
196
197The selection of the following frameworks depends in parts on the following references:
198
199- [report](https://ashleynolan.co.uk/blog/frontend-tooling-survey-2019-results#js-framework-essential),
200- [benchmark](https://krausest.github.io/js-framework-benchmark/2020/table_chrome_80.html) and
201- [survey](https://2019.stateofjs.com/front-end-frameworks)
202
203Currently the following framework extensions are available:
204
205- [`@leanup/cli-angular`](https://www.npmjs.com/package/@leanup/cli-angular) ✔️ [![vulnerabilities of @leanup/cli-angular](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-angular)](https://snyk.io/test/npm/@leanup/cli-angular)
206- [`@leanup/cli-angularjs`](https://www.npmjs.com/package/@leanup/cli-angularjs) ✔️ [![vulnerabilities of @leanup/cli-angularjs](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-angularjs)](https://snyk.io/test/npm/@leanup/cli-angularjs)
207- [`@leanup/cli-aurelia`](https://www.npmjs.com/package/@leanup/cli-aurelia) ✔️ [![vulnerabilities of @leanup/cli-aurelia](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-aurelia)](https://snyk.io/test/npm/@leanup/cli-aurelia)
208- [`@leanup/cli-inferno`](https://www.npmjs.com/package/@leanup/cli-inferno) ✔️ [![vulnerabilities of @leanup/cli-inferno](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-inferno)](https://snyk.io/test/npm/@leanup/cli-inferno)
209- [`@leanup/cli-lit-element`](https://www.npmjs.com/package/@leanup/cli-lit-element) ✔️ [![vulnerabilities of @leanup/cli-lit-element](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-lit-element)](https://snyk.io/test/npm/@leanup/cli-lit-element)
210- [`@leanup/cli-preact`](https://www.npmjs.com/package/@leanup/cli-preact) ✔️ [![vulnerabilities of @leanup/cli-preact](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-preact)](https://snyk.io/test/npm/@leanup/cli-preact)
211- [`@leanup/cli-react`](https://www.npmjs.com/package/@leanup/cli-react) ✔️ [![vulnerabilities of @leanup/cli-react](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-react)](https://snyk.io/test/npm/@leanup/cli-react)
212- [`@leanup/cli-svelte`](https://www.npmjs.com/package/@leanup/cli-svelte) ✔️ [![vulnerabilities of @leanup/cli-svelte](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-svelte)](https://snyk.io/test/npm/@leanup/cli-svelte)
213- [`@leanup/cli-vue`](https://www.npmjs.com/package/@leanup/cli-vue) ✔️ [![vulnerabilities of @leanup/cli-vue](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-vue)](https://snyk.io/test/npm/@leanup/cli-vue)
214- [`@leanup/cli-vue3`](https://www.npmjs.com/package/@leanup/cli-vue3) ✔️ (RC) [![vulnerabilities of @leanup/cli-vue3](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-vue3)](https://snyk.io/test/npm/@leanup/cli-vue3)
215
216### Extensions
217
218A separate package contains some nice but not required addons for webpack.
219
220- [`@leanup/cli-addons`](https://www.npmjs.com/package/@leanup/cli-addons) ✔️ [![vulnerabilities of @leanup/cli-addons](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-addons)](https://snyk.io/test/npm/@leanup/cli-addons)
221- [`@leanup/cli-cucumber`](https://www.npmjs.com/package/@leanup/cli-cucumber) ✔️ [![vulnerabilities of @leanup/cli-cucumber](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-cucumber)](https://snyk.io/test/npm/@leanup/cli-cucumber)
222- [`@leanup/cli-graphql`](https://www.npmjs.com/package/@leanup/cli-graphql) ✔️ [![vulnerabilities of @leanup/cli-graphql](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-graphql)](https://snyk.io/test/npm/@leanup/cli-cucumber)
223- [`@leanup/cli-pwa`](https://www.npmjs.com/package/@leanup/cli-pwa) ✔️ [![vulnerabilities of @leanup/cli-pwa](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-pwa)](https://snyk.io/test/npm/@leanup/cli-pwa)
224- [`@leanup/cli-webhint`](https://www.npmjs.com/package/@leanup/cli-webhint) ✔️ [![vulnerabilities of @leanup/cli-webhint](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/cli-webhint)](https://snyk.io/test/npm/@leanup/cli-webhint)
225
226### Thinks
227
228There a separate packages for important application features.
229
230- [`@leanup/git-hooks`](https://www.npmjs.com/package/@leanup/git-hooks) ✔️ [![vulnerabilities of autoprefixer](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/git-hooks)](https://snyk.io/test/npm/@leanup/git-hooks)
231- [`@leanup/form`](https://www.npmjs.com/package/@leanup/form) ✔️ [![vulnerabilities of autoprefixer](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/form)](https://snyk.io/test/npm/@leanup/form)
232- [`@leanup/lib`](https://www.npmjs.com/package/@leanup/lib) ✔️ [![vulnerabilities of autoprefixer](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/lib)](https://snyk.io/test/npm/@leanup/lib)
233- @leanup/ul ⌛
234
235## Replaced environment variables
236
237The following variable names are replaced by the values from `package.json` file in the bundle:
238
239| Name | Description |
240| ------------ | ----------------------------------------------------------------- |
241| APP_AUTHER | The value of the `author` attribute from the package.json file. |
242| APP_HOMEPAGE | The value of the `homepage` attribute from the package.json file. |
243| APP_NAME | The value of the `name` attribute from the package.json file. |
244| APP_VERSION | The value of the `version` attribute from the package.json file. |
245| NODE_ENV | The value of the `version` attribute from the package.json file. |
246
247**For example:**
248
249`package.json`:
250
251```json
252{
253 "name": "@scope/my-app",
254 "version": "1.1.0",
255 "description": "This CLI brings along all required tools to serve, test and build multi framework SPAs",
256 "author": "Martin Oppitz <npmjs@martinoppitz.com>",
257 "homepage": "https://leanupjs.org",
258 ...
259```
260
261App code:
262
263```js
264const APP_METADATA = {
265 author: '$$APP_AUTHER$$',
266 homepage: '$$APP_HOMEPAGE$$',
267 name: '$$APP_NAME$$',
268 version: '$$APP_VERSION$$',
269 environment: '$$NODE_ENV$$', // development | test | production ⌛
270};
271console.log(APP_METADATA);
272```
273
274<!-- | $1 | [![install size of $1](https://packagephobia.now.sh/badge?p=$1)](https://packagephobia.now.sh/result?p=$1) | [![vulnerabilities of $1](https://img.shields.io/snyk/vulnerabilities/npm/$1)](https://snyk.io/test/npm/$1) | -->
275
276## Dependencies
277
278| Package | Size | Vulnerabilities |
279| --------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
280| @babel/core | [![install size of @babel/core](https://packagephobia.now.sh/badge?p=@babel/core)](https://packagephobia.now.sh/result?p=@babel/core) | [![vulnerabilities of @babel/core](https://img.shields.io/snyk/vulnerabilities/npm/@babel/core)](https://snyk.io/test/npm/@babel/core) |
281| @babel/plugin-proposal-class-properties | [![install size of @babel/plugin-proposal-class-properties](https://packagephobia.now.sh/badge?p=@babel/plugin-proposal-class-properties)](https://packagephobia.now.sh/result?p=@babel/plugin-proposal-class-properties) | [![vulnerabilities of @babel/plugin-proposal-class-properties](https://img.shields.io/snyk/vulnerabilities/npm/@babel/plugin-proposal-class-properties)](https://snyk.io/test/npm/@babel/plugin-proposal-class-properties) |
282| @babel/plugin-proposal-decorators | [![install size of @babel/plugin-proposal-decorators](https://packagephobia.now.sh/badge?p=@babel/plugin-proposal-decorators)](https://packagephobia.now.sh/result?p=@babel/plugin-proposal-decorators) | [![vulnerabilities of @babel/plugin-proposal-decorators](https://img.shields.io/snyk/vulnerabilities/npm/@babel/plugin-proposal-decorators)](https://snyk.io/test/npm/@babel/plugin-proposal-decorators) |
283| @babel/preset-env | [![install size of @babel/preset-env](https://packagephobia.now.sh/badge?p=@babel/preset-env)](https://packagephobia.now.sh/result?p=@babel/preset-env) | [![vulnerabilities of @babel/preset-env](https://img.shields.io/snyk/vulnerabilities/npm/@babel/preset-env)](https://snyk.io/test/npm/@babel/preset-env) |
284| @babel/preset-typescript | [![install size of @babel/preset-typescript](https://packagephobia.now.sh/badge?p=@babel/preset-typescript)](https://packagephobia.now.sh/result?p=@babel/preset-typescript) | [![vulnerabilities of @babel/preset-typescript](https://img.shields.io/snyk/vulnerabilities/npm/@babel/preset-typescript)](https://snyk.io/test/npm/@babel/preset-typescript) |
285| @types/node | [![install size of @types/node](https://packagephobia.now.sh/badge?p=@types/node)](https://packagephobia.now.sh/result?p=@types/node) | [![vulnerabilities of @types/node](https://img.shields.io/snyk/vulnerabilities/npm/@types/node)](https://snyk.io/test/npm/@types/node) |
286| babel-loader | [![install size of babel-loader](https://packagephobia.now.sh/badge?p=babel-loader)](https://packagephobia.now.sh/result?p=babel-loader) | [![vulnerabilities of babel-loader](https://img.shields.io/snyk/vulnerabilities/npm/babel-loader)](https://snyk.io/test/npm/babel-loader) |
287| chalk | [![install size of chai](https://packagephobia.now.sh/badge?p=chalk)](https://packagephobia.now.sh/result?p=chalk) | [![vulnerabilities of chalk](https://img.shields.io/snyk/vulnerabilities/npm/chalk)](https://snyk.io/test/npm/chalk) |
288| commander | [![install size of commander](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) | [![vulnerabilities of commander](https://img.shields.io/snyk/vulnerabilities/npm/commander)](https://snyk.io/test/npm/commander) |
289| copy-modules-webpack-plugin | [![install size of copy-modules-webpack-plugin](https://packagephobia.now.sh/badge?p=copy-modules-webpack-plugin)](https://packagephobia.now.sh/result?p=copy-modules-webpack-plugin) | [![vulnerabilities of copy-modules-webpack-plugin](https://img.shields.io/snyk/vulnerabilities/npm/copy-modules-webpack-plugin)](https://snyk.io/test/npm/copy-modules-webpack-plugin) |
290| css-loader | [![install size of css-loader](https://packagephobia.now.sh/badge?p=css-loader)](https://packagephobia.now.sh/result?p=css-loader) | [![vulnerabilities of css-loader](https://img.shields.io/snyk/vulnerabilities/npm/css-loader)](https://snyk.io/test/npm/css-loader) |
291| esbuild-loader | [![install size of esbuild-loader](https://packagephobia.now.sh/badge?p=esbuild-loader)](https://packagephobia.now.sh/result?p=esbuild-loader) | [![vulnerabilities of esbuild-loader](https://img.shields.io/snyk/vulnerabilities/npm/esbuild-loader)](https://snyk.io/test/npm/esbuild-loader) |
292| file-loader | [![install size of file-loader](https://packagephobia.now.sh/badge?p=file-loader)](https://packagephobia.now.sh/result?p=file-loader) | [![vulnerabilities of file-loader](https://img.shields.io/snyk/vulnerabilities/npm/file-loader)](https://snyk.io/test/npm/file-loader) |
293| less | [![install size of less](https://packagephobia.now.sh/badge?p=less)](https://packagephobia.now.sh/result?p=less) | [![vulnerabilities of less](https://img.shields.io/snyk/vulnerabilities/npm/less)](https://snyk.io/test/npm/less) |
294| less-loader | [![install size of less-loader](https://packagephobia.now.sh/badge?p=less-loader)](https://packagephobia.now.sh/result?p=less-loader) | [![vulnerabilities of less-loader](https://img.shields.io/snyk/vulnerabilities/npm/less-loader)](https://snyk.io/test/npm/less-loader) |
295| postcss | [![install size of postcss](https://packagephobia.now.sh/badge?p=postcss)](https://packagephobia.now.sh/result?p=postcss) | [![vulnerabilities of postcss](https://img.shields.io/snyk/vulnerabilities/npm/postcss)](https://snyk.io/test/npm/postcss) |
296| postcss-loader | [![install size of postcss-loader](https://packagephobia.now.sh/badge?p=postcss-loader)](https://packagephobia.now.sh/result?p=postcss-loader) | [![vulnerabilities of postcss-loader](https://img.shields.io/snyk/vulnerabilities/npm/postcss-loader)](https://snyk.io/test/npm/postcss-loader) |
297| sass | [![install size of sass](https://packagephobia.now.sh/badge?p=sass)](https://packagephobia.now.sh/result?p=sass) | [![vulnerabilities of sass](https://img.shields.io/snyk/vulnerabilities/npm/sass)](https://snyk.io/test/npm/sass) |
298| sass-loader | [![install size of sass-loader](https://packagephobia.now.sh/badge?p=sass-loader)](https://packagephobia.now.sh/result?p=sass-loader) | [![vulnerabilities of sass-loader](https://img.shields.io/snyk/vulnerabilities/npm/sass-loader)](https://snyk.io/test/npm/sass-loader) |
299| string-replace-loader | [![install size of string-replace-loader](https://packagephobia.now.sh/badge?p=string-replace-loader)](https://packagephobia.now.sh/result?p=string-replace-loader) | [![vulnerabilities of string-replace-loader](https://img.shields.io/snyk/vulnerabilities/npm/string-replace-loader)](https://snyk.io/test/npm/string-replace-loader) |
300| style-loader | [![install size of style-loader](https://packagephobia.now.sh/badge?p=style-loader)](https://packagephobia.now.sh/result?p=style-loader) | [![vulnerabilities of fibers](https://img.shields.io/snyk/vulnerabilities/npm/style-loader)](https://snyk.io/test/npm/style-loader) |
301| webpack | [![install size of webpack](https://packagephobia.now.sh/badge?p=webpack)](https://packagephobia.now.sh/result?p=webpack) | [![vulnerabilities of webpack](https://img.shields.io/snyk/vulnerabilities/npm/webpack)](https://snyk.io/test/npm/webpack) |
302| webpack-cli | [![install size of webpack-cli](https://packagephobia.now.sh/badge?p=webpack-cli)](https://packagephobia.now.sh/result?p=webpack-cli) | [![vulnerabilities of webpack-cli](https://img.shields.io/snyk/vulnerabilities/npm/webpack-cli)](https://snyk.io/test/npm/webpack-cli) |
303| webpack-dev-server | [![install size of webpack-dev-server](https://packagephobia.now.sh/badge?p=webpack-dev-server)](https://packagephobia.now.sh/result?p=webpack-dev-server) | [![vulnerabilities of webpack-dev-server](https://img.shields.io/snyk/vulnerabilities/npm/webpack-dev-server)](https://snyk.io/test/npm/webpack-dev-server) |
304
305## Peer dependencies
306
307| Package | Size | Vulnerabilities |
308| --------------: | ------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: |
309| chromedriver | [![install size of chromedriver](https://packagephobia.now.sh/badge?p=chromedriver)](https://packagephobia.now.sh/result?p=chromedriver) | [![vulnerabilities of chromedriver](https://img.shields.io/snyk/vulnerabilities/npm/chromedriver)](https://snyk.io/test/npm/chromedriver) |
310| geckodriver | [![install size of geckodriver](https://packagephobia.now.sh/badge?p=geckodriver)](https://packagephobia.now.sh/result?p=geckodriver) | [![vulnerabilities of geckodriver](https://img.shields.io/snyk/vulnerabilities/npm/geckodriver)](https://snyk.io/test/npm/geckodriver) |
311| graphql | [![install size of graphql](https://packagephobia.now.sh/badge?p=graphql)](https://packagephobia.now.sh/result?p=graphql) | [![vulnerabilities of graphql](https://img.shields.io/snyk/vulnerabilities/npm/graphql)](https://snyk.io/test/npm/graphql) |
312| selenium-server | [![install size of selenium-server](https://packagephobia.now.sh/badge?p=selenium-server)](https://packagephobia.now.sh/result?p=selenium-server) | [![vulnerabilities of selenium-server](https://img.shields.io/snyk/vulnerabilities/npm/selenium-server)](https://snyk.io/test/npm/selenium-server) |
313| typescript | [![install size of typescript](https://packagephobia.now.sh/badge?p=typescript)](https://packagephobia.now.sh/result?p=typescript) | [![vulnerabilities of typescript](https://img.shields.io/snyk/vulnerabilities/npm/typescript)](https://snyk.io/test/npm/typescript) |
314
315## Optional tools
316
317| Package | Size | Vulnerabilities |
318| -----------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------: |
319| @leanup/git-hooks | [![install size of @leanup/git-hooks](https://packagephobia.now.sh/badge?p=@leanup/git-hooks)](https://packagephobia.now.sh/result?p=@leanup/git-hooks) | [![vulnerabilities of @leanup/git-hooks](https://img.shields.io/snyk/vulnerabilities/npm/@leanup/git-hooks)](https://snyk.io/test/npm/@leanup/git-hooks) |
320| allure-commandline | [![install size of allure-commandline](https://packagephobia.now.sh/badge?p=allure-commandline)](https://packagephobia.now.sh/result?p=allure-commandline) | [![vulnerabilities of allure-commandline](https://img.shields.io/snyk/vulnerabilities/npm/allure-commandline)](https://snyk.io/test/npm/allure-commandline) |
321| lerna | [![install size of lerna](https://packagephobia.now.sh/badge?p=lerna)](https://packagephobia.now.sh/result?p=lerna) | [![vulnerabilities of lerna](https://img.shields.io/snyk/vulnerabilities/npm/lerna)](https://snyk.io/test/npm/lerna) |
322| workbox-cli | [![install size of workbox-cli](https://packagephobia.now.sh/badge?p=workbox-cli)](https://packagephobia.now.sh/result?p=workbox-cli) | [![vulnerabilities of workbox-cli](https://img.shields.io/snyk/vulnerabilities/npm/workbox-cli)](https://snyk.io/test/npm/workbox-cli) |
323
324[babel]: https://babeljs.io
325[typescript]: https://typescriptlang.org
326[webpack]: https://webpack.js.org
327[mocha]: https://mochajs.org
328[chai]: https://www.chaijs.com
329[sinon]: https://sinonjs.org
330[nyc]: https://istanbul.js.org
331[storybook]: https://storybook.js.org
332[svelte devtools]: https://github.com/RedHatter/svelte-devtools
333[nightwatch.js]: https://nightwatchjs.org
334[tslint]: https://palantir.github.io/tslint
335[eslint]: https://eslint.org
336[graphql]: https://graphql.org
337[sass]: https://sass-lang.com
338[less]: http://lesscss.org
339[lerna]: https://lerna.js.org
340[workbox]: https://developers.google.com/web/tools/workbox
341[ant-design]: https://ant.design
342[allsure]: http://allure.qatools.ru
343[bootstrap]: https://getbootstrap.com
344[material]: https://material.io
345[cucumber]: https://cucumber.io
346[cypress]: https://www.cypress.io
347[webhint]: https://www.webhint.io
348[testcafe]: https://devexpress.github.io/testcafe/
349[robotframework]: https://robotframework.org
350[tailwindcss]: https://tailwindcss.com
351[postcss]: https://postcss.org
352[esbuild]: https://esbuild.github.io
353[snowpack]: https://www.snowpack.dev/
354[vite]: https://vitejs.dev/
355[openapi]: https://openapis.org
356[nexus iq]: https://blog.sonatype.com/using-nexus-iq-server-with-webpack
357[tsarch]: https://github.com/MaibornWolff/ts-arch
358[windicss]: https://windicss.org