├── .browserslistrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── .github └── workflows │ └── npm-publish.yml ├── .gitignore ├── .htmllintrc ├── .stylelintrc ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── copy ├── _.browserslistrc ├── _.editorconfig ├── _.eslintignore ├── _.eslintrc.json ├── _.gitignore ├── _.htmllintrc ├── _.stylelintrc └── _gulpfile.js │ ├── .bump.json │ ├── .critical.json │ ├── .css.json │ ├── .favicon-data-generated.json │ ├── .favicon-data.json │ ├── .favicon.json │ ├── .gfx.json │ ├── .helpers.json │ ├── .html.json │ ├── .js.json │ ├── .jsdoc.json │ ├── .kss.json │ ├── .sassdoc.json │ ├── .starter-project.json │ ├── .sync.json │ ├── .watch.json │ ├── bump.js │ ├── clean.js │ ├── critical.js │ ├── css.js │ ├── favicon.js │ ├── fonts.js │ ├── gfx.js │ ├── helpers.js │ ├── html.js │ ├── index.js │ ├── js.js │ ├── jsdoc.js │ ├── kss.js │ ├── sassdoc.js │ ├── sync.js │ └── webpack.js ├── gfx ├── ss.png ├── starter-project-cli-npm.svg ├── starter-project-cli.jpg ├── starter-project-cli.png ├── starter-project-npm.svg └── starter-project-questions.png ├── index.js ├── lib ├── config.js ├── files.js ├── inquirer.js ├── log.js └── starter-project.js ├── package.json └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | last 5 versions 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | indent_style = space 11 | indent_size = 2 12 | trim_trailing_whitespace = true 13 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | **/*.min.js 2 | **/vendor/* 3 | **/dist/* 4 | **/node_modules/* 5 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["airbnb-base"], 3 | "parser": "babel-eslint", 4 | "parserOptions": { 5 | "ecmaVersion": 6 6 | }, 7 | "rules": { 8 | "no-console": "off" 9 | }, 10 | "globals": { 11 | "requestAnimationFrame": true, 12 | "sessionStorage": true 13 | }, 14 | "env": { 15 | "browser": true, 16 | "es6": true, 17 | "amd": true, 18 | "commonjs": true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages 3 | 4 | name: Node.js Package 5 | 6 | on: 7 | release: 8 | types: [created] 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-node@v1 16 | with: 17 | node-version: 12 18 | - run: npm ci 19 | - run: npm test 20 | 21 | publish-npm: 22 | needs: build 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v2 26 | - uses: actions/setup-node@v1 27 | with: 28 | node-version: 12 29 | registry-url: https://registry.npmjs.org/ 30 | - run: npm ci 31 | - run: npm publish 32 | env: 33 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 34 | 35 | publish-gpr: 36 | needs: build 37 | runs-on: ubuntu-latest 38 | steps: 39 | - uses: actions/checkout@v2 40 | - uses: actions/setup-node@v1 41 | with: 42 | node-version: 12 43 | registry-url: https://npm.pkg.github.com/ 44 | - run: npm ci 45 | - run: npm publish 46 | env: 47 | NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /node_modules/ 3 | yarn-error.log 4 | .yarnclean 5 | /test/ 6 | /dist/ 7 | /src/ 8 | gulpfile.js/.favicon-data-generated.json 9 | starter-project-cli-* 10 | -------------------------------------------------------------------------------- /.htmllintrc: -------------------------------------------------------------------------------- 1 | { 2 | "attr-bans": false, 3 | "attr-name-ignore-regex": false, 4 | "attr-name-style": "dash", 5 | "attr-new-line": false, 6 | "attr-no-dup": true, 7 | "attr-no-unsafe-char": true, 8 | "attr-order": false, 9 | "attr-quote-style": "double", 10 | "attr-req-value": true, 11 | "attr-validate": true, 12 | "class-no-dup": true, 13 | "class-style": false, 14 | "doctype-first": true, 15 | "doctype-html5": true, 16 | "fig-req-figcaption": false, 17 | "focusable-tabindex-style": false, 18 | "head-req-title": true, 19 | "head-valid-content-model": true, 20 | "href-style": false, 21 | "html-req-lang": true, 22 | "html-valid-content-model": true, 23 | "id-class-ignore-regex": false, 24 | "id-class-no-ad": false, 25 | "id-class-style": false, 26 | "id-no-dup": true, 27 | "img-req-alt": true, 28 | "img-req-src": true, 29 | "indent-delta": false, 30 | "indent-style": false, 31 | "indent-width": false, 32 | "indent-width-cont": false, 33 | "input-radio-req-name": true, 34 | "input-req-label": true, 35 | "label-req-for": true, 36 | "lang-style": "case", 37 | "line-end-style": false, 38 | "line-max-len": false, 39 | "line-max-len-ignore-regex": false, 40 | "line-no-trailing-whitespace": true, 41 | "link-req-noopener": true, 42 | "maxerr": false, 43 | "raw-ignore-regex": false, 44 | "spec-char-escape": true, 45 | "table-req-caption": false, 46 | "table-req-header": false, 47 | "tag-bans": false, 48 | "tag-close": true, 49 | "tag-name-lowercase": true, 50 | "tag-name-match": true, 51 | "tag-req-attr": false, 52 | "tag-self-close": "never", 53 | "text-ignore-regex": false, 54 | "title-max-len": 60, 55 | "title-no-dup": true 56 | } 57 | -------------------------------------------------------------------------------- /.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "stylelint-scss", 4 | "stylelint-order" 5 | ], 6 | "extends": "stylelint-config-sass-guidelines" 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "emeraldwalk.runonsave": { 3 | "commands": [{ 4 | "match": "\\.css?$", 5 | "cmd": "cd ${workspaceRoot} && stylefmt -c .stylelintrc ${file}" 6 | }] 7 | }, 8 | "eslint.enable": true, 9 | "git.ignoreLimitWarning": true 10 | } 11 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at me@silvestar.codes. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Silvestar Bistrović 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Starter Project CLI](https://www.silvestar.codes/side-projects/starter-project/) 2 | 3 | [![Starter Project CLI on NPM](https://img.shields.io/badge/starter--project--cli-npm-blue.svg)](https://www.npmjs.com/package/starter-project-cli) 4 | [![Starter Project on NPM](https://img.shields.io/badge/starter--project-npm-blue.svg)](https://www.npmjs.com/package/starter-project) 5 | 6 | > Starter Project CLI creates a perfect Gulp development environment for everyone within a few minutes. 7 | 8 | ![Starter Project CLI Logo - Folder with start button and CLI word](https://github.com/maliMirkec/starter-project-cli/raw/master/gfx/starter-project-cli.png) 9 | 10 | Starter Project CLI, or **SPRO** (pronounces es-pro), is a command line interface that could save you a vast amount of time that you usually spend on configuring your project. SPRO's mission is to set up a perfect development environment by learning about your project architecture and then setting up Gulp tasks for all your needs. 11 | 12 | SPRO should be considered as a boilerplate of predefined Gulp tasks. SPRO would install Gulp tasks for processing the following file types: 13 | 14 | - HTML (pug) 15 | - CSS (Sass) 16 | - JavaScript (es6) 17 | - Graphic (PNG, JPEG, SVG, GIF) 18 | - Fonts 19 | - Favicons 20 | 21 | The tasks include compiling, lintering, formatting, compressing, and transforming your source file to produce the most optimized production files. 22 | 23 | __Info: If you would like to add a Gulp task, feel free to open [a pull request], or request a feature by creating [a new issue].__ 24 | 25 | ## Supporters 26 | 27 | [![Stargazers repo roster for @maliMirkec/starter-project-cli](https://reporoster.com/stars/maliMirkec/starter-project-cli)](https://github.com/maliMirkec/starter-project-cli/stargazers) 28 | 29 | ## Table of Contents 30 | 31 | - [Installation](#installation) 32 | - [Getting started](#getting-started) 33 | - [Gulp tasks](#gulp-tasks) 34 | - [Configuration file](#configuration-file) 35 | - [Path Placeholders](#path-placeholders) 36 | - [Command](#command) 37 | - [Task Configuration](#task-configuration) 38 | - [BrowserSync Configuration](#browsersync-configuration) 39 | - [Favicon Configuration](#favicon-configuration) 40 | - [HTML Configuration](#html-configuration) 41 | - [CSS Configuration](#css-configuration) 42 | - [JavaScript Configuration](#javascript-configuration) 43 | - [Images Configuration](#images-configuration) 44 | - [Critical CSS Configuration](#critical-css-configuration) 45 | - [Semver Configuration](#semver-configuration) 46 | - [KSS Configuration](#kss-configuration) 47 | - [SassDoc Configuration](#sassdoc-configuration) 48 | - [JSDoc Configuration](#jsdoc-configuration) 49 | - [Helpers Configuration](#helpers-configuration) 50 | - [Watch Configuration](#watch-configuration) 51 | - [Questions](#questions) 52 | - [Dependenciest](#Dependencies) 53 | - [Support](#support) 54 | - [ToDo](#todo) 55 | 56 | ## Installation 57 | 58 | You could use SPRO as a global or local package. 59 | 60 | To install the package locally, run: 61 | 62 | ```console 63 | npm install starter-project-cli --save 64 | ``` 65 | 66 | To install the package globally, run: 67 | 68 | ```console 69 | npm install --global starter-project-cli --save 70 | ``` 71 | 72 | ## Getting started 73 | 74 | After successful installation, you could run the `spro` command. If you have installed the package locally, you could initialize the package by running the following command: 75 | 76 | ```console 77 | node_modules/.bin/spro start 78 | ``` 79 | 80 | If you have installed the package globally, you could initialize the package by running the following command: 81 | 82 | ```console 83 | spro start 84 | ``` 85 | 86 | SPRO would prompt you to ask a few questions about the project structure. 87 | 88 | ![Starter Project CLI in action](https://github.com/maliMirkec/starter-project-cli/blob/d014a6defd5f2a0bbb9db2d04210a17bcb40354b/gfx/starter-project-questions.png) 89 | 90 | Once you answer all questions, SPRO would do two things: 91 | - copy all required files (Gulp task files and configuration files), and 92 | - prepare a command for installation of dependencies required for the project. 93 | 94 | _Warning: Note that the installation process could last a few minutes._ 95 | 96 | ## Gulp tasks 97 | 98 | In the `gulpfile.js` folder you could find all Gulp task files and configuration files. 99 | 100 | There are four available major Gulp tasks: 101 | 102 | | Task | Description | 103 | | --------- | --------------------------------------------------------------------------------------------- | 104 | | `default` | the task for running all the tasks (useful for more thorough development process) | 105 | | `build` | the task for running all tasks with the exit process (useful for Netlify builds, for example) | 106 | | `dev` | the task for running only essential tasks (useful for basic development process) | 107 | | `clean` | the task for deleting compiled code. | 108 | 109 | And there are three optional Gulp tasks for versioning (available only you choose SEMVER option): 110 | 111 | | Task | Description | 112 | | ----------- | -------------------------------------------------------------- | 113 | | `bumpPatch` | the task for bumping patch versions of the `package.json` file | 114 | | `bumpMinor` | the task for bumping minor versions of the `package.json` file | 115 | | `bumpMajor` | the task for bumping major versions of the `package.json` file | 116 | 117 | _Pro tip: Run `gulp --tasks` to see all available Gulp tasks._ 118 | 119 | ## Configuration file 120 | 121 | If you want more control over your Gulp tasks, you could find the configuration files for every single Gulp task in the `gulpfile.js` folder. 122 | 123 | `.starter-project.json` is the main configuration file in which you could find all your answers from the command line. 124 | 125 | ```.starter-project.json 126 | { 127 | "proot": "./", 128 | "src": "src", 129 | "dist": "dist", 130 | "sync": { 131 | "run": true 132 | }, 133 | "html": { 134 | "run": true, 135 | "src": "html", 136 | "dist": "", 137 | "pug": false, 138 | "minify": true, 139 | "inline": true, 140 | "lint": true 141 | }, 142 | "css": { 143 | "run": true, 144 | "src": "scss", 145 | "dist": "css", 146 | "sass": true, 147 | "minify": true, 148 | "autoprefix": true, 149 | "sourcemaps": true, 150 | "lint": true 151 | }, 152 | "js": { 153 | "run": true, 154 | "src": "js", 155 | "dist": "js", 156 | "uglify": true, 157 | "lint": true, 158 | "sourcemaps": true 159 | }, 160 | "gfx": { 161 | "run": true, 162 | "src": "gfx", 163 | "dist": "gfx" 164 | }, 165 | "fonts": { 166 | "run": true, 167 | "src": "fonts", 168 | "dist": "fonts" 169 | }, 170 | "favicon": { 171 | "run": true 172 | }, 173 | "critical": { 174 | "run": true 175 | }, 176 | "kss": { 177 | "run": true, 178 | "dist": "docs/styleguide" 179 | }, 180 | "sassdoc": { 181 | "run": true, 182 | "dist": "docs/sass" 183 | }, 184 | "jsdoc": { 185 | "run": true, 186 | "dist": "docs/js" 187 | }, 188 | "bump": { 189 | "run": true 190 | } 191 | } 192 | ``` 193 | 194 | _Avoid editing this file manually, unless you know what you are doing. Run `spro start` command again instead._ 195 | 196 | See more about individual configuring tasks [in the Task Configuration section]. 197 | 198 | ### Path Placeholders 199 | 200 | SPRO provides _path placeholders_ for easier configuration. All path placeholders would be replaced with settings from the main config file, `.starter-project.json` file. 201 | 202 | **Use path placeholders to avoid hardcoding paths in the project.** 203 | 204 | Here is the list of all available path placeholders: 205 | 206 | | Placeholder | Replacement | 207 | | --------------------- | ----------------------------------- | 208 | | `helpers.proot` | project root path | 209 | | `helpers.source` | project source path | 210 | | `helpers.dist` | project destination path | 211 | | `config.html.src` | project HTML source path | 212 | | `config.html.dist` | project HTML source path | 213 | | `config.css.src` | project CSS source path | 214 | | `config.css.dist ` | project CSS destination path | 215 | | `config.js.src` | project JavaScript source path | 216 | | `config.js.dist` | project JavaScript destination path | 217 | | `config.kss.dist` | project KSS destination path | 218 | | `config.sassdoc.dist` | project SassDoc destination path | 219 | | `config.jsdoc.dist` | project JSdoc destination path | 220 | 221 | ## Command 222 | 223 | SPRO package has only one command: 224 | 225 | - `spro start`, `spro s`. 226 | 227 | Also, you could run `spro --version` to check the version of the package. 228 | 229 | ## Task Configuration 230 | 231 | Every task has its own configuration file. 232 | 233 | ### BrowserSync Configuration 234 | 235 | The default BrowserSync configuration is defined as follows: 236 | 237 | ```.sync.json 238 | { 239 | "port": 8080, 240 | "server": { 241 | "baseDir": "" 242 | } 243 | } 244 | ``` 245 | 246 | You could see all available options [on BrowserSync the npm page]. 247 | 248 | ### Favicon Configuration 249 | 250 | The default favicon configuration is defined as follows: 251 | 252 | ```.favicon.json 253 | { 254 | "run": true, 255 | "src": "helpers.source/config.html.src/_assets/favicon.pug", 256 | "dest": "helpers.source/config.html.src/_assets" 257 | } 258 | ``` 259 | 260 | To make the favicon task work, you should visit the [RealFaviconGenerator] and run the wizard. At the end of the process, you should copy the setting and put them in the `.favicon-data.json` file under `gulpfile.js` directory. 261 | 262 | If you need more help understanding the configuration, please open [a new issue]. 263 | 264 | ### HTML Configuration 265 | 266 | The default HTML configuration is defined as follows: 267 | 268 | ```.html.json 269 | { 270 | "pugConfig": { 271 | "basedir": "", 272 | "pretty": true 273 | }, 274 | "htmllintConfig": { 275 | "config": "", 276 | "failOnError": false 277 | }, 278 | "htmlminConfig": { 279 | "collapseWhitespace": true 280 | }, 281 | "renameConfig": { 282 | "extname": ".html" 283 | }, 284 | "inlineConfig": { 285 | "rootpath": "" 286 | } 287 | } 288 | ``` 289 | 290 | If you need more help understanding the configuration, please open [a new issue]. 291 | 292 | ### CSS Configuration 293 | 294 | The default CSS configuration is defined as follows: 295 | 296 | ```.css.json 297 | { 298 | "sassConfig": { 299 | "includePaths": [ 300 | "helpers.proot/node_modules/modularscale-sass/stylesheets/", 301 | "helpers.proot/node_modules/sass-mq/", 302 | "helpers.proot/node_modules/normalize.css/", 303 | "helpers.source/config.css.src/", 304 | "helpers.source/config.css.src/components/" 305 | ] 306 | }, 307 | "styleLintConfig": { 308 | "reporters": [{ 309 | "formatter": "string", 310 | "console": true 311 | }] 312 | }, 313 | "autoprefixerConfig": { 314 | "browsers": ["last 5 versions"], 315 | "cascade": false 316 | }, 317 | "renameConfig": { 318 | "suffix": ".min" 319 | } 320 | } 321 | ``` 322 | 323 | If you need more help understanding the configuration, please open [a new issue]. 324 | 325 | ### JavaScript Configuration 326 | 327 | The default JavaScript configuration is defined as follows: 328 | 329 | ```.js.json 330 | { 331 | "eslintConfig": { 332 | "configFile": "helpers.proot/.eslintrc.json", 333 | "fix": true, 334 | "quiet": true 335 | }, 336 | "includeConfig": { 337 | "hardFail": true, 338 | "includePaths": [ 339 | "helpers.proot/node_modules" 340 | ] 341 | }, 342 | "babelConfig": { 343 | "presets": ["@babel/env"] 344 | }, 345 | "renameConfig": { 346 | "suffix": ".min" 347 | } 348 | } 349 | ``` 350 | 351 | If you need more help understanding the configuration, please open [a new issue]. 352 | 353 | ### Images Configuration 354 | 355 | The default images configuration is defined as follows: 356 | 357 | ```.gfx.json 358 | { 359 | "gifConfig": { 360 | "interlaced": true 361 | }, 362 | "jpegConfig": { 363 | "quality": 90, 364 | "progressive": true 365 | }, 366 | "pngConfig": { 367 | "quality": [0.8, 0.9] 368 | }, 369 | "svgConfig": { 370 | "plugins": [ 371 | { 372 | "cleanupAttrs": true 373 | }, 374 | { 375 | "removeDoctype": true 376 | }, 377 | { 378 | "removeComments": true 379 | }, 380 | { 381 | "removeXMLProcInst": true 382 | }, 383 | { 384 | "removeMetadata": true 385 | }, 386 | { 387 | "removeTitle": false 388 | }, 389 | { 390 | "removeDesc": false 391 | }, 392 | { 393 | "removeUselessDefs": true 394 | }, 395 | { 396 | "removeXMLNS": false 397 | }, 398 | { 399 | "removeEditorsNSData": true 400 | }, 401 | { 402 | "removeEmptyAttrs": true 403 | }, 404 | { 405 | "removeHiddenElems": true 406 | }, 407 | { 408 | "removeEditorsNSData": true 409 | }, 410 | { 411 | "removeEmptyText": true 412 | }, 413 | { 414 | "removeEmptyContainers": true 415 | }, 416 | { 417 | "removeViewBox": false 418 | }, 419 | { 420 | "cleanupEnableBackground": true 421 | }, 422 | { 423 | "convertStyleToAttrs": true 424 | }, 425 | { 426 | "convertColors": true 427 | }, 428 | { 429 | "convertPathData": true 430 | }, 431 | { 432 | "convertTransform": true 433 | }, 434 | { 435 | "removeUnknownsAndDefaults": true 436 | }, 437 | { 438 | "removeNonInheritableGroupAttrs": true 439 | }, 440 | { 441 | "removeUselessStrokeAndFill": true 442 | }, 443 | { 444 | "removeUnusedNS": true 445 | }, 446 | { 447 | "cleanupIDs": false 448 | }, 449 | { 450 | "cleanupNumericValues": true 451 | }, 452 | { 453 | "cleanupListOfValues": true 454 | }, 455 | { 456 | "moveElemsAttrsToGroup": true 457 | }, 458 | { 459 | "moveGroupAttrsToElems": false 460 | }, 461 | { 462 | "collapseGroups": true 463 | }, 464 | { 465 | "removeRasterImages": true 466 | }, 467 | { 468 | "mergePaths": true 469 | }, 470 | { 471 | "convertShapeToPath": false 472 | }, 473 | { 474 | "sortAttrs": true 475 | }, 476 | { 477 | "removeDimensions": true 478 | }, 479 | { 480 | "removeAttrs": false 481 | }, 482 | { 483 | "removeElementsByAttr": false 484 | }, 485 | { 486 | "addClassesToSVGElement": false 487 | }, 488 | { 489 | "addAttributesToSVGElement": false 490 | }, 491 | { 492 | "removeStyleElement": false 493 | }, 494 | { 495 | "removeScriptElement": false 496 | }, 497 | { 498 | "removeDimensions": false 499 | } 500 | ] 501 | } 502 | } 503 | ``` 504 | 505 | If you need more help understanding the configuration, please open [a new issue]. 506 | 507 | ### Critical CSS Configuration 508 | 509 | The default Critical CSS configuration is defined as follows: 510 | 511 | ```.critical.json 512 | [{ 513 | "src": "style.css", 514 | "settings": { 515 | "out": "style.critical.css", 516 | "url": "http://localhost:8080/", 517 | "width": 1920, 518 | "height": 1200, 519 | "keepLargerMediaQueries": true, 520 | "strict": false, 521 | "blockJSRequests": false, 522 | "phantomJsOptions": { 523 | "ssl-protocol": "any", 524 | "ignore-ssl-errors": true 525 | } 526 | } 527 | }] 528 | ``` 529 | 530 | If you need more help understanding the configuration, please open [a new issue]. 531 | 532 | ### Semver Configuration 533 | 534 | The default Semver configuration is defined as follows: 535 | 536 | ```.bump.json 537 | { 538 | "src": ["helpers.proot/package.json"] 539 | } 540 | ``` 541 | 542 | If you need more help understanding the configuration, please open [a new issue]. 543 | 544 | ### KSS Configuration 545 | 546 | The default KSS configuration is defined as follows: 547 | 548 | ```.kss.json 549 | { 550 | "title": "Starter Project", 551 | "source": "helpers.source", 552 | "destination": "helpers.dist/docs/styleguide/", 553 | "css": [ 554 | "helpers.dist/config.css.dist/style.css" 555 | ], 556 | "js": [] 557 | } 558 | ``` 559 | 560 | If you need more help understanding the configuration, please open [a new issue]. 561 | 562 | ### SassDoc Configuration 563 | 564 | The default SassDoc configuration is defined as follows: 565 | 566 | ```.sassdoc.json 567 | { 568 | "dest": "/docs/sass/", 569 | "package": "package.json", 570 | "autofill": true, 571 | "verbose": true, 572 | "theme": "default", 573 | "display": { 574 | "access": ["public", "private"], 575 | "alias": true, 576 | "watermark": true 577 | }, 578 | "groups": { 579 | "undefined": "Misc" 580 | }, 581 | "basePath": "https://starter.silvestar.codes/docs/sass/" 582 | } 583 | ``` 584 | 585 | If you need more help understanding the configuration, please open [a new issue]. 586 | 587 | ### JSDoc Configuration 588 | 589 | The default JSDoc configuration is defined as follows: 590 | 591 | ```.jsdoc.json 592 | { 593 | "src": ["helpers.source/config.js.src/homepage.md", "helpers.source/config.js.src/"], 594 | "settings": { 595 | "tags": { 596 | "allowUnknownTags": true 597 | }, 598 | "opts": { 599 | "destination": "helpers.dist/docs/js/" 600 | }, 601 | "plugins": [ 602 | "plugins/markdown" 603 | ], 604 | "templates": { 605 | "cleverLinks": true, 606 | "monospaceLinks": false, 607 | "default": { 608 | "outputSourceFiles": true 609 | }, 610 | "path": "ink-docstrap", 611 | "theme": "simplex", 612 | "navType": "vertical", 613 | "linenums": true, 614 | "dateFormat": "MMMM Do YYYY, h:mm:ss a" 615 | } 616 | } 617 | } 618 | ``` 619 | 620 | If you need more help understanding the configuration, please open [a new issue]. 621 | 622 | ### Helpers Configuration 623 | 624 | The default helpers configuration is defined as follows: 625 | 626 | ```.helpers.json 627 | { 628 | "wait": 20000 629 | } 630 | ``` 631 | 632 | ### Watch Configuration 633 | 634 | The default watch configuration is defined as follows: 635 | 636 | ```.watch.json 637 | { 638 | "ignoreInitial": true 639 | } 640 | ``` 641 | 642 | This setting will tell Gulp when to terminate the build (watch) process. 643 | 644 | ## Questions 645 | 646 | SPRO would ask you the following questions: 647 | 648 | - [GENERAL] Do you want to override the project? Be sure to commit all changes before you proceed.', 649 | - [GENERAL] What is the root folder of the project?', 650 | - [GENERAL] Where is the folder with the source code of the project (relative to default path)?', 651 | - [GENERAL] Where do you want to store compiled code of the project (relative to default path)?', 652 | - [GENERAL] Are you sure that you want to override the project?', 653 | - [BROWSERSYNC] Do you want to run BrowserSync to preview changes in the browser?', 654 | - [HTML] Do you want to run HTML tasks?', 655 | - [HTML] Are you using Pug as a template engine?', 656 | - [HTML] Where is the folder with HTML source code (relative to default source path)?', 657 | - [HTML] Where do you want to store compiled HTML code (relative to default destination path)?', 658 | - [HTML] Do you want to minify HTML code?', 659 | - [HTML] Do you want to run inline source tasks (inline CSS or SVG in HTML code)?', 660 | - [HTML] Do you want to lint HTML code?', 661 | - [CSS] Do you want to run CSS tasks?', 662 | - [CSS] Are you using Sass?', 663 | - [CSS] Where is the folder with CSS source code (relative to default source path)?', 664 | - [CSS] Where do you want to store compiled CSS code (relative to default destination path)?', 665 | - [CSS] Do you want to minify CSS code?', 666 | - [CSS] Do you want to autoprefix CSS code?', 667 | - [CSS] Do you want to add sourcemaps for CSS code?', 668 | - [CSS] Do you want to lint CSS code?', 669 | - [JS] Do you want to run JavaScript (es6) tasks?', 670 | - [JS] Where is the folder with JavaScript source code (relative to default source path)?', 671 | - [JS] Where do you want to store compiled JavaScript code (relative to default destination path)?', 672 | - [JS] Do you want to minify JavaScript code?', 673 | - [JS] Do you want to add sourcemaps for JavaScript code?', 674 | - [JS] Do you want to lint JavaScript code?', 675 | - [IMAGES] Do you want to run image optimization tasks?', 676 | - [IMAGES] Where is the folder with images (relative to default source path)?', 677 | - [IMAGES] Where do you want to store optimized images (relative to default destination path)?', 678 | - [FONTS] Do you use local fonts? Do you want to run font tasks?', 679 | - [FONTS] Where is the folder with local fonts (relative to default source path)?', 680 | - [FONTS] Where do you want to store local fonts (relative to default destination path)?', 681 | - [FAVICON] Do you want to run favicon tasks?', 682 | - [CRITICAL] Do you want to extract Critical CSS?', 683 | - [KSS] Do you want to add KSS style guide?', 684 | - [KSS] Where do you want to store KSS style guide (relative to default destination path)?', 685 | - [SASSDOC] Do you want to add documentation for the SASS code (SassDoc)?', 686 | - [SASSDOC] Where do you want to store SassDoc files (relative to default destination path)?', 687 | - [JSDOC] Do you want to add documentation for the JS code (JSDoc)?', 688 | - [JSDOC] Where do you want to store JSdoc files (relative to default destination path)?', 689 | - [SEMVER] Do you want to add semver versioning tasks (for automatic bump of any version in any file which supports semver versioning, like package.json)?', 690 | - [YARN] Do you use Yarn as your default dependency manager?', 691 | 692 | ## Dependencies 693 | 694 | Every possible package for Gulp tasks: 695 | 696 | - @babel/core, 697 | - @babel/preset-env, 698 | - babel-eslint, 699 | - browser-sync, 700 | - del, 701 | - eslint, 702 | - eslint-config-airbnb-base, 703 | - eslint-plugin-import, 704 | - eslint-plugin-node, 705 | - gulp, 706 | - gulp-autoprefixer, 707 | - gulp-babel, 708 | - gulp-bump, 709 | - gulp-clean-css, 710 | - gulp-cssimport, 711 | - gulp-eslint, 712 | - gulp-exit, 713 | - gulp-htmllint, 714 | - gulp-htmlmin, 715 | - gulp-if, 716 | - gulp-imagemin, 717 | - gulp-include, 718 | - gulp-inline-source, 719 | - gulp-jsdoc3, 720 | - gulp-penthouse, 721 | - gulp-pug, 722 | - gulp-real-favicon, 723 | - gulp-rename, 724 | - gulp-sass, 725 | - gulp-sourcemaps, 726 | - gulp-stylelint, 727 | - gulp-uglify, 728 | - gulp-wait, 729 | - imagemin-mozjpeg, 730 | - imagemin-pngquant, 731 | - kss, 732 | - path, 733 | - sassdoc, 734 | - stylelint, 735 | - stylelint-config-sass-guidelines, 736 | - stylelint-order, and 737 | - stylelint-scss. 738 | 739 | ## Support 740 | 741 | Show your support by starring the project on [GitHub], or by [sharing on Twitter]. 🙏 742 | 743 | Contribute: create [a new issue] or create [a pull request]. 744 | 745 | ## Todo 746 | 747 | - Consider adding terminalizer https://github.com/faressoft/terminalizer 748 | - Consider adding siteaudit https://github.com/thecreazy/siteaudit 749 | 750 | [in the Task Configuration section]: #task-configuration 751 | [on BrowserSync the npm page]: https://browsersync.io/docs/options 752 | [RealFaviconGenerator]: https://realfavicongenerator.net/ 753 | [GitHub]: https://github.com/maliMirkec/starter-project-cli 754 | [sharing on Twitter]: https://twitter.com/intent/tweet?url=https://github.com/maliMirkec/starter-project-cli/&text=Starter%20Project%20CLI%20creates%20a%20perfect%20Gulp%20development%20environment%20for%20everyone%20within%20a%20few%20minutes.%20🔥%20Try%20it%20today!%20💯&via=malimirkeccita 755 | [a new issue]: https://github.com/maliMirkec/starter-project-cli/issues/new 756 | [a pull request]: https://github.com/maliMirkec/starter-project-cli/compare 757 | -------------------------------------------------------------------------------- /copy/_.browserslistrc: -------------------------------------------------------------------------------- 1 | last 5 versions 2 | -------------------------------------------------------------------------------- /copy/_.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | indent_style = space 11 | indent_size = 2 12 | trim_trailing_whitespace = true 13 | -------------------------------------------------------------------------------- /copy/_.eslintignore: -------------------------------------------------------------------------------- 1 | **/*.min.js 2 | **/vendor/* 3 | **/dist/* 4 | **/node_modules/* 5 | -------------------------------------------------------------------------------- /copy/_.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["airbnb-base"], 3 | "parser": "babel-eslint", 4 | "parserOptions": { 5 | "ecmaVersion": 6 6 | }, 7 | "rules": { 8 | "no-console": "off" 9 | }, 10 | "globals": { 11 | "requestAnimationFrame": true, 12 | "sessionStorage": true 13 | }, 14 | "env": { 15 | "browser": true, 16 | "es6": true, 17 | "amd": true, 18 | "commonjs": true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /copy/_.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /node_modules/ 3 | yarn-error.log 4 | .yarnclean 5 | /test/ 6 | /dist/ 7 | /src/ 8 | gulpfile.js/.favicon-data-generated.json 9 | starter-project-cli-* 10 | -------------------------------------------------------------------------------- /copy/_.htmllintrc: -------------------------------------------------------------------------------- 1 | { 2 | "attr-bans": false, 3 | "attr-name-ignore-regex": false, 4 | "attr-name-style": "dash", 5 | "attr-new-line": false, 6 | "attr-no-dup": true, 7 | "attr-no-unsafe-char": true, 8 | "attr-order": false, 9 | "attr-quote-style": "double", 10 | "attr-req-value": true, 11 | "attr-validate": true, 12 | "class-no-dup": true, 13 | "class-style": false, 14 | "doctype-first": true, 15 | "doctype-html5": true, 16 | "fig-req-figcaption": false, 17 | "focusable-tabindex-style": false, 18 | "head-req-title": true, 19 | "head-valid-content-model": true, 20 | "href-style": false, 21 | "html-req-lang": true, 22 | "html-valid-content-model": true, 23 | "id-class-ignore-regex": false, 24 | "id-class-no-ad": false, 25 | "id-class-style": false, 26 | "id-no-dup": true, 27 | "img-req-alt": true, 28 | "img-req-src": true, 29 | "indent-delta": false, 30 | "indent-style": false, 31 | "indent-width": false, 32 | "indent-width-cont": false, 33 | "input-radio-req-name": true, 34 | "input-req-label": true, 35 | "label-req-for": true, 36 | "lang-style": "case", 37 | "line-end-style": false, 38 | "line-max-len": false, 39 | "line-max-len-ignore-regex": false, 40 | "line-no-trailing-whitespace": true, 41 | "link-req-noopener": true, 42 | "maxerr": false, 43 | "raw-ignore-regex": false, 44 | "spec-char-escape": true, 45 | "table-req-caption": false, 46 | "table-req-header": false, 47 | "tag-bans": false, 48 | "tag-close": true, 49 | "tag-name-lowercase": true, 50 | "tag-name-match": true, 51 | "tag-req-attr": false, 52 | "tag-self-close": "never", 53 | "text-ignore-regex": false, 54 | "title-max-len": 60, 55 | "title-no-dup": true 56 | } 57 | -------------------------------------------------------------------------------- /copy/_.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "stylelint-scss", 4 | "stylelint-order" 5 | ], 6 | "extends": "stylelint-config-sass-guidelines" 7 | } 8 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.bump.json: -------------------------------------------------------------------------------- 1 | { 2 | "src": ["helpers.proot/package.json"] 3 | } 4 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.critical.json: -------------------------------------------------------------------------------- 1 | { 2 | "temp": "helpers.source/critical/", 3 | "configs": [{ 4 | "src": "style.css", 5 | "settings": { 6 | "out": "style.critical.css", 7 | "url": "http://localhost:8080/", 8 | "width": 1920, 9 | "height": 1200, 10 | "keepLargerMediaQueries": true, 11 | "strict": false, 12 | "blockJSRequests": false, 13 | "phantomJsOptions": { 14 | "ssl-protocol": "any", 15 | "ignore-ssl-errors": true 16 | } 17 | } 18 | }] 19 | } 20 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.css.json: -------------------------------------------------------------------------------- 1 | { 2 | "sassConfig": { 3 | "includePaths": [ 4 | "helpers.proot/node_modules/modularscale-sass/stylesheets/", 5 | "helpers.proot/node_modules/sass-mq/", 6 | "helpers.proot/node_modules/normalize.css/", 7 | "helpers.source/config.css.src/", 8 | "helpers.source/config.css.src/components/" 9 | ] 10 | }, 11 | "styleLintConfig": { 12 | "reporters": [{ 13 | "formatter": "string", 14 | "console": true 15 | }] 16 | }, 17 | "autoprefixerConfig": { 18 | "cascade": false 19 | }, 20 | "renameConfig": { 21 | "suffix": ".min" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.favicon-data-generated.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maliMirkec/starter-project-cli/cdb788de243216697e1acf3e7864d27f22059699/copy/_gulpfile.js/.favicon-data-generated.json -------------------------------------------------------------------------------- /copy/_gulpfile.js/.favicon-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "masterPicture": "helpers.source/gfx/svg/starter-project.svg", 3 | "temp": "helpers.source/favicons/", 4 | "dest": "helpers.dist/favicons/", 5 | "iconsPath": "/favicons/", 6 | "markupFile": "helpers.proot/gulpfile.js/.favicon-data-generated.json", 7 | "design": { 8 | "ios": { 9 | "pictureAspect": "backgroundAndMargin", 10 | "backgroundColor": "#ffffff", 11 | "margin": "14%", 12 | "assets": { 13 | "ios6AndPriorIcons": false, 14 | "ios7AndLaterIcons": false, 15 | "precomposedIcons": false, 16 | "declareOnlyDefaultIcon": true 17 | }, 18 | "appName": "Starter Project" 19 | }, 20 | "desktopBrowser": {}, 21 | "windows": { 22 | "pictureAspect": "noChange", 23 | "backgroundColor": "#1ed9d9", 24 | "onConflict": "override", 25 | "assets": { 26 | "windows80Ie10Tile": false, 27 | "windows10Ie11EdgeTiles": { 28 | "small": false, 29 | "medium": true, 30 | "big": false, 31 | "rectangle": false 32 | } 33 | }, 34 | "appName": "Starter Project" 35 | }, 36 | "androidChrome": { 37 | "pictureAspect": "shadow", 38 | "themeColor": "#1ed9d9", 39 | "manifest": { 40 | "name": "Starter Project", 41 | "display": "standalone", 42 | "orientation": "notSet", 43 | "onConflict": "override", 44 | "declared": true 45 | }, 46 | "assets": { 47 | "legacyIcon": false, 48 | "lowResolutionIcons": false 49 | } 50 | }, 51 | "safariPinnedTab": { 52 | "pictureAspect": "blackAndWhite", 53 | "threshold": 35.3125, 54 | "themeColor": "#d91a79" 55 | } 56 | }, 57 | "settings": { 58 | "compression": 5, 59 | "scalingAlgorithm": "Cubic", 60 | "errorOnImageTooSmall": false, 61 | "readmeFile": true, 62 | "htmlCodeFile": true, 63 | "usePathAsIs": false 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.favicon.json: -------------------------------------------------------------------------------- 1 | { 2 | "src": "helpers.source/config.html.src/_assets/favicon.pug", 3 | "dest": "helpers.source/config.html.src/_assets" 4 | } 5 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.gfx.json: -------------------------------------------------------------------------------- 1 | { 2 | "gifConfig": { 3 | "interlaced": true 4 | }, 5 | "jpegConfig": { 6 | "quality": 90, 7 | "progressive": true 8 | }, 9 | "pngConfig": { 10 | "quality": [0.8, 0.9] 11 | }, 12 | "svgConfig": { 13 | "plugins": [ 14 | { 15 | "cleanupAttrs": true 16 | }, 17 | { 18 | "removeDoctype": true 19 | }, 20 | { 21 | "removeComments": true 22 | }, 23 | { 24 | "removeXMLProcInst": true 25 | }, 26 | { 27 | "removeMetadata": true 28 | }, 29 | { 30 | "removeTitle": false 31 | }, 32 | { 33 | "removeDesc": false 34 | }, 35 | { 36 | "removeUselessDefs": true 37 | }, 38 | { 39 | "removeXMLNS": false 40 | }, 41 | { 42 | "removeEditorsNSData": true 43 | }, 44 | { 45 | "removeEmptyAttrs": true 46 | }, 47 | { 48 | "removeHiddenElems": false 49 | }, 50 | { 51 | "removeEditorsNSData": true 52 | }, 53 | { 54 | "removeEmptyText": true 55 | }, 56 | { 57 | "removeEmptyContainers": true 58 | }, 59 | { 60 | "removeViewBox": false 61 | }, 62 | { 63 | "cleanupEnableBackground": true 64 | }, 65 | { 66 | "convertStyleToAttrs": true 67 | }, 68 | { 69 | "convertColors": true 70 | }, 71 | { 72 | "convertPathData": true 73 | }, 74 | { 75 | "convertTransform": true 76 | }, 77 | { 78 | "removeUnknownsAndDefaults": true 79 | }, 80 | { 81 | "removeNonInheritableGroupAttrs": true 82 | }, 83 | { 84 | "removeUselessStrokeAndFill": true 85 | }, 86 | { 87 | "removeUnusedNS": true 88 | }, 89 | { 90 | "cleanupIDs": false 91 | }, 92 | { 93 | "cleanupNumericValues": true 94 | }, 95 | { 96 | "cleanupListOfValues": true 97 | }, 98 | { 99 | "moveElemsAttrsToGroup": true 100 | }, 101 | { 102 | "moveGroupAttrsToElems": false 103 | }, 104 | { 105 | "collapseGroups": true 106 | }, 107 | { 108 | "removeRasterImages": true 109 | }, 110 | { 111 | "mergePaths": true 112 | }, 113 | { 114 | "convertShapeToPath": false 115 | }, 116 | { 117 | "sortAttrs": true 118 | }, 119 | { 120 | "removeDimensions": true 121 | }, 122 | { 123 | "removeAttrs": false 124 | }, 125 | { 126 | "removeElementsByAttr": false 127 | }, 128 | { 129 | "addClassesToSVGElement": false 130 | }, 131 | { 132 | "addAttributesToSVGElement": false 133 | }, 134 | { 135 | "removeStyleElement": false 136 | }, 137 | { 138 | "removeScriptElement": false 139 | }, 140 | { 141 | "removeDimensions": false 142 | } 143 | ] 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.helpers.json: -------------------------------------------------------------------------------- 1 | { 2 | "wait": 30000 3 | } 4 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.html.json: -------------------------------------------------------------------------------- 1 | { 2 | "pugConfig": { 3 | "basedir": "", 4 | "pretty": true 5 | }, 6 | "htmllintConfig": { 7 | "config": "", 8 | "failOnError": false 9 | }, 10 | "htmlminConfig": { 11 | "collapseWhitespace": true 12 | }, 13 | "renameConfig": { 14 | "extname": ".html" 15 | }, 16 | "inlineConfig": { 17 | "rootpath": "" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.js.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslintConfig": { 3 | "configFile": "helpers.proot/.eslintrc.json", 4 | "fix": true, 5 | "quiet": true 6 | }, 7 | "includeConfig": { 8 | "hardFail": true, 9 | "includePaths": [ 10 | "helpers.proot/node_modules" 11 | ] 12 | }, 13 | "babelConfig": { 14 | "presets": ["@babel/env"] 15 | }, 16 | "renameConfig": { 17 | "suffix": ".min" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.jsdoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "src": [ 3 | "helpers.source/config.js.src/homepage.md", 4 | "helpers.source/config.js.src/" 5 | ], 6 | "settings": { 7 | "tags": { 8 | "allowUnknownTags": true 9 | }, 10 | "opts": { 11 | "destination": "helpers.dist/config.jsdoc.dist/" 12 | }, 13 | "plugins": [ 14 | "plugins/markdown" 15 | ], 16 | "templates": { 17 | "cleverLinks": true, 18 | "monospaceLinks": false, 19 | "default": { 20 | "outputSourceFiles": true 21 | }, 22 | "path": "ink-docstrap", 23 | "theme": "simplex", 24 | "navType": "vertical", 25 | "linenums": true, 26 | "dateFormat": "MMMM Do YYYY, h:mm:ss a" 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.kss.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Starter Project", 3 | "source": "helpers.source", 4 | "destination": "helpers.dist/config.kss.dist/", 5 | "css": [ 6 | "helpers.dist/config.css.dist/style.css" 7 | ], 8 | "js": [] 9 | } 10 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.sassdoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "dest": "helpers.dist/config.sassdoc.dist/", 3 | "package": "package.json", 4 | "autofill": true, 5 | "verbose": true, 6 | "theme": "default", 7 | "display": { 8 | "access": ["public", "private"], 9 | "alias": true, 10 | "watermark": true 11 | }, 12 | "groups": { 13 | "undefined": "Misc" 14 | }, 15 | "basePath": "https://starter.silvestar.codes/docs/sass/" 16 | } 17 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.starter-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "proot": "./", 3 | "src": "src", 4 | "dist": "dist", 5 | "sync": { 6 | "run": true 7 | }, 8 | "html": { 9 | "run": true, 10 | "pug": true, 11 | "data": false, 12 | "inline": true, 13 | "src": "html", 14 | "dist": "", 15 | "minify": true, 16 | "lint": true 17 | }, 18 | "css": { 19 | "run": true, 20 | "sass": true, 21 | "src": "scss", 22 | "dist": "css", 23 | "minify": true, 24 | "autoprefix": true, 25 | "sourcemaps": true, 26 | "lint": true 27 | }, 28 | "js": { 29 | "run": true, 30 | "src": "js", 31 | "dist": "js", 32 | "uglify": true, 33 | "sourcemaps": true, 34 | "lint": true 35 | }, 36 | "gfx": { 37 | "run": true, 38 | "src": "gfx", 39 | "dist": "gfx" 40 | }, 41 | "fonts": { 42 | "run": true, 43 | "src": "fonts", 44 | "dist": "fonts" 45 | }, 46 | "favicon": { 47 | "run": true 48 | }, 49 | "critical": { 50 | "run": true 51 | }, 52 | "kss": { 53 | "run": true, 54 | "dist": "docs/styleguide" 55 | }, 56 | "sassdoc": { 57 | "run": true, 58 | "dist": "docs/sass" 59 | }, 60 | "jsdoc": { 61 | "run": true, 62 | "dist": "docs/js" 63 | }, 64 | "bump": { 65 | "run": true 66 | }, 67 | "yarn": true 68 | } 69 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.sync.json: -------------------------------------------------------------------------------- 1 | { 2 | "port": 8080, 3 | "server": { 4 | "baseDir": "" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/.watch.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignoreInitial": true 3 | } 4 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/bump.js: -------------------------------------------------------------------------------- 1 | const { src, dest } = require('gulp'); 2 | const bump = require('gulp-bump'); 3 | 4 | const { helpers } = require('./helpers'); 5 | 6 | const bumpConfig = require('./.bump.json'); 7 | 8 | // Will patch the version 9 | function patch(cb) { 10 | src(bumpConfig.src.map((path) => helpers.parse(path))) 11 | .pipe(bump()) 12 | .pipe(dest(global.config.proot)); 13 | 14 | cb(); 15 | } 16 | 17 | // Will update minor version 18 | function minor(cb) { 19 | src(bumpConfig.src.map((path) => helpers.parse(path))) 20 | .pipe(bump({ 21 | type: 'minor', 22 | })) 23 | .pipe(dest(global.config.proot)); 24 | 25 | cb(); 26 | } 27 | 28 | // Will update major version 29 | function major(cb) { 30 | src(bumpConfig.src.map((path) => helpers.parse(path))) 31 | .pipe(bump({ 32 | type: 'major', 33 | })) 34 | .pipe(dest(global.config.proot)); 35 | 36 | cb(); 37 | } 38 | 39 | // Will update prerelease version 40 | function prerelease(cb) { 41 | src(bumpConfig.src.map((path) => helpers.parse(path))) 42 | .pipe(bump({ 43 | type: 'prerelease', 44 | })) 45 | .pipe(dest(global.config.proot)); 46 | 47 | cb(); 48 | } 49 | 50 | exports.bump = { 51 | patch, 52 | minor, 53 | major, 54 | prerelease, 55 | }; 56 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/clean.js: -------------------------------------------------------------------------------- 1 | // const gulp = require('gulp') 2 | const del = require('del'); 3 | 4 | const { helpers } = require('./helpers'); 5 | 6 | // Will delete dist folder 7 | function cleanStart() { 8 | return del(helpers.dist()); 9 | } 10 | 11 | exports.clean = { 12 | cleanStart, 13 | }; 14 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/critical.js: -------------------------------------------------------------------------------- 1 | const { src, dest } = require('gulp'); 2 | const critical = require('gulp-penthouse'); 3 | const cleanCSS = require('gulp-clean-css'); 4 | const rename = require('gulp-rename'); 5 | const fs = require('fs'); 6 | 7 | critical.DEBUG = process.env.NODE_ENV !== 'production'; 8 | 9 | const { helpers } = require('./helpers'); 10 | 11 | const criticalConfig = require('./.critical.json'); 12 | 13 | if (criticalConfig.configs.length > 9) { 14 | process.setMaxListeners(0); 15 | } 16 | 17 | const cssConfig = require('./.css.json'); 18 | 19 | const thisCriticalConfig = { ...criticalConfig, temp: `${helpers.parse(criticalConfig.temp)}` }; 20 | 21 | // Will extract Critical CSS 22 | function criticalStart(cb) { 23 | const files = []; 24 | 25 | thisCriticalConfig.configs.forEach((config) => { 26 | const thisSettings = { ...config.settings, out: helpers.trim(`/${config.settings.out}`) }; 27 | 28 | const thisFile = helpers.trim(`${thisCriticalConfig.temp}/${thisSettings.out}`); 29 | 30 | files.push(thisFile); 31 | 32 | if (fs.existsSync(thisFile)) { 33 | src(thisFile.replace('.css', '*.css')) 34 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.css.dist}`))); 35 | } else { 36 | const thisConfig = { 37 | ...config, 38 | src: helpers.trim(`${helpers.dist()}/${global.config.css.dist}/${config.src}`), 39 | settings: thisSettings, 40 | }; 41 | 42 | src(thisConfig.src) 43 | .pipe(critical(thisConfig.settings)) 44 | .pipe(dest(helpers.trim(`${thisCriticalConfig.temp}`))) 45 | .pipe(cleanCSS()) 46 | .pipe(rename(cssConfig.renameConfig)) 47 | .pipe(dest(helpers.trim(`${thisCriticalConfig.temp}`))) 48 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.css.dist}`))); 49 | } 50 | }); 51 | 52 | const checkInterval = setInterval(() => { 53 | let checkFile = true; 54 | 55 | files.forEach((file) => { 56 | if (!fs.existsSync(file)) { 57 | checkFile = false; 58 | } 59 | }); 60 | 61 | if (checkFile) { 62 | clearInterval(checkInterval); 63 | cb(); 64 | } 65 | }, 250); 66 | 67 | return checkInterval; 68 | } 69 | 70 | exports.critical = { 71 | criticalStart, 72 | }; 73 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/css.js: -------------------------------------------------------------------------------- 1 | const { src, dest, watch } = require('gulp'); 2 | const gulpif = require('gulp-if'); 3 | const cssimport = require('gulp-cssimport'); 4 | const gulpStylelint = global.config.css.lint ? require('gulp-stylelint') : () => true; 5 | const sass = global.config.css.sass ? require('gulp-sass') : () => true; 6 | const autoprefixer = global.config.css.autoprefix ? require('gulp-autoprefixer') : () => true; 7 | const sourcemaps = global.config.css.sourcemaps ? require('gulp-sourcemaps') : () => true; 8 | const cleanCSS = global.config.css.minify ? require('gulp-clean-css') : () => true; 9 | const rename = global.config.css.minify ? require('gulp-rename') : () => true; 10 | 11 | const { helpers } = require('./helpers'); 12 | 13 | const cssConfig = require('./.css.json'); 14 | 15 | const ext = global.config.css.sass ? 'scss' : 'css'; 16 | 17 | const thisSassConfig = (global.config.css.sass) 18 | ? ({ 19 | ...cssConfig.sassConfig, 20 | includePaths: cssConfig.sassConfig.includePaths.map((path) => helpers.parse(path)), 21 | }) 22 | : {}; 23 | 24 | // gulp-if fix 25 | if (!global.config.css.sourcemaps) { 26 | sourcemaps.init = () => true; 27 | sourcemaps.write = () => true; 28 | } 29 | 30 | // Will process Sass files 31 | function cssStart() { 32 | return src(helpers.trim(`${helpers.source()}/${global.config.css.src}/*.${ext}`)) 33 | .pipe(gulpif(global.config.css.sourcemaps, sourcemaps.init())) 34 | .pipe(gulpif(global.config.css.lint, gulpStylelint(cssConfig.styleLintConfig))) 35 | .pipe(gulpif(global.config.css.sass, sass(thisSassConfig).on('error', sass.logError))) 36 | .pipe(cssimport()) 37 | .pipe(gulpif(global.config.css.autoprefix, autoprefixer(cssConfig.autoprefixerConfig))) 38 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.css.dist}`))) 39 | .pipe(gulpif(global.config.css.minify, cleanCSS())) 40 | .pipe(gulpif(global.config.css.minify, rename(cssConfig.renameConfig))) 41 | .pipe(gulpif(global.config.css.sourcemaps, sourcemaps.write(helpers.trim(`${helpers.source()}/${global.config.css.dist}`)))) 42 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.css.dist}`))) 43 | .pipe(gulpif(global.config.sync.run, global.bs.stream())); 44 | } 45 | 46 | // Will process non Critical Sass files 47 | function cssStartListen() { 48 | return src([helpers.trim(`${helpers.source()}/${global.config.css.src}/*.${ext}`), helpers.trim(`!${helpers.source()}/${global.config.css.src}/*.critical.${ext}`)]) 49 | .pipe(gulpif(global.config.css.sourcemaps, sourcemaps.init())) 50 | .pipe(gulpif(global.config.css.lint, gulpStylelint(cssConfig.styleLintConfig))) 51 | .pipe(gulpif(global.config.css.sass, sass(thisSassConfig).on('error', sass.logError))) 52 | .pipe(cssimport()) 53 | .pipe(gulpif(global.config.css.autoprefix, autoprefixer(cssConfig.autoprefixerConfig))) 54 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.css.dist}`))) 55 | .pipe(gulpif(global.config.css.minify, cleanCSS())) 56 | .pipe(gulpif(global.config.css.minify, rename(cssConfig.renameConfig))) 57 | .pipe(gulpif(global.config.css.sourcemaps, sourcemaps.write(helpers.trim(`${helpers.source()}/${global.config.css.dist}`)))) 58 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.css.dist}`))) 59 | .pipe(gulpif(global.config.sync.run, global.bs.stream())); 60 | } 61 | 62 | // When Sass file is changed, it will process Sass file, too 63 | function cssListen() { 64 | return watch(helpers.trim(`${helpers.source()}/${global.config.css.src}/**/*.${ext}`), global.config.watchConfig, cssStartListen, global.bs.reload); 65 | } 66 | 67 | exports.css = { 68 | cssStart, 69 | cssListen, 70 | }; 71 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/favicon.js: -------------------------------------------------------------------------------- 1 | const { src, dest, watch } = require('gulp'); 2 | const realFavicon = require('gulp-real-favicon'); 3 | const fs = require('fs'); 4 | 5 | const { helpers } = require('./helpers'); 6 | 7 | const faviconConfig = require('./.favicon.json'); 8 | const faviconDataConfig = require('./.favicon-data.json'); 9 | 10 | const thisFaviconDataConfig = { 11 | ...faviconDataConfig, 12 | masterPicture: `${helpers.parse(faviconDataConfig.masterPicture)}`, 13 | temp: `${helpers.parse(faviconDataConfig.temp)}`, 14 | dest: `${helpers.parse(faviconDataConfig.dest)}`, 15 | iconsPath: `${helpers.parse(faviconDataConfig.iconsPath)}`, 16 | markupFile: `${helpers.parse(faviconDataConfig.markupFile)}`, 17 | }; 18 | 19 | // Will process favicon file 20 | function faviconStart(cb) { 21 | if (fs.existsSync(helpers.trim(`${thisFaviconDataConfig.temp}/favicon.ico`))) { 22 | src(helpers.trim(`${thisFaviconDataConfig.temp}/*`)) 23 | .pipe(dest(helpers.trim(`${thisFaviconDataConfig.dest}`))); 24 | 25 | cb(); 26 | } else { 27 | realFavicon.generateFavicon(thisFaviconDataConfig, () => { 28 | if (fs.existsSync(thisFaviconDataConfig.markupFile)) { 29 | src(helpers.trim(`${thisFaviconDataConfig.dest}/*`)) 30 | .pipe(dest(helpers.trim(`${thisFaviconDataConfig.temp}`))); 31 | 32 | const parsedFaviconFile = JSON.parse(fs.readFileSync(thisFaviconDataConfig.markupFile)); 33 | 34 | src(helpers.parse(faviconConfig.src)) 35 | .pipe(realFavicon.injectFaviconMarkups(parsedFaviconFile.favicon.html_code)) 36 | .pipe(dest(helpers.parse(faviconConfig.dest))); 37 | } 38 | 39 | cb(); 40 | }); 41 | } 42 | } 43 | 44 | // When favicon file change, it will process favicon file, too 45 | function faviconListen() { 46 | return watch(helpers.trim(`${helpers.source()}/${global.config.favicon.src}/**/*`), global.config.watchConfig, faviconStart, global.bs.reload); 47 | } 48 | 49 | exports.favicon = { 50 | faviconStart, 51 | faviconListen, 52 | }; 53 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/fonts.js: -------------------------------------------------------------------------------- 1 | const { src, dest, watch } = require('gulp'); 2 | 3 | const { helpers } = require('./helpers'); 4 | 5 | // Will process font files, too 6 | function fontsStart() { 7 | return src(helpers.trim(`${helpers.source()}/${global.config.fonts.src}/**/*`)) 8 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.fonts.dist}`))); 9 | } 10 | 11 | // When font is changed, it will process font file, too 12 | function fontsListen() { 13 | return watch(helpers.trim(`${helpers.source()}/${global.config.fonts.src}/**/*`), global.config.watchConfig, fontsStart, global.bs.reload); 14 | } 15 | 16 | exports.fonts = { 17 | fontsStart, 18 | fontsListen, 19 | }; 20 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/gfx.js: -------------------------------------------------------------------------------- 1 | const { src, dest, watch } = require('gulp'); 2 | const gulpif = require('gulp-if'); 3 | const imagemin = require('gulp-imagemin'); 4 | const imageminMozjpeg = require('imagemin-mozjpeg'); 5 | const imageminPngquant = require('imagemin-pngquant'); 6 | 7 | const { helpers } = require('./helpers'); 8 | 9 | const gfxConfig = require('./.gfx.json'); 10 | 11 | // Will process image files 12 | function gfxStart() { 13 | return src(helpers.trim(`${helpers.source()}/${global.config.gfx.src}/**/*`)) 14 | .pipe(imagemin([ 15 | imagemin.gifsicle(gfxConfig.gifConfig), 16 | imageminMozjpeg(gfxConfig.jpegConfig), 17 | imageminPngquant(gfxConfig.pngConfig), 18 | imagemin.svgo(gfxConfig.svgConfig), 19 | ])) 20 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.gfx.dist}`))) 21 | .pipe(gulpif(global.config.sync.run, global.bs.stream())); 22 | } 23 | 24 | // When image is changed, it will process image file, too 25 | function gfxListen() { 26 | return watch(helpers.trim(`${helpers.source()}/${global.config.gfx.src}/**/*`), global.config.watchConfig, gfxStart, global.bs.reload); 27 | } 28 | 29 | exports.gfx = { 30 | gfxStart, 31 | gfxListen, 32 | }; 33 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/helpers.js: -------------------------------------------------------------------------------- 1 | const { src } = require('gulp'); 2 | const exit = require('gulp-exit'); 3 | const wait = require('gulp-wait'); 4 | 5 | const helpersConfig = require('./.helpers.json'); 6 | 7 | // Will remove end slash from path 8 | const trim = (p) => { 9 | let r = p; 10 | while (r.indexOf('..') !== -1) { 11 | r = r.replace('..', ''); 12 | } 13 | 14 | while (r.indexOf('//') !== -1) { 15 | r = r.replace('//', '/'); 16 | } 17 | 18 | return r; 19 | }; 20 | 21 | // Will return root folder 22 | const proot = () => trim(`${global.config.proot}/`); 23 | 24 | // Will return root src folder 25 | const source = () => trim(`${global.config.proot}/${global.config.src}`); 26 | 27 | // Will return root dest folder 28 | const dist = () => trim(`${global.config.proot}/${global.config.dist}`); 29 | 30 | // Will parse path 31 | const parse = (p) => p.replace('helpers.proot/', proot()) 32 | .replace('helpers.dist', dist()).replace('helpers.source', source()) 33 | .replace('config.css.src', global.config.css.src) 34 | .replace('config.css.dist', global.config.css.dist) 35 | .replace('config.js.src', global.config.js.src) 36 | .replace('config.js.dist', global.config.js.dist) 37 | .replace('config.html.src', global.config.html.src) 38 | .replace('config.html.dist', global.config.html.dist) 39 | .replace('config.gfx.src', global.config.gfx.src) 40 | .replace('config.gfx.dist', global.config.gfx.dist) 41 | .replace('config.kss.dist', global.config.kss.dist) 42 | .replace('config.sassdoc.dist', global.config.sassdoc.dist) 43 | .replace('config.jsdoc.dist', global.config.jsdoc.dist); 44 | 45 | // Will skip the task 46 | const skip = (cb) => cb(); 47 | 48 | // Will kill all tasks after delay 49 | const kill = (cb) => { 50 | src(proot()) 51 | .pipe(wait(helpersConfig.wait)) 52 | .pipe(exit()); 53 | 54 | cb(); 55 | }; 56 | 57 | // Will kill all tasks immidiately 58 | const killNow = (cb) => { 59 | src(proot()) 60 | .pipe(exit()); 61 | 62 | cb(); 63 | }; 64 | 65 | exports.helpers = { 66 | proot, 67 | trim, 68 | source, 69 | dist, 70 | skip, 71 | kill, 72 | killNow, 73 | parse, 74 | }; 75 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/html.js: -------------------------------------------------------------------------------- 1 | const { src, dest, watch } = require('gulp'); 2 | const gulpif = require('gulp-if'); 3 | const rename = require('gulp-rename'); 4 | const path = require('path'); 5 | const pug = global.config.html.pug ? require('gulp-pug') : () => true; 6 | const data = global.config.html.data ? require('gulp-data') : () => true; 7 | const htmlmin = global.config.html.minify ? require('gulp-htmlmin') : () => true; 8 | const htmllint = global.config.html.lint ? require('gulp-htmllint') : () => true; 9 | const inlineSource = global.config.html.inline ? require('gulp-inline-source') : () => true; 10 | const fs = global.config.html.inline ? require('fs') : () => true; 11 | 12 | const { helpers } = require('./helpers'); 13 | 14 | const htmlConfig = require('./.html.json'); 15 | 16 | const ext = global.config.html.pug ? 'pug' : 'html'; 17 | 18 | let thisPugConfig = {}; 19 | 20 | const siteConfigs = global.config.html.data ? [{ 21 | name: 'site', 22 | path: helpers.trim(`${helpers.proot()}/data/site.json`), 23 | }] : {}; 24 | 25 | if (global.config.html.pug) { 26 | thisPugConfig = htmlConfig.pugConfig.basedir 27 | ? htmlConfig.pugConfig 28 | : ({ 29 | ...htmlConfig.pugConfig, 30 | basedir: helpers.trim(`${helpers.source()}/${global.config.html.src}/`) }); 31 | } 32 | 33 | let thisHtmllintConfig = {}; 34 | 35 | if (global.config.html.lint) { 36 | thisHtmllintConfig = htmlConfig.htmllintConfig.config 37 | ? htmlConfig.htmllintConfig.config 38 | : ({ ...htmlConfig.htmllintConfig, config: `${helpers.proot()}.htmllintrc` }); 39 | } 40 | 41 | let thisInlineConfig = {}; 42 | 43 | if (global.config.html.inline) { 44 | thisInlineConfig = htmlConfig.inlineConfig.rootpath 45 | ? htmlConfig.inlineConfig 46 | : ({ ...htmlConfig.inlineConfig, rootpath: path.resolve(helpers.dist()) }); 47 | } 48 | 49 | const htmlSrc = global.config.html.pug 50 | ? [helpers.trim(`${helpers.source()}/${global.config.html.src}/**/*.${ext}`), helpers.trim(`!${helpers.source()}/${global.config.html.src}/_**/*.${ext}`), helpers.trim(`!${helpers.source()}/${global.config.html.src}/**/_**/*.${ext}`)] 51 | : helpers.trim(`${helpers.source()}/${global.config.html.src}/**/*.html`); 52 | 53 | // Will process Pug files 54 | function htmlStart() { 55 | return src(htmlSrc) 56 | .pipe(gulpif(global.config.html.data, data(() => { 57 | const temp = {}; 58 | 59 | siteConfigs.forEach((siteConfig) => { 60 | temp[siteConfig.name] = JSON.parse(fs.readFileSync(siteConfig.path)); 61 | }); 62 | 63 | return temp; 64 | }))) 65 | .pipe(gulpif(global.config.html.pug, pug(thisPugConfig))) 66 | .pipe(gulpif(global.config.html.lint, htmllint(thisHtmllintConfig))) 67 | .pipe(gulpif(global.config.html.inline, inlineSource(thisInlineConfig))) 68 | .pipe(gulpif(global.config.html.minify, htmlmin(htmlConfig.htmlminConfig))) 69 | .pipe(rename(htmlConfig.renameConfig)) 70 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.html.dist}`))) 71 | .pipe(gulpif(global.config.sync.run, global.bs.stream())); 72 | } 73 | 74 | // When Pug, md, or config file is changed, it will process Pug file, too 75 | function htmlListen() { 76 | return watch([...(global.config.html.data ? siteConfigs.map((siteConfig) => siteConfig.path) : ''), helpers.trim(`${helpers.source()}/${global.config.html.src}/**/*.${ext}`), helpers.trim(`${helpers.source()}/${global.config.html.src}/**/*.md`)], global.config.watchConfig, htmlStart); 77 | } 78 | 79 | exports.html = { 80 | htmlStart, 81 | htmlListen, 82 | }; 83 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/index.js: -------------------------------------------------------------------------------- 1 | const { series, parallel } = require('gulp'); 2 | 3 | const { helpers } = require('./helpers'); 4 | 5 | global.config = require('./.starter-project.json'); 6 | 7 | global.config.watchConfig = require('./.watch.json'); 8 | 9 | global.bs = global.config.sync.run ? require('browser-sync').create() : () => true; 10 | 11 | const { clean } = require('./clean'); 12 | const { sync } = global.config.sync.run ? require('./sync') : false; 13 | const { bump } = global.config.bump.run ? require('./bump') : false; 14 | const { css } = global.config.css.run ? require('./css') : false; 15 | const { js } = global.config.js.run ? require('./js') : false; 16 | const { gfx } = global.config.gfx.run ? require('./gfx') : false; 17 | const { fonts } = global.config.fonts.run ? require('./fonts') : false; 18 | const { favicon } = global.config.favicon.run ? require('./favicon') : false; 19 | const { html } = global.config.html.run ? require('./html') : false; 20 | const { critical } = global.config.critical.run ? require('./critical') : false; 21 | 22 | const { kss } = global.config.kss.run ? require('./kss') : false; 23 | const { sassdoc } = global.config.sassdoc.run ? require('./sassdoc') : false; 24 | const { jsdoc } = global.config.jsdoc.run ? require('./jsdoc') : false; 25 | 26 | if (global.config.bump.run) { 27 | exports.bumpPatch = bump.patch; 28 | exports.bumpMinor = bump.minor; 29 | exports.bumpPrerelease = bump.prerelease; 30 | } 31 | 32 | // gulp-if fix 33 | if (!global.config.sync.run) { 34 | global.bs.stream = () => true; 35 | global.bs.reload = () => true; 36 | } 37 | 38 | exports.clean = clean.cleanStart; 39 | 40 | exports.dev = series( 41 | clean.cleanStart, 42 | parallel( 43 | global.config.css.run ? css.cssStart : helpers.skip, 44 | global.config.js.run ? js.jsStartDev : helpers.skip, 45 | global.config.gfx.run ? gfx.gfxStart : helpers.skip, 46 | global.config.fonts.run ? fonts.fontsStart : helpers.skip, 47 | ), 48 | global.config.html.run ? html.htmlStart : helpers.skip, 49 | global.config.sync.run ? sync.syncStart : helpers.skip, 50 | parallel( 51 | global.config.css.run ? css.cssListen : helpers.skip, 52 | global.config.js.run ? js.jsListen : helpers.skip, 53 | global.config.gfx.run ? gfx.gfxListen : helpers.skip, 54 | global.config.fonts.run ? fonts.fontsListen : helpers.skip, 55 | global.config.html.run ? html.htmlListen : helpers.skip, 56 | ), 57 | ); 58 | 59 | exports.build = series( 60 | clean.cleanStart, 61 | parallel( 62 | global.config.favicon.run ? favicon.faviconStart : helpers.skip, 63 | global.config.css.run ? css.cssStart : helpers.skip, 64 | global.config.js.run ? js.jsStartProd : helpers.skip, 65 | global.config.gfx.run ? gfx.gfxStart : helpers.skip, 66 | global.config.fonts.run ? fonts.fontsStart : helpers.skip, 67 | ), 68 | global.config.html.run ? html.htmlStart : helpers.skip, 69 | global.config.kss.run ? kss.kssStart : helpers.skip, 70 | global.config.sassdoc.run ? sassdoc.sassdocStart : helpers.skip, 71 | global.config.jsdoc.run ? jsdoc.jsdocStart : helpers.skip, 72 | global.config.sync.run && global.config.critical.run ? sync.syncStartBuild : helpers.skip, 73 | global.config.critical.run ? critical.criticalStart : helpers.skip, 74 | global.config.sync.run && global.config.critical.run ? sync.syncStop : helpers.skip, 75 | global.config.html.run 76 | && global.config.html.pug 77 | && global.config.critical.run ? html.htmlStart : helpers.skip, 78 | helpers.killNow, 79 | ); 80 | 81 | exports.default = series( 82 | clean.cleanStart, 83 | parallel( 84 | global.config.favicon.run ? favicon.faviconStart : helpers.skip, 85 | global.config.css.run ? css.cssStart : helpers.skip, 86 | global.config.js.run ? js.jsStartProd : helpers.skip, 87 | global.config.gfx.run ? gfx.gfxStart : helpers.skip, 88 | global.config.fonts.run ? fonts.fontsStart : helpers.skip, 89 | ), 90 | global.config.html.run ? html.htmlStart : helpers.skip, 91 | global.config.kss.run ? kss.kssStart : helpers.skip, 92 | global.config.sassdoc.run ? sassdoc.sassdocStart : helpers.skip, 93 | global.config.jsdoc.run ? jsdoc.jsdocStart : helpers.skip, 94 | global.config.sync.run ? sync.syncStart : helpers.skip, 95 | global.config.critical.run ? critical.criticalStart : helpers.skip, 96 | global.config.html.run 97 | && global.config.html.pug 98 | && global.config.critical.run ? html.htmlStart : helpers.skip, 99 | parallel( 100 | global.config.css.run ? css.cssListen : helpers.skip, 101 | global.config.js.run ? js.jsListen : helpers.skip, 102 | global.config.gfx.run ? gfx.gfxListen : helpers.skip, 103 | global.config.fonts.run ? fonts.fontsListen : helpers.skip, 104 | global.config.html.run ? html.htmlListen : helpers.skip, 105 | global.config.kss.run ? kss.kssListen : helpers.skip, 106 | global.config.sassdoc.run ? sassdoc.sassdocListen : helpers.skip, 107 | global.config.jsdoc.run ? jsdoc.jsdocListen : helpers.skip, 108 | ), 109 | ); 110 | 111 | 112 | // user warnings 113 | console.log(`IMPORTANT NOTICE! 114 | Since version 2.2.7, Starter Project is using updated Critical tasks and config. 115 | See more here: https://starter.silvestar.codes/#critical-css-configuration. 116 | 117 | Project homepage: https://starter.silvestar.codes. 118 | Developed by Silvestar: https://www.silvestar.codes. 119 | `); 120 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/js.js: -------------------------------------------------------------------------------- 1 | const { src, dest, watch } = require('gulp'); 2 | const gulpif = require('gulp-if'); 3 | const eslint = global.config.js.lint ? require('gulp-eslint') : () => true; 4 | const sourcemaps = global.config.js.sourcemaps ? require('gulp-sourcemaps') : () => true; 5 | const rename = global.config.js.uglify ? require('gulp-rename') : () => true; 6 | const webpack = require('webpack'); 7 | const gulpWebpack = require('webpack-stream'); 8 | 9 | const { helpers } = require('./helpers'); 10 | 11 | const jsConfig = require('./.js.json'); 12 | const webpackConfig = require('./webpack.js'); 13 | 14 | // gulp-if fix 15 | if (!global.config.css.sourcemaps) { 16 | sourcemaps.init = () => true; 17 | sourcemaps.write = () => true; 18 | } 19 | 20 | const thisEslintConfig = (global.config.js.lint) 21 | ? ({ ...jsConfig.eslintConfig, configFile: helpers.parse(jsConfig.eslintConfig.configFile) }) 22 | : {}; 23 | 24 | if (!global.config.js.lint) { 25 | eslint.format = () => true; 26 | eslint.failAfterError = () => true; 27 | eslint.result = () => true; 28 | } 29 | 30 | webpackConfig.devtool = (global.config.js.sourcemaps) ? 'sourcemaps' : ''; 31 | 32 | // Will process JS files 33 | function jsStart() { 34 | return src(helpers.trim(`${helpers.source()}/${global.config.js.src}/*.js`)) 35 | .pipe(gulpif(global.config.js.sourcemaps, sourcemaps.init())) 36 | .pipe(gulpif(global.config.js.lint, eslint(thisEslintConfig))) 37 | .pipe(gulpif(global.config.js.lint, eslint.format())) 38 | .pipe(gulpif(global.config.js.lint, eslint.failAfterError())) 39 | .pipe(gulpif(global.config.js.lint, eslint.result((result) => { 40 | console.log(`[JS] ESLint complete: ${result.filePath}`); 41 | console.log(`[JS] Messages: ${result.messages.length}`); 42 | console.warn(`[JS] Warnings: ${result.warningCount}`); 43 | console.error(`[JS] Errors: ${result.errorCount}`); 44 | }))) 45 | .pipe( 46 | gulpWebpack(webpackConfig), 47 | webpack, 48 | ) 49 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.js.dist}`))) 50 | .pipe(gulpif(global.config.js.uglify, rename(jsConfig.renameConfig))) 51 | .pipe(gulpif(global.config.js.sourcemaps, sourcemaps.write(helpers.trim(`${helpers.source()}/${global.config.js.dist}`)))) 52 | .pipe(dest(helpers.trim(`${helpers.dist()}/${global.config.js.dist}`))) 53 | .pipe(gulpif(global.config.sync.run, global.bs.stream())); 54 | } 55 | 56 | function jsStartDev(cb) { 57 | webpackConfig.mode = 'development'; 58 | 59 | jsStart(); 60 | 61 | cb(); 62 | } 63 | 64 | function jsStartProd(cb) { 65 | webpackConfig.mode = (global.config.js.uglify) ? 'production' : 'development'; 66 | 67 | jsStart(); 68 | 69 | cb(); 70 | } 71 | 72 | // When JS file is changed, it will process JS file, too 73 | function jsListen() { 74 | return watch(helpers.trim(`${helpers.source()}/${global.config.js.src}/*.js`), global.config.watchConfig, jsStart, global.bs.reload); 75 | } 76 | 77 | exports.js = { 78 | jsStart, 79 | jsStartDev, 80 | jsStartProd, 81 | jsListen, 82 | }; 83 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/jsdoc.js: -------------------------------------------------------------------------------- 1 | const { src, watch } = require('gulp'); 2 | const jsdoc = require('gulp-jsdoc3'); 3 | 4 | const { helpers } = require('./helpers'); 5 | 6 | const jsdocConfig = require('./.jsdoc.json'); 7 | 8 | const thisSrc = jsdocConfig.src.map((path) => helpers.parse(path)); 9 | 10 | const thisOpts = { 11 | ...jsdocConfig.settings.opts, 12 | destination: helpers.parse(jsdocConfig.settings.opts.destination), 13 | } 14 | 15 | const thisSettings = { 16 | ...jsdocConfig.settings, 17 | opts: thisOpts, 18 | } 19 | 20 | // Will process JSdoc docs 21 | function jsdocStart() { 22 | return src(thisSrc) 23 | .pipe(jsdoc(thisSettings)); 24 | } 25 | 26 | // When JS file is changed, it will process JSdoc docs, too 27 | function jsdocListen() { 28 | return watch([helpers.trim(`${helpers.source()}/${global.config.js.src}/*.js`), helpers.trim(`${helpers.source()}/${global.config.js.src}/*.md`)], global.config.watchConfig, jsdocStart, global.bs.reload); 29 | } 30 | 31 | exports.jsdoc = { 32 | jsdocStart, 33 | jsdocListen, 34 | }; 35 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/kss.js: -------------------------------------------------------------------------------- 1 | const { watch } = require('gulp'); 2 | const kss = require('kss'); 3 | 4 | const { helpers } = require('./helpers'); 5 | 6 | const kssConfig = require('./.kss.json'); 7 | 8 | const ext = global.config.css.sass ? 'scss' : 'css'; 9 | 10 | const thisCss = kssConfig.css.map((path) => helpers.parse(path)); 11 | const thisJs = kssConfig.js.map((path) => helpers.parse(path)); 12 | 13 | const thisKssConfig = { 14 | ...kssConfig, 15 | source: helpers.parse(kssConfig.source), 16 | destination: helpers.parse(kssConfig.destination), 17 | css: thisCss, 18 | js: thisJs, 19 | }; 20 | 21 | // Will process KSS docs 22 | function kssStart() { 23 | return kss(thisKssConfig); 24 | } 25 | 26 | // When Sass file is changed, it will process KSS docs, too 27 | function kssListen() { 28 | return watch(helpers.trim(`${helpers.source()}/${global.config.css.src}/**/*.${ext}`), global.config.watchConfig, kssStart, global.bs.reload); 29 | } 30 | 31 | exports.kss = { 32 | kssStart, 33 | kssListen, 34 | }; 35 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/sassdoc.js: -------------------------------------------------------------------------------- 1 | const { src, watch } = require('gulp'); 2 | const sassdoc = require('sassdoc'); 3 | 4 | const { helpers } = require('./helpers'); 5 | 6 | const sassdocConfig = require('./.sassdoc.json'); 7 | 8 | const ext = global.config.css.sass ? 'scss' : 'css'; 9 | 10 | const thisSassdocConfig = { 11 | ...sassdocConfig, 12 | package: `${helpers.proot()}${sassdocConfig.package}`, 13 | dest: helpers.parse(sassdocConfig.dest), 14 | }; 15 | 16 | // Will process SassDoc docs 17 | function sassdocStart() { 18 | return src(helpers.trim(`${helpers.source()}/${global.config.css.src}/**/*.${ext}`)) 19 | .pipe(sassdoc(thisSassdocConfig)); 20 | } 21 | 22 | // When Sass file is changed, it will process SassDoc docs, too 23 | function sassdocListen() { 24 | return watch(helpers.trim(`${helpers.source()}/${global.config.css.src}/**/*.${ext}`), global.config.watchConfig, sassdocStart, global.bs.reload); 25 | } 26 | 27 | exports.sassdoc = { 28 | sassdocStart, 29 | sassdocListen, 30 | }; 31 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/sync.js: -------------------------------------------------------------------------------- 1 | const { helpers } = require('./helpers'); 2 | 3 | const syncConfig = require('./.sync.json'); 4 | 5 | // Start static server 6 | function syncStart(cb) { 7 | if (global.config.sync.run) { 8 | let thisConfig = {}; 9 | 10 | if (syncConfig.proxy) { 11 | thisConfig = { 12 | ...syncConfig, 13 | proxy: syncConfig.proxy, 14 | }; 15 | } else { 16 | const thisServer = syncConfig.server.baseDir 17 | ? helpers.parse(syncConfig.server.baseDir) 18 | : ({ 19 | ...syncConfig.server, 20 | baseDir: helpers.dist(), 21 | }); 22 | 23 | thisConfig = { 24 | ...syncConfig, 25 | server: thisServer, 26 | }; 27 | } 28 | 29 | global.bs.init(thisConfig); 30 | } 31 | 32 | cb(); 33 | } 34 | 35 | // Start static dev server 36 | function syncStartBuild(cb) { 37 | syncConfig.open = false; 38 | 39 | syncStart(cb); 40 | } 41 | 42 | // Stop static server 43 | function syncStop(cb) { 44 | global.bs.cleanup(); 45 | global.bs.exit(); 46 | 47 | cb(); 48 | } 49 | 50 | exports.sync = { 51 | syncStart, 52 | syncStartBuild, 53 | syncStop, 54 | }; 55 | -------------------------------------------------------------------------------- /copy/_gulpfile.js/webpack.js: -------------------------------------------------------------------------------- 1 | const { helpers } = require('./helpers') 2 | const path = require('path') 3 | 4 | module.exports = { 5 | mode: 'production', 6 | entry: { 7 | script: helpers.parse('helpers.source/config.js.src/script.js') 8 | }, 9 | output: { 10 | path: path.resolve(`${__dirname}/${helpers.parse('helpers.dist/config.js.dist/')}`), 11 | filename: '[name].js' 12 | }, 13 | module: { 14 | rules: [ 15 | { 16 | test: /\.js$/, 17 | exclude: /node_modules/, 18 | use: { 19 | loader: 'babel-loader', 20 | options: { 21 | presets: ['@babel/env'] 22 | } 23 | } 24 | } 25 | ] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /gfx/ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maliMirkec/starter-project-cli/cdb788de243216697e1acf3e7864d27f22059699/gfx/ss.png -------------------------------------------------------------------------------- /gfx/starter-project-cli-npm.svg: -------------------------------------------------------------------------------- 1 | starter-project-clistarter-project-clinpmnpm 2 | -------------------------------------------------------------------------------- /gfx/starter-project-cli.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maliMirkec/starter-project-cli/cdb788de243216697e1acf3e7864d27f22059699/gfx/starter-project-cli.jpg -------------------------------------------------------------------------------- /gfx/starter-project-cli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maliMirkec/starter-project-cli/cdb788de243216697e1acf3e7864d27f22059699/gfx/starter-project-cli.png -------------------------------------------------------------------------------- /gfx/starter-project-npm.svg: -------------------------------------------------------------------------------- 1 | starter-projectstarter-projectnpmnpm 2 | -------------------------------------------------------------------------------- /gfx/starter-project-questions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maliMirkec/starter-project-cli/cdb788de243216697e1acf3e7864d27f22059699/gfx/starter-project-questions.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const program = require('commander'); 4 | const log = require('./lib/log'); 5 | const inquirer = require('./lib/inquirer'); 6 | const sp = require('./lib/starter-project'); 7 | 8 | log.clear(); 9 | log.figlet('S-PRO', false); 10 | log.message('\n ** Starter Project CLI **\n', false); 11 | 12 | program 13 | .version('1.0.33') 14 | .description('Starter Project CLI'); 15 | 16 | program 17 | .command('start') 18 | .alias('s') 19 | .description('Initialize Starter Project') 20 | .action(() => { 21 | inquirer.basicInteraction().then((answers) => { 22 | sp.run(answers); 23 | }); 24 | }); 25 | 26 | // program 27 | // .command('command') 28 | // .alias('c') 29 | // .description('Returns Gulp install command') 30 | // .action(() => { 31 | // sp.cmd(answers) 32 | // }) 33 | 34 | program.parse(process.argv); 35 | -------------------------------------------------------------------------------- /lib/config.js: -------------------------------------------------------------------------------- 1 | const Configstore = require('configstore'); 2 | 3 | const configPath = 'gulpfile.js/.starter-project.json'; 4 | 5 | const files = require('./files'); 6 | const log = require('./log'); 7 | 8 | const conf = new Configstore('starter-project-cli', { 9 | proot: './', 10 | src: 'src', 11 | dist: 'dist', 12 | sync: { 13 | run: true, 14 | }, 15 | html: { 16 | run: true, 17 | src: 'html', 18 | dist: '', 19 | pug: false, 20 | minify: true, 21 | inline: true, 22 | lint: true, 23 | }, 24 | css: { 25 | run: true, 26 | src: 'scss', 27 | dist: 'css', 28 | sass: true, 29 | minify: true, 30 | autoprefix: true, 31 | sourcemaps: true, 32 | lint: true, 33 | }, 34 | js: { 35 | run: true, 36 | src: 'js', 37 | dist: 'js', 38 | uglify: true, 39 | lint: true, 40 | sourcemaps: true, 41 | }, 42 | gfx: { 43 | run: true, 44 | src: 'gfx', 45 | dist: 'gfx', 46 | }, 47 | fonts: { 48 | run: true, 49 | src: 'fonts', 50 | dist: 'fonts', 51 | }, 52 | favicon: { 53 | run: true, 54 | }, 55 | critical: { 56 | run: true, 57 | }, 58 | kss: { 59 | run: true, 60 | dist: 'docs/styleguide', 61 | }, 62 | sassdoc: { 63 | run: true, 64 | dist: 'docs/sass', 65 | }, 66 | jsdoc: { 67 | run: true, 68 | dist: 'docs/js', 69 | }, 70 | bump: { 71 | run: true, 72 | }, 73 | }); 74 | 75 | const getConf = () => conf.all; 76 | 77 | const getOptionValue = (option) => conf.get(option); 78 | 79 | const setOptionValue = (option, value) => conf.set(option, value); 80 | 81 | const save = (dir) => { 82 | try { 83 | const configFilepath = `${files.slash(dir)}${configPath}`; 84 | 85 | return files.saveFile(configFilepath, getConf()); 86 | } catch (err) { 87 | log.message(err); 88 | 89 | return false; 90 | } 91 | }; 92 | 93 | module.exports = { 94 | getConf, 95 | getOptionValue, 96 | setOptionValue, 97 | save, 98 | }; 99 | -------------------------------------------------------------------------------- /lib/files.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const mkdirp = require('mkdirp'); 4 | const ncp = require('ncp'); 5 | const log = require('./log'); 6 | 7 | ncp.limit = 16; 8 | 9 | const slash = (dirPath) => ((dirPath.substr(-1) !== '/') ? `${dirPath}/` : dirPath); 10 | 11 | const trim = (path) => path.replace('_', '').replace('copy/', ''); 12 | 13 | const getCurrentDirectoryBase = () => { 14 | try { 15 | return path.basename(process.cwd()); 16 | } catch (err) { 17 | log.message(err); 18 | 19 | return false; 20 | } 21 | }; 22 | 23 | const fileExists = (filePath) => { 24 | try { 25 | return fs.existsSync(filePath); 26 | } catch (err) { 27 | log.message(err); 28 | 29 | return false; 30 | } 31 | }; 32 | 33 | const directoryExists = (dirPath) => { 34 | try { 35 | if (!fileExists(dirPath)) { 36 | return false; 37 | } 38 | 39 | return fs.statSync(dirPath).isDirectory(); 40 | } catch (err) { 41 | log.message(err); 42 | 43 | return false; 44 | } 45 | }; 46 | 47 | const makeDirectory = (dirPath) => { 48 | try { 49 | if (!directoryExists(dirPath)) { 50 | return mkdirp(dirPath); 51 | } 52 | 53 | return true; 54 | } catch (err) { 55 | log.message(err); 56 | 57 | return false; 58 | } 59 | }; 60 | 61 | const copyFile = (filePath, destPath = './', destFile) => { 62 | try { 63 | const destFileName = destFile.split('/').pop(); 64 | const clb = (destFileName[0] !== '.'); 65 | 66 | return ncp(path.join(__dirname, '..', filePath), `${slash(destPath)}${trim(destFile)}`, { clobber: clb }, log.message); 67 | } catch (err) { 68 | log.message(err); 69 | 70 | return false; 71 | } 72 | }; 73 | 74 | const saveFile = (filePath, content) => { 75 | try { 76 | fs.writeFileSync(filePath, JSON.stringify(content, null, 2), 'utf-8'); 77 | 78 | return true; 79 | } catch (err) { 80 | log.message(err); 81 | 82 | return false; 83 | } 84 | }; 85 | 86 | module.exports = { 87 | slash, 88 | getCurrentDirectoryBase, 89 | directoryExists, 90 | makeDirectory, 91 | fileExists, 92 | copyFile, 93 | saveFile, 94 | }; 95 | -------------------------------------------------------------------------------- /lib/inquirer.js: -------------------------------------------------------------------------------- 1 | const inquirer = require('inquirer'); 2 | const config = require('./config'); 3 | 4 | const basicInteraction = () => { 5 | const questions = [ 6 | { 7 | type: 'confirm', 8 | name: 'override', 9 | message: ' GENERAL | Do you want to override the project? Be sure to commit all changes before you proceed.', 10 | default: true, 11 | }, { 12 | type: 'input', 13 | name: 'proot', 14 | message: ' GENERAL | What is the root folder of the project?', 15 | default: config.getOptionValue('proot') || './', 16 | validate(value) { 17 | if (value.length) { 18 | return true; 19 | } 20 | return 'This field cannot be empty.'; 21 | }, 22 | when(answers) { 23 | return answers.override === true; 24 | }, 25 | }, { 26 | type: 'input', 27 | name: 'src', 28 | message: ' GENERAL | Where is the folder with the source code of the project (relative to default path)?', 29 | default: config.getOptionValue('src') || 'src', 30 | validate(value) { 31 | if (value.length) { 32 | return true; 33 | } 34 | return 'This field cannot be empty.'; 35 | }, 36 | when(answers) { 37 | return answers.override === true; 38 | }, 39 | }, { 40 | type: 'input', 41 | name: 'dist', 42 | message: ' GENERAL | Where do you want to store compiled code of the project (relative to default path)?', 43 | default: config.getOptionValue('dist') || 'dist', 44 | validate(value) { 45 | if (value.length) { 46 | return true; 47 | } 48 | return 'This field cannot be empty.'; 49 | }, 50 | when(answers) { 51 | return answers.override === true; 52 | }, 53 | }, { 54 | type: 'confirm', 55 | name: 'override2', 56 | message: ' GENERAL | Are you sure that you want to override the project?', 57 | default: true, 58 | when(answers) { 59 | return answers.override === true; 60 | }, 61 | }, { 62 | type: 'confirm', 63 | name: 'sync[run]', 64 | message: 'BROWSERSYNC | Do you want to run BrowserSync to preview changes in the browser?', 65 | default: config.getOptionValue('sync.run') || true, 66 | when(answers) { 67 | return answers.override2 === true; 68 | }, 69 | }, { 70 | type: 'confirm', 71 | name: 'html[run]', 72 | message: ' HTML | Do you want to run HTML tasks?', 73 | default: config.getOptionValue('html.run') || true, 74 | when(answers) { 75 | return answers.override2 === true; 76 | }, 77 | }, { 78 | type: 'confirm', 79 | name: 'html[pug]', 80 | message: ' HTML | Are you using Pug as a template engine?', 81 | default: config.getOptionValue('html.pug') || true, 82 | when(answers) { 83 | return answers.override2 === true && answers.html.run === true; 84 | }, 85 | }, { 86 | type: 'confirm', 87 | name: 'html[data]', 88 | message: ' HTML | Do you want to inject data into pug files?', 89 | default: config.getOptionValue('html.data') || false, 90 | when(answers) { 91 | return answers.override2 === true && answers.html.run === true && answers.html.pug === true; 92 | }, 93 | }, { 94 | type: 'confirm', 95 | name: 'html[inline]', 96 | message: ' HTML | Do you want to run inline source tasks (inline CSS or SVG in HTML code)?', 97 | default: config.getOptionValue('html.inline') || false, 98 | when(answers) { 99 | return answers.override2 === true && answers.html.run === true && answers.html.pug === true; 100 | }, 101 | }, { 102 | type: 'input', 103 | name: 'html[src]', 104 | message: ' HTML | Where is the folder with HTML source code (relative to default source path)?', 105 | default: config.getOptionValue('html.src') || 'html', 106 | when(answers) { 107 | return answers.override2 === true && answers.html.run === true; 108 | }, 109 | }, { 110 | type: 'input', 111 | name: 'html[dist]', 112 | message: ' HTML | Where do you want to store compiled HTML code (relative to default destination path)?', 113 | default: config.getOptionValue('html.dist') || '', 114 | when(answers) { 115 | return answers.override2 === true && answers.html.run === true; 116 | }, 117 | }, { 118 | type: 'confirm', 119 | name: 'html[minify]', 120 | message: ' HTML | Do you want to minify HTML code?', 121 | default: config.getOptionValue('html.minify') || true, 122 | when(answers) { 123 | return answers.override2 === true && answers.html.run === true; 124 | }, 125 | }, { 126 | type: 'confirm', 127 | name: 'html[lint]', 128 | message: ' HTML | Do you want to lint HTML code?', 129 | default: config.getOptionValue('html.lint') || false, 130 | when(answers) { 131 | return answers.override2 === true && answers.html.run === true; 132 | }, 133 | }, { 134 | type: 'confirm', 135 | name: 'css[run]', 136 | message: ' CSS | Do you want to run CSS tasks?', 137 | default: config.getOptionValue('css.run') || true, 138 | when(answers) { 139 | return answers.override2 === true; 140 | }, 141 | }, { 142 | type: 'confirm', 143 | name: 'css[sass]', 144 | message: ' CSS | Are you using Sass?', 145 | default: config.getOptionValue('css.sass') || true, 146 | when(answers) { 147 | return answers.override2 === true && answers.css.run === true; 148 | }, 149 | }, { 150 | type: 'input', 151 | name: 'css[src]', 152 | message: ' CSS | Where is the folder with CSS source code (relative to default source path)?', 153 | default: config.getOptionValue('css.src') || 'scss', 154 | when(answers) { 155 | return answers.override2 === true && answers.css.run === true; 156 | }, 157 | }, { 158 | type: 'input', 159 | name: 'css[dist]', 160 | message: ' CSS | Where do you want to store compiled CSS code (relative to default destination path)?', 161 | default: config.getOptionValue('css.dist') || 'css', 162 | when(answers) { 163 | return answers.override2 === true && answers.css.run === true; 164 | }, 165 | }, { 166 | type: 'confirm', 167 | name: 'css[minify]', 168 | message: ' CSS | Do you want to minify CSS code?', 169 | default: config.getOptionValue('css.minify') || true, 170 | when(answers) { 171 | return answers.override2 === true && answers.css.run === true; 172 | }, 173 | }, { 174 | type: 'confirm', 175 | name: 'css[autoprefix]', 176 | message: ' CSS | Do you want to autoprefix CSS code?', 177 | default: config.getOptionValue('css.autoprefix') || true, 178 | when(answers) { 179 | return answers.override2 === true && answers.css.run === true; 180 | }, 181 | }, { 182 | type: 'confirm', 183 | name: 'css[sourcemaps]', 184 | message: ' CSS | Do you want to add sourcemaps for CSS code?', 185 | default: config.getOptionValue('css.sourcemaps') || true, 186 | when(answers) { 187 | return answers.override2 === true && answers.css.run === true; 188 | }, 189 | }, { 190 | type: 'confirm', 191 | name: 'css[lint]', 192 | message: ' CSS | Do you want to lint CSS code?', 193 | default: config.getOptionValue('css.lint') || false, 194 | when(answers) { 195 | return answers.override2 === true && answers.css.run === true; 196 | }, 197 | }, { 198 | type: 'confirm', 199 | name: 'js[run]', 200 | message: ' JS | Do you want to run JavaScript (es6) tasks?', 201 | default: config.getOptionValue('js.run') || true, 202 | when(answers) { 203 | return answers.override2 === true; 204 | }, 205 | }, { 206 | type: 'input', 207 | name: 'js[src]', 208 | message: ' JS | Where is the folder with JavaScript source code (relative to default source path)?', 209 | default: config.getOptionValue('js.src') || 'js', 210 | when(answers) { 211 | return answers.override2 === true && answers.js.run === true; 212 | }, 213 | }, { 214 | type: 'input', 215 | name: 'js[dist]', 216 | message: ' JS | Where do you want to store compiled JavaScript code (relative to default destination path)?', 217 | default: config.getOptionValue('js.dist') || 'js', 218 | when(answers) { 219 | return answers.override2 === true && answers.js.run === true; 220 | }, 221 | }, { 222 | type: 'confirm', 223 | name: 'js[uglify]', 224 | message: ' JS | Do you want to minify JavaScript code?', 225 | default: config.getOptionValue('js.uglify') || true, 226 | when(answers) { 227 | return answers.override2 === true && answers.js.run === true; 228 | }, 229 | }, { 230 | type: 'confirm', 231 | name: 'js[sourcemaps]', 232 | message: ' JS | Do you want to add sourcemaps for JavaScript code?', 233 | default: config.getOptionValue('js.sourcemaps') || true, 234 | when(answers) { 235 | return answers.override2 === true && answers.js.run === true; 236 | }, 237 | }, { 238 | type: 'confirm', 239 | name: 'js[lint]', 240 | message: ' JS | Do you want to lint JavaScript code?', 241 | default: config.getOptionValue('js.lint') || false, 242 | when(answers) { 243 | return answers.override2 === true && answers.js.run === true; 244 | }, 245 | }, { 246 | type: 'confirm', 247 | name: 'gfx[run]', 248 | message: ' IMAGES | Do you want to run image optimization tasks?', 249 | default: config.getOptionValue('gfx.run') || false, 250 | when(answers) { 251 | return answers.override2 === true; 252 | }, 253 | }, { 254 | type: 'input', 255 | name: 'gfx[src]', 256 | message: ' IMAGES | Where is the folder with images (relative to default source path)?', 257 | default: config.getOptionValue('gfx.src') || 'gfx', 258 | when(answers) { 259 | return answers.override2 === true && answers.gfx.run === true; 260 | }, 261 | }, { 262 | type: 'input', 263 | name: 'gfx[dist]', 264 | message: ' IMAGES | Where do you want to store optimized images (relative to default destination path)?', 265 | default: config.getOptionValue('gfx.dist') || 'gfx', 266 | when(answers) { 267 | return answers.override2 === true && answers.gfx.run === true; 268 | }, 269 | }, { 270 | type: 'confirm', 271 | name: 'fonts[run]', 272 | message: ' FONTS | Do you use local fonts? Do you want to run font tasks?', 273 | default: config.getOptionValue('fonts.run') || false, 274 | when(answers) { 275 | return answers.override2 === true; 276 | }, 277 | }, { 278 | type: 'input', 279 | name: 'fonts[src]', 280 | message: ' FONTS | Where is the folder with local fonts (relative to default source path)?', 281 | default: config.getOptionValue('fonts.src') || 'fonts', 282 | when(answers) { 283 | return answers.override2 === true && answers.fonts.run === true; 284 | }, 285 | }, { 286 | type: 'input', 287 | name: 'fonts[dist]', 288 | message: ' FONTS | Where do you want to store local fonts (relative to default destination path)?', 289 | default: config.getOptionValue('fonts.dist') || 'fonts', 290 | when(answers) { 291 | return answers.override2 === true && answers.fonts.run === true; 292 | }, 293 | }, { 294 | type: 'confirm', 295 | name: 'favicon[run]', 296 | message: ' FAVICON | Do you want to run favicon tasks?', 297 | default: config.getOptionValue('favicon.run') || false, 298 | when(answers) { 299 | return answers.override2 === true; 300 | }, 301 | }, { 302 | type: 'confirm', 303 | name: 'critical[run]', 304 | message: ' CRITICAL | Do you want to extract Critical CSS?', 305 | default: config.getOptionValue('critical.run') || false, 306 | when(answers) { 307 | return answers.override2 === true; 308 | }, 309 | }, { 310 | type: 'confirm', 311 | name: 'kss[run]', 312 | message: ' KSS | Do you want to add KSS style guide?', 313 | default: config.getOptionValue('kss.run') || false, 314 | when(answers) { 315 | return answers.override2 === true; 316 | }, 317 | }, { 318 | type: 'input', 319 | name: 'kss[dist]', 320 | message: ' KSS | Where do you want to store KSS style guide (relative to default destination path)?', 321 | default: config.getOptionValue('kss.dist') || 'docs/styleguide', 322 | when(answers) { 323 | return answers.override2 === true && answers.kss.run === true; 324 | }, 325 | }, { 326 | type: 'confirm', 327 | name: 'sassdoc[run]', 328 | message: ' SASSDOC | Do you want to add documentation for the SASS code (SassDoc)?', 329 | default: config.getOptionValue('sassdoc.run') || false, 330 | when(answers) { 331 | return answers.override2 === true; 332 | }, 333 | }, { 334 | type: 'input', 335 | name: 'sassdoc[dist]', 336 | message: ' SASSDOC | Where do you want to store SassDoc files (relative to default destination path)?', 337 | default: config.getOptionValue('sassdoc.dist') || 'docs/sass', 338 | when(answers) { 339 | return answers.override2 === true && answers.sassdoc.run === true; 340 | }, 341 | }, { 342 | type: 'confirm', 343 | name: 'jsdoc[run]', 344 | message: ' JSDOC | Do you want to add documentation for the JS code (JSDoc)?', 345 | default: config.getOptionValue('jsdoc.run') || false, 346 | when(answers) { 347 | return answers.override2 === true; 348 | }, 349 | }, { 350 | type: 'input', 351 | name: 'jsdoc[dist]', 352 | message: ' JSDOC | Where do you want to store JSdoc files (relative to default destination path)?', 353 | default: config.getOptionValue('jsdoc.dist') || 'docs/js', 354 | when(answers) { 355 | return answers.override2 === true && answers.jsdoc.run === true; 356 | }, 357 | }, { 358 | type: 'confirm', 359 | name: 'bump[run]', 360 | message: ' SEMVER | Do you want to add semver versioning tasks (for automatic bump of any version in any file which supports semver versioning, like package.json)?', 361 | default: config.getOptionValue('bump.run') || false, 362 | when(answers) { 363 | return answers.override2 === true; 364 | }, 365 | }, { 366 | type: 'confirm', 367 | name: 'yarn', 368 | message: ' YARN | Do you use Yarn as your default dependency manager?', 369 | default: config.getOptionValue('yarn') || false, 370 | when(answers) { 371 | return answers.override2 === true; 372 | }, 373 | }, 374 | ]; 375 | return inquirer.prompt(questions); 376 | }; 377 | 378 | module.exports = { 379 | basicInteraction, 380 | }; 381 | -------------------------------------------------------------------------------- /lib/log.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk'); 2 | const clearLib = require('clear'); 3 | const figletLib = require('figlet'); 4 | 5 | const clear = () => clearLib(); 6 | 7 | const figlet = (text, error = true) => console.log(chalk.hex(error ? '#e01258' : '#12e09f')(figletLib.textSync(text, { 8 | horizontalLayout: 'default', 9 | verticalLayout: 'default', 10 | kerning: 'fitted', 11 | font: 'Graceful', 12 | }))); 13 | 14 | const message = (text, error = true) => (text ? console.log(chalk.hex(error ? '#e01258' : '#12e09f')(text)) : false); 15 | 16 | module.exports = { 17 | clear, 18 | figlet, 19 | message, 20 | }; 21 | -------------------------------------------------------------------------------- /lib/starter-project.js: -------------------------------------------------------------------------------- 1 | const clipboardy = require('clipboardy'); 2 | 3 | const log = require('./log'); 4 | const files = require('./files'); 5 | const config = require('./config'); 6 | 7 | const run = (answers) => { 8 | const destPath = answers.proot; 9 | const helpers = ['copy/_.editorconfig', 'copy/_gulpfile.js/index.js', 'copy/_gulpfile.js/clean.js', 'copy/_gulpfile.js/helpers.js', 'copy/_gulpfile.js/.helpers.json', 'copy/_gulpfile.js/.watch.json']; 10 | const libs = ['del', 'gulp', 'gulp-if', 'gulp-wait', 'gulp-exit']; 11 | 12 | const answerKeys = Object.keys(answers); 13 | 14 | for (let i = 0; i < answerKeys.length; i += 1) { 15 | const answer = answers[answerKeys[i]]; 16 | 17 | if (answerKeys[i].indexOf('override') === -1) { 18 | config.setOptionValue(answerKeys[i], answer); 19 | } 20 | 21 | if (answer.run) { 22 | switch (answerKeys[i]) { 23 | case 'bump': 24 | helpers.push('copy/_gulpfile.js/bump.js'); 25 | helpers.push('copy/_gulpfile.js/.bump.json'); 26 | 27 | libs.push('gulp-bump'); 28 | 29 | break; 30 | case 'critical': 31 | helpers.push('copy/_gulpfile.js/critical.js'); 32 | helpers.push('copy/_gulpfile.js/.critical.json'); 33 | 34 | libs.push('gulp-penthouse'); 35 | 36 | break; 37 | case 'css': 38 | helpers.push('copy/_gulpfile.js/css.js'); 39 | helpers.push('copy/_gulpfile.js/.css.json'); 40 | 41 | libs.push('gulp-cssimport'); 42 | 43 | if (answer.sass) { 44 | libs.push('gulp-sass'); 45 | } 46 | 47 | if (answer.minify) { 48 | libs.push('gulp-clean-css'); 49 | } 50 | 51 | if (answer.autoprefix) { 52 | helpers.push('copy/_.browserslistrc'); 53 | 54 | libs.push('gulp-autoprefixer'); 55 | libs.push('gulp-rename'); 56 | } 57 | 58 | if (answer.sourcemaps) { 59 | libs.push('gulp-sourcemaps'); 60 | } 61 | 62 | if (answer.lint) { 63 | helpers.push('copy/_.stylelintrc'); 64 | 65 | libs.push('gulp-stylelint'); 66 | libs.push('stylelint'); 67 | libs.push('stylelint-config-sass-guidelines'); 68 | libs.push('stylelint-order'); 69 | libs.push('stylelint-scss'); 70 | } 71 | 72 | break; 73 | case 'favicon': 74 | helpers.push('copy/_gulpfile.js/favicon.js'); 75 | helpers.push('copy/_gulpfile.js/.favicon.json'); 76 | helpers.push('copy/_gulpfile.js/.favicon-data.json'); 77 | 78 | libs.push('gulp-real-favicon'); 79 | 80 | break; 81 | case 'fonts': 82 | helpers.push('copy/_gulpfile.js/fonts.js'); 83 | 84 | break; 85 | case 'gfx': 86 | helpers.push('copy/_gulpfile.js/gfx.js'); 87 | helpers.push('copy/_gulpfile.js/.gfx.json'); 88 | 89 | libs.push('gulp-imagemin'); 90 | libs.push('imagemin-mozjpeg'); 91 | libs.push('imagemin-pngquant'); 92 | 93 | break; 94 | case 'html': 95 | helpers.push('copy/_gulpfile.js/html.js'); 96 | helpers.push('copy/_gulpfile.js/.html.json'); 97 | 98 | libs.push('path'); 99 | libs.push('gulp-rename'); 100 | 101 | if (answer.pug) { 102 | libs.push('gulp-pug'); 103 | } 104 | 105 | if (answer.data) { 106 | libs.push('gulp-data'); 107 | } 108 | 109 | if (answer.minify) { 110 | libs.push('gulp-htmlmin'); 111 | } 112 | 113 | if (answer.inline) { 114 | libs.push('gulp-inline-source'); 115 | } 116 | 117 | if (answer.lint) { 118 | helpers.push('copy/_.htmllintrc'); 119 | 120 | libs.push('gulp-htmllint'); 121 | } 122 | 123 | break; 124 | case 'js': 125 | helpers.push('copy/_gulpfile.js/js.js'); 126 | helpers.push('copy/_gulpfile.js/.js.json'); 127 | helpers.push('copy/_gulpfile.js/webpack.js'); 128 | 129 | libs.push('babel-loader'); 130 | libs.push('@babel/core'); 131 | libs.push('@babel/preset-env'); 132 | libs.push('gulp-include'); 133 | libs.push('webpack'); 134 | libs.push('webpack-stream'); 135 | 136 | if (answer.uglify) { 137 | libs.push('gulp-uglify'); 138 | libs.push('gulp-rename'); 139 | } 140 | 141 | if (answer.lint) { 142 | helpers.push('copy/_.eslintignore'); 143 | helpers.push('copy/_.eslintrc.json'); 144 | libs.push('gulp-eslint'); 145 | libs.push('eslint'); 146 | libs.push('eslint-config-airbnb-base'); 147 | libs.push('eslint-plugin-import'); 148 | libs.push('eslint-plugin-node'); 149 | libs.push('babel-eslint'); 150 | } 151 | 152 | if (answer.sourcemaps) { 153 | libs.push('gulp-sourcemaps'); 154 | } 155 | 156 | break; 157 | case 'jsdoc': 158 | helpers.push('copy/_gulpfile.js/jsdoc.js'); 159 | helpers.push('copy/_gulpfile.js/.jsdoc.json'); 160 | 161 | libs.push('gulp-jsdoc3'); 162 | 163 | break; 164 | case 'kss': 165 | helpers.push('copy/_gulpfile.js/kss.js'); 166 | helpers.push('copy/_gulpfile.js/.kss.json'); 167 | 168 | libs.push('kss'); 169 | 170 | break; 171 | case 'sassdoc': 172 | helpers.push('copy/_gulpfile.js/sassdoc.js'); 173 | helpers.push('copy/_gulpfile.js/.sassdoc.json'); 174 | 175 | libs.push('sassdoc'); 176 | 177 | break; 178 | case 'sync': 179 | helpers.push('copy/_gulpfile.js/sync.js'); 180 | helpers.push('copy/_gulpfile.js/.sync.json'); 181 | 182 | libs.push('browser-sync'); 183 | 184 | break; 185 | default: 186 | break; 187 | } 188 | } 189 | } 190 | 191 | if (!answers.override2) { 192 | log.message('SPRO aborted!'); 193 | } else { 194 | const gulpPath = `${files.slash(destPath)}gulpfile.js`; 195 | 196 | if(files.makeDirectory(gulpPath)) { 197 | for (let i = 0; i < helpers.length; i += 1) { 198 | if (answers.override2) { 199 | files.copyFile(helpers[i], destPath, helpers[i], true); 200 | } 201 | } 202 | 203 | setTimeout(() => { 204 | const saved = config.save(destPath); 205 | 206 | if (saved) { 207 | const cmd = `${answers.yarn ? 'yarn add -s -D' : 'npm i -s -D'} ${libs.join(' ')}`; 208 | 209 | clipboardy.writeSync(cmd); 210 | 211 | log.message('Config saved successfully! Use the following command to install gulp dependencies:\n', false); 212 | log.message(cmd, false); 213 | log.message('\nCommand is copied to clipboard.'); 214 | log.message('\nWarning: installation could last for a few minutes.'); 215 | } else { 216 | log.message('Config not saved!'); 217 | } 218 | }, 500); 219 | 220 | } 221 | } 222 | }; 223 | 224 | module.exports = { 225 | run, 226 | }; 227 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "starter-project-cli", 3 | "preferGlobal": true, 4 | "bin": { 5 | "spro": "./index.js" 6 | }, 7 | "version": "1.1.14", 8 | "description": "Starter Project CLI creates a perfect Gulp development environment for everyone within a few minutes.", 9 | "main": "index.js", 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/maliMirkec/starter-project-cli.git" 13 | }, 14 | "keywords": [ 15 | "Yarn", 16 | "Gulp", 17 | "Semver versioning", 18 | "Browser-sync", 19 | "Sass", 20 | "Modular Scale", 21 | "CSS Locks", 22 | "Stylelint", 23 | "JavaScript", 24 | "es6", 25 | "Babel", 26 | "ESLint", 27 | "HTML", 28 | "Pug", 29 | "Markdown", 30 | "htmllint", 31 | "Fonts", 32 | "Imagemin", 33 | "mozjpeg", 34 | "pngquant", 35 | "Favicon", 36 | "Critical CSS", 37 | "Penthouse", 38 | "Sourcemaps", 39 | "SassDoc", 40 | "JSDoc", 41 | "Styleguide", 42 | "CLI", 43 | "Command Line Interface" 44 | ], 45 | "author": "Silvestar Bistrović ", 46 | "license": "MIT", 47 | "bugs": { 48 | "url": "https://github.com/maliMirkec/starter-project-cli/issues" 49 | }, 50 | "homepage": "https://starter.silvestar.codes", 51 | "dependencies": { 52 | "babel-eslint": "^10.0.3", 53 | "chalk": "^4.1.0", 54 | "clear": "^0.1.0", 55 | "clipboardy": "^2.3.0", 56 | "commander": "^6.1.0", 57 | "configstore": "^5.0.0", 58 | "eslint-config-airbnb-base": "^14.2.0", 59 | "figlet": "^1.4.0", 60 | "inquirer": "^7.3.1", 61 | "mkdirp": "^1.0.3", 62 | "ncp": "^2.0.0", 63 | "path": "^0.12.7" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": 6 | version "7.10.4" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" 8 | integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/generator@^7.10.4": 13 | version "7.10.4" 14 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243" 15 | integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== 16 | dependencies: 17 | "@babel/types" "^7.10.4" 18 | jsesc "^2.5.1" 19 | lodash "^4.17.13" 20 | source-map "^0.5.0" 21 | 22 | "@babel/helper-function-name@^7.10.4": 23 | version "7.10.4" 24 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" 25 | integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== 26 | dependencies: 27 | "@babel/helper-get-function-arity" "^7.10.4" 28 | "@babel/template" "^7.10.4" 29 | "@babel/types" "^7.10.4" 30 | 31 | "@babel/helper-get-function-arity@^7.10.4": 32 | version "7.10.4" 33 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" 34 | integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== 35 | dependencies: 36 | "@babel/types" "^7.10.4" 37 | 38 | "@babel/helper-split-export-declaration@^7.10.4": 39 | version "7.10.4" 40 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" 41 | integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== 42 | dependencies: 43 | "@babel/types" "^7.10.4" 44 | 45 | "@babel/helper-validator-identifier@^7.10.4": 46 | version "7.10.4" 47 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" 48 | integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== 49 | 50 | "@babel/highlight@^7.10.4": 51 | version "7.10.4" 52 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" 53 | integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== 54 | dependencies: 55 | "@babel/helper-validator-identifier" "^7.10.4" 56 | chalk "^2.0.0" 57 | js-tokens "^4.0.0" 58 | 59 | "@babel/parser@^7.10.4", "@babel/parser@^7.7.0": 60 | version "7.10.4" 61 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" 62 | integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== 63 | 64 | "@babel/template@^7.10.4": 65 | version "7.10.4" 66 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" 67 | integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== 68 | dependencies: 69 | "@babel/code-frame" "^7.10.4" 70 | "@babel/parser" "^7.10.4" 71 | "@babel/types" "^7.10.4" 72 | 73 | "@babel/traverse@^7.7.0": 74 | version "7.10.4" 75 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818" 76 | integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== 77 | dependencies: 78 | "@babel/code-frame" "^7.10.4" 79 | "@babel/generator" "^7.10.4" 80 | "@babel/helper-function-name" "^7.10.4" 81 | "@babel/helper-split-export-declaration" "^7.10.4" 82 | "@babel/parser" "^7.10.4" 83 | "@babel/types" "^7.10.4" 84 | debug "^4.1.0" 85 | globals "^11.1.0" 86 | lodash "^4.17.13" 87 | 88 | "@babel/types@^7.10.4", "@babel/types@^7.7.0": 89 | version "7.10.4" 90 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" 91 | integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== 92 | dependencies: 93 | "@babel/helper-validator-identifier" "^7.10.4" 94 | lodash "^4.17.13" 95 | to-fast-properties "^2.0.0" 96 | 97 | "@types/color-name@^1.1.1": 98 | version "1.1.1" 99 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 100 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 101 | 102 | ansi-escapes@^4.2.1: 103 | version "4.3.1" 104 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" 105 | integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== 106 | dependencies: 107 | type-fest "^0.11.0" 108 | 109 | ansi-regex@^5.0.0: 110 | version "5.0.0" 111 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 112 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 113 | 114 | ansi-styles@^3.2.1: 115 | version "3.2.1" 116 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 117 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 118 | dependencies: 119 | color-convert "^1.9.0" 120 | 121 | ansi-styles@^4.1.0: 122 | version "4.2.1" 123 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 124 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 125 | dependencies: 126 | "@types/color-name" "^1.1.1" 127 | color-convert "^2.0.1" 128 | 129 | arch@^2.1.1: 130 | version "2.1.2" 131 | resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" 132 | integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== 133 | 134 | babel-eslint@^10.0.3: 135 | version "10.1.0" 136 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" 137 | integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== 138 | dependencies: 139 | "@babel/code-frame" "^7.0.0" 140 | "@babel/parser" "^7.7.0" 141 | "@babel/traverse" "^7.7.0" 142 | "@babel/types" "^7.7.0" 143 | eslint-visitor-keys "^1.0.0" 144 | resolve "^1.12.0" 145 | 146 | call-bind@^1.0.0: 147 | version "1.0.0" 148 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" 149 | integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== 150 | dependencies: 151 | function-bind "^1.1.1" 152 | get-intrinsic "^1.0.0" 153 | 154 | chalk@^2.0.0: 155 | version "2.4.2" 156 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 157 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 158 | dependencies: 159 | ansi-styles "^3.2.1" 160 | escape-string-regexp "^1.0.5" 161 | supports-color "^5.3.0" 162 | 163 | chalk@^4.1.0: 164 | version "4.1.0" 165 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 166 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 167 | dependencies: 168 | ansi-styles "^4.1.0" 169 | supports-color "^7.1.0" 170 | 171 | chardet@^0.7.0: 172 | version "0.7.0" 173 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 174 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 175 | 176 | clear@^0.1.0: 177 | version "0.1.0" 178 | resolved "https://registry.yarnpkg.com/clear/-/clear-0.1.0.tgz#b81b1e03437a716984fd7ac97c87d73bdfe7048a" 179 | integrity sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw== 180 | 181 | cli-cursor@^3.1.0: 182 | version "3.1.0" 183 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 184 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 185 | dependencies: 186 | restore-cursor "^3.1.0" 187 | 188 | cli-width@^3.0.0: 189 | version "3.0.0" 190 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" 191 | integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== 192 | 193 | clipboardy@^2.3.0: 194 | version "2.3.0" 195 | resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" 196 | integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ== 197 | dependencies: 198 | arch "^2.1.1" 199 | execa "^1.0.0" 200 | is-wsl "^2.1.1" 201 | 202 | color-convert@^1.9.0: 203 | version "1.9.3" 204 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 205 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 206 | dependencies: 207 | color-name "1.1.3" 208 | 209 | color-convert@^2.0.1: 210 | version "2.0.1" 211 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 212 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 213 | dependencies: 214 | color-name "~1.1.4" 215 | 216 | color-name@1.1.3: 217 | version "1.1.3" 218 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 219 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 220 | 221 | color-name@~1.1.4: 222 | version "1.1.4" 223 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 224 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 225 | 226 | commander@^6.1.0: 227 | version "6.2.0" 228 | resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" 229 | integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== 230 | 231 | configstore@^5.0.0: 232 | version "5.0.1" 233 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 234 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 235 | dependencies: 236 | dot-prop "^5.2.0" 237 | graceful-fs "^4.1.2" 238 | make-dir "^3.0.0" 239 | unique-string "^2.0.0" 240 | write-file-atomic "^3.0.0" 241 | xdg-basedir "^4.0.0" 242 | 243 | confusing-browser-globals@^1.0.10: 244 | version "1.0.10" 245 | resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" 246 | integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== 247 | 248 | cross-spawn@^6.0.0: 249 | version "6.0.5" 250 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 251 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 252 | dependencies: 253 | nice-try "^1.0.4" 254 | path-key "^2.0.1" 255 | semver "^5.5.0" 256 | shebang-command "^1.2.0" 257 | which "^1.2.9" 258 | 259 | crypto-random-string@^2.0.0: 260 | version "2.0.0" 261 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 262 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 263 | 264 | debug@^4.1.0: 265 | version "4.1.1" 266 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 267 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 268 | dependencies: 269 | ms "^2.1.1" 270 | 271 | define-properties@^1.1.3: 272 | version "1.1.3" 273 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 274 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 275 | dependencies: 276 | object-keys "^1.0.12" 277 | 278 | dot-prop@^5.2.0: 279 | version "5.2.0" 280 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" 281 | integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== 282 | dependencies: 283 | is-obj "^2.0.0" 284 | 285 | emoji-regex@^8.0.0: 286 | version "8.0.0" 287 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 288 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 289 | 290 | end-of-stream@^1.1.0: 291 | version "1.4.4" 292 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 293 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 294 | dependencies: 295 | once "^1.4.0" 296 | 297 | es-abstract@^1.17.5: 298 | version "1.17.6" 299 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" 300 | integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== 301 | dependencies: 302 | es-to-primitive "^1.2.1" 303 | function-bind "^1.1.1" 304 | has "^1.0.3" 305 | has-symbols "^1.0.1" 306 | is-callable "^1.2.0" 307 | is-regex "^1.1.0" 308 | object-inspect "^1.7.0" 309 | object-keys "^1.1.1" 310 | object.assign "^4.1.0" 311 | string.prototype.trimend "^1.0.1" 312 | string.prototype.trimstart "^1.0.1" 313 | 314 | es-to-primitive@^1.2.1: 315 | version "1.2.1" 316 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 317 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 318 | dependencies: 319 | is-callable "^1.1.4" 320 | is-date-object "^1.0.1" 321 | is-symbol "^1.0.2" 322 | 323 | escape-string-regexp@^1.0.5: 324 | version "1.0.5" 325 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 326 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 327 | 328 | eslint-config-airbnb-base@^14.2.0: 329 | version "14.2.1" 330 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" 331 | integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== 332 | dependencies: 333 | confusing-browser-globals "^1.0.10" 334 | object.assign "^4.1.2" 335 | object.entries "^1.1.2" 336 | 337 | eslint-visitor-keys@^1.0.0: 338 | version "1.3.0" 339 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 340 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 341 | 342 | execa@^1.0.0: 343 | version "1.0.0" 344 | resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" 345 | integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== 346 | dependencies: 347 | cross-spawn "^6.0.0" 348 | get-stream "^4.0.0" 349 | is-stream "^1.1.0" 350 | npm-run-path "^2.0.0" 351 | p-finally "^1.0.0" 352 | signal-exit "^3.0.0" 353 | strip-eof "^1.0.0" 354 | 355 | external-editor@^3.0.3: 356 | version "3.1.0" 357 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 358 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 359 | dependencies: 360 | chardet "^0.7.0" 361 | iconv-lite "^0.4.24" 362 | tmp "^0.0.33" 363 | 364 | figlet@^1.4.0: 365 | version "1.5.0" 366 | resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.0.tgz#2db4d00a584e5155a96080632db919213c3e003c" 367 | integrity sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww== 368 | 369 | figures@^3.0.0: 370 | version "3.2.0" 371 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 372 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 373 | dependencies: 374 | escape-string-regexp "^1.0.5" 375 | 376 | function-bind@^1.1.1: 377 | version "1.1.1" 378 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 379 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 380 | 381 | get-intrinsic@^1.0.0: 382 | version "1.0.1" 383 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" 384 | integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== 385 | dependencies: 386 | function-bind "^1.1.1" 387 | has "^1.0.3" 388 | has-symbols "^1.0.1" 389 | 390 | get-stream@^4.0.0: 391 | version "4.1.0" 392 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 393 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 394 | dependencies: 395 | pump "^3.0.0" 396 | 397 | globals@^11.1.0: 398 | version "11.12.0" 399 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 400 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 401 | 402 | graceful-fs@^4.1.2: 403 | version "4.2.4" 404 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 405 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 406 | 407 | has-flag@^3.0.0: 408 | version "3.0.0" 409 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 410 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 411 | 412 | has-flag@^4.0.0: 413 | version "4.0.0" 414 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 415 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 416 | 417 | has-symbols@^1.0.1: 418 | version "1.0.1" 419 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 420 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 421 | 422 | has@^1.0.3: 423 | version "1.0.3" 424 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 425 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 426 | dependencies: 427 | function-bind "^1.1.1" 428 | 429 | iconv-lite@^0.4.24: 430 | version "0.4.24" 431 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 432 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 433 | dependencies: 434 | safer-buffer ">= 2.1.2 < 3" 435 | 436 | imurmurhash@^0.1.4: 437 | version "0.1.4" 438 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 439 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 440 | 441 | inherits@2.0.3: 442 | version "2.0.3" 443 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 444 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 445 | 446 | inquirer@^7.3.1: 447 | version "7.3.3" 448 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" 449 | integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== 450 | dependencies: 451 | ansi-escapes "^4.2.1" 452 | chalk "^4.1.0" 453 | cli-cursor "^3.1.0" 454 | cli-width "^3.0.0" 455 | external-editor "^3.0.3" 456 | figures "^3.0.0" 457 | lodash "^4.17.19" 458 | mute-stream "0.0.8" 459 | run-async "^2.4.0" 460 | rxjs "^6.6.0" 461 | string-width "^4.1.0" 462 | strip-ansi "^6.0.0" 463 | through "^2.3.6" 464 | 465 | is-callable@^1.1.4, is-callable@^1.2.0: 466 | version "1.2.0" 467 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 468 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 469 | 470 | is-date-object@^1.0.1: 471 | version "1.0.2" 472 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 473 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 474 | 475 | is-docker@^2.0.0: 476 | version "2.0.0" 477 | resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" 478 | integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== 479 | 480 | is-fullwidth-code-point@^3.0.0: 481 | version "3.0.0" 482 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 483 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 484 | 485 | is-obj@^2.0.0: 486 | version "2.0.0" 487 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 488 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 489 | 490 | is-regex@^1.1.0: 491 | version "1.1.0" 492 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" 493 | integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== 494 | dependencies: 495 | has-symbols "^1.0.1" 496 | 497 | is-stream@^1.1.0: 498 | version "1.1.0" 499 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 500 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 501 | 502 | is-symbol@^1.0.2: 503 | version "1.0.3" 504 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 505 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 506 | dependencies: 507 | has-symbols "^1.0.1" 508 | 509 | is-typedarray@^1.0.0: 510 | version "1.0.0" 511 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 512 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 513 | 514 | is-wsl@^2.1.1: 515 | version "2.2.0" 516 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" 517 | integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== 518 | dependencies: 519 | is-docker "^2.0.0" 520 | 521 | isexe@^2.0.0: 522 | version "2.0.0" 523 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 524 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 525 | 526 | js-tokens@^4.0.0: 527 | version "4.0.0" 528 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 529 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 530 | 531 | jsesc@^2.5.1: 532 | version "2.5.2" 533 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 534 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 535 | 536 | lodash@^4.17.13, lodash@^4.17.19: 537 | version "4.17.19" 538 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 539 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 540 | 541 | make-dir@^3.0.0: 542 | version "3.1.0" 543 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 544 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 545 | dependencies: 546 | semver "^6.0.0" 547 | 548 | mimic-fn@^2.1.0: 549 | version "2.1.0" 550 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 551 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 552 | 553 | mkdirp@^1.0.3: 554 | version "1.0.4" 555 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 556 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 557 | 558 | ms@^2.1.1: 559 | version "2.1.2" 560 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 561 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 562 | 563 | mute-stream@0.0.8: 564 | version "0.0.8" 565 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 566 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 567 | 568 | ncp@^2.0.0: 569 | version "2.0.0" 570 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" 571 | integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= 572 | 573 | nice-try@^1.0.4: 574 | version "1.0.5" 575 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 576 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 577 | 578 | npm-run-path@^2.0.0: 579 | version "2.0.2" 580 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 581 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 582 | dependencies: 583 | path-key "^2.0.0" 584 | 585 | object-inspect@^1.7.0: 586 | version "1.8.0" 587 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" 588 | integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== 589 | 590 | object-keys@^1.0.12, object-keys@^1.1.1: 591 | version "1.1.1" 592 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 593 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 594 | 595 | object.assign@^4.1.0, object.assign@^4.1.2: 596 | version "4.1.2" 597 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" 598 | integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== 599 | dependencies: 600 | call-bind "^1.0.0" 601 | define-properties "^1.1.3" 602 | has-symbols "^1.0.1" 603 | object-keys "^1.1.1" 604 | 605 | object.entries@^1.1.2: 606 | version "1.1.2" 607 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" 608 | integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== 609 | dependencies: 610 | define-properties "^1.1.3" 611 | es-abstract "^1.17.5" 612 | has "^1.0.3" 613 | 614 | once@^1.3.1, once@^1.4.0: 615 | version "1.4.0" 616 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 617 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 618 | dependencies: 619 | wrappy "1" 620 | 621 | onetime@^5.1.0: 622 | version "5.1.0" 623 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 624 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 625 | dependencies: 626 | mimic-fn "^2.1.0" 627 | 628 | os-tmpdir@~1.0.2: 629 | version "1.0.2" 630 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 631 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 632 | 633 | p-finally@^1.0.0: 634 | version "1.0.0" 635 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 636 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 637 | 638 | path-key@^2.0.0, path-key@^2.0.1: 639 | version "2.0.1" 640 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 641 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 642 | 643 | path-parse@^1.0.6: 644 | version "1.0.6" 645 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 646 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 647 | 648 | path@^0.12.7: 649 | version "0.12.7" 650 | resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" 651 | integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= 652 | dependencies: 653 | process "^0.11.1" 654 | util "^0.10.3" 655 | 656 | process@^0.11.1: 657 | version "0.11.10" 658 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 659 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 660 | 661 | pump@^3.0.0: 662 | version "3.0.0" 663 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 664 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 665 | dependencies: 666 | end-of-stream "^1.1.0" 667 | once "^1.3.1" 668 | 669 | resolve@^1.12.0: 670 | version "1.17.0" 671 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 672 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 673 | dependencies: 674 | path-parse "^1.0.6" 675 | 676 | restore-cursor@^3.1.0: 677 | version "3.1.0" 678 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 679 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 680 | dependencies: 681 | onetime "^5.1.0" 682 | signal-exit "^3.0.2" 683 | 684 | run-async@^2.4.0: 685 | version "2.4.1" 686 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 687 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 688 | 689 | rxjs@^6.6.0: 690 | version "6.6.0" 691 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" 692 | integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== 693 | dependencies: 694 | tslib "^1.9.0" 695 | 696 | "safer-buffer@>= 2.1.2 < 3": 697 | version "2.1.2" 698 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 699 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 700 | 701 | semver@^5.5.0: 702 | version "5.7.1" 703 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 704 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 705 | 706 | semver@^6.0.0: 707 | version "6.3.0" 708 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 709 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 710 | 711 | shebang-command@^1.2.0: 712 | version "1.2.0" 713 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 714 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 715 | dependencies: 716 | shebang-regex "^1.0.0" 717 | 718 | shebang-regex@^1.0.0: 719 | version "1.0.0" 720 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 721 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 722 | 723 | signal-exit@^3.0.0, signal-exit@^3.0.2: 724 | version "3.0.3" 725 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 726 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 727 | 728 | source-map@^0.5.0: 729 | version "0.5.7" 730 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 731 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 732 | 733 | string-width@^4.1.0: 734 | version "4.2.0" 735 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 736 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 737 | dependencies: 738 | emoji-regex "^8.0.0" 739 | is-fullwidth-code-point "^3.0.0" 740 | strip-ansi "^6.0.0" 741 | 742 | string.prototype.trimend@^1.0.1: 743 | version "1.0.1" 744 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 745 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 746 | dependencies: 747 | define-properties "^1.1.3" 748 | es-abstract "^1.17.5" 749 | 750 | string.prototype.trimstart@^1.0.1: 751 | version "1.0.1" 752 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 753 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 754 | dependencies: 755 | define-properties "^1.1.3" 756 | es-abstract "^1.17.5" 757 | 758 | strip-ansi@^6.0.0: 759 | version "6.0.0" 760 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 761 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 762 | dependencies: 763 | ansi-regex "^5.0.0" 764 | 765 | strip-eof@^1.0.0: 766 | version "1.0.0" 767 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 768 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 769 | 770 | supports-color@^5.3.0: 771 | version "5.5.0" 772 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 773 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 774 | dependencies: 775 | has-flag "^3.0.0" 776 | 777 | supports-color@^7.1.0: 778 | version "7.1.0" 779 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 780 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 781 | dependencies: 782 | has-flag "^4.0.0" 783 | 784 | through@^2.3.6: 785 | version "2.3.8" 786 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 787 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 788 | 789 | tmp@^0.0.33: 790 | version "0.0.33" 791 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 792 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 793 | dependencies: 794 | os-tmpdir "~1.0.2" 795 | 796 | to-fast-properties@^2.0.0: 797 | version "2.0.0" 798 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 799 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 800 | 801 | tslib@^1.9.0: 802 | version "1.13.0" 803 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 804 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 805 | 806 | type-fest@^0.11.0: 807 | version "0.11.0" 808 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" 809 | integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== 810 | 811 | typedarray-to-buffer@^3.1.5: 812 | version "3.1.5" 813 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 814 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 815 | dependencies: 816 | is-typedarray "^1.0.0" 817 | 818 | unique-string@^2.0.0: 819 | version "2.0.0" 820 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 821 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 822 | dependencies: 823 | crypto-random-string "^2.0.0" 824 | 825 | util@^0.10.3: 826 | version "0.10.4" 827 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 828 | integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 829 | dependencies: 830 | inherits "2.0.3" 831 | 832 | which@^1.2.9: 833 | version "1.3.1" 834 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 835 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 836 | dependencies: 837 | isexe "^2.0.0" 838 | 839 | wrappy@1: 840 | version "1.0.2" 841 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 842 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 843 | 844 | write-file-atomic@^3.0.0: 845 | version "3.0.3" 846 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 847 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 848 | dependencies: 849 | imurmurhash "^0.1.4" 850 | is-typedarray "^1.0.0" 851 | signal-exit "^3.0.2" 852 | typedarray-to-buffer "^3.1.5" 853 | 854 | xdg-basedir@^4.0.0: 855 | version "4.0.0" 856 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 857 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 858 | --------------------------------------------------------------------------------