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 | -->
|
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 |
|
54 | The **`@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 |
|
90 | There 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 |
|
98 | To install the **`@leanup` CLI** execute the following command:
|
99 |
|
100 | > `npm install @leanup/cli typescript --save-dev`
|
101 |
|
102 | And a non-framework or framework strategy must also be selected:
|
103 |
|
104 | Non-framework:
|
105 |
|
106 | > `npm install @leanup/cli-vanilla --save-dev`
|
107 |
|
108 | Or 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 |
|
121 | Install 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 | [](https://snyk.io/advisor/npm-package/typescript) |
|
132 | | [Webpack] | Bundler | ✔️ | ready | [](https://snyk.io/advisor/npm-package/webpack) |
|
133 | | [Snowpack] | Bundler | ⌛ | in progress | [](https://snyk.io/advisor/npm-package/snowpack) |
|
134 | | [Vite] | Bundler | ⌛ | in progress | [](https://snyk.io/advisor/npm-package/vite) |
|
135 | | [ESBuild] | Transpiler | ✔️ | ready | [](https://snyk.io/advisor/npm-package/esbuild) |
|
136 | | [Babel] | Transpiler | ✔️ | ready | [](https://snyk.io/advisor/npm-package/@babel/core) |
|
137 | | [Mocha] | Unit-Test-Runner | ✔️ | ready | [](https://snyk.io/advisor/npm-package/mocha) |
|
138 | | [Chai] | Assertion | ✔️ | ready | [](https://snyk.io/advisor/npm-package/chai) |
|
139 | | [Sinon] | Mocking | ✔️ | ready | [](https://snyk.io/advisor/npm-package/sinon) |
|
140 | | [NYC] | Code-Coverage | ✔️ | ready | [](https://snyk.io/advisor/npm-package/nyc) |
|
141 | | [ESLint] | Code-Checker | ✔️ | ready | [](https://snyk.io/advisor/npm-package/eslint) |
|
142 | | [Nightwatch.js] | E2E-Test-Runner | ✔️ | ready | [](https://snyk.io/advisor/npm-package/nightwatch) |
|
143 | | [Allsure] | Report | ✔️ | ready |
|
144 | | [Cucumber] | BDD | ✔️ | ready | [](https://snyk.io/advisor/npm-package/cucumber) |
|
145 | | [robotframework] | BDD | ⌛ | will be evaluated | |
|
146 | | [Storybook] | Documentation | ⌛ | in progress | [](https://snyk.io/advisor/npm-package/storybook) |
|
147 | | [OpenAPI] | API | ✔️ | ready | |
|
148 | | [GraphQL] | API | ✔️ | ready | [](https://snyk.io/advisor/npm-package/graphql) |
|
149 | | [Workbox] | PWA | ✔️ | ready | [](https://snyk.io/advisor/npm-package/workbox) |
|
150 | | [Lerna] | Mono-Repo | ✔️ | ready | [](https://snyk.io/advisor/npm-package/lerna) |
|
151 | | [Ant-Design] | Design-System | ✔️ | proved | [](https://snyk.io/advisor/npm-package/antd) |
|
152 | | [Bootstrap] | Design-System | ✔️ | proved | [](https://snyk.io/advisor/npm-package/bootstrap) |
|
153 | | [Material] | Design-System | ✔️ | proved | [](https://snyk.io/advisor/npm-package/@material/textfield) |
|
154 | | [Tailwindcss] | Design-System | ✔️ | proved | [](https://snyk.io/advisor/npm-package/tailwindcss) |
|
155 | | [WindiCSS] | Design-System | ✔️ | proved | [](https://snyk.io/advisor/npm-package/windicss) |
|
156 | | [Nexus IQ] | Vulnerabiliy-Gate | ✔️ | ready | |
|
157 | | [Less] | CSS | ✔️ | ready | [](https://snyk.io/advisor/npm-package/less) |
|
158 | | [Sass] | CSS | ✔️ | ready | [](https://snyk.io/advisor/npm-package/sass) |
|
159 | | [PostCSS] | CSS | ✔️ | ready | [](https://snyk.io/advisor/npm-package/postcss) |
|
160 | | [TSArch] | Architecture | ⌛ | in progress | [](https://snyk.io/advisor/npm-package/tsarch) |
|
161 | | [Webhint] | Webhint | ✔️ | moved \*\*\* | [](https://snyk.io/advisor/npm-package/hint) |
|
162 | | [TestCafe] | E2E-Test-Runner | ⌛ | will be evaluated \*\*\*\* | [](https://snyk.io/advisor/npm-package/typescript) |
|
163 | | [TSLint] | Code-Checker | ❌ | removed \*\* | [](https://snyk.io/advisor/npm-package/tslint) |
|
164 | | [Cypress] | E2E-Test-Runner | ❌ | excluded \* | [](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 |
|
188 | Vanilla 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) ✔️ [](https://snyk.io/test/npm/@leanup/cli-vanilla)
|
192 |
|
193 | ### Frameworks
|
194 |
|
195 | Vanilla Java-/TypeScript are supported by default. That means for example custom elements and any plain Java-/TypeScript code.
|
196 |
|
197 | The 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 |
|
203 | Currently the following framework extensions are available:
|
204 |
|
205 | - [`@leanup/cli-angular`](https://www.npmjs.com/package/@leanup/cli-angular) ✔️ [](https://snyk.io/test/npm/@leanup/cli-angular)
|
206 | - [`@leanup/cli-angularjs`](https://www.npmjs.com/package/@leanup/cli-angularjs) ✔️ [](https://snyk.io/test/npm/@leanup/cli-angularjs)
|
207 | - [`@leanup/cli-aurelia`](https://www.npmjs.com/package/@leanup/cli-aurelia) ✔️ [](https://snyk.io/test/npm/@leanup/cli-aurelia)
|
208 | - [`@leanup/cli-inferno`](https://www.npmjs.com/package/@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) ✔️ [](https://snyk.io/test/npm/@leanup/cli-lit-element)
|
210 | - [`@leanup/cli-preact`](https://www.npmjs.com/package/@leanup/cli-preact) ✔️ [](https://snyk.io/test/npm/@leanup/cli-preact)
|
211 | - [`@leanup/cli-react`](https://www.npmjs.com/package/@leanup/cli-react) ✔️ [](https://snyk.io/test/npm/@leanup/cli-react)
|
212 | - [`@leanup/cli-svelte`](https://www.npmjs.com/package/@leanup/cli-svelte) ✔️ [](https://snyk.io/test/npm/@leanup/cli-svelte)
|
213 | - [`@leanup/cli-vue`](https://www.npmjs.com/package/@leanup/cli-vue) ✔️ [](https://snyk.io/test/npm/@leanup/cli-vue)
|
214 | - [`@leanup/cli-vue3`](https://www.npmjs.com/package/@leanup/cli-vue3) ✔️ (RC) [](https://snyk.io/test/npm/@leanup/cli-vue3)
|
215 |
|
216 | ### Extensions
|
217 |
|
218 | A separate package contains some nice but not required addons for webpack.
|
219 |
|
220 | - [`@leanup/cli-addons`](https://www.npmjs.com/package/@leanup/cli-addons) ✔️ [](https://snyk.io/test/npm/@leanup/cli-addons)
|
221 | - [`@leanup/cli-cucumber`](https://www.npmjs.com/package/@leanup/cli-cucumber) ✔️ [](https://snyk.io/test/npm/@leanup/cli-cucumber)
|
222 | - [`@leanup/cli-graphql`](https://www.npmjs.com/package/@leanup/cli-graphql) ✔️ [](https://snyk.io/test/npm/@leanup/cli-cucumber)
|
223 | - [`@leanup/cli-pwa`](https://www.npmjs.com/package/@leanup/cli-pwa) ✔️ [](https://snyk.io/test/npm/@leanup/cli-pwa)
|
224 | - [`@leanup/cli-webhint`](https://www.npmjs.com/package/@leanup/cli-webhint) ✔️ [](https://snyk.io/test/npm/@leanup/cli-webhint)
|
225 |
|
226 | ### Thinks
|
227 |
|
228 | There a separate packages for important application features.
|
229 |
|
230 | - [`@leanup/git-hooks`](https://www.npmjs.com/package/@leanup/git-hooks) ✔️ [](https://snyk.io/test/npm/@leanup/git-hooks)
|
231 | - [`@leanup/form`](https://www.npmjs.com/package/@leanup/form) ✔️ [](https://snyk.io/test/npm/@leanup/form)
|
232 | - [`@leanup/lib`](https://www.npmjs.com/package/@leanup/lib) ✔️ [](https://snyk.io/test/npm/@leanup/lib)
|
233 | - @leanup/ul ⌛
|
234 |
|
235 | ## Replaced environment variables
|
236 |
|
237 | The 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 |
|
261 | App code:
|
262 |
|
263 | ```js
|
264 | const 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 | };
|
271 | console.log(APP_METADATA);
|
272 | ```
|
273 |
|
274 |
|
275 |
|
276 | ## Dependencies
|
277 |
|
278 | | Package | Size | Vulnerabilities |
|
279 | | --------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
280 | | @babel/core | [](https://packagephobia.now.sh/result?p=@babel/core) | [](https://snyk.io/test/npm/@babel/core) |
|
281 | | @babel/plugin-proposal-class-properties | [](https://packagephobia.now.sh/result?p=@babel/plugin-proposal-class-properties) | [](https://snyk.io/test/npm/@babel/plugin-proposal-class-properties) |
|
282 | | @babel/plugin-proposal-decorators | [](https://packagephobia.now.sh/result?p=@babel/plugin-proposal-decorators) | [](https://snyk.io/test/npm/@babel/plugin-proposal-decorators) |
|
283 | | @babel/preset-env | [](https://packagephobia.now.sh/result?p=@babel/preset-env) | [](https://snyk.io/test/npm/@babel/preset-env) |
|
284 | | @babel/preset-typescript | [](https://packagephobia.now.sh/result?p=@babel/preset-typescript) | [](https://snyk.io/test/npm/@babel/preset-typescript) |
|
285 | | @types/node | [](https://packagephobia.now.sh/result?p=@types/node) | [](https://snyk.io/test/npm/@types/node) |
|
286 | | babel-loader | [](https://packagephobia.now.sh/result?p=babel-loader) | [](https://snyk.io/test/npm/babel-loader) |
|
287 | | chalk | [](https://packagephobia.now.sh/result?p=chalk) | [](https://snyk.io/test/npm/chalk) |
|
288 | | commander | [](https://packagephobia.now.sh/result?p=commander) | [](https://snyk.io/test/npm/commander) |
|
289 | | copy-modules-webpack-plugin | [](https://packagephobia.now.sh/result?p=copy-modules-webpack-plugin) | [](https://snyk.io/test/npm/copy-modules-webpack-plugin) |
|
290 | | css-loader | [](https://packagephobia.now.sh/result?p=css-loader) | [](https://snyk.io/test/npm/css-loader) |
|
291 | | esbuild-loader | [](https://packagephobia.now.sh/result?p=esbuild-loader) | [](https://snyk.io/test/npm/esbuild-loader) |
|
292 | | file-loader | [](https://packagephobia.now.sh/result?p=file-loader) | [](https://snyk.io/test/npm/file-loader) |
|
293 | | less | [](https://packagephobia.now.sh/result?p=less) | [](https://snyk.io/test/npm/less) |
|
294 | | less-loader | [](https://packagephobia.now.sh/result?p=less-loader) | [](https://snyk.io/test/npm/less-loader) |
|
295 | | postcss | [](https://packagephobia.now.sh/result?p=postcss) | [](https://snyk.io/test/npm/postcss) |
|
296 | | postcss-loader | [](https://packagephobia.now.sh/result?p=postcss-loader) | [](https://snyk.io/test/npm/postcss-loader) |
|
297 | | sass | [](https://packagephobia.now.sh/result?p=sass) | [](https://snyk.io/test/npm/sass) |
|
298 | | sass-loader | [](https://packagephobia.now.sh/result?p=sass-loader) | [](https://snyk.io/test/npm/sass-loader) |
|
299 | | string-replace-loader | [](https://packagephobia.now.sh/result?p=string-replace-loader) | [](https://snyk.io/test/npm/string-replace-loader) |
|
300 | | style-loader | [](https://packagephobia.now.sh/result?p=style-loader) | [](https://snyk.io/test/npm/style-loader) |
|
301 | | webpack | [](https://packagephobia.now.sh/result?p=webpack) | [](https://snyk.io/test/npm/webpack) |
|
302 | | webpack-cli | [](https://packagephobia.now.sh/result?p=webpack-cli) | [](https://snyk.io/test/npm/webpack-cli) |
|
303 | | webpack-dev-server | [](https://packagephobia.now.sh/result?p=webpack-dev-server) | [](https://snyk.io/test/npm/webpack-dev-server) |
|
304 |
|
305 | ## Peer dependencies
|
306 |
|
307 | | Package | Size | Vulnerabilities |
|
308 | | --------------: | ------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: |
|
309 | | chromedriver | [](https://packagephobia.now.sh/result?p=chromedriver) | [](https://snyk.io/test/npm/chromedriver) |
|
310 | | geckodriver | [](https://packagephobia.now.sh/result?p=geckodriver) | [](https://snyk.io/test/npm/geckodriver) |
|
311 | | graphql | [](https://packagephobia.now.sh/result?p=graphql) | [](https://snyk.io/test/npm/graphql) |
|
312 | | selenium-server | [](https://packagephobia.now.sh/result?p=selenium-server) | [](https://snyk.io/test/npm/selenium-server) |
|
313 | | typescript | [](https://packagephobia.now.sh/result?p=typescript) | [](https://snyk.io/test/npm/typescript) |
|
314 |
|
315 | ## Optional tools
|
316 |
|
317 | | Package | Size | Vulnerabilities |
|
318 | | -----------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------: |
|
319 | | @leanup/git-hooks | [](https://packagephobia.now.sh/result?p=@leanup/git-hooks) | [](https://snyk.io/test/npm/@leanup/git-hooks) |
|
320 | | allure-commandline | [](https://packagephobia.now.sh/result?p=allure-commandline) | [](https://snyk.io/test/npm/allure-commandline) |
|
321 | | lerna | [](https://packagephobia.now.sh/result?p=lerna) | [](https://snyk.io/test/npm/lerna) |
|
322 | | workbox-cli | [](https://packagephobia.now.sh/result?p=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
|